@prestyj/cli 5.28.1 → 5.29.0
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/assets/motion/bin/contact-sheet.mjs +9 -3
- package/assets/motion/bin/cues.mjs +337 -0
- package/assets/motion/bin/library.mjs +53 -10
- package/assets/motion/bin/motion-blur.mjs +943 -0
- package/assets/motion/bin/motion-check.mjs +354 -3
- package/assets/motion/bin/music-fit.mjs +436 -0
- package/assets/motion/bin/pdf-extract.mjs +22 -10
- package/assets/motion/bin/reference-study.mjs +346 -0
- package/assets/motion/bin/score-synth.mjs +1052 -93
- package/assets/motion/library/README.md +50 -14
- package/assets/motion/library/kit/moves.js +1981 -0
- package/assets/motion/library/library.json +232 -0
- package/assets/motion/library/pieces/camera-rig/meta.json +13 -0
- package/assets/motion/library/pieces/camera-rig/piece.html +153 -0
- package/assets/motion/library/pieces/camera-rig/preview.jpg +0 -0
- package/assets/motion/library/pieces/chain-knock/meta.json +13 -0
- package/assets/motion/library/pieces/chain-knock/piece.html +195 -0
- package/assets/motion/library/pieces/chain-knock/preview.jpg +0 -0
- package/assets/motion/library/pieces/gather-to-logo/meta.json +13 -0
- package/assets/motion/library/pieces/gather-to-logo/piece.html +159 -0
- package/assets/motion/library/pieces/gather-to-logo/preview.jpg +0 -0
- package/assets/motion/library/pieces/morph-carry/meta.json +13 -0
- package/assets/motion/library/pieces/morph-carry/piece.html +173 -0
- package/assets/motion/library/pieces/morph-carry/preview.jpg +0 -0
- package/assets/motion/library/pieces/one-shape-journey/meta.json +13 -0
- package/assets/motion/library/pieces/one-shape-journey/piece.html +195 -0
- package/assets/motion/library/pieces/one-shape-journey/preview.jpg +0 -0
- package/assets/motion/library/pieces/open-from-subject/meta.json +13 -0
- package/assets/motion/library/pieces/open-from-subject/piece.html +168 -0
- package/assets/motion/library/pieces/open-from-subject/preview.jpg +0 -0
- package/assets/motion/library/pieces/request-to-result/meta.json +13 -0
- package/assets/motion/library/pieces/request-to-result/piece.html +212 -0
- package/assets/motion/library/pieces/request-to-result/preview.jpg +0 -0
- package/assets/motion/library/pieces/scale-dive/meta.json +13 -0
- package/assets/motion/library/pieces/scale-dive/piece.html +321 -0
- package/assets/motion/library/pieces/scale-dive/preview.jpg +0 -0
- package/assets/motion/library/pieces/screen-replica-steps/meta.json +13 -0
- package/assets/motion/library/pieces/screen-replica-steps/piece.html +366 -0
- package/assets/motion/library/pieces/screen-replica-steps/preview.jpg +0 -0
- package/assets/motion/library/pieces/zoom-into-card/meta.json +13 -0
- package/assets/motion/library/pieces/zoom-into-card/piece.html +179 -0
- package/assets/motion/library/pieces/zoom-into-card/preview.jpg +0 -0
- package/assets/motion/library/sheets/diagram.jpg +0 -0
- package/assets/motion/library/sheets/frame.jpg +0 -0
- package/assets/motion/library/sheets/transition.jpg +0 -0
- package/assets/motion/library/sheets/ui.jpg +0 -0
- package/assets/motion/references/build-sheet.md +206 -0
- package/assets/motion/references/runtime/determinism-rules.md +1 -1
- package/assets/motion/references/runtime/gsap-easing-and-stagger.md +29 -29
- package/assets/motion/references/runtime/inputs-and-assets.md +7 -12
- package/assets/motion/references/runtime/lint-validate-inspect.md +3 -3
- package/assets/motion/references/runtime/minimal-composition.md +1 -1
- package/assets/motion/references/runtime/preview-render.md +3 -3
- package/assets/motion/skills/app-walkthrough/SKILL.md +66 -0
- package/assets/motion/skills/before-after/SKILL.md +53 -0
- package/assets/motion/skills/brand-kit/SKILL.md +3 -3
- package/assets/motion/skills/dev-tool-video/SKILL.md +57 -0
- package/assets/motion/skills/launch-video/SKILL.md +62 -0
- package/assets/motion/skills/match-reference/SKILL.md +58 -0
- package/assets/motion/skills/motion/SKILL.md +78 -85
- package/assets/motion/skills/source-ingest/SKILL.md +17 -6
- package/assets/motion/skills/website-video/SKILL.md +59 -0
- package/assets/skills/bulletproof/SKILL.md +36 -11
- package/assets/skills/bulletproof/references/agent-surface.md +19 -9
- package/assets/skills/bulletproof/references/audit-protocol.md +20 -5
- package/assets/skills/bulletproof/references/platform-playbooks.md +5 -4
- package/assets/skills/bulletproof/references/provenance.md +26 -1
- package/assets/skills/bulletproof/references/secure-defaults.md +6 -5
- package/assets/skills/bulletproof/references/supply-chain.md +21 -17
- package/assets/skills/bulletproof/references/threat-landscape.md +28 -26
- package/assets/skills/bulletproof/references/verification.md +2 -0
- package/assets/skills/clarify/SKILL.md +25 -16
- package/assets/skills/code-review/SKILL.md +71 -13
- package/assets/skills/code-review/references/agent-diffs.md +27 -0
- package/assets/skills/code-review/references/tests.md +19 -0
- package/assets/skills/compliance-guard/SKILL.md +20 -5
- package/assets/skills/compliance-guard/references/artifacts.md +1 -1
- package/assets/skills/compliance-guard/references/eu-uk.md +16 -16
- package/assets/skills/compliance-guard/references/lawsuit-vectors.md +5 -5
- package/assets/skills/compliance-guard/references/provenance.md +41 -2
- package/assets/skills/compliance-guard/references/sector-gates.md +3 -3
- package/assets/skills/compliance-guard/references/security-baseline.md +2 -2
- package/assets/skills/compliance-guard/references/trigger-map.md +5 -5
- package/assets/skills/compliance-guard/references/us.md +27 -21
- package/assets/skills/durable/SKILL.md +87 -79
- package/assets/skills/durable/references/agent-db-safety.md +69 -0
- package/assets/skills/durable/references/backups-and-runtime.md +19 -12
- package/assets/skills/durable/references/migrations-and-schema.md +13 -6
- package/assets/skills/evidence-led-ui/SKILL.md +69 -127
- package/assets/skills/evidence-led-ui/references/anti-defaults.md +107 -208
- package/assets/skills/evidence-led-ui/references/direction.md +124 -0
- package/assets/skills/evidence-led-ui/references/production-contract.md +8 -0
- package/assets/skills/evidence-led-ui/references/provenance.md +24 -1
- package/assets/skills/lean/SKILL.md +90 -71
- package/assets/skills/lean/references/memory-and-processes.md +3 -2
- package/assets/skills/lean/references/playbooks.md +37 -12
- package/assets/skills/refactoring/SKILL.md +24 -3
- package/assets/skills/refactoring/references/agent-pitfalls.md +4 -1
- package/assets/skills/refactoring/references/legacy.md +21 -0
- package/assets/skills/root-cause/SKILL.md +20 -10
- package/assets/skills/shared-language/SKILL.md +16 -14
- package/assets/skills/tdd/SKILL.md +27 -15
- package/dist/app-sidecar.js +203 -47
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli.js +17 -26
- package/dist/cli.js.map +1 -1
- package/dist/core/acceptance-checks.d.ts +48 -0
- package/dist/core/acceptance-checks.js +144 -0
- package/dist/core/acceptance-checks.js.map +1 -0
- package/dist/core/agent-session.d.ts +106 -72
- package/dist/core/agent-session.js +539 -399
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents.d.ts +6 -5
- package/dist/core/agents.js.map +1 -1
- package/dist/core/ask-user.d.ts +90 -8
- package/dist/core/ask-user.js +124 -13
- package/dist/core/ask-user.js.map +1 -1
- package/dist/core/bundled-agents.js +1 -3
- package/dist/core/bundled-agents.js.map +1 -1
- package/dist/core/cache-diagnostics.d.ts +68 -0
- package/dist/core/cache-diagnostics.js +196 -0
- package/dist/core/cache-diagnostics.js.map +1 -0
- package/dist/core/cache-expiry.d.ts +87 -0
- package/dist/core/cache-expiry.js +111 -0
- package/dist/core/cache-expiry.js.map +1 -0
- package/dist/core/compaction/compactor.js +78 -48
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/plan-step-policy.d.ts +46 -0
- package/dist/core/compaction/plan-step-policy.js +57 -0
- package/dist/core/compaction/plan-step-policy.js.map +1 -0
- package/dist/core/destructive-git-guard.d.ts +90 -0
- package/dist/core/destructive-git-guard.js +871 -0
- package/dist/core/destructive-git-guard.js.map +1 -0
- package/dist/core/event-bus.d.ts +3 -0
- package/dist/core/event-bus.js +5 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/injection-detect.d.ts +38 -0
- package/dist/core/injection-detect.js +232 -0
- package/dist/core/injection-detect.js.map +1 -0
- package/dist/core/keep-awake.d.ts +88 -0
- package/dist/core/keep-awake.js +251 -0
- package/dist/core/keep-awake.js.map +1 -0
- package/dist/core/mcp/client.d.ts +72 -0
- package/dist/core/mcp/client.js +264 -41
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/content.js +6 -2
- package/dist/core/mcp/content.js.map +1 -1
- package/dist/core/mcp/store.d.ts +6 -1
- package/dist/core/mcp/store.js +12 -1
- package/dist/core/mcp/store.js.map +1 -1
- package/dist/core/mcp/types.d.ts +18 -0
- package/dist/core/model-unavailable.d.ts +14 -0
- package/dist/core/model-unavailable.js +23 -0
- package/dist/core/model-unavailable.js.map +1 -0
- package/dist/core/node-debugger.d.ts +148 -0
- package/dist/core/node-debugger.js +642 -0
- package/dist/core/node-debugger.js.map +1 -0
- package/dist/core/package-threats.d.ts +18 -0
- package/dist/core/package-threats.js +168 -0
- package/dist/core/package-threats.js.map +1 -0
- package/dist/core/persistent-shell.d.ts +58 -6
- package/dist/core/persistent-shell.js +331 -49
- package/dist/core/persistent-shell.js.map +1 -1
- package/dist/core/process-manager.d.ts +14 -0
- package/dist/core/process-manager.js +61 -0
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/progress/git-xp.js +8 -14
- package/dist/core/progress/git-xp.js.map +1 -1
- package/dist/core/session-history.d.ts +12 -0
- package/dist/core/session-history.js +27 -0
- package/dist/core/session-history.js.map +1 -1
- package/dist/core/session-manager.d.ts +13 -1
- package/dist/core/session-manager.js +38 -18
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-summary-index.d.ts +37 -0
- package/dist/core/session-summary-index.js +172 -0
- package/dist/core/session-summary-index.js.map +1 -0
- package/dist/core/settings-manager.d.ts +2 -0
- package/dist/core/settings-manager.js +10 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/shell-threats-popular-packages.d.ts +11 -0
- package/dist/core/shell-threats-popular-packages.js +675 -0
- package/dist/core/shell-threats-popular-packages.js.map +1 -0
- package/dist/core/shell-threats.d.ts +8 -0
- package/dist/core/shell-threats.js +186 -0
- package/dist/core/shell-threats.js.map +1 -0
- package/dist/core/skills.js +3 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/stream-rules.d.ts +30 -0
- package/dist/core/stream-rules.js +151 -0
- package/dist/core/stream-rules.js.map +1 -0
- package/dist/core/subagent-manager.d.ts +20 -5
- package/dist/core/subagent-manager.js +22 -8
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-receipt.d.ts +54 -0
- package/dist/core/subagent-receipt.js +276 -0
- package/dist/core/subagent-receipt.js.map +1 -0
- package/dist/core/subagent-turn-record.d.ts +2 -0
- package/dist/core/subagent-turn-record.js.map +1 -1
- package/dist/core/test-impact.d.ts +73 -0
- package/dist/core/test-impact.js +467 -0
- package/dist/core/test-impact.js.map +1 -0
- package/dist/core/thinking-level.d.ts +1 -1
- package/dist/core/thinking-level.js +1 -1
- package/dist/core/thinking-level.js.map +1 -1
- package/dist/core/verification-gate.d.ts +2 -0
- package/dist/core/verification-gate.js +4 -0
- package/dist/core/verification-gate.js.map +1 -1
- package/dist/core/verification-snapshot.js +3 -5
- package/dist/core/verification-snapshot.js.map +1 -1
- package/dist/core/workspace-guard.d.ts +18 -7
- package/dist/core/workspace-guard.js +227 -60
- package/dist/core/workspace-guard.js.map +1 -1
- package/dist/interactive.js +2 -1
- package/dist/interactive.js.map +1 -1
- package/dist/modes/subagent-worker-mode.js +34 -6
- package/dist/modes/subagent-worker-mode.js.map +1 -1
- package/dist/motion-agent/motion-agent.d.ts +6 -2
- package/dist/motion-agent/motion-agent.js +5 -7
- package/dist/motion-agent/motion-agent.js.map +1 -1
- package/dist/motion-agent/motion-prompt.d.ts +1 -1
- package/dist/motion-agent/motion-prompt.js +14 -19
- package/dist/motion-agent/motion-prompt.js.map +1 -1
- package/dist/motion-agent/motion-review.d.ts +10 -3
- package/dist/motion-agent/motion-review.js +15 -7
- package/dist/motion-agent/motion-review.js.map +1 -1
- package/dist/motion-agent/motion-studio-context.js +1 -1
- package/dist/motion-agent/motion-studio-context.js.map +1 -1
- package/dist/system-prompt.js +3 -1
- package/dist/system-prompt.js.map +1 -1
- package/dist/test-support/keep-alive.d.ts +14 -0
- package/dist/test-support/keep-alive.js +17 -0
- package/dist/test-support/keep-alive.js.map +1 -0
- package/dist/tools/ask-user.js +3 -3
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/bash-read-evidence.d.ts +10 -0
- package/dist/tools/bash-read-evidence.js +133 -0
- package/dist/tools/bash-read-evidence.js.map +1 -0
- package/dist/tools/bash.d.ts +10 -1
- package/dist/tools/bash.js +115 -7
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/debug.d.ts +54 -0
- package/dist/tools/debug.js +233 -0
- package/dist/tools/debug.js.map +1 -0
- package/dist/tools/edit.js +12 -4
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/goals.d.ts +1 -1
- package/dist/tools/index.d.ts +19 -2
- package/dist/tools/index.js +47 -7
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/prompt-hints.js +2 -0
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/read-tracker.d.ts +5 -0
- package/dist/tools/read-tracker.js +19 -9
- package/dist/tools/read-tracker.js.map +1 -1
- package/dist/tools/read.js +3 -2
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/skill.js +5 -0
- package/dist/tools/skill.js.map +1 -1
- package/dist/tools/subagent-control.js +44 -8
- package/dist/tools/subagent-control.js.map +1 -1
- package/dist/tools/subagent-shared.d.ts +29 -8
- package/dist/tools/subagent-shared.js +45 -14
- package/dist/tools/subagent-shared.js.map +1 -1
- package/dist/tools/subagent.d.ts +8 -2
- package/dist/tools/subagent.js +28 -10
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/task-output.js +3 -2
- package/dist/tools/task-output.js.map +1 -1
- package/dist/tools/task-send.d.ts +1 -1
- package/dist/tools/task-send.js +15 -1
- package/dist/tools/task-send.js.map +1 -1
- package/dist/tools/tool-tiers.d.ts +2 -2
- package/dist/tools/tool-tiers.js +3 -2
- package/dist/tools/tool-tiers.js.map +1 -1
- package/dist/tools/truncate.d.ts +21 -0
- package/dist/tools/truncate.js +187 -0
- package/dist/tools/truncate.js.map +1 -1
- package/dist/tools/ui-adopt.js +2 -0
- package/dist/tools/ui-adopt.js.map +1 -1
- package/dist/ui/App.d.ts +0 -4
- package/dist/ui/App.js +5 -28
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/components/ActivityIndicator.js +1 -0
- package/dist/ui/components/ActivityIndicator.js.map +1 -1
- package/dist/ui/hooks/useAgentLoop.d.ts +1 -8
- package/dist/ui/hooks/useAgentLoop.js +1 -119
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/render.d.ts +0 -4
- package/dist/ui/render.js +0 -2
- package/dist/ui/render.js.map +1 -1
- package/dist/utils/git.d.ts +77 -0
- package/dist/utils/git.js +285 -21
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/github-ci.js +2 -1
- package/dist/utils/github-ci.js.map +1 -1
- package/dist/utils/github.js +11 -9
- package/dist/utils/github.js.map +1 -1
- package/dist/utils/image.d.ts +14 -0
- package/dist/utils/image.js +16 -0
- package/dist/utils/image.js.map +1 -1
- package/dist/utils/process.d.ts +20 -0
- package/dist/utils/process.js +98 -0
- package/dist/utils/process.js.map +1 -1
- package/package.json +5 -5
- package/assets/motion/references/motion-language.md +0 -128
- package/assets/motion/skills/video-qa/SKILL.md +0 -89
- package/dist/core/ideal-review-subagent.d.ts +0 -56
- package/dist/core/ideal-review-subagent.js +0 -112
- package/dist/core/ideal-review-subagent.js.map +0 -1
- package/dist/core/ideal-review.d.ts +0 -82
- package/dist/core/ideal-review.js +0 -242
- package/dist/core/ideal-review.js.map +0 -1
- package/dist/motion-agent/motion-check-tool.d.ts +0 -35
- package/dist/motion-agent/motion-check-tool.js +0 -514
- package/dist/motion-agent/motion-check-tool.js.map +0 -1
package/dist/core/agents.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { BUNDLED_AGENTS } from "./bundled-agents.js";
|
|
2
2
|
/**
|
|
3
|
-
* Which model a sub-agent runs on.
|
|
3
|
+
* Which model a sub-agent runs on. Every sub-agent runs at the LOWEST thinking
|
|
4
|
+
* level of that model (never off), whatever the parent uses.
|
|
4
5
|
*
|
|
5
|
-
* - `"inherit"` (default) — the parent's model, so a delegated task is
|
|
6
|
-
*
|
|
7
|
-
* - `"fast"` —
|
|
8
|
-
*
|
|
6
|
+
* - `"inherit"` (default) — the parent's model, so a delegated task is never
|
|
7
|
+
* moved to a weaker model.
|
|
8
|
+
* - `"fast"` — legacy alias of `"inherit"`, still accepted so older agent files
|
|
9
|
+
* load. It no longer swaps in a cheaper model.
|
|
9
10
|
* - any other string — an explicit model id.
|
|
10
11
|
*/
|
|
11
12
|
export type AgentModelPreference = "inherit" | "fast" | (string & {});
|
package/dist/core/agents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/core/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/core/agents.ts"],"names":[],"mappings":"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"}
|
package/dist/core/ask-user.d.ts
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
|
-
import { type ParkedRequests } from "./parked-requests.js";
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* Soft deadline for an `ask_user` call when someone is likely watching (a
|
|
3
|
+
* plain interactive run). Past it the tool stops blocking: the agent proceeds
|
|
4
|
+
* on its best guess while the question stays answerable in the app.
|
|
5
|
+
*/
|
|
6
|
+
export declare const ASK_USER_INTERACTIVE_DEADLINE_MS: number;
|
|
7
|
+
/**
|
|
8
|
+
* Soft deadline when nobody is watching — autopilot (Nolan), task run-all
|
|
9
|
+
* sweeps and scheduled prompts. Short, so an unattended run does not stall.
|
|
10
|
+
*/
|
|
11
|
+
export declare const ASK_USER_UNATTENDED_DEADLINE_MS: number;
|
|
12
|
+
/**
|
|
13
|
+
* The longest an `ask_user` call can block (the largest soft deadline). The
|
|
14
|
+
* tool's own execution timeout is derived from this.
|
|
6
15
|
*/
|
|
7
16
|
export declare const ASK_USER_TIMEOUT_MS: number;
|
|
17
|
+
/** Pick the soft deadline for a run, by whether a human is likely watching. */
|
|
18
|
+
export declare function askSoftDeadlineMs(unattended: boolean): number;
|
|
8
19
|
/** One selectable answer. `value` is what the agent gets back; `label` is UI. */
|
|
9
20
|
export interface AskOption {
|
|
10
21
|
label: string;
|
|
@@ -45,13 +56,62 @@ export type AskUserResult = {
|
|
|
45
56
|
| {
|
|
46
57
|
action: "cancel";
|
|
47
58
|
superseded?: boolean;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The soft deadline passed with no answer. The question stays open; a later
|
|
62
|
+
* answer is delivered to the agent as a message (see `onLateAnswer`).
|
|
63
|
+
*/
|
|
64
|
+
| {
|
|
65
|
+
action: "deferred";
|
|
48
66
|
};
|
|
49
|
-
|
|
50
|
-
export
|
|
67
|
+
/** An answer that arrived after the tool call had already moved on. */
|
|
68
|
+
export interface LateAskAnswer {
|
|
69
|
+
prompt: AskUserPrompt;
|
|
70
|
+
answers: Record<string, string | string[]>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Questions parked on the user. A question is either *pending* (the tool call
|
|
74
|
+
* is blocked on it) or *deferred* (its soft deadline passed, the agent moved
|
|
75
|
+
* on, but the user can still answer it).
|
|
76
|
+
*/
|
|
77
|
+
export interface AskUserBridge {
|
|
78
|
+
/** Park a question: broadcasts it, resolves on answer, cancel or soft deadline. */
|
|
79
|
+
park: (request: AskUserRequest) => Promise<AskUserResult>;
|
|
80
|
+
/**
|
|
81
|
+
* Answer or dismiss an open question. A deferred question's answer goes to
|
|
82
|
+
* `onLateAnswer`. False when the id is not open (settled, superseded, closed).
|
|
83
|
+
*/
|
|
84
|
+
settle: (id: string, result: AskUserResult) => boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Release every pending question with `result` (default: cancel) and close
|
|
87
|
+
* every deferred one — for run abort, a superseding user message, teardown.
|
|
88
|
+
*/
|
|
89
|
+
cancelAll: (result?: AskUserResult) => void;
|
|
90
|
+
/** Close deferred questions without touching a pending one (session reset). */
|
|
91
|
+
closeDeferred: () => void;
|
|
92
|
+
/** Questions the turn is currently blocked on. */
|
|
93
|
+
readonly pendingCount: number;
|
|
94
|
+
/** Questions past their soft deadline that can still be answered. */
|
|
95
|
+
readonly deferredCount: number;
|
|
96
|
+
}
|
|
97
|
+
export interface AskUserBridgeOptions {
|
|
51
98
|
broadcast: (prompt: AskUserPrompt) => void;
|
|
99
|
+
/** Soft deadline in ms, read when each question is parked. */
|
|
100
|
+
timeoutMs?: number | (() => number);
|
|
101
|
+
/** The soft deadline passed: the agent proceeds, the question stays open. */
|
|
52
102
|
onTimeout?: (prompt: AskUserPrompt) => void;
|
|
53
|
-
|
|
54
|
-
|
|
103
|
+
/** A deferred question was answered. Called at most once per question. */
|
|
104
|
+
onLateAnswer?: (late: LateAskAnswer) => void;
|
|
105
|
+
/** Deferred questions closed without an answer (superseded, cancelled, reset). */
|
|
106
|
+
onClosed?: (ids: string[]) => void;
|
|
107
|
+
}
|
|
108
|
+
export declare function createAskUserBridge(opts: AskUserBridgeOptions): AskUserBridge;
|
|
109
|
+
/**
|
|
110
|
+
* What the model reads when the soft deadline passes. Short on purpose; the
|
|
111
|
+
* safety line is the part that matters — a guessed answer must never license
|
|
112
|
+
* an action the user cannot take back.
|
|
113
|
+
*/
|
|
114
|
+
export declare const ASK_DEFERRED_RESULT: string;
|
|
55
115
|
/**
|
|
56
116
|
* Render the user's answers as the tool result the model reads.
|
|
57
117
|
*
|
|
@@ -60,3 +120,25 @@ export declare function createAskUserBridge(opts: {
|
|
|
60
120
|
* rather than silently missing.
|
|
61
121
|
*/
|
|
62
122
|
export declare function formatAskResult(questions: AskQuestion[], result: AskUserResult): string;
|
|
123
|
+
/**
|
|
124
|
+
* Frame a late answer as a message to the agent. It names the question it
|
|
125
|
+
* answers, because by now the agent has moved on and may have asked others.
|
|
126
|
+
*/
|
|
127
|
+
export declare function formatLateAnswer(late: LateAskAnswer): string;
|
|
128
|
+
/** Where a late answer goes: the host's existing user-message queue. */
|
|
129
|
+
export interface LateAnswerSink {
|
|
130
|
+
/** Queue a user message; drained as mid-run steering by a live run. */
|
|
131
|
+
queueMessage: (text: string) => number;
|
|
132
|
+
/** True while a run (or a run-owning cycle) can still drain the queue. */
|
|
133
|
+
isBusy: () => boolean;
|
|
134
|
+
/** The queue changed (so clients can refresh their queued strip). */
|
|
135
|
+
onQueued?: () => void;
|
|
136
|
+
/** No run is live: start one from the queue (the host's stranded-queue drain). */
|
|
137
|
+
startIdleRun: () => void;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Deliver a late answer through the existing queue rather than a new channel:
|
|
141
|
+
* a live run drains it at its next steering boundary; an idle session runs it
|
|
142
|
+
* as the next user turn.
|
|
143
|
+
*/
|
|
144
|
+
export declare function deliverLateAnswer(late: LateAskAnswer, sink: LateAnswerSink): void;
|
package/dist/core/ask-user.js
CHANGED
|
@@ -1,19 +1,101 @@
|
|
|
1
|
-
import { createParkedRequests } from "./parked-requests.js";
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* Soft deadline for an `ask_user` call when someone is likely watching (a
|
|
3
|
+
* plain interactive run). Past it the tool stops blocking: the agent proceeds
|
|
4
|
+
* on its best guess while the question stays answerable in the app.
|
|
6
5
|
*/
|
|
7
|
-
export const
|
|
6
|
+
export const ASK_USER_INTERACTIVE_DEADLINE_MS = 10 * 60_000;
|
|
7
|
+
/**
|
|
8
|
+
* Soft deadline when nobody is watching — autopilot (Nolan), task run-all
|
|
9
|
+
* sweeps and scheduled prompts. Short, so an unattended run does not stall.
|
|
10
|
+
*/
|
|
11
|
+
export const ASK_USER_UNATTENDED_DEADLINE_MS = 2 * 60_000;
|
|
12
|
+
/**
|
|
13
|
+
* The longest an `ask_user` call can block (the largest soft deadline). The
|
|
14
|
+
* tool's own execution timeout is derived from this.
|
|
15
|
+
*/
|
|
16
|
+
export const ASK_USER_TIMEOUT_MS = Math.max(ASK_USER_INTERACTIVE_DEADLINE_MS, ASK_USER_UNATTENDED_DEADLINE_MS);
|
|
17
|
+
/** Pick the soft deadline for a run, by whether a human is likely watching. */
|
|
18
|
+
export function askSoftDeadlineMs(unattended) {
|
|
19
|
+
return unattended ? ASK_USER_UNATTENDED_DEADLINE_MS : ASK_USER_INTERACTIVE_DEADLINE_MS;
|
|
20
|
+
}
|
|
8
21
|
export function createAskUserBridge(opts) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
22
|
+
const pending = new Map();
|
|
23
|
+
const deferred = new Map();
|
|
24
|
+
let seq = 0;
|
|
25
|
+
const deadline = () => {
|
|
26
|
+
const t = opts.timeoutMs;
|
|
27
|
+
if (typeof t === "function")
|
|
28
|
+
return t();
|
|
29
|
+
return t ?? ASK_USER_INTERACTIVE_DEADLINE_MS;
|
|
30
|
+
};
|
|
31
|
+
const release = (id, result) => {
|
|
32
|
+
const entry = pending.get(id);
|
|
33
|
+
if (!entry)
|
|
34
|
+
return false;
|
|
35
|
+
pending.delete(id);
|
|
36
|
+
clearTimeout(entry.timer);
|
|
37
|
+
entry.resolve(result);
|
|
38
|
+
return true;
|
|
39
|
+
};
|
|
40
|
+
const closeDeferred = () => {
|
|
41
|
+
if (deferred.size === 0)
|
|
42
|
+
return;
|
|
43
|
+
const ids = [...deferred.keys()];
|
|
44
|
+
deferred.clear();
|
|
45
|
+
opts.onClosed?.(ids);
|
|
46
|
+
};
|
|
47
|
+
return {
|
|
48
|
+
park: (request) => new Promise((resolve) => {
|
|
49
|
+
// A newer question supersedes any older one still waiting past its
|
|
50
|
+
// deadline: the agent has moved on to a new decision point.
|
|
51
|
+
closeDeferred();
|
|
52
|
+
const prompt = { ...request, id: `ask-${++seq}` };
|
|
53
|
+
const timer = setTimeout(() => {
|
|
54
|
+
if (!pending.has(prompt.id))
|
|
55
|
+
return;
|
|
56
|
+
deferred.set(prompt.id, prompt);
|
|
57
|
+
opts.onTimeout?.(prompt);
|
|
58
|
+
release(prompt.id, { action: "deferred" });
|
|
59
|
+
}, deadline());
|
|
60
|
+
timer.unref?.();
|
|
61
|
+
pending.set(prompt.id, { resolve, timer });
|
|
62
|
+
opts.broadcast(prompt);
|
|
63
|
+
}),
|
|
64
|
+
settle: (id, result) => {
|
|
65
|
+
if (release(id, result))
|
|
66
|
+
return true;
|
|
67
|
+
const prompt = deferred.get(id);
|
|
68
|
+
if (!prompt)
|
|
69
|
+
return false;
|
|
70
|
+
deferred.delete(id);
|
|
71
|
+
if (result.action === "answer")
|
|
72
|
+
opts.onLateAnswer?.({ prompt, answers: result.answers });
|
|
73
|
+
return true;
|
|
74
|
+
},
|
|
75
|
+
cancelAll: (result) => {
|
|
76
|
+
for (const id of [...pending.keys()])
|
|
77
|
+
release(id, result ?? { action: "cancel" });
|
|
78
|
+
closeDeferred();
|
|
79
|
+
},
|
|
80
|
+
closeDeferred,
|
|
81
|
+
get pendingCount() {
|
|
82
|
+
return pending.size;
|
|
83
|
+
},
|
|
84
|
+
get deferredCount() {
|
|
85
|
+
return deferred.size;
|
|
86
|
+
},
|
|
87
|
+
};
|
|
16
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* What the model reads when the soft deadline passes. Short on purpose; the
|
|
91
|
+
* safety line is the part that matters — a guessed answer must never license
|
|
92
|
+
* an action the user cannot take back.
|
|
93
|
+
*/
|
|
94
|
+
export const ASK_DEFERRED_RESULT = "No answer yet — the user has not responded. Do not wait and do not ask again: proceed " +
|
|
95
|
+
"on your best judgment and state the assumption you made. The question stays open; a " +
|
|
96
|
+
'later reply arrives as a message starting "Late answer to:". On a guessed answer do only ' +
|
|
97
|
+
"safe, reversible work. Do NOT delete data, push, publish, deploy, pay, send messages or " +
|
|
98
|
+
"take any other destructive, costly or externally visible action — leave those for the user.";
|
|
17
99
|
/**
|
|
18
100
|
* Render the user's answers as the tool result the model reads.
|
|
19
101
|
*
|
|
@@ -22,12 +104,14 @@ export function createAskUserBridge(opts) {
|
|
|
22
104
|
* rather than silently missing.
|
|
23
105
|
*/
|
|
24
106
|
export function formatAskResult(questions, result) {
|
|
107
|
+
if (result.action === "deferred")
|
|
108
|
+
return ASK_DEFERRED_RESULT;
|
|
25
109
|
if (result.action === "cancel") {
|
|
26
110
|
if (result.superseded) {
|
|
27
111
|
return ("The user ignored the question and sent their own message instead. " +
|
|
28
112
|
"It arrives next — treat it as their answer and continue. Do not ask this again.");
|
|
29
113
|
}
|
|
30
|
-
return ("The user did not answer (dismissed
|
|
114
|
+
return ("The user did not answer (they dismissed the question). Do not ask again — " +
|
|
31
115
|
"state the assumption you are proceeding with, or stop and wait for them.");
|
|
32
116
|
}
|
|
33
117
|
const lines = questions.map((q) => {
|
|
@@ -37,4 +121,31 @@ export function formatAskResult(questions, result) {
|
|
|
37
121
|
});
|
|
38
122
|
return `The user answered:\n\n${lines.join("\n\n")}`;
|
|
39
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Frame a late answer as a message to the agent. It names the question it
|
|
126
|
+
* answers, because by now the agent has moved on and may have asked others.
|
|
127
|
+
*/
|
|
128
|
+
export function formatLateAnswer(late) {
|
|
129
|
+
const body = late.prompt.questions
|
|
130
|
+
.map((q) => {
|
|
131
|
+
const answer = late.answers[q.id];
|
|
132
|
+
const text = Array.isArray(answer) ? answer.join(", ") : answer;
|
|
133
|
+
return `Late answer to: ${q.question}\n→ ${text?.trim() ? text.trim() : "(no answer)"}`;
|
|
134
|
+
})
|
|
135
|
+
.join("\n\n");
|
|
136
|
+
return (`${body}\n\n` +
|
|
137
|
+
"(You asked this earlier and continued on an assumption. If this answer differs, " +
|
|
138
|
+
"adjust the affected work; if it matches, carry on.)");
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Deliver a late answer through the existing queue rather than a new channel:
|
|
142
|
+
* a live run drains it at its next steering boundary; an idle session runs it
|
|
143
|
+
* as the next user turn.
|
|
144
|
+
*/
|
|
145
|
+
export function deliverLateAnswer(late, sink) {
|
|
146
|
+
sink.queueMessage(formatLateAnswer(late));
|
|
147
|
+
sink.onQueued?.();
|
|
148
|
+
if (!sink.isBusy())
|
|
149
|
+
sink.startIdleRun();
|
|
150
|
+
}
|
|
40
151
|
//# sourceMappingURL=ask-user.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-user.js","sourceRoot":"","sources":["../../src/core/ask-user.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"ask-user.js","sourceRoot":"","sources":["../../src/core/ask-user.ts"],"names":[],"mappings":"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"}
|
|
@@ -201,9 +201,7 @@ export const BUNDLED_AGENTS = [
|
|
|
201
201
|
name: "owl",
|
|
202
202
|
description: 'Use for read-only questions about THIS repository: "where is X implemented", "what calls Y", "how does module Z fit together", tracing a data flow or mapping a directory. Never edits and never uses the web.',
|
|
203
203
|
tools: ["read", "grep", "find", "ls", "code_search", "source_path"],
|
|
204
|
-
|
|
205
|
-
// well and keeps wide fan-out affordable.
|
|
206
|
-
model: "fast",
|
|
204
|
+
model: "inherit",
|
|
207
205
|
// Conventions and style rules don't change where a symbol is defined, and
|
|
208
206
|
// skipping them keeps recon fast (matching Claude Code's Explore agent).
|
|
209
207
|
context: "none",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundled-agents.js","sourceRoot":"","sources":["../../src/core/bundled-agents.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;8DAgB2C,CAAC;AAE/D,MAAM,UAAU,GAAG;;;;;;;;;;;;;8GAa2F,CAAC;AAE/G,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;+EAcqD,CAAC;AAEhF,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2EA8CqD,CAAC;AAE5E,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iHAyC0F,CAAC;AAElH,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oFAsC6D,CAAC;AAErF,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EACT,6RAA6R;QAC/R,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,CAAC;QAC5F,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,UAAU;QACxB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EACT,gNAAgN;QAClN,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,CAAC;QACnE,
|
|
1
|
+
{"version":3,"file":"bundled-agents.js","sourceRoot":"","sources":["../../src/core/bundled-agents.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;8DAgB2C,CAAC;AAE/D,MAAM,UAAU,GAAG;;;;;;;;;;;;;8GAa2F,CAAC;AAE/G,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;+EAcqD,CAAC;AAEhF,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2EA8CqD,CAAC;AAE5E,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iHAyC0F,CAAC;AAElH,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oFAsC6D,CAAC;AAErF,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EACT,6RAA6R;QAC/R,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,CAAC;QAC5F,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,UAAU;QACxB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EACT,gNAAgN;QAClN,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,CAAC;QACnE,KAAK,EAAE,SAAS;QAChB,0EAA0E;QAC1E,yEAAyE;QACzE,OAAO,EAAE,MAAM;QACf,YAAY,EAAE,UAAU;QACxB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,+RAA+R;QACjS,KAAK,EAAE;YACL,MAAM;YACN,MAAM;YACN,MAAM;YACN,IAAI;YACJ,aAAa;YACb,aAAa;YACb,WAAW;YACX,YAAY;YACZ,UAAU;SACX;QACD,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,iBAAiB;QAC/B,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,iWAAiW;QACnW,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC;QAC7E,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,aAAa;QAC3B,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EACT,qMAAqM;QACvM,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC;QACvF,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,cAAc;QAC5B,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EACT,kNAAkN;QACpN,KAAK,EAAE;YACL,MAAM;YACN,MAAM;YACN,MAAM;YACN,IAAI;YACJ,aAAa;YACb,MAAM;YACN,WAAW;YACX,YAAY;YACZ,UAAU;SACX;QACD,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,cAAc;QAC5B,MAAM,EAAE,SAAS;KAClB;CACF,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { CacheRetention, PreparedContext, Usage } from "@prestyj/ai";
|
|
2
|
+
import { type CacheTouch } from "./cache-expiry.js";
|
|
3
|
+
export interface CacheRequestObservation {
|
|
4
|
+
provider: string;
|
|
5
|
+
model: string;
|
|
6
|
+
at: number;
|
|
7
|
+
cacheRetention: CacheRetention;
|
|
8
|
+
/** Request-shaping settings only; digested in memory, never logged. */
|
|
9
|
+
settings: unknown;
|
|
10
|
+
/** Route/account identity, digested in memory. Never pass credentials. */
|
|
11
|
+
route: unknown;
|
|
12
|
+
}
|
|
13
|
+
type HistoryEdit = "tool_prune" | "compaction";
|
|
14
|
+
export interface CacheContextReport {
|
|
15
|
+
stage: "prepared_context";
|
|
16
|
+
request: number;
|
|
17
|
+
changes: string[];
|
|
18
|
+
messageCount: number;
|
|
19
|
+
previousMessageCount: number;
|
|
20
|
+
/** Logical-message prefix, NOT a provider token offset or exact HTTP-body comparison. */
|
|
21
|
+
unchangedMessages: number;
|
|
22
|
+
imagesBefore: number;
|
|
23
|
+
imagesAfter: number;
|
|
24
|
+
imagesDropped: number;
|
|
25
|
+
pruneFreedTokensEstimate: number;
|
|
26
|
+
sincePreviousRequestMs: number | null;
|
|
27
|
+
requestedTtlExceeded: boolean;
|
|
28
|
+
/** Possible signed-thinking prefix mismatch; not a server-confirmed rejection. */
|
|
29
|
+
thinkingPrefixRiskBlocks: number;
|
|
30
|
+
/** Existing Anthropic encoding removes these signed blocks from settled turns. */
|
|
31
|
+
settledThinkingBlocks: number;
|
|
32
|
+
fingerprintMs: number;
|
|
33
|
+
}
|
|
34
|
+
export interface CacheUsageReport extends CacheContextReport {
|
|
35
|
+
promptTokens: number;
|
|
36
|
+
cacheRead: number;
|
|
37
|
+
cacheWrite: number;
|
|
38
|
+
comparison: "first_request" | "compaction" | "route_changed" | "cache_unreported" | "comparable";
|
|
39
|
+
/** Upper-bound proxy for repeated input not read from cache, not proven avoidable waste. */
|
|
40
|
+
reprocessedPromptTokensEstimate: number | null;
|
|
41
|
+
costStatus: "unavailable";
|
|
42
|
+
ttftMs: number | null;
|
|
43
|
+
providerDurationMs: number;
|
|
44
|
+
}
|
|
45
|
+
/** One per session. Retains only one completed snapshot and one in-flight snapshot, no payloads.
|
|
46
|
+
* Failed/retried attempts never replace the last successful usage baseline. */
|
|
47
|
+
export declare class CacheDiagnostics {
|
|
48
|
+
private completed;
|
|
49
|
+
private pending;
|
|
50
|
+
private edits;
|
|
51
|
+
private freedTokens;
|
|
52
|
+
private requests;
|
|
53
|
+
private reportedCache;
|
|
54
|
+
private lastTouch;
|
|
55
|
+
/** Last successful cache-using request (real turn or prewarm), or null. */
|
|
56
|
+
lastCacheTouch(): CacheTouch | null;
|
|
57
|
+
/** Record a successful cache-using request that bypassed prepare/complete (prewarm). */
|
|
58
|
+
noteCacheTouch(touch: CacheTouch): void;
|
|
59
|
+
reset(): void;
|
|
60
|
+
discardAttempt(): void;
|
|
61
|
+
noteEdit(edit: HistoryEdit, freedTokens?: number): void;
|
|
62
|
+
prepare(context: PreparedContext, input: CacheRequestObservation): CacheContextReport;
|
|
63
|
+
complete(usage: Usage, timing: {
|
|
64
|
+
ttftMs?: number;
|
|
65
|
+
providerDurationMs: number;
|
|
66
|
+
}): CacheUsageReport | undefined;
|
|
67
|
+
}
|
|
68
|
+
export {};
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { resolveCacheTtl } from "./cache-expiry.js";
|
|
3
|
+
/** Digests never leave this instance. Canonical object keys avoid spurious edits on resume. */
|
|
4
|
+
function digest(value) {
|
|
5
|
+
const json = JSON.stringify(value, (_key, item) => item !== null && typeof item === "object" && !Array.isArray(item)
|
|
6
|
+
? Object.fromEntries(Object.entries(item).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)))
|
|
7
|
+
: item);
|
|
8
|
+
return createHash("sha256")
|
|
9
|
+
.update(json ?? "null")
|
|
10
|
+
.digest("hex");
|
|
11
|
+
}
|
|
12
|
+
/** Route fields the session passes as `route`; read structurally, never digested. */
|
|
13
|
+
function routeField(route, key) {
|
|
14
|
+
if (!route || typeof route !== "object")
|
|
15
|
+
return undefined;
|
|
16
|
+
const value = route[key];
|
|
17
|
+
return typeof value === "string" && value ? value : undefined;
|
|
18
|
+
}
|
|
19
|
+
function signedThinkingCount(message) {
|
|
20
|
+
if (message.role !== "assistant" || !Array.isArray(message.content))
|
|
21
|
+
return 0;
|
|
22
|
+
return message.content.filter((part) => (part.type === "thinking" && Boolean(part.signature?.trim())) ||
|
|
23
|
+
(part.type === "raw" &&
|
|
24
|
+
(part.data.type === "redacted_thinking" ||
|
|
25
|
+
(part.data.type === "thinking" && typeof part.data.signature === "string")))).length;
|
|
26
|
+
}
|
|
27
|
+
function promptTokens(usage) {
|
|
28
|
+
return usage.inputTokens + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0);
|
|
29
|
+
}
|
|
30
|
+
/** One per session. Retains only one completed snapshot and one in-flight snapshot, no payloads.
|
|
31
|
+
* Failed/retried attempts never replace the last successful usage baseline. */
|
|
32
|
+
export class CacheDiagnostics {
|
|
33
|
+
completed;
|
|
34
|
+
pending;
|
|
35
|
+
edits = new Set();
|
|
36
|
+
freedTokens = 0;
|
|
37
|
+
requests = 0;
|
|
38
|
+
reportedCache = false;
|
|
39
|
+
lastTouch = null;
|
|
40
|
+
/** Last successful cache-using request (real turn or prewarm), or null. */
|
|
41
|
+
lastCacheTouch() {
|
|
42
|
+
return this.lastTouch;
|
|
43
|
+
}
|
|
44
|
+
/** Record a successful cache-using request that bypassed prepare/complete (prewarm). */
|
|
45
|
+
noteCacheTouch(touch) {
|
|
46
|
+
this.lastTouch = { ...touch };
|
|
47
|
+
}
|
|
48
|
+
reset() {
|
|
49
|
+
this.lastTouch = null;
|
|
50
|
+
this.completed = undefined;
|
|
51
|
+
this.pending = undefined;
|
|
52
|
+
this.edits.clear();
|
|
53
|
+
this.freedTokens = 0;
|
|
54
|
+
this.requests = 0;
|
|
55
|
+
this.reportedCache = false;
|
|
56
|
+
}
|
|
57
|
+
discardAttempt() {
|
|
58
|
+
this.pending = undefined;
|
|
59
|
+
}
|
|
60
|
+
noteEdit(edit, freedTokens = 0) {
|
|
61
|
+
this.edits.add(edit);
|
|
62
|
+
this.freedTokens += Math.max(0, freedTokens);
|
|
63
|
+
}
|
|
64
|
+
prepare(context, input) {
|
|
65
|
+
const started = performance.now();
|
|
66
|
+
const previous = this.completed;
|
|
67
|
+
const snapshot = {
|
|
68
|
+
messages: context.messages.map((message) => digest({ role: message.role, content: message.content })),
|
|
69
|
+
settings: digest({
|
|
70
|
+
tools: context.tools,
|
|
71
|
+
settings: input.settings,
|
|
72
|
+
cacheRetention: input.cacheRetention,
|
|
73
|
+
}),
|
|
74
|
+
route: digest({ provider: input.provider, model: input.model, route: input.route }),
|
|
75
|
+
imagesDropped: context.imagesBefore - context.imagesAfter,
|
|
76
|
+
at: input.at,
|
|
77
|
+
touch: (() => {
|
|
78
|
+
const policy = resolveCacheTtl({
|
|
79
|
+
provider: input.provider,
|
|
80
|
+
model: input.model,
|
|
81
|
+
cacheRetention: input.cacheRetention,
|
|
82
|
+
baseUrl: routeField(input.route, "baseUrl"),
|
|
83
|
+
accountId: routeField(input.route, "accountId"),
|
|
84
|
+
});
|
|
85
|
+
return policy ? { provider: input.provider, model: input.model, policy } : null;
|
|
86
|
+
})(),
|
|
87
|
+
};
|
|
88
|
+
let unchanged = 0;
|
|
89
|
+
if (previous) {
|
|
90
|
+
while (unchanged < previous.messages.length &&
|
|
91
|
+
unchanged < snapshot.messages.length &&
|
|
92
|
+
previous.messages[unchanged] === snapshot.messages[unchanged])
|
|
93
|
+
unchanged++;
|
|
94
|
+
}
|
|
95
|
+
const changes = [...this.edits];
|
|
96
|
+
if (previous?.route !== undefined && previous.route !== snapshot.route)
|
|
97
|
+
changes.push("route_or_model");
|
|
98
|
+
const settingsChanged = previous !== undefined && previous.settings !== snapshot.settings;
|
|
99
|
+
if (settingsChanged)
|
|
100
|
+
changes.push("request_settings");
|
|
101
|
+
const historyChanged = previous !== undefined && unchanged < previous.messages.length;
|
|
102
|
+
if (historyChanged)
|
|
103
|
+
changes.push("history");
|
|
104
|
+
if (snapshot.imagesDropped !== (previous?.imagesDropped ?? 0))
|
|
105
|
+
changes.push("image_budget");
|
|
106
|
+
// The input is already clamped. On resume there is no previous snapshot, but removal of
|
|
107
|
+
// earlier images can still invalidate signed reasoning from the saved conversation.
|
|
108
|
+
let firstEdit = context.firstImageDropMessage ?? Number.POSITIVE_INFINITY;
|
|
109
|
+
if (historyChanged)
|
|
110
|
+
firstEdit = Math.min(firstEdit, unchanged);
|
|
111
|
+
if (settingsChanged)
|
|
112
|
+
firstEdit = -1;
|
|
113
|
+
let lastUser = -1;
|
|
114
|
+
context.messages.forEach((message, index) => {
|
|
115
|
+
if (message.role === "user")
|
|
116
|
+
lastUser = index;
|
|
117
|
+
});
|
|
118
|
+
let thinkingPrefixRiskBlocks = 0;
|
|
119
|
+
let settledThinkingBlocks = 0;
|
|
120
|
+
if (input.provider === "anthropic") {
|
|
121
|
+
context.messages.forEach((message, index) => {
|
|
122
|
+
const count = signedThinkingCount(message);
|
|
123
|
+
if (index >= firstEdit)
|
|
124
|
+
thinkingPrefixRiskBlocks += count;
|
|
125
|
+
if (index < lastUser)
|
|
126
|
+
settledThinkingBlocks += count;
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
const sincePreviousRequestMs = previous ? Math.max(0, input.at - previous.at) : null;
|
|
130
|
+
const report = {
|
|
131
|
+
stage: "prepared_context",
|
|
132
|
+
request: ++this.requests,
|
|
133
|
+
changes: changes.sort(),
|
|
134
|
+
messageCount: snapshot.messages.length,
|
|
135
|
+
previousMessageCount: previous?.messages.length ?? 0,
|
|
136
|
+
unchangedMessages: unchanged,
|
|
137
|
+
imagesBefore: context.imagesBefore,
|
|
138
|
+
imagesAfter: context.imagesAfter,
|
|
139
|
+
imagesDropped: snapshot.imagesDropped,
|
|
140
|
+
pruneFreedTokensEstimate: this.freedTokens,
|
|
141
|
+
sincePreviousRequestMs,
|
|
142
|
+
requestedTtlExceeded: input.cacheRetention !== "none" &&
|
|
143
|
+
sincePreviousRequestMs !== null &&
|
|
144
|
+
sincePreviousRequestMs > (input.cacheRetention === "long" ? 3_600_000 : 300_000),
|
|
145
|
+
thinkingPrefixRiskBlocks,
|
|
146
|
+
settledThinkingBlocks,
|
|
147
|
+
fingerprintMs: Math.round((performance.now() - started) * 100) / 100,
|
|
148
|
+
};
|
|
149
|
+
this.pending = { snapshot, report };
|
|
150
|
+
return report;
|
|
151
|
+
}
|
|
152
|
+
complete(usage, timing) {
|
|
153
|
+
if (!this.pending)
|
|
154
|
+
return undefined;
|
|
155
|
+
const { snapshot, report } = this.pending;
|
|
156
|
+
const previous = this.completed;
|
|
157
|
+
const cacheRead = usage.cacheRead ?? 0;
|
|
158
|
+
const cacheWrite = usage.cacheWrite ?? 0;
|
|
159
|
+
const routeChanged = previous !== undefined && previous.route !== snapshot.route;
|
|
160
|
+
const hasCache = cacheRead + cacheWrite > 0 || (!routeChanged && this.reportedCache);
|
|
161
|
+
const comparison = !previous?.usage
|
|
162
|
+
? "first_request"
|
|
163
|
+
: this.edits.has("compaction")
|
|
164
|
+
? "compaction"
|
|
165
|
+
: routeChanged
|
|
166
|
+
? "route_changed"
|
|
167
|
+
: !hasCache
|
|
168
|
+
? "cache_unreported"
|
|
169
|
+
: "comparable";
|
|
170
|
+
const reprocessed = comparison === "comparable" && previous?.usage
|
|
171
|
+
? Math.max(0, Math.min(promptTokens(previous.usage), promptTokens(usage)) - cacheRead)
|
|
172
|
+
: null;
|
|
173
|
+
this.completed = { ...snapshot, usage: { ...usage } };
|
|
174
|
+
// The provider refreshes the cached prefix when the request is processed, so
|
|
175
|
+
// the TTL clock restarts at the request's start time.
|
|
176
|
+
this.lastTouch = snapshot.touch ? { ...snapshot.touch, at: snapshot.at } : null;
|
|
177
|
+
this.pending = undefined;
|
|
178
|
+
this.edits.clear();
|
|
179
|
+
this.freedTokens = 0;
|
|
180
|
+
this.reportedCache = hasCache;
|
|
181
|
+
return {
|
|
182
|
+
...report,
|
|
183
|
+
promptTokens: promptTokens(usage),
|
|
184
|
+
cacheRead,
|
|
185
|
+
cacheWrite,
|
|
186
|
+
comparison,
|
|
187
|
+
reprocessedPromptTokensEstimate: reprocessed,
|
|
188
|
+
// GG's turn metrics currently have no authoritative effective-dated pricing. Do not
|
|
189
|
+
// turn a cache-write count (which includes new content) into fabricated dollar waste.
|
|
190
|
+
costStatus: "unavailable",
|
|
191
|
+
ttftMs: timing.ttftMs ?? null,
|
|
192
|
+
providerDurationMs: timing.providerDurationMs,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=cache-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-diagnostics.js","sourceRoot":"","sources":["../../src/core/cache-diagnostics.ts"],"names":[],"mappings":"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"}
|