This commit is contained in:
+1
-1
@@ -31,7 +31,7 @@
|
||||
## なぜインストールが禁止か
|
||||
|
||||
- ジョブ実行環境はサンドボックス化されており、永続化されない
|
||||
- 必要な機能は専用ツール(`allowed_tools` に列挙されたもの)で提供される
|
||||
- 必要な機能は専用ツール(ワークスペースのツール設定で許可されたもの)で提供される
|
||||
- インストールが必要 = ツールの設計が足りないので、ユーザーに報告して機能追加を依頼する
|
||||
|
||||
## 代替
|
||||
|
||||
+22
-2
@@ -27,7 +27,9 @@ BrowseWeb({ url: "output/viewer.html" })
|
||||
オプション:
|
||||
- `waitFor`: 待機する CSS セレクタ(省略時は load イベント完了まで待機)
|
||||
- `extractSelector`: 特定要素のテキストだけ抽出する CSS セレクタ
|
||||
- `screenshot`: スクリーンショットを保存するファイル名(例: `"page.png"` → `output/page.png`)
|
||||
- `screenshot`: スクリーンショットを保存するファイル名(例: `"page.png"` → `output/page.png`)。縦長ページは既定で分割保存(下記)
|
||||
- `screenshotSegments`: `false` で分割せずフルページ 1 枚(既定: 分割あり)
|
||||
- `screenshotMaxSegments`: 分割の最大枚数(既定 10)
|
||||
- `timeout`: タイムアウト(ms、デフォルト 60000)
|
||||
|
||||
### 2. アクションモード — 連続操作
|
||||
@@ -47,11 +49,29 @@ BrowseWeb({
|
||||
- `goto` — `url` で指定したページに遷移
|
||||
- `click` — `selector` または `ref` で要素をクリック
|
||||
- `fill` — `selector` または `ref` の input/textarea に `value` を入力
|
||||
- `screenshot` — `value` で指定したファイル名で保存(省略時 `screenshot.png`)
|
||||
- `screenshot` — `value` で指定したファイル名で保存(省略時 `screenshot.png`)。縦長ページは既定で分割保存(下記)。`segments: false` でフルページ 1 枚、`maxSegments` で枚数上限を調整
|
||||
- `getText` — 全ページのスナップショット(ref 注釈付き)または `selector` 内のテキストを取得
|
||||
- `wait` — `ms` ミリ秒待機(最大 30000)
|
||||
- `dumpHtml` — `ref` または `selector`(省略時 body)の outerHTML を取得(脱出口、後述)
|
||||
|
||||
### スクリーンショットの分割保存
|
||||
|
||||
縦長ページを 1 枚で撮ると画像が極端に縦長になり、細部が潰れて読み取りづらくなる。BrowseWeb は既定で、ページを **1 画面ぶん(ビューポート高さ)ごとに区切って複数枚**に分割保存する。
|
||||
|
||||
- 1 画面に収まるページはそのまま `output/page.png` の 1 枚(連番なし)
|
||||
- 2 画面ぶん以上あるページは `output/page-001.png`, `output/page-002.png` … と連番で保存し、戻り値に全ファイルを列挙する
|
||||
- 無限スクロールなどの暴走を防ぐため、既定で最大 10 枚まで(`screenshotMaxSegments` / アクションの `maxSegments` で変更)。上限で打ち切った場合は戻り値にその旨を表示する
|
||||
- 分割せずフルページ 1 枚が欲しいときは `screenshotSegments: false`(基本モード)またはアクションの `segments: false`
|
||||
|
||||
```js
|
||||
// 縦長レポートを 1 画面ぶんずつ分割して撮る(既定)
|
||||
BrowseWeb({ url: "output/report.html", screenshot: "report.png" })
|
||||
// → output/report-001.png, output/report-002.png, ...
|
||||
|
||||
// フルページ 1 枚で撮りたいとき
|
||||
BrowseWeb({ url: "output/report.html", screenshot: "report.png", screenshotSegments: false })
|
||||
```
|
||||
|
||||
## 長文ページの取得(preview + ファイル保存)
|
||||
|
||||
`getText` (selector 有無問わず) およびスナップショットの戻り値が **5000 文字を超える** 場合、フルテキストはワークスペースの `logs/browse/{ISO-timestamp}-{hash}.txt` に保存され、戻り値は **先頭 5000 文字 + 続きの取得方法案内** になる:
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
# GetFileProvenance / ListWorkspaceFiles
|
||||
|
||||
Workspace file provenance tools. In a persistent (shared) workspace, files can
|
||||
outlive a single task: an old task's inputs and outputs stay visible to later
|
||||
tasks. These tools let you tell WHO a file belongs to before you edit or rely on
|
||||
it.
|
||||
|
||||
Both are META tools — always available regardless of the workspace tool policy.
|
||||
|
||||
## When to use
|
||||
|
||||
- Before editing a file whose relevance to the current task is unclear.
|
||||
- When you see a file in `input/` or `output/` that you did not create this run.
|
||||
- To find which files the current task actually produced vs. inherited.
|
||||
|
||||
## GetFileProvenance({ path })
|
||||
|
||||
Returns a compact record for one file (workspace-relative path, e.g.
|
||||
`output/report.md`):
|
||||
|
||||
- `source_kind` — one of `user_input`, `agent_output`, `agent_edit`,
|
||||
`bash_generated`, `subtask_output`, `imported_existing`, `unknown`.
|
||||
- `created_by_task_id` — the task that first created/uploaded the file.
|
||||
- `created_by_piece` / movement — the piece + movement that created it.
|
||||
- `last_modified_by_task_id` + `last_modified_at`.
|
||||
|
||||
If there is no record (a file that pre-dates the ledger), you get an
|
||||
`unknown`-equivalent message — treat the file as possibly belonging to another
|
||||
task and verify its contents before overwriting.
|
||||
|
||||
## ListWorkspaceFiles({ path?, sourceKind?, createdByTaskId?, lastModifiedByTaskId?, includeUnknown?, limit? })
|
||||
|
||||
Returns a bounded listing (default 50, max 200 rows) of known files with a
|
||||
one-line provenance summary each. It never returns file contents.
|
||||
|
||||
Filters:
|
||||
|
||||
- `path` — path prefix, e.g. `output/`.
|
||||
- `sourceKind` — filter by source kind.
|
||||
- `createdByTaskId` / `lastModifiedByTaskId` — filter by task.
|
||||
- `includeUnknown` — set `false` to hide `unknown` / `imported_existing` files.
|
||||
|
||||
## Guidance
|
||||
|
||||
- Do NOT blindly edit files whose `source_kind` is `user_input` or whose
|
||||
`created_by_task_id` differs from the current task. Prefer creating a new file
|
||||
under `output/`.
|
||||
- These tools report task/job IDs only — never task titles or user identities.
|
||||
- The tools are scoped to the current run's workspace; you cannot inspect other
|
||||
workspaces.
|
||||
@@ -34,7 +34,6 @@ movements:
|
||||
- name: gather
|
||||
persona: ...
|
||||
instruction: ...
|
||||
allowed_tools: [Read, Write, ...]
|
||||
rules:
|
||||
- condition: ...
|
||||
next: ...
|
||||
|
||||
@@ -50,4 +50,4 @@ RunUserScript({ name: 'foo', params: { date: '2026-05-01' } })
|
||||
|
||||
- Scripts without a frontmatter block are listed with an empty description and no params.
|
||||
- A parse error in one script is reported inline for that entry; other scripts are still listed.
|
||||
- The tool is a META_TOOL — no need to add it to `allowed_tools` in piece YAML.
|
||||
- The tool is a META_TOOL — always available regardless of the workspace tool policy.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# MissionUpdate
|
||||
|
||||
タスクの **Mission Brief**(`goal` / `done` / `open` / `clarifications`)を更新するメタツール。`allowed_tools` に書かなくても常時利用可能(META_TOOL)。
|
||||
タスクの **Mission Brief**(`goal` / `done` / `open` / `clarifications` / `user_constraints` / `decisions` / `current_focus`)を更新するメタツール。ワークスペースのツール設定に関係なく常時利用可能(META_TOOL)。
|
||||
|
||||
Mission Brief は毎 movement のシステムプロンプト冒頭に常に描画され、会話が長くなった後やステップをまたいでも消えない「参照点」になる。ユーザーも Overview タブから直接編集できる。
|
||||
|
||||
@@ -18,8 +18,11 @@ Mission Brief は毎 movement のシステムプロンプト冒頭に常に描
|
||||
| `done` | これまでに完了した主要マイルストーン。箇条書き推奨 |
|
||||
| `open` | 残っている作業・未解決のブロッカー。箇条書き推奨 |
|
||||
| `clarifications` | ユーザーから追加された補足・制約。Markdown 可 |
|
||||
| `user_constraints` | ユーザーが明示した恒久的な制約(「X は変えないで」「認証フローは維持」等)。可能なら `comment:N` / `transcript:N` を出典として添える |
|
||||
| `decisions` | 検討の末に確定した設計判断とその理由。後で蒸し返さないための記録 |
|
||||
| `current_focus` | いま取り組んでいる作業の焦点。movement をまたいで現在地を見失わないため |
|
||||
|
||||
すべて任意だが、最低1つは指定する必要がある(全フィールド未指定はエラー)。
|
||||
すべて任意だが、最低1つは指定する必要がある(全フィールド未指定はエラー)。`user_constraints` / `decisions` は `SearchTaskConversation` で掘り起こした古い制約・判断を pin しておく置き場所に向く。
|
||||
|
||||
## 部分置換セマンティクス
|
||||
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
# Read
|
||||
|
||||
テキストでもドキュメントでも、あらゆるファイルを 1 つの `Read` で読む。拡張子から
|
||||
フォーマットを自動判定し、Office / PDF / メールは内部の抽出ハンドラへ委譲する。
|
||||
|
||||
以前は `ReadExcel` / `ReadDocx` / `ReadPdf` / `ReadPPTX` / `ReadMsg` が独立ツールとして
|
||||
存在したが、「どのリーダーを選ぶか」で誤りが起きやすかったため `Read` に統合した。
|
||||
今はどのファイルでも `Read({ file_path })` を呼べばよい。
|
||||
|
||||
> 画像ファイル(.png / .jpg / .gif / .webp / .bmp / .tif 等)は **Read では開けない**。
|
||||
> VLM で内容を見る `ReadImage` を使う(意味的に別物のため統合していない)。
|
||||
|
||||
## フォーマット自動判定
|
||||
|
||||
| 拡張子 | 委譲先の抽出 | 返るもの |
|
||||
|--------|--------------|----------|
|
||||
| `.txt` / `.md` / `.csv` / コード等のテキスト | Read 本体(行 / バイト読み) | 生テキスト |
|
||||
| `.xlsx` / `.xlsm` | Excel 抽出 | シートのセル値(+任意で装飾) |
|
||||
| `.docx` | Word 抽出 | 本文+表 |
|
||||
| `.pdf` | PDF 抽出 | ページ単位テキスト(+任意で検索) |
|
||||
| `.pptx` | PowerPoint 抽出 | スライドのテキスト・表・ノート |
|
||||
| `.msg` | Outlook メール抽出 | 件名 / 送受信者 / 本文、添付は `input/` に保存 |
|
||||
|
||||
> 旧バイナリ Office(`.xls` / `.doc` / `.ppt` の CFB 形式)は**直接抽出できない**。
|
||||
> Read すると「`.xlsx` / `.docx` / `.pptx` として保存し直してください」と案内されるので、
|
||||
> 変換してから読む(`.xlsm` / `.docm` / `.pptm` のマクロ有効形式は読める)。
|
||||
|
||||
不透明なバイナリ(.zip / .exe / .db / 音声 / 動画 等)や、先頭バイトがバイナリと判定
|
||||
されたファイルは拒否する(LLM コンテキスト破壊を防ぐため)。
|
||||
|
||||
## 共通パラメータ(inline schema)
|
||||
|
||||
| パラメータ | 説明 |
|
||||
|-----------|------|
|
||||
| `file_path` | workspace 内の相対 / 絶対パス(必須) |
|
||||
| `offset` | 読み始める行番号(0-indexed)。**テキスト読みのみ有効**(PDF/Office では無視される) |
|
||||
| `limit` | 読む最大行数。**テキスト読みのみ有効**(PDF/Office では無視される) |
|
||||
| `byte_offset` | 読み始めるバイト位置。改行の無い巨大ファイル向け。`offset` / `limit` と排他。テキスト読みのみ有効 |
|
||||
| `byte_length` | 読むバイト数。`byte_offset` と併用。テキスト読みのみ有効 |
|
||||
| `page_range` | **PDF のページ範囲**(例 `5-10` / `3`)。PDF を途中から / 一部だけ読むときは `offset` ではなくこれを使う |
|
||||
|
||||
大きすぎる出力は残コンテキスト予算に収まるよう自動で切り詰められ、続きの読み方が
|
||||
注記される。
|
||||
|
||||
> **PDF/Office をずらして読むとき**: `offset` / `limit` / `byte_*` は**テキスト専用**で、
|
||||
> PDF・Excel・Word・PowerPoint では黙って無視される(=常に先頭から返る)。PDF は
|
||||
> `page_range`、Excel は `sheet` / `range` を使うこと。これらのフォーマットに
|
||||
> `offset` / `limit` を渡すと、出力の先頭に正しいパラメータへの誘導注記が付く。
|
||||
|
||||
## フォーマット固有の詳細オプション(inline schema には無いが実行時に受理される)
|
||||
|
||||
`Read` はこれらを **raw のまま抽出ハンドラへ素通し**する。inline schema を軽く保つため
|
||||
一覧には出していないので、必要なときはここを見て指定する。
|
||||
|
||||
### Excel(.xlsx / .xlsm)
|
||||
| オプション | 説明 |
|
||||
|-----------|------|
|
||||
| `sheet` | シート名(省略時は全シート) |
|
||||
| `range` | セル範囲(例 `A1:D10`、省略時はシート全体) |
|
||||
| `max_cells` | 最大セル数(デフォルト 1000) |
|
||||
| `include_styles` | `true` で背景色 / フォント / 罫線 / 書式 / 結合を `### Styles` として追記(デフォルト false) |
|
||||
| `max_style_ranges` | `include_styles` 時の style range 上限(デフォルト 250) |
|
||||
|
||||
### Word(.docx)
|
||||
| オプション | 説明 |
|
||||
|-----------|------|
|
||||
| `mode` | `text` / `text+tables`(デフォルト `text+tables`) |
|
||||
| `max_paragraphs` | 最大段落数(デフォルト 200) |
|
||||
|
||||
### PDF(.pdf)
|
||||
| オプション | 説明 |
|
||||
|-----------|------|
|
||||
| `page_range`(別名 `pageRange`) | ページ範囲(例 `1-5` / `3`、省略時は全ページ)。inline schema にも公開済み |
|
||||
| `max_pages` | 抽出する最大ページ数 |
|
||||
| `max_chars` | 返却する最大文字数(デフォルト 8000) |
|
||||
| `query` | 指定するとマッチしたページのみを `grep -n` 風(周辺行付き)で返す |
|
||||
| `query_mode` | `substring`(既定・大小無視の部分一致)/ `regex`(大小区別)/ `iregex`(大小無視の正規表現) |
|
||||
| `context_lines` | `query` マッチ時の前後コンテキスト行数(デフォルト 2、最大 20) |
|
||||
|
||||
スキャン PDF(テキスト無し)は `PdfToImages` で PNG 化してから `ReadImage` で読む。
|
||||
|
||||
### PowerPoint(.pptx)
|
||||
| オプション | 説明 |
|
||||
|-----------|------|
|
||||
| `slideRange` | スライド範囲(例 `1-5` / `3`、省略時は全スライド) |
|
||||
|
||||
### Outlook メール(.msg)
|
||||
- 件名・送信者・宛先・本文を抽出する。
|
||||
- 添付ファイルは `input/` に保存し、保存先パスを出力に列挙する。
|
||||
- 読み取り専用フェーズ(verify 等、edit 不可)では添付を保存せず、その旨を注記する。
|
||||
- ファイル名衝突時は `name-1.ext` のように連番で退避し、既存ファイルは上書きしない。
|
||||
|
||||
## 使用例
|
||||
|
||||
```
|
||||
Read({ file_path: "input/report.md" }) // テキスト
|
||||
Read({ file_path: "input/sales.xlsx", sheet: "Q1", range: "A1:D20" })
|
||||
Read({ file_path: "input/spec.docx", mode: "text" })
|
||||
Read({ file_path: "input/manual.pdf", page_range: "5-10" }) // PDF の 5-10 ページ目
|
||||
Read({ file_path: "input/manual.pdf", query: "認証", context_lines: 3 })
|
||||
Read({ file_path: "input/deck.pptx", slideRange: "2-4" })
|
||||
Read({ file_path: "input/mail.msg" }) // 添付は input/ へ
|
||||
Read({ file_path: "logs/huge.log", byte_offset: 0, byte_length: 4096 })
|
||||
```
|
||||
|
||||
## 関連ツール
|
||||
- `ReadImage` — 画像を VLM で読む(Read とは別ツール)
|
||||
- `PdfToImages` — PDF の各ページを PNG 化(スキャン PDF の前処理)
|
||||
- `SplitExcelSheets` / `SplitDocxSections` — 巨大な表計算 / 文書をシート / 章単位に分割
|
||||
@@ -12,7 +12,7 @@ ReadImage({ file_path: "input/screenshot.png" })
|
||||
## 動作要件
|
||||
|
||||
- 呼び出し時の worker が `vlm: true` で設定されている必要がある
|
||||
- 設定がない場合、このツールは `allowed_tools` に書いてあっても利用不可(function definition から自動除外される)
|
||||
- 設定がない場合、このツールはワークスペースで許可されていても利用不可(function definition から自動除外される)
|
||||
|
||||
## 用途
|
||||
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
# ReadTaskConversation
|
||||
|
||||
`SearchTaskConversation` が返した ref の**前後を数件だけ**読み、当時の文脈を確認する META ツール(全 piece で常時利用可能)。検索を安価に保ちつつ、古い決定の周辺だけを覗くために使う。
|
||||
|
||||
## パラメータ
|
||||
|
||||
| 名前 | 必須 | 説明 |
|
||||
|------|------|------|
|
||||
| `ref` | ○ | `comment:<id>` または `transcript:<index>`(`SearchTaskConversation` の出力からコピーする) |
|
||||
| `before` | | 前に含める件数。既定 2、上限 5 |
|
||||
| `after` | | 後に含める件数。既定 2、上限 5 |
|
||||
|
||||
## 挙動
|
||||
|
||||
- `comment:<id>`: その id のコメントを中心に、コメント列の前後を返す
|
||||
- `transcript:<index>`: その行を中心に、transcript の前後行を返す
|
||||
- 現在タスクの会話だけを対象にする(別タスクは読めない)
|
||||
- 出力は常に上限付き。中心のエントリには `←` マーカーが付く
|
||||
|
||||
## 出力例
|
||||
|
||||
```md
|
||||
## ReadTaskConversation — comment #17 (前 2 / 後 2)
|
||||
|
||||
- comment:15 user/comment 2026-06-30T09:58:00Z
|
||||
先に前提を共有します。
|
||||
- comment:17 user/request 2026-06-30T10:00:00Z ←
|
||||
keep the existing auth flow unchanged.
|
||||
- comment:18 agent/progress 2026-06-30T10:02:00Z
|
||||
了解しました。認証フローは触りません。
|
||||
```
|
||||
|
||||
典型的な流れ: `SearchTaskConversation` でヒットを見つける → 気になる ref を `ReadTaskConversation` で開く → 恒久的な制約・判断なら `MissionUpdate` で pin する。
|
||||
@@ -1,10 +1,10 @@
|
||||
# RequestTool
|
||||
|
||||
この movement で提示されていないツールがどうしても必要なときに、その要求を**記録**するためのメタツール(`allowed_tools` に書かなくても常時利用可能)。
|
||||
この movement で提示されていないツールがどうしても必要なときに、その要求を**記録**し、可能ならユーザー承認を求めるためのメタツール(常時利用可能)。
|
||||
|
||||
## いつ使うか
|
||||
|
||||
- 依頼を達成するのに必要なツールが、現在の movement の `allowed_tools` に無いと気づいたとき。
|
||||
- 依頼を達成するのに必要なツールが、現在の movement に無いと気づいたとき。
|
||||
- まず「本当にそのツールが要るか」を検討すること。多くの作業は既存のツール(`Bash` / `Read` / `WebSearch` 等)で代替できる。
|
||||
|
||||
## 引数
|
||||
@@ -12,13 +12,16 @@
|
||||
| 引数 | 必須 | 説明 |
|
||||
|------|------|------|
|
||||
| `name` | はい | 必要なツール名(例: `WebSearch`, `Bash`, `mcp__foo__bar`) |
|
||||
| `reason` | はい | なぜそのツールが必要かを具体的に。これがピース作者への記録に残る |
|
||||
| `reason` | はい | なぜそのツールが必要かを具体的に。これが記録に残る |
|
||||
|
||||
## 重要: これは「要求の記録」であって「即時付与」ではない
|
||||
## 承認フローと即時利用の可否
|
||||
|
||||
RequestTool を呼んでも、そのツールが**その場で使えるようにはならない**。要求は記録され、タスク詳細とピース集計に表示される。ピース作者が `allowed_tools` / `shared_tools` に追加すれば次回から使える。
|
||||
ツールの可否は**ワークスペースのツールポリシー(設定 → ツール/SSH)**で決まる。RequestTool の挙動は実行環境で変わる:
|
||||
|
||||
要求したあとの進め方:
|
||||
- **ユーザーが応答できる実行**(対話承認が有効): 承認を求めて停車し、**承認されればそのまま続行してそのツールを使える**。拒否されればツール無しで進む。
|
||||
- **それ以外の実行**: その場では使えない。要求が記録され、タスク詳細とツール要求の集計に表示される。運用者がワークスペースの設定でそのツールを有効化すれば、次回から使える。
|
||||
|
||||
その場で使えない場合の進め方:
|
||||
|
||||
1. そのツール無しで達成できないか、もう一度考える。
|
||||
2. どうしても無理なら `complete({status: "needs_user_input", missing_info: "...", why_no_default: "..."})` でユーザーに依頼する。
|
||||
@@ -27,9 +30,9 @@ RequestTool を呼んでも、そのツールが**その場で使えるように
|
||||
## 分類(記録される `category`)
|
||||
|
||||
- **既に利用可能**: そのツールはこの movement で使える → 記録せず「そのまま呼んでください」と返る。
|
||||
- **`requested`**: カタログに存在するがこの movement では未許可 → 設定漏れ候補として記録。
|
||||
- **`requested`**: カタログに存在するがこの movement では未許可 → 対話承認が有効なら承認待ちに、無効なら設定漏れ候補として記録。
|
||||
- **`unknown`**: そんなツールは存在しない(名前の誤り・能力ギャップ)→ **エラーを返す**(実在ツール名のみ要求可)。診断のため記録は残るが、承認待ちにはならない。エラーを受けたら実在するツールで進めること。
|
||||
|
||||
## 関連
|
||||
|
||||
足りないツールを呼んで弾かれた場合も、同じ記録に「受動捕捉(`blocked`)」として残る。ピース側の `shared_tools`(全 movement 共通ツール)も参照(`pieces/SCHEMA.md`)。
|
||||
足りないツールを呼んで弾かれた場合も、同じ記録に「受動捕捉(`blocked`)」として残る。ワークスペースのツール許可の考え方は「[ツール](../../ui/src/content/help/16-tools.md)」も参照。
|
||||
|
||||
@@ -86,7 +86,7 @@ On task complete, a candidate patch will be saved as browser-macros/{name}.next.
|
||||
|
||||
## Notes
|
||||
|
||||
- The tool is a META_TOOL — it is available in every movement without listing it in `allowed_tools`.
|
||||
- The tool is a META_TOOL — available in every movement regardless of the workspace tool policy.
|
||||
- Use `ListUserAssets` first to discover available macros and their param specs.
|
||||
- On macro failure, use `BrowseWeb` as a manual fallback.
|
||||
- To run Python or other ad-hoc code, use the **Bash** tool (pip packages pre-baked).
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
# SearchTaskConversation
|
||||
|
||||
このタスクの過去の会話を検索し、出典 ref 付きの短い抜粋を返す META ツール(全 piece で常時利用可能)。長い/継続タスクで「前に何を言われたか」を思い出すために使う。**全文は返さない** — ヒットの一覧だけを返し、詳細は `ReadTaskConversation` で辿る。
|
||||
|
||||
## 検索対象
|
||||
|
||||
- **comments**: タスクのコメント(ユーザーの依頼・割り込み・エージェントの進捗など)。ref は `comment:<id>`
|
||||
- **transcript**: `logs/transcript.jsonl`(ReAct スレッドの生ログ)。ref は `transcript:<行index>`
|
||||
|
||||
現在のタスクの会話だけを検索する。別タスクのログには到達できない(ツールは現在タスクに束縛されている)。
|
||||
|
||||
## パラメータ
|
||||
|
||||
| 名前 | 必須 | 説明 |
|
||||
|------|------|------|
|
||||
| `query` | ○ | 検索キーワード。部分一致・大文字小文字は無視 |
|
||||
| `source` | | `comments` / `transcript` / `both`(既定 `both`) |
|
||||
| `author` | | `user` / `agent` / `system` で発言者を絞る |
|
||||
| `kind` | | コメント種別で絞る(request/comment/interjection/result/ask/progress/handoff)。transcript には適用されない |
|
||||
| `limit` | | 最大件数。既定 10、上限 50 |
|
||||
|
||||
## 使いどころ
|
||||
|
||||
- ユーザーに聞き直す前に、その情報が過去に述べられていないか確認する
|
||||
- 以前に触れたファイル・下した決定を変更する前に、関連する制約を探す
|
||||
- 文脈圧縮のあと、古い決定を思い出してから作業を再開する
|
||||
|
||||
## 出力例
|
||||
|
||||
```md
|
||||
## Conversation Search Results (query: "auth", 2 hit(s))
|
||||
|
||||
- comment:17 user/request 2026-06-30T10:00:00Z
|
||||
…keep the existing auth flow unchanged…
|
||||
|
||||
- transcript:42 user
|
||||
…never touch the payment/auth code…
|
||||
|
||||
前後の文脈は ReadTaskConversation({ ref }) で確認できます。
|
||||
```
|
||||
|
||||
ヒットで判明した恒久的な事実(制約・判断)は `MissionUpdate` の `user_constraints` / `decisions` に pin して、以降の movement でも見失わないようにする。
|
||||
@@ -0,0 +1,87 @@
|
||||
# SearchWorkspaceTasks
|
||||
|
||||
同じワークスペース(スペース)内の**他タスク**の会話を横断検索する META ツール(全 piece で常時利用可能)。`SearchTaskConversation` が現在タスクの会話だけを検索するのに対し、こちらは「同じスペースの他タスクで前に何を頼まれたか/どう進めたか」を思い出すための対になるツール。**全文は返さない** — ヒットの一覧(抜粋)だけを返す。前後の全文が必要なら `around_ref` で辿る。
|
||||
|
||||
## スコープ
|
||||
|
||||
- 検索対象は**同じスペースの他タスクのみ**。タスクの状態(実行中/完了/中断など)は問わない
|
||||
- 呼び出し元がそのスペースの owner またはメンバーであることを前提に、DB クエリ自体がスペース境界で絞り込む。他スペースのタスクには物理的に到達できない
|
||||
- no-auth(サインインしていない owner に紐づかない)実行や subtask 実行では、このツール自体が利用できない文脈になる。その場合はエラーではなく「このコンテキストでは利用できません」という案内文を返す
|
||||
|
||||
## 索引される内容(検索でヒットするテキスト)
|
||||
|
||||
検索結果の抜粋は、コメント本文そのものではなく**索引用に正規化・墨消しされたテキスト**。索引されるのは次のみ:
|
||||
|
||||
- ユーザーの依頼・割り込み(request / interjection)
|
||||
- エージェントの成果・確認(result / ask)、handoff
|
||||
- エージェントの思考(progress の thinking)
|
||||
- movement の要約(progress の summary)
|
||||
- ツール実行は**ツール名のみ**(例: `tool: WebFetch`)。引数の値やツールの実行結果は一切索引されない
|
||||
- 添付ファイルは**ファイル名のみ**を本文末尾に追記して索引する(中身は索引しない)
|
||||
|
||||
上記に当てはまらない種別(通常の comment、interjection_ack、未知の progress type など)は索引されない=検索にヒットしない。
|
||||
|
||||
## パラメータ
|
||||
|
||||
`query` と `around_ref` はどちらか一方のみ指定する(排他・両方またはどちらも未指定はエラー)。
|
||||
|
||||
| 名前 | 必須 | 説明 |
|
||||
|------|------|------|
|
||||
| `query` | ○(`around_ref` と排他) | 検索キーワード |
|
||||
| `around_ref` | ○(`query` と排他) | `"comment:<id>"` 形式。指定した comment の前後を読む |
|
||||
| `context` | | 各ヒットに付す前後コメント件数(grep -C 相当)。既定 0、最大 5 |
|
||||
| `limit` | | 最大ヒット件数。既定 10、最大 30(`query` モードのみ) |
|
||||
| `kind` | | コメント種別で絞り込む(request/comment/interjection/result/ask/progress/handoff) |
|
||||
| `author` | | 発言者で絞り込む |
|
||||
| `task_id` | | 特定タスク ID に絞り込む |
|
||||
|
||||
出力の ref は `task:<id>` / `comment:<id>` の形式。
|
||||
|
||||
## 検索マッチング
|
||||
|
||||
日本語も含めた部分一致検索を trigram tokenize の FTS5 インデックスで行う。**3 文字未満の語は trigram で MATCH できないため、そのような語が含まれるクエリは自動的に LIKE(部分一致)にフォールバックする**(挙動は同じだが遅い)。
|
||||
|
||||
**複数語はスペース区切りの暗黙 AND(Google 的)**。`ログイン 認証` と入力すると「ログイン」と「認証」を**両方含む**コメントにヒットする(語順・位置は問わない)。フレーズ一致ではないので、離れて出現していても両語があればヒットする。各語は内部で個別に引用してから AND で結合するため、`AND`/`OR`/`NEAR`/`*`/`"` などの記号が語に混ざっても FTS5 演算子としては解釈されない(=ユーザー側から任意の演算子検索や `OR` 検索を差し込むことはできない)。広く探したいときは 1 語で、絞りたいときは語を足す。
|
||||
|
||||
SQLite のビルドが FTS5 に対応していない環境では、検索機能自体が使えない旨のメッセージを返す(エラーにはしない)。
|
||||
|
||||
## ドリルダウン(`around_ref`)と検索結果の違い
|
||||
|
||||
**検索結果の抜粋は索引用に墨消しされた要約だが、`around_ref`(および `context` 指定時に付随する前後コメント)は対象コメントの生の本文をそのまま返す。** 同じスペースのメンバーはもともと製品 UI 上でその兄弟タスクの全文を読めるため、同じ信頼境界の中で全文を返すことは越権にならない。つまり「検索は軽量で墨消しされた概観、ドリルダウンは同じ信頼境界内でのフル情報」という設計。
|
||||
|
||||
## 出力例
|
||||
|
||||
```md
|
||||
## Workspace Task Search Results (query: "認証", 2 hit(s))
|
||||
|
||||
- task:12 "ログイン画面の改修" / comment:88 user/request 2026-06-20T10:00:00Z
|
||||
…既存の認証フローは変更しないでください…
|
||||
|
||||
- task:12 "ログイン画面の改修" / comment:95 agent/result 2026-06-20T11:30:00Z
|
||||
…認証まわりは touch せず、UI だけ差し替えました…
|
||||
|
||||
前後の文脈をさらに確認するには around_ref: "comment:<id>" を指定してください。
|
||||
```
|
||||
|
||||
```md
|
||||
## Workspace Task Search — task:12 "ログイン画面の改修" (comment:88 前後 2 件)
|
||||
|
||||
- comment:86 user/comment 2026-06-20T09:55:00Z
|
||||
質問なんですが、既存の認証部分は今回のスコープに入りますか?
|
||||
- comment:88 user/request 2026-06-20T10:00:00Z ←
|
||||
既存の認証フローは変更しないでください。UI 差し替えのみでお願いします。
|
||||
- comment:90 agent/progress 2026-06-20T10:02:00Z
|
||||
了解しました。認証ロジックには触れずに進めます。
|
||||
```
|
||||
|
||||
## 使いどころ
|
||||
|
||||
- 同じスペースの別タスクで、この件についてすでに依頼・決定が交わされていないか確認する
|
||||
- ユーザーに「前にどう言いましたっけ」と聞き直す前に、まず自分で探す
|
||||
- 過去タスクの成果物・進め方を参考にする(他タスクの ID や作業内容が分かれば `task_id` で絞り込める)
|
||||
|
||||
ヒットで判明した恒久的な事実(制約・判断)は `MissionUpdate` の `user_constraints` / `decisions` に pin しておくと、以降の movement でも見失わない。
|
||||
|
||||
## 関連ツール
|
||||
|
||||
- `SearchTaskConversation` / `ReadTaskConversation` — 現在タスク自身の会話(コメント+transcript)を検索・閲覧する。他タスクへは到達できない。こちらは同じスペースの他タスクを横断検索する対
|
||||
@@ -6,6 +6,11 @@ Piece の取得・編集には GetPiece / CreatePiece / UpdatePiece を使う。
|
||||
利用可能なスキル一覧はシステムプロンプトの **Skills Index** に出る。本文を読むには
|
||||
`ReadSkill({ name: "..." })` を呼ぶ。
|
||||
|
||||
> **重要: スキルを `Read` で直接読もうとしないこと。** スキルは workspace の外に
|
||||
> 保存されており、`Read("skills/<name>/SKILL.md")` のようなパスは(ディレクトリ型を
|
||||
> ReadSkill で展開する前は)存在しない。まず `ReadSkill({ name })` を呼ぶ。ディレクトリ型は
|
||||
> それで `skills/<name>/` に展開され、以後は `skills/<name>/...` を `Read` で読める。
|
||||
|
||||
## ツール
|
||||
|
||||
- **InstallSkill** — スキルを保存する。通常は `content` に SKILL.md 全文(YAML frontmatter + 本文)を渡す。workspace 内に `SKILL.md` と `scripts/` 等を含むディレクトリを組み立て済みなら `sourcePath`(workspace 内の絶対パス)を渡す。`scope` は `user`(個人 or 共有ワークスペース)か `system`(全ユーザー共有・admin のみ)。
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# SSH Console Tools (SshConsoleEnsure / SshConsoleSend / SshConsoleSnapshot)
|
||||
|
||||
AI と人間が共有する SSH PTY セッションを操作する 3 ツール。1 タスクに 1 PTY セッションが対応し、`cd` / 環境変数 / foreground プロセスは job をまたいで維持される。長時間の対話作業 / TUI (vim, top, less, tmux) / 複数ラウンドの調査向け。
|
||||
AI と人間が共有する SSH PTY セッションを操作する 3 ツール。**1 タスクは接続ごとに 1 つ、複数の PTY セッションを同時に持てる**(例: 2 台のサーバーへ同時接続して並行作業)。各セッション内では `cd` / 環境変数 / foreground プロセスが job をまたいで維持される。長時間の対話作業 / TUI (vim, top, less, tmux) / 複数ラウンドの調査向け。
|
||||
|
||||
単発コマンドだけなら **`SshExec`** (ssh-ops piece) のほうが軽い。本ツール群は対話的シェル + AI が画面を見続ける用途に最適化されている。
|
||||
|
||||
> **ユーザーが先にセッションを開いている場合がある**: タスク詳細の **Console タブ**から、ユーザーが接続を選んで自分でセッションを起動できる。その場合 `SshConsoleEnsure` は既存セッションをそのまま再利用する (`connection_id` を省略すれば active session が採用される)。「まず console を開く」操作を AI 側でやり直す必要はない。
|
||||
> **ユーザーが先にセッションを開いている場合がある**: タスク詳細の **Console タブ**から、ユーザーがタブを追加して自分でセッションを起動できる(複数タブを同時に開ける。→[SSH 接続](../../ui/src/content/help/14-ssh.md))。その場合 `SshConsoleEnsure` は既存セッションをそのまま再利用する。「まず console を開く」操作を AI 側でやり直す必要はない。ただし**タスクに複数セッションが同時に開いている場合、`connection_id` を省略して自動採用されるのは「直前にこのツール群で操作した接続 (current-connection pointer)」か「セッションが 1 つしかない」ときだけ**。2 つ以上開いていて pointer も無い状態で省略すると `ambiguous` エラーになる(詳細は後述)。
|
||||
|
||||
## 典型的な flow (まずこれを真似る)
|
||||
|
||||
@@ -40,10 +40,10 @@ SshConsoleSnapshot({
|
||||
|
||||
| Param | Required | Description |
|
||||
|---|---|---|
|
||||
| `connection_id` | yes | UUID。piece の `allowed_ssh_connections` に含まれている必要がある。**label / hostname / 思い出した文字列で代用してはいけない** — 必ず `SshListConnections` の `id` を渡すこと |
|
||||
| `connection_id` | yes | UUID。このワークスペースに登録された接続である必要がある。**label / hostname / 思い出した文字列で代用してはいけない** — 必ず `SshListConnections` の `id` を渡すこと |
|
||||
| `cols` | no | 初回 open 時のターミナル幅。default `ssh.console.default_cols` (120) |
|
||||
| `rows` | no | 初回 open 時のターミナル高さ。default `ssh.console.default_rows` (32) |
|
||||
| `force_replace` | no | bool。default `false`。既存 session が**別の** `connection_id` にある場合の挙動を制御 (下記参照) |
|
||||
| `force_replace` | no | bool。default `false`。**同じ** `connection_id` に既存セッションがあるとき、それを閉じて開き直すかどうかを制御 (下記参照)。**別の** `connection_id` を渡した場合は `force_replace` に関係なく新規セッションが追加される |
|
||||
|
||||
Return:
|
||||
```json
|
||||
@@ -52,16 +52,28 @@ Return:
|
||||
|
||||
`reused: true` なら過去ターンから引き継いだ既存セッション (cd 等の state あり)。`false` なら今回新規 open。
|
||||
|
||||
### connection_id mismatch の挙動 (重要)
|
||||
### 複数セッション: 別の接続を開くと「追加」される (重要)
|
||||
|
||||
同じ task で**別の** `connection_id` を渡した場合:
|
||||
1 つのタスクは接続ごとに 1 つ、複数のセッションを同時に持てる。`SshConsoleEnsure` に**別の** `connection_id` を渡しても既存セッションは閉じられない — 単に新しい接続へのセッションが追加で開くだけ (add-not-replace)。**同じ** `connection_id` を渡した場合だけ「再利用か force_replace での再起動か」の分岐になる:
|
||||
|
||||
- `force_replace: false` (default) → エラー返却。レスポンスに **既存セッションの connection_id が含まれる** ので、それをそのまま使うか、本当に切り替えたければ次の呼び出しで `force_replace: true` を渡す
|
||||
- `force_replace: true` → 旧セッションは `connection_change` 理由で閉じられ、新セッションが開く (旧 shell の state は失われる)
|
||||
- 同じ `connection_id` + `force_replace: false` (default) → 既存セッションを再利用 (`alreadyActive: true`, `reused: true`)
|
||||
- 同じ `connection_id` + `force_replace: true` → **その接続のセッションだけ** `connection_change` 理由で閉じて開き直す (他の接続のセッションには影響しない。旧 shell の state は失われる)
|
||||
|
||||
**典型的なバグパターン**: ジョブをまたいで動作するエージェントが `connection_id` を覚えていなくて、
|
||||
LLM の hallucination で適当な UUID を生成 → mismatch reject される、というケース。エラーメッセージの中に
|
||||
正しい `connection_id` が出ているのでそれを使うか、Send/Snapshot で `connection_id` を省略する。
|
||||
タスクあたりの上限 (既定 5、上限到達時は `task_session_cap`) やユーザー単位の上限 (`user_session_cap`、設定次第) に達すると新規オープンは拒否される。人間側も Console タブの「+ 接続」ボタンで同じように接続を追加でき、タブの ✕ で不要なセッションを閉じられる (→[SSH 接続](../../ui/src/content/help/14-ssh.md))。
|
||||
|
||||
### `connection_id` を省略できるのは 1 セッションのときだけ
|
||||
|
||||
`SshConsoleSend` / `SshConsoleRun` / `SshConsoleSnapshot` は `connection_id` を省略できるが、解決順は次のとおり:
|
||||
|
||||
1. `connection_id` を明示 → その接続のセッションを厳密に使う (無ければ `not found` エラー。勝手に新規 open はしない)
|
||||
2. 省略時は、このツール群で直前に操作した接続 (current-connection pointer) が生きていればそれ
|
||||
3. pointer も無く、タスクのセッションが**ちょうど 1 つ**ならそれを自動採用
|
||||
4. タスクに**複数**セッションが同時に開いていて pointer も無い場合 → `ambiguous` エラー (`connection_id required (multiple sessions open: ...)`)。**この場合は `connection_id` を明示しないと動かない**
|
||||
5. セッションが 1 つも無い場合 → `SshConsoleEnsure` で開くよう促すエラー
|
||||
|
||||
**複数接続で並行作業するときの鉄則**: 2 つ目以降のセッションを触るときは常に `connection_id` を明示する。省略に頼ってよいのは、セッションが 1 つしかないタスクか、直前にそのセッションを操作した直後だけ。
|
||||
|
||||
**典型的なバグパターン**: ジョブをまたいで動作するエージェントが `connection_id` を覚えておらず、複数セッションが開いている状態で省略 → `ambiguous` で reject される、というケース。エラーメッセージに出ている `connection_id` の一覧 (または `SshListConnections`) から正しいものを選んで明示する。
|
||||
|
||||
## SshConsoleSend
|
||||
|
||||
@@ -77,7 +89,7 @@ raw のまま送りたい (改行を付けない) ケース:
|
||||
|
||||
| Param | Required | Description |
|
||||
|---|---|---|
|
||||
| `connection_id` | no | UUID。**省略時はこの task の active session を自動採用 (推奨)**。明示する場合は active session の id と一致する必要があり、不一致なら reject (active id が surface される) |
|
||||
| `connection_id` | no | UUID。**タスクにセッションが 1 つだけ、または直前にこのツール群で操作した接続 (pointer) がある場合は省略可**。複数セッションが開いていて pointer も無いと `ambiguous` エラー (下記「`connection_id` を省略できるのは 1 セッションのときだけ」参照) |
|
||||
| `input` | yes | raw 文字列。LF / CRLF / control 文字 (`\x03` Ctrl-C, `\x04` Ctrl-D, `\x1b` Esc, `\t` Tab) を透過 |
|
||||
| `wait_ms` | no | 送信後の screen_after 取得までの待ち時間 (default 500ms, max 5000ms) |
|
||||
|
||||
@@ -113,7 +125,7 @@ Return:
|
||||
|
||||
| Param | Required | Description |
|
||||
|---|---|---|
|
||||
| `connection_id` | no | UUID。**省略時はこの task の active session を自動採用 (推奨)**。明示する場合は active session の id と一致する必要があり、不一致なら reject |
|
||||
| `connection_id` | no | UUID。**タスクにセッションが 1 つだけ、または直前にこのツール群で操作した接続 (pointer) がある場合は省略可**。複数セッションが開いていて pointer も無いと `ambiguous` エラー (上記「`connection_id` を省略できるのは 1 セッションのときだけ」参照) |
|
||||
| `kind` | no | `screen` (デフォルト) — 現在の表示画面 / `scrollback` — それ以前を含む過去の出力 |
|
||||
| `max_bytes` | no | scrollback の上限 (default 8192, max 65536)。tail から `max_bytes` バイト返す |
|
||||
|
||||
@@ -138,7 +150,7 @@ text は ANSI escape strip 済み (色 / cursor 移動シーケンスを除去)
|
||||
| Param | Required | Description |
|
||||
|---|---|---|
|
||||
| `command` | yes | 実行するシェルコマンド |
|
||||
| `connection_id` | no | UUID。**省略時はこの task の active session を自動採用 (推奨)** |
|
||||
| `connection_id` | no | UUID。**タスクにセッションが 1 つだけ、または直前にこのツール群で操作した接続 (pointer) がある場合は省略可**。複数セッションが開いていて pointer も無いと `ambiguous` エラー |
|
||||
| `timeout_ms` | no | タイムアウト (ms)。デフォルト 120000 (2分)、最大 600000 (10分)。タイムアウト時もコマンドは kill されない |
|
||||
| `idle_ms` | no | 出力が `idle_ms` ms 途切れたら早期終了と判定する。0=無効 (デフォルト) |
|
||||
|
||||
@@ -176,12 +188,13 @@ Return:
|
||||
| `host_key_*` | UI (Settings → User Folder → SSH Connections) で TOFU 検証してから再試行 |
|
||||
| `command_rejected (builtin_deny / custom_deny)` | deny-list で reject。admin に許可パターン追加を相談 (ローカルで回避してはいけない) |
|
||||
| `idle_timeout` / `duration_cap` | 古いセッションが閉じた。`SshConsoleEnsure` を再度呼んで開け直す |
|
||||
| `connection_change` | 同 task で `force_replace: true` 付き Ensure が呼ばれた → 古いセッションが閉じた |
|
||||
| `this task already has an active session on connection X (...)` | エラー文の中の **X が正しい id**。X を `connection_id` に使うか、Send/Snapshot で省略する。本当に切り替えたければ `force_replace: true` |
|
||||
| `this task has an active session on connection X, not Y` | Send/Snapshot 側で id mismatch。X を使う or 省略する |
|
||||
| `connection_change` | **同じ** `connection_id` に `force_replace: true` 付き Ensure が呼ばれた → その接続のセッションだけ閉じて開き直した (別の接続を開いても発生しない) |
|
||||
| `connection_id required (multiple sessions open: ...)` (ambiguous) | Send/Run/Snapshot で `connection_id` を省略したが、このタスクに複数セッションが同時に開いていて pointer も無い。エラー文中の一覧から狙った `connection_id` を明示する |
|
||||
| `this task already has the maximum of N open console sessions` (`task_session_cap`) | タスクあたりのセッション上限 (既定 5) に到達。使っていない接続を `SshConsoleSend/Run` の完了を確認してからユーザーに Console タブでタブを閉じてもらうか、既存接続を使い回す |
|
||||
| `you already have the maximum of N open console sessions` (`user_session_cap`) | ユーザー単位の上限 (設定されている場合) に到達。他タスクのセッションを閉じるまで新規オープンは拒否される |
|
||||
| `maintenance` | admin の対応を待つ。`complete({status: 'needs_user_input', missing_info: 'SSH maintenance window'})` で停止 |
|
||||
| `not initialised` | `ssh.enabled` または `ssh.console.enabled` が false / `MCP_ENCRYPTION_KEY` 未設定。admin に依頼 |
|
||||
| `does not declare allowed_ssh_connections` | piece YAML の movement に `allowed_ssh_connections: ['*']` 等を追加する必要あり |
|
||||
| `not registered to this workspace` | 対象接続がこのワークスペースに未登録。Settings → SSH で登録し、Settings → Tools で `ssh` カテゴリを有効化する |
|
||||
|
||||
## deny-list の限界
|
||||
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
|
||||
| ツール | 用途 | 入力 |
|
||||
|--------|------|------|
|
||||
| `SshListConnections` | この movement で使える接続の UUID + label + host 一覧を取得 | (引数なし) |
|
||||
| `SshListConnections` | このワークスペースで使える接続の UUID + label + host 一覧を取得 | (引数なし) |
|
||||
| `SshExec` | リモートで shell 単一行を実行 | `connection_id`, `command`, (任意) `timeout_ms` |
|
||||
| `SshUpload` | workspace → リモートへファイル転送 (SFTP) | `connection_id`, `local_path`, `remote_path`, (任意) `timeout_ms` |
|
||||
| `SshDownload` | リモート → workspace へファイル取得 (SFTP) | `connection_id`, `remote_path`, `local_path`, (任意) `timeout_ms` |
|
||||
|
||||
転送系の 3 ツールは、接続側の `remote_path_prefix` 配下の絶対パスのみを受け付け、`workspace` 外への local パスは reject される。`connection_id` は piece 側の `allowed_ssh_connections` に明示されている UUID のみ使用可能。
|
||||
転送系の 3 ツールは、接続側の `remote_path_prefix` 配下の絶対パスのみを受け付け、`workspace` 外への local パスは reject される。`connection_id` は、このワークスペースに登録されている接続の UUID のみ使用可能(ツール可否・接続スコープはワークスペースのツールポリシーが決める)。
|
||||
|
||||
タスク本文に `connection_id` が記されていないときは、まず `SshListConnections` を呼んで該当の host / label の UUID を取得すること。
|
||||
|
||||
@@ -21,10 +21,10 @@
|
||||
|
||||
1. **`ssh.enabled: true`** が `config.yaml` で設定されている
|
||||
2. **`MCP_ENCRYPTION_KEY`** 環境変数が 64 hex 文字 (= 32 バイト) で設定されている
|
||||
3. **対象 connection の host key が verify 済**。新規作成直後は `host_key_verified_at IS NULL` 状態で SshExec/Upload/Download は `host_key_not_verified` で失敗する。SSH Connections パネル (Settings → User Folder → SSH Connections) で `/test` を実行 → 鍵 fingerprint を確認 → "Verify" ボタンで verify する
|
||||
4. **piece の現在 movement で `allowed_ssh_connections` に当該 UUID が明示**されている (またはワイルドカード `*`)。空配列 `[]` は「SSH 使用するが許可なし」の deny 宣言とみなされ全 UUID が reject される
|
||||
3. **対象 connection の host key が verify 済**。新規作成直後は `host_key_verified_at IS NULL` 状態で SshExec/Upload/Download は `host_key_not_verified` で失敗する。SSH 接続パネル (Settings → SSH) で `/test` を実行 → 鍵 fingerprint を確認 → "Verify" ボタンで verify する
|
||||
4. **ワークスペースのツールポリシーで `ssh` カテゴリが有効化**され、対象 connection が **そのワークスペースに登録**されている (Settings → Tools で ssh を有効化、Settings → SSH で接続を登録)。接続スコープはワークスペース単位で、worker がジョブ開始時に解決して全 movement に一律適用する。piece 側の opt-in は不要(撤去済み)
|
||||
|
||||
不足時のエラーメッセージ例: `SshExec error: piece "ops" movement "exec" does not list connection abcd1234... in allowed_ssh_connections.`
|
||||
不足時のエラーメッセージ例: `SshExec: connection abcd1234... is not registered to this workspace. Register it under Settings → SSH.`
|
||||
|
||||
## SshListConnections
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
SshListConnections({})
|
||||
```
|
||||
|
||||
引数なし。現在の movement の `allowed_ssh_connections` + ジョブ owner の access grant を満たす接続だけを返す (admin 無効化 / piece 除外 / grant 無しは filter out)。
|
||||
引数なし。このワークスペースに登録された接続のうち、ジョブ owner の access grant を満たすものだけを返す (admin 無効化 / grant 無しは filter out)。
|
||||
|
||||
戻り値 (JSON 文字列):
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
ユーザーごとの常時指示書 `AGENTS.md` を読み書きするツール。`AGENTS.md` は各タスクのシステムプロンプトに自動注入される「このユーザーが常に守ってほしいこと」を書いた個人ファイル。memory(`UpdateUserMemory`)が事実の断片を貯めるのに対し、`AGENTS.md` は振る舞いの方針そのもの。
|
||||
|
||||
両ツールは META_TOOL(常時利用可能)。piece の `allowed_tools` に書かなくても使える。per-user 機能なので、認証済みユーザーのコンテキスト(`ctx.userId`)が必要。
|
||||
両ツールは META_TOOL(常時利用可能)。ワークスペースのツール設定に関係なく使える。per-user 機能なので、認証済みユーザーのコンテキスト(`ctx.userId`)が必要。
|
||||
|
||||
## ReadUserAgents
|
||||
|
||||
|
||||
@@ -111,6 +111,6 @@ async function main({ context, params }) {
|
||||
|
||||
## Notes
|
||||
|
||||
- `WriteUserScript` is a META_TOOL — available in every movement without listing it in `allowed_tools`.
|
||||
- `WriteUserScript` is a META_TOOL — available in every movement regardless of the workspace tool policy.
|
||||
- After writing, use `RunUserScript` to immediately execute and verify the macro.
|
||||
- Use `ListUserAssets` to see all macros currently in the folder.
|
||||
|
||||
Reference in New Issue
Block a user