@caupulican/pi-adaptative 0.90.7 → 0.90.12
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/CHANGELOG.md +56 -0
- package/dist/bundled-resources/skills/tool-call-repair/SKILL.md +5 -4
- package/dist/bundled-resources/skills/tool-call-repair/references/failure-grammar.md +6 -3
- package/dist/bundled-resources/skills/tool-call-repair/references/repair-catalogue.md +1 -0
- package/dist/core/agent-session-contracts.d.ts +2 -0
- package/dist/core/agent-session-contracts.d.ts.map +1 -1
- package/dist/core/agent-session-contracts.js.map +1 -1
- package/dist/core/agent-session.d.ts +8 -7
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +84 -197
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/autonomy/bounded-completion.d.ts +7 -1
- package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
- package/dist/core/autonomy/bounded-completion.js +8 -2
- package/dist/core/autonomy/bounded-completion.js.map +1 -1
- package/dist/core/autonomy/contracts.d.ts +1 -1
- package/dist/core/autonomy/contracts.d.ts.map +1 -1
- package/dist/core/autonomy/contracts.js.map +1 -1
- package/dist/core/background-lane-controller.d.ts +14 -0
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +32 -0
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/billing-failover-controller.js +1 -1
- package/dist/core/billing-failover-controller.js.map +1 -1
- package/dist/core/context/current-work-memory.d.ts +1 -1
- package/dist/core/context/current-work-memory.d.ts.map +1 -1
- package/dist/core/context/current-work-memory.js +2 -1
- package/dist/core/context/current-work-memory.js.map +1 -1
- package/dist/core/context/long-term-memory-trigger.d.ts +1 -1
- package/dist/core/context/long-term-memory-trigger.d.ts.map +1 -1
- package/dist/core/context/long-term-memory-trigger.js +2 -1
- package/dist/core/context/long-term-memory-trigger.js.map +1 -1
- package/dist/core/delegation/managed-lane-controller.js +2 -2
- package/dist/core/delegation/managed-lane-controller.js.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts +13 -0
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.js +71 -8
- package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.js +13 -8
- package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
- package/dist/core/delegation/worker-claim.d.ts.map +1 -1
- package/dist/core/delegation/worker-claim.js +14 -1
- package/dist/core/delegation/worker-claim.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts +3 -2
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +95 -42
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -1
- package/dist/core/delegation/worker-fleet-limits.js +5 -1
- package/dist/core/delegation/worker-fleet-limits.js.map +1 -1
- package/dist/core/delegation/worker-lane-projection.d.ts.map +1 -1
- package/dist/core/delegation/worker-lane-projection.js +7 -4
- package/dist/core/delegation/worker-lane-projection.js.map +1 -1
- package/dist/core/delegation/worker-lifecycle.d.ts +8 -0
- package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -1
- package/dist/core/delegation/worker-lifecycle.js.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.d.ts +21 -0
- package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.js +65 -2
- package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-runner.d.ts +7 -0
- package/dist/core/delegation/worker-runner.d.ts.map +1 -1
- package/dist/core/delegation/worker-runner.js +24 -7
- package/dist/core/delegation/worker-runner.js.map +1 -1
- package/dist/core/delegation/worker-system-prompt.d.ts +54 -0
- package/dist/core/delegation/worker-system-prompt.d.ts.map +1 -0
- package/dist/core/delegation/worker-system-prompt.js +85 -0
- package/dist/core/delegation/worker-system-prompt.js.map +1 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-tree-budget-coordinator.js +4 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.d.ts +4 -0
- package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.js +28 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
- package/dist/core/durable-custom-message-turn-controller.d.ts.map +1 -1
- package/dist/core/durable-custom-message-turn-controller.js +14 -3
- package/dist/core/durable-custom-message-turn-controller.js.map +1 -1
- package/dist/core/extension-binding-controller.d.ts +107 -0
- package/dist/core/extension-binding-controller.d.ts.map +1 -0
- package/dist/core/extension-binding-controller.js +224 -0
- package/dist/core/extension-binding-controller.js.map +1 -0
- package/dist/core/extensions/extension-session-scope.d.ts +17 -0
- package/dist/core/extensions/extension-session-scope.d.ts.map +1 -0
- package/dist/core/extensions/extension-session-scope.js +135 -0
- package/dist/core/extensions/extension-session-scope.js.map +1 -0
- package/dist/core/extensions/index.d.ts +1 -0
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +1 -0
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/types.d.ts +2 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts +2 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js +10 -4
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts +9 -0
- package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.js +35 -9
- package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
- package/dist/core/goal-loop-controller.d.ts.map +1 -1
- package/dist/core/goal-loop-controller.js +10 -1
- package/dist/core/goal-loop-controller.js.map +1 -1
- package/dist/core/goals/compact-goal-context.d.ts +1 -1
- package/dist/core/goals/compact-goal-context.d.ts.map +1 -1
- package/dist/core/goals/compact-goal-context.js +2 -1
- package/dist/core/goals/compact-goal-context.js.map +1 -1
- package/dist/core/goals/goal-execution-errors.d.ts +18 -0
- package/dist/core/goals/goal-execution-errors.d.ts.map +1 -0
- package/dist/core/goals/goal-execution-errors.js +21 -0
- package/dist/core/goals/goal-execution-errors.js.map +1 -0
- package/dist/core/goals/goal-lifecycle.d.ts.map +1 -1
- package/dist/core/goals/goal-lifecycle.js +3 -3
- package/dist/core/goals/goal-lifecycle.js.map +1 -1
- package/dist/core/goals/goal-session-controller.d.ts +11 -0
- package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-session-controller.js +74 -14
- package/dist/core/goals/goal-session-controller.js.map +1 -1
- package/dist/core/goals/goal-state.js +1 -1
- package/dist/core/goals/goal-state.js.map +1 -1
- package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
- package/dist/core/goals/goal-tool-core.js +2 -2
- package/dist/core/goals/goal-tool-core.js.map +1 -1
- package/dist/core/goals/natural-language-goal.d.ts +18 -0
- package/dist/core/goals/natural-language-goal.d.ts.map +1 -1
- package/dist/core/goals/natural-language-goal.js +99 -16
- package/dist/core/goals/natural-language-goal.js.map +1 -1
- package/dist/core/model-registry.d.ts +5 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +10 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +3 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/orchestration/capability-gateway.d.ts +1 -1
- package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
- package/dist/core/orchestration/capability-gateway.js +4 -4
- package/dist/core/orchestration/capability-gateway.js.map +1 -1
- package/dist/core/orchestration/event-store.d.ts +8 -0
- package/dist/core/orchestration/event-store.d.ts.map +1 -1
- package/dist/core/orchestration/event-store.js +9 -7
- package/dist/core/orchestration/event-store.js.map +1 -1
- package/dist/core/orchestration/task-runtime-reducer.js +1 -1
- package/dist/core/orchestration/task-runtime-reducer.js.map +1 -1
- package/dist/core/orchestration/worker-model-pins.d.ts +7 -0
- package/dist/core/orchestration/worker-model-pins.d.ts.map +1 -1
- package/dist/core/orchestration/worker-model-pins.js +17 -1
- package/dist/core/orchestration/worker-model-pins.js.map +1 -1
- package/dist/core/provider-request-runtime-controller.d.ts +9 -0
- package/dist/core/provider-request-runtime-controller.d.ts.map +1 -1
- package/dist/core/provider-request-runtime-controller.js +17 -3
- package/dist/core/provider-request-runtime-controller.js.map +1 -1
- package/dist/core/provider-tool-text.d.ts +15 -1
- package/dist/core/provider-tool-text.d.ts.map +1 -1
- package/dist/core/provider-tool-text.js +42 -10
- package/dist/core/provider-tool-text.js.map +1 -1
- package/dist/core/research/research-lane-controller.d.ts +1 -1
- package/dist/core/research/research-lane-controller.d.ts.map +1 -1
- package/dist/core/research/research-lane-controller.js +2 -1
- package/dist/core/research/research-lane-controller.js.map +1 -1
- package/dist/core/resource-loader.d.ts +3 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +8 -0
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-builder.d.ts +8 -0
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +6 -0
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/session-supervision-runtime.d.ts.map +1 -1
- package/dist/core/session-supervision-runtime.js +2 -1
- package/dist/core/session-supervision-runtime.js.map +1 -1
- package/dist/core/settings-manager.d.ts +2 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +7 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/tasks/task-state.d.ts +1 -1
- package/dist/core/tasks/task-state.d.ts.map +1 -1
- package/dist/core/tasks/task-state.js +4 -2
- package/dist/core/tasks/task-state.js.map +1 -1
- package/dist/core/tools/delegate.d.ts +13 -0
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +20 -18
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/util/atomic-file.d.ts +7 -0
- package/dist/core/util/atomic-file.d.ts.map +1 -1
- package/dist/core/util/atomic-file.js +8 -6
- package/dist/core/util/atomic-file.js.map +1 -1
- package/dist/core/util/faultable-fs.d.ts +30 -0
- package/dist/core/util/faultable-fs.d.ts.map +1 -0
- package/dist/core/util/faultable-fs.js +30 -0
- package/dist/core/util/faultable-fs.js.map +1 -0
- package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
- package/dist/modes/interactive/auth-dialogs-controller.js +1 -0
- package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
- package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
- package/dist/modes/interactive/components/activity-lane.js +4 -3
- package/dist/modes/interactive/components/activity-lane.js.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +2 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +3 -2
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/report-commands.js +1 -1
- package/dist/modes/interactive/report-commands.js.map +1 -1
- package/dist/modes/interactive/session-flow-commands.d.ts +1 -1
- package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
- package/dist/modes/interactive/session-flow-commands.js +3 -2
- package/dist/modes/interactive/session-flow-commands.js.map +1 -1
- package/docs/extensions.md +1 -0
- package/docs/providers.md +3 -0
- package/docs/settings.md +4 -2
- package/docs/tool-repair.md +1 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +9 -4
|
@@ -16,6 +16,13 @@ export type WorkerModelPinPolicy = {
|
|
|
16
16
|
} | {
|
|
17
17
|
status: "active";
|
|
18
18
|
byRole: Readonly<Partial<Record<WorkerRole, ResolvedWorkerModelPin>>>;
|
|
19
|
+
/**
|
|
20
|
+
* Non-blocking configuration observations (e.g. role entries with no `default`, which
|
|
21
|
+
* leaves every unlisted role unpinned and admits any caller-requested model for it).
|
|
22
|
+
* Never gates admission — see resolveWorkerModelPin and the delegation-time
|
|
23
|
+
* `modelPinBypass` diagnostic in worker-delegation-controller.ts.
|
|
24
|
+
*/
|
|
25
|
+
diagnostics?: readonly string[];
|
|
19
26
|
};
|
|
20
27
|
export interface WorkerModelPinPolicyLayers {
|
|
21
28
|
global?: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-model-pins.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/worker-model-pins.ts"],"names":[],"mappings":"AACA,OAAO,EAIN,KAAK,yBAAyB,EAE9B,KAAK,UAAU,EACf,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAE7E,MAAM,WAAW,uBAAuB;IACvC,OAAO,CAAC,EAAE,yBAAyB,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,yBAAyB,CAAC;IACnC,MAAM,EAAE,oBAAoB,CAAC;CAC7B;AAED,MAAM,MAAM,oBAAoB,GAC7B;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GACpB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACrD;IACA,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"worker-model-pins.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/worker-model-pins.ts"],"names":[],"mappings":"AACA,OAAO,EAIN,KAAK,yBAAyB,EAE9B,KAAK,UAAU,EACf,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAE7E,MAAM,WAAW,uBAAuB;IACvC,OAAO,CAAC,EAAE,yBAAyB,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,yBAAyB,CAAC;IACnC,MAAM,EAAE,oBAAoB,CAAC;CAC7B;AAED,MAAM,MAAM,oBAAoB,GAC7B;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GACpB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACrD;IACA,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACtE;;;;;OAKG;IACH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEL,MAAM,WAAW,0BAA0B;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC3B;AAqJD,2FAA2F;AAC3F,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,0BAA0B,GAAG,oBAAoB,CAsCpG;AAED,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,UAAU,GACd,sBAAsB,GAAG,SAAS,CAIpC"}
|
|
@@ -130,7 +130,23 @@ export function compileWorkerModelPinPolicy(layers) {
|
|
|
130
130
|
if (pin)
|
|
131
131
|
byRole[role] = pin;
|
|
132
132
|
}
|
|
133
|
-
|
|
133
|
+
if (Object.keys(byRole).length === 0)
|
|
134
|
+
return { status: "absent" };
|
|
135
|
+
// A roles-only config (no `default` in any layer) leaves every unlisted role unpinned: a caller
|
|
136
|
+
// can delegate with an unlisted role plus an explicit model and admission never sees a pin to
|
|
137
|
+
// enforce. That's not a blocking error (the owner may intend it), but it must be observable.
|
|
138
|
+
const hasDefault = Boolean(globalLayer?.settings.default ?? projectLayer?.settings.default ?? directoryLayer?.settings.default);
|
|
139
|
+
const unpinnedRoles = WORKER_ROLES.filter((role) => !(role in byRole));
|
|
140
|
+
const policyDiagnostics = !hasDefault && unpinnedRoles.length > 0
|
|
141
|
+
? [
|
|
142
|
+
`workerDelegation.modelPins configures role entries but no default: ${unpinnedRoles.join(", ")} remain unpinned and admit any caller-requested model. Add a default to close the gap.`,
|
|
143
|
+
]
|
|
144
|
+
: [];
|
|
145
|
+
return {
|
|
146
|
+
status: "active",
|
|
147
|
+
byRole,
|
|
148
|
+
...(policyDiagnostics.length > 0 ? { diagnostics: policyDiagnostics } : {}),
|
|
149
|
+
};
|
|
134
150
|
}
|
|
135
151
|
export function resolveWorkerModelPin(policy, role) {
|
|
136
152
|
if (policy.status !== "active")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-model-pins.js","sourceRoot":"","sources":["../../../src/core/orchestration/worker-model-pins.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPlainRecord } from \"../util/value-guards.ts\";\nimport {\n\tMAX_ORCHESTRATION_MODEL_ID_LENGTH,\n\tMAX_ORCHESTRATION_MODEL_PROVIDER_LENGTH,\n\tORCHESTRATION_THINKING_LEVELS,\n\ttype OrchestrationModelBinding,\n\tWORKER_ROLES,\n\ttype WorkerRole,\n} from \"./contracts.ts\";\n\nexport type WorkerModelPinSource = \"global\" | \"project\" | \"directoryProfile\";\n\nexport interface WorkerModelPinsSettings {\n\tdefault?: OrchestrationModelBinding;\n\troles?: Partial<Record<WorkerRole, OrchestrationModelBinding>>;\n}\n\nexport interface ResolvedWorkerModelPin {\n\tbinding: OrchestrationModelBinding;\n\tsource: WorkerModelPinSource;\n}\n\nexport type WorkerModelPinPolicy =\n\t| { status: \"absent\" }\n\t| { status: \"invalid\"; diagnostics: readonly string[] }\n\t| {\n\t\t\tstatus: \"active\";\n\t\t\tbyRole: Readonly<Partial<Record<WorkerRole, ResolvedWorkerModelPin>>>;\n\t };\n\nexport interface WorkerModelPinPolicyLayers {\n\tglobal?: unknown;\n\tproject?: unknown;\n\tdirectoryProfile?: unknown;\n}\n\ninterface NormalizedPinLayer {\n\tsettings: WorkerModelPinsSettings;\n\tsource: WorkerModelPinSource;\n}\n\ninterface ParsedPinLayer {\n\tpresent: boolean;\n\tsettings?: WorkerModelPinsSettings;\n\tdiagnostics: string[];\n}\n\nconst POLICY_KEYS = new Set([\"default\", \"roles\"]);\nconst BINDING_KEYS = new Set([\"provider\", \"modelId\", \"thinkingLevel\"]);\nconst WORKER_ROLE_SET: ReadonlySet<string> = new Set(WORKER_ROLES);\nconst THINKING_LEVEL_SET: ReadonlySet<string> = new Set(ORCHESTRATION_THINKING_LEVELS);\n\nfunction cloneBinding(binding: OrchestrationModelBinding): OrchestrationModelBinding {\n\treturn { ...binding };\n}\n\nfunction bindingDiagnostic(scope: WorkerModelPinSource, path: string, expectation: string): string {\n\treturn `workerDelegation.modelPins.${path} in ${scope} settings must ${expectation}`;\n}\n\nfunction parseBinding(\n\tvalue: unknown,\n\tscope: WorkerModelPinSource,\n\tpath: string,\n\tdiagnostics: string[],\n): OrchestrationModelBinding | undefined {\n\tif (!isPlainRecord(value)) {\n\t\tdiagnostics.push(bindingDiagnostic(scope, path, \"be an object\"));\n\t\treturn undefined;\n\t}\n\tconst unknownKeys = Object.keys(value).filter((key) => !BINDING_KEYS.has(key));\n\tif (unknownKeys.length > 0) {\n\t\tdiagnostics.push(bindingDiagnostic(scope, path, `contain only provider, modelId, and thinkingLevel`));\n\t\treturn undefined;\n\t}\n\tconst provider = typeof value.provider === \"string\" ? value.provider.trim() : \"\";\n\tif (!provider || provider.length > MAX_ORCHESTRATION_MODEL_PROVIDER_LENGTH) {\n\t\tdiagnostics.push(\n\t\t\tbindingDiagnostic(\n\t\t\t\tscope,\n\t\t\t\t`${path}.provider`,\n\t\t\t\t`be a nonempty string of at most ${MAX_ORCHESTRATION_MODEL_PROVIDER_LENGTH} characters`,\n\t\t\t),\n\t\t);\n\t}\n\tconst modelId = typeof value.modelId === \"string\" ? value.modelId.trim() : \"\";\n\tif (!modelId || modelId.length > MAX_ORCHESTRATION_MODEL_ID_LENGTH) {\n\t\tdiagnostics.push(\n\t\t\tbindingDiagnostic(\n\t\t\t\tscope,\n\t\t\t\t`${path}.modelId`,\n\t\t\t\t`be a nonempty string of at most ${MAX_ORCHESTRATION_MODEL_ID_LENGTH} characters`,\n\t\t\t),\n\t\t);\n\t}\n\tconst thinkingLevel = value.thinkingLevel;\n\tif (typeof thinkingLevel !== \"string\" || !THINKING_LEVEL_SET.has(thinkingLevel)) {\n\t\tdiagnostics.push(\n\t\t\tbindingDiagnostic(scope, `${path}.thinkingLevel`, `be one of ${ORCHESTRATION_THINKING_LEVELS.join(\", \")}`),\n\t\t);\n\t}\n\tif (!provider || !modelId || typeof thinkingLevel !== \"string\" || !THINKING_LEVEL_SET.has(thinkingLevel)) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tprovider,\n\t\tmodelId,\n\t\tthinkingLevel: thinkingLevel as OrchestrationModelBinding[\"thinkingLevel\"],\n\t};\n}\n\nfunction parseLayer(value: unknown, scope: WorkerModelPinSource): ParsedPinLayer {\n\tif (value === undefined) return { present: false, diagnostics: [] };\n\tconst diagnostics: string[] = [];\n\tif (!isPlainRecord(value)) {\n\t\treturn {\n\t\t\tpresent: true,\n\t\t\tdiagnostics: [`workerDelegation.modelPins in ${scope} settings must be an object`],\n\t\t};\n\t}\n\tconst unknownKeys = Object.keys(value).filter((key) => !POLICY_KEYS.has(key));\n\tif (unknownKeys.length > 0) {\n\t\tdiagnostics.push(\n\t\t\t`workerDelegation.modelPins in ${scope} settings contains unknown fields: ${unknownKeys.join(\", \")}`,\n\t\t);\n\t}\n\tconst settings: WorkerModelPinsSettings = {};\n\tif (Object.hasOwn(value, \"default\")) {\n\t\tconst binding = parseBinding(value.default, scope, \"default\", diagnostics);\n\t\tif (binding) settings.default = binding;\n\t}\n\tif (Object.hasOwn(value, \"roles\")) {\n\t\tif (!isPlainRecord(value.roles)) {\n\t\t\tdiagnostics.push(`workerDelegation.modelPins.roles in ${scope} settings must be an object`);\n\t\t} else {\n\t\t\tconst roles: Partial<Record<WorkerRole, OrchestrationModelBinding>> = {};\n\t\t\tfor (const [role, candidate] of Object.entries(value.roles)) {\n\t\t\t\tif (!WORKER_ROLE_SET.has(role)) {\n\t\t\t\t\tdiagnostics.push(`workerDelegation.modelPins.roles in ${scope} settings contains unknown role: ${role}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst binding = parseBinding(candidate, scope, `roles.${role}`, diagnostics);\n\t\t\t\tif (binding) roles[role as WorkerRole] = binding;\n\t\t\t}\n\t\t\tsettings.roles = roles;\n\t\t}\n\t}\n\treturn { present: true, settings, diagnostics };\n}\n\nfunction pinFromLayer(layer: NormalizedPinLayer | undefined, role: WorkerRole): ResolvedWorkerModelPin | undefined {\n\tif (!layer) return undefined;\n\tconst binding = layer.settings.roles?.[role] ?? layer.settings.default;\n\treturn binding ? { binding: cloneBinding(binding), source: layer.source } : undefined;\n}\n\nfunction pinFromLocalLayers(\n\tdirectoryLayer: NormalizedPinLayer | undefined,\n\tprojectLayer: NormalizedPinLayer | undefined,\n\trole: WorkerRole,\n): ResolvedWorkerModelPin | undefined {\n\tconst roleLayer = directoryLayer?.settings.roles?.[role]\n\t\t? directoryLayer\n\t\t: projectLayer?.settings.roles?.[role]\n\t\t\t? projectLayer\n\t\t\t: undefined;\n\tconst roleBinding = roleLayer?.settings.roles?.[role];\n\tif (roleLayer && roleBinding) {\n\t\treturn {\n\t\t\tbinding: cloneBinding(roleBinding),\n\t\t\tsource: roleLayer.source,\n\t\t};\n\t}\n\tconst defaultLayer = directoryLayer?.settings.default\n\t\t? directoryLayer\n\t\t: projectLayer?.settings.default\n\t\t\t? projectLayer\n\t\t\t: undefined;\n\treturn defaultLayer?.settings.default\n\t\t? { binding: cloneBinding(defaultLayer.settings.default), source: defaultLayer.source }\n\t\t: undefined;\n}\n\n/** Compile independently validated settings scopes into one immutable admission policy. */\nexport function compileWorkerModelPinPolicy(layers: WorkerModelPinPolicyLayers): WorkerModelPinPolicy {\n\tconst global = parseLayer(layers.global, \"global\");\n\tconst project = parseLayer(layers.project, \"project\");\n\tconst directoryProfile = parseLayer(layers.directoryProfile, \"directoryProfile\");\n\tconst diagnostics = [...global.diagnostics, ...project.diagnostics, ...directoryProfile.diagnostics];\n\tif (diagnostics.length > 0) return { status: \"invalid\", diagnostics };\n\tif (!global.present && !project.present && !directoryProfile.present) return { status: \"absent\" };\n\n\tconst globalLayer = global.settings ? { settings: global.settings, source: \"global\" as const } : undefined;\n\tconst projectLayer = project.settings ? { settings: project.settings, source: \"project\" as const } : undefined;\n\tconst directoryLayer = directoryProfile.settings\n\t\t? { settings: directoryProfile.settings, source: \"directoryProfile\" as const }\n\t\t: undefined;\n\tconst byRole: Partial<Record<WorkerRole, ResolvedWorkerModelPin>> = {};\n\tfor (const role of WORKER_ROLES) {\n\t\tconst pin = pinFromLayer(globalLayer, role) ?? pinFromLocalLayers(directoryLayer, projectLayer, role);\n\t\tif (pin) byRole[role] = pin;\n\t}\n\treturn Object.keys(byRole).length > 0 ? { status: \"active\", byRole } : { status: \"absent\" };\n}\n\nexport function resolveWorkerModelPin(\n\tpolicy: WorkerModelPinPolicy,\n\trole: WorkerRole,\n): ResolvedWorkerModelPin | undefined {\n\tif (policy.status !== \"active\") return undefined;\n\tconst pin = policy.byRole[role];\n\treturn pin ? { binding: cloneBinding(pin.binding), source: pin.source } : undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"worker-model-pins.js","sourceRoot":"","sources":["../../../src/core/orchestration/worker-model-pins.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPlainRecord } from \"../util/value-guards.ts\";\nimport {\n\tMAX_ORCHESTRATION_MODEL_ID_LENGTH,\n\tMAX_ORCHESTRATION_MODEL_PROVIDER_LENGTH,\n\tORCHESTRATION_THINKING_LEVELS,\n\ttype OrchestrationModelBinding,\n\tWORKER_ROLES,\n\ttype WorkerRole,\n} from \"./contracts.ts\";\n\nexport type WorkerModelPinSource = \"global\" | \"project\" | \"directoryProfile\";\n\nexport interface WorkerModelPinsSettings {\n\tdefault?: OrchestrationModelBinding;\n\troles?: Partial<Record<WorkerRole, OrchestrationModelBinding>>;\n}\n\nexport interface ResolvedWorkerModelPin {\n\tbinding: OrchestrationModelBinding;\n\tsource: WorkerModelPinSource;\n}\n\nexport type WorkerModelPinPolicy =\n\t| { status: \"absent\" }\n\t| { status: \"invalid\"; diagnostics: readonly string[] }\n\t| {\n\t\t\tstatus: \"active\";\n\t\t\tbyRole: Readonly<Partial<Record<WorkerRole, ResolvedWorkerModelPin>>>;\n\t\t\t/**\n\t\t\t * Non-blocking configuration observations (e.g. role entries with no `default`, which\n\t\t\t * leaves every unlisted role unpinned and admits any caller-requested model for it).\n\t\t\t * Never gates admission — see resolveWorkerModelPin and the delegation-time\n\t\t\t * `modelPinBypass` diagnostic in worker-delegation-controller.ts.\n\t\t\t */\n\t\t\tdiagnostics?: readonly string[];\n\t };\n\nexport interface WorkerModelPinPolicyLayers {\n\tglobal?: unknown;\n\tproject?: unknown;\n\tdirectoryProfile?: unknown;\n}\n\ninterface NormalizedPinLayer {\n\tsettings: WorkerModelPinsSettings;\n\tsource: WorkerModelPinSource;\n}\n\ninterface ParsedPinLayer {\n\tpresent: boolean;\n\tsettings?: WorkerModelPinsSettings;\n\tdiagnostics: string[];\n}\n\nconst POLICY_KEYS = new Set([\"default\", \"roles\"]);\nconst BINDING_KEYS = new Set([\"provider\", \"modelId\", \"thinkingLevel\"]);\nconst WORKER_ROLE_SET: ReadonlySet<string> = new Set(WORKER_ROLES);\nconst THINKING_LEVEL_SET: ReadonlySet<string> = new Set(ORCHESTRATION_THINKING_LEVELS);\n\nfunction cloneBinding(binding: OrchestrationModelBinding): OrchestrationModelBinding {\n\treturn { ...binding };\n}\n\nfunction bindingDiagnostic(scope: WorkerModelPinSource, path: string, expectation: string): string {\n\treturn `workerDelegation.modelPins.${path} in ${scope} settings must ${expectation}`;\n}\n\nfunction parseBinding(\n\tvalue: unknown,\n\tscope: WorkerModelPinSource,\n\tpath: string,\n\tdiagnostics: string[],\n): OrchestrationModelBinding | undefined {\n\tif (!isPlainRecord(value)) {\n\t\tdiagnostics.push(bindingDiagnostic(scope, path, \"be an object\"));\n\t\treturn undefined;\n\t}\n\tconst unknownKeys = Object.keys(value).filter((key) => !BINDING_KEYS.has(key));\n\tif (unknownKeys.length > 0) {\n\t\tdiagnostics.push(bindingDiagnostic(scope, path, `contain only provider, modelId, and thinkingLevel`));\n\t\treturn undefined;\n\t}\n\tconst provider = typeof value.provider === \"string\" ? value.provider.trim() : \"\";\n\tif (!provider || provider.length > MAX_ORCHESTRATION_MODEL_PROVIDER_LENGTH) {\n\t\tdiagnostics.push(\n\t\t\tbindingDiagnostic(\n\t\t\t\tscope,\n\t\t\t\t`${path}.provider`,\n\t\t\t\t`be a nonempty string of at most ${MAX_ORCHESTRATION_MODEL_PROVIDER_LENGTH} characters`,\n\t\t\t),\n\t\t);\n\t}\n\tconst modelId = typeof value.modelId === \"string\" ? value.modelId.trim() : \"\";\n\tif (!modelId || modelId.length > MAX_ORCHESTRATION_MODEL_ID_LENGTH) {\n\t\tdiagnostics.push(\n\t\t\tbindingDiagnostic(\n\t\t\t\tscope,\n\t\t\t\t`${path}.modelId`,\n\t\t\t\t`be a nonempty string of at most ${MAX_ORCHESTRATION_MODEL_ID_LENGTH} characters`,\n\t\t\t),\n\t\t);\n\t}\n\tconst thinkingLevel = value.thinkingLevel;\n\tif (typeof thinkingLevel !== \"string\" || !THINKING_LEVEL_SET.has(thinkingLevel)) {\n\t\tdiagnostics.push(\n\t\t\tbindingDiagnostic(scope, `${path}.thinkingLevel`, `be one of ${ORCHESTRATION_THINKING_LEVELS.join(\", \")}`),\n\t\t);\n\t}\n\tif (!provider || !modelId || typeof thinkingLevel !== \"string\" || !THINKING_LEVEL_SET.has(thinkingLevel)) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tprovider,\n\t\tmodelId,\n\t\tthinkingLevel: thinkingLevel as OrchestrationModelBinding[\"thinkingLevel\"],\n\t};\n}\n\nfunction parseLayer(value: unknown, scope: WorkerModelPinSource): ParsedPinLayer {\n\tif (value === undefined) return { present: false, diagnostics: [] };\n\tconst diagnostics: string[] = [];\n\tif (!isPlainRecord(value)) {\n\t\treturn {\n\t\t\tpresent: true,\n\t\t\tdiagnostics: [`workerDelegation.modelPins in ${scope} settings must be an object`],\n\t\t};\n\t}\n\tconst unknownKeys = Object.keys(value).filter((key) => !POLICY_KEYS.has(key));\n\tif (unknownKeys.length > 0) {\n\t\tdiagnostics.push(\n\t\t\t`workerDelegation.modelPins in ${scope} settings contains unknown fields: ${unknownKeys.join(\", \")}`,\n\t\t);\n\t}\n\tconst settings: WorkerModelPinsSettings = {};\n\tif (Object.hasOwn(value, \"default\")) {\n\t\tconst binding = parseBinding(value.default, scope, \"default\", diagnostics);\n\t\tif (binding) settings.default = binding;\n\t}\n\tif (Object.hasOwn(value, \"roles\")) {\n\t\tif (!isPlainRecord(value.roles)) {\n\t\t\tdiagnostics.push(`workerDelegation.modelPins.roles in ${scope} settings must be an object`);\n\t\t} else {\n\t\t\tconst roles: Partial<Record<WorkerRole, OrchestrationModelBinding>> = {};\n\t\t\tfor (const [role, candidate] of Object.entries(value.roles)) {\n\t\t\t\tif (!WORKER_ROLE_SET.has(role)) {\n\t\t\t\t\tdiagnostics.push(`workerDelegation.modelPins.roles in ${scope} settings contains unknown role: ${role}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst binding = parseBinding(candidate, scope, `roles.${role}`, diagnostics);\n\t\t\t\tif (binding) roles[role as WorkerRole] = binding;\n\t\t\t}\n\t\t\tsettings.roles = roles;\n\t\t}\n\t}\n\treturn { present: true, settings, diagnostics };\n}\n\nfunction pinFromLayer(layer: NormalizedPinLayer | undefined, role: WorkerRole): ResolvedWorkerModelPin | undefined {\n\tif (!layer) return undefined;\n\tconst binding = layer.settings.roles?.[role] ?? layer.settings.default;\n\treturn binding ? { binding: cloneBinding(binding), source: layer.source } : undefined;\n}\n\nfunction pinFromLocalLayers(\n\tdirectoryLayer: NormalizedPinLayer | undefined,\n\tprojectLayer: NormalizedPinLayer | undefined,\n\trole: WorkerRole,\n): ResolvedWorkerModelPin | undefined {\n\tconst roleLayer = directoryLayer?.settings.roles?.[role]\n\t\t? directoryLayer\n\t\t: projectLayer?.settings.roles?.[role]\n\t\t\t? projectLayer\n\t\t\t: undefined;\n\tconst roleBinding = roleLayer?.settings.roles?.[role];\n\tif (roleLayer && roleBinding) {\n\t\treturn {\n\t\t\tbinding: cloneBinding(roleBinding),\n\t\t\tsource: roleLayer.source,\n\t\t};\n\t}\n\tconst defaultLayer = directoryLayer?.settings.default\n\t\t? directoryLayer\n\t\t: projectLayer?.settings.default\n\t\t\t? projectLayer\n\t\t\t: undefined;\n\treturn defaultLayer?.settings.default\n\t\t? { binding: cloneBinding(defaultLayer.settings.default), source: defaultLayer.source }\n\t\t: undefined;\n}\n\n/** Compile independently validated settings scopes into one immutable admission policy. */\nexport function compileWorkerModelPinPolicy(layers: WorkerModelPinPolicyLayers): WorkerModelPinPolicy {\n\tconst global = parseLayer(layers.global, \"global\");\n\tconst project = parseLayer(layers.project, \"project\");\n\tconst directoryProfile = parseLayer(layers.directoryProfile, \"directoryProfile\");\n\tconst diagnostics = [...global.diagnostics, ...project.diagnostics, ...directoryProfile.diagnostics];\n\tif (diagnostics.length > 0) return { status: \"invalid\", diagnostics };\n\tif (!global.present && !project.present && !directoryProfile.present) return { status: \"absent\" };\n\n\tconst globalLayer = global.settings ? { settings: global.settings, source: \"global\" as const } : undefined;\n\tconst projectLayer = project.settings ? { settings: project.settings, source: \"project\" as const } : undefined;\n\tconst directoryLayer = directoryProfile.settings\n\t\t? { settings: directoryProfile.settings, source: \"directoryProfile\" as const }\n\t\t: undefined;\n\tconst byRole: Partial<Record<WorkerRole, ResolvedWorkerModelPin>> = {};\n\tfor (const role of WORKER_ROLES) {\n\t\tconst pin = pinFromLayer(globalLayer, role) ?? pinFromLocalLayers(directoryLayer, projectLayer, role);\n\t\tif (pin) byRole[role] = pin;\n\t}\n\tif (Object.keys(byRole).length === 0) return { status: \"absent\" };\n\n\t// A roles-only config (no `default` in any layer) leaves every unlisted role unpinned: a caller\n\t// can delegate with an unlisted role plus an explicit model and admission never sees a pin to\n\t// enforce. That's not a blocking error (the owner may intend it), but it must be observable.\n\tconst hasDefault = Boolean(\n\t\tglobalLayer?.settings.default ?? projectLayer?.settings.default ?? directoryLayer?.settings.default,\n\t);\n\tconst unpinnedRoles = WORKER_ROLES.filter((role) => !(role in byRole));\n\tconst policyDiagnostics =\n\t\t!hasDefault && unpinnedRoles.length > 0\n\t\t\t? [\n\t\t\t\t\t`workerDelegation.modelPins configures role entries but no default: ${unpinnedRoles.join(\", \")} remain unpinned and admit any caller-requested model. Add a default to close the gap.`,\n\t\t\t\t]\n\t\t\t: [];\n\treturn {\n\t\tstatus: \"active\",\n\t\tbyRole,\n\t\t...(policyDiagnostics.length > 0 ? { diagnostics: policyDiagnostics } : {}),\n\t};\n}\n\nexport function resolveWorkerModelPin(\n\tpolicy: WorkerModelPinPolicy,\n\trole: WorkerRole,\n): ResolvedWorkerModelPin | undefined {\n\tif (policy.status !== \"active\") return undefined;\n\tconst pin = policy.byRole[role];\n\treturn pin ? { binding: cloneBinding(pin.binding), source: pin.source } : undefined;\n}\n"]}
|
|
@@ -6,6 +6,13 @@ export interface ProviderRequestRuntimeControllerDeps {
|
|
|
6
6
|
compaction: Pick<CompactionController, "admitProviderRequest">;
|
|
7
7
|
context: ProviderRequestContextController;
|
|
8
8
|
admitGoalRequest(): number | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* True once the goal owning the currently held execution lease crossed its token budget from
|
|
11
|
+
* charging the response just received. Checked before EVERY provider request (including a
|
|
12
|
+
* multi-step tool-loop follow-up); returning true ends the loop gracefully after the current
|
|
13
|
+
* turn's in-flight work completes, instead of letting a doomed request reach admission and throw.
|
|
14
|
+
*/
|
|
15
|
+
shouldStopGoalExecutionAfterTurn(): boolean;
|
|
9
16
|
}
|
|
10
17
|
/** Installs and owns the one provider planning/admission hook generation on an Agent. */
|
|
11
18
|
export declare class ProviderRequestRuntimeController {
|
|
@@ -13,9 +20,11 @@ export declare class ProviderRequestRuntimeController {
|
|
|
13
20
|
private previousTransformContext;
|
|
14
21
|
private previousPlanContext;
|
|
15
22
|
private previousAdmission;
|
|
23
|
+
private previousShouldStopAfterTurn;
|
|
16
24
|
private installedTransformContext;
|
|
17
25
|
private installedPlanContext;
|
|
18
26
|
private installedAdmission;
|
|
27
|
+
private installedShouldStopAfterTurn;
|
|
19
28
|
constructor(deps: ProviderRequestRuntimeControllerDeps);
|
|
20
29
|
install(): void;
|
|
21
30
|
dispose(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-request-runtime-controller.d.ts","sourceRoot":"","sources":["../../src/core/provider-request-runtime-controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"provider-request-runtime-controller.d.ts","sourceRoot":"","sources":["../../src/core/provider-request-runtime-controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,0CAA0C,CAAC;AAEjG,MAAM,WAAW,oCAAoC;IACpD,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,IAAI,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;IAC/D,OAAO,EAAE,gCAAgC,CAAC;IAC1C,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAAC;IACvC;;;;;OAKG;IACH,gCAAgC,IAAI,OAAO,CAAC;CAC5C;AAED,yFAAyF;AACzF,qBAAa,gCAAgC;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuC;IAC5D,OAAO,CAAC,wBAAwB,CAA4B;IAC5D,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,iBAAiB,CAAgC;IACzD,OAAO,CAAC,2BAA2B,CAA+B;IAClE,OAAO,CAAC,yBAAyB,CAA4B;IAC7D,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,kBAAkB,CAAgC;IAC1D,OAAO,CAAC,4BAA4B,CAA+B;IAEnE,YAAY,IAAI,EAAE,oCAAoC,EAErD;IAED,OAAO,IAAI,IAAI,CAkFd;IAED,OAAO,IAAI,IAAI,CAgBd;CACD"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { estimateProviderRequestTokens } from "@caupulican/pi-agent-core";
|
|
2
|
+
import { narrowRequestMaxTokens } from "@caupulican/pi-agent-core/agent-loop";
|
|
2
3
|
/** Installs and owns the one provider planning/admission hook generation on an Agent. */
|
|
3
4
|
export class ProviderRequestRuntimeController {
|
|
4
5
|
constructor(deps) {
|
|
@@ -11,9 +12,11 @@ export class ProviderRequestRuntimeController {
|
|
|
11
12
|
this.previousTransformContext = agent.transformContext;
|
|
12
13
|
this.previousPlanContext = agent.planContext;
|
|
13
14
|
this.previousAdmission = agent.admitProviderRequest;
|
|
15
|
+
this.previousShouldStopAfterTurn = agent.shouldStopAfterTurn;
|
|
14
16
|
const previousTransformContext = this.previousTransformContext?.bind(agent);
|
|
15
17
|
const previousPlanContext = this.previousPlanContext?.bind(agent);
|
|
16
18
|
const previousAdmission = this.previousAdmission?.bind(agent);
|
|
19
|
+
const previousShouldStopAfterTurn = this.previousShouldStopAfterTurn?.bind(agent);
|
|
17
20
|
this.installedPlanContext = async ({ messages, attempt }, signal) => {
|
|
18
21
|
const basePlan = previousPlanContext
|
|
19
22
|
? await previousPlanContext({ messages, attempt }, signal)
|
|
@@ -68,14 +71,21 @@ export class ProviderRequestRuntimeController {
|
|
|
68
71
|
if (previous.action === "replan")
|
|
69
72
|
return previous;
|
|
70
73
|
const goalMaxTokens = this.deps.admitGoalRequest();
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
+
// Validated narrowing (shared with the planner's own final pass) instead of a hand-rolled
|
|
75
|
+
// min-merge, so a degenerate goal-computed ceiling fails loudly here at admission instead of
|
|
76
|
+
// silently passing through to fail deep inside the planner.
|
|
77
|
+
const maxTokens = narrowRequestMaxTokens(previous.maxTokens, goalMaxTokens, request.model.maxTokens, "goal execution budget");
|
|
74
78
|
return maxTokens === undefined ? previous : { action: "send", maxTokens };
|
|
75
79
|
};
|
|
80
|
+
this.installedShouldStopAfterTurn = async (signal) => {
|
|
81
|
+
if (this.deps.shouldStopGoalExecutionAfterTurn())
|
|
82
|
+
return true;
|
|
83
|
+
return (await previousShouldStopAfterTurn?.(signal)) ?? false;
|
|
84
|
+
};
|
|
76
85
|
agent.planContext = this.installedPlanContext;
|
|
77
86
|
agent.transformContext = this.installedTransformContext;
|
|
78
87
|
agent.admitProviderRequest = this.installedAdmission;
|
|
88
|
+
agent.shouldStopAfterTurn = this.installedShouldStopAfterTurn;
|
|
79
89
|
}
|
|
80
90
|
dispose() {
|
|
81
91
|
const agent = this.deps.agent;
|
|
@@ -87,9 +97,13 @@ export class ProviderRequestRuntimeController {
|
|
|
87
97
|
if (agent.admitProviderRequest === this.installedAdmission) {
|
|
88
98
|
agent.admitProviderRequest = this.previousAdmission;
|
|
89
99
|
}
|
|
100
|
+
if (agent.shouldStopAfterTurn === this.installedShouldStopAfterTurn) {
|
|
101
|
+
agent.shouldStopAfterTurn = this.previousShouldStopAfterTurn;
|
|
102
|
+
}
|
|
90
103
|
this.installedTransformContext = undefined;
|
|
91
104
|
this.installedPlanContext = undefined;
|
|
92
105
|
this.installedAdmission = undefined;
|
|
106
|
+
this.installedShouldStopAfterTurn = undefined;
|
|
93
107
|
}
|
|
94
108
|
}
|
|
95
109
|
//# sourceMappingURL=provider-request-runtime-controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-request-runtime-controller.js","sourceRoot":"","sources":["../../src/core/provider-request-runtime-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { estimateProviderRequestTokens } from \"@caupulican/pi-agent-core\";\nimport type { Agent } from \"@caupulican/pi-agent-core/agent\";\nimport type { CompactionController } from \"./compaction-controller.ts\";\nimport type { ProviderRequestContextController } from \"./provider-request-context-controller.ts\";\n\nexport interface ProviderRequestRuntimeControllerDeps {\n\tagent: Agent;\n\tcompaction: Pick<CompactionController, \"admitProviderRequest\">;\n\tcontext: ProviderRequestContextController;\n\tadmitGoalRequest(): number | undefined;\n}\n\n/** Installs and owns the one provider planning/admission hook generation on an Agent. */\nexport class ProviderRequestRuntimeController {\n\tprivate readonly deps: ProviderRequestRuntimeControllerDeps;\n\tprivate previousTransformContext: Agent[\"transformContext\"];\n\tprivate previousPlanContext: Agent[\"planContext\"];\n\tprivate previousAdmission: Agent[\"admitProviderRequest\"];\n\tprivate installedTransformContext: Agent[\"transformContext\"];\n\tprivate installedPlanContext: Agent[\"planContext\"];\n\tprivate installedAdmission: Agent[\"admitProviderRequest\"];\n\n\tconstructor(deps: ProviderRequestRuntimeControllerDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tinstall(): void {\n\t\tif (this.installedPlanContext) return;\n\t\tconst agent = this.deps.agent;\n\t\tthis.previousTransformContext = agent.transformContext;\n\t\tthis.previousPlanContext = agent.planContext;\n\t\tthis.previousAdmission = agent.admitProviderRequest;\n\t\tconst previousTransformContext = this.previousTransformContext?.bind(agent);\n\t\tconst previousPlanContext = this.previousPlanContext?.bind(agent);\n\t\tconst previousAdmission = this.previousAdmission?.bind(agent);\n\n\t\tthis.installedPlanContext = async ({ messages, attempt }, signal) => {\n\t\t\tconst basePlan = previousPlanContext\n\t\t\t\t? await previousPlanContext({ messages, attempt }, signal)\n\t\t\t\t: {\n\t\t\t\t\t\tmessages: previousTransformContext ? await previousTransformContext(messages, signal) : messages,\n\t\t\t\t\t};\n\t\t\tconst sessionPlan = await this.deps.context.plan(basePlan.messages, signal);\n\t\t\treturn {\n\t\t\t\tmessages: sessionPlan.messages,\n\t\t\t\ttransientMessages: [...(basePlan.transientMessages ?? []), ...(sessionPlan.transientMessages ?? [])],\n\t\t\t\tisCurrent: () => basePlan.isCurrent?.() !== false && sessionPlan.isCurrent?.() !== false,\n\t\t\t\tprepareCommit: () => {\n\t\t\t\t\tif (basePlan.isCurrent?.() === false || sessionPlan.isCurrent?.() === false) return false;\n\t\t\t\t\treturn basePlan.prepareCommit?.() !== false && sessionPlan.prepareCommit?.() !== false;\n\t\t\t\t},\n\t\t\t\tcommit: () => {\n\t\t\t\t\tbasePlan.commit?.();\n\t\t\t\t\tsessionPlan.commit?.();\n\t\t\t\t},\n\t\t\t\tdiscard: () => {\n\t\t\t\t\tsessionPlan.discard?.();\n\t\t\t\t\tbasePlan.discard?.();\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t\tthis.installedTransformContext = async (messages, signal) => {\n\t\t\tconst plan = await this.installedPlanContext?.({ messages, attempt: 0 }, signal);\n\t\t\tif (!plan) return messages;\n\t\t\ttry {\n\t\t\t\treturn [...plan.messages, ...(plan.transientMessages ?? [])];\n\t\t\t} finally {\n\t\t\t\tplan.discard?.();\n\t\t\t}\n\t\t};\n\t\tthis.installedAdmission = async (request, signal) => {\n\t\t\tconst requestTokens = estimateProviderRequestTokens(request.context);\n\t\t\tconst decision = await this.deps.compaction.admitProviderRequest({\n\t\t\t\trequestTokens,\n\t\t\t\tnonCompactableTokens: estimateProviderRequestTokens(request.nonCompactableContext),\n\t\t\t\tattempt: request.attempt,\n\t\t\t});\n\t\t\tif (decision.action === \"replan\") {\n\t\t\t\treturn {\n\t\t\t\t\taction: \"replan\",\n\t\t\t\t\tcontext: { ...request.sourceContext, messages: agent.state.messages.slice() },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst previous = (await previousAdmission?.(request, signal)) ?? { action: \"send\" as const };\n\t\t\tif (previous.action === \"replan\") return previous;\n\t\t\tconst goalMaxTokens = this.deps.admitGoalRequest();\n\t\t\tconst maxTokens = [previous.maxTokens, goalMaxTokens]\n\t\t\t\t.filter((value): value is number => value !== undefined)\n\t\t\t\t.reduce<number | undefined>(\n\t\t\t\t\t(minimum, value) => (minimum === undefined ? value : Math.min(minimum, value)),\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\treturn maxTokens === undefined ? previous : { action: \"send\", maxTokens };\n\t\t};\n\n\t\tagent.planContext = this.installedPlanContext;\n\t\tagent.transformContext = this.installedTransformContext;\n\t\tagent.admitProviderRequest = this.installedAdmission;\n\t}\n\n\tdispose(): void {\n\t\tconst agent = this.deps.agent;\n\t\tif (agent.transformContext === this.installedTransformContext) {\n\t\t\tagent.transformContext = this.previousTransformContext;\n\t\t}\n\t\tif (agent.planContext === this.installedPlanContext) agent.planContext = this.previousPlanContext;\n\t\tif (agent.admitProviderRequest === this.installedAdmission) {\n\t\t\tagent.admitProviderRequest = this.previousAdmission;\n\t\t}\n\t\tthis.installedTransformContext = undefined;\n\t\tthis.installedPlanContext = undefined;\n\t\tthis.installedAdmission = undefined;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"provider-request-runtime-controller.js","sourceRoot":"","sources":["../../src/core/provider-request-runtime-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { estimateProviderRequestTokens } from \"@caupulican/pi-agent-core\";\nimport type { Agent } from \"@caupulican/pi-agent-core/agent\";\nimport { narrowRequestMaxTokens } from \"@caupulican/pi-agent-core/agent-loop\";\nimport type { CompactionController } from \"./compaction-controller.ts\";\nimport type { ProviderRequestContextController } from \"./provider-request-context-controller.ts\";\n\nexport interface ProviderRequestRuntimeControllerDeps {\n\tagent: Agent;\n\tcompaction: Pick<CompactionController, \"admitProviderRequest\">;\n\tcontext: ProviderRequestContextController;\n\tadmitGoalRequest(): number | undefined;\n\t/**\n\t * True once the goal owning the currently held execution lease crossed its token budget from\n\t * charging the response just received. Checked before EVERY provider request (including a\n\t * multi-step tool-loop follow-up); returning true ends the loop gracefully after the current\n\t * turn's in-flight work completes, instead of letting a doomed request reach admission and throw.\n\t */\n\tshouldStopGoalExecutionAfterTurn(): boolean;\n}\n\n/** Installs and owns the one provider planning/admission hook generation on an Agent. */\nexport class ProviderRequestRuntimeController {\n\tprivate readonly deps: ProviderRequestRuntimeControllerDeps;\n\tprivate previousTransformContext: Agent[\"transformContext\"];\n\tprivate previousPlanContext: Agent[\"planContext\"];\n\tprivate previousAdmission: Agent[\"admitProviderRequest\"];\n\tprivate previousShouldStopAfterTurn: Agent[\"shouldStopAfterTurn\"];\n\tprivate installedTransformContext: Agent[\"transformContext\"];\n\tprivate installedPlanContext: Agent[\"planContext\"];\n\tprivate installedAdmission: Agent[\"admitProviderRequest\"];\n\tprivate installedShouldStopAfterTurn: Agent[\"shouldStopAfterTurn\"];\n\n\tconstructor(deps: ProviderRequestRuntimeControllerDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tinstall(): void {\n\t\tif (this.installedPlanContext) return;\n\t\tconst agent = this.deps.agent;\n\t\tthis.previousTransformContext = agent.transformContext;\n\t\tthis.previousPlanContext = agent.planContext;\n\t\tthis.previousAdmission = agent.admitProviderRequest;\n\t\tthis.previousShouldStopAfterTurn = agent.shouldStopAfterTurn;\n\t\tconst previousTransformContext = this.previousTransformContext?.bind(agent);\n\t\tconst previousPlanContext = this.previousPlanContext?.bind(agent);\n\t\tconst previousAdmission = this.previousAdmission?.bind(agent);\n\t\tconst previousShouldStopAfterTurn = this.previousShouldStopAfterTurn?.bind(agent);\n\n\t\tthis.installedPlanContext = async ({ messages, attempt }, signal) => {\n\t\t\tconst basePlan = previousPlanContext\n\t\t\t\t? await previousPlanContext({ messages, attempt }, signal)\n\t\t\t\t: {\n\t\t\t\t\t\tmessages: previousTransformContext ? await previousTransformContext(messages, signal) : messages,\n\t\t\t\t\t};\n\t\t\tconst sessionPlan = await this.deps.context.plan(basePlan.messages, signal);\n\t\t\treturn {\n\t\t\t\tmessages: sessionPlan.messages,\n\t\t\t\ttransientMessages: [...(basePlan.transientMessages ?? []), ...(sessionPlan.transientMessages ?? [])],\n\t\t\t\tisCurrent: () => basePlan.isCurrent?.() !== false && sessionPlan.isCurrent?.() !== false,\n\t\t\t\tprepareCommit: () => {\n\t\t\t\t\tif (basePlan.isCurrent?.() === false || sessionPlan.isCurrent?.() === false) return false;\n\t\t\t\t\treturn basePlan.prepareCommit?.() !== false && sessionPlan.prepareCommit?.() !== false;\n\t\t\t\t},\n\t\t\t\tcommit: () => {\n\t\t\t\t\tbasePlan.commit?.();\n\t\t\t\t\tsessionPlan.commit?.();\n\t\t\t\t},\n\t\t\t\tdiscard: () => {\n\t\t\t\t\tsessionPlan.discard?.();\n\t\t\t\t\tbasePlan.discard?.();\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t\tthis.installedTransformContext = async (messages, signal) => {\n\t\t\tconst plan = await this.installedPlanContext?.({ messages, attempt: 0 }, signal);\n\t\t\tif (!plan) return messages;\n\t\t\ttry {\n\t\t\t\treturn [...plan.messages, ...(plan.transientMessages ?? [])];\n\t\t\t} finally {\n\t\t\t\tplan.discard?.();\n\t\t\t}\n\t\t};\n\t\tthis.installedAdmission = async (request, signal) => {\n\t\t\tconst requestTokens = estimateProviderRequestTokens(request.context);\n\t\t\tconst decision = await this.deps.compaction.admitProviderRequest({\n\t\t\t\trequestTokens,\n\t\t\t\tnonCompactableTokens: estimateProviderRequestTokens(request.nonCompactableContext),\n\t\t\t\tattempt: request.attempt,\n\t\t\t});\n\t\t\tif (decision.action === \"replan\") {\n\t\t\t\treturn {\n\t\t\t\t\taction: \"replan\",\n\t\t\t\t\tcontext: { ...request.sourceContext, messages: agent.state.messages.slice() },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst previous = (await previousAdmission?.(request, signal)) ?? { action: \"send\" as const };\n\t\t\tif (previous.action === \"replan\") return previous;\n\t\t\tconst goalMaxTokens = this.deps.admitGoalRequest();\n\t\t\t// Validated narrowing (shared with the planner's own final pass) instead of a hand-rolled\n\t\t\t// min-merge, so a degenerate goal-computed ceiling fails loudly here at admission instead of\n\t\t\t// silently passing through to fail deep inside the planner.\n\t\t\tconst maxTokens = narrowRequestMaxTokens(\n\t\t\t\tprevious.maxTokens,\n\t\t\t\tgoalMaxTokens,\n\t\t\t\trequest.model.maxTokens,\n\t\t\t\t\"goal execution budget\",\n\t\t\t);\n\t\t\treturn maxTokens === undefined ? previous : { action: \"send\", maxTokens };\n\t\t};\n\t\tthis.installedShouldStopAfterTurn = async (signal) => {\n\t\t\tif (this.deps.shouldStopGoalExecutionAfterTurn()) return true;\n\t\t\treturn (await previousShouldStopAfterTurn?.(signal)) ?? false;\n\t\t};\n\n\t\tagent.planContext = this.installedPlanContext;\n\t\tagent.transformContext = this.installedTransformContext;\n\t\tagent.admitProviderRequest = this.installedAdmission;\n\t\tagent.shouldStopAfterTurn = this.installedShouldStopAfterTurn;\n\t}\n\n\tdispose(): void {\n\t\tconst agent = this.deps.agent;\n\t\tif (agent.transformContext === this.installedTransformContext) {\n\t\t\tagent.transformContext = this.previousTransformContext;\n\t\t}\n\t\tif (agent.planContext === this.installedPlanContext) agent.planContext = this.previousPlanContext;\n\t\tif (agent.admitProviderRequest === this.installedAdmission) {\n\t\t\tagent.admitProviderRequest = this.previousAdmission;\n\t\t}\n\t\tif (agent.shouldStopAfterTurn === this.installedShouldStopAfterTurn) {\n\t\t\tagent.shouldStopAfterTurn = this.previousShouldStopAfterTurn;\n\t\t}\n\t\tthis.installedTransformContext = undefined;\n\t\tthis.installedPlanContext = undefined;\n\t\tthis.installedAdmission = undefined;\n\t\tthis.installedShouldStopAfterTurn = undefined;\n\t}\n}\n"]}
|
|
@@ -3,5 +3,19 @@ export declare const MAX_PROVIDER_TOOL_SNIPPET_CHARS = 120;
|
|
|
3
3
|
export declare const MAX_PROVIDER_TOOL_GUIDELINE_CHARS = 140;
|
|
4
4
|
export declare const MAX_PROVIDER_TOOL_GUIDELINES_CHARS = 1200;
|
|
5
5
|
export declare function normalizeProviderPromptSnippet(text: string | undefined): string | undefined;
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Bounds a guideline list to MAX_PROVIDER_TOOL_GUIDELINES_CHARS, preserving caller order (callers
|
|
8
|
+
* that must survive budget pressure — e.g. a MANDATORY directive — should list those first).
|
|
9
|
+
*
|
|
10
|
+
* Guidelines that do not fit the remaining budget are dropped WHOLE, never truncated mid-word: a
|
|
11
|
+
* half-sentence directive silently missing its second half is worse than the directive being absent.
|
|
12
|
+
* Truncation only ever applies to the pathological case of a single guideline that alone exceeds the
|
|
13
|
+
* *entire* budget — dropping it would erase it forever, so it is truncated to what's left instead
|
|
14
|
+
* (and never down to a bare ellipsis with no real content).
|
|
15
|
+
*
|
|
16
|
+
* `onBounded`, when provided, receives one diagnostic message per dropped or truncated guideline —
|
|
17
|
+
* this bounding is silent otherwise, which is itself a defect this parameter exists to let a caller
|
|
18
|
+
* close (see delegate.ts, the only current caller that wires it to a warning channel).
|
|
19
|
+
*/
|
|
20
|
+
export declare function normalizeProviderPromptGuidelines(guidelines: string[] | undefined, onBounded?: (message: string) => void): string[];
|
|
7
21
|
//# sourceMappingURL=provider-tool-text.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-tool-text.d.ts","sourceRoot":"","sources":["../../src/core/provider-tool-text.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,eAAO,MAAM,+BAA+B,MAAM,CAAC;AACnD,eAAO,MAAM,iCAAiC,MAAM,CAAC;AACrD,eAAO,MAAM,kCAAkC,OAAQ,CAAC;AAsBxD,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAK3F;AAED,wBAAgB,iCAAiC,
|
|
1
|
+
{"version":3,"file":"provider-tool-text.d.ts","sourceRoot":"","sources":["../../src/core/provider-tool-text.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,eAAO,MAAM,+BAA+B,MAAM,CAAC;AACnD,eAAO,MAAM,iCAAiC,MAAM,CAAC;AACrD,eAAO,MAAM,kCAAkC,OAAQ,CAAC;AAsBxD,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAK3F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iCAAiC,CAChD,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,EAChC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACnC,MAAM,EAAE,CA4CV"}
|
|
@@ -30,7 +30,21 @@ export function normalizeProviderPromptSnippet(text) {
|
|
|
30
30
|
return undefined;
|
|
31
31
|
return truncateWithEllipsis(normalized, MAX_PROVIDER_TOOL_SNIPPET_CHARS);
|
|
32
32
|
}
|
|
33
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Bounds a guideline list to MAX_PROVIDER_TOOL_GUIDELINES_CHARS, preserving caller order (callers
|
|
35
|
+
* that must survive budget pressure — e.g. a MANDATORY directive — should list those first).
|
|
36
|
+
*
|
|
37
|
+
* Guidelines that do not fit the remaining budget are dropped WHOLE, never truncated mid-word: a
|
|
38
|
+
* half-sentence directive silently missing its second half is worse than the directive being absent.
|
|
39
|
+
* Truncation only ever applies to the pathological case of a single guideline that alone exceeds the
|
|
40
|
+
* *entire* budget — dropping it would erase it forever, so it is truncated to what's left instead
|
|
41
|
+
* (and never down to a bare ellipsis with no real content).
|
|
42
|
+
*
|
|
43
|
+
* `onBounded`, when provided, receives one diagnostic message per dropped or truncated guideline —
|
|
44
|
+
* this bounding is silent otherwise, which is itself a defect this parameter exists to let a caller
|
|
45
|
+
* close (see delegate.ts, the only current caller that wires it to a warning channel).
|
|
46
|
+
*/
|
|
47
|
+
export function normalizeProviderPromptGuidelines(guidelines, onBounded) {
|
|
34
48
|
if (!guidelines || guidelines.length === 0)
|
|
35
49
|
return [];
|
|
36
50
|
const unique = new Set();
|
|
@@ -43,15 +57,33 @@ export function normalizeProviderPromptGuidelines(guidelines) {
|
|
|
43
57
|
if (unique.has(bounded))
|
|
44
58
|
continue;
|
|
45
59
|
const remaining = MAX_PROVIDER_TOOL_GUIDELINES_CHARS - total;
|
|
46
|
-
if (remaining <= 0)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
60
|
+
if (remaining <= 0) {
|
|
61
|
+
onBounded?.(`Provider tool guideline dropped: guidelines budget exhausted: "${bounded.slice(0, 48)}"`);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (bounded.length > MAX_PROVIDER_TOOL_GUIDELINES_CHARS) {
|
|
65
|
+
// Defensive: unreachable while MAX_PROVIDER_TOOL_GUIDELINE_CHARS <= MAX_PROVIDER_TOOL_GUIDELINES_CHARS
|
|
66
|
+
// (a single guideline is already per-guideline-capped below the total budget), but guards
|
|
67
|
+
// the invariant if those constants are ever changed. This is the one case where dropping
|
|
68
|
+
// the guideline would erase it forever, so truncation to whatever remains is preferred —
|
|
69
|
+
// except a bare "…" with zero real content, which is strictly worse than omitting it.
|
|
70
|
+
const admitted = truncateWithEllipsis(bounded, remaining);
|
|
71
|
+
if (admitted.length > 1) {
|
|
72
|
+
unique.add(admitted);
|
|
73
|
+
total += admitted.length;
|
|
74
|
+
onBounded?.(`Provider tool guideline truncated to fit the ${MAX_PROVIDER_TOOL_GUIDELINES_CHARS}-char guidelines budget: "${bounded.slice(0, 48)}"`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
onBounded?.(`Provider tool guideline dropped: guidelines budget exhausted: "${bounded.slice(0, 48)}"`);
|
|
78
|
+
}
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (bounded.length > remaining) {
|
|
82
|
+
onBounded?.(`Provider tool guideline dropped: guidelines budget exhausted: "${bounded.slice(0, 48)}"`);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
unique.add(bounded);
|
|
86
|
+
total += bounded.length;
|
|
55
87
|
}
|
|
56
88
|
return Array.from(unique);
|
|
57
89
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-tool-text.js","sourceRoot":"","sources":["../../src/core/provider-tool-text.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,CAAC;AACnD,MAAM,CAAC,MAAM,iCAAiC,GAAG,GAAG,CAAC;AACrD,MAAM,CAAC,MAAM,kCAAkC,GAAG,KAAK,CAAC;AAExD,SAAS,OAAO,CAAC,IAAY;IAC5B,OAAO,IAAI;SACT,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACV,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,QAAgB;IAC3D,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAE/B,IAAI,GAAG,GAAG,QAAQ,GAAG,CAAC,CAAC;IACvB,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC/C,IAAI,aAAa,IAAI,MAAM,IAAI,aAAa,IAAI,MAAM,EAAE,CAAC;QACxD,GAAG,IAAI,CAAC,CAAC;IACV,CAAC;IACD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,IAAwB;IACtE,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,OAAO,oBAAoB,CAAC,UAAU,EAAE,+BAA+B,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,iCAAiC,
|
|
1
|
+
{"version":3,"file":"provider-tool-text.js","sourceRoot":"","sources":["../../src/core/provider-tool-text.ts"],"names":[],"mappings":"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","sourcesContent":["/** Provider-bound tool prose budgets. Structural schemas remain separate and exact. */\nexport const MAX_PROVIDER_TOOL_SNIPPET_CHARS = 120;\nexport const MAX_PROVIDER_TOOL_GUIDELINE_CHARS = 140;\nexport const MAX_PROVIDER_TOOL_GUIDELINES_CHARS = 1_200;\n\nfunction oneLine(text: string): string {\n\treturn text\n\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nfunction truncateWithEllipsis(text: string, maxChars: number): string {\n\tif (text.length <= maxChars) return text;\n\tif (maxChars <= 0) return \"\";\n\tif (maxChars === 1) return \"…\";\n\n\tlet end = maxChars - 1;\n\tconst finalCodeUnit = text.charCodeAt(end - 1);\n\tif (finalCodeUnit >= 0xd800 && finalCodeUnit <= 0xdbff) {\n\t\tend -= 1;\n\t}\n\treturn `${text.slice(0, end).trimEnd()}…`;\n}\n\nexport function normalizeProviderPromptSnippet(text: string | undefined): string | undefined {\n\tif (!text) return undefined;\n\tconst normalized = oneLine(text);\n\tif (normalized.length === 0) return undefined;\n\treturn truncateWithEllipsis(normalized, MAX_PROVIDER_TOOL_SNIPPET_CHARS);\n}\n\n/**\n * Bounds a guideline list to MAX_PROVIDER_TOOL_GUIDELINES_CHARS, preserving caller order (callers\n * that must survive budget pressure — e.g. a MANDATORY directive — should list those first).\n *\n * Guidelines that do not fit the remaining budget are dropped WHOLE, never truncated mid-word: a\n * half-sentence directive silently missing its second half is worse than the directive being absent.\n * Truncation only ever applies to the pathological case of a single guideline that alone exceeds the\n * *entire* budget — dropping it would erase it forever, so it is truncated to what's left instead\n * (and never down to a bare ellipsis with no real content).\n *\n * `onBounded`, when provided, receives one diagnostic message per dropped or truncated guideline —\n * this bounding is silent otherwise, which is itself a defect this parameter exists to let a caller\n * close (see delegate.ts, the only current caller that wires it to a warning channel).\n */\nexport function normalizeProviderPromptGuidelines(\n\tguidelines: string[] | undefined,\n\tonBounded?: (message: string) => void,\n): string[] {\n\tif (!guidelines || guidelines.length === 0) return [];\n\tconst unique = new Set<string>();\n\tlet total = 0;\n\tfor (const guideline of guidelines) {\n\t\tconst normalized = oneLine(guideline);\n\t\tif (normalized.length === 0) continue;\n\t\tconst bounded = truncateWithEllipsis(normalized, MAX_PROVIDER_TOOL_GUIDELINE_CHARS);\n\t\tif (unique.has(bounded)) continue;\n\n\t\tconst remaining = MAX_PROVIDER_TOOL_GUIDELINES_CHARS - total;\n\t\tif (remaining <= 0) {\n\t\t\tonBounded?.(`Provider tool guideline dropped: guidelines budget exhausted: \"${bounded.slice(0, 48)}\"`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (bounded.length > MAX_PROVIDER_TOOL_GUIDELINES_CHARS) {\n\t\t\t// Defensive: unreachable while MAX_PROVIDER_TOOL_GUIDELINE_CHARS <= MAX_PROVIDER_TOOL_GUIDELINES_CHARS\n\t\t\t// (a single guideline is already per-guideline-capped below the total budget), but guards\n\t\t\t// the invariant if those constants are ever changed. This is the one case where dropping\n\t\t\t// the guideline would erase it forever, so truncation to whatever remains is preferred —\n\t\t\t// except a bare \"…\" with zero real content, which is strictly worse than omitting it.\n\t\t\tconst admitted = truncateWithEllipsis(bounded, remaining);\n\t\t\tif (admitted.length > 1) {\n\t\t\t\tunique.add(admitted);\n\t\t\t\ttotal += admitted.length;\n\t\t\t\tonBounded?.(\n\t\t\t\t\t`Provider tool guideline truncated to fit the ${MAX_PROVIDER_TOOL_GUIDELINES_CHARS}-char guidelines budget: \"${bounded.slice(0, 48)}\"`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tonBounded?.(`Provider tool guideline dropped: guidelines budget exhausted: \"${bounded.slice(0, 48)}\"`);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (bounded.length > remaining) {\n\t\t\tonBounded?.(`Provider tool guideline dropped: guidelines budget exhausted: \"${bounded.slice(0, 48)}\"`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tunique.add(bounded);\n\t\ttotal += bounded.length;\n\t}\n\treturn Array.from(unique);\n}\n"]}
|
|
@@ -4,7 +4,7 @@ import type { AgentSessionEvent, IsolatedCompletionOptions, IsolatedCompletionRe
|
|
|
4
4
|
import type { CapabilityEnvelope, EvidenceBundle } from "../autonomy/contracts.ts";
|
|
5
5
|
import type { LaneTracker } from "../autonomy/lane-tracker.ts";
|
|
6
6
|
import { type AutonomyTelemetryEvent } from "../autonomy/telemetry-events.ts";
|
|
7
|
-
import type
|
|
7
|
+
import { type GoalState } from "../goals/goal-state.ts";
|
|
8
8
|
import type { SettingsManager } from "../settings-manager.ts";
|
|
9
9
|
import { type LaneModelResolver } from "./lane-model-resolver.ts";
|
|
10
10
|
import type { collectWorkspaceSources } from "./workspace-collector.ts";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"research-lane-controller.d.ts","sourceRoot":"","sources":["../../../src/core/research/research-lane-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAExE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EACX,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAGnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG/D,OAAO,EAAkC,KAAK,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAC9G,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"research-lane-controller.d.ts","sourceRoot":"","sources":["../../../src/core/research/research-lane-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { createLaneToolSurface } from "../autonomy/lane-tool-surface.js";
|
|
|
4
4
|
import { appendLaneRecordSnapshot, getLaneRecordSnapshots } from "../autonomy/session-lane-record.js";
|
|
5
5
|
import { composeSubagentSystemPrompt } from "../autonomy/subagent-prompt.js";
|
|
6
6
|
import { AUTONOMY_TELEMETRY_EVENT_TYPES } from "../autonomy/telemetry-events.js";
|
|
7
|
+
import { isGoalExecutionActive } from "../goals/goal-state.js";
|
|
7
8
|
import { registerInFlightWork } from "../reload-blockers.js";
|
|
8
9
|
import { clampLaneMaxUsd } from "./lane-model-resolver.js";
|
|
9
10
|
import { runResearch } from "./research-runner.js";
|
|
@@ -214,7 +215,7 @@ export class ResearchLaneController {
|
|
|
214
215
|
}
|
|
215
216
|
buildDemand() {
|
|
216
217
|
const goal = this.deps.getGoalStateSnapshot();
|
|
217
|
-
if (!goal || goal.status
|
|
218
|
+
if (!goal || !isGoalExecutionActive(goal.status)) {
|
|
218
219
|
this._lastSkipReason = "no_active_goal";
|
|
219
220
|
return undefined;
|
|
220
221
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"research-lane-controller.js","sourceRoot":"","sources":["../../../src/core/research/research-lane-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionManager } from \"@caupulican/pi-agent-core/session\";\nimport { resolveModelThinkingLevel } from \"@caupulican/pi-ai/models\";\nimport type { Usage } from \"@caupulican/pi-ai/types\";\nimport type {\n\tAgentSessionEvent,\n\tIsolatedCompletionOptions,\n\tIsolatedCompletionResult,\n\tResearchLaneRunOutcome,\n} from \"../agent-session.ts\";\nimport type { CapabilityEnvelope, EvidenceBundle } from \"../autonomy/contracts.ts\";\nimport { getPrivateLaneDeniedPaths } from \"../autonomy/lane-private-paths.ts\";\nimport { createLaneToolSurface, type LaneToolSurface } from \"../autonomy/lane-tool-surface.ts\";\nimport type { LaneTracker } from \"../autonomy/lane-tracker.ts\";\nimport { appendLaneRecordSnapshot, getLaneRecordSnapshots } from \"../autonomy/session-lane-record.ts\";\nimport { composeSubagentSystemPrompt } from \"../autonomy/subagent-prompt.ts\";\nimport { AUTONOMY_TELEMETRY_EVENT_TYPES, type AutonomyTelemetryEvent } from \"../autonomy/telemetry-events.ts\";\nimport type { GoalState } from \"../goals/goal-state.ts\";\nimport type { NormalizedProfile } from \"../profile-registry.ts\";\nimport { registerInFlightWork } from \"../reload-blockers.ts\";\nimport type { SettingsManager } from \"../settings-manager.ts\";\nimport { clampLaneMaxUsd, type LaneModelResolver } from \"./lane-model-resolver.ts\";\nimport { runResearch } from \"./research-runner.ts\";\nimport type { collectWorkspaceSources } from \"./workspace-collector.ts\";\n\nexport interface ResearchLaneControllerDeps {\n\tisDisposed(): boolean;\n\tisChildSession(): boolean;\n\tgetSessionId(): string;\n\tgetCwd(): string;\n\tgetAgentDir(): string;\n\tgetSessionManager(): SessionManager;\n\tgetSettingsManager(): SettingsManager;\n\tgetCapabilityEnvelope(): CapabilityEnvelope | undefined;\n\temit(event: AgentSessionEvent): void;\n\temitAutonomyTelemetry(event: AutonomyTelemetryEvent): void;\n\tgetGoalStateSnapshot(): GoalState | undefined;\n\tgetEvidenceBundleSnapshot(): EvidenceBundle | undefined;\n\tsaveEvidenceBundleSnapshot(bundle: EvidenceBundle): string;\n\taddSpawnedUsage(\n\t\tusage: Usage,\n\t\topts: { label?: string; sourceSessionId?: string; reportId: string },\n\t): string | undefined;\n\trunIsolatedCompletion(opts: IsolatedCompletionOptions): Promise<IsolatedCompletionResult>;\n\tcollectWorkspaceSources: typeof collectWorkspaceSources;\n}\n\n/** Owns autonomous research demand, scheduling, execution, persistence, and cancellation. */\nexport class ResearchLaneController {\n\tprivate _timer: ReturnType<typeof setTimeout> | undefined;\n\tprivate _isRunning = false;\n\tprivate _lastSkipReason: string | undefined;\n\tprivate _historySeeded = false;\n\tprivate _persistedRunCount = 0;\n\tprivate readonly abortController = new AbortController();\n\tprivate readonly warnedUnboundToolGrants = new Set<string>();\n\tprivate readonly deps: ResearchLaneControllerDeps;\n\tprivate readonly lanes: LaneTracker;\n\tprivate readonly models: LaneModelResolver;\n\n\tconstructor(deps: ResearchLaneControllerDeps, lanes: LaneTracker, models: LaneModelResolver) {\n\t\tthis.deps = deps;\n\t\tthis.lanes = lanes;\n\t\tthis.models = models;\n\t}\n\n\tseedHistory(): void {\n\t\tif (this._historySeeded) return;\n\t\tconst records = getLaneRecordSnapshots(this.deps.getSessionManager().getEntries());\n\t\tthis.lanes.ensureCounterAtLeast(records.length + 1);\n\t\tthis._persistedRunCount = records.filter((record) => record.type === \"research\").length;\n\t\tthis._historySeeded = true;\n\t}\n\n\tgetLastSkipReason(): string | undefined {\n\t\treturn this._lastSkipReason;\n\t}\n\n\tabort(): void {\n\t\tthis.clearTimer();\n\t\tthis.abortController.abort();\n\t}\n\n\tclearTimer(): void {\n\t\tif (this._timer !== undefined) {\n\t\t\tclearTimeout(this._timer);\n\t\t\tthis._timer = undefined;\n\t\t}\n\t}\n\n\tscheduleFromIdle(): void {\n\t\tif (this._isRunning || this.deps.isDisposed() || this.deps.isChildSession()) return;\n\t\tconst research = this.deps.getSettingsManager().getResearchLaneSettings();\n\t\tif (!research.enabled) {\n\t\t\tthis._lastSkipReason = \"research_lane_disabled\";\n\t\t\treturn;\n\t\t}\n\t\tconst { mode } = this.deps.getSettingsManager().getAutonomySettings();\n\t\tif (mode === \"off\") {\n\t\t\tthis._lastSkipReason = \"autonomy_mode_off\";\n\t\t\treturn;\n\t\t}\n\t\tthis.seedHistory();\n\t\tif (this._persistedRunCount >= research.maxRunsPerSession) {\n\t\t\tthis._lastSkipReason = \"max_runs_reached\";\n\t\t\treturn;\n\t\t}\n\t\tif (!this.buildDemand()) return;\n\t\tconst shipment = this.models.resolveShipment(research, \"no_research_model\");\n\t\tif (!shipment.ok) {\n\t\t\tthis._lastSkipReason = shipment.skipReason;\n\t\t\treturn;\n\t\t}\n\t\tif (!this.models.capabilityProfile(shipment.model).backgroundLanesEnabled) {\n\t\t\tthis._lastSkipReason = \"model_research_unsupported\";\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clearTimer();\n\t\tthis._timer = setTimeout(() => {\n\t\t\tthis._timer = undefined;\n\t\t\tvoid this.runScheduled();\n\t\t}, research.idleDelayMs);\n\t\tconst timer = this._timer;\n\t\tif (typeof timer === \"object\" && timer && \"unref\" in timer) {\n\t\t\tconst { unref } = timer as { unref?: () => void };\n\t\t\tunref?.call(timer);\n\t\t}\n\t}\n\n\tasync runOnce(request?: { query?: string; context?: string; goalId?: string }): Promise<ResearchLaneRunOutcome> {\n\t\tif (this._isRunning) return { started: false, skipReason: \"research_lane_already_running\" };\n\t\tif (this.deps.isDisposed()) return { started: false, skipReason: \"session_disposed\" };\n\n\t\tconst settings = this.deps.getSettingsManager().getResearchLaneSettings();\n\t\tconst demand = request?.query\n\t\t\t? { query: request.query, context: request.context ?? \"\", goalId: request.goalId }\n\t\t\t: this.buildDemand();\n\t\tif (!demand) return { started: false, skipReason: this._lastSkipReason ?? \"no_research_demand\" };\n\n\t\tconst shipment = this.models.resolveShipment(settings, \"no_research_model\");\n\t\tif (!shipment.ok) {\n\t\t\tthis._lastSkipReason = shipment.skipReason;\n\t\t\treturn { started: false, skipReason: shipment.skipReason };\n\t\t}\n\t\tconst { model, laneProfile } = shipment;\n\t\tconst laneCapability = this.models.capabilityProfile(model);\n\t\tif (!laneCapability.backgroundLanesEnabled) {\n\t\t\tthis._lastSkipReason = \"model_research_unsupported\";\n\t\t\treturn { started: false, skipReason: \"model_research_unsupported\" };\n\t\t}\n\n\t\tthis._isRunning = true;\n\t\tthis.seedHistory();\n\t\tconst startedRecord = this.lanes.start({ type: \"research\", goalId: demand.goalId });\n\t\tthis._persistedRunCount++;\n\t\tconst deregisterInFlight = registerInFlightWork(\n\t\t\tthis.deps.getAgentDir(),\n\t\t\t\"lane\",\n\t\t\t`research:${startedRecord.laneId}`,\n\t\t);\n\t\tlet toolSurface: LaneToolSurface | undefined;\n\t\ttry {\n\t\t\tlet spentUsage: Usage | undefined;\n\t\t\tconst workspaceSources = await this.deps.collectWorkspaceSources({\n\t\t\t\tquery: `${demand.context}\\n${demand.query}`,\n\t\t\t\tcwd: this.deps.getCwd(),\n\t\t\t\tmaxSources: settings.maxSources,\n\t\t\t});\n\t\t\tconst maxUsd = clampLaneMaxUsd(settings.maxUsd, this.deps.getCapabilityEnvelope()?.maxEstimatedUsd);\n\t\t\tconst activeToolSurface = createLaneToolSurface({\n\t\t\t\tcwd: this.deps.getCwd(),\n\t\t\t\tprofile: laneProfile,\n\t\t\t\tdeniedPaths: getPrivateLaneDeniedPaths(this.deps.getCwd(), this.deps.getAgentDir()),\n\t\t\t});\n\t\t\ttoolSurface = activeToolSurface;\n\t\t\tthis.warnUnboundToolGrants(laneProfile, activeToolSurface);\n\t\t\tconst result = await runResearch({\n\t\t\t\tquery: demand.query,\n\t\t\t\tcontext: demand.context,\n\t\t\t\tsources: workspaceSources,\n\t\t\t\tenvelope: this.buildEnvelope(maxUsd, laneProfile, activeToolSurface),\n\t\t\t\tmaxUsd,\n\t\t\t\tmaxSources: settings.maxSources,\n\t\t\t\tmaxFindings: settings.maxFindings,\n\t\t\t\tmaxWallClockMs: settings.maxWallClockMs,\n\t\t\t\tsignal: this.abortController.signal,\n\t\t\t\tcomplete: async ({ systemPrompt, userPrompt, signal }) => {\n\t\t\t\t\tconst completion = await this.deps.runIsolatedCompletion({\n\t\t\t\t\t\tsystemPrompt: composeSubagentSystemPrompt({\n\t\t\t\t\t\t\tsoul: laneProfile?.soul,\n\t\t\t\t\t\t\trolePrompt: systemPrompt,\n\t\t\t\t\t\t\toverride: settings.systemPrompt,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tmessages: [{ role: \"user\", content: [{ type: \"text\", text: userPrompt }], timestamp: Date.now() }],\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tthinkingLevel: resolveModelThinkingLevel(model, laneProfile?.thinking),\n\t\t\t\t\t\tmaxTokens: laneCapability.laneMaxOutputTokens,\n\t\t\t\t\t\ttools: activeToolSurface.tools,\n\t\t\t\t\t\tmaxTurns: 6,\n\t\t\t\t\t\tbeforeToolCall: activeToolSurface.beforeToolCall,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\tcacheRetention: \"short\",\n\t\t\t\t\t\tlaneKind: \"research\",\n\t\t\t\t\t});\n\t\t\t\t\tspentUsage = completion.usage;\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttext: completion.text,\n\t\t\t\t\t\tcostUsd: completion.usage.cost.total,\n\t\t\t\t\t\tstopReason: String(completion.stopReason),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (this.deps.isDisposed()) {\n\t\t\t\tconst record = this.lanes.complete(startedRecord.laneId, {\n\t\t\t\t\tstatus: \"canceled\",\n\t\t\t\t\treasonCode: \"session_disposed\",\n\t\t\t\t});\n\t\t\t\treturn { started: true, record, result };\n\t\t\t}\n\n\t\t\tlet evidenceEntryId: string | undefined;\n\t\t\tif (result.bundle) evidenceEntryId = this.deps.saveEvidenceBundleSnapshot(result.bundle);\n\t\t\tif (spentUsage && (spentUsage.cost.total > 0 || spentUsage.totalTokens > 0)) {\n\t\t\t\tthis.deps.addSpawnedUsage(spentUsage, {\n\t\t\t\t\tlabel: \"research-lane\",\n\t\t\t\t\treportId: `research:${this.deps.getSessionId()}:${startedRecord.laneId}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst record = this.lanes.complete(startedRecord.laneId, {\n\t\t\t\tstatus: result.status,\n\t\t\t\treasonCode: result.reasonCode,\n\t\t\t\tcostUsd: result.costUsd,\n\t\t\t\tevidenceEntryId,\n\t\t\t});\n\t\t\tif (record) {\n\t\t\t\tappendLaneRecordSnapshot(this.deps.getSessionManager(), record);\n\t\t\t\tthis.emitTerminalTelemetry(record);\n\t\t\t}\n\t\t\treturn { started: true, record, result };\n\t\t} catch (error) {\n\t\t\tconst record = this.lanes.complete(startedRecord.laneId, {\n\t\t\t\tstatus: \"failed\",\n\t\t\t\treasonCode: \"research_lane_error\",\n\t\t\t});\n\t\t\tif (record && !this.deps.isDisposed()) {\n\t\t\t\tappendLaneRecordSnapshot(this.deps.getSessionManager(), record);\n\t\t\t\tthis.emitTerminalTelemetry(record);\n\t\t\t}\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthis.deps.emit({ type: \"warning\", message: `Research lane failed: ${message}` });\n\t\t\treturn { started: true, record };\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tawait toolSurface?.dispose();\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tthis.deps.emit({ type: \"warning\", message: `Research lane payload cleanup failed: ${message}` });\n\t\t\t}\n\t\t\tthis._isRunning = false;\n\t\t\tderegisterInFlight();\n\t\t}\n\t}\n\n\tprivate buildDemand(): { query: string; context: string; goalId: string } | undefined {\n\t\tconst goal = this.deps.getGoalStateSnapshot();\n\t\tif (!goal || goal.status !== \"active\") {\n\t\t\tthis._lastSkipReason = \"no_active_goal\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst open = goal.requirements.filter((requirement) => requirement.status === \"open\");\n\t\tif (open.length === 0) {\n\t\t\tthis._lastSkipReason = \"no_open_requirements\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst query = `goal:${goal.goalId} requirements:${open\n\t\t\t.map((requirement) => requirement.id)\n\t\t\t.sort()\n\t\t\t.join(\",\")}`;\n\t\tif (this.deps.getEvidenceBundleSnapshot()?.query === query) {\n\t\t\tthis._lastSkipReason = \"recent_evidence_sufficient\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst context = [\n\t\t\t`Goal: ${goal.userGoal}`,\n\t\t\t\"Open requirements:\",\n\t\t\t...open.slice(0, 20).map((requirement) => `- ${requirement.text}`),\n\t\t].join(\"\\n\");\n\t\treturn { query, context, goalId: goal.goalId };\n\t}\n\n\tprivate async runScheduled(): Promise<void> {\n\t\tif (this._isRunning || this.deps.isDisposed()) return;\n\t\tconst research = this.deps.getSettingsManager().getResearchLaneSettings();\n\t\tconst { mode } = this.deps.getSettingsManager().getAutonomySettings();\n\t\tif (!research.enabled || mode === \"off\") return;\n\t\ttry {\n\t\t\tawait this.runOnce();\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthis.deps.emit({ type: \"warning\", message: `Research lane failed: ${message}` });\n\t\t}\n\t}\n\n\tprivate buildEnvelope(\n\t\tmaxUsd: number,\n\t\tlaneProfile: NormalizedProfile | undefined,\n\t\tsurface: LaneToolSurface,\n\t): CapabilityEnvelope {\n\t\treturn {\n\t\t\tid: `research-${this.deps.getSessionId()}-${Date.now()}`,\n\t\t\tprofileId: laneProfile?.name,\n\t\t\tcapabilities: [\"research.execute\", \"filesystem.read\", \"memory.query\"],\n\t\t\tallowedTools: [...surface.allowedTools],\n\t\t\tdeniedTools: [...surface.deniedTools],\n\t\t\tallowedPaths: [this.deps.getCwd()],\n\t\t\tdeniedPaths: getPrivateLaneDeniedPaths(this.deps.getCwd(), this.deps.getAgentDir()),\n\t\t\tmaxEstimatedUsd: clampLaneMaxUsd(maxUsd, this.deps.getCapabilityEnvelope()?.maxEstimatedUsd),\n\t\t\tcreatedAt: new Date().toISOString(),\n\t\t};\n\t}\n\n\tprivate warnUnboundToolGrants(laneProfile: NormalizedProfile | undefined, surface: LaneToolSurface): void {\n\t\tif (!laneProfile || surface.unboundAllowPatterns.length === 0) return;\n\t\tconst warningKey = `${laneProfile.name}\\0${[...surface.unboundAllowPatterns].sort().join(\"\\0\")}`;\n\t\tif (this.warnedUnboundToolGrants.has(warningKey)) return;\n\t\tthis.warnedUnboundToolGrants.add(warningKey);\n\t\tthis.deps.emit({\n\t\t\ttype: \"warning\",\n\t\t\tmessage: `Lane profile '${laneProfile.name}' grants unavailable isolated-lane tools: ${surface.unboundAllowPatterns.join(\", \")}. Only classified lane tools can execute.`,\n\t\t});\n\t}\n\n\tprivate emitTerminalTelemetry(record: ReturnType<LaneTracker[\"complete\"]> & {}): void {\n\t\tthis.deps.emitAutonomyTelemetry({\n\t\t\ttype: AUTONOMY_TELEMETRY_EVENT_TYPES.evidenceBundle,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tpayload: {\n\t\t\t\tlaneId: record.laneId,\n\t\t\t\tlaneType: record.type,\n\t\t\t\tstatus: record.status,\n\t\t\t\treasonCode: record.reasonCode ?? null,\n\t\t\t\tcostUsd: record.costUsd ?? null,\n\t\t\t\thasEvidence: record.evidenceEntryId !== undefined,\n\t\t\t},\n\t\t});\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"research-lane-controller.js","sourceRoot":"","sources":["../../../src/core/research/research-lane-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionManager } from \"@caupulican/pi-agent-core/session\";\nimport { resolveModelThinkingLevel } from \"@caupulican/pi-ai/models\";\nimport type { Usage } from \"@caupulican/pi-ai/types\";\nimport type {\n\tAgentSessionEvent,\n\tIsolatedCompletionOptions,\n\tIsolatedCompletionResult,\n\tResearchLaneRunOutcome,\n} from \"../agent-session.ts\";\nimport type { CapabilityEnvelope, EvidenceBundle } from \"../autonomy/contracts.ts\";\nimport { getPrivateLaneDeniedPaths } from \"../autonomy/lane-private-paths.ts\";\nimport { createLaneToolSurface, type LaneToolSurface } from \"../autonomy/lane-tool-surface.ts\";\nimport type { LaneTracker } from \"../autonomy/lane-tracker.ts\";\nimport { appendLaneRecordSnapshot, getLaneRecordSnapshots } from \"../autonomy/session-lane-record.ts\";\nimport { composeSubagentSystemPrompt } from \"../autonomy/subagent-prompt.ts\";\nimport { AUTONOMY_TELEMETRY_EVENT_TYPES, type AutonomyTelemetryEvent } from \"../autonomy/telemetry-events.ts\";\nimport { type GoalState, isGoalExecutionActive } from \"../goals/goal-state.ts\";\nimport type { NormalizedProfile } from \"../profile-registry.ts\";\nimport { registerInFlightWork } from \"../reload-blockers.ts\";\nimport type { SettingsManager } from \"../settings-manager.ts\";\nimport { clampLaneMaxUsd, type LaneModelResolver } from \"./lane-model-resolver.ts\";\nimport { runResearch } from \"./research-runner.ts\";\nimport type { collectWorkspaceSources } from \"./workspace-collector.ts\";\n\nexport interface ResearchLaneControllerDeps {\n\tisDisposed(): boolean;\n\tisChildSession(): boolean;\n\tgetSessionId(): string;\n\tgetCwd(): string;\n\tgetAgentDir(): string;\n\tgetSessionManager(): SessionManager;\n\tgetSettingsManager(): SettingsManager;\n\tgetCapabilityEnvelope(): CapabilityEnvelope | undefined;\n\temit(event: AgentSessionEvent): void;\n\temitAutonomyTelemetry(event: AutonomyTelemetryEvent): void;\n\tgetGoalStateSnapshot(): GoalState | undefined;\n\tgetEvidenceBundleSnapshot(): EvidenceBundle | undefined;\n\tsaveEvidenceBundleSnapshot(bundle: EvidenceBundle): string;\n\taddSpawnedUsage(\n\t\tusage: Usage,\n\t\topts: { label?: string; sourceSessionId?: string; reportId: string },\n\t): string | undefined;\n\trunIsolatedCompletion(opts: IsolatedCompletionOptions): Promise<IsolatedCompletionResult>;\n\tcollectWorkspaceSources: typeof collectWorkspaceSources;\n}\n\n/** Owns autonomous research demand, scheduling, execution, persistence, and cancellation. */\nexport class ResearchLaneController {\n\tprivate _timer: ReturnType<typeof setTimeout> | undefined;\n\tprivate _isRunning = false;\n\tprivate _lastSkipReason: string | undefined;\n\tprivate _historySeeded = false;\n\tprivate _persistedRunCount = 0;\n\tprivate readonly abortController = new AbortController();\n\tprivate readonly warnedUnboundToolGrants = new Set<string>();\n\tprivate readonly deps: ResearchLaneControllerDeps;\n\tprivate readonly lanes: LaneTracker;\n\tprivate readonly models: LaneModelResolver;\n\n\tconstructor(deps: ResearchLaneControllerDeps, lanes: LaneTracker, models: LaneModelResolver) {\n\t\tthis.deps = deps;\n\t\tthis.lanes = lanes;\n\t\tthis.models = models;\n\t}\n\n\tseedHistory(): void {\n\t\tif (this._historySeeded) return;\n\t\tconst records = getLaneRecordSnapshots(this.deps.getSessionManager().getEntries());\n\t\tthis.lanes.ensureCounterAtLeast(records.length + 1);\n\t\tthis._persistedRunCount = records.filter((record) => record.type === \"research\").length;\n\t\tthis._historySeeded = true;\n\t}\n\n\tgetLastSkipReason(): string | undefined {\n\t\treturn this._lastSkipReason;\n\t}\n\n\tabort(): void {\n\t\tthis.clearTimer();\n\t\tthis.abortController.abort();\n\t}\n\n\tclearTimer(): void {\n\t\tif (this._timer !== undefined) {\n\t\t\tclearTimeout(this._timer);\n\t\t\tthis._timer = undefined;\n\t\t}\n\t}\n\n\tscheduleFromIdle(): void {\n\t\tif (this._isRunning || this.deps.isDisposed() || this.deps.isChildSession()) return;\n\t\tconst research = this.deps.getSettingsManager().getResearchLaneSettings();\n\t\tif (!research.enabled) {\n\t\t\tthis._lastSkipReason = \"research_lane_disabled\";\n\t\t\treturn;\n\t\t}\n\t\tconst { mode } = this.deps.getSettingsManager().getAutonomySettings();\n\t\tif (mode === \"off\") {\n\t\t\tthis._lastSkipReason = \"autonomy_mode_off\";\n\t\t\treturn;\n\t\t}\n\t\tthis.seedHistory();\n\t\tif (this._persistedRunCount >= research.maxRunsPerSession) {\n\t\t\tthis._lastSkipReason = \"max_runs_reached\";\n\t\t\treturn;\n\t\t}\n\t\tif (!this.buildDemand()) return;\n\t\tconst shipment = this.models.resolveShipment(research, \"no_research_model\");\n\t\tif (!shipment.ok) {\n\t\t\tthis._lastSkipReason = shipment.skipReason;\n\t\t\treturn;\n\t\t}\n\t\tif (!this.models.capabilityProfile(shipment.model).backgroundLanesEnabled) {\n\t\t\tthis._lastSkipReason = \"model_research_unsupported\";\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clearTimer();\n\t\tthis._timer = setTimeout(() => {\n\t\t\tthis._timer = undefined;\n\t\t\tvoid this.runScheduled();\n\t\t}, research.idleDelayMs);\n\t\tconst timer = this._timer;\n\t\tif (typeof timer === \"object\" && timer && \"unref\" in timer) {\n\t\t\tconst { unref } = timer as { unref?: () => void };\n\t\t\tunref?.call(timer);\n\t\t}\n\t}\n\n\tasync runOnce(request?: { query?: string; context?: string; goalId?: string }): Promise<ResearchLaneRunOutcome> {\n\t\tif (this._isRunning) return { started: false, skipReason: \"research_lane_already_running\" };\n\t\tif (this.deps.isDisposed()) return { started: false, skipReason: \"session_disposed\" };\n\n\t\tconst settings = this.deps.getSettingsManager().getResearchLaneSettings();\n\t\tconst demand = request?.query\n\t\t\t? { query: request.query, context: request.context ?? \"\", goalId: request.goalId }\n\t\t\t: this.buildDemand();\n\t\tif (!demand) return { started: false, skipReason: this._lastSkipReason ?? \"no_research_demand\" };\n\n\t\tconst shipment = this.models.resolveShipment(settings, \"no_research_model\");\n\t\tif (!shipment.ok) {\n\t\t\tthis._lastSkipReason = shipment.skipReason;\n\t\t\treturn { started: false, skipReason: shipment.skipReason };\n\t\t}\n\t\tconst { model, laneProfile } = shipment;\n\t\tconst laneCapability = this.models.capabilityProfile(model);\n\t\tif (!laneCapability.backgroundLanesEnabled) {\n\t\t\tthis._lastSkipReason = \"model_research_unsupported\";\n\t\t\treturn { started: false, skipReason: \"model_research_unsupported\" };\n\t\t}\n\n\t\tthis._isRunning = true;\n\t\tthis.seedHistory();\n\t\tconst startedRecord = this.lanes.start({ type: \"research\", goalId: demand.goalId });\n\t\tthis._persistedRunCount++;\n\t\tconst deregisterInFlight = registerInFlightWork(\n\t\t\tthis.deps.getAgentDir(),\n\t\t\t\"lane\",\n\t\t\t`research:${startedRecord.laneId}`,\n\t\t);\n\t\tlet toolSurface: LaneToolSurface | undefined;\n\t\ttry {\n\t\t\tlet spentUsage: Usage | undefined;\n\t\t\tconst workspaceSources = await this.deps.collectWorkspaceSources({\n\t\t\t\tquery: `${demand.context}\\n${demand.query}`,\n\t\t\t\tcwd: this.deps.getCwd(),\n\t\t\t\tmaxSources: settings.maxSources,\n\t\t\t});\n\t\t\tconst maxUsd = clampLaneMaxUsd(settings.maxUsd, this.deps.getCapabilityEnvelope()?.maxEstimatedUsd);\n\t\t\tconst activeToolSurface = createLaneToolSurface({\n\t\t\t\tcwd: this.deps.getCwd(),\n\t\t\t\tprofile: laneProfile,\n\t\t\t\tdeniedPaths: getPrivateLaneDeniedPaths(this.deps.getCwd(), this.deps.getAgentDir()),\n\t\t\t});\n\t\t\ttoolSurface = activeToolSurface;\n\t\t\tthis.warnUnboundToolGrants(laneProfile, activeToolSurface);\n\t\t\tconst result = await runResearch({\n\t\t\t\tquery: demand.query,\n\t\t\t\tcontext: demand.context,\n\t\t\t\tsources: workspaceSources,\n\t\t\t\tenvelope: this.buildEnvelope(maxUsd, laneProfile, activeToolSurface),\n\t\t\t\tmaxUsd,\n\t\t\t\tmaxSources: settings.maxSources,\n\t\t\t\tmaxFindings: settings.maxFindings,\n\t\t\t\tmaxWallClockMs: settings.maxWallClockMs,\n\t\t\t\tsignal: this.abortController.signal,\n\t\t\t\tcomplete: async ({ systemPrompt, userPrompt, signal }) => {\n\t\t\t\t\tconst completion = await this.deps.runIsolatedCompletion({\n\t\t\t\t\t\tsystemPrompt: composeSubagentSystemPrompt({\n\t\t\t\t\t\t\tsoul: laneProfile?.soul,\n\t\t\t\t\t\t\trolePrompt: systemPrompt,\n\t\t\t\t\t\t\toverride: settings.systemPrompt,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tmessages: [{ role: \"user\", content: [{ type: \"text\", text: userPrompt }], timestamp: Date.now() }],\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tthinkingLevel: resolveModelThinkingLevel(model, laneProfile?.thinking),\n\t\t\t\t\t\tmaxTokens: laneCapability.laneMaxOutputTokens,\n\t\t\t\t\t\ttools: activeToolSurface.tools,\n\t\t\t\t\t\tmaxTurns: 6,\n\t\t\t\t\t\tbeforeToolCall: activeToolSurface.beforeToolCall,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\tcacheRetention: \"short\",\n\t\t\t\t\t\tlaneKind: \"research\",\n\t\t\t\t\t});\n\t\t\t\t\tspentUsage = completion.usage;\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttext: completion.text,\n\t\t\t\t\t\tcostUsd: completion.usage.cost.total,\n\t\t\t\t\t\tstopReason: String(completion.stopReason),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (this.deps.isDisposed()) {\n\t\t\t\tconst record = this.lanes.complete(startedRecord.laneId, {\n\t\t\t\t\tstatus: \"canceled\",\n\t\t\t\t\treasonCode: \"session_disposed\",\n\t\t\t\t});\n\t\t\t\treturn { started: true, record, result };\n\t\t\t}\n\n\t\t\tlet evidenceEntryId: string | undefined;\n\t\t\tif (result.bundle) evidenceEntryId = this.deps.saveEvidenceBundleSnapshot(result.bundle);\n\t\t\tif (spentUsage && (spentUsage.cost.total > 0 || spentUsage.totalTokens > 0)) {\n\t\t\t\tthis.deps.addSpawnedUsage(spentUsage, {\n\t\t\t\t\tlabel: \"research-lane\",\n\t\t\t\t\treportId: `research:${this.deps.getSessionId()}:${startedRecord.laneId}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst record = this.lanes.complete(startedRecord.laneId, {\n\t\t\t\tstatus: result.status,\n\t\t\t\treasonCode: result.reasonCode,\n\t\t\t\tcostUsd: result.costUsd,\n\t\t\t\tevidenceEntryId,\n\t\t\t});\n\t\t\tif (record) {\n\t\t\t\tappendLaneRecordSnapshot(this.deps.getSessionManager(), record);\n\t\t\t\tthis.emitTerminalTelemetry(record);\n\t\t\t}\n\t\t\treturn { started: true, record, result };\n\t\t} catch (error) {\n\t\t\tconst record = this.lanes.complete(startedRecord.laneId, {\n\t\t\t\tstatus: \"failed\",\n\t\t\t\treasonCode: \"research_lane_error\",\n\t\t\t});\n\t\t\tif (record && !this.deps.isDisposed()) {\n\t\t\t\tappendLaneRecordSnapshot(this.deps.getSessionManager(), record);\n\t\t\t\tthis.emitTerminalTelemetry(record);\n\t\t\t}\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthis.deps.emit({ type: \"warning\", message: `Research lane failed: ${message}` });\n\t\t\treturn { started: true, record };\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tawait toolSurface?.dispose();\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tthis.deps.emit({ type: \"warning\", message: `Research lane payload cleanup failed: ${message}` });\n\t\t\t}\n\t\t\tthis._isRunning = false;\n\t\t\tderegisterInFlight();\n\t\t}\n\t}\n\n\tprivate buildDemand(): { query: string; context: string; goalId: string } | undefined {\n\t\tconst goal = this.deps.getGoalStateSnapshot();\n\t\tif (!goal || !isGoalExecutionActive(goal.status)) {\n\t\t\tthis._lastSkipReason = \"no_active_goal\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst open = goal.requirements.filter((requirement) => requirement.status === \"open\");\n\t\tif (open.length === 0) {\n\t\t\tthis._lastSkipReason = \"no_open_requirements\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst query = `goal:${goal.goalId} requirements:${open\n\t\t\t.map((requirement) => requirement.id)\n\t\t\t.sort()\n\t\t\t.join(\",\")}`;\n\t\tif (this.deps.getEvidenceBundleSnapshot()?.query === query) {\n\t\t\tthis._lastSkipReason = \"recent_evidence_sufficient\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst context = [\n\t\t\t`Goal: ${goal.userGoal}`,\n\t\t\t\"Open requirements:\",\n\t\t\t...open.slice(0, 20).map((requirement) => `- ${requirement.text}`),\n\t\t].join(\"\\n\");\n\t\treturn { query, context, goalId: goal.goalId };\n\t}\n\n\tprivate async runScheduled(): Promise<void> {\n\t\tif (this._isRunning || this.deps.isDisposed()) return;\n\t\tconst research = this.deps.getSettingsManager().getResearchLaneSettings();\n\t\tconst { mode } = this.deps.getSettingsManager().getAutonomySettings();\n\t\tif (!research.enabled || mode === \"off\") return;\n\t\ttry {\n\t\t\tawait this.runOnce();\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthis.deps.emit({ type: \"warning\", message: `Research lane failed: ${message}` });\n\t\t}\n\t}\n\n\tprivate buildEnvelope(\n\t\tmaxUsd: number,\n\t\tlaneProfile: NormalizedProfile | undefined,\n\t\tsurface: LaneToolSurface,\n\t): CapabilityEnvelope {\n\t\treturn {\n\t\t\tid: `research-${this.deps.getSessionId()}-${Date.now()}`,\n\t\t\tprofileId: laneProfile?.name,\n\t\t\tcapabilities: [\"research.execute\", \"filesystem.read\", \"memory.query\"],\n\t\t\tallowedTools: [...surface.allowedTools],\n\t\t\tdeniedTools: [...surface.deniedTools],\n\t\t\tallowedPaths: [this.deps.getCwd()],\n\t\t\tdeniedPaths: getPrivateLaneDeniedPaths(this.deps.getCwd(), this.deps.getAgentDir()),\n\t\t\tmaxEstimatedUsd: clampLaneMaxUsd(maxUsd, this.deps.getCapabilityEnvelope()?.maxEstimatedUsd),\n\t\t\tcreatedAt: new Date().toISOString(),\n\t\t};\n\t}\n\n\tprivate warnUnboundToolGrants(laneProfile: NormalizedProfile | undefined, surface: LaneToolSurface): void {\n\t\tif (!laneProfile || surface.unboundAllowPatterns.length === 0) return;\n\t\tconst warningKey = `${laneProfile.name}\\0${[...surface.unboundAllowPatterns].sort().join(\"\\0\")}`;\n\t\tif (this.warnedUnboundToolGrants.has(warningKey)) return;\n\t\tthis.warnedUnboundToolGrants.add(warningKey);\n\t\tthis.deps.emit({\n\t\t\ttype: \"warning\",\n\t\t\tmessage: `Lane profile '${laneProfile.name}' grants unavailable isolated-lane tools: ${surface.unboundAllowPatterns.join(\", \")}. Only classified lane tools can execute.`,\n\t\t});\n\t}\n\n\tprivate emitTerminalTelemetry(record: ReturnType<LaneTracker[\"complete\"]> & {}): void {\n\t\tthis.deps.emitAutonomyTelemetry({\n\t\t\ttype: AUTONOMY_TELEMETRY_EVENT_TYPES.evidenceBundle,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tpayload: {\n\t\t\t\tlaneId: record.laneId,\n\t\t\t\tlaneType: record.type,\n\t\t\t\tstatus: record.status,\n\t\t\t\treasonCode: record.reasonCode ?? null,\n\t\t\t\tcostUsd: record.costUsd ?? null,\n\t\t\t\thasEvidence: record.evidenceEntryId !== undefined,\n\t\t\t},\n\t\t});\n\t}\n}\n"]}
|
|
@@ -79,6 +79,8 @@ export interface ResourceLoader {
|
|
|
79
79
|
reload(options?: ResourceReloadOptions): Promise<void>;
|
|
80
80
|
commitReload?(): void | Promise<void>;
|
|
81
81
|
rollbackReload?(): void | Promise<void>;
|
|
82
|
+
/** Release the current (and any deferred) extension generation. Session dispose must call this. */
|
|
83
|
+
dispose?(): void | Promise<void>;
|
|
82
84
|
/** Get all discoverable extension paths (enabled and disabled) */
|
|
83
85
|
getDiscoverableExtensionPaths(): Promise<string[]>;
|
|
84
86
|
}
|
|
@@ -311,6 +313,7 @@ export declare class DefaultResourceLoader implements ResourceLoader {
|
|
|
311
313
|
private restoreSnapshot;
|
|
312
314
|
commitReload(): Promise<void>;
|
|
313
315
|
rollbackReload(): Promise<void>;
|
|
316
|
+
dispose(): Promise<void>;
|
|
314
317
|
reload(options?: ResourceReloadOptions): Promise<void>;
|
|
315
318
|
private normalizeExtensionPaths;
|
|
316
319
|
private updateSkillsFromPaths;
|