@zenalexa/unicli 0.213.1 → 0.213.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/README.md +4 -4
- package/README.zh-CN.md +3 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +11 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/describe.d.ts +26 -0
- package/dist/commands/describe.d.ts.map +1 -0
- package/dist/commands/describe.js +230 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/dev.js +1 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/dispatch.d.ts +14 -3
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/dispatch.js +141 -81
- package/dist/commands/dispatch.js.map +1 -1
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +1 -1
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +1 -1
- package/dist/commands/skills.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -1
- package/dist/discovery/loader.d.ts +8 -0
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +22 -1
- package/dist/discovery/loader.js.map +1 -1
- package/dist/engine/args.d.ts +83 -0
- package/dist/engine/args.d.ts.map +1 -0
- package/dist/engine/args.js +260 -0
- package/dist/engine/args.js.map +1 -0
- package/dist/engine/executor.d.ts +20 -1
- package/dist/engine/executor.d.ts.map +1 -1
- package/dist/engine/executor.js +11 -2
- package/dist/engine/executor.js.map +1 -1
- package/dist/engine/harden.d.ts +48 -0
- package/dist/engine/harden.d.ts.map +1 -0
- package/dist/engine/harden.js +327 -0
- package/dist/engine/harden.js.map +1 -0
- package/dist/engine/invoke.d.ts +16 -0
- package/dist/engine/invoke.d.ts.map +1 -0
- package/dist/engine/invoke.js +15 -0
- package/dist/engine/invoke.js.map +1 -0
- package/dist/engine/kernel/compile.d.ts +30 -0
- package/dist/engine/kernel/compile.d.ts.map +1 -0
- package/dist/engine/kernel/compile.js +167 -0
- package/dist/engine/kernel/compile.js.map +1 -0
- package/dist/engine/kernel/execute.d.ts +35 -0
- package/dist/engine/kernel/execute.d.ts.map +1 -0
- package/dist/engine/kernel/execute.js +221 -0
- package/dist/engine/kernel/execute.js.map +1 -0
- package/dist/engine/kernel/types.d.ts +49 -0
- package/dist/engine/kernel/types.d.ts.map +1 -0
- package/dist/engine/kernel/types.js +9 -0
- package/dist/engine/kernel/types.js.map +1 -0
- package/dist/engine/kernel/ulid.d.ts +21 -0
- package/dist/engine/kernel/ulid.d.ts.map +1 -0
- package/dist/engine/kernel/ulid.js +76 -0
- package/dist/engine/kernel/ulid.js.map +1 -0
- package/dist/engine/template.d.ts.map +1 -1
- package/dist/engine/template.js +11 -0
- package/dist/engine/template.js.map +1 -1
- package/dist/manifest.json +1 -1
- package/dist/mcp/dispatch.d.ts +46 -0
- package/dist/mcp/dispatch.d.ts.map +1 -0
- package/dist/mcp/dispatch.js +109 -0
- package/dist/mcp/dispatch.js.map +1 -0
- package/dist/mcp/handler.d.ts +30 -0
- package/dist/mcp/handler.d.ts.map +1 -0
- package/dist/mcp/handler.js +293 -0
- package/dist/mcp/handler.js.map +1 -0
- package/dist/mcp/http-transport.d.ts +16 -0
- package/dist/mcp/http-transport.d.ts.map +1 -0
- package/dist/mcp/http-transport.js +124 -0
- package/dist/mcp/http-transport.js.map +1 -0
- package/dist/mcp/server.d.ts +17 -33
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +31 -742
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/sse-transport.js.map +1 -1
- package/dist/mcp/streamable-http/handle-post.d.ts +23 -0
- package/dist/mcp/streamable-http/handle-post.d.ts.map +1 -0
- package/dist/mcp/streamable-http/handle-post.js +357 -0
- package/dist/mcp/streamable-http/handle-post.js.map +1 -0
- package/dist/mcp/streamable-http/index.d.ts +45 -0
- package/dist/mcp/streamable-http/index.d.ts.map +1 -0
- package/dist/mcp/streamable-http/index.js +150 -0
- package/dist/mcp/streamable-http/index.js.map +1 -0
- package/dist/mcp/streamable-http/session.d.ts +85 -0
- package/dist/mcp/streamable-http/session.d.ts.map +1 -0
- package/dist/mcp/streamable-http/session.js +104 -0
- package/dist/mcp/streamable-http/session.js.map +1 -0
- package/dist/mcp/streamable-http.d.ts +7 -85
- package/dist/mcp/streamable-http.d.ts.map +1 -1
- package/dist/mcp/streamable-http.js +6 -568
- package/dist/mcp/streamable-http.js.map +1 -1
- package/dist/mcp/tools.d.ts +57 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +237 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/output/envelope.d.ts +29 -0
- package/dist/output/envelope.d.ts.map +1 -1
- package/dist/output/envelope.js +6 -0
- package/dist/output/envelope.js.map +1 -1
- package/dist/output/next-actions.d.ts +18 -0
- package/dist/output/next-actions.d.ts.map +1 -0
- package/dist/output/next-actions.js +64 -0
- package/dist/output/next-actions.js.map +1 -0
- package/dist/output/projection.d.ts +93 -0
- package/dist/output/projection.d.ts.map +1 -0
- package/dist/output/projection.js +255 -0
- package/dist/output/projection.js.map +1 -0
- package/dist/protocol/acp-helpers.d.ts +32 -0
- package/dist/protocol/acp-helpers.d.ts.map +1 -0
- package/dist/protocol/acp-helpers.js +175 -0
- package/dist/protocol/acp-helpers.js.map +1 -0
- package/dist/protocol/acp.d.ts +2 -27
- package/dist/protocol/acp.d.ts.map +1 -1
- package/dist/protocol/acp.js +7 -170
- package/dist/protocol/acp.js.map +1 -1
- package/dist/types.d.ts +32 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +13 -2
- package/src/adapters/1688/item.yaml +1 -0
- package/src/adapters/1688/store.yaml +1 -0
- package/src/adapters/36kr/article.yaml +1 -0
- package/src/adapters/amazon/bestsellers.yaml +2 -0
- package/src/adapters/amazon/movers-shakers.yaml +2 -0
- package/src/adapters/amazon/new-releases.yaml +2 -0
- package/src/adapters/amazon/rankings.yaml +1 -0
- package/src/adapters/apple-podcasts/episodes.yaml +1 -0
- package/src/adapters/arxiv/paper.yaml +1 -0
- package/src/adapters/audacity/convert.yaml +1 -0
- package/src/adapters/audacity/effects.yaml +1 -0
- package/src/adapters/audacity/info.yaml +1 -0
- package/src/adapters/audacity/mix.yaml +1 -0
- package/src/adapters/audacity/normalize.yaml +1 -0
- package/src/adapters/audacity/spectrogram.yaml +1 -0
- package/src/adapters/audacity/split-channels.yaml +1 -0
- package/src/adapters/audacity/trim.yaml +1 -0
- package/src/adapters/bilibili/favorites.yaml +1 -0
- package/src/adapters/blender/animation.yaml +2 -0
- package/src/adapters/blender/camera.yaml +1 -0
- package/src/adapters/blender/convert.yaml +1 -0
- package/src/adapters/blender/export.yaml +1 -0
- package/src/adapters/blender/import.yaml +1 -0
- package/src/adapters/blender/info.yaml +1 -0
- package/src/adapters/blender/lighting.yaml +1 -0
- package/src/adapters/blender/materials.yaml +1 -0
- package/src/adapters/blender/objects.yaml +1 -0
- package/src/adapters/blender/render.yaml +2 -0
- package/src/adapters/blender/scene.yaml +1 -0
- package/src/adapters/blender/screenshot.yaml +2 -0
- package/src/adapters/blender/script.yaml +1 -0
- package/src/adapters/boss/detail.yaml +2 -0
- package/src/adapters/cloudcompare/info.yaml +1 -0
- package/src/adapters/coupang/add-to-cart.yaml +1 -0
- package/src/adapters/ctrip/search.yaml +1 -0
- package/src/adapters/douban/download.yaml +1 -0
- package/src/adapters/douban/photos.yaml +1 -0
- package/src/adapters/douban/subject.yaml +2 -0
- package/src/adapters/doubao-web/detail.yaml +1 -0
- package/src/adapters/doubao-web/meeting-summary.yaml +1 -0
- package/src/adapters/doubao-web/meeting-transcript.yaml +1 -0
- package/src/adapters/drawio/export.yaml +2 -0
- package/src/adapters/facebook/join-group.yaml +2 -0
- package/src/adapters/ffmpeg/compress.yaml +2 -0
- package/src/adapters/ffmpeg/concat.yaml +1 -0
- package/src/adapters/ffmpeg/convert.yaml +1 -0
- package/src/adapters/ffmpeg/extract-audio.yaml +2 -0
- package/src/adapters/ffmpeg/gif.yaml +2 -0
- package/src/adapters/ffmpeg/normalize.yaml +2 -0
- package/src/adapters/ffmpeg/probe.yaml +1 -0
- package/src/adapters/ffmpeg/resize.yaml +2 -0
- package/src/adapters/ffmpeg/subtitles.yaml +2 -0
- package/src/adapters/ffmpeg/thumbnail.yaml +2 -0
- package/src/adapters/ffmpeg/trim.yaml +2 -0
- package/src/adapters/freecad/assembly.yaml +1 -0
- package/src/adapters/freecad/bom.yaml +1 -0
- package/src/adapters/freecad/boolean.yaml +1 -0
- package/src/adapters/freecad/check.yaml +1 -0
- package/src/adapters/freecad/convert.yaml +1 -0
- package/src/adapters/freecad/export-stl.yaml +1 -0
- package/src/adapters/freecad/import.yaml +1 -0
- package/src/adapters/freecad/info.yaml +1 -0
- package/src/adapters/freecad/macro.yaml +1 -0
- package/src/adapters/freecad/measure.yaml +1 -0
- package/src/adapters/freecad/mesh.yaml +1 -0
- package/src/adapters/freecad/properties.yaml +1 -0
- package/src/adapters/freecad/render.yaml +1 -0
- package/src/adapters/freecad/section.yaml +1 -0
- package/src/adapters/freecad/sketch.yaml +1 -0
- package/src/adapters/gimp/adjust.yaml +1 -0
- package/src/adapters/gimp/batch.yaml +1 -0
- package/src/adapters/gimp/convert.yaml +1 -0
- package/src/adapters/gimp/crop.yaml +1 -0
- package/src/adapters/gimp/filter.yaml +1 -0
- package/src/adapters/gimp/flip.yaml +1 -0
- package/src/adapters/gimp/info.yaml +1 -0
- package/src/adapters/gimp/layers.yaml +1 -0
- package/src/adapters/gimp/merge-layers.yaml +1 -0
- package/src/adapters/gimp/resize.yaml +1 -0
- package/src/adapters/gimp/rotate.yaml +1 -0
- package/src/adapters/gimp/text.yaml +1 -0
- package/src/adapters/godot/scene-export.yaml +1 -0
- package/src/adapters/hackernews/comments.yaml +1 -0
- package/src/adapters/hackernews/item.yaml +1 -0
- package/src/adapters/hf/top.yaml +1 -0
- package/src/adapters/imagemagick/composite.yaml +1 -0
- package/src/adapters/imagemagick/convert.yaml +1 -0
- package/src/adapters/imagemagick/identify.yaml +1 -0
- package/src/adapters/imagemagick/montage.yaml +1 -0
- package/src/adapters/imagemagick/resize.yaml +1 -0
- package/src/adapters/imdb/person.yaml +1 -0
- package/src/adapters/imdb/reviews.yaml +1 -0
- package/src/adapters/imdb/title.yaml +1 -0
- package/src/adapters/inkscape/convert.yaml +2 -0
- package/src/adapters/inkscape/export.yaml +2 -0
- package/src/adapters/inkscape/optimize.yaml +2 -0
- package/src/adapters/instagram/stories.yaml +1 -0
- package/src/adapters/jd/item.yaml +1 -0
- package/src/adapters/jike/post.yaml +2 -0
- package/src/adapters/jike/topic.yaml +2 -0
- package/src/adapters/kdenlive/info.yaml +1 -0
- package/src/adapters/kdenlive/render.yaml +1 -0
- package/src/adapters/krita/batch.yaml +1 -0
- package/src/adapters/krita/convert.yaml +1 -0
- package/src/adapters/krita/export.yaml +1 -0
- package/src/adapters/krita/info.yaml +1 -0
- package/src/adapters/libreoffice/convert.yaml +1 -0
- package/src/adapters/libreoffice/print.yaml +1 -0
- package/src/adapters/linear/issue-update.yaml +1 -0
- package/src/adapters/linux-do/category.yaml +1 -0
- package/src/adapters/linux-do/topic.yaml +1 -0
- package/src/adapters/macos/calendar-create.yaml +1 -0
- package/src/adapters/macos/finder-copy.yaml +1 -0
- package/src/adapters/macos/finder-move.yaml +1 -0
- package/src/adapters/macos/finder-new-folder.yaml +1 -0
- package/src/adapters/macos/finder-tags.yaml +1 -0
- package/src/adapters/macos/open.yaml +2 -0
- package/src/adapters/macos/screen-recording.yaml +1 -0
- package/src/adapters/macos/screenshot.yaml +1 -0
- package/src/adapters/macos/spotlight.yaml +1 -0
- package/src/adapters/macos/wallpaper.yaml +1 -0
- package/src/adapters/medium/article.yaml +1 -0
- package/src/adapters/mermaid/render.yaml +1 -0
- package/src/adapters/minimax/tts.yaml +1 -0
- package/src/adapters/motion-studio/component-get.yaml +1 -0
- package/src/adapters/musescore/convert.yaml +2 -0
- package/src/adapters/musescore/export.yaml +2 -0
- package/src/adapters/musescore/info.yaml +1 -0
- package/src/adapters/musescore/instruments.yaml +1 -0
- package/src/adapters/musescore/transpose.yaml +1 -0
- package/src/adapters/netease-music/playlist.yaml +1 -0
- package/src/adapters/netease-music/top.yaml +1 -0
- package/src/adapters/notebooklm/get.yaml +1 -0
- package/src/adapters/notebooklm/history.yaml +1 -0
- package/src/adapters/notebooklm/note-list.yaml +1 -0
- package/src/adapters/notebooklm/notes-get.yaml +1 -0
- package/src/adapters/notebooklm/open.yaml +1 -0
- package/src/adapters/notebooklm/source-fulltext.yaml +1 -0
- package/src/adapters/notebooklm/source-get.yaml +1 -0
- package/src/adapters/notebooklm/source-guide.yaml +1 -0
- package/src/adapters/notebooklm/source-list.yaml +1 -0
- package/src/adapters/notebooklm/summary.yaml +1 -0
- package/src/adapters/novita/status.yaml +1 -0
- package/src/adapters/obs/screenshot.yaml +1 -0
- package/src/adapters/obsidian/open.yaml +1 -0
- package/src/adapters/ones/login.yaml +1 -0
- package/src/adapters/ones/task.yaml +1 -0
- package/src/adapters/pandoc/convert.yaml +1 -0
- package/src/adapters/paperreview/feedback.yaml +2 -0
- package/src/adapters/paperreview/review.yaml +2 -0
- package/src/adapters/paperreview/submit.yaml +2 -0
- package/src/adapters/pixiv/detail.yaml +1 -0
- package/src/adapters/pixiv/download.yaml +2 -0
- package/src/adapters/quark/ls.yaml +1 -0
- package/src/adapters/reddit/comments.yaml +2 -0
- package/src/adapters/renderdoc/capture-list.yaml +1 -0
- package/src/adapters/renderdoc/frame-export.yaml +1 -0
- package/src/adapters/reuters/article.yaml +2 -0
- package/src/adapters/shotcut/info.yaml +1 -0
- package/src/adapters/shotcut/render.yaml +1 -0
- package/src/adapters/sinablog/article.yaml +1 -0
- package/src/adapters/sinablog/user.yaml +1 -0
- package/src/adapters/sketch/artboards.yaml +1 -0
- package/src/adapters/sketch/export.yaml +1 -0
- package/src/adapters/sketch/symbols.yaml +1 -0
- package/src/adapters/smzdm/article.yaml +1 -0
- package/src/adapters/stackoverflow/question.yaml +1 -0
- package/src/adapters/stagehand/wrap-observe.yaml +1 -0
- package/src/adapters/steam/wishlist.yaml +1 -0
- package/src/adapters/tieba/read.yaml +1 -0
- package/src/adapters/tiktok/comment.yaml +1 -0
- package/src/adapters/tiktok/like.yaml +1 -0
- package/src/adapters/tiktok/save.yaml +1 -0
- package/src/adapters/tiktok/unlike.yaml +1 -0
- package/src/adapters/tiktok/unsave.yaml +1 -0
- package/src/adapters/twitch/streams.yaml +1 -0
- package/src/adapters/twitter/quotes.yaml +2 -0
- package/src/adapters/twitter/retweets.yaml +1 -0
- package/src/adapters/v2ex/replies.yaml +1 -0
- package/src/adapters/v2ex/topic.yaml +1 -0
- package/src/adapters/vscode/install-ext.yaml +1 -0
- package/src/adapters/vscode/open.yaml +1 -0
- package/src/adapters/web/read.yaml +1 -0
- package/src/adapters/weibo/comments.yaml +1 -0
- package/src/adapters/weibo/post.yaml +1 -0
- package/src/adapters/weixin/download.yaml +1 -0
- package/src/adapters/wiremock/create-stub.yaml +2 -0
- package/src/adapters/wiremock/delete-stub.yaml +1 -0
- package/src/adapters/wiremock/verify.yaml +1 -0
- package/src/adapters/xianyu/item.yaml +1 -0
- package/src/adapters/xiaoe/catalog.yaml +1 -0
- package/src/adapters/xiaoe/content.yaml +1 -0
- package/src/adapters/xiaoe/detail.yaml +1 -0
- package/src/adapters/xiaoe/play-url.yaml +1 -0
- package/src/adapters/xiaoyuzhou/podcast.yaml +2 -0
- package/src/adapters/yollomi/edit.yaml +2 -0
- package/src/adapters/yollomi/remove-bg.yaml +2 -0
- package/src/adapters/yollomi/restore.yaml +2 -0
- package/src/adapters/yollomi/upload.yaml +2 -0
- package/src/adapters/yollomi/upscale.yaml +2 -0
- package/src/adapters/youtube/playlist.yaml +1 -0
- package/src/adapters/yt-dlp/download.yaml +2 -0
- package/src/adapters/yt-dlp/extract-audio.yaml +2 -0
- package/src/adapters/yt-dlp/info.yaml +1 -0
- package/src/adapters/zhihu/answer.yaml +1 -0
- package/src/adapters/zhihu/answers.yaml +2 -0
- package/src/adapters/zhihu/article.yaml +1 -0
- package/src/adapters/zhihu/articles.yaml +2 -0
- package/src/adapters/zhihu/collections.yaml +2 -0
- package/src/adapters/zhihu/columns.yaml +2 -0
- package/src/adapters/zhihu/comment.yaml +1 -0
- package/src/adapters/zhihu/download.yaml +1 -0
- package/src/adapters/zhihu/followers.yaml +2 -0
- package/src/adapters/zhihu/following.yaml +2 -0
- package/src/adapters/zhihu/pins.yaml +2 -0
- package/src/adapters/zhihu/question.yaml +1 -0
- package/src/adapters/zhihu/topic.yaml +1 -0
- package/src/adapters/zhihu/topics.yaml +1 -0
- package/src/adapters/zhihu/user.yaml +2 -0
- package/src/adapters/zoom/join.yaml +1 -0
- package/src/adapters/zsxq/search.yaml +1 -0
- package/src/adapters/zsxq/topic.yaml +1 -0
- package/src/adapters/zsxq/topics.yaml +1 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-native ArgBag resolver — externalizes argument state out of shell
|
|
3
|
+
* quoting (a TC0-bounded mod-2 matching problem that Transformers struggle
|
|
4
|
+
* to generate correctly) into JSON channels (stdin / file) where state is
|
|
5
|
+
* carried by byte structure and needs no nested escape tracking.
|
|
6
|
+
*
|
|
7
|
+
* Precedence (highest wins when the same key appears in multiple sources):
|
|
8
|
+
* stdin-JSON > --args-file > shell flags > positional args > defaults
|
|
9
|
+
*
|
|
10
|
+
* Stdin auto-detect: when stdout is non-TTY AND the first byte of stdin is
|
|
11
|
+
* `{` or `[`, the stream is consumed and JSON-parsed. A trailing `-`
|
|
12
|
+
* positional also triggers stdin consumption explicitly.
|
|
13
|
+
*
|
|
14
|
+
* See `.claude/plans/sessions/2026-04-18-v213.2-tc0/task_plan.md` §2 for
|
|
15
|
+
* the quantitative hypothesis this module tests.
|
|
16
|
+
*/
|
|
17
|
+
import type { AdapterArg } from "../types.js";
|
|
18
|
+
export type ArgSource = "shell" | "file" | "stdin" | "mixed" | "mcp" | "acp" | "internal";
|
|
19
|
+
export interface ResolvedArgs {
|
|
20
|
+
args: Record<string, unknown>;
|
|
21
|
+
source: ArgSource;
|
|
22
|
+
/** Raw stdin body, retained for debugging when `--dry-run` prints the plan. */
|
|
23
|
+
stdinRaw?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ResolveOptions {
|
|
26
|
+
/** Commander option bag (flag values). */
|
|
27
|
+
opts: Record<string, unknown>;
|
|
28
|
+
/** Positional CLI args in declaration order. */
|
|
29
|
+
positionals: string[];
|
|
30
|
+
/** Adapter's declared arg schema — used for naming, types, defaults. */
|
|
31
|
+
schema: AdapterArg[];
|
|
32
|
+
/** Explicit path from `--args-file`. */
|
|
33
|
+
argsFile?: string;
|
|
34
|
+
/** Stdin body, if caller has already read it. Undefined means read lazily. */
|
|
35
|
+
stdinBody?: string;
|
|
36
|
+
/** Override stdin TTY detection (for tests). */
|
|
37
|
+
stdinIsTTY?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Synchronously read all of stdin when data is available. Returns
|
|
41
|
+
* undefined when:
|
|
42
|
+
* - stdin is an interactive TTY, OR
|
|
43
|
+
* - stdin is an open-empty pipe (no data and not closed), OR
|
|
44
|
+
* - stdin is /dev/null, OR
|
|
45
|
+
* - any read error.
|
|
46
|
+
*
|
|
47
|
+
* Uses `/dev/stdin` with O_NONBLOCK on POSIX so empty pipes fail fast
|
|
48
|
+
* with EAGAIN rather than blocking forever (critical for subprocess
|
|
49
|
+
* tests that spawn unicli with no stdin input). Windows (no /dev/stdin)
|
|
50
|
+
* falls through to the blocking path — agents on Windows should pass
|
|
51
|
+
* `-` explicitly to opt into reading stdin.
|
|
52
|
+
*/
|
|
53
|
+
export declare function readStdinSync(stdinIsTTY?: boolean): string | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* Read and parse an --args-file. Path is read synchronously. JSON only —
|
|
56
|
+
* YAML/TOML are deliberately excluded (D2: minimize format ambiguity).
|
|
57
|
+
*/
|
|
58
|
+
export declare function readArgsFile(path: string): Record<string, unknown>;
|
|
59
|
+
/**
|
|
60
|
+
* Normalize a caller-supplied `limit` into a non-negative integer. Shared by
|
|
61
|
+
* every surface (CLI/MCP/ACP) so the same input produces the same ArgBag
|
|
62
|
+
* regardless of transport — the parity tests depend on this.
|
|
63
|
+
*
|
|
64
|
+
* Rules: parse as integer; accept finite values ≥ 0 (0 means "no limit" and
|
|
65
|
+
* is passed through to adapters that honor it); anything else (NaN, negative,
|
|
66
|
+
* non-numeric string, null) falls back to `fallback`. `undefined` is returned
|
|
67
|
+
* as-is so callers can distinguish "not provided" from "provided but invalid".
|
|
68
|
+
*/
|
|
69
|
+
export declare function coerceLimit(value: unknown, fallback?: number): number | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* The single entry point for argument resolution. Callers (currently
|
|
72
|
+
* dispatch.ts; soon every command surface) hand over the Commander-parsed
|
|
73
|
+
* state and receive a typed ArgBag with its provenance recorded.
|
|
74
|
+
*
|
|
75
|
+
* Precedence when the same key appears in multiple sources:
|
|
76
|
+
* stdin > args-file > shell flags > positional args > defaults
|
|
77
|
+
*
|
|
78
|
+
* Keys present in JSON sources but NOT in the adapter schema are passed
|
|
79
|
+
* through — YAML adapters frequently reference `${{ args.foo }}` for
|
|
80
|
+
* fields that are declared only via defaulting inside templates.
|
|
81
|
+
*/
|
|
82
|
+
export declare function resolveArgs(options: ResolveOptions): ResolvedArgs;
|
|
83
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/engine/args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AASH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,MAAM,GACN,OAAO,GACP,OAAO,GACP,KAAK,GACL,KAAK,GACL,UAAU,CAAC;AAEf,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,SAAS,CAAC;IAClB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,gDAAgD;IAChD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,wEAAwE;IACxE,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,UAAU,GAAE,OAAsC,GACjD,MAAM,GAAG,SAAS,CAsEpB;AAyBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASlE;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAK,GAAG,MAAM,GAAG,SAAS,CAU7E;AA+DD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,CA4CjE"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-native ArgBag resolver — externalizes argument state out of shell
|
|
3
|
+
* quoting (a TC0-bounded mod-2 matching problem that Transformers struggle
|
|
4
|
+
* to generate correctly) into JSON channels (stdin / file) where state is
|
|
5
|
+
* carried by byte structure and needs no nested escape tracking.
|
|
6
|
+
*
|
|
7
|
+
* Precedence (highest wins when the same key appears in multiple sources):
|
|
8
|
+
* stdin-JSON > --args-file > shell flags > positional args > defaults
|
|
9
|
+
*
|
|
10
|
+
* Stdin auto-detect: when stdout is non-TTY AND the first byte of stdin is
|
|
11
|
+
* `{` or `[`, the stream is consumed and JSON-parsed. A trailing `-`
|
|
12
|
+
* positional also triggers stdin consumption explicitly.
|
|
13
|
+
*
|
|
14
|
+
* See `.claude/plans/sessions/2026-04-18-v213.2-tc0/task_plan.md` §2 for
|
|
15
|
+
* the quantitative hypothesis this module tests.
|
|
16
|
+
*/
|
|
17
|
+
import { readFileSync, readSync, openSync, closeSync, constants, } from "node:fs";
|
|
18
|
+
/**
|
|
19
|
+
* Synchronously read all of stdin when data is available. Returns
|
|
20
|
+
* undefined when:
|
|
21
|
+
* - stdin is an interactive TTY, OR
|
|
22
|
+
* - stdin is an open-empty pipe (no data and not closed), OR
|
|
23
|
+
* - stdin is /dev/null, OR
|
|
24
|
+
* - any read error.
|
|
25
|
+
*
|
|
26
|
+
* Uses `/dev/stdin` with O_NONBLOCK on POSIX so empty pipes fail fast
|
|
27
|
+
* with EAGAIN rather than blocking forever (critical for subprocess
|
|
28
|
+
* tests that spawn unicli with no stdin input). Windows (no /dev/stdin)
|
|
29
|
+
* falls through to the blocking path — agents on Windows should pass
|
|
30
|
+
* `-` explicitly to opt into reading stdin.
|
|
31
|
+
*/
|
|
32
|
+
export function readStdinSync(stdinIsTTY = process.stdin.isTTY === true) {
|
|
33
|
+
if (stdinIsTTY)
|
|
34
|
+
return undefined;
|
|
35
|
+
const chunks = [];
|
|
36
|
+
const buf = Buffer.alloc(65536);
|
|
37
|
+
// Try the non-blocking POSIX path first.
|
|
38
|
+
let nbFd;
|
|
39
|
+
try {
|
|
40
|
+
nbFd = openSync("/dev/stdin", constants.O_RDONLY | (constants.O_NONBLOCK ?? 0));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
nbFd = undefined;
|
|
44
|
+
}
|
|
45
|
+
if (nbFd !== undefined) {
|
|
46
|
+
try {
|
|
47
|
+
let keep = true;
|
|
48
|
+
while (keep) {
|
|
49
|
+
let read = 0;
|
|
50
|
+
try {
|
|
51
|
+
read = readSync(nbFd, buf, 0, buf.length, null);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
// EAGAIN / EWOULDBLOCK — no data available right now.
|
|
55
|
+
const code = err.code ?? "";
|
|
56
|
+
if (code === "EAGAIN" || code === "EWOULDBLOCK") {
|
|
57
|
+
keep = false;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
keep = false;
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
if (read <= 0) {
|
|
64
|
+
keep = false;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
chunks.push(Buffer.from(buf.subarray(0, read)));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
try {
|
|
72
|
+
closeSync(nbFd);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
/* ignore */
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const body = Buffer.concat(chunks).toString("utf-8").trim();
|
|
79
|
+
return body.length > 0 ? body : undefined;
|
|
80
|
+
}
|
|
81
|
+
// Fallback: blocking path (may hang on open-empty pipes — only reachable
|
|
82
|
+
// when /dev/stdin is unavailable, e.g. Windows).
|
|
83
|
+
let reading = true;
|
|
84
|
+
while (reading) {
|
|
85
|
+
let read = 0;
|
|
86
|
+
try {
|
|
87
|
+
read = readSync(0, buf, 0, buf.length, null);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
reading = false;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
if (read <= 0) {
|
|
94
|
+
reading = false;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
chunks.push(Buffer.from(buf.subarray(0, read)));
|
|
98
|
+
}
|
|
99
|
+
const body = Buffer.concat(chunks).toString("utf-8").trim();
|
|
100
|
+
return body.length > 0 ? body : undefined;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Parse a JSON document from `body` that must be a plain object (`{…}`).
|
|
104
|
+
* Throws on array / scalar / parse error so callers get a clean usage error.
|
|
105
|
+
*/
|
|
106
|
+
function parseJsonObject(body, origin) {
|
|
107
|
+
let parsed;
|
|
108
|
+
try {
|
|
109
|
+
parsed = JSON.parse(body);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
113
|
+
throw new Error(`invalid JSON from ${origin}: ${msg}`);
|
|
114
|
+
}
|
|
115
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
116
|
+
throw new Error(`${origin} must be a JSON object (received ${Array.isArray(parsed) ? "array" : typeof parsed})`);
|
|
117
|
+
}
|
|
118
|
+
return parsed;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Read and parse an --args-file. Path is read synchronously. JSON only —
|
|
122
|
+
* YAML/TOML are deliberately excluded (D2: minimize format ambiguity).
|
|
123
|
+
*/
|
|
124
|
+
export function readArgsFile(path) {
|
|
125
|
+
let body;
|
|
126
|
+
try {
|
|
127
|
+
body = readFileSync(path, "utf-8");
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
131
|
+
throw new Error(`cannot read --args-file ${path}: ${msg}`);
|
|
132
|
+
}
|
|
133
|
+
return parseJsonObject(body, `--args-file ${path}`);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Normalize a caller-supplied `limit` into a non-negative integer. Shared by
|
|
137
|
+
* every surface (CLI/MCP/ACP) so the same input produces the same ArgBag
|
|
138
|
+
* regardless of transport — the parity tests depend on this.
|
|
139
|
+
*
|
|
140
|
+
* Rules: parse as integer; accept finite values ≥ 0 (0 means "no limit" and
|
|
141
|
+
* is passed through to adapters that honor it); anything else (NaN, negative,
|
|
142
|
+
* non-numeric string, null) falls back to `fallback`. `undefined` is returned
|
|
143
|
+
* as-is so callers can distinguish "not provided" from "provided but invalid".
|
|
144
|
+
*/
|
|
145
|
+
export function coerceLimit(value, fallback = 20) {
|
|
146
|
+
if (value === undefined)
|
|
147
|
+
return undefined;
|
|
148
|
+
const n = typeof value === "number"
|
|
149
|
+
? value
|
|
150
|
+
: typeof value === "string"
|
|
151
|
+
? Number.parseInt(value, 10)
|
|
152
|
+
: Number.NaN;
|
|
153
|
+
if (!Number.isFinite(n) || n < 0)
|
|
154
|
+
return fallback;
|
|
155
|
+
return Math.trunc(n);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Coerce a shell-provided string into the type declared on the adapter arg.
|
|
159
|
+
* Mirrors the inline coercion previously buried in dispatch.ts so every
|
|
160
|
+
* resolver path goes through the same rules.
|
|
161
|
+
*/
|
|
162
|
+
function coerce(value, type) {
|
|
163
|
+
switch (type) {
|
|
164
|
+
case "int":
|
|
165
|
+
return Number.parseInt(value, 10);
|
|
166
|
+
case "float":
|
|
167
|
+
return Number.parseFloat(value);
|
|
168
|
+
case "bool":
|
|
169
|
+
return value === "true" || value === "1" || value === "yes";
|
|
170
|
+
default:
|
|
171
|
+
return value;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Merge shell-derived args (opts + positionals) into an ArgBag using the
|
|
176
|
+
* adapter schema for naming, coercion, and defaults.
|
|
177
|
+
*/
|
|
178
|
+
function mergeShellArgs(opts, positionals, schema) {
|
|
179
|
+
const out = {};
|
|
180
|
+
let posIdx = 0;
|
|
181
|
+
for (const arg of schema) {
|
|
182
|
+
if (arg.positional) {
|
|
183
|
+
if (posIdx < positionals.length) {
|
|
184
|
+
out[arg.name] = coerce(positionals[posIdx++], arg.type);
|
|
185
|
+
}
|
|
186
|
+
else if (arg.default !== undefined) {
|
|
187
|
+
out[arg.name] = arg.default;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
for (const arg of schema) {
|
|
192
|
+
if (arg.positional)
|
|
193
|
+
continue;
|
|
194
|
+
const raw = opts[arg.name];
|
|
195
|
+
if (raw !== undefined && raw !== null) {
|
|
196
|
+
out[arg.name] = typeof raw === "string" ? coerce(raw, arg.type) : raw;
|
|
197
|
+
}
|
|
198
|
+
else if (arg.default !== undefined) {
|
|
199
|
+
out[arg.name] = arg.default;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Pass through `limit` and any non-schema opts so existing adapters keep
|
|
203
|
+
// working while the schema evolves.
|
|
204
|
+
for (const key of Object.keys(opts)) {
|
|
205
|
+
if (out[key] === undefined && opts[key] !== undefined) {
|
|
206
|
+
out[key] = opts[key];
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return out;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* The single entry point for argument resolution. Callers (currently
|
|
213
|
+
* dispatch.ts; soon every command surface) hand over the Commander-parsed
|
|
214
|
+
* state and receive a typed ArgBag with its provenance recorded.
|
|
215
|
+
*
|
|
216
|
+
* Precedence when the same key appears in multiple sources:
|
|
217
|
+
* stdin > args-file > shell flags > positional args > defaults
|
|
218
|
+
*
|
|
219
|
+
* Keys present in JSON sources but NOT in the adapter schema are passed
|
|
220
|
+
* through — YAML adapters frequently reference `${{ args.foo }}` for
|
|
221
|
+
* fields that are declared only via defaulting inside templates.
|
|
222
|
+
*/
|
|
223
|
+
export function resolveArgs(options) {
|
|
224
|
+
const { opts, positionals, schema, argsFile, stdinBody, stdinIsTTY } = options;
|
|
225
|
+
const sources = [];
|
|
226
|
+
const hasShellInput = positionals.length > 0 || Object.keys(opts).length > 0;
|
|
227
|
+
let merged = mergeShellArgs(opts, positionals, schema);
|
|
228
|
+
if (hasShellInput)
|
|
229
|
+
sources.push("shell");
|
|
230
|
+
if (argsFile) {
|
|
231
|
+
const fromFile = readArgsFile(argsFile);
|
|
232
|
+
merged = { ...merged, ...fromFile };
|
|
233
|
+
sources.push("file");
|
|
234
|
+
}
|
|
235
|
+
// Stdin — either already provided by caller or auto-detected.
|
|
236
|
+
const explicitStdin = positionals.includes("-");
|
|
237
|
+
let stdinRaw = stdinBody;
|
|
238
|
+
if (stdinRaw === undefined) {
|
|
239
|
+
stdinRaw = readStdinSync(stdinIsTTY);
|
|
240
|
+
}
|
|
241
|
+
const trimmed = (stdinRaw ?? "").trim();
|
|
242
|
+
if (trimmed.length > 0) {
|
|
243
|
+
const looksJson = trimmed.startsWith("{") || (explicitStdin && trimmed.startsWith("["));
|
|
244
|
+
if (looksJson) {
|
|
245
|
+
const fromStdin = parseJsonObject(trimmed, "stdin");
|
|
246
|
+
merged = { ...merged, ...fromStdin };
|
|
247
|
+
sources.push("stdin");
|
|
248
|
+
}
|
|
249
|
+
else if (explicitStdin) {
|
|
250
|
+
throw new Error("stdin was requested but body does not start with '{' — JSON object required");
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
const source = sources.length === 0
|
|
254
|
+
? "shell"
|
|
255
|
+
: sources.length === 1
|
|
256
|
+
? sources[0]
|
|
257
|
+
: "mixed";
|
|
258
|
+
return { args: merged, source, stdinRaw };
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/engine/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,12 +13,25 @@
|
|
|
13
13
|
import type { PipelineStep } from "../types.js";
|
|
14
14
|
import type { BrowserPage } from "../browser/page.js";
|
|
15
15
|
import { getBus, buildTransportCtx, _resetTransportBusForTests } from "../transport/bus.js";
|
|
16
|
+
import type { ArgSource, ResolvedArgs } from "./args.js";
|
|
16
17
|
import "./steps/index.js";
|
|
17
18
|
export { assertSafeRequestUrl } from "./ssrf.js";
|
|
18
19
|
export { getBus, buildTransportCtx, _resetTransportBusForTests };
|
|
19
20
|
export interface PipelineOptions {
|
|
20
21
|
site?: string;
|
|
21
22
|
strategy?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Kernel surface that dispatched the pipeline. When provided, becomes
|
|
25
|
+
* `${{ surface }}` in YAML templates. Undefined for legacy callers
|
|
26
|
+
* (dev/health/skills) — those set `source: "internal"` on the bag.
|
|
27
|
+
*/
|
|
28
|
+
surface?: "cli" | "mcp" | "acp" | "bench" | "hub";
|
|
29
|
+
/**
|
|
30
|
+
* ULID trace ID from the kernel. Exposed as `${{ trace_id }}` in YAML
|
|
31
|
+
* templates so adapters can correlate logs across surfaces. Undefined
|
|
32
|
+
* for callers that do not route through the kernel.
|
|
33
|
+
*/
|
|
34
|
+
trace_id?: string;
|
|
22
35
|
}
|
|
23
36
|
export type PipelineContext = {
|
|
24
37
|
data: unknown;
|
|
@@ -29,6 +42,12 @@ export type PipelineContext = {
|
|
|
29
42
|
temp?: Record<string, string>;
|
|
30
43
|
tempDir?: string;
|
|
31
44
|
page?: BrowserPage;
|
|
45
|
+
/** Provenance of `args` — seeded from `ResolvedArgs.source`. */
|
|
46
|
+
source?: ArgSource;
|
|
47
|
+
/** Surface that dispatched this pipeline. Mirrors `PipelineOptions.surface`. */
|
|
48
|
+
surface?: "cli" | "mcp" | "acp" | "bench" | "hub";
|
|
49
|
+
/** Kernel trace ID. Mirrors `PipelineOptions.trace_id`. */
|
|
50
|
+
trace_id?: string;
|
|
32
51
|
};
|
|
33
52
|
/** Structured pipeline error — designed for AI agent consumption. */
|
|
34
53
|
export declare class PipelineError extends Error {
|
|
@@ -73,5 +92,5 @@ export declare class PipelineError extends Error {
|
|
|
73
92
|
}
|
|
74
93
|
export declare function getActionEntry(step: PipelineStep): [string, unknown];
|
|
75
94
|
export declare function executeStep(ctx: PipelineContext, action: string, config: unknown, stepIndex: number, fullStep?: PipelineStep, depth?: number): Promise<PipelineContext>;
|
|
76
|
-
export declare function runPipeline(steps: PipelineStep[],
|
|
95
|
+
export declare function runPipeline(steps: PipelineStep[], bag: ResolvedArgs, base?: string, options?: PipelineOptions): Promise<unknown[]>;
|
|
77
96
|
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/engine/executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAStD,OAAO,EACL,MAAM,EACN,iBAAiB,EACjB,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/engine/executor.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/executor.js
CHANGED
|
@@ -97,7 +97,7 @@ async function dispatchBusStep(ctx, action, config) {
|
|
|
97
97
|
ctx.vars["lastEnvelope"] = envelope;
|
|
98
98
|
return { ...ctx, data: envelope.ok ? envelope.data : envelope };
|
|
99
99
|
}
|
|
100
|
-
export async function runPipeline(steps,
|
|
100
|
+
export async function runPipeline(steps, bag, base, options) {
|
|
101
101
|
const rt = await import("./runtime.js");
|
|
102
102
|
let cookieHeader;
|
|
103
103
|
if ((options?.strategy === "cookie" || options?.strategy === "header") &&
|
|
@@ -116,7 +116,16 @@ export async function runPipeline(steps, args, base, options) {
|
|
|
116
116
|
}
|
|
117
117
|
cookieHeader = formatCookieHeader(cookies);
|
|
118
118
|
}
|
|
119
|
-
let ctx = {
|
|
119
|
+
let ctx = {
|
|
120
|
+
data: null,
|
|
121
|
+
args: bag.args,
|
|
122
|
+
vars: {},
|
|
123
|
+
base,
|
|
124
|
+
cookieHeader,
|
|
125
|
+
source: bag.source,
|
|
126
|
+
surface: options?.surface,
|
|
127
|
+
trace_id: options?.trace_id,
|
|
128
|
+
};
|
|
120
129
|
let tempDir;
|
|
121
130
|
try {
|
|
122
131
|
for (let i = 0; i < steps.length; i++) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/engine/executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAoB,MAAM,gBAAgB,CAAC;AACrE,OAAO,EACL,wBAAwB,GAEzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,MAAM,EACN,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/engine/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input hardening — agents hallucinate differently from humans. A typo
|
|
3
|
+
* like `../../../.ssh` is near-impossible for a person but routine for an
|
|
4
|
+
* LLM confusing path segments. This module validates the resolved ArgBag
|
|
5
|
+
* against the schema the adapter *declares*, not regex heuristics on arg
|
|
6
|
+
* names (v0.213.3: D5 locked — no fallback to `looksLike*`).
|
|
7
|
+
*
|
|
8
|
+
* Dispatch order for each string arg:
|
|
9
|
+
* 1. Always-on: ASCII control-char check (below 0x20, except \t\n\r)
|
|
10
|
+
* 2. `format: "uri"` (+ the other draft-2020-12 standard formats)
|
|
11
|
+
* → ajv format-assertion — fails closed
|
|
12
|
+
* 3. `x-unicli-kind: "path"` → validatePathArg (traversal + NUL + sandbox)
|
|
13
|
+
* 4. `x-unicli-kind: "adapter-ref"` → `<site>/<command>` regex
|
|
14
|
+
* 5. `x-unicli-kind: "selector"` → reject `<script` or unescaped backtick
|
|
15
|
+
* 6. `x-unicli-kind: "shell-safe"` → reject `$` `` ` `` `;` `|` `&` `>`
|
|
16
|
+
* 7. `x-unicli-kind: "id"` → reject URL punctuation (`?` `#`) and
|
|
17
|
+
* percent-escapes; IDs are bare tokens
|
|
18
|
+
* 8. If a kind check fails, `x-unicli-accepts` lists secondary kinds
|
|
19
|
+
* that can salvage the value (dual-accept fallback).
|
|
20
|
+
* 9. No format / kind declared → freeform; only the control-char gate
|
|
21
|
+
* applies (codemod in Phase 4 migrates YAML adapters; unannotated
|
|
22
|
+
* args stay permissive until then).
|
|
23
|
+
*
|
|
24
|
+
* Violations throw `InputHardeningError` with a directional suggestion
|
|
25
|
+
* that completes the self-repair contract (Banach convergence principle).
|
|
26
|
+
*
|
|
27
|
+
* NOTE: kept the `InputHardeningError` class and its `{argName, suggestion}`
|
|
28
|
+
* fields intact — MCP/ACP surfaces depend on them for `structuredContent`.
|
|
29
|
+
*/
|
|
30
|
+
import type { AdapterArg } from "../types.js";
|
|
31
|
+
export declare class InputHardeningError extends Error {
|
|
32
|
+
readonly argName: string;
|
|
33
|
+
readonly suggestion: string;
|
|
34
|
+
constructor(message: string, argName: string, suggestion: string);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Validate the resolved ArgBag against the adapter schema. Returns any
|
|
38
|
+
* non-fatal warnings (double-encoded URLs, etc.); throws InputHardeningError
|
|
39
|
+
* for anything unsafe.
|
|
40
|
+
*
|
|
41
|
+
* `argByName` is the Map already built by the invocation kernel. Callers
|
|
42
|
+
* that hold the raw `AdapterArg[]` can pass it directly — the function
|
|
43
|
+
* tolerates either shape via an internal normalisation.
|
|
44
|
+
*/
|
|
45
|
+
export declare function hardenArgs(args: Record<string, unknown>, schemaOrMap: AdapterArg[] | Map<string, AdapterArg>): {
|
|
46
|
+
warnings: string[];
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=harden.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harden.d.ts","sourceRoot":"","sources":["../../src/engine/harden.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,OAAO,EAAE,MAAM;aACf,UAAU,EAAE,MAAM;gBAFlC,OAAO,EAAE,MAAM,EACC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM;CAKrC;AAyRD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,WAAW,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAClD;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CA8ExB"}
|