@zenalexa/unicli 0.220.0 → 0.220.1
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 +10 -19
- package/README.md +17 -11
- package/README.zh-CN.md +17 -11
- package/dist/adapters/anilist/web.d.ts +11 -0
- package/dist/adapters/anilist/web.d.ts.map +1 -0
- package/dist/adapters/anilist/web.js +284 -0
- package/dist/adapters/anilist/web.js.map +1 -0
- package/dist/adapters/bangumi/web.d.ts +14 -0
- package/dist/adapters/bangumi/web.d.ts.map +1 -0
- package/dist/adapters/bangumi/web.js +257 -0
- package/dist/adapters/bangumi/web.js.map +1 -0
- package/dist/adapters/dlsite/web.d.ts +31 -0
- package/dist/adapters/dlsite/web.d.ts.map +1 -0
- package/dist/adapters/dlsite/web.js +455 -0
- package/dist/adapters/dlsite/web.js.map +1 -0
- package/dist/adapters/ehentai/web.d.ts +66 -0
- package/dist/adapters/ehentai/web.d.ts.map +1 -0
- package/dist/adapters/ehentai/web.js +608 -0
- package/dist/adapters/ehentai/web.js.map +1 -0
- package/dist/adapters/jikan/web.d.ts +9 -0
- package/dist/adapters/jikan/web.d.ts.map +1 -0
- package/dist/adapters/jikan/web.js +154 -0
- package/dist/adapters/jikan/web.js.map +1 -0
- package/dist/adapters/kitsu/web.d.ts +9 -0
- package/dist/adapters/kitsu/web.d.ts.map +1 -0
- package/dist/adapters/kitsu/web.js +97 -0
- package/dist/adapters/kitsu/web.js.map +1 -0
- package/dist/adapters/mangadex/web.d.ts +10 -0
- package/dist/adapters/mangadex/web.d.ts.map +1 -0
- package/dist/adapters/mangadex/web.js +188 -0
- package/dist/adapters/mangadex/web.js.map +1 -0
- package/dist/adapters/moegirl/web.d.ts +23 -0
- package/dist/adapters/moegirl/web.d.ts.map +1 -0
- package/dist/adapters/moegirl/web.js +269 -0
- package/dist/adapters/moegirl/web.js.map +1 -0
- package/dist/adapters/safebooru/web.d.ts +10 -0
- package/dist/adapters/safebooru/web.d.ts.map +1 -0
- package/dist/adapters/safebooru/web.js +120 -0
- package/dist/adapters/safebooru/web.js.map +1 -0
- package/dist/adapters/vndb/web.d.ts +10 -0
- package/dist/adapters/vndb/web.d.ts.map +1 -0
- package/dist/adapters/vndb/web.js +321 -0
- package/dist/adapters/vndb/web.js.map +1 -0
- package/dist/agents/codex-pack.d.ts +62 -0
- package/dist/agents/codex-pack.d.ts.map +1 -0
- package/dist/agents/codex-pack.js +163 -0
- package/dist/agents/codex-pack.js.map +1 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +6 -43
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/browser/adapter.d.ts.map +1 -1
- package/dist/commands/browser/adapter.js +17 -3
- package/dist/commands/browser/adapter.js.map +1 -1
- package/dist/commands/describe.d.ts.map +1 -1
- package/dist/commands/describe.js +6 -7
- package/dist/commands/describe.js.map +1 -1
- package/dist/commands/dispatch.d.ts +1 -1
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/dispatch.js +4 -2
- package/dist/commands/dispatch.js.map +1 -1
- package/dist/commands/mcp.d.ts +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +10 -5
- package/dist/commands/mcp.js.map +1 -1
- package/dist/core/command-contract-lint.d.ts +10 -0
- package/dist/core/command-contract-lint.d.ts.map +1 -0
- package/dist/core/command-contract-lint.js +41 -0
- package/dist/core/command-contract-lint.js.map +1 -0
- package/dist/core/command-contract.d.ts +100 -0
- package/dist/core/command-contract.d.ts.map +1 -0
- package/dist/core/command-contract.js +174 -0
- package/dist/core/command-contract.js.map +1 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/discovery/aliases.d.ts +2 -2
- package/dist/discovery/aliases.d.ts.map +1 -1
- package/dist/discovery/aliases.js +464 -6
- package/dist/discovery/aliases.js.map +1 -1
- package/dist/discovery/search.d.ts.map +1 -1
- package/dist/discovery/search.js +147 -2
- package/dist/discovery/search.js.map +1 -1
- package/dist/engine/args.d.ts.map +1 -1
- package/dist/engine/args.js +18 -1
- package/dist/engine/args.js.map +1 -1
- package/dist/engine/artifact-validation.d.ts +29 -0
- package/dist/engine/artifact-validation.d.ts.map +1 -0
- package/dist/engine/artifact-validation.js +211 -0
- package/dist/engine/artifact-validation.js.map +1 -0
- package/dist/engine/browser/diagnostics.d.ts +38 -0
- package/dist/engine/browser/diagnostics.d.ts.map +1 -0
- package/dist/engine/browser/diagnostics.js +40 -0
- package/dist/engine/browser/diagnostics.js.map +1 -0
- package/dist/engine/invoke.d.ts +1 -0
- package/dist/engine/invoke.d.ts.map +1 -1
- package/dist/engine/invoke.js +1 -0
- package/dist/engine/invoke.js.map +1 -1
- package/dist/engine/kernel/errors.d.ts +11 -0
- package/dist/engine/kernel/errors.d.ts.map +1 -0
- package/dist/engine/kernel/errors.js +15 -0
- package/dist/engine/kernel/errors.js.map +1 -0
- package/dist/engine/kernel/execute.d.ts +7 -18
- package/dist/engine/kernel/execute.d.ts.map +1 -1
- package/dist/engine/kernel/execute.js +25 -410
- package/dist/engine/kernel/execute.js.map +1 -1
- package/dist/engine/kernel/stages.d.ts +44 -0
- package/dist/engine/kernel/stages.d.ts.map +1 -0
- package/dist/engine/kernel/stages.js +428 -0
- package/dist/engine/kernel/stages.js.map +1 -0
- package/dist/engine/kernel/types.d.ts +21 -1
- package/dist/engine/kernel/types.d.ts.map +1 -1
- package/dist/engine/steps/download.d.ts +1 -0
- package/dist/engine/steps/download.d.ts.map +1 -1
- package/dist/engine/steps/download.js +10 -6
- package/dist/engine/steps/download.js.map +1 -1
- package/dist/fast-path/render.js +1 -1
- package/dist/fast-path/render.js.map +1 -1
- package/dist/manifest-compact.txt +3 -3
- package/dist/manifest-search.json +1 -1
- package/dist/manifest.json +3074 -3
- package/dist/mcp/handler.d.ts.map +1 -1
- package/dist/mcp/handler.js +11 -1
- package/dist/mcp/handler.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +18 -10
- package/dist/mcp/tools.js.map +1 -1
- package/dist/output/error-map.d.ts.map +1 -1
- package/dist/output/error-map.js +1 -1
- package/dist/output/error-map.js.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +2 -1
- package/dist/registry.js.map +1 -1
- package/package.json +2 -2
- package/server.json +3 -3
- package/skills/unicli/SKILL.md +1 -1
- package/skills/unicli-claude-code/SKILL.md +1 -1
- package/skills/unicli-hermes/SKILL.md +1 -1
- package/src/adapters/anilist/web.test.ts +93 -0
- package/src/adapters/anilist/web.ts +341 -0
- package/src/adapters/arxiv/download.yaml +53 -0
- package/src/adapters/bangumi/web.test.ts +109 -0
- package/src/adapters/bangumi/web.ts +295 -0
- package/src/adapters/danbooru/artists.yaml +44 -0
- package/src/adapters/danbooru/comments.yaml +45 -0
- package/src/adapters/danbooru/detail.yaml +78 -0
- package/src/adapters/danbooru/download.yaml +51 -0
- package/src/adapters/danbooru/pools.yaml +56 -0
- package/src/adapters/danbooru/search.yaml +69 -0
- package/src/adapters/danbooru/tags.yaml +42 -0
- package/src/adapters/danbooru/wiki.yaml +44 -0
- package/src/adapters/dlsite/web.test.ts +132 -0
- package/src/adapters/dlsite/web.ts +557 -0
- package/src/adapters/ehentai/web.test.ts +157 -0
- package/src/adapters/ehentai/web.ts +750 -0
- package/src/adapters/jikan/web.test.ts +50 -0
- package/src/adapters/jikan/web.ts +177 -0
- package/src/adapters/kitsu/web.test.ts +29 -0
- package/src/adapters/kitsu/web.ts +109 -0
- package/src/adapters/konachan/detail.yaml +62 -0
- package/src/adapters/konachan/download.yaml +55 -0
- package/src/adapters/konachan/search.yaml +65 -0
- package/src/adapters/konachan/tags.yaml +40 -0
- package/src/adapters/mangadex/web.test.ts +46 -0
- package/src/adapters/mangadex/web.ts +210 -0
- package/src/adapters/moegirl/web.test.ts +87 -0
- package/src/adapters/moegirl/web.ts +343 -0
- package/src/adapters/pdf/read.yaml +49 -0
- package/src/adapters/pixiv/download.yaml +15 -2
- package/src/adapters/safebooru/detail.yaml +63 -0
- package/src/adapters/safebooru/download.yaml +58 -0
- package/src/adapters/safebooru/search.yaml +69 -0
- package/src/adapters/safebooru/web.test.ts +60 -0
- package/src/adapters/safebooru/web.ts +130 -0
- package/src/adapters/vndb/web.test.ts +86 -0
- package/src/adapters/vndb/web.ts +393 -0
- package/src/adapters/yandere/detail.yaml +61 -0
- package/src/adapters/yandere/download.yaml +56 -0
- package/src/adapters/yandere/search.yaml +67 -0
- package/src/adapters/yandere/tags.yaml +41 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner Uni-CLI Browser
|
|
3
|
+
* @does Projects browser-backed command metadata into kernel diagnostics.
|
|
4
|
+
* @needs Invocation identity, adapter source path, target surface, and site-memory paths.
|
|
5
|
+
* @feeds InvocationResult diagnostics for CLI/MCP/ACP wrappers and browser evidence tests.
|
|
6
|
+
* @breaks Browser repair when commands do not expose target identity, evidence commands, or site memory locations.
|
|
7
|
+
*/
|
|
8
|
+
import type { TargetSurface } from "../../types.js";
|
|
9
|
+
export interface BrowserCommandDiagnosticInput {
|
|
10
|
+
site: string;
|
|
11
|
+
command: string;
|
|
12
|
+
adapterPath: string;
|
|
13
|
+
targetSurface: TargetSurface;
|
|
14
|
+
browser: boolean;
|
|
15
|
+
domain?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface BrowserCommandDiagnostic {
|
|
18
|
+
kind: "browser_command";
|
|
19
|
+
site: string;
|
|
20
|
+
command: string;
|
|
21
|
+
adapter_path: string;
|
|
22
|
+
target_surface: TargetSurface;
|
|
23
|
+
evidence: {
|
|
24
|
+
session: string;
|
|
25
|
+
network: string;
|
|
26
|
+
verify: string;
|
|
27
|
+
};
|
|
28
|
+
site_memory: {
|
|
29
|
+
endpoints: string;
|
|
30
|
+
field_map: string;
|
|
31
|
+
notes: string;
|
|
32
|
+
fixtures_dir: string;
|
|
33
|
+
verify_dir: string;
|
|
34
|
+
};
|
|
35
|
+
authoring_loop: string[];
|
|
36
|
+
}
|
|
37
|
+
export declare function buildBrowserCommandDiagnostic(input: BrowserCommandDiagnosticInput): BrowserCommandDiagnostic | undefined;
|
|
38
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/engine/browser/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,aAAa,CAAC;IAC9B,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,WAAW,EAAE;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,6BAA6B,GACnC,wBAAwB,GAAG,SAAS,CA6BtC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner Uni-CLI Browser
|
|
3
|
+
* @does Projects browser-backed command metadata into kernel diagnostics.
|
|
4
|
+
* @needs Invocation identity, adapter source path, target surface, and site-memory paths.
|
|
5
|
+
* @feeds InvocationResult diagnostics for CLI/MCP/ACP wrappers and browser evidence tests.
|
|
6
|
+
* @breaks Browser repair when commands do not expose target identity, evidence commands, or site memory locations.
|
|
7
|
+
*/
|
|
8
|
+
import { siteMemoryPaths } from "../../browser/site-memory.js";
|
|
9
|
+
export function buildBrowserCommandDiagnostic(input) {
|
|
10
|
+
if (!input.browser)
|
|
11
|
+
return undefined;
|
|
12
|
+
const paths = siteMemoryPaths(input.site);
|
|
13
|
+
const analyzeTarget = input.domain ?? `${input.site}.com`;
|
|
14
|
+
return {
|
|
15
|
+
kind: "browser_command",
|
|
16
|
+
site: input.site,
|
|
17
|
+
command: input.command,
|
|
18
|
+
adapter_path: input.adapterPath,
|
|
19
|
+
target_surface: input.targetSurface,
|
|
20
|
+
evidence: {
|
|
21
|
+
session: "unicli browser evidence --render-aware",
|
|
22
|
+
network: "unicli browser network --raw",
|
|
23
|
+
verify: `unicli browser verify ${input.site}/${input.command} --strict-memory`,
|
|
24
|
+
},
|
|
25
|
+
site_memory: {
|
|
26
|
+
endpoints: paths.endpoints,
|
|
27
|
+
field_map: paths.fieldMap,
|
|
28
|
+
notes: paths.notes,
|
|
29
|
+
fixtures_dir: paths.fixturesDir,
|
|
30
|
+
verify_dir: paths.verifyDir,
|
|
31
|
+
},
|
|
32
|
+
authoring_loop: [
|
|
33
|
+
`unicli browser analyze https://${analyzeTarget}`,
|
|
34
|
+
"unicli browser network --filter id,title",
|
|
35
|
+
`unicli browser verify ${input.site}/${input.command} --write-fixture`,
|
|
36
|
+
`unicli repair ${input.site} ${input.command}`,
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/engine/browser/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAiC/D,MAAM,UAAU,6BAA6B,CAC3C,KAAoC;IAEpC,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,MAAM,CAAC;IAC1D,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,YAAY,EAAE,KAAK,CAAC,WAAW;QAC/B,cAAc,EAAE,KAAK,CAAC,aAAa;QACnC,QAAQ,EAAE;YACR,OAAO,EAAE,wCAAwC;YACjD,OAAO,EAAE,8BAA8B;YACvC,MAAM,EAAE,yBAAyB,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,kBAAkB;SAC/E;QACD,WAAW,EAAE;YACX,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,QAAQ;YACzB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,YAAY,EAAE,KAAK,CAAC,WAAW;YAC/B,UAAU,EAAE,KAAK,CAAC,SAAS;SAC5B;QACD,cAAc,EAAE;YACd,kCAAkC,aAAa,EAAE;YACjD,0CAA0C;YAC1C,yBAAyB,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,kBAAkB;YACtE,iBAAiB,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE;SAC/C;KACF,CAAC;AACJ,CAAC"}
|
package/dist/engine/invoke.d.ts
CHANGED
|
@@ -13,4 +13,5 @@ export type { Invocation, CompiledCommand, InvocationResult, AjvValidateFn, } fr
|
|
|
13
13
|
export { newULID, _resetULIDForTests } from "./kernel/ulid.js";
|
|
14
14
|
export { compileAll, getCompiled, compileCommand, _resetCompiledCacheForTests, } from "./kernel/compile.js";
|
|
15
15
|
export { buildInvocation, execute, KernelLookupError, } from "./kernel/execute.js";
|
|
16
|
+
export { KERNEL_STAGE_ORDER, authorizeKernelInvocation, hardenKernelInput, resolveKernelCommandContext, validateKernelInput, } from "./kernel/stages.js";
|
|
16
17
|
//# sourceMappingURL=invoke.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/engine/invoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EACV,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,EACL,UAAU,EACV,WAAW,EACX,cAAc,EACd,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EACf,OAAO,EACP,iBAAiB,GAClB,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/engine/invoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EACV,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,EACL,UAAU,EACV,WAAW,EACX,cAAc,EACd,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EACf,OAAO,EACP,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,iBAAiB,EACjB,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,oBAAoB,CAAC"}
|
package/dist/engine/invoke.js
CHANGED
|
@@ -12,4 +12,5 @@
|
|
|
12
12
|
export { newULID, _resetULIDForTests } from "./kernel/ulid.js";
|
|
13
13
|
export { compileAll, getCompiled, compileCommand, _resetCompiledCacheForTests, } from "./kernel/compile.js";
|
|
14
14
|
export { buildInvocation, execute, KernelLookupError, } from "./kernel/execute.js";
|
|
15
|
+
export { KERNEL_STAGE_ORDER, authorizeKernelInvocation, hardenKernelInput, resolveKernelCommandContext, validateKernelInput, } from "./kernel/stages.js";
|
|
15
16
|
//# sourceMappingURL=invoke.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/engine/invoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,EACL,UAAU,EACV,WAAW,EACX,cAAc,EACd,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EACf,OAAO,EACP,iBAAiB,GAClB,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/engine/invoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,EACL,UAAU,EACV,WAAW,EACX,cAAc,EACd,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EACf,OAAO,EACP,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,iBAAiB,EACjB,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner Uni-CLI Kernel
|
|
3
|
+
* @does Defines kernel-specific error classes shared by stage modules.
|
|
4
|
+
* @needs Command lookup keys.
|
|
5
|
+
* @feeds Kernel stage resolution and legacy invoke exports.
|
|
6
|
+
* @breaks Missing compiled command cache entries.
|
|
7
|
+
*/
|
|
8
|
+
export declare class KernelLookupError extends Error {
|
|
9
|
+
constructor(key: string);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/engine/kernel/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,GAAG,EAAE,MAAM;CAOxB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner Uni-CLI Kernel
|
|
3
|
+
* @does Defines kernel-specific error classes shared by stage modules.
|
|
4
|
+
* @needs Command lookup keys.
|
|
5
|
+
* @feeds Kernel stage resolution and legacy invoke exports.
|
|
6
|
+
* @breaks Missing compiled command cache entries.
|
|
7
|
+
*/
|
|
8
|
+
export class KernelLookupError extends Error {
|
|
9
|
+
constructor(key) {
|
|
10
|
+
super(`KernelLookupError: compiled command not found: ${key}. ` +
|
|
11
|
+
"Loader must call compileAll() before execute() — call primeKernelCache() from discovery/loader.ts.");
|
|
12
|
+
this.name = "KernelLookupError";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/engine/kernel/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,GAAW;QACrB,KAAK,CACH,kDAAkD,GAAG,IAAI;YACvD,oGAAoG,CACvG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -1,25 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* 3. runPipeline() / command.func() → actual work
|
|
8
|
-
* 4. build success envelope with live next_actions (runtime, not templated)
|
|
9
|
-
*
|
|
10
|
-
* Callers (CLI/MCP/ACP) format the returned `InvocationResult` for their
|
|
11
|
-
* transport; they do not rebuild envelopes.
|
|
2
|
+
* @owner Uni-CLI Kernel
|
|
3
|
+
* @does Builds invocations and runs the shared kernel stage chain.
|
|
4
|
+
* @needs Registry resolution, compiled command cache, and explicit kernel stages.
|
|
5
|
+
* @feeds CLI/MCP/ACP transport renderers through InvocationResult.
|
|
6
|
+
* @breaks Surface parity when wrappers rebuild validation, authorization, execution, diagnostics, or envelopes.
|
|
12
7
|
*/
|
|
13
8
|
import type { ResolvedArgs } from "../args.js";
|
|
9
|
+
import { KernelLookupError } from "./errors.js";
|
|
14
10
|
import type { Invocation, InvocationResult } from "./types.js";
|
|
15
|
-
|
|
16
|
-
* Raised when execute() is called for a (site, cmd) pair that was not seen
|
|
17
|
-
* by `compileAll()` at loader boot. Signals a wiring bug (the loader forgot
|
|
18
|
-
* to prime the cache), not a user error.
|
|
19
|
-
*/
|
|
20
|
-
export declare class KernelLookupError extends Error {
|
|
21
|
-
constructor(key: string);
|
|
22
|
-
}
|
|
11
|
+
export { KernelLookupError };
|
|
23
12
|
/**
|
|
24
13
|
* Look up an adapter + command pair and return an Invocation ready for
|
|
25
14
|
* execute(). Returns `null` if either the site or command is unknown —
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/engine/kernel/execute.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/engine/kernel/execute.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAY/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG/D,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,EAC9B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,YAAY,EACjB,OAAO,GAAE;IACP,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,GACL,UAAU,GAAG,IAAI,CAcnB;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA8BxE"}
|
|
@@ -1,82 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* 3. runPipeline() / command.func() → actual work
|
|
8
|
-
* 4. build success envelope with live next_actions (runtime, not templated)
|
|
9
|
-
*
|
|
10
|
-
* Callers (CLI/MCP/ACP) format the returned `InvocationResult` for their
|
|
11
|
-
* transport; they do not rebuild envelopes.
|
|
2
|
+
* @owner Uni-CLI Kernel
|
|
3
|
+
* @does Builds invocations and runs the shared kernel stage chain.
|
|
4
|
+
* @needs Registry resolution, compiled command cache, and explicit kernel stages.
|
|
5
|
+
* @feeds CLI/MCP/ACP transport renderers through InvocationResult.
|
|
6
|
+
* @breaks Surface parity when wrappers rebuild validation, authorization, execution, diagnostics, or envelopes.
|
|
12
7
|
*/
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { createApprovalStore, rememberApproval } from "../approval-store.js";
|
|
17
|
-
import { errorTypeToCode, errorToAgentFields, mapErrorToExitCode, } from "../../output/error-map.js";
|
|
18
|
-
import { commandStrategy, resolveCommand } from "../../registry.js";
|
|
19
|
-
import { ExitCode } from "../../types.js";
|
|
20
|
-
import { InvalidPermissionProfileError, resolveOperationAdapterPath, resolveOperationTargetSurface, } from "../operation-policy.js";
|
|
21
|
-
import { evaluateOperationPolicyWithApprovals } from "../permission-runtime.js";
|
|
22
|
-
import { PermissionRulesConfigError } from "../permission-rules.js";
|
|
23
|
-
import { getCompiled } from "./compile.js";
|
|
8
|
+
import { resolveCommand } from "../../registry.js";
|
|
9
|
+
import { authorizeKernelInvocation, executeKernelCommand, executionErrorResult, hardenKernelInput, malformedCommandResult, rememberKernelApproval, resolveKernelCommandContext, successKernelResult, validateKernelInput, } from "./stages.js";
|
|
10
|
+
import { KernelLookupError } from "./errors.js";
|
|
24
11
|
import { newULID } from "./ulid.js";
|
|
25
|
-
|
|
26
|
-
* Raised when execute() is called for a (site, cmd) pair that was not seen
|
|
27
|
-
* by `compileAll()` at loader boot. Signals a wiring bug (the loader forgot
|
|
28
|
-
* to prime the cache), not a user error.
|
|
29
|
-
*/
|
|
30
|
-
export class KernelLookupError extends Error {
|
|
31
|
-
constructor(key) {
|
|
32
|
-
super(`KernelLookupError: compiled command not found: ${key}. ` +
|
|
33
|
-
"Loader must call compileAll() before execute() — call primeKernelCache() from discovery/loader.ts.");
|
|
34
|
-
this.name = "KernelLookupError";
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
function isRecord(value) {
|
|
38
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
39
|
-
}
|
|
40
|
-
function resourcesFromPermissionConfig(config) {
|
|
41
|
-
if (!isRecord(config) || !isRecord(config.resources))
|
|
42
|
-
return undefined;
|
|
43
|
-
const resources = {};
|
|
44
|
-
for (const [bucket, raw] of Object.entries(config.resources)) {
|
|
45
|
-
if (!Array.isArray(raw))
|
|
46
|
-
continue;
|
|
47
|
-
const values = raw.filter((value) => {
|
|
48
|
-
return typeof value === "string";
|
|
49
|
-
});
|
|
50
|
-
if (values.length > 0)
|
|
51
|
-
resources[bucket] = values;
|
|
52
|
-
}
|
|
53
|
-
return Object.keys(resources).length > 0 ? resources : undefined;
|
|
54
|
-
}
|
|
55
|
-
function runtimePermissionDeniedDiagnostic(err) {
|
|
56
|
-
if (!(err instanceof PipelineError) ||
|
|
57
|
-
err.detail.errorType !== "permission_denied") {
|
|
58
|
-
return undefined;
|
|
59
|
-
}
|
|
60
|
-
const config = err.detail.config;
|
|
61
|
-
const resources = resourcesFromPermissionConfig(config);
|
|
62
|
-
const ruleId = isRecord(config) && typeof config.rule_id === "string"
|
|
63
|
-
? config.rule_id
|
|
64
|
-
: undefined;
|
|
65
|
-
return {
|
|
66
|
-
kind: "runtime_permission_denied",
|
|
67
|
-
code: "permission_denied",
|
|
68
|
-
action: err.detail.action,
|
|
69
|
-
step: err.detail.step,
|
|
70
|
-
retryable: err.detail.retryable ?? false,
|
|
71
|
-
...(ruleId ? { rule_id: ruleId } : {}),
|
|
72
|
-
resource_buckets: resources ? Object.keys(resources).sort() : [],
|
|
73
|
-
...(resources ? { resources } : {}),
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
function diagnosticsForError(err) {
|
|
77
|
-
const diagnostic = runtimePermissionDeniedDiagnostic(err);
|
|
78
|
-
return diagnostic ? [diagnostic] : undefined;
|
|
79
|
-
}
|
|
12
|
+
export { KernelLookupError };
|
|
80
13
|
/**
|
|
81
14
|
* Look up an adapter + command pair and return an Invocation ready for
|
|
82
15
|
* execute(). Returns `null` if either the site or command is unknown —
|
|
@@ -105,345 +38,27 @@ export function buildInvocation(surface, site, cmd, bag, options = {}) {
|
|
|
105
38
|
*/
|
|
106
39
|
export async function execute(inv) {
|
|
107
40
|
const startedAt = Date.now();
|
|
108
|
-
const key = `${inv.adapter.name}.${inv.cmdName}`;
|
|
109
|
-
const compiled = getCompiled(inv.adapter.name, inv.cmdName);
|
|
110
41
|
const warnings = [];
|
|
111
|
-
const
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
throw new KernelLookupError(key);
|
|
123
|
-
let operationPolicy;
|
|
42
|
+
const ctx = resolveKernelCommandContext(inv);
|
|
43
|
+
const invalid = validateKernelInput(inv, ctx, startedAt, warnings);
|
|
44
|
+
if (invalid)
|
|
45
|
+
return invalid.result;
|
|
46
|
+
const hardened = hardenKernelInput(inv, ctx, startedAt, warnings);
|
|
47
|
+
if (hardened)
|
|
48
|
+
return hardened.result;
|
|
49
|
+
const authorization = await authorizeKernelInvocation(inv, ctx, startedAt, warnings);
|
|
50
|
+
if (authorization.blocked)
|
|
51
|
+
return authorization.blocked.result;
|
|
52
|
+
await rememberKernelApproval(inv, authorization.policy, warnings);
|
|
124
53
|
try {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
command: inv.cmdName,
|
|
128
|
-
description: inv.command.description,
|
|
129
|
-
adapterType: inv.adapter.type,
|
|
130
|
-
targetSurface,
|
|
131
|
-
strategy,
|
|
132
|
-
domain: inv.command.domain ?? inv.adapter.domain,
|
|
133
|
-
base: inv.command.base ?? inv.adapter.base,
|
|
134
|
-
browser: inv.adapter.browser === true || inv.command.browser === true,
|
|
135
|
-
args: inv.command.adapterArgs,
|
|
136
|
-
profile: inv.permissionProfile,
|
|
137
|
-
approved: inv.approved,
|
|
138
|
-
});
|
|
139
|
-
if (operationPolicy.enforcement === "deny") {
|
|
140
|
-
const ruleId = operationPolicy.deny_rule?.id ?? "unknown";
|
|
141
|
-
const ruleReason = operationPolicy.deny_rule?.reason ?? "permission rule matched";
|
|
142
|
-
const err = {
|
|
143
|
-
code: "permission_denied",
|
|
144
|
-
message: `permission rule "${ruleId}" denies ${operationPolicy.effect}: ${ruleReason}`,
|
|
145
|
-
adapter_path: adapterPath,
|
|
146
|
-
step: 0,
|
|
147
|
-
suggestion: operationPolicy.approval_hint ??
|
|
148
|
-
"edit or remove the matching permission rule",
|
|
149
|
-
retryable: false,
|
|
150
|
-
alternatives: [
|
|
151
|
-
`unicli --dry-run ${inv.adapter.name} ${inv.cmdName}`,
|
|
152
|
-
"edit ~/.unicli/permission-rules.json",
|
|
153
|
-
],
|
|
154
|
-
};
|
|
155
|
-
const durationMs = Date.now() - startedAt;
|
|
156
|
-
return {
|
|
157
|
-
results: [],
|
|
158
|
-
envelope: {
|
|
159
|
-
command: key,
|
|
160
|
-
duration_ms: durationMs,
|
|
161
|
-
adapter_version: inv.adapter.version,
|
|
162
|
-
surface: targetSurface,
|
|
163
|
-
error: err,
|
|
164
|
-
next_actions: defaultErrorNextActions(inv.adapter.name, inv.cmdName, "permission_denied"),
|
|
165
|
-
},
|
|
166
|
-
durationMs,
|
|
167
|
-
exitCode: ExitCode.AUTH_REQUIRED,
|
|
168
|
-
warnings,
|
|
169
|
-
error: err,
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
if (operationPolicy.enforcement === "needs_approval") {
|
|
173
|
-
const err = {
|
|
174
|
-
code: "permission_denied",
|
|
175
|
-
message: `permission profile "${operationPolicy.profile}" requires approval for ${operationPolicy.effect}`,
|
|
176
|
-
adapter_path: adapterPath,
|
|
177
|
-
step: 0,
|
|
178
|
-
suggestion: operationPolicy.approval_hint ??
|
|
179
|
-
"rerun with --yes or use --permission-profile open",
|
|
180
|
-
retryable: false,
|
|
181
|
-
alternatives: [
|
|
182
|
-
`unicli --dry-run ${inv.adapter.name} ${inv.cmdName}`,
|
|
183
|
-
`unicli --yes --permission-profile ${operationPolicy.profile} ${inv.adapter.name} ${inv.cmdName}`,
|
|
184
|
-
`unicli --permission-profile open ${inv.adapter.name} ${inv.cmdName}`,
|
|
185
|
-
],
|
|
186
|
-
};
|
|
187
|
-
const durationMs = Date.now() - startedAt;
|
|
188
|
-
return {
|
|
189
|
-
results: [],
|
|
190
|
-
envelope: {
|
|
191
|
-
command: key,
|
|
192
|
-
duration_ms: durationMs,
|
|
193
|
-
adapter_version: inv.adapter.version,
|
|
194
|
-
surface: targetSurface,
|
|
195
|
-
error: err,
|
|
196
|
-
next_actions: defaultErrorNextActions(inv.adapter.name, inv.cmdName, "permission_denied"),
|
|
197
|
-
},
|
|
198
|
-
durationMs,
|
|
199
|
-
exitCode: ExitCode.AUTH_REQUIRED,
|
|
200
|
-
warnings,
|
|
201
|
-
error: err,
|
|
202
|
-
};
|
|
54
|
+
if (!inv.command.pipeline && !inv.command.func) {
|
|
55
|
+
return malformedCommandResult(inv, ctx, startedAt, warnings).result;
|
|
203
56
|
}
|
|
57
|
+
const results = await executeKernelCommand(inv, ctx);
|
|
58
|
+
return successKernelResult(inv, ctx, startedAt, warnings, results);
|
|
204
59
|
}
|
|
205
60
|
catch (err) {
|
|
206
|
-
|
|
207
|
-
const agentErr = {
|
|
208
|
-
code: "invalid_input",
|
|
209
|
-
message: err.message,
|
|
210
|
-
adapter_path: adapterPath,
|
|
211
|
-
step: 0,
|
|
212
|
-
suggestion: "use one of: open, confirm, locked",
|
|
213
|
-
retryable: false,
|
|
214
|
-
};
|
|
215
|
-
const durationMs = Date.now() - startedAt;
|
|
216
|
-
return {
|
|
217
|
-
results: [],
|
|
218
|
-
envelope: {
|
|
219
|
-
command: key,
|
|
220
|
-
duration_ms: durationMs,
|
|
221
|
-
adapter_version: inv.adapter.version,
|
|
222
|
-
surface: targetSurface,
|
|
223
|
-
error: agentErr,
|
|
224
|
-
next_actions: defaultErrorNextActions(inv.adapter.name, inv.cmdName, "invalid_input"),
|
|
225
|
-
},
|
|
226
|
-
durationMs,
|
|
227
|
-
exitCode: ExitCode.USAGE_ERROR,
|
|
228
|
-
warnings,
|
|
229
|
-
error: agentErr,
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
if (err instanceof PermissionRulesConfigError) {
|
|
233
|
-
const agentErr = {
|
|
234
|
-
code: err.code,
|
|
235
|
-
message: err.message,
|
|
236
|
-
adapter_path: adapterPath,
|
|
237
|
-
step: 0,
|
|
238
|
-
suggestion: err.suggestion,
|
|
239
|
-
retryable: false,
|
|
240
|
-
};
|
|
241
|
-
const durationMs = Date.now() - startedAt;
|
|
242
|
-
return {
|
|
243
|
-
results: [],
|
|
244
|
-
envelope: {
|
|
245
|
-
command: key,
|
|
246
|
-
duration_ms: durationMs,
|
|
247
|
-
adapter_version: inv.adapter.version,
|
|
248
|
-
surface: targetSurface,
|
|
249
|
-
error: agentErr,
|
|
250
|
-
next_actions: defaultErrorNextActions(inv.adapter.name, inv.cmdName, "invalid_input"),
|
|
251
|
-
},
|
|
252
|
-
durationMs,
|
|
253
|
-
exitCode: ExitCode.USAGE_ERROR,
|
|
254
|
-
warnings,
|
|
255
|
-
error: agentErr,
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
throw err;
|
|
61
|
+
return executionErrorResult(inv, ctx, startedAt, warnings, err).result;
|
|
259
62
|
}
|
|
260
|
-
// 1. JSON Schema validation (fail-closed via ajv strict mode).
|
|
261
|
-
const v = compiled.validate(inv.bag.args);
|
|
262
|
-
if (!v.ok) {
|
|
263
|
-
const first = v.errors[0] ?? { message: "invalid arguments" };
|
|
264
|
-
const path = (first.instancePath ?? "").replace(/^\//, "");
|
|
265
|
-
const name = path || "args";
|
|
266
|
-
const err = {
|
|
267
|
-
code: "invalid_input",
|
|
268
|
-
message: `arg "${name}" ${first.message ?? "invalid"}`,
|
|
269
|
-
adapter_path: adapterPath,
|
|
270
|
-
step: 0,
|
|
271
|
-
suggestion: `match the JSON Schema at \`unicli describe ${inv.adapter.name} ${inv.cmdName}\``,
|
|
272
|
-
retryable: false,
|
|
273
|
-
};
|
|
274
|
-
const durationMs = Date.now() - startedAt;
|
|
275
|
-
return {
|
|
276
|
-
results: [],
|
|
277
|
-
envelope: {
|
|
278
|
-
command: key,
|
|
279
|
-
duration_ms: durationMs,
|
|
280
|
-
adapter_version: inv.adapter.version,
|
|
281
|
-
surface: targetSurface,
|
|
282
|
-
error: err,
|
|
283
|
-
next_actions: defaultErrorNextActions(inv.adapter.name, inv.cmdName, "invalid_input"),
|
|
284
|
-
},
|
|
285
|
-
durationMs,
|
|
286
|
-
exitCode: ExitCode.USAGE_ERROR,
|
|
287
|
-
warnings,
|
|
288
|
-
error: err,
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
// 2. Schema-driven hardening (ajv format-assertion + x-unicli-kind).
|
|
292
|
-
try {
|
|
293
|
-
const h = hardenArgs(inv.bag.args, compiled.argByName);
|
|
294
|
-
warnings.push(...h.warnings);
|
|
295
|
-
}
|
|
296
|
-
catch (err) {
|
|
297
|
-
if (err instanceof InputHardeningError) {
|
|
298
|
-
const agentErr = {
|
|
299
|
-
code: "invalid_input",
|
|
300
|
-
message: err.message,
|
|
301
|
-
adapter_path: adapterPath,
|
|
302
|
-
step: 0,
|
|
303
|
-
suggestion: err.suggestion,
|
|
304
|
-
retryable: false,
|
|
305
|
-
};
|
|
306
|
-
const durationMs = Date.now() - startedAt;
|
|
307
|
-
return {
|
|
308
|
-
results: [],
|
|
309
|
-
envelope: {
|
|
310
|
-
command: key,
|
|
311
|
-
duration_ms: durationMs,
|
|
312
|
-
adapter_version: inv.adapter.version,
|
|
313
|
-
surface: targetSurface,
|
|
314
|
-
error: agentErr,
|
|
315
|
-
next_actions: defaultErrorNextActions(inv.adapter.name, inv.cmdName, "invalid_input"),
|
|
316
|
-
},
|
|
317
|
-
durationMs,
|
|
318
|
-
exitCode: ExitCode.USAGE_ERROR,
|
|
319
|
-
warnings,
|
|
320
|
-
error: agentErr,
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
throw err;
|
|
324
|
-
}
|
|
325
|
-
if (inv.rememberApproval === true) {
|
|
326
|
-
try {
|
|
327
|
-
await rememberApproval(createApprovalStore(), {
|
|
328
|
-
policy: operationPolicy,
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
catch (error) {
|
|
332
|
-
warnings.push(`failed to persist approval memory: ${error instanceof Error ? error.message : String(error)}`);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
// 3. Pipeline / func execution. runPipeline requires a ResolvedArgs bag
|
|
336
|
-
// as of v0.213.3 P3 (D6); surface + trace_id are plumbed through so
|
|
337
|
-
// YAML templates can reference ${{ surface }} / ${{ trace_id }}.
|
|
338
|
-
let results = [];
|
|
339
|
-
try {
|
|
340
|
-
if (inv.command.pipeline) {
|
|
341
|
-
results = await runPipeline(inv.command.pipeline, inv.bag, inv.adapter.base, {
|
|
342
|
-
site: inv.adapter.name,
|
|
343
|
-
command: inv.cmdName,
|
|
344
|
-
strategy,
|
|
345
|
-
domain: inv.command.domain ?? inv.adapter.domain,
|
|
346
|
-
surface: inv.surface,
|
|
347
|
-
trace_id: inv.trace_id,
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
else if (inv.command.func) {
|
|
351
|
-
let page = null;
|
|
352
|
-
try {
|
|
353
|
-
if (inv.command.browser === true) {
|
|
354
|
-
const { acquirePage } = await import("../steps/browser-helpers.js");
|
|
355
|
-
page = await acquirePage({
|
|
356
|
-
data: null,
|
|
357
|
-
args: inv.bag.args,
|
|
358
|
-
vars: {},
|
|
359
|
-
base: inv.adapter.base,
|
|
360
|
-
source: inv.bag.source,
|
|
361
|
-
surface: inv.surface,
|
|
362
|
-
trace_id: inv.trace_id,
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
const raw = await inv.command.func(page, inv.bag.args);
|
|
366
|
-
results = Array.isArray(raw) ? raw : [raw];
|
|
367
|
-
}
|
|
368
|
-
finally {
|
|
369
|
-
if (page && typeof page === "object" && "close" in page) {
|
|
370
|
-
await Promise.resolve(page.close()).catch(() => {
|
|
371
|
-
/* best effort */
|
|
372
|
-
});
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
else {
|
|
377
|
-
const agentErr = {
|
|
378
|
-
code: "internal_error",
|
|
379
|
-
message: `command ${key} has neither pipeline nor func`,
|
|
380
|
-
adapter_path: adapterPath,
|
|
381
|
-
step: 0,
|
|
382
|
-
suggestion: "the adapter manifest is broken; run `unicli repair` to regenerate",
|
|
383
|
-
retryable: false,
|
|
384
|
-
};
|
|
385
|
-
const durationMs = Date.now() - startedAt;
|
|
386
|
-
return {
|
|
387
|
-
results: [],
|
|
388
|
-
envelope: {
|
|
389
|
-
command: key,
|
|
390
|
-
duration_ms: durationMs,
|
|
391
|
-
adapter_version: inv.adapter.version,
|
|
392
|
-
surface: targetSurface,
|
|
393
|
-
error: agentErr,
|
|
394
|
-
},
|
|
395
|
-
durationMs,
|
|
396
|
-
exitCode: ExitCode.CONFIG_ERROR,
|
|
397
|
-
warnings,
|
|
398
|
-
error: agentErr,
|
|
399
|
-
};
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
catch (err) {
|
|
403
|
-
const fields = errorToAgentFields(err, adapterPath, inv.adapter.name);
|
|
404
|
-
const agentErr = {
|
|
405
|
-
code: errorTypeToCode(err),
|
|
406
|
-
message: err instanceof Error ? err.message : String(err),
|
|
407
|
-
...fields,
|
|
408
|
-
};
|
|
409
|
-
const diagnostics = diagnosticsForError(err);
|
|
410
|
-
const durationMs = Date.now() - startedAt;
|
|
411
|
-
return {
|
|
412
|
-
results: [],
|
|
413
|
-
envelope: {
|
|
414
|
-
command: key,
|
|
415
|
-
duration_ms: durationMs,
|
|
416
|
-
adapter_version: inv.adapter.version,
|
|
417
|
-
surface: targetSurface,
|
|
418
|
-
error: agentErr,
|
|
419
|
-
next_actions: defaultErrorNextActions(inv.adapter.name, inv.cmdName, agentErr.code),
|
|
420
|
-
},
|
|
421
|
-
durationMs,
|
|
422
|
-
exitCode: mapErrorToExitCode(err),
|
|
423
|
-
warnings,
|
|
424
|
-
error: agentErr,
|
|
425
|
-
...(diagnostics ? { diagnostics } : {}),
|
|
426
|
-
};
|
|
427
|
-
}
|
|
428
|
-
// 4. Success envelope. next_actions built at runtime with the literal
|
|
429
|
-
// site/cmd so adapter templates that legitimately carry `${site}` are
|
|
430
|
-
// never mangled and `paginated` metadata flows through.
|
|
431
|
-
const durationMs = Date.now() - startedAt;
|
|
432
|
-
const nextActions = defaultSuccessNextActions(inv.adapter.name, inv.cmdName, {
|
|
433
|
-
supportsPagination: inv.command.paginated === true,
|
|
434
|
-
});
|
|
435
|
-
return {
|
|
436
|
-
results,
|
|
437
|
-
envelope: {
|
|
438
|
-
command: key,
|
|
439
|
-
duration_ms: durationMs,
|
|
440
|
-
adapter_version: inv.adapter.version,
|
|
441
|
-
surface: targetSurface,
|
|
442
|
-
next_actions: nextActions,
|
|
443
|
-
},
|
|
444
|
-
durationMs,
|
|
445
|
-
exitCode: results.length === 0 ? ExitCode.EMPTY_RESULT : ExitCode.SUCCESS,
|
|
446
|
-
warnings,
|
|
447
|
-
};
|
|
448
63
|
}
|
|
449
64
|
//# sourceMappingURL=execute.js.map
|