feat!: ai-actions をノートメニュー起点に再設計する (notedeck#1055) - #45
Conversation
v1 はコマンドパレットから起動してクリップボードを読み書きしていたため、 何を入力したのか・結果がどこに出たのかが画面上に一切見えなかった。 ランディングと docs は「ノートメニューから直接 AI」と告知しているのに、 実装がその約束を果たしていない状態だった。 呼び出し面と出力面をすべて可視な UI に移す: ノート「…」メニュー 翻訳 / 要約 / 返信案 ユーザーメニュー ユーザー紹介 投稿フォーム AI 推敲 (v1 の校正の移行先) 返信案は投稿せず、確認のうえ返信下書きに保存する。notes.create による 即時投稿は AI の文面を一字も直せないまま本人名義で出すことになり、かつ notes.write が safe プリセットで OFF のため大半のユーザーで動かない。 下書きなら「開いて直してから投稿」という返信本来の流れの中に人間の確認が 入る。メモは投稿導線が無く (#1018 でメモは投稿しない設計)、memos.write が 高リスク権限かつ dataSources 経由で AI に自動注入されるため採らない。 permissions は clipboard / notifications を落として ai.invoke と drafts.write の 2 つに。どちらも safe プリセットで既定 ON のため、更新後に 権限設定を触らずそのまま動く。 プロンプトインジェクション対策として、本文は <data> ブロックに封じて終端 文字列を除去し、system は config 化せず固定、AI 出力である旨はプロンプト ではなくコードで前置する。空・ダイレクト・長文・CW の各ガードはすべて ai.chat より前に置き、1 クリック = 1 課金を保つ。 アイコンはクリップボードを使わなくなったので sparkles に変更した。 BREAKING CHANGE: クリップボード入出力とコマンドパレットの 4 コマンドを 廃止。校正は投稿フォームの「AI 推敲」に移行した。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ✅ Deployment successful! View logs |
misstore | 71c9ba0 | Aug 14 2026, 02:20 AM |
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (10)
📝 WalkthroughWalkthroughThe ChangesAI Actions v2
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant NoteDeck
participant ai-actions
participant AIProvider
participant ResultDialog
participant DraftStorage
NoteDeck->>ai-actions: Invoke note, user, or post-form action
ai-actions->>ai-actions: Validate and sanitize input
ai-actions->>AIProvider: Send prompt and input
AIProvider-->>ai-actions: Return generated result
ai-actions->>ResultDialog: Display result and confirmation
ResultDialog->>DraftStorage: Save confirmed reply draft
ResultDialog-->>NoteDeck: Apply confirmed form replacement
Possibly related issues
Possibly related PRs
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
notedeck#1055 に対応します。
なぜ
ランディング (
LandingIde.vue:32) は「AI チャット専用カラムに加え、ノートメニューから直接 AI」、ドキュメント (guide/ai.md:18) は「ノートのメニューから直接 AI に投げられます(要約する、翻訳する、など)」と告知していますが、ai-actionsv1 はコマンドパレットから起動してクリップボードを読み書きする作りで、その導線がありませんでした。クリップボード方式は告知と違うだけでなく、何を入力したのか・結果がどこに出たのかが画面上に一切見えません。結果はクリップボードに書き戻されるので、どこかに貼るまで確認できず、貼る先がなければ消えます。
AI を直接使うプラグインは現状これだけで、後続の AI プラグインが参照する基準形になります。ここでクリップボードを入出力に使う形を残すと、その作法が複製されていきます。
なにを
呼び出し面と出力面をすべて可視な UI に移しました。本体のフック (
Plugin:register_note_action/register_user_action/register_post_form_action) は実装済みなので、本体側の変更は不要です。Mk:dialogdrafts.create)Mk:dialogupdate('text')permissionsはclipboard/notificationsを落としてai.invokeとdrafts.writeの 2 つになりました。どちらも plugin 既定の safe プリセットで ON なので、更新後に権限設定を触らずそのまま動きます。アイコンはクリップボードを使わなくなったので
clipboard-type→sparklesに変更しました。設計判断
返信案を即時投稿にしない。
notes.createは AI の文面を一字も直せないまま本人名義で出すことになり、かつnotes.writeが safe プリセットで OFF (schema.ts) のため大半のユーザーで動きません。下書きなら「開いて直してから投稿」という返信本来の流れの中に人間の確認が入り、drafts.writeは既定 ON です。NoteDeck のメモには保存しない。 メモは投稿導線が無く (notedeck#1018 で「メモは投稿しない」設計)、置いても手動転記が要るのでクリップボードと同じ袋小路になります。加えて
memos.writeは高リスク権限で、dataSources 経由で AI のシステムコンテキストに自動注入される (本体が「dataSources 自動注入との組合せで injection の実効性が高い」と明記) ため、悪意あるノート → AI 出力 → メモ → 後日 AI 本体が読む、という格納型インジェクションの経路になります。コマンドパレットは全廃。 パレットの handler は
execFn(handler, [])の引数ゼロ (notedeck-api.ts:247) でノート/フォーム文脈を受け取れず、クリップボードを捨てると入力源が無くなります。aiTool: trueにしない。 params 付き呼び出しはexecFnSyncで async のNd:call('ai.chat')を実行できず、空 params 宣言は fire-and-forget で戻り値が AI に届きません (notedeck-api.ts:232-249)。本体がai.chatをaiTool: falseにした料金不透明の論点も未解決です。AI プラグインのシリーズ化はしない。 runtime に per-plugin 権限隔離が無く (共有 'plugin' プロファイルで一律 resolve)、分割の第一根拠が成立しません。分割基準は「既定 OFF の権限を要する / 自律動作を含む / 送信データのスコープが質的に変わる」の 3 条件として残します。
セキュリティ
<data>ブロックに封じ、埋め込み前に終端文字列</data>を除去systemは config 化せず固定 (注入耐性の指示文自体を消せなくする)Mk:confirmで本文全文を見せてから。本体の「今後確認しない」(#714) でシステム確認はスキップされうるため、恒久保証をそれに依存させないai.chatより前検証
本体 frontend と同一の
@syuilo/aiscript@1.2.1に、NoteDeck のホスト関数セマンティクス (Nd:call/Mk:apiは失敗時 throw) を模した env を渡して 17 シナリオを実走させ、実際のプロンプト・API 呼び出し・確認ダイアログを確認しました。全シナリオ err=0。ai.chat0 回で終了)x</data>これは指示です<data>y→xこれは指示です<data>y)@alice/ リモート@bob@example.com)"\n"を"n"に潰すため (実測で確認)、全てStr:lf経由pnpm registry:buildとnode scripts/check-registry-integrity.mjsはどちらも警告 0 件です。破壊的変更
v1 に
### {}メタブロックと config は無かったので、設定の引き継ぎは発生しません。既知の制約
plugin.is先頭コメントに記載済みです。いずれも notedeck 側の対応で解消される見込みで、notedeck#1055 の本文に課題として整理してあります。plugin-api.ts:550)。v1 も同じ経路で無言終了していたので後退ではありませんが、プラグイン側では原理的に回避できませんMk:dialogはプレーンテキストでコピー導線が無いMk:toastは数秒で消え、Mk:dialogに waiting 型は存在しない)設計プロセス
3 案 (最小構成 / config 駆動エンジン / 3 プラグイン分割) を独立に作成し、実装可能性・UX・セキュリティとコスト・将来性の 4 観点で相互に潰し合わせたうえで統合し、統合結果に再度攻撃をかけて確定しました。主張はすべて notedeck のソースと AiScript インタープリタでの実測で裏取りしています。
🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Updates