@aitne/daemon 0.1.4 → 0.1.6
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/dist/adapters/notification-manager.d.ts +12 -0
- package/dist/adapters/notification-manager.d.ts.map +1 -1
- package/dist/adapters/notification-manager.js +39 -1
- package/dist/adapters/notification-manager.js.map +1 -1
- package/dist/api/routes/agent.d.ts.map +1 -1
- package/dist/api/routes/agent.js +7 -0
- package/dist/api/routes/agent.js.map +1 -1
- package/dist/api/routes/commands.d.ts.map +1 -1
- package/dist/api/routes/commands.js +16 -13
- package/dist/api/routes/commands.js.map +1 -1
- package/dist/api/routes/context.d.ts.map +1 -1
- package/dist/api/routes/context.js +13 -2
- package/dist/api/routes/context.js.map +1 -1
- package/dist/api/routes/dashboard.d.ts.map +1 -1
- package/dist/api/routes/dashboard.js +28 -0
- package/dist/api/routes/dashboard.js.map +1 -1
- package/dist/api/routes/fs.d.ts +23 -0
- package/dist/api/routes/fs.d.ts.map +1 -0
- package/dist/api/routes/fs.js +156 -0
- package/dist/api/routes/fs.js.map +1 -0
- package/dist/api/routes/fs.logic.d.ts +62 -0
- package/dist/api/routes/fs.logic.d.ts.map +1 -0
- package/dist/api/routes/fs.logic.js +137 -0
- package/dist/api/routes/fs.logic.js.map +1 -0
- package/dist/api/routes/health.d.ts.map +1 -1
- package/dist/api/routes/health.js +4 -2
- package/dist/api/routes/health.js.map +1 -1
- package/dist/api/routes/integrations.d.ts.map +1 -1
- package/dist/api/routes/integrations.js +8 -6
- package/dist/api/routes/integrations.js.map +1 -1
- package/dist/api/routes/metrics.d.ts +1 -0
- package/dist/api/routes/metrics.d.ts.map +1 -1
- package/dist/api/routes/metrics.js +24 -0
- package/dist/api/routes/metrics.js.map +1 -1
- package/dist/api/routes/observations.d.ts.map +1 -1
- package/dist/api/routes/observations.js +538 -25
- package/dist/api/routes/observations.js.map +1 -1
- package/dist/api/routes/skills.d.ts +9 -1
- package/dist/api/routes/skills.d.ts.map +1 -1
- package/dist/api/routes/skills.js +38 -16
- package/dist/api/routes/skills.js.map +1 -1
- package/dist/api/routes/wiki.d.ts +4 -0
- package/dist/api/routes/wiki.d.ts.map +1 -0
- package/dist/api/routes/wiki.js +1075 -0
- package/dist/api/routes/wiki.js.map +1 -0
- package/dist/api/server.d.ts +13 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +27 -1
- package/dist/api/server.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +26 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-core.d.ts +25 -0
- package/dist/core/agent-core.d.ts.map +1 -1
- package/dist/core/agent-core.js.map +1 -1
- package/dist/core/backends/backend-router.d.ts +5 -1
- package/dist/core/backends/backend-router.d.ts.map +1 -1
- package/dist/core/backends/backend-router.js +10 -1
- package/dist/core/backends/backend-router.js.map +1 -1
- package/dist/core/backends/claude-code-core.d.ts.map +1 -1
- package/dist/core/backends/claude-code-core.js +62 -4
- package/dist/core/backends/claude-code-core.js.map +1 -1
- package/dist/core/backends/claude-tool-collection.d.ts +1 -1
- package/dist/core/backends/claude-tool-collection.d.ts.map +1 -1
- package/dist/core/backends/claude-tool-collection.js +327 -65
- package/dist/core/backends/claude-tool-collection.js.map +1 -1
- package/dist/core/backends/codex-core.d.ts.map +1 -1
- package/dist/core/backends/codex-core.js +36 -0
- package/dist/core/backends/codex-core.js.map +1 -1
- package/dist/core/backends/gemini-cli-core.d.ts +24 -5
- package/dist/core/backends/gemini-cli-core.d.ts.map +1 -1
- package/dist/core/backends/gemini-cli-core.js +62 -30
- package/dist/core/backends/gemini-cli-core.js.map +1 -1
- package/dist/core/backends/plan-presets.d.ts +3 -1
- package/dist/core/backends/plan-presets.d.ts.map +1 -1
- package/dist/core/backends/plan-presets.js +42 -2
- package/dist/core/backends/plan-presets.js.map +1 -1
- package/dist/core/bang-commands/commands-help.d.ts +5 -0
- package/dist/core/bang-commands/commands-help.d.ts.map +1 -0
- package/dist/core/bang-commands/commands-help.js +69 -0
- package/dist/core/bang-commands/commands-help.js.map +1 -0
- package/dist/core/bang-commands/commands-wiki.d.ts +75 -0
- package/dist/core/bang-commands/commands-wiki.d.ts.map +1 -0
- package/dist/core/bang-commands/commands-wiki.js +574 -0
- package/dist/core/bang-commands/commands-wiki.js.map +1 -0
- package/dist/core/bang-commands/index.d.ts +4 -2
- package/dist/core/bang-commands/index.d.ts.map +1 -1
- package/dist/core/bang-commands/index.js +15 -1
- package/dist/core/bang-commands/index.js.map +1 -1
- package/dist/core/bang-commands/registry.d.ts +47 -4
- package/dist/core/bang-commands/registry.d.ts.map +1 -1
- package/dist/core/bang-commands/registry.js +85 -15
- package/dist/core/bang-commands/registry.js.map +1 -1
- package/dist/core/context-builder.d.ts +17 -0
- package/dist/core/context-builder.d.ts.map +1 -1
- package/dist/core/context-builder.js +64 -6
- package/dist/core/context-builder.js.map +1 -1
- package/dist/core/daemon-api-cli.d.ts.map +1 -1
- package/dist/core/daemon-api-cli.js +50 -2
- package/dist/core/daemon-api-cli.js.map +1 -1
- package/dist/core/dispatcher-message-handler.d.ts.map +1 -1
- package/dist/core/dispatcher-message-handler.js +10 -0
- package/dist/core/dispatcher-message-handler.js.map +1 -1
- package/dist/core/dispatcher-morning-routine.d.ts.map +1 -1
- package/dist/core/dispatcher-morning-routine.js +17 -2
- package/dist/core/dispatcher-morning-routine.js.map +1 -1
- package/dist/core/dispatcher-result-processor.d.ts +23 -0
- package/dist/core/dispatcher-result-processor.d.ts.map +1 -1
- package/dist/core/dispatcher-result-processor.js +124 -5
- package/dist/core/dispatcher-result-processor.js.map +1 -1
- package/dist/core/dispatcher-scheduled-tasks.d.ts.map +1 -1
- package/dist/core/dispatcher-scheduled-tasks.js +114 -80
- package/dist/core/dispatcher-scheduled-tasks.js.map +1 -1
- package/dist/core/dispatcher-types.d.ts +116 -1
- package/dist/core/dispatcher-types.d.ts.map +1 -1
- package/dist/core/dispatcher-types.js.map +1 -1
- package/dist/core/dispatcher.d.ts +36 -0
- package/dist/core/dispatcher.d.ts.map +1 -1
- package/dist/core/dispatcher.js +94 -1
- package/dist/core/dispatcher.js.map +1 -1
- package/dist/core/integration-lifecycle.d.ts.map +1 -1
- package/dist/core/integration-lifecycle.js +6 -8
- package/dist/core/integration-lifecycle.js.map +1 -1
- package/dist/core/metrics.d.ts +127 -0
- package/dist/core/metrics.d.ts.map +1 -1
- package/dist/core/metrics.js +256 -1
- package/dist/core/metrics.js.map +1 -1
- package/dist/core/prompts.d.ts +2 -1
- package/dist/core/prompts.d.ts.map +1 -1
- package/dist/core/prompts.js +40 -0
- package/dist/core/prompts.js.map +1 -1
- package/dist/core/roadmap-validate.js +13 -1
- package/dist/core/roadmap-validate.js.map +1 -1
- package/dist/core/routine-acquisition-plan.d.ts +51 -0
- package/dist/core/routine-acquisition-plan.d.ts.map +1 -1
- package/dist/core/routine-acquisition-plan.js +111 -12
- package/dist/core/routine-acquisition-plan.js.map +1 -1
- package/dist/core/routine-fetch-window-retry.d.ts +109 -0
- package/dist/core/routine-fetch-window-retry.d.ts.map +1 -0
- package/dist/core/routine-fetch-window-retry.js +210 -0
- package/dist/core/routine-fetch-window-retry.js.map +1 -0
- package/dist/core/routine-fetch-window-runner.d.ts +258 -32
- package/dist/core/routine-fetch-window-runner.d.ts.map +1 -1
- package/dist/core/routine-fetch-window-runner.js +1115 -185
- package/dist/core/routine-fetch-window-runner.js.map +1 -1
- package/dist/core/routine-windows.d.ts +19 -4
- package/dist/core/routine-windows.d.ts.map +1 -1
- package/dist/core/routine-windows.js +47 -0
- package/dist/core/routine-windows.js.map +1 -1
- package/dist/core/scheduler.d.ts +50 -2
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +88 -7
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/skill-curation/declarations.d.ts.map +1 -1
- package/dist/core/skill-curation/declarations.js +11 -12
- package/dist/core/skill-curation/declarations.js.map +1 -1
- package/dist/core/skill-source-paths.d.ts +14 -0
- package/dist/core/skill-source-paths.d.ts.map +1 -0
- package/dist/core/skill-source-paths.js +82 -0
- package/dist/core/skill-source-paths.js.map +1 -0
- package/dist/core/skills-compiler.d.ts +18 -0
- package/dist/core/skills-compiler.d.ts.map +1 -1
- package/dist/core/skills-compiler.js +65 -18
- package/dist/core/skills-compiler.js.map +1 -1
- package/dist/core/skills-manifest.d.ts.map +1 -1
- package/dist/core/skills-manifest.js +46 -0
- package/dist/core/skills-manifest.js.map +1 -1
- package/dist/core/system-reset.d.ts +25 -0
- package/dist/core/system-reset.d.ts.map +1 -1
- package/dist/core/system-reset.js +47 -0
- package/dist/core/system-reset.js.map +1 -1
- package/dist/core/wiki/approval-queue.d.ts +31 -0
- package/dist/core/wiki/approval-queue.d.ts.map +1 -0
- package/dist/core/wiki/approval-queue.js +44 -0
- package/dist/core/wiki/approval-queue.js.map +1 -0
- package/dist/core/wiki/bridge.d.ts +74 -0
- package/dist/core/wiki/bridge.d.ts.map +1 -0
- package/dist/core/wiki/bridge.js +405 -0
- package/dist/core/wiki/bridge.js.map +1 -0
- package/dist/core/wiki/compile-lock.d.ts +42 -0
- package/dist/core/wiki/compile-lock.d.ts.map +1 -0
- package/dist/core/wiki/compile-lock.js +55 -0
- package/dist/core/wiki/compile-lock.js.map +1 -0
- package/dist/core/wiki/compile-preview.d.ts +8 -0
- package/dist/core/wiki/compile-preview.d.ts.map +1 -0
- package/dist/core/wiki/compile-preview.js +200 -0
- package/dist/core/wiki/compile-preview.js.map +1 -0
- package/dist/core/wiki/cost-estimate.d.ts +30 -0
- package/dist/core/wiki/cost-estimate.d.ts.map +1 -0
- package/dist/core/wiki/cost-estimate.js +243 -0
- package/dist/core/wiki/cost-estimate.js.map +1 -0
- package/dist/core/wiki/dispatcher.d.ts +48 -0
- package/dist/core/wiki/dispatcher.d.ts.map +1 -0
- package/dist/core/wiki/dispatcher.js +92 -0
- package/dist/core/wiki/dispatcher.js.map +1 -0
- package/dist/core/wiki/git-precompile.d.ts +86 -0
- package/dist/core/wiki/git-precompile.d.ts.map +1 -0
- package/dist/core/wiki/git-precompile.js +96 -0
- package/dist/core/wiki/git-precompile.js.map +1 -0
- package/dist/core/wiki/import-migrate.d.ts +38 -0
- package/dist/core/wiki/import-migrate.d.ts.map +1 -0
- package/dist/core/wiki/import-migrate.js +310 -0
- package/dist/core/wiki/import-migrate.js.map +1 -0
- package/dist/core/wiki/import-probe.d.ts +76 -0
- package/dist/core/wiki/import-probe.d.ts.map +1 -0
- package/dist/core/wiki/import-probe.js +245 -0
- package/dist/core/wiki/import-probe.js.map +1 -0
- package/dist/core/wiki/index-cache.d.ts +39 -0
- package/dist/core/wiki/index-cache.d.ts.map +1 -0
- package/dist/core/wiki/index-cache.js +152 -0
- package/dist/core/wiki/index-cache.js.map +1 -0
- package/dist/core/wiki/multi-url-dispatch.d.ts +52 -0
- package/dist/core/wiki/multi-url-dispatch.d.ts.map +1 -0
- package/dist/core/wiki/multi-url-dispatch.js +72 -0
- package/dist/core/wiki/multi-url-dispatch.js.map +1 -0
- package/dist/core/wiki/wiki-fts.d.ts +75 -0
- package/dist/core/wiki/wiki-fts.d.ts.map +1 -0
- package/dist/core/wiki/wiki-fts.js +265 -0
- package/dist/core/wiki/wiki-fts.js.map +1 -0
- package/dist/core/wiki/workspaces.d.ts +101 -0
- package/dist/core/wiki/workspaces.d.ts.map +1 -0
- package/dist/core/wiki/workspaces.js +352 -0
- package/dist/core/wiki/workspaces.js.map +1 -0
- package/dist/core/wiki/write-strategy.d.ts +70 -0
- package/dist/core/wiki/write-strategy.d.ts.map +1 -0
- package/dist/core/wiki/write-strategy.js +112 -0
- package/dist/core/wiki/write-strategy.js.map +1 -0
- package/dist/core/workdir.d.ts +8 -1
- package/dist/core/workdir.d.ts.map +1 -1
- package/dist/core/workdir.js +4 -1
- package/dist/core/workdir.js.map +1 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +122 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/db/wiki-store.d.ts +3 -0
- package/dist/db/wiki-store.d.ts.map +1 -0
- package/dist/db/wiki-store.js +7 -0
- package/dist/db/wiki-store.js.map +1 -0
- package/dist/index.js +80 -4
- package/dist/index.js.map +1 -1
- package/dist/messaging/url-extract.d.ts +8 -0
- package/dist/messaging/url-extract.d.ts.map +1 -0
- package/dist/messaging/url-extract.js +41 -0
- package/dist/messaging/url-extract.js.map +1 -0
- package/dist/observers/delegated-sync-worker.d.ts +33 -25
- package/dist/observers/delegated-sync-worker.d.ts.map +1 -1
- package/dist/observers/delegated-sync-worker.js +38 -31
- package/dist/observers/delegated-sync-worker.js.map +1 -1
- package/dist/observers/imminent-event-scheduler.d.ts +20 -7
- package/dist/observers/imminent-event-scheduler.d.ts.map +1 -1
- package/dist/observers/imminent-event-scheduler.js +134 -29
- package/dist/observers/imminent-event-scheduler.js.map +1 -1
- package/dist/safety/always-disallowed.d.ts +65 -0
- package/dist/safety/always-disallowed.d.ts.map +1 -1
- package/dist/safety/always-disallowed.js +106 -10
- package/dist/safety/always-disallowed.js.map +1 -1
- package/dist/safety/audit.d.ts +46 -1
- package/dist/safety/audit.d.ts.map +1 -1
- package/dist/safety/audit.js +79 -16
- package/dist/safety/audit.js.map +1 -1
- package/dist/safety/risk-classifier.d.ts.map +1 -1
- package/dist/safety/risk-classifier.js +29 -0
- package/dist/safety/risk-classifier.js.map +1 -1
- package/dist/settings/runtime-settings.d.ts +12 -1
- package/dist/settings/runtime-settings.d.ts.map +1 -1
- package/dist/settings/runtime-settings.js +59 -1
- package/dist/settings/runtime-settings.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry-policy helpers for the pre-pass fan-out coordinator.
|
|
3
|
+
*
|
|
4
|
+
* PRE_PASS_FAN_OUT_DESIGN.md §4.4 — the coordinator spawns a fresh Haiku
|
|
5
|
+
* sub-session per attempt and consults `defaultRetryDecision` (or any
|
|
6
|
+
* `RetryDecisionFn`) between attempts to choose whether to spawn the
|
|
7
|
+
* next one. Keeping the policy as pure data (decision matrix in
|
|
8
|
+
* TypeScript, not in agent prose) makes the loop deterministic,
|
|
9
|
+
* testable, and free of per-model variance.
|
|
10
|
+
*
|
|
11
|
+
* Phase 0 ships these helpers + their unit tests. The fan-out
|
|
12
|
+
* coordinator that consumes them lands in Phase 1.
|
|
13
|
+
*/
|
|
14
|
+
// ── Decision matrix (PRE_PASS_FAN_OUT_DESIGN.md §4.4) ─────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* Stable reason identifiers. Centralised so the dashboard / audit feed
|
|
17
|
+
* can render them consistently and so test assertions don't drift from
|
|
18
|
+
* runtime values.
|
|
19
|
+
*/
|
|
20
|
+
export const RETRY_REASONS = {
|
|
21
|
+
MAX_ATTEMPTS: "max-attempts-reached",
|
|
22
|
+
BUDGET_CAP: "per-integration-budget-cap",
|
|
23
|
+
FLIP_LOCKED: "flip-locked",
|
|
24
|
+
BUDGET_EXHAUSTED: "budget-exhausted",
|
|
25
|
+
AUTH_FAILED: "auth-failed",
|
|
26
|
+
FAILED_STATUS: "failed-status",
|
|
27
|
+
UPSTREAM_5XX: "upstream-5xx",
|
|
28
|
+
PARTIAL_NO_POST: "partial-no-post",
|
|
29
|
+
SUCCESS: "success",
|
|
30
|
+
PARTIAL_WITH_POST: "partial-with-progress",
|
|
31
|
+
SKIPPED: "skipped",
|
|
32
|
+
NO_PROGRESS: "no-progress",
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Sum the cost across `priorAttempts` + the current `report`. Pure;
|
|
36
|
+
* exported for unit testing the budget-cap branch in isolation.
|
|
37
|
+
*/
|
|
38
|
+
export function cumulativeAttemptCost(report, priorAttempts) {
|
|
39
|
+
let total = report.costUsd;
|
|
40
|
+
for (const att of priorAttempts)
|
|
41
|
+
total += att.costUsd;
|
|
42
|
+
return total;
|
|
43
|
+
}
|
|
44
|
+
function isFetchFailedWithStatus(err, predicate) {
|
|
45
|
+
if (err.type !== "fetch-failed")
|
|
46
|
+
return false;
|
|
47
|
+
// `status` may arrive as number or string — MCP transports stringify
|
|
48
|
+
// upstream HTTP codes inconsistently.
|
|
49
|
+
const raw = err.status;
|
|
50
|
+
const status = typeof raw === "number"
|
|
51
|
+
? raw
|
|
52
|
+
: typeof raw === "string" && /^\d+$/.test(raw)
|
|
53
|
+
? Number.parseInt(raw, 10)
|
|
54
|
+
: NaN;
|
|
55
|
+
if (Number.isNaN(status))
|
|
56
|
+
return false;
|
|
57
|
+
return predicate(status);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Default retry policy from §4.4. Pure: decision is fully determined by
|
|
61
|
+
* the inputs, no side effects, no shared state. Decision order:
|
|
62
|
+
*
|
|
63
|
+
* 1. Attempts cap (no retry, reason `max-attempts-reached`).
|
|
64
|
+
* 2. Per-integration cumulative budget cap.
|
|
65
|
+
* 3. Terminal error classes — flip-lock, budget-exhausted, auth (401/403).
|
|
66
|
+
* 4. Retry-worthy outcomes — failed status, upstream 5xx, partial-no-post.
|
|
67
|
+
* 5. Non-retry-by-default — success, partial-with-progress, skipped, no-progress.
|
|
68
|
+
*
|
|
69
|
+
* The motivating §1.1 failure ("Unknown name "limit"") lands
|
|
70
|
+
* as `status="partial"` with `fetched > 0`, `posted === 0` and a
|
|
71
|
+
* `fetch-failed` error — rule (4)'s `partial-no-post` branch catches it.
|
|
72
|
+
*/
|
|
73
|
+
export const defaultRetryDecision = (report, attempt, policy, priorAttempts) => {
|
|
74
|
+
// (1) Attempts cap — the loop body checks this before spawning attempt N+1.
|
|
75
|
+
if (attempt >= policy.maxAttempts) {
|
|
76
|
+
return { retry: false, reason: RETRY_REASONS.MAX_ATTEMPTS };
|
|
77
|
+
}
|
|
78
|
+
// (2) Cumulative cost cap. Compare against the cost AFTER recording
|
|
79
|
+
// this attempt; if it's already at/over the cap, no point retrying.
|
|
80
|
+
const cumulative = cumulativeAttemptCost(report, priorAttempts);
|
|
81
|
+
if (cumulative >= policy.perIntegrationBudgetUsd) {
|
|
82
|
+
return { retry: false, reason: RETRY_REASONS.BUDGET_CAP };
|
|
83
|
+
}
|
|
84
|
+
// (3) Terminal error classes — first match wins.
|
|
85
|
+
for (const err of report.errors) {
|
|
86
|
+
if (err.type === "flip-locked") {
|
|
87
|
+
return { retry: false, reason: RETRY_REASONS.FLIP_LOCKED };
|
|
88
|
+
}
|
|
89
|
+
if (err.type === "budget-exhausted") {
|
|
90
|
+
return { retry: false, reason: RETRY_REASONS.BUDGET_EXHAUSTED };
|
|
91
|
+
}
|
|
92
|
+
if (isFetchFailedWithStatus(err, (s) => s === 401 || s === 403)) {
|
|
93
|
+
return { retry: false, reason: RETRY_REASONS.AUTH_FAILED };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// (4) Retry-worthy.
|
|
97
|
+
if (report.status === "failed") {
|
|
98
|
+
return { retry: true, reason: RETRY_REASONS.FAILED_STATUS };
|
|
99
|
+
}
|
|
100
|
+
for (const err of report.errors) {
|
|
101
|
+
if (isFetchFailedWithStatus(err, (s) => s >= 500 && s < 600)) {
|
|
102
|
+
return { retry: true, reason: RETRY_REASONS.UPSTREAM_5XX };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (policy.retryOnPartial !== false
|
|
106
|
+
&&
|
|
107
|
+
report.status === "partial"
|
|
108
|
+
&& report.posted === 0
|
|
109
|
+
&& report.fetched > 0) {
|
|
110
|
+
return { retry: true, reason: RETRY_REASONS.PARTIAL_NO_POST };
|
|
111
|
+
}
|
|
112
|
+
// (5) Non-retry-by-default outcomes.
|
|
113
|
+
if (report.status === "success") {
|
|
114
|
+
return { retry: false, reason: RETRY_REASONS.SUCCESS };
|
|
115
|
+
}
|
|
116
|
+
if (report.status === "partial" && report.posted > 0) {
|
|
117
|
+
return { retry: false, reason: RETRY_REASONS.PARTIAL_WITH_POST };
|
|
118
|
+
}
|
|
119
|
+
if (report.status === "skipped") {
|
|
120
|
+
return { retry: false, reason: RETRY_REASONS.SKIPPED };
|
|
121
|
+
}
|
|
122
|
+
// Partial with fetched=0 and posted=0 — every fetch errored before
|
|
123
|
+
// returning items. The spec's matrix doesn't list this case; default
|
|
124
|
+
// to no-retry to keep the policy conservative (the §1.1 motivating
|
|
125
|
+
// failure is partial-no-post WITH fetched>0, which is already caught
|
|
126
|
+
// above). Operators who see this case in telemetry can override via
|
|
127
|
+
// `RetryPolicy.retryOn`.
|
|
128
|
+
return { retry: false, reason: RETRY_REASONS.NO_PROGRESS };
|
|
129
|
+
};
|
|
130
|
+
// ── Prior-attempt hint rendering (PRE_PASS_FAN_OUT_DESIGN.md §4.4) ────────
|
|
131
|
+
function xmlAttr(value) {
|
|
132
|
+
return value
|
|
133
|
+
.replace(/&/g, "&")
|
|
134
|
+
.replace(/"/g, """)
|
|
135
|
+
.replace(/</g, "<")
|
|
136
|
+
.replace(/>/g, ">");
|
|
137
|
+
}
|
|
138
|
+
function xmlText(value) {
|
|
139
|
+
return value
|
|
140
|
+
.replace(/&/g, "&")
|
|
141
|
+
.replace(/</g, "<")
|
|
142
|
+
.replace(/>/g, ">");
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Generic MVP hint prose. §4.4 calls out the OQ-3 upgrade path
|
|
146
|
+
* (schema-aware classifier that promotes the hint to a specific
|
|
147
|
+
* substitution, e.g. `limit` → `maxResults`); the MVP stays generic so
|
|
148
|
+
* the hint-builder is not coupled to upstream argument-name schemas
|
|
149
|
+
* that drift independently.
|
|
150
|
+
*/
|
|
151
|
+
const GENERIC_HINT_PROSE = "The previous attempt's call returned the error above. Re-read the partial body and try a different argument shape — the partial is the source of truth for tool argument names, not your memory of prior calls.";
|
|
152
|
+
function pickFirstError(errors) {
|
|
153
|
+
return errors.length > 0 ? errors[0] : undefined;
|
|
154
|
+
}
|
|
155
|
+
function renderErrorChild(err) {
|
|
156
|
+
const type = typeof err.type === "string" ? err.type : "unknown";
|
|
157
|
+
// Surface every string/number attribute (other than `type`) so the
|
|
158
|
+
// motivating §1.1 case carries `status="400"` and `message="…"`
|
|
159
|
+
// verbatim into the next attempt's prompt.
|
|
160
|
+
const attrEntries = Object.entries(err).filter(([k, v]) => k !== "type" && (typeof v === "string" || typeof v === "number"));
|
|
161
|
+
const attrs = attrEntries
|
|
162
|
+
.map(([k, v]) => `${xmlAttr(k)}="${xmlAttr(String(v))}"`)
|
|
163
|
+
.join(" ");
|
|
164
|
+
const tagName = xmlAttr(type.replace(/-/g, "_"));
|
|
165
|
+
return `<${tagName}${attrs ? " " + attrs : ""} />`;
|
|
166
|
+
}
|
|
167
|
+
function renderOnePriorAttempt(record, integrationKey) {
|
|
168
|
+
const openParts = [`attempt="${record.attempt}"`];
|
|
169
|
+
if (integrationKey !== undefined) {
|
|
170
|
+
openParts.push(`integration="${xmlAttr(integrationKey)}"`);
|
|
171
|
+
}
|
|
172
|
+
const lines = [`<prior_attempt_error ${openParts.join(" ")}>`];
|
|
173
|
+
const firstErr = pickFirstError(record.errors);
|
|
174
|
+
if (firstErr) {
|
|
175
|
+
lines.push(` ${renderErrorChild(firstErr)}`);
|
|
176
|
+
}
|
|
177
|
+
else if (record.parseError) {
|
|
178
|
+
lines.push(` <parse_failed reason="${xmlAttr(record.parseError)}" />`);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
// The attempt was retried but carried neither an explicit error nor
|
|
182
|
+
// a parseError — likely a coordinator-side timeout or quota error
|
|
183
|
+
// logged as a generic failed-status. Surface that explicitly so the
|
|
184
|
+
// model knows *something* went wrong, not just that retry was
|
|
185
|
+
// selected silently.
|
|
186
|
+
lines.push(` <failed status="${xmlAttr(record.status)}" />`);
|
|
187
|
+
}
|
|
188
|
+
lines.push(` <hint>${xmlText(GENERIC_HINT_PROSE)}</hint>`);
|
|
189
|
+
lines.push("</prior_attempt_error>");
|
|
190
|
+
return lines.join("\n");
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Render the `<prior_attempt_error>` block sequence injected into a
|
|
194
|
+
* sub-session's prompt on attempt > 1. Returns the empty string when
|
|
195
|
+
* `attempts` is empty so callers can unconditionally concatenate the
|
|
196
|
+
* result.
|
|
197
|
+
*
|
|
198
|
+
* **Ordering.** Newest first — attempt N (most recent) appears before
|
|
199
|
+
* attempt N-1, etc. The model reads the most-recent failure top of
|
|
200
|
+
* page; deeper history is context-only.
|
|
201
|
+
*/
|
|
202
|
+
export function buildPriorAttemptHintBlock(attempts, integrationKey) {
|
|
203
|
+
if (attempts.length === 0)
|
|
204
|
+
return "";
|
|
205
|
+
const newestFirst = [...attempts].reverse();
|
|
206
|
+
return newestFirst
|
|
207
|
+
.map((att) => renderOnePriorAttempt(att, integrationKey))
|
|
208
|
+
.join("\n");
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=routine-fetch-window-retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routine-fetch-window-retry.js","sourceRoot":"","sources":["../../src/core/routine-fetch-window-retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `RoutineFetchWindowRunner` —
|
|
2
|
+
* `RoutineFetchWindowRunner` — pre-pass fan-out coordinator.
|
|
3
3
|
*
|
|
4
|
-
* ROUTINE_DATA_ACQUISITION_DESIGN.md §6.1.1
|
|
5
|
-
* dispatcher (morning_routine, today_refresh,
|
|
6
|
-
* weekly / monthly review) calls this runner
|
|
7
|
-
* dispatching the parent session. The runner:
|
|
4
|
+
* ROUTINE_DATA_ACQUISITION_DESIGN.md §6.1.1 + PRE_PASS_FAN_OUT_DESIGN.md
|
|
5
|
+
* — every routine dispatcher (morning_routine, today_refresh,
|
|
6
|
+
* hourly_check, evening / weekly / monthly review) calls this runner
|
|
7
|
+
* immediately before dispatching the parent session. The runner:
|
|
8
8
|
*
|
|
9
9
|
* 1. Reads the per-routine plan from `ROUTINE_WINDOWS` and the current
|
|
10
|
-
* integration state, fans out per-account where applicable,
|
|
11
|
-
* each row's predicate (`direct` / `delegated-same` /
|
|
12
|
-
* / `native` / skip)
|
|
13
|
-
*
|
|
14
|
-
* 2.
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* `
|
|
19
|
-
* `
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* `
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
10
|
+
* integration state, fans rows out per-account where applicable,
|
|
11
|
+
* resolves each row's predicate (`direct` / `delegated-same` /
|
|
12
|
+
* `delegated-cross` / `native` / skip), and partitions the plan
|
|
13
|
+
* by `IntegrationKey` via `splitAcquisitionPlanByIntegration`.
|
|
14
|
+
* 2. Spawns one lite-tier `routine.fetch_window` sub-session per
|
|
15
|
+
* integration in parallel (bounded by `prePassFanOutConcurrency`).
|
|
16
|
+
* Each sub-session sees exactly one partial — the
|
|
17
|
+
* `{integration_partial}` placeholder in the
|
|
18
|
+
* `routine.fetch_window` task-flow is replaced with the body of
|
|
19
|
+
* `_partials/<integration prePassPartial>` so the lite-tier model
|
|
20
|
+
* never has to disambiguate cross-API argument names. Each
|
|
21
|
+
* sub-session runs through an independent retry loop bounded by
|
|
22
|
+
* `prePassMaxAttemptsPerIntegration`, `prePassBackoffMs`, and the
|
|
23
|
+
* per-integration / per-routine USD budget caps.
|
|
24
|
+
* 3. Merges the sub-reports into a single `FetchReport` (additive
|
|
25
|
+
* `<integration>` children on the `<fetch_report>` XML block) and
|
|
26
|
+
* returns it plus the rendered block.
|
|
27
|
+
* 4. The caller grafts the block into the **parent** routine event's
|
|
28
|
+
* `event.data.fetchReportBlock`. ContextBuilder injects it verbatim
|
|
29
|
+
* into the parent session's prompt (mirrors the `<gate_decision>`
|
|
30
|
+
* pattern used by hourly_check Stage 3).
|
|
29
31
|
*
|
|
30
|
-
* Failure-mode contract (
|
|
32
|
+
* Failure-mode contract (PRE_PASS_FAN_OUT_DESIGN.md §5):
|
|
31
33
|
*
|
|
32
34
|
* - **No applicable rows** (routine has no windows in `ROUTINE_WINDOWS`,
|
|
33
35
|
* every integration is disabled, every account list is empty) — the
|
|
@@ -35,16 +37,17 @@
|
|
|
35
37
|
* `fetched=posted=duplicates=0`. The parent routine still runs; the
|
|
36
38
|
* block is informational only.
|
|
37
39
|
* - **Pre-pass session errors** (binding resolve fails, agent throws,
|
|
38
|
-
* JSON parse fails) —
|
|
39
|
-
*
|
|
40
|
-
* Pre-pass cost gains
|
|
41
|
-
*
|
|
40
|
+
* JSON parse fails) — recorded per-attempt; the retry loop fires up
|
|
41
|
+
* to `maxAttempts` before giving up. Final per-integration status
|
|
42
|
+
* surfaces in `<integration status="failed">`. Pre-pass cost gains
|
|
43
|
+
* are forfeit for that integration; siblings are unaffected.
|
|
42
44
|
* Throwing here would otherwise propagate up and abort the parent
|
|
43
45
|
* routine — the opposite of P3 ("Lite for Fetch, Medium for Decide").
|
|
44
46
|
* - **Partial success** — the report's `errors` array carries per-row
|
|
45
|
-
* failures (`no-surface`, `fetch-failed`, `budget-exhausted
|
|
46
|
-
* block surfaces them so the
|
|
47
|
-
* treat its observations view as
|
|
47
|
+
* failures (`no-surface`, `fetch-failed`, `budget-exhausted`,
|
|
48
|
+
* `budget-cap`, `global-budget-cap`). The block surfaces them so the
|
|
49
|
+
* parent prompt can decide whether to treat its observations view as
|
|
50
|
+
* complete.
|
|
48
51
|
*/
|
|
49
52
|
import type Database from "better-sqlite3";
|
|
50
53
|
import type { BackendId, Event, IntegrationKey, IntegrationState } from "@aitne/shared";
|
|
@@ -80,6 +83,56 @@ export interface FetchReport {
|
|
|
80
83
|
failureReason?: string;
|
|
81
84
|
/** Stable ID for telemetry tie-back; mirrors the fetcher event's correlationId. */
|
|
82
85
|
fetcherCorrelationId?: string;
|
|
86
|
+
/**
|
|
87
|
+
* PRE_PASS_FAN_OUT_DESIGN.md §4.5 — per-integration breakdown. Top-level
|
|
88
|
+
* counts above already aggregate the children; the breakdown lets
|
|
89
|
+
* downstream consumers (parent task-flow prose, dashboard renderers)
|
|
90
|
+
* branch per integration. Absent on the `skipped` / `failed` paths
|
|
91
|
+
* that short-circuit before fan-out (no-routine-key, no-windows,
|
|
92
|
+
* empty plan, plan-assembly-failed).
|
|
93
|
+
*/
|
|
94
|
+
perIntegration?: ReadonlyArray<SubReport>;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* PRE_PASS_FAN_OUT_DESIGN.md §4.3 — one attempt of one integration's
|
|
98
|
+
* sub-session. The fan-out coordinator records one of these per
|
|
99
|
+
* `agentRouter.execute` invocation; `defaultRetryDecision` consumes
|
|
100
|
+
* the latest record to decide whether to spawn another attempt.
|
|
101
|
+
*/
|
|
102
|
+
export interface SubAttemptRecord {
|
|
103
|
+
/** 1-indexed. */
|
|
104
|
+
attempt: number;
|
|
105
|
+
status: FetchReport["status"];
|
|
106
|
+
fetched: number;
|
|
107
|
+
posted: number;
|
|
108
|
+
duplicates: number;
|
|
109
|
+
errors: ReadonlyArray<Record<string, unknown>>;
|
|
110
|
+
/** Set when the agent's output failed strict-JSON parse. */
|
|
111
|
+
parseError?: string;
|
|
112
|
+
fetcherCorrelationId: string;
|
|
113
|
+
/** ISO 8601 UTC. */
|
|
114
|
+
startedAt: string;
|
|
115
|
+
/** ISO 8601 UTC. */
|
|
116
|
+
endedAt: string;
|
|
117
|
+
costUsd: number;
|
|
118
|
+
numTurns: number;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* PRE_PASS_FAN_OUT_DESIGN.md §4.3 — final per-integration verdict the
|
|
122
|
+
* coordinator emits after its retry loop terminates. Mirrors the
|
|
123
|
+
* fields of the last `SubAttemptRecord` (the final attempt's outcome
|
|
124
|
+
* is the integration's effective outcome) plus the integration key
|
|
125
|
+
* and the full attempt history.
|
|
126
|
+
*/
|
|
127
|
+
export interface SubReport extends SubAttemptRecord {
|
|
128
|
+
integrationKey: IntegrationKey;
|
|
129
|
+
/** Full attempt history; `attempts[attempts.length - 1]` matches the inherited fields. */
|
|
130
|
+
attempts: ReadonlyArray<SubAttemptRecord>;
|
|
131
|
+
/**
|
|
132
|
+
* True iff the loop exhausted `maxAttempts` (or a budget/global cap
|
|
133
|
+
* tripped) without reaching a non-retryable success state.
|
|
134
|
+
*/
|
|
135
|
+
retriesExhausted: boolean;
|
|
83
136
|
}
|
|
84
137
|
export interface RoutineFetchWindowResult {
|
|
85
138
|
report: FetchReport;
|
|
@@ -100,6 +153,24 @@ export interface RoutineFetchWindowRunnerDeps {
|
|
|
100
153
|
* doesn't need to depend on the registry directly.
|
|
101
154
|
*/
|
|
102
155
|
getActiveMailAccounts: () => readonly MailAccount[];
|
|
156
|
+
/**
|
|
157
|
+
* Lazy accessor for the dashboard SSE event broadcaster (A2 / B2
|
|
158
|
+
* observability extension). When set, the runner emits
|
|
159
|
+
* `kind: "prepass_started"` / `"prepass_completed"` payloads to the
|
|
160
|
+
* default `event` SSE channel so the setup wizard can render the
|
|
161
|
+
* "Fetching your mail and Notion data…" sub-step distinctly from
|
|
162
|
+
* the parent routine's `routine_started` / `routine_completed`
|
|
163
|
+
* envelope. Returns `null` when the dispatcher has not wired a
|
|
164
|
+
* broadcaster yet (test paths, headless installs); the runner
|
|
165
|
+
* treats every call as fire-and-forget and never propagates a
|
|
166
|
+
* broadcaster failure into the parent dispatch.
|
|
167
|
+
*
|
|
168
|
+
* Optional — when undefined the runner runs exactly as it did
|
|
169
|
+
* pre-A2, including the empty-plan short-circuit.
|
|
170
|
+
*/
|
|
171
|
+
getEventBroadcaster?: () => {
|
|
172
|
+
broadcastEvent: (data: unknown) => void;
|
|
173
|
+
} | null;
|
|
103
174
|
}
|
|
104
175
|
/**
|
|
105
176
|
* Compose the per-execute `allowedToolsOverride` for the pre-pass. The
|
|
@@ -118,6 +189,22 @@ export interface RoutineFetchWindowRunnerDeps {
|
|
|
118
189
|
* the partial records `no-surface` and the runner's report carries
|
|
119
190
|
* the gap forward to the parent routine.
|
|
120
191
|
*
|
|
192
|
+
* `ToolSearch` is appended for Claude sessions whenever at least one
|
|
193
|
+
* descriptor-bound MCP tool is present. Claude Code 2.1+ defers large
|
|
194
|
+
* MCP tool manifests (`mcp__claude_ai_Gmail__*`,
|
|
195
|
+
* `mcp__claude_ai_Google_Calendar__*`, `mcp__claude_ai_Notion__*`, …)
|
|
196
|
+
* behind `ToolSearch`, so the model must call `ToolSearch` to load a
|
|
197
|
+
* deferred tool's schema before it can be invoked. Without `ToolSearch`
|
|
198
|
+
* allowed, the Haiku fetcher emits a denied ToolSearch call on its
|
|
199
|
+
* first turn, gives up, and returns text with no JSON — the parent
|
|
200
|
+
* routine then sees `<fetch_report status="failed" reason="no-json-object">`.
|
|
201
|
+
* Mirrors the same workaround in `claude-delegated.ts` (delegated proxy
|
|
202
|
+
* `allowedTools: [toolName, "ToolSearch"]`). Codex / Gemini have no
|
|
203
|
+
* per-spawn allowedTools surface today and ignore the override entirely
|
|
204
|
+
* (CLAUDE.md acknowledges the gap), so the `ToolSearch` widening is
|
|
205
|
+
* gated on `sessionBackend === "claude"` to keep the list minimal for
|
|
206
|
+
* other backends.
|
|
207
|
+
*
|
|
121
208
|
* Exported for unit testing — the runner consumes it via
|
|
122
209
|
* `composePrePassAllowedTools` at dispatch time.
|
|
123
210
|
*/
|
|
@@ -162,6 +249,65 @@ export declare function renderFetchReportBlock(report: FetchReport, meta: {
|
|
|
162
249
|
routine: RoutineWindowKey | string;
|
|
163
250
|
agentDay: string;
|
|
164
251
|
}): string;
|
|
252
|
+
/**
|
|
253
|
+
* Resolve the aggregate `<fetch_report>` status from a set of
|
|
254
|
+
* sub-reports' final statuses, per §4.5:
|
|
255
|
+
*
|
|
256
|
+
* - `success` iff every non-skipped sub-report is `success`. Skipped
|
|
257
|
+
* sub-reports do not count against success.
|
|
258
|
+
* - `failed` iff every non-skipped sub-report is `failed`.
|
|
259
|
+
* - `partial` for any other mix (incl. one success + one failed).
|
|
260
|
+
* - `skipped` only when the input is empty (the caller handles
|
|
261
|
+
* "every sub-report skipped" separately — the runner short-circuits
|
|
262
|
+
* before fan-out when no integrations are active).
|
|
263
|
+
*
|
|
264
|
+
* Exported for unit testing the status-resolution branch in isolation.
|
|
265
|
+
*/
|
|
266
|
+
export declare function aggregateFanOutStatus(subReports: readonly SubReport[]): FetchReport["status"];
|
|
267
|
+
/** Headline numbers for one integration's full retry chain. */
|
|
268
|
+
export interface IntegrationSummary {
|
|
269
|
+
key: IntegrationKey;
|
|
270
|
+
status: FetchReport["status"];
|
|
271
|
+
attempts: number;
|
|
272
|
+
fetched: number;
|
|
273
|
+
posted: number;
|
|
274
|
+
duplicates: number;
|
|
275
|
+
costUsd: number;
|
|
276
|
+
durationMs: number;
|
|
277
|
+
/** Set only when status === "failed"; first error message of final attempt. */
|
|
278
|
+
finalError?: string;
|
|
279
|
+
}
|
|
280
|
+
/** Headline numbers for the whole fan-out routine. */
|
|
281
|
+
export interface AggregateSummary {
|
|
282
|
+
status: FetchReport["status"];
|
|
283
|
+
fetched: number;
|
|
284
|
+
posted: number;
|
|
285
|
+
duplicates: number;
|
|
286
|
+
costUsd: number;
|
|
287
|
+
}
|
|
288
|
+
export declare function summarizeIntegrationReport(sub: SubReport): IntegrationSummary;
|
|
289
|
+
export declare function summarizeFetchReport(report: FetchReport): AggregateSummary;
|
|
290
|
+
/**
|
|
291
|
+
* Merge fan-out sub-reports into a single `FetchReport` + the rendered
|
|
292
|
+
* `<fetch_report>` XML block the parent routine sees. §4.5.
|
|
293
|
+
*
|
|
294
|
+
* - Counts (`fetched`, `posted`, `duplicates`): arithmetic sum.
|
|
295
|
+
* - `errors`: concatenation, each error tagged with
|
|
296
|
+
* `integration: <key>` (and the per-attempt rows already carry
|
|
297
|
+
* `attempt: <n>` via the runner's per-attempt error-recording —
|
|
298
|
+
* `mergeSubReports` does not invent annotations beyond `integration`).
|
|
299
|
+
* - `status`: `aggregateFanOutStatus`.
|
|
300
|
+
* - `failureReason`: only when aggregate is `failed`; one-line summary
|
|
301
|
+
* listing the failed integrations and their attempt counts.
|
|
302
|
+
* - `perIntegration`: sorted by `INTEGRATION_KEYS` order regardless of
|
|
303
|
+
* completion order (deterministic — §4.6).
|
|
304
|
+
*
|
|
305
|
+
* Pure function: no side effects, no DB / clock dependencies.
|
|
306
|
+
*/
|
|
307
|
+
export declare function mergeSubReports(subReports: readonly SubReport[], routine: RoutineWindowKey | string, agentDay: string): {
|
|
308
|
+
report: FetchReport;
|
|
309
|
+
block: string;
|
|
310
|
+
};
|
|
165
311
|
export declare class RoutineFetchWindowRunner {
|
|
166
312
|
private readonly db;
|
|
167
313
|
private readonly config;
|
|
@@ -170,7 +316,21 @@ export declare class RoutineFetchWindowRunner {
|
|
|
170
316
|
private readonly audit;
|
|
171
317
|
private readonly prompt;
|
|
172
318
|
private readonly getActiveMailAccounts;
|
|
319
|
+
private readonly getEventBroadcaster;
|
|
173
320
|
constructor(deps: RoutineFetchWindowRunnerDeps);
|
|
321
|
+
/**
|
|
322
|
+
* Broadcast a single pre-pass progress event to the dashboard SSE
|
|
323
|
+
* channel. Failure is contained — the broadcaster contract is
|
|
324
|
+
* fire-and-forget and a misbehaving writer must not affect the
|
|
325
|
+
* runner's return value or the parent routine's dispatch.
|
|
326
|
+
*
|
|
327
|
+
* Schema (default `event` SSE channel, matches existing
|
|
328
|
+
* `kind: "main_backend_changed"` / `"routine_started"` pattern):
|
|
329
|
+
* { kind, routine, source, correlationId, timestamp, status? }
|
|
330
|
+
* `status` is set on `prepass_completed` only and reflects the
|
|
331
|
+
* FetchReport.status field (success / partial / failed / skipped).
|
|
332
|
+
*/
|
|
333
|
+
private broadcastPrepassProgress;
|
|
174
334
|
/**
|
|
175
335
|
* Execute the pre-pass for `parentEvent`. Returns the fetch report
|
|
176
336
|
* and rendered `<fetch_report>` block; callers graft the block into
|
|
@@ -183,6 +343,72 @@ export declare class RoutineFetchWindowRunner {
|
|
|
183
343
|
* but the seam exists for future divergence).
|
|
184
344
|
*/
|
|
185
345
|
run(parentEvent: Event, routineKey?: RoutineWindowKey): Promise<RoutineFetchWindowResult>;
|
|
346
|
+
private runImpl;
|
|
347
|
+
private buildFanOutPlanContext;
|
|
348
|
+
/**
|
|
349
|
+
* §5 BackendQuotaError row + §4.4 retryEscalationTier — re-derive the
|
|
350
|
+
* per-integration sub-plan against the CURRENT attempt's binding so a
|
|
351
|
+
* cross-backend swap (escalation tier flips main backend, or
|
|
352
|
+
* `prePassRetryEscalationTier` swaps the per-attempt tier) keeps the
|
|
353
|
+
* plan's `<fetch mode="…">` attribute aligned with the partial body's
|
|
354
|
+
* remaining mode-branch (the partial is filtered for the new backend
|
|
355
|
+
* via `renderPartialForFanOut`). Returns null only when the
|
|
356
|
+
* integration becomes unreachable on the new backend (e.g. native
|
|
357
|
+
* mode bound to A but the attempt re-resolves to B); the runner
|
|
358
|
+
* passes the call through to record the original sub-plan and let
|
|
359
|
+
* the agent emit `no-surface` errors organically.
|
|
360
|
+
*
|
|
361
|
+
* Pure: snapshot inputs (`integrationsSnapshot`, `accounts`,
|
|
362
|
+
* `timestamps`) are frozen at run() entry; only `sessionBackend`
|
|
363
|
+
* varies across attempts. Re-derivation is cheap —
|
|
364
|
+
* `splitAcquisitionPlanByIntegration` walks `ROUTINE_WINDOWS[routine]`
|
|
365
|
+
* (a small constant) without I/O.
|
|
366
|
+
*/
|
|
367
|
+
private rebuildSubPlanForBackend;
|
|
368
|
+
private buildRetryPolicy;
|
|
369
|
+
private fanOutConcurrency;
|
|
370
|
+
private retryEscalationTier;
|
|
371
|
+
private runFanOut;
|
|
372
|
+
private runOneIntegrationWithRetry;
|
|
373
|
+
/**
|
|
374
|
+
* Emit `prepass_subsession_started` for an attempt that is about to run.
|
|
375
|
+
* Called at the TOP of every loop iteration so the started/completed
|
|
376
|
+
* pair is symmetric across all paths — including binding-resolve-failed
|
|
377
|
+
* and budget-cap short-circuits, which previously emitted neither.
|
|
378
|
+
*/
|
|
379
|
+
private emitSubSessionStarted;
|
|
380
|
+
/**
|
|
381
|
+
* Emit `prepass_subsession_completed` for an attempt that has just
|
|
382
|
+
* recorded its outcome. Mirror of `emitSubSessionStarted` — invoked
|
|
383
|
+
* once per iteration after every code path that pushes a record
|
|
384
|
+
* (success, parse error, agent throw, binding-resolve-failed,
|
|
385
|
+
* global-budget-cap, per-integration-budget-cap).
|
|
386
|
+
*/
|
|
387
|
+
private emitSubSessionCompleted;
|
|
388
|
+
private createFanOutFetcherEvent;
|
|
389
|
+
private sliceIntegrationSnapshot;
|
|
390
|
+
private attemptRecordFromResult;
|
|
391
|
+
private failedAttemptRecord;
|
|
392
|
+
private budgetCapAttemptRecord;
|
|
393
|
+
private didExhaustRetries;
|
|
394
|
+
private backoffForAttempt;
|
|
395
|
+
/**
|
|
396
|
+
* Unified audit-row companion for every fan-out failure mode —
|
|
397
|
+
* binding-resolve-failed, global-budget-cap, budget-cap (per-integration),
|
|
398
|
+
* context-build-failed, and agent-execute-failed. Routes through
|
|
399
|
+
* `audit.logError` (writes `result='failed'`) with a `prePass` payload
|
|
400
|
+
* so `MetricsCollector.collectPrePassMetrics` can see every failure
|
|
401
|
+
* mode without a parallel `result='success'` row. Before this helper
|
|
402
|
+
* existed, the four pre-execute branches wrote nothing at all and the
|
|
403
|
+
* agent-execute path wrote a `failureKind`-only row that the aggregator
|
|
404
|
+
* silently skipped (it filters on `detail.prePass` being a non-null
|
|
405
|
+
* object). Cost / tokens are intentionally NOT supplied — pre-execute
|
|
406
|
+
* paths have zero cost, the agent-execute throw path has no usable
|
|
407
|
+
* AgentResult, so any figure here would be a guess; the aggregator
|
|
408
|
+
* coalesces missing `cost_usd` to 0.
|
|
409
|
+
*/
|
|
410
|
+
private logFanOutFailure;
|
|
411
|
+
private logFanOutAttempt;
|
|
186
412
|
/**
|
|
187
413
|
* Helper for the failure paths — renders a `<fetch_report status="failed">`
|
|
188
414
|
* block and logs the underlying error. Never throws so the caller can
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routine-fetch-window-runner.d.ts","sourceRoot":"","sources":["../../src/core/routine-fetch-window-runner.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"routine-fetch-window-runner.d.ts","sourceRoot":"","sources":["../../src/core/routine-fetch-window-runner.ts"],"names":[],"mappings":"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"}
|