@zenalexa/unicli 0.224.1 → 0.225.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 +5 -5
- package/README.md +92 -92
- package/README.zh-CN.md +69 -69
- package/dist/adapters/_electron/desktop-shared.d.ts.map +1 -1
- package/dist/adapters/_electron/desktop-shared.js +2 -1
- package/dist/adapters/_electron/desktop-shared.js.map +1 -1
- package/dist/adapters/_electron/shared.d.ts +6 -0
- package/dist/adapters/_electron/shared.d.ts.map +1 -1
- package/dist/adapters/_electron/shared.js +9 -0
- package/dist/adapters/_electron/shared.js.map +1 -1
- package/dist/adapters/antigravity/extra.js +4 -1
- package/dist/adapters/antigravity/extra.js.map +1 -1
- package/dist/adapters/chatwise/extra.js +4 -1
- package/dist/adapters/chatwise/extra.js.map +1 -1
- package/dist/adapters/codex/codex.js +3 -1
- package/dist/adapters/codex/codex.js.map +1 -1
- package/dist/adapters/codex/extra.js +4 -1
- package/dist/adapters/codex/extra.js.map +1 -1
- package/dist/adapters/codex/projects.d.ts.map +1 -1
- package/dist/adapters/codex/projects.js +3 -1
- package/dist/adapters/codex/projects.js.map +1 -1
- package/dist/adapters/cursor/cursor.js +6 -1
- package/dist/adapters/cursor/cursor.js.map +1 -1
- package/dist/adapters/discord-app/discord-app.js +10 -1
- package/dist/adapters/discord-app/discord-app.js.map +1 -1
- package/dist/adapters/notion-app/notion-app.js +11 -1
- package/dist/adapters/notion-app/notion-app.js.map +1 -1
- package/dist/adapters/spotify/api.js +36 -6
- package/dist/adapters/spotify/api.js.map +1 -1
- package/dist/adapters/xiaohongshu/browser-state.d.ts +2 -1
- package/dist/adapters/xiaohongshu/browser-state.d.ts.map +1 -1
- package/dist/adapters/xiaohongshu/browser-state.js +56 -2
- package/dist/adapters/xiaohongshu/browser-state.js.map +1 -1
- package/dist/adapters/xiaohongshu/feed.d.ts +24 -0
- package/dist/adapters/xiaohongshu/feed.d.ts.map +1 -0
- package/dist/adapters/xiaohongshu/feed.js +82 -0
- package/dist/adapters/xiaohongshu/feed.js.map +1 -0
- package/dist/adapters/xueqiu/extra.js +2 -2
- package/dist/adapters/xueqiu/extra.js.map +1 -1
- package/dist/browser/cdp-client.d.ts +15 -1
- package/dist/browser/cdp-client.d.ts.map +1 -1
- package/dist/browser/cdp-client.js +45 -16
- package/dist/browser/cdp-client.js.map +1 -1
- package/dist/browser/daemon.js +29 -7
- package/dist/browser/daemon.js.map +1 -1
- package/dist/browser/launcher.d.ts.map +1 -1
- package/dist/browser/launcher.js +22 -8
- package/dist/browser/launcher.js.map +1 -1
- package/dist/browser/local-profiles.d.ts +2 -0
- package/dist/browser/local-profiles.d.ts.map +1 -1
- package/dist/browser/local-profiles.js +42 -2
- package/dist/browser/local-profiles.js.map +1 -1
- package/dist/browser/page.d.ts +2 -2
- package/dist/browser/page.d.ts.map +1 -1
- package/dist/browser/page.js +2 -2
- package/dist/browser/page.js.map +1 -1
- package/dist/browser/protocol.d.ts +7 -0
- package/dist/browser/protocol.d.ts.map +1 -1
- package/dist/browser/protocol.js +5 -0
- package/dist/browser/protocol.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/architecture.d.ts +3 -1
- package/dist/commands/architecture.d.ts.map +1 -1
- package/dist/commands/architecture.js +13 -5
- package/dist/commands/architecture.js.map +1 -1
- package/dist/commands/browser/index.d.ts.map +1 -1
- package/dist/commands/browser/index.js +26 -4
- package/dist/commands/browser/index.js.map +1 -1
- package/dist/commands/delivery.d.ts.map +1 -1
- package/dist/commands/delivery.js.map +1 -1
- package/dist/commands/describe.d.ts.map +1 -1
- package/dist/commands/describe.js +104 -9
- package/dist/commands/describe.js.map +1 -1
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/dispatch.js +3 -13
- package/dist/commands/dispatch.js.map +1 -1
- package/dist/commands/do.d.ts +16 -13
- package/dist/commands/do.d.ts.map +1 -1
- package/dist/commands/do.js +72 -18
- package/dist/commands/do.js.map +1 -1
- package/dist/commands/social.d.ts.map +1 -1
- package/dist/commands/social.js +3 -13
- package/dist/commands/social.js.map +1 -1
- package/dist/core/architecture-tree.d.ts +26 -6
- package/dist/core/architecture-tree.d.ts.map +1 -1
- package/dist/core/architecture-tree.js +184 -40
- package/dist/core/architecture-tree.js.map +1 -1
- package/dist/core/capability-matrix.d.ts +63 -0
- package/dist/core/capability-matrix.d.ts.map +1 -0
- package/dist/core/capability-matrix.js +316 -0
- package/dist/core/capability-matrix.js.map +1 -0
- package/dist/core/command-contract-lint.d.ts.map +1 -1
- package/dist/core/command-contract-lint.js +3 -1
- package/dist/core/command-contract-lint.js.map +1 -1
- package/dist/core/command-contract.d.ts +10 -3
- package/dist/core/command-contract.d.ts.map +1 -1
- package/dist/core/command-contract.js +87 -5
- package/dist/core/command-contract.js.map +1 -1
- package/dist/discovery/aliases.d.ts.map +1 -1
- package/dist/discovery/aliases.js +26 -0
- package/dist/discovery/aliases.js.map +1 -1
- package/dist/discovery/core-catalog.d.ts +1 -0
- package/dist/discovery/core-catalog.d.ts.map +1 -1
- package/dist/discovery/core-catalog.js +22 -5
- package/dist/discovery/core-catalog.js.map +1 -1
- package/dist/discovery/intents.d.ts +31 -4
- package/dist/discovery/intents.d.ts.map +1 -1
- package/dist/discovery/intents.js +166 -3
- package/dist/discovery/intents.js.map +1 -1
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +3 -0
- package/dist/discovery/loader.js.map +1 -1
- package/dist/discovery/search.d.ts.map +1 -1
- package/dist/discovery/search.js +10 -1
- package/dist/discovery/search.js.map +1 -1
- package/dist/engine/cascade.d.ts.map +1 -1
- package/dist/engine/cascade.js +21 -25
- package/dist/engine/cascade.js.map +1 -1
- package/dist/engine/chromium-cookies.d.ts +27 -0
- package/dist/engine/chromium-cookies.d.ts.map +1 -1
- package/dist/engine/chromium-cookies.js +53 -14
- package/dist/engine/chromium-cookies.js.map +1 -1
- package/dist/engine/cookie-capture.d.ts +30 -0
- package/dist/engine/cookie-capture.d.ts.map +1 -0
- package/dist/engine/cookie-capture.js +104 -0
- package/dist/engine/cookie-capture.js.map +1 -0
- package/dist/engine/cookie-extractor.d.ts.map +1 -1
- package/dist/engine/cookie-extractor.js +4 -12
- package/dist/engine/cookie-extractor.js.map +1 -1
- package/dist/engine/cookie-refresh.d.ts +59 -8
- package/dist/engine/cookie-refresh.d.ts.map +1 -1
- package/dist/engine/cookie-refresh.js +80 -58
- package/dist/engine/cookie-refresh.js.map +1 -1
- package/dist/engine/cookie-source.d.ts +110 -0
- package/dist/engine/cookie-source.d.ts.map +1 -0
- package/dist/engine/cookie-source.js +207 -0
- package/dist/engine/cookie-source.js.map +1 -0
- package/dist/engine/cookies.d.ts +37 -25
- package/dist/engine/cookies.d.ts.map +1 -1
- package/dist/engine/cookies.js +58 -157
- package/dist/engine/cookies.js.map +1 -1
- package/dist/engine/delivery/index.d.ts +2 -1
- package/dist/engine/delivery/index.d.ts.map +1 -1
- package/dist/engine/delivery/index.js +2 -1
- package/dist/engine/delivery/index.js.map +1 -1
- package/dist/engine/delivery/spec.d.ts +44 -0
- package/dist/engine/delivery/spec.d.ts.map +1 -0
- package/dist/engine/delivery/spec.js +82 -0
- package/dist/engine/delivery/spec.js.map +1 -0
- package/dist/engine/executor.d.ts +17 -6
- package/dist/engine/executor.d.ts.map +1 -1
- package/dist/engine/executor.js +131 -68
- package/dist/engine/executor.js.map +1 -1
- package/dist/engine/kernel/stages.d.ts.map +1 -1
- package/dist/engine/kernel/stages.js +14 -4
- package/dist/engine/kernel/stages.js.map +1 -1
- package/dist/engine/objective/catalog.d.ts +23 -0
- package/dist/engine/objective/catalog.d.ts.map +1 -0
- package/dist/engine/objective/catalog.js +42 -0
- package/dist/engine/objective/catalog.js.map +1 -0
- package/dist/engine/objective/delivery.d.ts +18 -0
- package/dist/engine/objective/delivery.d.ts.map +1 -0
- package/dist/engine/objective/delivery.js +64 -0
- package/dist/engine/objective/delivery.js.map +1 -0
- package/dist/engine/objective/index.d.ts +20 -0
- package/dist/engine/objective/index.d.ts.map +1 -0
- package/dist/engine/objective/index.js +20 -0
- package/dist/engine/objective/index.js.map +1 -0
- package/dist/engine/objective/media-playback.d.ts +17 -0
- package/dist/engine/objective/media-playback.d.ts.map +1 -0
- package/dist/engine/objective/media-playback.js +186 -0
- package/dist/engine/objective/media-playback.js.map +1 -0
- package/dist/engine/objective/output.d.ts +20 -0
- package/dist/engine/objective/output.d.ts.map +1 -0
- package/dist/engine/objective/output.js +88 -0
- package/dist/engine/objective/output.js.map +1 -0
- package/dist/engine/objective/planner.d.ts +17 -0
- package/dist/engine/objective/planner.d.ts.map +1 -0
- package/dist/engine/objective/planner.js +60 -0
- package/dist/engine/objective/planner.js.map +1 -0
- package/dist/engine/objective/types.d.ts +66 -0
- package/dist/engine/objective/types.d.ts.map +1 -0
- package/dist/engine/objective/types.js +16 -0
- package/dist/engine/objective/types.js.map +1 -0
- package/dist/engine/runtime.d.ts.map +1 -1
- package/dist/engine/runtime.js +9 -4
- package/dist/engine/runtime.js.map +1 -1
- package/dist/engine/step-observer.d.ts +62 -0
- package/dist/engine/step-observer.d.ts.map +1 -0
- package/dist/engine/step-observer.js +38 -0
- package/dist/engine/step-observer.js.map +1 -0
- package/dist/engine/steps/browser-helpers.d.ts.map +1 -1
- package/dist/engine/steps/browser-helpers.js +36 -8
- package/dist/engine/steps/browser-helpers.js.map +1 -1
- package/dist/engine/steps/fetch-text.d.ts.map +1 -1
- package/dist/engine/steps/fetch-text.js +106 -33
- package/dist/engine/steps/fetch-text.js.map +1 -1
- package/dist/engine/steps/fetch.d.ts +20 -0
- package/dist/engine/steps/fetch.d.ts.map +1 -1
- package/dist/engine/steps/fetch.js.map +1 -1
- package/dist/engine/steps/index.d.ts +2 -0
- package/dist/engine/steps/index.d.ts.map +1 -1
- package/dist/engine/steps/index.js +2 -0
- package/dist/engine/steps/index.js.map +1 -1
- package/dist/engine/steps/split-text.d.ts +26 -0
- package/dist/engine/steps/split-text.d.ts.map +1 -0
- package/dist/engine/steps/split-text.js +89 -0
- package/dist/engine/steps/split-text.js.map +1 -0
- package/dist/engine/steps/to-entries.d.ts +9 -0
- package/dist/engine/steps/to-entries.d.ts.map +1 -0
- package/dist/engine/steps/to-entries.js +27 -0
- package/dist/engine/steps/to-entries.js.map +1 -0
- package/dist/fast-path/handlers/discovery.d.ts.map +1 -1
- package/dist/fast-path/handlers/discovery.js +7 -7
- package/dist/fast-path/handlers/discovery.js.map +1 -1
- package/dist/manifest-compact.txt +3 -2
- package/dist/manifest.json +183 -17
- package/dist/mcp/tools.js +1 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/output/auth-guidance.d.ts +17 -3
- package/dist/output/auth-guidance.d.ts.map +1 -1
- package/dist/output/auth-guidance.js +27 -3
- package/dist/output/auth-guidance.js.map +1 -1
- package/dist/output/error-map.d.ts.map +1 -1
- package/dist/output/error-map.js +4 -0
- package/dist/output/error-map.js.map +1 -1
- package/package.json +4 -2
- package/server.json +2 -2
- 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/12306/price.yaml +91 -0
- package/src/adapters/12306/stations.yaml +52 -0
- package/src/adapters/12306/trains.yaml +129 -0
- package/src/adapters/_electron/desktop-shared.ts +5 -1
- package/src/adapters/_electron/shared.ts +15 -0
- package/src/adapters/antigravity/extra.ts +10 -1
- package/src/adapters/chatwise/extra.ts +10 -1
- package/src/adapters/codex/codex.ts +6 -0
- package/src/adapters/codex/extra.ts +10 -1
- package/src/adapters/codex/projects.ts +9 -1
- package/src/adapters/cursor/cursor.ts +9 -0
- package/src/adapters/discord-app/discord-app.ts +16 -1
- package/src/adapters/macos/brightness.yaml +6 -3
- package/src/adapters/macos/calendar-list.yaml +9 -11
- package/src/adapters/macos/calendar-today.yaml +1 -1
- package/src/adapters/macos/safari-url.yaml +8 -4
- package/src/adapters/maoyan/hot.yaml +1 -1
- package/src/adapters/notion-app/notion-app.ts +17 -1
- package/src/adapters/spotify/api.ts +54 -8
- package/src/adapters/weibo/trending.yaml +2 -0
- package/src/adapters/xiaohongshu/browser-state.ts +59 -2
- package/src/adapters/xiaohongshu/feed.ts +103 -0
- package/src/adapters/xueqiu/extra.ts +5 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../../src/engine/objective/planner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAEV,uBAAuB,EACvB,aAAa,EAKd,MAAM,YAAY,CAAC;AAMpB,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,uBAA0D,GAClE,aAAa,GAAG,SAAS,CAO3B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/engine/objective/planner.ts
|
|
3
|
+
* @does Routes natural-language goals through objective workflows and validates their command refs.
|
|
4
|
+
* @needs src/engine/objective/catalog.ts, src/engine/objective/media-playback.ts, src/engine/objective/delivery.ts
|
|
5
|
+
* @feeds src/commands/do.ts and future objective execution surfaces.
|
|
6
|
+
* @breaks Unvalidated workflow strategies can produce non-executable delivery specs.
|
|
7
|
+
* @invariants All non-missing strategy commands must resolve in the live registry before delivery specs are emitted.
|
|
8
|
+
* @side-effects none.
|
|
9
|
+
* @perf O(workflow count * intent length + strategy command refs).
|
|
10
|
+
* @concurrency pure and reentrant after registry load.
|
|
11
|
+
* @test tests/unit/objective-compiler.test.ts, tests/unit/commands/do.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-06-01
|
|
14
|
+
*/
|
|
15
|
+
import { createRegistryObjectiveCatalog } from "./catalog.js";
|
|
16
|
+
import { buildObjectiveDeliverySpecTemplate } from "./delivery.js";
|
|
17
|
+
import { mediaPlaybackWorkflow } from "./media-playback.js";
|
|
18
|
+
const OBJECTIVE_WORKFLOWS = [
|
|
19
|
+
mediaPlaybackWorkflow,
|
|
20
|
+
];
|
|
21
|
+
export function compileObjectivePlan(intent, catalog = createRegistryObjectiveCatalog()) {
|
|
22
|
+
for (const workflow of OBJECTIVE_WORKFLOWS) {
|
|
23
|
+
const draft = workflow.compile(intent);
|
|
24
|
+
if (!draft)
|
|
25
|
+
continue;
|
|
26
|
+
return materializeObjectivePlan(draft, catalog);
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
function materializeObjectivePlan(draft, catalog) {
|
|
31
|
+
const validationGaps = [];
|
|
32
|
+
const strategies = draft.strategies.map((strategy) => validateStrategyCommands(strategy, catalog, validationGaps));
|
|
33
|
+
const plan = {
|
|
34
|
+
schema_version: "objective-plan.v1",
|
|
35
|
+
objective: draft.objective,
|
|
36
|
+
strategies,
|
|
37
|
+
capability_gaps: [...draft.capability_gaps, ...validationGaps],
|
|
38
|
+
};
|
|
39
|
+
const deliverySpec = buildObjectiveDeliverySpecTemplate(plan);
|
|
40
|
+
return deliverySpec
|
|
41
|
+
? { ...plan, delivery_spec_template: deliverySpec }
|
|
42
|
+
: plan;
|
|
43
|
+
}
|
|
44
|
+
function validateStrategyCommands(strategy, catalog, gaps) {
|
|
45
|
+
if (strategy.status === "missing")
|
|
46
|
+
return strategy;
|
|
47
|
+
const missingStep = strategyCommandRefs(strategy).find((step) => !catalog.hasCommand(step.command));
|
|
48
|
+
if (!missingStep)
|
|
49
|
+
return strategy;
|
|
50
|
+
gaps.push({
|
|
51
|
+
provider: strategy.provider,
|
|
52
|
+
missing: missingStep.command,
|
|
53
|
+
reason: `Objective strategy ${strategy.id} references an unregistered command: ${missingStep.command}.`,
|
|
54
|
+
});
|
|
55
|
+
return { ...strategy, status: "missing" };
|
|
56
|
+
}
|
|
57
|
+
function strategyCommandRefs(strategy) {
|
|
58
|
+
return [...strategy.steps, strategy.verification];
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../../../src/engine/objective/planner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,kCAAkC,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAW5D,MAAM,mBAAmB,GAAiC;IACxD,qBAAqB;CACtB,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,UAAmC,8BAA8B,EAAE;IAEnE,KAAK,MAAM,QAAQ,IAAI,mBAAmB,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,OAAO,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,wBAAwB,CAC/B,KAA6B,EAC7B,OAAgC;IAEhC,MAAM,cAAc,GAA6B,EAAE,CAAC;IACpD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACnD,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC,CAC5D,CAAC;IACF,MAAM,IAAI,GAAkB;QAC1B,cAAc,EAAE,mBAAmB;QACnC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU;QACV,eAAe,EAAE,CAAC,GAAG,KAAK,CAAC,eAAe,EAAE,GAAG,cAAc,CAAC;KAC/D,CAAC;IACF,MAAM,YAAY,GAAG,kCAAkC,CAAC,IAAI,CAAC,CAAC;IAC9D,OAAO,YAAY;QACjB,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,sBAAsB,EAAE,YAAY,EAAE;QACnD,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,wBAAwB,CAC/B,QAA2B,EAC3B,OAAgC,EAChC,IAA8B;IAE9B,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAEnD,MAAM,WAAW,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC,IAAI,CACpD,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAC5C,CAAC;IACF,IAAI,CAAC,WAAW;QAAE,OAAO,QAAQ,CAAC;IAElC,IAAI,CAAC,IAAI,CAAC;QACR,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,MAAM,EAAE,sBAAsB,QAAQ,CAAC,EAAE,wCAAwC,WAAW,CAAC,OAAO,GAAG;KACxG,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,mBAAmB,CAAC,QAA2B;IACtD,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/engine/objective/types.ts
|
|
3
|
+
* @does Defines objective-level workflow contracts before command routing.
|
|
4
|
+
* @needs src/engine/delivery/types.ts, src/engine/delivery/spec.ts
|
|
5
|
+
* @feeds src/engine/objective/planner.ts, src/engine/objective/output.ts, src/commands/do.ts
|
|
6
|
+
* @breaks Weak objective contracts let stateful goals fall back to raw command search.
|
|
7
|
+
* @invariants Objective plans are plan-only and must expose capability gaps instead of pretending missing app control works.
|
|
8
|
+
* @side-effects none
|
|
9
|
+
* @perf type-only module.
|
|
10
|
+
* @concurrency type-only module.
|
|
11
|
+
* @test tests/unit/objective-compiler.test.ts, tests/unit/commands/do.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-06-01
|
|
14
|
+
*/
|
|
15
|
+
import type { DeliveryEvidenceGate } from "../delivery/types.js";
|
|
16
|
+
import type { DeliveryOperatorSpec } from "../delivery/spec.js";
|
|
17
|
+
export type ObjectiveKind = "media.playback";
|
|
18
|
+
export type ObjectiveStrategySubstrate = "native-api" | "desktop-cdp" | "desktop-ax" | "visual-fallback";
|
|
19
|
+
export type ObjectiveStrategyStatus = "executable" | "partial" | "missing";
|
|
20
|
+
export interface ObjectivePlan {
|
|
21
|
+
schema_version: "objective-plan.v1";
|
|
22
|
+
objective: {
|
|
23
|
+
id: string;
|
|
24
|
+
kind: ObjectiveKind;
|
|
25
|
+
goal: string;
|
|
26
|
+
confidence: number;
|
|
27
|
+
slots: Record<string, unknown>;
|
|
28
|
+
evidence_gates: DeliveryEvidenceGate[];
|
|
29
|
+
};
|
|
30
|
+
strategies: ObjectiveStrategy[];
|
|
31
|
+
capability_gaps: ObjectiveCapabilityGap[];
|
|
32
|
+
delivery_spec_template?: DeliveryOperatorSpec;
|
|
33
|
+
}
|
|
34
|
+
export interface ObjectiveStrategy {
|
|
35
|
+
id: string;
|
|
36
|
+
label: string;
|
|
37
|
+
provider: string;
|
|
38
|
+
substrate: ObjectiveStrategySubstrate;
|
|
39
|
+
status: ObjectiveStrategyStatus;
|
|
40
|
+
priority: number;
|
|
41
|
+
steps: ObjectiveStep[];
|
|
42
|
+
verification: ObjectiveStep;
|
|
43
|
+
}
|
|
44
|
+
export interface ObjectiveStep {
|
|
45
|
+
command: string;
|
|
46
|
+
args?: Record<string, unknown>;
|
|
47
|
+
purpose: string;
|
|
48
|
+
}
|
|
49
|
+
export interface ObjectiveCapabilityGap {
|
|
50
|
+
provider: string;
|
|
51
|
+
missing: string;
|
|
52
|
+
reason: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ObjectiveCommandCatalog {
|
|
55
|
+
hasCommand(command: string): boolean;
|
|
56
|
+
}
|
|
57
|
+
export interface ObjectiveWorkflowDraft {
|
|
58
|
+
objective: ObjectivePlan["objective"];
|
|
59
|
+
strategies: ObjectiveStrategy[];
|
|
60
|
+
capability_gaps: ObjectiveCapabilityGap[];
|
|
61
|
+
}
|
|
62
|
+
export interface ObjectiveWorkflow {
|
|
63
|
+
id: ObjectiveKind;
|
|
64
|
+
compile(intent: string): ObjectiveWorkflowDraft | undefined;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/engine/objective/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,MAAM,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAE7C,MAAM,MAAM,0BAA0B,GAClC,YAAY,GACZ,aAAa,GACb,YAAY,GACZ,iBAAiB,CAAC;AAEtB,MAAM,MAAM,uBAAuB,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;AAE3E,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,mBAAmB,CAAC;IACpC,SAAS,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,aAAa,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,cAAc,EAAE,oBAAoB,EAAE,CAAC;KACxC,CAAC;IACF,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,eAAe,EAAE,sBAAsB,EAAE,CAAC;IAC1C,sBAAsB,CAAC,EAAE,oBAAoB,CAAC;CAC/C;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,0BAA0B,CAAC;IACtC,MAAM,EAAE,uBAAuB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,YAAY,EAAE,aAAa,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACtC,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,eAAe,EAAE,sBAAsB,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,aAAa,CAAC;IAClB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAAC;CAC7D"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/engine/objective/types.ts
|
|
3
|
+
* @does Defines objective-level workflow contracts before command routing.
|
|
4
|
+
* @needs src/engine/delivery/types.ts, src/engine/delivery/spec.ts
|
|
5
|
+
* @feeds src/engine/objective/planner.ts, src/engine/objective/output.ts, src/commands/do.ts
|
|
6
|
+
* @breaks Weak objective contracts let stateful goals fall back to raw command search.
|
|
7
|
+
* @invariants Objective plans are plan-only and must expose capability gaps instead of pretending missing app control works.
|
|
8
|
+
* @side-effects none
|
|
9
|
+
* @perf type-only module.
|
|
10
|
+
* @concurrency type-only module.
|
|
11
|
+
* @test tests/unit/objective-compiler.test.ts, tests/unit/commands/do.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-06-01
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/engine/objective/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/engine/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,eAAe,EAGrB,MAAM,eAAe,CAAC;AAGvB,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,OAAO,GACjB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,EAAE,GAAG,SAAS,CAAA;CAAE,CAwBvD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAQzE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAQxE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CASvD;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,OAAO,EAAE,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,eAAe,CAAC,CAe1B;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,OAAO,EAAE,GAAG,SAAS,EAChC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,eAAe,CAAC,CAsB1B;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAgCtC;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,eAAe,GAAG,SAAS,GACnC,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/engine/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,eAAe,EAGrB,MAAM,eAAe,CAAC;AAGvB,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,OAAO,GACjB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,EAAE,GAAG,SAAS,CAAA;CAAE,CAwBvD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAQzE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAQxE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CASvD;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,OAAO,EAAE,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,eAAe,CAAC,CAe1B;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,OAAO,EAAE,GAAG,SAAS,EAChC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,eAAe,CAAC,CAsB1B;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAgCtC;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,eAAe,GAAG,SAAS,GACnC,OAAO,CAAC,IAAI,CAAC,CAsBf"}
|
package/dist/engine/runtime.js
CHANGED
|
@@ -155,13 +155,18 @@ export async function maybeRefreshCookies(err, options) {
|
|
|
155
155
|
return;
|
|
156
156
|
try {
|
|
157
157
|
const { refreshCookies } = await import("./cookie-refresh.js");
|
|
158
|
-
const
|
|
159
|
-
if (refreshed) {
|
|
160
|
-
process.stderr.write(`[cookie-refresh]
|
|
158
|
+
const outcome = await refreshCookies(options.site);
|
|
159
|
+
if (outcome.status === "refreshed") {
|
|
160
|
+
process.stderr.write(`[cookie-refresh] refreshed ${outcome.cookieCount} cookie(s) for ${options.site}; retry the command.\n`);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
process.stderr.write(`[cookie-refresh] could not refresh ${options.site} (${outcome.status}): ${outcome.detail}\n`);
|
|
161
164
|
}
|
|
162
165
|
}
|
|
163
166
|
catch {
|
|
164
|
-
|
|
167
|
+
// REASON: cookie-refresh is loaded dynamically as a best-effort recovery
|
|
168
|
+
// hint after an auth failure; a failure to load or run it must not mask the
|
|
169
|
+
// original PipelineError that is already being reported to the agent.
|
|
165
170
|
}
|
|
166
171
|
}
|
|
167
172
|
//# sourceMappingURL=runtime.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/engine/runtime.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/engine/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::engine::step-observer
|
|
3
|
+
* @does Per-step observation record + sink contract so a pipeline run is
|
|
4
|
+
* auditable step-by-step without changing the result/error envelope.
|
|
5
|
+
* @needs none (pure types + summarizer)
|
|
6
|
+
* @feeds src::engine::executor (emits), src::engine::session (persists)
|
|
7
|
+
* @breaks never throws; summarizeOutput is total over all inputs
|
|
8
|
+
* @invariants one observation per executed step; record() must not throw
|
|
9
|
+
* @side-effects none (pure)
|
|
10
|
+
* @perf O(1) per observation; summarizeOutput does not deep-traverse data
|
|
11
|
+
* @concurrency pure data; observer implementations own their own synchronization
|
|
12
|
+
* @test tests/unit/engine/step-observer.test.ts
|
|
13
|
+
* @stability experimental
|
|
14
|
+
* @since 2026-05-30
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* A bounded, leak-free description of a step's output. We record the SHAPE of
|
|
18
|
+
* `ctx.data`, never the data itself — raw payloads can be large and carry
|
|
19
|
+
* secrets (the full replay payload lives behind the recorder's `secret`
|
|
20
|
+
* channel, not here). `size` is the array length, string length, or object key
|
|
21
|
+
* count; absent for scalars.
|
|
22
|
+
*/
|
|
23
|
+
export interface StepOutputSummary {
|
|
24
|
+
kind: "array" | "object" | "string" | "number" | "boolean" | "empty";
|
|
25
|
+
size?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* One executed pipeline step's auditable outcome. Additive side-channel: it
|
|
29
|
+
* never alters the AgentEnvelope contract, it only makes the black box between
|
|
30
|
+
* steps observable.
|
|
31
|
+
*/
|
|
32
|
+
export interface StepObservation {
|
|
33
|
+
/** Zero-based index in the pipeline `steps[]` array. */
|
|
34
|
+
index: number;
|
|
35
|
+
/** The step action name (e.g. "fetch", "select"). */
|
|
36
|
+
action: string;
|
|
37
|
+
status: "ok" | "error";
|
|
38
|
+
/** Wall-clock duration of the step, milliseconds (monotonic clock). */
|
|
39
|
+
durationMs: number;
|
|
40
|
+
/** Shape of `ctx.data` after the step ran. Present when status === "ok". */
|
|
41
|
+
output?: StepOutputSummary;
|
|
42
|
+
/** PipelineError errorType (or coarse class) when status === "error". */
|
|
43
|
+
errorType?: string;
|
|
44
|
+
/** Human/agent-readable failure message when status === "error". */
|
|
45
|
+
errorMessage?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Sink for step observations. Implementations MUST NOT throw — observation is a
|
|
49
|
+
* side channel that can never break or alter a run (same invariant the run
|
|
50
|
+
* recorder documents). Callers are still expected to guard against a
|
|
51
|
+
* misbehaving observer.
|
|
52
|
+
*/
|
|
53
|
+
export interface StepObserver {
|
|
54
|
+
record(observation: StepObservation): void;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Classify the shape of pipeline data without traversing or copying it.
|
|
58
|
+
* Total: every input maps to exactly one summary. Pipeline data is JSON-shaped
|
|
59
|
+
* in practice; non-JSON references (function/symbol) are reported as "object".
|
|
60
|
+
*/
|
|
61
|
+
export declare function summarizeOutput(data: unknown): StepOutputSummary;
|
|
62
|
+
//# sourceMappingURL=step-observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-observer.d.ts","sourceRoot":"","sources":["../../src/engine/step-observer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;IACvB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;CAC5C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,CAWhE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::engine::step-observer
|
|
3
|
+
* @does Per-step observation record + sink contract so a pipeline run is
|
|
4
|
+
* auditable step-by-step without changing the result/error envelope.
|
|
5
|
+
* @needs none (pure types + summarizer)
|
|
6
|
+
* @feeds src::engine::executor (emits), src::engine::session (persists)
|
|
7
|
+
* @breaks never throws; summarizeOutput is total over all inputs
|
|
8
|
+
* @invariants one observation per executed step; record() must not throw
|
|
9
|
+
* @side-effects none (pure)
|
|
10
|
+
* @perf O(1) per observation; summarizeOutput does not deep-traverse data
|
|
11
|
+
* @concurrency pure data; observer implementations own their own synchronization
|
|
12
|
+
* @test tests/unit/engine/step-observer.test.ts
|
|
13
|
+
* @stability experimental
|
|
14
|
+
* @since 2026-05-30
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Classify the shape of pipeline data without traversing or copying it.
|
|
18
|
+
* Total: every input maps to exactly one summary. Pipeline data is JSON-shaped
|
|
19
|
+
* in practice; non-JSON references (function/symbol) are reported as "object".
|
|
20
|
+
*/
|
|
21
|
+
export function summarizeOutput(data) {
|
|
22
|
+
if (data === null || data === undefined)
|
|
23
|
+
return { kind: "empty" };
|
|
24
|
+
if (Array.isArray(data))
|
|
25
|
+
return { kind: "array", size: data.length };
|
|
26
|
+
const t = typeof data;
|
|
27
|
+
if (t === "string")
|
|
28
|
+
return { kind: "string", size: data.length };
|
|
29
|
+
if (t === "number" || t === "bigint")
|
|
30
|
+
return { kind: "number" };
|
|
31
|
+
if (t === "boolean")
|
|
32
|
+
return { kind: "boolean" };
|
|
33
|
+
if (t === "object") {
|
|
34
|
+
return { kind: "object", size: Object.keys(data).length };
|
|
35
|
+
}
|
|
36
|
+
return { kind: "object" };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=step-observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-observer.js","sourceRoot":"","sources":["../../src/engine/step-observer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA6CH;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAClE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACrE,MAAM,CAAC,GAAG,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAG,IAAe,CAAC,MAAM,EAAE,CAAC;IAC7E,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChE,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAChD,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC,MAAM,EAAE,CAAC;IACtE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-helpers.d.ts","sourceRoot":"","sources":["../../../src/engine/steps/browser-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAyBzD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"browser-helpers.d.ts","sourceRoot":"","sources":["../../../src/engine/steps/browser-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAyBzD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAoD5E;AAqFD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,WAAW,EACjB,KAAK,SAAO,EACZ,OAAO,SAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAkBf"}
|
|
@@ -35,20 +35,17 @@ export async function acquirePage(ctx) {
|
|
|
35
35
|
: await acquireConnectedDaemonPage();
|
|
36
36
|
if (daemonPage)
|
|
37
37
|
return daemonPage;
|
|
38
|
+
const userSessionPage = await acquireUserSessionCdpPage(ctx);
|
|
39
|
+
if (userSessionPage)
|
|
40
|
+
return userSessionPage;
|
|
38
41
|
}
|
|
39
42
|
else if (ctx.browserSession !== "cdp") {
|
|
40
43
|
const daemonPage = await acquireConnectedDaemonPage();
|
|
41
44
|
if (daemonPage)
|
|
42
45
|
return daemonPage;
|
|
43
46
|
}
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
if (rawPort) {
|
|
47
|
-
const p = parseInt(rawPort, 10);
|
|
48
|
-
if (Number.isInteger(p) && p >= 1 && p <= 65535) {
|
|
49
|
-
port = p;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
47
|
+
const { resolveCdpPort } = await import("../../browser/cdp-client.js");
|
|
48
|
+
const port = resolveCdpPort();
|
|
52
49
|
try {
|
|
53
50
|
const { BrowserPage: BP } = await import("../../browser/page.js");
|
|
54
51
|
const { injectStealth } = await import("../../browser/stealth.js");
|
|
@@ -86,6 +83,37 @@ export async function acquirePage(ctx) {
|
|
|
86
83
|
throw new Error(`Cannot connect to Chrome. Run "unicli browser start" first. (${err instanceof Error ? err.message : String(err)})`);
|
|
87
84
|
}
|
|
88
85
|
}
|
|
86
|
+
async function acquireUserSessionCdpPage(ctx) {
|
|
87
|
+
const { automationUserDataDirForProfile, readUserDataDirDebugPort, resolvePreferredLocalBrowserProfile, } = await import("../../browser/local-profiles.js");
|
|
88
|
+
const profile = resolvePreferredLocalBrowserProfile();
|
|
89
|
+
if (!profile)
|
|
90
|
+
return null;
|
|
91
|
+
const { resolveCdpPort } = await import("../../browser/cdp-client.js");
|
|
92
|
+
const { BrowserPage: BP } = await import("../../browser/page.js");
|
|
93
|
+
const { injectStealth } = await import("../../browser/stealth.js");
|
|
94
|
+
const { findAvailableCDPPort, isCDPAvailable, launchChrome } = await import("../../browser/launcher.js");
|
|
95
|
+
const userDataDir = automationUserDataDirForProfile(profile);
|
|
96
|
+
const recorded = readUserDataDirDebugPort(userDataDir);
|
|
97
|
+
const livePort = recorded.state === "recorded" &&
|
|
98
|
+
typeof recorded.port === "number" &&
|
|
99
|
+
(await isCDPAvailable(recorded.port))
|
|
100
|
+
? recorded.port
|
|
101
|
+
: null;
|
|
102
|
+
const port = livePort ?? (await findAvailableCDPPort(resolveCdpPort()));
|
|
103
|
+
if (livePort === null) {
|
|
104
|
+
await launchChrome(port, {
|
|
105
|
+
...(profile.browser_path_exists
|
|
106
|
+
? { browserPath: profile.browser_path }
|
|
107
|
+
: {}),
|
|
108
|
+
userDataDir,
|
|
109
|
+
reuseExisting: false,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const page = await BP.connect(port, { freshPage: true });
|
|
113
|
+
await injectStealth(page.sendCDP.bind(page));
|
|
114
|
+
await syncUserSessionCookies(page, ctx);
|
|
115
|
+
return page;
|
|
116
|
+
}
|
|
89
117
|
async function launchOptionsForContext(ctx) {
|
|
90
118
|
if (ctx.browserSession !== "user")
|
|
91
119
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-helpers.js","sourceRoot":"","sources":["../../../src/engine/steps/browser-helpers.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,iBAAiB,CAAC,OAAe;IAC9C,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QACnC,OAAO,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,CAA2B,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,2HAA2H;QAC3H,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,0BAA0B;IACvC,IAAI,CAAC;QACH,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB;YAAE,OAAO,IAAI,CAAC;QAC/D,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,oHAAoH;QACpH,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAoB;IACpD,IAAI,GAAG,CAAC,IAAI;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAE9B,IAAI,GAAG,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;QAClC,MAAM,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,GAAG;YAC7C,CAAC,CAAC,MAAM,iBAAiB,CAAC,IAAI,CAAC;YAC/B,CAAC,CAAC,MAAM,0BAA0B,EAAE,CAAC;QACzC,IAAI,UAAU;YAAE,OAAO,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-helpers.js","sourceRoot":"","sources":["../../../src/engine/steps/browser-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-text.d.ts","sourceRoot":"","sources":["../../../src/engine/steps/fetch-text.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetch-text.d.ts","sourceRoot":"","sources":["../../../src/engine/steps/fetch-text.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,eAAe,EAAiB,MAAM,gBAAgB,CAAC;AAUrE,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAiIpB,wBAAsB,aAAa,CACjC,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,WAAW,EACnB,SAAS,SAAK,GACb,OAAO,CAAC,eAAe,CAAC,CA4D1B"}
|
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
//! @owner src::engine::steps::fetch_text
|
|
2
|
+
//! @does HTTP request returning raw text; optional session-cookie capture and bounded endpoint rotation
|
|
3
|
+
//! @needs ./fetch (FetchConfig), ../cookie-capture, ../ssrf, ../template, ../runtime-resource-guard
|
|
4
|
+
//! @feeds ./index (barrel), pipeline executor via registry "fetch_text"
|
|
5
|
+
//! @breaks PipelineError on http_error / network_error after retries
|
|
6
|
+
//! @invariants every fetched URL (incl. rotation candidates) passes assertSafeRequestUrl; cookie capture is host-scoped; rotation bounded by rotate_urls.length
|
|
7
|
+
//! @side-effects network I/O
|
|
8
|
+
//! @perf one fetch per attempt; rotation adds at most rotate_urls.length fetches
|
|
9
|
+
//! @concurrency stateless per call
|
|
10
|
+
//! @test tests/unit/engine/steps/fetch-text-session.test.ts
|
|
11
|
+
//! @stability stable
|
|
12
|
+
//! @since 2026-05-30 (capture/rotation added)
|
|
1
13
|
import { USER_AGENT } from "../../constants.js";
|
|
2
14
|
import { registerStep } from "../step-registry.js";
|
|
3
15
|
import { PipelineError } from "../executor.js";
|
|
@@ -5,32 +17,21 @@ import { assertSafeRequestUrl } from "../ssrf.js";
|
|
|
5
17
|
import { evalTemplate } from "../template.js";
|
|
6
18
|
import { getProxyAgent } from "../proxy.js";
|
|
7
19
|
import { assertRuntimeNetworkAllowed } from "../runtime-resource-guard.js";
|
|
20
|
+
import { parseSetCookiePairs, mergeCookieHeader, sameRegistrableHost, } from "../cookie-capture.js";
|
|
8
21
|
import { networkAccessForMethod, normalizeFetchAttempts, } from "./fetch.js";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
url,
|
|
17
|
-
access: networkAccessForMethod(config.method),
|
|
18
|
-
});
|
|
19
|
-
if (config.params) {
|
|
20
|
-
const params = new URLSearchParams();
|
|
21
|
-
for (const [k, v] of Object.entries(config.params)) {
|
|
22
|
-
params.set(k, evalTemplate(String(v), ctx));
|
|
23
|
-
}
|
|
24
|
-
url += (url.includes("?") ? "&" : "?") + params.toString();
|
|
22
|
+
/** Append resolved `params` to a URL, preserving an existing query string. */
|
|
23
|
+
function withParams(url, config, ctx) {
|
|
24
|
+
if (!config.params)
|
|
25
|
+
return url;
|
|
26
|
+
const params = new URLSearchParams();
|
|
27
|
+
for (const [k, v] of Object.entries(config.params)) {
|
|
28
|
+
params.set(k, evalTemplate(String(v), ctx));
|
|
25
29
|
}
|
|
30
|
+
return url + (url.includes("?") ? "&" : "?") + params.toString();
|
|
31
|
+
}
|
|
32
|
+
/** One request with the existing retry/backoff/error contract. */
|
|
33
|
+
async function fetchTextOnce(requestUrl, config, headers, stepIndex) {
|
|
26
34
|
const method = config.method ?? "GET";
|
|
27
|
-
const headers = {
|
|
28
|
-
"User-Agent": USER_AGENT,
|
|
29
|
-
...config.headers,
|
|
30
|
-
};
|
|
31
|
-
if (ctx.cookieHeader) {
|
|
32
|
-
headers["Cookie"] = ctx.cookieHeader;
|
|
33
|
-
}
|
|
34
35
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- dispatcher from undici not in standard RequestInit
|
|
35
36
|
const fetchInit = { method, headers };
|
|
36
37
|
const ftAgent = getProxyAgent();
|
|
@@ -40,10 +41,18 @@ export async function stepFetchText(ctx, config, stepIndex = -1) {
|
|
|
40
41
|
const baseDelay = config.backoff ?? 1000;
|
|
41
42
|
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
42
43
|
try {
|
|
43
|
-
const resp = await fetch(
|
|
44
|
+
const resp = await fetch(requestUrl, fetchInit);
|
|
44
45
|
if (resp.ok) {
|
|
45
46
|
const text = await resp.text();
|
|
46
|
-
|
|
47
|
+
const getSetCookie = resp.headers.getSetCookie;
|
|
48
|
+
const setCookieLines = typeof getSetCookie === "function"
|
|
49
|
+
? getSetCookie.call(resp.headers)
|
|
50
|
+
: [];
|
|
51
|
+
return {
|
|
52
|
+
text,
|
|
53
|
+
finalUrl: resp.url || requestUrl,
|
|
54
|
+
setCookieLines,
|
|
55
|
+
};
|
|
47
56
|
}
|
|
48
57
|
const retryable = resp.status === 429 ||
|
|
49
58
|
resp.status === 500 ||
|
|
@@ -54,14 +63,14 @@ export async function stepFetchText(ctx, config, stepIndex = -1) {
|
|
|
54
63
|
await new Promise((r) => setTimeout(r, baseDelay * 2 ** (attempt - 1)));
|
|
55
64
|
continue;
|
|
56
65
|
}
|
|
57
|
-
throw new PipelineError(`HTTP ${resp.status} ${resp.statusText} from ${
|
|
66
|
+
throw new PipelineError(`HTTP ${resp.status} ${resp.statusText} from ${requestUrl}`, {
|
|
58
67
|
step: stepIndex,
|
|
59
68
|
action: "fetch_text",
|
|
60
|
-
config: { url, method },
|
|
69
|
+
config: { url: requestUrl, method },
|
|
61
70
|
errorType: "http_error",
|
|
62
|
-
url,
|
|
71
|
+
url: requestUrl,
|
|
63
72
|
statusCode: resp.status,
|
|
64
|
-
suggestion: `Check if the URL is still valid: ${
|
|
73
|
+
suggestion: `Check if the URL is still valid: ${requestUrl}`,
|
|
65
74
|
retryable,
|
|
66
75
|
alternatives: resp.status === 401 || resp.status === 403
|
|
67
76
|
? ["unicli auth setup <site>"]
|
|
@@ -75,13 +84,13 @@ export async function stepFetchText(ctx, config, stepIndex = -1) {
|
|
|
75
84
|
}
|
|
76
85
|
if (isLastAttempt) {
|
|
77
86
|
const message = err instanceof Error ? err.message : String(err);
|
|
78
|
-
throw new PipelineError(`fetch_text failed for ${
|
|
87
|
+
throw new PipelineError(`fetch_text failed for ${requestUrl}: ${message}`, {
|
|
79
88
|
step: stepIndex,
|
|
80
89
|
action: "fetch_text",
|
|
81
|
-
config: { url, method },
|
|
90
|
+
config: { url: requestUrl, method },
|
|
82
91
|
errorType: "network_error",
|
|
83
|
-
url,
|
|
84
|
-
suggestion: `Network fetch failed. Retry or check connectivity to: ${
|
|
92
|
+
url: requestUrl,
|
|
93
|
+
suggestion: `Network fetch failed. Retry or check connectivity to: ${requestUrl}`,
|
|
85
94
|
retryable: true,
|
|
86
95
|
alternatives: [],
|
|
87
96
|
});
|
|
@@ -91,5 +100,69 @@ export async function stepFetchText(ctx, config, stepIndex = -1) {
|
|
|
91
100
|
}
|
|
92
101
|
throw new Error("fetch_text: unreachable");
|
|
93
102
|
}
|
|
103
|
+
/** Does the parsed body carry the rotation signal field? */
|
|
104
|
+
function hasRotationSignal(text, field) {
|
|
105
|
+
try {
|
|
106
|
+
const parsed = JSON.parse(text);
|
|
107
|
+
return (parsed !== null &&
|
|
108
|
+
typeof parsed === "object" &&
|
|
109
|
+
field in parsed);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export async function stepFetchText(ctx, config, stepIndex = -1) {
|
|
116
|
+
const baseUrl = evalTemplate(config.url, ctx);
|
|
117
|
+
// Build the ordered candidate list. Without rotate_urls it is a single URL.
|
|
118
|
+
const candidates = config.rotate_urls && config.rotate_urls.length > 0
|
|
119
|
+
? config.rotate_urls.map((u) => evalTemplate(u, ctx))
|
|
120
|
+
: [baseUrl];
|
|
121
|
+
const headers = {
|
|
122
|
+
"User-Agent": USER_AGENT,
|
|
123
|
+
...config.headers,
|
|
124
|
+
};
|
|
125
|
+
if (ctx.cookieHeader) {
|
|
126
|
+
headers["Cookie"] = ctx.cookieHeader;
|
|
127
|
+
}
|
|
128
|
+
let cookieHeader = ctx.cookieHeader;
|
|
129
|
+
let lastResult = null;
|
|
130
|
+
for (let i = 0; i < candidates.length; i += 1) {
|
|
131
|
+
const requestUrl = withParams(candidates[i], config, ctx);
|
|
132
|
+
assertSafeRequestUrl(requestUrl);
|
|
133
|
+
assertRuntimeNetworkAllowed(ctx, {
|
|
134
|
+
action: "fetch_text",
|
|
135
|
+
step: stepIndex,
|
|
136
|
+
config,
|
|
137
|
+
url: requestUrl,
|
|
138
|
+
access: networkAccessForMethod(config.method),
|
|
139
|
+
});
|
|
140
|
+
if (cookieHeader)
|
|
141
|
+
headers["Cookie"] = cookieHeader;
|
|
142
|
+
const result = await fetchTextOnce(requestUrl, config, headers, stepIndex);
|
|
143
|
+
lastResult = result;
|
|
144
|
+
// Capture session cookies (host-scoped) so later steps can send them.
|
|
145
|
+
if (config.capture_cookies && result.setCookieLines.length > 0) {
|
|
146
|
+
if (sameRegistrableHost(requestUrl, result.finalUrl)) {
|
|
147
|
+
const captured = parseSetCookiePairs(result.setCookieLines);
|
|
148
|
+
const merged = mergeCookieHeader(cookieHeader, captured);
|
|
149
|
+
cookieHeader = merged === "" ? cookieHeader : merged;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Rotation: if the body signals the wrong endpoint and another candidate
|
|
153
|
+
// remains, advance. Bounded by candidates.length — cannot loop forever.
|
|
154
|
+
const isLastCandidate = i === candidates.length - 1;
|
|
155
|
+
if (config.rotate_on_field &&
|
|
156
|
+
!isLastCandidate &&
|
|
157
|
+
hasRotationSignal(result.text, config.rotate_on_field)) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
const out = { ...ctx, data: lastResult?.text ?? "" };
|
|
163
|
+
if (cookieHeader !== undefined)
|
|
164
|
+
out.cookieHeader = cookieHeader;
|
|
165
|
+
return out;
|
|
166
|
+
}
|
|
94
167
|
registerStep("fetch_text", stepFetchText);
|
|
95
168
|
//# sourceMappingURL=fetch-text.js.map
|