@caupulican/pi-adaptative 0.81.39 → 0.81.41
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 +77 -0
- package/README.md +2 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts +2 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +3 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +4 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts +9 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +290 -107
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +357 -122
- package/dist/bundled-resources/skills/tool-call-repair/references/repair-catalogue.md +2 -2
- package/dist/cli/args.d.ts +4 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +31 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-directory-layout.d.ts +15 -0
- package/dist/core/agent-directory-layout.d.ts.map +1 -0
- package/dist/core/agent-directory-layout.js +72 -0
- package/dist/core/agent-directory-layout.js.map +1 -0
- package/dist/core/agent-paths.d.ts +25 -2
- package/dist/core/agent-paths.d.ts.map +1 -1
- package/dist/core/agent-paths.js +79 -4
- package/dist/core/agent-paths.js.map +1 -1
- package/dist/core/agent-session-contracts.d.ts +293 -0
- package/dist/core/agent-session-contracts.d.ts.map +1 -0
- package/dist/core/agent-session-contracts.js +26 -0
- package/dist/core/agent-session-contracts.js.map +1 -0
- package/dist/core/agent-session-runtime.d.ts +52 -8
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +400 -79
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -0
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +74 -518
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +370 -1432
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +3 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/autonomy/approval-gate.d.ts +3 -2
- package/dist/core/autonomy/approval-gate.d.ts.map +1 -1
- package/dist/core/autonomy/approval-gate.js +6 -28
- package/dist/core/autonomy/approval-gate.js.map +1 -1
- package/dist/core/autonomy/bounded-completion.d.ts +1 -1
- package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
- package/dist/core/autonomy/bounded-completion.js +1 -1
- package/dist/core/autonomy/bounded-completion.js.map +1 -1
- package/dist/core/autonomy/contracts.d.ts +20 -12
- package/dist/core/autonomy/contracts.d.ts.map +1 -1
- package/dist/core/autonomy/contracts.js.map +1 -1
- package/dist/core/autonomy/foreground-envelope.d.ts +8 -2
- package/dist/core/autonomy/foreground-envelope.d.ts.map +1 -1
- package/dist/core/autonomy/foreground-envelope.js +8 -25
- package/dist/core/autonomy/foreground-envelope.js.map +1 -1
- package/dist/core/autonomy/gates.d.ts.map +1 -1
- package/dist/core/autonomy/gates.js +8 -10
- package/dist/core/autonomy/gates.js.map +1 -1
- package/dist/core/autonomy/lane-private-paths.d.ts +2 -0
- package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -0
- package/dist/core/autonomy/lane-private-paths.js +16 -0
- package/dist/core/autonomy/lane-private-paths.js.map +1 -0
- package/dist/core/autonomy/lane-tool-surface.d.ts +10 -0
- package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.js +48 -9
- package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
- package/dist/core/autonomy/lane-tracker.d.ts +14 -0
- package/dist/core/autonomy/lane-tracker.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tracker.js +38 -0
- package/dist/core/autonomy/lane-tracker.js.map +1 -1
- package/dist/core/autonomy/risk-assessment.d.ts +1 -2
- package/dist/core/autonomy/risk-assessment.d.ts.map +1 -1
- package/dist/core/autonomy/risk-assessment.js +1 -123
- package/dist/core/autonomy/risk-assessment.js.map +1 -1
- package/dist/core/autonomy/session-lane-record.d.ts +4 -4
- package/dist/core/autonomy/session-lane-record.d.ts.map +1 -1
- package/dist/core/autonomy/session-lane-record.js +16 -29
- package/dist/core/autonomy/session-lane-record.js.map +1 -1
- package/dist/core/autonomy/telemetry-events.d.ts +1 -1
- package/dist/core/autonomy/telemetry-events.d.ts.map +1 -1
- package/dist/core/autonomy/telemetry-events.js +1 -1
- package/dist/core/autonomy/telemetry-events.js.map +1 -1
- package/dist/core/autonomy-telemetry.d.ts +7 -7
- package/dist/core/autonomy-telemetry.d.ts.map +1 -1
- package/dist/core/autonomy-telemetry.js +9 -9
- package/dist/core/autonomy-telemetry.js.map +1 -1
- package/dist/core/background-lane-controller.d.ts +56 -236
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +141 -1273
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/bedrock-sso-login.d.ts +16 -0
- package/dist/core/bedrock-sso-login.d.ts.map +1 -0
- package/dist/core/bedrock-sso-login.js +98 -0
- package/dist/core/bedrock-sso-login.js.map +1 -0
- package/dist/core/capability-contract.d.ts +4 -0
- package/dist/core/capability-contract.d.ts.map +1 -0
- package/dist/core/capability-contract.js +28 -0
- package/dist/core/capability-contract.js.map +1 -0
- package/dist/core/compaction-controller.d.ts +90 -0
- package/dist/core/compaction-controller.d.ts.map +1 -0
- package/dist/core/compaction-controller.js +452 -0
- package/dist/core/compaction-controller.js.map +1 -0
- package/dist/core/compaction-support.d.ts +13 -17
- package/dist/core/compaction-support.d.ts.map +1 -1
- package/dist/core/compaction-support.js +3 -3
- package/dist/core/compaction-support.js.map +1 -1
- package/dist/core/context/context-artifacts.d.ts +6 -2
- package/dist/core/context/context-artifacts.d.ts.map +1 -1
- package/dist/core/context/context-artifacts.js +34 -2
- package/dist/core/context/context-artifacts.js.map +1 -1
- package/dist/core/context/context-store-retention.d.ts +8 -2
- package/dist/core/context/context-store-retention.d.ts.map +1 -1
- package/dist/core/context/context-store-retention.js +158 -35
- package/dist/core/context/context-store-retention.js.map +1 -1
- package/dist/core/context/okf-memory.d.ts.map +1 -1
- package/dist/core/context/okf-memory.js +9 -11
- package/dist/core/context/okf-memory.js.map +1 -1
- package/dist/core/context/sqlite-runtime-index.d.ts.map +1 -1
- package/dist/core/context/sqlite-runtime-index.js +6 -8
- package/dist/core/context/sqlite-runtime-index.js.map +1 -1
- package/dist/core/context-gc.d.ts +3 -0
- package/dist/core/context-gc.d.ts.map +1 -1
- package/dist/core/context-gc.js +10 -5
- package/dist/core/context-gc.js.map +1 -1
- package/dist/core/context-pipeline.d.ts +1 -1
- package/dist/core/context-pipeline.d.ts.map +1 -1
- package/dist/core/context-pipeline.js +16 -37
- package/dist/core/context-pipeline.js.map +1 -1
- package/dist/core/cost/cost-summary.d.ts.map +1 -1
- package/dist/core/cost/cost-summary.js +5 -3
- package/dist/core/cost/cost-summary.js.map +1 -1
- package/dist/core/cost/daily-usage.d.ts.map +1 -1
- package/dist/core/cost/daily-usage.js +4 -5
- package/dist/core/cost/daily-usage.js.map +1 -1
- package/dist/core/default-tool-surface.d.ts.map +1 -1
- package/dist/core/default-tool-surface.js +2 -0
- package/dist/core/default-tool-surface.js.map +1 -1
- package/dist/core/delegation/managed-lane-controller.d.ts +34 -0
- package/dist/core/delegation/managed-lane-controller.d.ts.map +1 -0
- package/dist/core/delegation/managed-lane-controller.js +217 -0
- package/dist/core/delegation/managed-lane-controller.js.map +1 -0
- package/dist/core/delegation/session-worker-claim.d.ts +44 -0
- package/dist/core/delegation/session-worker-claim.d.ts.map +1 -0
- package/dist/core/delegation/session-worker-claim.js +98 -0
- package/dist/core/delegation/session-worker-claim.js.map +1 -0
- package/dist/core/delegation/worker-actions.d.ts +7 -5
- package/dist/core/delegation/worker-actions.d.ts.map +1 -1
- package/dist/core/delegation/worker-actions.js +20 -4
- package/dist/core/delegation/worker-actions.js.map +1 -1
- package/dist/core/delegation/{worker-result.d.ts → worker-claim.d.ts} +13 -13
- package/dist/core/delegation/worker-claim.d.ts.map +1 -0
- package/dist/core/delegation/{worker-result.js → worker-claim.js} +61 -51
- package/dist/core/delegation/worker-claim.js.map +1 -0
- package/dist/core/delegation/worker-delegation-controller.d.ts +110 -0
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -0
- package/dist/core/delegation/worker-delegation-controller.js +861 -0
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -0
- package/dist/core/delegation/worker-delegation-request.d.ts +11 -0
- package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -0
- package/dist/core/delegation/worker-delegation-request.js +2 -0
- package/dist/core/delegation/worker-delegation-request.js.map +1 -0
- package/dist/core/delegation/worker-dispatch-scheduler.d.ts +40 -0
- package/dist/core/delegation/worker-dispatch-scheduler.d.ts.map +1 -0
- package/dist/core/delegation/worker-dispatch-scheduler.js +93 -0
- package/dist/core/delegation/worker-dispatch-scheduler.js.map +1 -0
- package/dist/core/delegation/worker-execution-policy.d.ts +62 -0
- package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -0
- package/dist/core/delegation/worker-execution-policy.js +160 -0
- package/dist/core/delegation/worker-execution-policy.js.map +1 -0
- package/dist/core/delegation/worker-lane-projection.d.ts +14 -0
- package/dist/core/delegation/worker-lane-projection.d.ts.map +1 -0
- package/dist/core/delegation/worker-lane-projection.js +100 -0
- package/dist/core/delegation/worker-lane-projection.js.map +1 -0
- package/dist/core/delegation/worker-lifecycle.d.ts +97 -0
- package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -0
- package/dist/core/delegation/worker-lifecycle.js +339 -0
- package/dist/core/delegation/worker-lifecycle.js.map +1 -0
- package/dist/core/delegation/worker-notification-coordinator.d.ts +36 -0
- package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -0
- package/dist/core/delegation/worker-notification-coordinator.js +90 -0
- package/dist/core/delegation/worker-notification-coordinator.js.map +1 -0
- package/dist/core/delegation/worker-profile-resolver.d.ts +55 -0
- package/dist/core/delegation/worker-profile-resolver.d.ts.map +1 -0
- package/dist/core/delegation/worker-profile-resolver.js +113 -0
- package/dist/core/delegation/worker-profile-resolver.js.map +1 -0
- package/dist/core/delegation/worker-runner.d.ts +25 -14
- package/dist/core/delegation/worker-runner.d.ts.map +1 -1
- package/dist/core/delegation/worker-runner.js +122 -53
- package/dist/core/delegation/worker-runner.js.map +1 -1
- package/dist/core/delegation/worker-task-label.d.ts +3 -0
- package/dist/core/delegation/worker-task-label.d.ts.map +1 -0
- package/dist/core/delegation/worker-task-label.js +11 -0
- package/dist/core/delegation/worker-task-label.js.map +1 -0
- package/dist/core/doctor.d.ts +8 -0
- package/dist/core/doctor.d.ts.map +1 -1
- package/dist/core/doctor.js +32 -1
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/extension-import-authority.d.ts +6 -0
- package/dist/core/extension-import-authority.d.ts.map +1 -0
- package/dist/core/extension-import-authority.js +10 -0
- package/dist/core/extension-import-authority.js.map +1 -0
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +5 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +52 -18
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +3 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +20 -5
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/stale-context.d.ts +2 -0
- package/dist/core/extensions/stale-context.d.ts.map +1 -0
- package/dist/core/extensions/stale-context.js +2 -0
- package/dist/core/extensions/stale-context.js.map +1 -0
- package/dist/core/extensions/storage.d.ts +8 -0
- package/dist/core/extensions/storage.d.ts.map +1 -0
- package/dist/core/extensions/storage.js +28 -0
- package/dist/core/extensions/storage.js.map +1 -0
- package/dist/core/extensions/types.d.ts +78 -21
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/failure-corpus.d.ts +1 -15
- package/dist/core/failure-corpus.d.ts.map +1 -1
- package/dist/core/failure-corpus.js +9 -37
- package/dist/core/failure-corpus.js.map +1 -1
- package/dist/core/foreground-recovery-controller.d.ts +53 -0
- package/dist/core/foreground-recovery-controller.d.ts.map +1 -0
- package/dist/core/foreground-recovery-controller.js +111 -0
- package/dist/core/foreground-recovery-controller.js.map +1 -0
- package/dist/core/gateways/channel-provider.d.ts +3 -0
- package/dist/core/gateways/channel-provider.d.ts.map +1 -1
- package/dist/core/gateways/channel-provider.js +31 -6
- package/dist/core/gateways/channel-provider.js.map +1 -1
- package/dist/core/goal-loop-controller.d.ts +14 -9
- package/dist/core/goal-loop-controller.d.ts.map +1 -1
- package/dist/core/goal-loop-controller.js +47 -75
- package/dist/core/goal-loop-controller.js.map +1 -1
- package/dist/core/goals/compact-goal-context.d.ts +11 -0
- package/dist/core/goals/compact-goal-context.d.ts.map +1 -0
- package/dist/core/goals/compact-goal-context.js +59 -0
- package/dist/core/goals/compact-goal-context.js.map +1 -0
- package/dist/core/goals/goal-acceptance.d.ts +11 -0
- package/dist/core/goals/goal-acceptance.d.ts.map +1 -0
- package/dist/core/goals/goal-acceptance.js +27 -0
- package/dist/core/goals/goal-acceptance.js.map +1 -0
- package/dist/core/goals/goal-auto-continue-controller.d.ts +28 -0
- package/dist/core/goals/goal-auto-continue-controller.d.ts.map +1 -0
- package/dist/core/goals/goal-auto-continue-controller.js +90 -0
- package/dist/core/goals/goal-auto-continue-controller.js.map +1 -0
- package/dist/core/goals/goal-continuation-controller.d.ts +2 -2
- package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-continuation-controller.js +52 -11
- package/dist/core/goals/goal-continuation-controller.js.map +1 -1
- package/dist/core/goals/goal-continuation-defaults.d.ts +4 -29
- package/dist/core/goals/goal-continuation-defaults.d.ts.map +1 -1
- package/dist/core/goals/goal-continuation-defaults.js +4 -32
- package/dist/core/goals/goal-continuation-defaults.js.map +1 -1
- package/dist/core/goals/goal-continuation-prompt.d.ts +8 -18
- package/dist/core/goals/goal-continuation-prompt.d.ts.map +1 -1
- package/dist/core/goals/goal-continuation-prompt.js +9 -179
- package/dist/core/goals/goal-continuation-prompt.js.map +1 -1
- package/dist/core/goals/goal-lifecycle.d.ts +43 -0
- package/dist/core/goals/goal-lifecycle.d.ts.map +1 -0
- package/dist/core/goals/goal-lifecycle.js +102 -0
- package/dist/core/goals/goal-lifecycle.js.map +1 -0
- package/dist/core/goals/goal-record.d.ts +17 -0
- package/dist/core/goals/goal-record.d.ts.map +1 -0
- package/dist/core/goals/goal-record.js +31 -0
- package/dist/core/goals/goal-record.js.map +1 -0
- package/dist/core/goals/goal-runtime-snapshot.d.ts +11 -9
- package/dist/core/goals/goal-runtime-snapshot.d.ts.map +1 -1
- package/dist/core/goals/goal-runtime-snapshot.js +10 -8
- package/dist/core/goals/goal-runtime-snapshot.js.map +1 -1
- package/dist/core/goals/goal-session-controller.d.ts +42 -0
- package/dist/core/goals/goal-session-controller.d.ts.map +1 -0
- package/dist/core/goals/goal-session-controller.js +128 -0
- package/dist/core/goals/goal-session-controller.js.map +1 -0
- package/dist/core/goals/goal-state.d.ts +46 -25
- package/dist/core/goals/goal-state.d.ts.map +1 -1
- package/dist/core/goals/goal-state.js +91 -24
- package/dist/core/goals/goal-state.js.map +1 -1
- package/dist/core/goals/goal-tool-core.d.ts +9 -10
- package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
- package/dist/core/goals/goal-tool-core.js +60 -75
- package/dist/core/goals/goal-tool-core.js.map +1 -1
- package/dist/core/goals/session-goal-state.d.ts +20 -12
- package/dist/core/goals/session-goal-state.d.ts.map +1 -1
- package/dist/core/goals/session-goal-state.js +133 -33
- package/dist/core/goals/session-goal-state.js.map +1 -1
- package/dist/core/human-input-controller.d.ts +47 -0
- package/dist/core/human-input-controller.d.ts.map +1 -0
- package/dist/core/human-input-controller.js +181 -0
- package/dist/core/human-input-controller.js.map +1 -0
- package/dist/core/human-input.d.ts +100 -0
- package/dist/core/human-input.d.ts.map +1 -0
- package/dist/core/human-input.js +362 -0
- package/dist/core/human-input.js.map +1 -0
- package/dist/core/index.d.ts +9 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +9 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/{telemetry.d.ts → install-telemetry.d.ts} +1 -1
- package/dist/core/install-telemetry.d.ts.map +1 -0
- package/dist/core/{telemetry.js → install-telemetry.js} +1 -1
- package/dist/core/install-telemetry.js.map +1 -0
- package/dist/core/keybindings.d.ts +17 -1
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +24 -6
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/learning/learning-audit.d.ts +2 -4
- package/dist/core/learning/learning-audit.d.ts.map +1 -1
- package/dist/core/learning/learning-audit.js +9 -29
- package/dist/core/learning/learning-audit.js.map +1 -1
- package/dist/core/learning/learning-gate.d.ts.map +1 -1
- package/dist/core/learning/learning-gate.js +1 -6
- package/dist/core/learning/learning-gate.js.map +1 -1
- package/dist/core/learning/session-learning-decision.d.ts +2 -4
- package/dist/core/learning/session-learning-decision.d.ts.map +1 -1
- package/dist/core/learning/session-learning-decision.js +9 -29
- package/dist/core/learning/session-learning-decision.js.map +1 -1
- package/dist/core/local-runtime-controller.d.ts +1 -1
- package/dist/core/local-runtime-controller.d.ts.map +1 -1
- package/dist/core/local-runtime-controller.js.map +1 -1
- package/dist/core/memory-controller.d.ts.map +1 -1
- package/dist/core/memory-controller.js +4 -4
- package/dist/core/memory-controller.js.map +1 -1
- package/dist/core/model-capability.d.ts +0 -19
- package/dist/core/model-capability.d.ts.map +1 -1
- package/dist/core/model-capability.js +1 -19
- package/dist/core/model-capability.js.map +1 -1
- package/dist/core/model-registry.d.ts +6 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +13 -5
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +17 -2
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +38 -25
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-router/intent-classifier.d.ts +1 -4
- package/dist/core/model-router/intent-classifier.d.ts.map +1 -1
- package/dist/core/model-router/intent-classifier.js +1 -156
- package/dist/core/model-router/intent-classifier.js.map +1 -1
- package/dist/core/model-router-controller.d.ts +1 -1
- package/dist/core/model-router-controller.d.ts.map +1 -1
- package/dist/core/model-router-controller.js +2 -2
- package/dist/core/model-router-controller.js.map +1 -1
- package/dist/core/model-selection-controller.d.ts +5 -5
- package/dist/core/model-selection-controller.d.ts.map +1 -1
- package/dist/core/model-selection-controller.js.map +1 -1
- package/dist/core/model-tool-protocol.d.ts +23 -0
- package/dist/core/model-tool-protocol.d.ts.map +1 -0
- package/dist/core/model-tool-protocol.js +43 -0
- package/dist/core/model-tool-protocol.js.map +1 -0
- package/dist/core/models/adaptation-store.d.ts +4 -6
- package/dist/core/models/adaptation-store.d.ts.map +1 -1
- package/dist/core/models/adaptation-store.js +95 -83
- package/dist/core/models/adaptation-store.js.map +1 -1
- package/dist/core/models/fitness-store.d.ts +2 -12
- package/dist/core/models/fitness-store.d.ts.map +1 -1
- package/dist/core/models/fitness-store.js +84 -57
- package/dist/core/models/fitness-store.js.map +1 -1
- package/dist/core/models/host-state-store.d.ts +34 -0
- package/dist/core/models/host-state-store.d.ts.map +1 -0
- package/dist/core/models/host-state-store.js +86 -0
- package/dist/core/models/host-state-store.js.map +1 -0
- package/dist/core/orchestration/agent-resume.d.ts +24 -0
- package/dist/core/orchestration/agent-resume.d.ts.map +1 -0
- package/dist/core/orchestration/agent-resume.js +90 -0
- package/dist/core/orchestration/agent-resume.js.map +1 -0
- package/dist/core/orchestration/capability-gateway.d.ts +61 -0
- package/dist/core/orchestration/capability-gateway.d.ts.map +1 -0
- package/dist/core/orchestration/capability-gateway.js +152 -0
- package/dist/core/orchestration/capability-gateway.js.map +1 -0
- package/dist/core/orchestration/contracts.d.ts +343 -0
- package/dist/core/orchestration/contracts.d.ts.map +1 -0
- package/dist/core/orchestration/contracts.js +135 -0
- package/dist/core/orchestration/contracts.js.map +1 -0
- package/dist/core/orchestration/delegation-ledger.d.ts +56 -0
- package/dist/core/orchestration/delegation-ledger.d.ts.map +1 -0
- package/dist/core/orchestration/delegation-ledger.js +200 -0
- package/dist/core/orchestration/delegation-ledger.js.map +1 -0
- package/dist/core/orchestration/event-store.d.ts +83 -0
- package/dist/core/orchestration/event-store.d.ts.map +1 -0
- package/dist/core/orchestration/event-store.js +560 -0
- package/dist/core/orchestration/event-store.js.map +1 -0
- package/dist/core/orchestration/lane-tool-manifests.d.ts +9 -0
- package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -0
- package/dist/core/orchestration/lane-tool-manifests.js +37 -0
- package/dist/core/orchestration/lane-tool-manifests.js.map +1 -0
- package/dist/core/orchestration/model-binding.d.ts +15 -0
- package/dist/core/orchestration/model-binding.d.ts.map +1 -0
- package/dist/core/orchestration/model-binding.js +29 -0
- package/dist/core/orchestration/model-binding.js.map +1 -0
- package/dist/core/orchestration/policy-compiler.d.ts +49 -0
- package/dist/core/orchestration/policy-compiler.d.ts.map +1 -0
- package/dist/core/orchestration/policy-compiler.js +191 -0
- package/dist/core/orchestration/policy-compiler.js.map +1 -0
- package/dist/core/orchestration/policy-gate.d.ts +18 -0
- package/dist/core/orchestration/policy-gate.d.ts.map +1 -0
- package/dist/core/orchestration/policy-gate.js +24 -0
- package/dist/core/orchestration/policy-gate.js.map +1 -0
- package/dist/core/orchestration/profile-registry.d.ts +51 -0
- package/dist/core/orchestration/profile-registry.d.ts.map +1 -0
- package/dist/core/orchestration/profile-registry.js +393 -0
- package/dist/core/orchestration/profile-registry.js.map +1 -0
- package/dist/core/orchestration/profile-store.d.ts +31 -0
- package/dist/core/orchestration/profile-store.d.ts.map +1 -0
- package/dist/core/orchestration/profile-store.js +136 -0
- package/dist/core/orchestration/profile-store.js.map +1 -0
- package/dist/core/orchestration/risk-budget.d.ts +9 -0
- package/dist/core/orchestration/risk-budget.d.ts.map +1 -0
- package/dist/core/orchestration/risk-budget.js +48 -0
- package/dist/core/orchestration/risk-budget.js.map +1 -0
- package/dist/core/orchestration/task-runtime.d.ts +168 -0
- package/dist/core/orchestration/task-runtime.d.ts.map +1 -0
- package/dist/core/orchestration/task-runtime.js +1600 -0
- package/dist/core/orchestration/task-runtime.js.map +1 -0
- package/dist/core/orchestration/work-state-projection.d.ts +32 -0
- package/dist/core/orchestration/work-state-projection.d.ts.map +1 -0
- package/dist/core/orchestration/work-state-projection.js +116 -0
- package/dist/core/orchestration/work-state-projection.js.map +1 -0
- package/dist/core/orchestration/worker-execution-contract.d.ts +21 -0
- package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -0
- package/dist/core/orchestration/worker-execution-contract.js +179 -0
- package/dist/core/orchestration/worker-execution-contract.js.map +1 -0
- package/dist/core/orchestration/worker-result-adapter.d.ts +21 -0
- package/dist/core/orchestration/worker-result-adapter.d.ts.map +1 -0
- package/dist/core/orchestration/worker-result-adapter.js +109 -0
- package/dist/core/orchestration/worker-result-adapter.js.map +1 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +20 -3
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/process-identity.d.ts +11 -0
- package/dist/core/process-identity.d.ts.map +1 -0
- package/dist/core/process-identity.js +26 -0
- package/dist/core/process-identity.js.map +1 -0
- package/dist/core/process-matrix/codes.d.ts +14 -3
- package/dist/core/process-matrix/codes.d.ts.map +1 -1
- package/dist/core/process-matrix/codes.js.map +1 -1
- package/dist/core/process-matrix/resume-launcher.d.ts +26 -0
- package/dist/core/process-matrix/resume-launcher.d.ts.map +1 -0
- package/dist/core/process-matrix/resume-launcher.js +62 -0
- package/dist/core/process-matrix/resume-launcher.js.map +1 -0
- package/dist/core/process-matrix/runtime.d.ts +37 -22
- package/dist/core/process-matrix/runtime.d.ts.map +1 -1
- package/dist/core/process-matrix/runtime.js +399 -76
- package/dist/core/process-matrix/runtime.js.map +1 -1
- package/dist/core/process-matrix/store.d.ts +5 -2
- package/dist/core/process-matrix/store.d.ts.map +1 -1
- package/dist/core/process-matrix/store.js +123 -14
- package/dist/core/process-matrix/store.js.map +1 -1
- package/dist/core/process-matrix/supervisor.d.ts +10 -7
- package/dist/core/process-matrix/supervisor.d.ts.map +1 -1
- package/dist/core/process-matrix/supervisor.js +45 -14
- package/dist/core/process-matrix/supervisor.js.map +1 -1
- package/dist/core/profile-filter-controller.d.ts +8 -1
- package/dist/core/profile-filter-controller.d.ts.map +1 -1
- package/dist/core/profile-filter-controller.js +23 -5
- package/dist/core/profile-filter-controller.js.map +1 -1
- package/dist/core/profile-registry.d.ts.map +1 -1
- package/dist/core/profile-registry.js +6 -8
- package/dist/core/profile-registry.js.map +1 -1
- package/dist/core/prompt-templates.d.ts +1 -0
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +18 -29
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/reflection-controller.d.ts +5 -5
- package/dist/core/reflection-controller.d.ts.map +1 -1
- package/dist/core/reflection-controller.js +5 -2
- package/dist/core/reflection-controller.js.map +1 -1
- package/dist/core/reload-blockers.d.ts.map +1 -1
- package/dist/core/reload-blockers.js +6 -8
- package/dist/core/reload-blockers.js.map +1 -1
- package/dist/core/request-auth.d.ts +7 -0
- package/dist/core/request-auth.d.ts.map +1 -0
- package/dist/core/request-auth.js +8 -0
- package/dist/core/request-auth.js.map +1 -0
- package/dist/core/research/evidence-bundle.d.ts.map +1 -1
- package/dist/core/research/evidence-bundle.js +1 -6
- package/dist/core/research/evidence-bundle.js.map +1 -1
- package/dist/core/research/lane-model-resolver.d.ts +33 -0
- package/dist/core/research/lane-model-resolver.d.ts.map +1 -0
- package/dist/core/research/lane-model-resolver.js +65 -0
- package/dist/core/research/lane-model-resolver.js.map +1 -0
- package/dist/core/research/model-fitness-controller.d.ts +38 -0
- package/dist/core/research/model-fitness-controller.d.ts.map +1 -0
- package/dist/core/research/model-fitness-controller.js +106 -0
- package/dist/core/research/model-fitness-controller.js.map +1 -0
- package/dist/core/research/model-fitness.d.ts +1 -1
- package/dist/core/research/model-fitness.d.ts.map +1 -1
- package/dist/core/research/model-fitness.js +4 -4
- package/dist/core/research/model-fitness.js.map +1 -1
- package/dist/core/research/research-gate.d.ts.map +1 -1
- package/dist/core/research/research-gate.js +7 -7
- package/dist/core/research/research-gate.js.map +1 -1
- package/dist/core/research/research-lane-controller.d.ts +62 -0
- package/dist/core/research/research-lane-controller.d.ts.map +1 -0
- package/dist/core/research/research-lane-controller.js +292 -0
- package/dist/core/research/research-lane-controller.js.map +1 -0
- package/dist/core/research/session-evidence-bundle.d.ts +2 -4
- package/dist/core/research/session-evidence-bundle.d.ts.map +1 -1
- package/dist/core/research/session-evidence-bundle.js +10 -46
- package/dist/core/research/session-evidence-bundle.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +23 -8
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/risk-classifier.d.ts +6 -0
- package/dist/core/risk-classifier.d.ts.map +1 -0
- package/dist/core/risk-classifier.js +233 -0
- package/dist/core/risk-classifier.js.map +1 -0
- package/dist/core/runtime-builder.d.ts +41 -23
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +365 -253
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/sdk.d.ts +6 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +68 -25
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/secrets/credential-exposure-guard.d.ts +9 -0
- package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -0
- package/dist/core/secrets/credential-exposure-guard.js +241 -0
- package/dist/core/secrets/credential-exposure-guard.js.map +1 -0
- package/dist/core/secrets/secret-dotenv.d.ts +27 -0
- package/dist/core/secrets/secret-dotenv.d.ts.map +1 -0
- package/dist/core/secrets/secret-dotenv.js +183 -0
- package/dist/core/secrets/secret-dotenv.js.map +1 -0
- package/dist/core/secrets/secret-vault-format.d.ts +112 -0
- package/dist/core/secrets/secret-vault-format.d.ts.map +1 -0
- package/dist/core/secrets/secret-vault-format.js +397 -0
- package/dist/core/secrets/secret-vault-format.js.map +1 -0
- package/dist/core/secrets/secret-vault.d.ts +72 -0
- package/dist/core/secrets/secret-vault.d.ts.map +1 -0
- package/dist/core/secrets/secret-vault.js +671 -0
- package/dist/core/secrets/secret-vault.js.map +1 -0
- package/dist/core/session-analytics.d.ts +4 -23
- package/dist/core/session-analytics.d.ts.map +1 -1
- package/dist/core/session-analytics.js +67 -70
- package/dist/core/session-analytics.js.map +1 -1
- package/dist/core/session-image-store.d.ts +33 -0
- package/dist/core/session-image-store.d.ts.map +1 -0
- package/dist/core/session-image-store.js +283 -0
- package/dist/core/session-image-store.js.map +1 -0
- package/dist/core/session-role.d.ts +11 -4
- package/dist/core/session-role.d.ts.map +1 -1
- package/dist/core/session-role.js +24 -5
- package/dist/core/session-role.js.map +1 -1
- package/dist/core/session-snapshot.d.ts +34 -0
- package/dist/core/session-snapshot.d.ts.map +1 -0
- package/dist/core/session-snapshot.js +68 -0
- package/dist/core/session-snapshot.js.map +1 -0
- package/dist/core/session-supervision-runtime.d.ts +31 -0
- package/dist/core/session-supervision-runtime.d.ts.map +1 -0
- package/dist/core/session-supervision-runtime.js +97 -0
- package/dist/core/session-supervision-runtime.js.map +1 -0
- package/dist/core/session-tree-navigator.d.ts +4 -6
- package/dist/core/session-tree-navigator.d.ts.map +1 -1
- package/dist/core/session-tree-navigator.js +4 -1
- package/dist/core/session-tree-navigator.js.map +1 -1
- package/dist/core/settings-manager.d.ts +10 -5
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +81 -29
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +2 -2
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/tasks/session-task-state.d.ts +2 -4
- package/dist/core/tasks/session-task-state.d.ts.map +1 -1
- package/dist/core/tasks/session-task-state.js +10 -28
- package/dist/core/tasks/session-task-state.js.map +1 -1
- package/dist/core/tasks/task-projection.d.ts +20 -0
- package/dist/core/tasks/task-projection.d.ts.map +1 -0
- package/dist/core/tasks/task-projection.js +47 -0
- package/dist/core/tasks/task-projection.js.map +1 -0
- package/dist/core/tasks/task-state.d.ts +4 -0
- package/dist/core/tasks/task-state.d.ts.map +1 -1
- package/dist/core/tasks/task-state.js +28 -11
- package/dist/core/tasks/task-state.js.map +1 -1
- package/dist/core/tool-capability-policy.d.ts +13 -0
- package/dist/core/tool-capability-policy.d.ts.map +1 -0
- package/dist/core/tool-capability-policy.js +86 -0
- package/dist/core/tool-capability-policy.js.map +1 -0
- package/dist/core/tool-gate-controller.d.ts.map +1 -1
- package/dist/core/tool-gate-controller.js +8 -2
- package/dist/core/tool-gate-controller.js.map +1 -1
- package/dist/core/tool-protocol-controller.d.ts +89 -0
- package/dist/core/tool-protocol-controller.d.ts.map +1 -0
- package/dist/core/tool-protocol-controller.js +512 -0
- package/dist/core/tool-protocol-controller.js.map +1 -0
- package/dist/core/tool-recovery-log-records.d.ts +2 -3
- package/dist/core/tool-recovery-log-records.d.ts.map +1 -1
- package/dist/core/tool-recovery-log-records.js +9 -35
- package/dist/core/tool-recovery-log-records.js.map +1 -1
- package/dist/core/tool-recovery-stats.d.ts +21 -1
- package/dist/core/tool-recovery-stats.d.ts.map +1 -1
- package/dist/core/tool-recovery-stats.js.map +1 -1
- package/dist/core/tool-selection/tool-performance-store.d.ts +3 -7
- package/dist/core/tool-selection/tool-performance-store.d.ts.map +1 -1
- package/dist/core/tool-selection/tool-performance-store.js +97 -138
- package/dist/core/tool-selection/tool-performance-store.js.map +1 -1
- package/dist/core/tools/ask-question.d.ts +124 -0
- package/dist/core/tools/ask-question.d.ts.map +1 -0
- package/dist/core/tools/ask-question.js +693 -0
- package/dist/core/tools/ask-question.js.map +1 -0
- package/dist/core/tools/bash.d.ts +5 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +59 -5
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/delegate-status.d.ts +31 -3
- package/dist/core/tools/delegate-status.d.ts.map +1 -1
- package/dist/core/tools/delegate-status.js +148 -29
- package/dist/core/tools/delegate-status.js.map +1 -1
- package/dist/core/tools/delegate.d.ts +15 -13
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +106 -23
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/extensionify.d.ts.map +1 -1
- package/dist/core/tools/extensionify.js +1 -0
- package/dist/core/tools/extensionify.js.map +1 -1
- package/dist/core/tools/git-filter.d.ts +1 -8
- package/dist/core/tools/git-filter.d.ts.map +1 -1
- package/dist/core/tools/git-filter.js +2 -63
- package/dist/core/tools/git-filter.js.map +1 -1
- package/dist/core/tools/goal.d.ts +10 -8
- package/dist/core/tools/goal.d.ts.map +1 -1
- package/dist/core/tools/goal.js +106 -28
- package/dist/core/tools/goal.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -0
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/model-fitness.d.ts.map +1 -1
- package/dist/core/tools/model-fitness.js +2 -2
- package/dist/core/tools/model-fitness.js.map +1 -1
- package/dist/core/tools/orchestration-panel.d.ts +40 -0
- package/dist/core/tools/orchestration-panel.d.ts.map +1 -0
- package/dist/core/tools/orchestration-panel.js +124 -0
- package/dist/core/tools/orchestration-panel.js.map +1 -0
- package/dist/core/tools/output-accumulator.d.ts +11 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +36 -3
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/python.d.ts +2 -0
- package/dist/core/tools/python.d.ts.map +1 -1
- package/dist/core/tools/python.js +3 -1
- package/dist/core/tools/python.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +1 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/run-process.d.ts +26 -0
- package/dist/core/tools/run-process.d.ts.map +1 -0
- package/dist/core/tools/run-process.js +138 -0
- package/dist/core/tools/run-process.js.map +1 -0
- package/dist/core/tools/search-command-guard.d.ts +14 -0
- package/dist/core/tools/search-command-guard.d.ts.map +1 -0
- package/dist/core/tools/search-command-guard.js +333 -0
- package/dist/core/tools/search-command-guard.js.map +1 -0
- package/dist/core/tools/secret-store.d.ts +38 -0
- package/dist/core/tools/secret-store.d.ts.map +1 -0
- package/dist/core/tools/secret-store.js +412 -0
- package/dist/core/tools/secret-store.js.map +1 -0
- package/dist/core/tools/shell-command-parser.d.ts +16 -0
- package/dist/core/tools/shell-command-parser.d.ts.map +1 -0
- package/dist/core/tools/shell-command-parser.js +113 -0
- package/dist/core/tools/shell-command-parser.js.map +1 -0
- package/dist/core/tools/task-steps.d.ts +2 -0
- package/dist/core/tools/task-steps.d.ts.map +1 -1
- package/dist/core/tools/task-steps.js +99 -0
- package/dist/core/tools/task-steps.js.map +1 -1
- package/dist/core/tools/tmux-dispatch.d.ts +3 -5
- package/dist/core/tools/tmux-dispatch.d.ts.map +1 -1
- package/dist/core/tools/tmux-dispatch.js +4 -4
- package/dist/core/tools/tmux-dispatch.js.map +1 -1
- package/dist/core/tools/windows-shell-engine.d.ts.map +1 -1
- package/dist/core/tools/windows-shell-engine.js +4 -6
- package/dist/core/tools/windows-shell-engine.js.map +1 -1
- package/dist/core/util/atomic-file.d.ts +6 -2
- package/dist/core/util/atomic-file.d.ts.map +1 -1
- package/dist/core/util/atomic-file.js +4 -4
- package/dist/core/util/atomic-file.js.map +1 -1
- package/dist/core/util/bounded-jsonl.d.ts +10 -0
- package/dist/core/util/bounded-jsonl.d.ts.map +1 -0
- package/dist/core/util/bounded-jsonl.js +75 -0
- package/dist/core/util/bounded-jsonl.js.map +1 -0
- package/dist/core/util/value-guards.d.ts +5 -0
- package/dist/core/util/value-guards.d.ts.map +1 -0
- package/dist/core/util/value-guards.js +12 -0
- package/dist/core/util/value-guards.js.map +1 -0
- package/dist/core/worktree-sync/store.d.ts +3 -3
- package/dist/core/worktree-sync/store.d.ts.map +1 -1
- package/dist/core/worktree-sync/store.js +10 -5
- package/dist/core/worktree-sync/store.js.map +1 -1
- package/dist/index.d.ts +15 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +149 -51
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts +4 -6
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +186 -28
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/auth-dialogs-controller.d.ts +4 -0
- package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
- package/dist/modes/interactive/auth-dialogs-controller.js +60 -1
- package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
- package/dist/modes/interactive/clipboard-input.d.ts +7 -1
- package/dist/modes/interactive/clipboard-input.d.ts.map +1 -1
- package/dist/modes/interactive/clipboard-input.js +44 -6
- package/dist/modes/interactive/clipboard-input.js.map +1 -1
- package/dist/modes/interactive/components/activity-lane.d.ts +55 -0
- package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -0
- package/dist/modes/interactive/components/activity-lane.js +304 -0
- package/dist/modes/interactive/components/activity-lane.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +19 -10
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/expandable-text.d.ts +12 -0
- package/dist/modes/interactive/components/expandable-text.d.ts.map +1 -0
- package/dist/modes/interactive/components/expandable-text.js +17 -0
- package/dist/modes/interactive/components/expandable-text.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +15 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +30 -21
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts +1 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +6 -1
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +23 -14
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +6 -6
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +19 -11
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +53 -20
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-group.js +3 -0
- package/dist/modes/interactive/components/tool-group.js.map +1 -1
- package/dist/modes/interactive/components/usage-action-selector.d.ts +16 -0
- package/dist/modes/interactive/components/usage-action-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/usage-action-selector.js +46 -0
- package/dist/modes/interactive/components/usage-action-selector.js.map +1 -0
- package/dist/modes/interactive/config-backup.d.ts.map +1 -1
- package/dist/modes/interactive/config-backup.js +5 -4
- package/dist/modes/interactive/config-backup.js.map +1 -1
- package/dist/modes/interactive/extension-ui-host.d.ts +14 -0
- package/dist/modes/interactive/extension-ui-host.d.ts.map +1 -1
- package/dist/modes/interactive/extension-ui-host.js +77 -15
- package/dist/modes/interactive/extension-ui-host.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts +15 -0
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js +27 -19
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/history-reload-math.d.ts +6 -2
- package/dist/modes/interactive/history-reload-math.d.ts.map +1 -1
- package/dist/modes/interactive/history-reload-math.js +10 -5
- package/dist/modes/interactive/history-reload-math.js.map +1 -1
- package/dist/modes/interactive/interactive-event-controller.d.ts +74 -0
- package/dist/modes/interactive/interactive-event-controller.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-event-controller.js +328 -0
- package/dist/modes/interactive/interactive-event-controller.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +22 -24
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +245 -595
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/key-handlers.d.ts.map +1 -1
- package/dist/modes/interactive/key-handlers.js +1 -1
- package/dist/modes/interactive/key-handlers.js.map +1 -1
- package/dist/modes/interactive/loaded-resources-view.d.ts +20 -0
- package/dist/modes/interactive/loaded-resources-view.d.ts.map +1 -0
- package/dist/modes/interactive/loaded-resources-view.js +147 -0
- package/dist/modes/interactive/loaded-resources-view.js.map +1 -0
- package/dist/modes/interactive/profile-menu-controller.d.ts.map +1 -1
- package/dist/modes/interactive/profile-menu-controller.js +7 -7
- package/dist/modes/interactive/profile-menu-controller.js.map +1 -1
- package/dist/modes/interactive/report-commands.d.ts.map +1 -1
- package/dist/modes/interactive/report-commands.js +21 -0
- package/dist/modes/interactive/report-commands.js.map +1 -1
- package/dist/modes/interactive/resource-display.d.ts.map +1 -1
- package/dist/modes/interactive/resource-display.js +8 -2
- package/dist/modes/interactive/resource-display.js.map +1 -1
- package/dist/modes/interactive/resource-shell-commands.d.ts +1 -5
- package/dist/modes/interactive/resource-shell-commands.d.ts.map +1 -1
- package/dist/modes/interactive/resource-shell-commands.js +0 -5
- package/dist/modes/interactive/resource-shell-commands.js.map +1 -1
- package/dist/modes/interactive/session-flow-commands.d.ts +27 -8
- package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
- package/dist/modes/interactive/session-flow-commands.js +150 -64
- package/dist/modes/interactive/session-flow-commands.js.map +1 -1
- package/dist/modes/interactive/session-io-commands.d.ts.map +1 -1
- package/dist/modes/interactive/session-io-commands.js +16 -6
- package/dist/modes/interactive/session-io-commands.js.map +1 -1
- package/dist/modes/interactive/session-replacement-errors.d.ts +7 -0
- package/dist/modes/interactive/session-replacement-errors.d.ts.map +1 -0
- package/dist/modes/interactive/session-replacement-errors.js +15 -0
- package/dist/modes/interactive/session-replacement-errors.js.map +1 -0
- package/dist/modes/interactive/startup-checks.d.ts.map +1 -1
- package/dist/modes/interactive/startup-checks.js +1 -1
- package/dist/modes/interactive/startup-checks.js.map +1 -1
- package/dist/modes/interactive/usage-commands.d.ts +34 -0
- package/dist/modes/interactive/usage-commands.d.ts.map +1 -0
- package/dist/modes/interactive/usage-commands.js +225 -0
- package/dist/modes/interactive/usage-commands.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +82 -23
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +15 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js +138 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +2 -13
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts +1 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts +1 -0
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +52 -1
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/platform.d.ts +3 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +8 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +5 -3
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +3 -1
- package/dist/utils/version-check.js.map +1 -1
- package/dist/utils/work-directory.d.ts +11 -0
- package/dist/utils/work-directory.d.ts.map +1 -1
- package/dist/utils/work-directory.js +30 -9
- package/dist/utils/work-directory.js.map +1 -1
- package/docs/UI_POLISH_ORCHESTRATION.md +38 -0
- package/docs/UI_QUALITY_ORCHESTRATION.md +28 -0
- package/docs/docs.json +4 -0
- package/docs/extensions.md +62 -2
- package/docs/harness-architecture.md +156 -0
- package/docs/keybindings.md +11 -1
- package/docs/process-matrix.md +59 -26
- package/docs/providers.md +9 -1
- package/docs/rpc.md +45 -2
- package/docs/sessions.md +15 -0
- package/docs/settings.md +125 -11
- package/docs/task-steps.md +8 -0
- package/docs/telemetry.md +19 -0
- package/docs/tmux-agent-manager.md +10 -3
- package/docs/ui-reference/README.md +9 -0
- package/docs/ui-reference/orchestration-after.txt +14 -0
- package/docs/ui-reference/orchestration-before.txt +13 -0
- package/docs/ui-reference/orchestration-reference.txt +16 -0
- package/docs/usage.md +22 -2
- package/docs/work-directory.md +19 -8
- 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/question.ts +34 -245
- package/examples/extensions/questionnaire.ts +41 -407
- 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 +13 -13
- package/package.json +4 -4
- package/dist/core/delegation/session-worker-result.d.ts +0 -46
- package/dist/core/delegation/session-worker-result.d.ts.map +0 -1
- package/dist/core/delegation/session-worker-result.js +0 -113
- package/dist/core/delegation/session-worker-result.js.map +0 -1
- package/dist/core/delegation/worker-result.d.ts.map +0 -1
- package/dist/core/delegation/worker-result.js.map +0 -1
- package/dist/core/telemetry.d.ts.map +0 -1
- package/dist/core/telemetry.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-goal-state.js","sourceRoot":"","sources":["../../../src/core/goals/session-goal-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAkB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAExF,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC;AAOnD,MAAM,UAAU,uBAAuB,CACtC,cAAyD,EACzD,KAAgB,EACP;IACT,MAAM,OAAO,GAA6B;QACzC,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,wBAAwB,CAAC,KAAK,CAAC;KACtC,CAAC;IACF,OAAO,cAAc,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;AAAA,CACzE;AAED,SAAS,aAAa,CAAC,KAAc,EAAoC;IACxE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAAA,CAC5D;AAED;sFACsF;AACtF,MAAM,UAAU,8BAA8B,CAAC,IAAa,EAAyB;IACpF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,IAAI,WAAW,CAAC,KAAK,CAAC;QAAE,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC/D,OAAO,SAAS,CAAC;AAAA,CACjB;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACzC,cAAoE,EAC5C;IACxB,IAAI,MAA0B,CAAC;IAC/B,SAAS,CAAC;QACT,MAAM,KAAK,GAAG,cAAc,CAAC,4BAA4B,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;QAC1F,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,MAAM,OAAO,GAAG,8BAA8B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC;QAC1C,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QAC9C,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC;IACzB,CAAC;AAAA,CACD","sourcesContent":["import type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport { cloneGoalStateForStorage, type GoalState, isGoalState } from \"./goal-state.ts\";\n\nexport const GOAL_STATE_CUSTOM_TYPE = \"goal_state\";\n\nexport interface GoalStateSnapshotPayload {\n\tversion: 1;\n\tstate: GoalState;\n}\n\nexport function appendGoalStateSnapshot(\n\tsessionManager: Pick<SessionManager, \"appendCustomEntry\">,\n\tstate: GoalState,\n): string {\n\tconst payload: GoalStateSnapshotPayload = {\n\t\tversion: 1,\n\t\tstate: cloneGoalStateForStorage(state),\n\t};\n\treturn sessionManager.appendCustomEntry(GOAL_STATE_CUSTOM_TYPE, payload);\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst prototype = Object.getPrototypeOf(value);\n\treturn prototype === Object.prototype || prototype === null;\n}\n\n/** Pure payload decode: validates + clones a goal-state snapshot payload. No SessionManager access,\n * so unit tests can exercise decoding directly against a constructed `data` value. */\nexport function decodeGoalStateSnapshotPayload(data: unknown): GoalState | undefined {\n\tif (!isPlainRecord(data)) return undefined;\n\tif (data.version !== 1) return undefined;\n\tif (!(\"state\" in data)) return undefined;\n\tconst state = data.state;\n\tif (isGoalState(state)) return cloneGoalStateForStorage(state);\n\treturn undefined;\n}\n\n/**\n * Most recent VALID goal-state snapshot on the active branch. Walks leaf→root ancestry via\n * `getLatestCustomEntryOnBranch`, skipping entries whose payload fails to decode and resuming\n * the search from that entry's parent, so an older valid snapshot still wins over a newer\n * malformed one (matches the pre-branch-scoping flat-list resolution semantics).\n */\nexport function getLatestGoalStateSnapshot(\n\tsessionManager: Pick<SessionManager, \"getLatestCustomEntryOnBranch\">,\n): GoalState | undefined {\n\tlet fromId: string | undefined;\n\tfor (;;) {\n\t\tconst entry = sessionManager.getLatestCustomEntryOnBranch(GOAL_STATE_CUSTOM_TYPE, fromId);\n\t\tif (!entry) return undefined;\n\t\tconst decoded = decodeGoalStateSnapshotPayload(entry.data);\n\t\tif (decoded !== undefined) return decoded;\n\t\tif (entry.parentId === null) return undefined;\n\t\tfromId = entry.parentId;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-goal-state.js","sourceRoot":"","sources":["../../../src/core/goals/session-goal-state.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport {\n\tappendSessionSnapshot,\n\tdecodeSessionSnapshotPayload,\n\ttype SessionSnapshotCodec,\n\ttype SessionSnapshotPayload,\n} from \"../session-snapshot.ts\";\nimport { isPlainRecord } from \"../util/value-guards.ts\";\nimport {\n\tapplyGoalEvent,\n\tcloneGoalEventForStorage,\n\tcloneGoalStateForStorage,\n\ttype GoalEvent,\n\ttype GoalState,\n\tisGoalEvent,\n\tisGoalState,\n\tMAX_GOAL_EVENT_HISTORY,\n} from \"./goal-state.ts\";\n\nexport const GOAL_STATE_CUSTOM_TYPE = \"goal_state\";\n\nexport type GoalStateSnapshotPayload = SessionSnapshotPayload<\"state\", GoalState>;\n\nconst GOAL_STATE_SNAPSHOT_CODEC: SessionSnapshotCodec<GoalState, \"state\"> = {\n\tcustomType: GOAL_STATE_CUSTOM_TYPE,\n\tvalueKey: \"state\",\n\tisValue: isGoalState,\n\tclone: cloneGoalStateForStorage,\n};\n\ninterface GoalEventBatchPayload {\n\tversion: 2;\n\tkind: \"events\";\n\tgoalId: string;\n\tbaseRevision: number;\n\tevents: readonly GoalEvent[];\n}\n\ninterface GoalCheckpointPayload {\n\tversion: 2;\n\tkind: \"checkpoint\";\n\tstate: GoalState;\n}\n\ninterface GoalClearedPayload {\n\tversion: 2;\n\tkind: \"cleared\";\n\tgoalId: string;\n\tbaseRevision: number;\n\tclearedAt: string;\n}\n\ntype GoalJournalPayload = GoalEventBatchPayload | GoalCheckpointPayload | GoalClearedPayload;\n\nfunction isNonNegativeInteger(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction decodeGoalJournalPayload(data: unknown): GoalJournalPayload | undefined {\n\tif (!isPlainRecord(data) || data.version !== 2 || typeof data.kind !== \"string\") return undefined;\n\tif (data.kind === \"checkpoint\") {\n\t\tif (!isGoalState(data.state)) return undefined;\n\t\treturn { version: 2, kind: \"checkpoint\", state: cloneGoalStateForStorage(data.state) };\n\t}\n\tif (data.kind === \"cleared\") {\n\t\tif (\n\t\t\ttypeof data.goalId !== \"string\" ||\n\t\t\t!isNonNegativeInteger(data.baseRevision) ||\n\t\t\ttypeof data.clearedAt !== \"string\"\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn {\n\t\t\tversion: 2,\n\t\t\tkind: \"cleared\",\n\t\t\tgoalId: data.goalId,\n\t\t\tbaseRevision: data.baseRevision,\n\t\t\tclearedAt: data.clearedAt,\n\t\t};\n\t}\n\tif (data.kind !== \"events\") return undefined;\n\tif (\n\t\ttypeof data.goalId !== \"string\" ||\n\t\t!isNonNegativeInteger(data.baseRevision) ||\n\t\t!Array.isArray(data.events) ||\n\t\tdata.events.length === 0 ||\n\t\tdata.events.length > MAX_GOAL_EVENT_HISTORY ||\n\t\t!data.events.every(isGoalEvent)\n\t) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tversion: 2,\n\t\tkind: \"events\",\n\t\tgoalId: data.goalId,\n\t\tbaseRevision: data.baseRevision,\n\t\tevents: data.events.map(cloneGoalEventForStorage),\n\t};\n}\n\n/**\n * Persist one state transition. Canonical reducer transitions are journaled as a bounded event\n * batch; starts, replacements, and non-canonical imports use one checkpoint. This removes the old\n * recursive full-state-on-every-mutation growth while keeping compound owner transitions atomic.\n */\nexport function appendGoalStateSnapshot(\n\tsessionManager: Pick<SessionManager, \"appendCustomEntry\">,\n\tstate: GoalState,\n\tprevious?: GoalState,\n): string {\n\tconst revision = state.revision ?? 0;\n\tconst previousRevision = previous?.revision ?? 0;\n\tconst eventCount = previous && previous.goalId === state.goalId ? revision - previousRevision : 0;\n\tif (previous && eventCount > 0 && eventCount <= state.events.length && eventCount <= MAX_GOAL_EVENT_HISTORY) {\n\t\tconst payload: GoalEventBatchPayload = {\n\t\t\tversion: 2,\n\t\t\tkind: \"events\",\n\t\t\tgoalId: state.goalId,\n\t\t\tbaseRevision: previousRevision,\n\t\t\tevents: state.events.slice(-eventCount).map(cloneGoalEventForStorage),\n\t\t};\n\t\treturn sessionManager.appendCustomEntry(GOAL_STATE_CUSTOM_TYPE, payload);\n\t}\n\n\tconst payload: GoalCheckpointPayload = {\n\t\tversion: 2,\n\t\tkind: \"checkpoint\",\n\t\tstate: cloneGoalStateForStorage(state),\n\t};\n\treturn sessionManager.appendCustomEntry(GOAL_STATE_CUSTOM_TYPE, payload);\n}\n\nexport function appendGoalClearedSnapshot(\n\tsessionManager: Pick<SessionManager, \"appendCustomEntry\">,\n\tstate: GoalState,\n\tclearedAt: string,\n): string {\n\tconst payload: GoalClearedPayload = {\n\t\tversion: 2,\n\t\tkind: \"cleared\",\n\t\tgoalId: state.goalId,\n\t\tbaseRevision: state.revision ?? 0,\n\t\tclearedAt,\n\t};\n\treturn sessionManager.appendCustomEntry(GOAL_STATE_CUSTOM_TYPE, payload);\n}\n\n/** Legacy payload decode retained for imports and focused codec tests. */\nexport function decodeGoalStateSnapshotPayload(data: unknown): GoalState | undefined {\n\treturn decodeSessionSnapshotPayload(data, GOAL_STATE_SNAPSHOT_CODEC);\n}\n\ninterface GoalStateSource {\n\tgetLatestCustomEntryOnBranch: SessionManager[\"getLatestCustomEntryOnBranch\"];\n}\n\ninterface GoalStateCacheEntry {\n\tlatestEntryId: string | null;\n\tstate: GoalState | undefined;\n}\n\nconst goalStateCache = new WeakMap<GoalStateSource, GoalStateCacheEntry>();\n\nfunction cacheGoalState(\n\tsessionManager: GoalStateSource,\n\tlatestEntryId: string | null,\n\tstate: GoalState | undefined,\n): GoalState | undefined {\n\tconst stored = state ? cloneGoalStateForStorage(state) : undefined;\n\tgoalStateCache.set(sessionManager, { latestEntryId, state: stored });\n\treturn stored ? cloneGoalStateForStorage(stored) : undefined;\n}\n\n/**\n * Reconstruct the latest goal from one checkpoint plus linear event batches. Any malformed newest\n * goal journal fails closed instead of skipping backward to an older active state and resurrecting\n * work after corruption.\n */\nexport function getLatestGoalStateSnapshot(sessionManager: GoalStateSource): GoalState | undefined {\n\tconst latestEntry = sessionManager.getLatestCustomEntryOnBranch(GOAL_STATE_CUSTOM_TYPE);\n\tconst latestEntryId = latestEntry?.id ?? null;\n\tconst cached = goalStateCache.get(sessionManager);\n\tif (cached?.latestEntryId === latestEntryId) {\n\t\treturn cached.state ? cloneGoalStateForStorage(cached.state) : undefined;\n\t}\n\tif (!latestEntry) return cacheGoalState(sessionManager, latestEntryId, undefined);\n\n\tconst batches: GoalEventBatchPayload[] = [];\n\tlet entry = latestEntry;\n\tfor (;;) {\n\t\tconst legacy = decodeGoalStateSnapshotPayload(entry.data);\n\t\tconst journal = legacy ? undefined : decodeGoalJournalPayload(entry.data);\n\t\tif (!legacy && !journal) return cacheGoalState(sessionManager, latestEntryId, undefined);\n\t\tif (journal?.kind === \"cleared\") return cacheGoalState(sessionManager, latestEntryId, undefined);\n\n\t\tconst checkpoint = legacy ?? (journal?.kind === \"checkpoint\" ? journal.state : undefined);\n\t\tif (checkpoint) {\n\t\t\tlet state = checkpoint;\n\t\t\tfor (const batch of batches.reverse()) {\n\t\t\t\tif (batch.goalId !== state.goalId || batch.baseRevision !== (state.revision ?? 0)) {\n\t\t\t\t\treturn cacheGoalState(sessionManager, latestEntryId, undefined);\n\t\t\t\t}\n\t\t\t\tfor (const event of batch.events) state = applyGoalEvent(state, event);\n\t\t\t}\n\t\t\treturn cacheGoalState(sessionManager, latestEntryId, state);\n\t\t}\n\n\t\tif (journal?.kind !== \"events\") return cacheGoalState(sessionManager, latestEntryId, undefined);\n\t\tbatches.push(journal);\n\t\tif (entry.parentId === null) return cacheGoalState(sessionManager, latestEntryId, undefined);\n\t\tconst previousEntry = sessionManager.getLatestCustomEntryOnBranch(GOAL_STATE_CUSTOM_TYPE, entry.parentId);\n\t\tif (!previousEntry) return cacheGoalState(sessionManager, latestEntryId, undefined);\n\t\tentry = previousEntry;\n\t}\n}\n\n/** Explicit legacy writer for migration tests only. */\nexport function appendLegacyGoalStateSnapshot(\n\tsessionManager: Pick<SessionManager, \"appendCustomEntry\">,\n\tstate: GoalState,\n): string {\n\treturn appendSessionSnapshot(sessionManager, GOAL_STATE_SNAPSHOT_CODEC, state);\n}\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { AgentMessage } from "@caupulican/pi-agent-core";
|
|
2
|
+
import type { SessionManager } from "@caupulican/pi-agent-core/node";
|
|
3
|
+
import type { Api, Model } from "@caupulican/pi-ai";
|
|
4
|
+
import type { ArtifactStore } from "./context/context-artifacts.ts";
|
|
5
|
+
import type { ExtensionContext, ExtensionUIContext } from "./extensions/index.ts";
|
|
6
|
+
import type { SessionImageStore } from "./session-image-store.ts";
|
|
7
|
+
export interface WorkerHumanInputRequest {
|
|
8
|
+
workerRequestId: string;
|
|
9
|
+
message: string;
|
|
10
|
+
blockers: readonly string[];
|
|
11
|
+
}
|
|
12
|
+
interface HumanInputControllerDeps {
|
|
13
|
+
getSessionManager(): SessionManager;
|
|
14
|
+
getUIContext(): ExtensionUIContext | undefined;
|
|
15
|
+
getExtensionMode(): ExtensionContext["mode"];
|
|
16
|
+
waitForIdle(): Promise<void>;
|
|
17
|
+
isDisposed(): boolean;
|
|
18
|
+
isStreaming(): boolean;
|
|
19
|
+
getModel(): Model<Api> | undefined;
|
|
20
|
+
getArtifactStore(): ArtifactStore;
|
|
21
|
+
getImageStore(): SessionImageStore | undefined;
|
|
22
|
+
runAgentPrompt(messages: AgentMessage | AgentMessage[]): Promise<void>;
|
|
23
|
+
sendCustomMessage(message: {
|
|
24
|
+
customType: string;
|
|
25
|
+
content: string;
|
|
26
|
+
display: boolean;
|
|
27
|
+
details?: unknown;
|
|
28
|
+
}, options: {
|
|
29
|
+
triggerTurn: boolean;
|
|
30
|
+
deliverAs: "followUp";
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
emitWarning(message: string): void;
|
|
33
|
+
}
|
|
34
|
+
/** Owns durable question replay and serialized worker-to-owner question delivery. */
|
|
35
|
+
export declare class HumanInputController {
|
|
36
|
+
private readonly deps;
|
|
37
|
+
private tail;
|
|
38
|
+
private readonly activeRequestIds;
|
|
39
|
+
constructor(deps: HumanInputControllerDeps);
|
|
40
|
+
queueWorkerInput(request: WorkerHumanInputRequest): void;
|
|
41
|
+
schedulePendingWorkerInputs(): void;
|
|
42
|
+
resumePending(): Promise<boolean>;
|
|
43
|
+
private scheduleWorkerInput;
|
|
44
|
+
private resolveWorkerInput;
|
|
45
|
+
}
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=human-input-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human-input-controller.d.ts","sourceRoot":"","sources":["../../src/core/human-input-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,GAAG,EAAgB,KAAK,EAAqB,MAAM,mBAAmB,CAAC;AACrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAalF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,WAAW,uBAAuB;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B;AAED,UAAU,wBAAwB;IACjC,iBAAiB,IAAI,cAAc,CAAC;IACpC,YAAY,IAAI,kBAAkB,GAAG,SAAS,CAAC;IAC/C,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC7C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,UAAU,IAAI,OAAO,CAAC;IACtB,WAAW,IAAI,OAAO,CAAC;IACvB,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACnC,gBAAgB,IAAI,aAAa,CAAC;IAClC,aAAa,IAAI,iBAAiB,GAAG,SAAS,CAAC;IAC/C,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,iBAAiB,CAChB,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,EACrF,OAAO,EAAE;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,UAAU,CAAA;KAAE,GACtD,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,qFAAqF;AACrF,qBAAa,oBAAoB;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2B;IAChD,OAAO,CAAC,IAAI,CAAoC;IAChD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IAEtD,YAAY,IAAI,EAAE,wBAAwB,EAEzC;IAED,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAkCvD;IAED,2BAA2B,IAAI,IAAI,CAIlC;IAEK,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CA8EtC;IAED,OAAO,CAAC,mBAAmB;YAoBb,kBAAkB;CAmChC","sourcesContent":["import type { AgentMessage } from \"@caupulican/pi-agent-core\";\nimport type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { Api, ImageContent, Model, ToolResultMessage } from \"@caupulican/pi-ai\";\nimport type { ArtifactStore } from \"./context/context-artifacts.ts\";\nimport type { ExtensionContext, ExtensionUIContext } from \"./extensions/index.ts\";\nimport {\n\tbeginHumanInputRequest,\n\tcreateHumanInputRequest,\n\tformatHumanInputAnswerText,\n\tgetLatestHumanInputSnapshots,\n\tgetResumableHumanInputSnapshot,\n\tgetWorkerHumanInputsRequiringDelivery,\n\tHUMAN_INPUT_WORKER_RESPONSE_CUSTOM_TYPE,\n\ttype HumanInputRequest,\n\ttype HumanInputSnapshot,\n\tresolveHumanInput,\n} from \"./human-input.ts\";\nimport type { SessionImageStore } from \"./session-image-store.ts\";\n\nexport interface WorkerHumanInputRequest {\n\tworkerRequestId: string;\n\tmessage: string;\n\tblockers: readonly string[];\n}\n\ninterface HumanInputControllerDeps {\n\tgetSessionManager(): SessionManager;\n\tgetUIContext(): ExtensionUIContext | undefined;\n\tgetExtensionMode(): ExtensionContext[\"mode\"];\n\twaitForIdle(): Promise<void>;\n\tisDisposed(): boolean;\n\tisStreaming(): boolean;\n\tgetModel(): Model<Api> | undefined;\n\tgetArtifactStore(): ArtifactStore;\n\tgetImageStore(): SessionImageStore | undefined;\n\trunAgentPrompt(messages: AgentMessage | AgentMessage[]): Promise<void>;\n\tsendCustomMessage(\n\t\tmessage: { customType: string; content: string; display: boolean; details?: unknown },\n\t\toptions: { triggerTurn: boolean; deliverAs: \"followUp\" },\n\t): Promise<void>;\n\temitWarning(message: string): void;\n}\n\n/** Owns durable question replay and serialized worker-to-owner question delivery. */\nexport class HumanInputController {\n\tprivate readonly deps: HumanInputControllerDeps;\n\tprivate tail: Promise<void> = Promise.resolve();\n\tprivate readonly activeRequestIds = new Set<string>();\n\n\tconstructor(deps: HumanInputControllerDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tqueueWorkerInput(request: WorkerHumanInputRequest): void {\n\t\tconst sessionManager = this.deps.getSessionManager();\n\t\tconst existing = getLatestHumanInputSnapshots(sessionManager).find(\n\t\t\t(snapshot) => snapshot.request.workerRequestId === request.workerRequestId,\n\t\t);\n\t\tif (existing) return;\n\t\tconst blockerText = request.blockers\n\t\t\t.slice(0, 4)\n\t\t\t.map((blocker) => blocker.slice(0, 500))\n\t\t\t.join(\"; \");\n\t\tconst question = createHumanInputRequest({\n\t\t\tsource: \"worker\",\n\t\t\tworkerRequestId: request.workerRequestId,\n\t\t\tquestions: [\n\t\t\t\t{\n\t\t\t\t\tid: \"worker_review\",\n\t\t\t\t\theader: \"Worker review\",\n\t\t\t\t\tquestion: `${request.message.slice(0, 1_500)}${blockerText ? ` Blockers: ${blockerText}` : \"\"}`,\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: \"Review now\",\n\t\t\t\t\t\t\tdescription: \"Have the parent inspect the worker claim and evidence before reconciling it.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: \"Keep blocked\",\n\t\t\t\t\t\t\tdescription: \"Leave the worker result blocked and continue without accepting its output.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t\tacceptsImages: false,\n\t\t});\n\t\tbeginHumanInputRequest(sessionManager, question);\n\t\tif (!this.deps.isStreaming()) this.scheduleWorkerInput(question);\n\t}\n\n\tschedulePendingWorkerInputs(): void {\n\t\tfor (const snapshot of getWorkerHumanInputsRequiringDelivery(this.deps.getSessionManager())) {\n\t\t\tthis.scheduleWorkerInput(snapshot);\n\t\t}\n\t}\n\n\tasync resumePending(): Promise<boolean> {\n\t\tif (this.deps.isDisposed() || this.deps.isStreaming()) return false;\n\t\tconst sessionManager = this.deps.getSessionManager();\n\t\tconst pending = getResumableHumanInputSnapshot(sessionManager);\n\t\tconst ui = this.deps.getUIContext();\n\t\tif (!ui) return false;\n\t\tlet resumed = false;\n\n\t\tif (pending?.request.toolCallId) {\n\t\t\tlet snapshot = pending;\n\t\t\tlet imageContents: readonly ImageContent[] = [];\n\t\t\tif (pending.status === \"pending\") {\n\t\t\t\tconst resolved = await resolveHumanInput({\n\t\t\t\t\tsessionManager,\n\t\t\t\t\trequest: {\n\t\t\t\t\t\t...pending.request,\n\t\t\t\t\t\tacceptsImages: this.deps.getModel()?.input.includes(\"image\") ?? false,\n\t\t\t\t\t},\n\t\t\t\t\tpresent: (request, options) => ui.askQuestions(request, options),\n\t\t\t\t\tartifactStore: this.deps.getArtifactStore(),\n\t\t\t\t\tgetImageStore: () => this.deps.getImageStore(),\n\t\t\t\t});\n\t\t\t\tsnapshot = resolved.snapshot;\n\t\t\t\timageContents = resolved.imageContents;\n\t\t\t} else if (pending.status === \"answered\") {\n\t\t\t\tconst imageStore = this.deps.getImageStore();\n\t\t\t\tif (imageStore) {\n\t\t\t\t\tconst referencedText = snapshot.answers\n\t\t\t\t\t\t.flatMap((answer) => [answer.custom ?? \"\", ...(answer.images?.map((image) => image.label) ?? [])])\n\t\t\t\t\t\t.join(\" \");\n\t\t\t\t\timageContents = imageStore.resolveReferences(referencedText);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst answerImageCount = snapshot.answers.reduce((total, answer) => total + (answer.images?.length ?? 0), 0);\n\t\t\tconst modelAcceptsImages = this.deps.getModel()?.input.includes(\"image\") ?? false;\n\t\t\tconst missingImageNotice =\n\t\t\t\tanswerImageCount > imageContents.length\n\t\t\t\t\t? `\\n\\n[${answerImageCount - imageContents.length} attached image(s) could not be restored from durable storage.]`\n\t\t\t\t\t: \"\";\n\t\t\tconst unsupportedImageNotice =\n\t\t\t\timageContents.length > 0 && !modelAcceptsImages\n\t\t\t\t\t? \"\\n\\n[Attached images were retained but not sent because the selected model does not accept image input.]\"\n\t\t\t\t\t: \"\";\n\t\t\tconst toolResult: ToolResultMessage = {\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: pending.request.toolCallId,\n\t\t\t\ttoolName: pending.request.toolName ?? \"ask_question\",\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: `${formatHumanInputAnswerText(snapshot)}${missingImageNotice}${unsupportedImageNotice}`,\n\t\t\t\t\t},\n\t\t\t\t\t...(modelAcceptsImages ? imageContents : []),\n\t\t\t\t],\n\t\t\t\tdetails: {\n\t\t\t\t\tquestions: snapshot.request.questions,\n\t\t\t\t\tanswers: snapshot.answers,\n\t\t\t\t\tcancelled: snapshot.status === \"cancelled\",\n\t\t\t\t\t...(snapshot.reason ? { reason: snapshot.reason } : {}),\n\t\t\t\t},\n\t\t\t\tisError: false,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tawait this.deps.runAgentPrompt(toolResult);\n\t\t\tresumed = true;\n\t\t}\n\n\t\tfor (const workerInput of getWorkerHumanInputsRequiringDelivery(sessionManager)) {\n\t\t\tif (this.activeRequestIds.has(workerInput.request.requestId)) continue;\n\t\t\tthis.activeRequestIds.add(workerInput.request.requestId);\n\t\t\ttry {\n\t\t\t\tresumed = (await this.resolveWorkerInput(workerInput)) || resumed;\n\t\t\t} finally {\n\t\t\t\tthis.activeRequestIds.delete(workerInput.request.requestId);\n\t\t\t}\n\t\t}\n\t\treturn resumed;\n\t}\n\n\tprivate scheduleWorkerInput(input: HumanInputRequest | HumanInputSnapshot): void {\n\t\tconst snapshot: HumanInputSnapshot =\n\t\t\t\"status\" in input ? input : { request: input, status: \"pending\", answers: [], updatedAt: input.createdAt };\n\t\tconst requestId = snapshot.request.requestId;\n\t\tif (this.activeRequestIds.has(requestId)) return;\n\t\tthis.activeRequestIds.add(requestId);\n\t\tthis.tail = this.tail\n\t\t\t.then(async () => {\n\t\t\t\tawait this.resolveWorkerInput(snapshot);\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tthis.deps.emitWarning(\n\t\t\t\t\t`Worker owner-input request failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis.activeRequestIds.delete(requestId);\n\t\t\t});\n\t}\n\n\tprivate async resolveWorkerInput(initial: HumanInputSnapshot): Promise<boolean> {\n\t\tconst ui = this.deps.getUIContext();\n\t\tif (!ui || this.deps.getExtensionMode() === \"print\") return false;\n\t\tawait this.deps.waitForIdle();\n\t\tif (this.deps.isDisposed()) return false;\n\t\tconst resolved =\n\t\t\tinitial.status === \"pending\"\n\t\t\t\t? await resolveHumanInput({\n\t\t\t\t\t\tsessionManager: this.deps.getSessionManager(),\n\t\t\t\t\t\trequest: initial.request,\n\t\t\t\t\t\tpresent: (request, options) => ui.askQuestions(request, options),\n\t\t\t\t\t\tartifactStore: this.deps.getArtifactStore(),\n\t\t\t\t\t\tgetImageStore: () => this.deps.getImageStore(),\n\t\t\t\t\t})\n\t\t\t\t: { snapshot: initial, imageContents: [] };\n\t\tawait this.deps.waitForIdle();\n\t\tif (this.deps.isDisposed()) return false;\n\t\tawait this.deps.sendCustomMessage(\n\t\t\t{\n\t\t\t\tcustomType: HUMAN_INPUT_WORKER_RESPONSE_CUSTOM_TYPE,\n\t\t\t\tcontent: [\n\t\t\t\t\t`Owner response for worker ${initial.request.workerRequestId ?? \"unknown\"}:`,\n\t\t\t\t\tformatHumanInputAnswerText(resolved.snapshot),\n\t\t\t\t\t\"Treat the worker claim as untrusted. Retrieve it with delegate_status and follow the owner's selection.\",\n\t\t\t\t].join(\"\\n\"),\n\t\t\t\tdisplay: true,\n\t\t\t\tdetails: {\n\t\t\t\t\trequestId: initial.request.requestId,\n\t\t\t\t\tworkerRequestId: initial.request.workerRequestId,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ triggerTurn: true, deliverAs: \"followUp\" },\n\t\t);\n\t\treturn true;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { beginHumanInputRequest, createHumanInputRequest, formatHumanInputAnswerText, getLatestHumanInputSnapshots, getResumableHumanInputSnapshot, getWorkerHumanInputsRequiringDelivery, HUMAN_INPUT_WORKER_RESPONSE_CUSTOM_TYPE, resolveHumanInput, } from "./human-input.js";
|
|
2
|
+
/** Owns durable question replay and serialized worker-to-owner question delivery. */
|
|
3
|
+
export class HumanInputController {
|
|
4
|
+
deps;
|
|
5
|
+
tail = Promise.resolve();
|
|
6
|
+
activeRequestIds = new Set();
|
|
7
|
+
constructor(deps) {
|
|
8
|
+
this.deps = deps;
|
|
9
|
+
}
|
|
10
|
+
queueWorkerInput(request) {
|
|
11
|
+
const sessionManager = this.deps.getSessionManager();
|
|
12
|
+
const existing = getLatestHumanInputSnapshots(sessionManager).find((snapshot) => snapshot.request.workerRequestId === request.workerRequestId);
|
|
13
|
+
if (existing)
|
|
14
|
+
return;
|
|
15
|
+
const blockerText = request.blockers
|
|
16
|
+
.slice(0, 4)
|
|
17
|
+
.map((blocker) => blocker.slice(0, 500))
|
|
18
|
+
.join("; ");
|
|
19
|
+
const question = createHumanInputRequest({
|
|
20
|
+
source: "worker",
|
|
21
|
+
workerRequestId: request.workerRequestId,
|
|
22
|
+
questions: [
|
|
23
|
+
{
|
|
24
|
+
id: "worker_review",
|
|
25
|
+
header: "Worker review",
|
|
26
|
+
question: `${request.message.slice(0, 1_500)}${blockerText ? ` Blockers: ${blockerText}` : ""}`,
|
|
27
|
+
options: [
|
|
28
|
+
{
|
|
29
|
+
label: "Review now",
|
|
30
|
+
description: "Have the parent inspect the worker claim and evidence before reconciling it.",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
label: "Keep blocked",
|
|
34
|
+
description: "Leave the worker result blocked and continue without accepting its output.",
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
acceptsImages: false,
|
|
40
|
+
});
|
|
41
|
+
beginHumanInputRequest(sessionManager, question);
|
|
42
|
+
if (!this.deps.isStreaming())
|
|
43
|
+
this.scheduleWorkerInput(question);
|
|
44
|
+
}
|
|
45
|
+
schedulePendingWorkerInputs() {
|
|
46
|
+
for (const snapshot of getWorkerHumanInputsRequiringDelivery(this.deps.getSessionManager())) {
|
|
47
|
+
this.scheduleWorkerInput(snapshot);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async resumePending() {
|
|
51
|
+
if (this.deps.isDisposed() || this.deps.isStreaming())
|
|
52
|
+
return false;
|
|
53
|
+
const sessionManager = this.deps.getSessionManager();
|
|
54
|
+
const pending = getResumableHumanInputSnapshot(sessionManager);
|
|
55
|
+
const ui = this.deps.getUIContext();
|
|
56
|
+
if (!ui)
|
|
57
|
+
return false;
|
|
58
|
+
let resumed = false;
|
|
59
|
+
if (pending?.request.toolCallId) {
|
|
60
|
+
let snapshot = pending;
|
|
61
|
+
let imageContents = [];
|
|
62
|
+
if (pending.status === "pending") {
|
|
63
|
+
const resolved = await resolveHumanInput({
|
|
64
|
+
sessionManager,
|
|
65
|
+
request: {
|
|
66
|
+
...pending.request,
|
|
67
|
+
acceptsImages: this.deps.getModel()?.input.includes("image") ?? false,
|
|
68
|
+
},
|
|
69
|
+
present: (request, options) => ui.askQuestions(request, options),
|
|
70
|
+
artifactStore: this.deps.getArtifactStore(),
|
|
71
|
+
getImageStore: () => this.deps.getImageStore(),
|
|
72
|
+
});
|
|
73
|
+
snapshot = resolved.snapshot;
|
|
74
|
+
imageContents = resolved.imageContents;
|
|
75
|
+
}
|
|
76
|
+
else if (pending.status === "answered") {
|
|
77
|
+
const imageStore = this.deps.getImageStore();
|
|
78
|
+
if (imageStore) {
|
|
79
|
+
const referencedText = snapshot.answers
|
|
80
|
+
.flatMap((answer) => [answer.custom ?? "", ...(answer.images?.map((image) => image.label) ?? [])])
|
|
81
|
+
.join(" ");
|
|
82
|
+
imageContents = imageStore.resolveReferences(referencedText);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const answerImageCount = snapshot.answers.reduce((total, answer) => total + (answer.images?.length ?? 0), 0);
|
|
86
|
+
const modelAcceptsImages = this.deps.getModel()?.input.includes("image") ?? false;
|
|
87
|
+
const missingImageNotice = answerImageCount > imageContents.length
|
|
88
|
+
? `\n\n[${answerImageCount - imageContents.length} attached image(s) could not be restored from durable storage.]`
|
|
89
|
+
: "";
|
|
90
|
+
const unsupportedImageNotice = imageContents.length > 0 && !modelAcceptsImages
|
|
91
|
+
? "\n\n[Attached images were retained but not sent because the selected model does not accept image input.]"
|
|
92
|
+
: "";
|
|
93
|
+
const toolResult = {
|
|
94
|
+
role: "toolResult",
|
|
95
|
+
toolCallId: pending.request.toolCallId,
|
|
96
|
+
toolName: pending.request.toolName ?? "ask_question",
|
|
97
|
+
content: [
|
|
98
|
+
{
|
|
99
|
+
type: "text",
|
|
100
|
+
text: `${formatHumanInputAnswerText(snapshot)}${missingImageNotice}${unsupportedImageNotice}`,
|
|
101
|
+
},
|
|
102
|
+
...(modelAcceptsImages ? imageContents : []),
|
|
103
|
+
],
|
|
104
|
+
details: {
|
|
105
|
+
questions: snapshot.request.questions,
|
|
106
|
+
answers: snapshot.answers,
|
|
107
|
+
cancelled: snapshot.status === "cancelled",
|
|
108
|
+
...(snapshot.reason ? { reason: snapshot.reason } : {}),
|
|
109
|
+
},
|
|
110
|
+
isError: false,
|
|
111
|
+
timestamp: Date.now(),
|
|
112
|
+
};
|
|
113
|
+
await this.deps.runAgentPrompt(toolResult);
|
|
114
|
+
resumed = true;
|
|
115
|
+
}
|
|
116
|
+
for (const workerInput of getWorkerHumanInputsRequiringDelivery(sessionManager)) {
|
|
117
|
+
if (this.activeRequestIds.has(workerInput.request.requestId))
|
|
118
|
+
continue;
|
|
119
|
+
this.activeRequestIds.add(workerInput.request.requestId);
|
|
120
|
+
try {
|
|
121
|
+
resumed = (await this.resolveWorkerInput(workerInput)) || resumed;
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
this.activeRequestIds.delete(workerInput.request.requestId);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return resumed;
|
|
128
|
+
}
|
|
129
|
+
scheduleWorkerInput(input) {
|
|
130
|
+
const snapshot = "status" in input ? input : { request: input, status: "pending", answers: [], updatedAt: input.createdAt };
|
|
131
|
+
const requestId = snapshot.request.requestId;
|
|
132
|
+
if (this.activeRequestIds.has(requestId))
|
|
133
|
+
return;
|
|
134
|
+
this.activeRequestIds.add(requestId);
|
|
135
|
+
this.tail = this.tail
|
|
136
|
+
.then(async () => {
|
|
137
|
+
await this.resolveWorkerInput(snapshot);
|
|
138
|
+
})
|
|
139
|
+
.catch((error) => {
|
|
140
|
+
this.deps.emitWarning(`Worker owner-input request failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
141
|
+
})
|
|
142
|
+
.finally(() => {
|
|
143
|
+
this.activeRequestIds.delete(requestId);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
async resolveWorkerInput(initial) {
|
|
147
|
+
const ui = this.deps.getUIContext();
|
|
148
|
+
if (!ui || this.deps.getExtensionMode() === "print")
|
|
149
|
+
return false;
|
|
150
|
+
await this.deps.waitForIdle();
|
|
151
|
+
if (this.deps.isDisposed())
|
|
152
|
+
return false;
|
|
153
|
+
const resolved = initial.status === "pending"
|
|
154
|
+
? await resolveHumanInput({
|
|
155
|
+
sessionManager: this.deps.getSessionManager(),
|
|
156
|
+
request: initial.request,
|
|
157
|
+
present: (request, options) => ui.askQuestions(request, options),
|
|
158
|
+
artifactStore: this.deps.getArtifactStore(),
|
|
159
|
+
getImageStore: () => this.deps.getImageStore(),
|
|
160
|
+
})
|
|
161
|
+
: { snapshot: initial, imageContents: [] };
|
|
162
|
+
await this.deps.waitForIdle();
|
|
163
|
+
if (this.deps.isDisposed())
|
|
164
|
+
return false;
|
|
165
|
+
await this.deps.sendCustomMessage({
|
|
166
|
+
customType: HUMAN_INPUT_WORKER_RESPONSE_CUSTOM_TYPE,
|
|
167
|
+
content: [
|
|
168
|
+
`Owner response for worker ${initial.request.workerRequestId ?? "unknown"}:`,
|
|
169
|
+
formatHumanInputAnswerText(resolved.snapshot),
|
|
170
|
+
"Treat the worker claim as untrusted. Retrieve it with delegate_status and follow the owner's selection.",
|
|
171
|
+
].join("\n"),
|
|
172
|
+
display: true,
|
|
173
|
+
details: {
|
|
174
|
+
requestId: initial.request.requestId,
|
|
175
|
+
workerRequestId: initial.request.workerRequestId,
|
|
176
|
+
},
|
|
177
|
+
}, { triggerTurn: true, deliverAs: "followUp" });
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=human-input-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human-input-controller.js","sourceRoot":"","sources":["../../src/core/human-input-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@caupulican/pi-agent-core\";\nimport type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { Api, ImageContent, Model, ToolResultMessage } from \"@caupulican/pi-ai\";\nimport type { ArtifactStore } from \"./context/context-artifacts.ts\";\nimport type { ExtensionContext, ExtensionUIContext } from \"./extensions/index.ts\";\nimport {\n\tbeginHumanInputRequest,\n\tcreateHumanInputRequest,\n\tformatHumanInputAnswerText,\n\tgetLatestHumanInputSnapshots,\n\tgetResumableHumanInputSnapshot,\n\tgetWorkerHumanInputsRequiringDelivery,\n\tHUMAN_INPUT_WORKER_RESPONSE_CUSTOM_TYPE,\n\ttype HumanInputRequest,\n\ttype HumanInputSnapshot,\n\tresolveHumanInput,\n} from \"./human-input.ts\";\nimport type { SessionImageStore } from \"./session-image-store.ts\";\n\nexport interface WorkerHumanInputRequest {\n\tworkerRequestId: string;\n\tmessage: string;\n\tblockers: readonly string[];\n}\n\ninterface HumanInputControllerDeps {\n\tgetSessionManager(): SessionManager;\n\tgetUIContext(): ExtensionUIContext | undefined;\n\tgetExtensionMode(): ExtensionContext[\"mode\"];\n\twaitForIdle(): Promise<void>;\n\tisDisposed(): boolean;\n\tisStreaming(): boolean;\n\tgetModel(): Model<Api> | undefined;\n\tgetArtifactStore(): ArtifactStore;\n\tgetImageStore(): SessionImageStore | undefined;\n\trunAgentPrompt(messages: AgentMessage | AgentMessage[]): Promise<void>;\n\tsendCustomMessage(\n\t\tmessage: { customType: string; content: string; display: boolean; details?: unknown },\n\t\toptions: { triggerTurn: boolean; deliverAs: \"followUp\" },\n\t): Promise<void>;\n\temitWarning(message: string): void;\n}\n\n/** Owns durable question replay and serialized worker-to-owner question delivery. */\nexport class HumanInputController {\n\tprivate readonly deps: HumanInputControllerDeps;\n\tprivate tail: Promise<void> = Promise.resolve();\n\tprivate readonly activeRequestIds = new Set<string>();\n\n\tconstructor(deps: HumanInputControllerDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tqueueWorkerInput(request: WorkerHumanInputRequest): void {\n\t\tconst sessionManager = this.deps.getSessionManager();\n\t\tconst existing = getLatestHumanInputSnapshots(sessionManager).find(\n\t\t\t(snapshot) => snapshot.request.workerRequestId === request.workerRequestId,\n\t\t);\n\t\tif (existing) return;\n\t\tconst blockerText = request.blockers\n\t\t\t.slice(0, 4)\n\t\t\t.map((blocker) => blocker.slice(0, 500))\n\t\t\t.join(\"; \");\n\t\tconst question = createHumanInputRequest({\n\t\t\tsource: \"worker\",\n\t\t\tworkerRequestId: request.workerRequestId,\n\t\t\tquestions: [\n\t\t\t\t{\n\t\t\t\t\tid: \"worker_review\",\n\t\t\t\t\theader: \"Worker review\",\n\t\t\t\t\tquestion: `${request.message.slice(0, 1_500)}${blockerText ? ` Blockers: ${blockerText}` : \"\"}`,\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: \"Review now\",\n\t\t\t\t\t\t\tdescription: \"Have the parent inspect the worker claim and evidence before reconciling it.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: \"Keep blocked\",\n\t\t\t\t\t\t\tdescription: \"Leave the worker result blocked and continue without accepting its output.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t\tacceptsImages: false,\n\t\t});\n\t\tbeginHumanInputRequest(sessionManager, question);\n\t\tif (!this.deps.isStreaming()) this.scheduleWorkerInput(question);\n\t}\n\n\tschedulePendingWorkerInputs(): void {\n\t\tfor (const snapshot of getWorkerHumanInputsRequiringDelivery(this.deps.getSessionManager())) {\n\t\t\tthis.scheduleWorkerInput(snapshot);\n\t\t}\n\t}\n\n\tasync resumePending(): Promise<boolean> {\n\t\tif (this.deps.isDisposed() || this.deps.isStreaming()) return false;\n\t\tconst sessionManager = this.deps.getSessionManager();\n\t\tconst pending = getResumableHumanInputSnapshot(sessionManager);\n\t\tconst ui = this.deps.getUIContext();\n\t\tif (!ui) return false;\n\t\tlet resumed = false;\n\n\t\tif (pending?.request.toolCallId) {\n\t\t\tlet snapshot = pending;\n\t\t\tlet imageContents: readonly ImageContent[] = [];\n\t\t\tif (pending.status === \"pending\") {\n\t\t\t\tconst resolved = await resolveHumanInput({\n\t\t\t\t\tsessionManager,\n\t\t\t\t\trequest: {\n\t\t\t\t\t\t...pending.request,\n\t\t\t\t\t\tacceptsImages: this.deps.getModel()?.input.includes(\"image\") ?? false,\n\t\t\t\t\t},\n\t\t\t\t\tpresent: (request, options) => ui.askQuestions(request, options),\n\t\t\t\t\tartifactStore: this.deps.getArtifactStore(),\n\t\t\t\t\tgetImageStore: () => this.deps.getImageStore(),\n\t\t\t\t});\n\t\t\t\tsnapshot = resolved.snapshot;\n\t\t\t\timageContents = resolved.imageContents;\n\t\t\t} else if (pending.status === \"answered\") {\n\t\t\t\tconst imageStore = this.deps.getImageStore();\n\t\t\t\tif (imageStore) {\n\t\t\t\t\tconst referencedText = snapshot.answers\n\t\t\t\t\t\t.flatMap((answer) => [answer.custom ?? \"\", ...(answer.images?.map((image) => image.label) ?? [])])\n\t\t\t\t\t\t.join(\" \");\n\t\t\t\t\timageContents = imageStore.resolveReferences(referencedText);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst answerImageCount = snapshot.answers.reduce((total, answer) => total + (answer.images?.length ?? 0), 0);\n\t\t\tconst modelAcceptsImages = this.deps.getModel()?.input.includes(\"image\") ?? false;\n\t\t\tconst missingImageNotice =\n\t\t\t\tanswerImageCount > imageContents.length\n\t\t\t\t\t? `\\n\\n[${answerImageCount - imageContents.length} attached image(s) could not be restored from durable storage.]`\n\t\t\t\t\t: \"\";\n\t\t\tconst unsupportedImageNotice =\n\t\t\t\timageContents.length > 0 && !modelAcceptsImages\n\t\t\t\t\t? \"\\n\\n[Attached images were retained but not sent because the selected model does not accept image input.]\"\n\t\t\t\t\t: \"\";\n\t\t\tconst toolResult: ToolResultMessage = {\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: pending.request.toolCallId,\n\t\t\t\ttoolName: pending.request.toolName ?? \"ask_question\",\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: `${formatHumanInputAnswerText(snapshot)}${missingImageNotice}${unsupportedImageNotice}`,\n\t\t\t\t\t},\n\t\t\t\t\t...(modelAcceptsImages ? imageContents : []),\n\t\t\t\t],\n\t\t\t\tdetails: {\n\t\t\t\t\tquestions: snapshot.request.questions,\n\t\t\t\t\tanswers: snapshot.answers,\n\t\t\t\t\tcancelled: snapshot.status === \"cancelled\",\n\t\t\t\t\t...(snapshot.reason ? { reason: snapshot.reason } : {}),\n\t\t\t\t},\n\t\t\t\tisError: false,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tawait this.deps.runAgentPrompt(toolResult);\n\t\t\tresumed = true;\n\t\t}\n\n\t\tfor (const workerInput of getWorkerHumanInputsRequiringDelivery(sessionManager)) {\n\t\t\tif (this.activeRequestIds.has(workerInput.request.requestId)) continue;\n\t\t\tthis.activeRequestIds.add(workerInput.request.requestId);\n\t\t\ttry {\n\t\t\t\tresumed = (await this.resolveWorkerInput(workerInput)) || resumed;\n\t\t\t} finally {\n\t\t\t\tthis.activeRequestIds.delete(workerInput.request.requestId);\n\t\t\t}\n\t\t}\n\t\treturn resumed;\n\t}\n\n\tprivate scheduleWorkerInput(input: HumanInputRequest | HumanInputSnapshot): void {\n\t\tconst snapshot: HumanInputSnapshot =\n\t\t\t\"status\" in input ? input : { request: input, status: \"pending\", answers: [], updatedAt: input.createdAt };\n\t\tconst requestId = snapshot.request.requestId;\n\t\tif (this.activeRequestIds.has(requestId)) return;\n\t\tthis.activeRequestIds.add(requestId);\n\t\tthis.tail = this.tail\n\t\t\t.then(async () => {\n\t\t\t\tawait this.resolveWorkerInput(snapshot);\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tthis.deps.emitWarning(\n\t\t\t\t\t`Worker owner-input request failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis.activeRequestIds.delete(requestId);\n\t\t\t});\n\t}\n\n\tprivate async resolveWorkerInput(initial: HumanInputSnapshot): Promise<boolean> {\n\t\tconst ui = this.deps.getUIContext();\n\t\tif (!ui || this.deps.getExtensionMode() === \"print\") return false;\n\t\tawait this.deps.waitForIdle();\n\t\tif (this.deps.isDisposed()) return false;\n\t\tconst resolved =\n\t\t\tinitial.status === \"pending\"\n\t\t\t\t? await resolveHumanInput({\n\t\t\t\t\t\tsessionManager: this.deps.getSessionManager(),\n\t\t\t\t\t\trequest: initial.request,\n\t\t\t\t\t\tpresent: (request, options) => ui.askQuestions(request, options),\n\t\t\t\t\t\tartifactStore: this.deps.getArtifactStore(),\n\t\t\t\t\t\tgetImageStore: () => this.deps.getImageStore(),\n\t\t\t\t\t})\n\t\t\t\t: { snapshot: initial, imageContents: [] };\n\t\tawait this.deps.waitForIdle();\n\t\tif (this.deps.isDisposed()) return false;\n\t\tawait this.deps.sendCustomMessage(\n\t\t\t{\n\t\t\t\tcustomType: HUMAN_INPUT_WORKER_RESPONSE_CUSTOM_TYPE,\n\t\t\t\tcontent: [\n\t\t\t\t\t`Owner response for worker ${initial.request.workerRequestId ?? \"unknown\"}:`,\n\t\t\t\t\tformatHumanInputAnswerText(resolved.snapshot),\n\t\t\t\t\t\"Treat the worker claim as untrusted. Retrieve it with delegate_status and follow the owner's selection.\",\n\t\t\t\t].join(\"\\n\"),\n\t\t\t\tdisplay: true,\n\t\t\t\tdetails: {\n\t\t\t\t\trequestId: initial.request.requestId,\n\t\t\t\t\tworkerRequestId: initial.request.workerRequestId,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ triggerTurn: true, deliverAs: \"followUp\" },\n\t\t);\n\t\treturn true;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { SessionEntry, SessionManager } from "@caupulican/pi-agent-core/node";
|
|
2
|
+
import type { ImageContent } from "@caupulican/pi-ai";
|
|
3
|
+
import type { ArtifactStore } from "./context/context-artifacts.ts";
|
|
4
|
+
import type { ContextArtifactRef } from "./context/context-item.ts";
|
|
5
|
+
import type { SessionImageStore } from "./session-image-store.ts";
|
|
6
|
+
import { type SessionBranchEntrySource } from "./session-snapshot.ts";
|
|
7
|
+
export declare const HUMAN_INPUT_CUSTOM_TYPE = "human_input_request";
|
|
8
|
+
export declare const HUMAN_INPUT_WORKER_RESPONSE_CUSTOM_TYPE = "worker-owner-response";
|
|
9
|
+
export declare const HUMAN_INPUT_INLINE_BYTES: number;
|
|
10
|
+
export interface HumanInputOption {
|
|
11
|
+
label: string;
|
|
12
|
+
description: string;
|
|
13
|
+
}
|
|
14
|
+
export interface HumanInputQuestion {
|
|
15
|
+
id: string;
|
|
16
|
+
header: string;
|
|
17
|
+
question: string;
|
|
18
|
+
options: readonly HumanInputOption[];
|
|
19
|
+
multiSelect?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface HumanInputAnswerImage {
|
|
22
|
+
label: string;
|
|
23
|
+
mimeType: string;
|
|
24
|
+
}
|
|
25
|
+
export interface HumanInputAnswer {
|
|
26
|
+
id: string;
|
|
27
|
+
header: string;
|
|
28
|
+
question: string;
|
|
29
|
+
selected: readonly string[];
|
|
30
|
+
/** Inline answer, or a bounded preview when customArtifact is present. */
|
|
31
|
+
custom?: string;
|
|
32
|
+
/** Exact full answer retained out of prompt context when it exceeds the inline bound. */
|
|
33
|
+
customArtifact?: ContextArtifactRef;
|
|
34
|
+
images?: readonly HumanInputAnswerImage[];
|
|
35
|
+
skipped: boolean;
|
|
36
|
+
}
|
|
37
|
+
export type HumanInputStopReason = "user_cancelled" | "ui_unavailable" | "interrupted" | "invalid_questions";
|
|
38
|
+
export interface HumanInputPresentationRequest {
|
|
39
|
+
requestId: string;
|
|
40
|
+
questions: readonly HumanInputQuestion[];
|
|
41
|
+
acceptsImages: boolean;
|
|
42
|
+
}
|
|
43
|
+
export interface HumanInputPresentationResult {
|
|
44
|
+
answers: readonly HumanInputAnswer[];
|
|
45
|
+
cancelled: boolean;
|
|
46
|
+
reason?: HumanInputStopReason;
|
|
47
|
+
imageContents: readonly ImageContent[];
|
|
48
|
+
}
|
|
49
|
+
export type HumanInputSource = "tool" | "worker";
|
|
50
|
+
export interface HumanInputRequest {
|
|
51
|
+
requestId: string;
|
|
52
|
+
source: HumanInputSource;
|
|
53
|
+
toolCallId?: string;
|
|
54
|
+
toolName?: string;
|
|
55
|
+
workerRequestId?: string;
|
|
56
|
+
questions: readonly HumanInputQuestion[];
|
|
57
|
+
acceptsImages: boolean;
|
|
58
|
+
createdAt: string;
|
|
59
|
+
}
|
|
60
|
+
export type HumanInputStatus = "pending" | "answered" | "cancelled";
|
|
61
|
+
export interface HumanInputSnapshot {
|
|
62
|
+
request: HumanInputRequest;
|
|
63
|
+
status: HumanInputStatus;
|
|
64
|
+
answers: readonly HumanInputAnswer[];
|
|
65
|
+
reason?: HumanInputStopReason;
|
|
66
|
+
updatedAt: string;
|
|
67
|
+
}
|
|
68
|
+
export interface HumanInputRequestOptions {
|
|
69
|
+
source: HumanInputSource;
|
|
70
|
+
toolCallId?: string;
|
|
71
|
+
toolName?: string;
|
|
72
|
+
workerRequestId?: string;
|
|
73
|
+
questions: readonly HumanInputQuestion[];
|
|
74
|
+
acceptsImages: boolean;
|
|
75
|
+
now?: () => string;
|
|
76
|
+
}
|
|
77
|
+
export interface ResolveHumanInputOptions {
|
|
78
|
+
sessionManager: Pick<SessionManager, "appendCustomEntry">;
|
|
79
|
+
request: HumanInputRequest;
|
|
80
|
+
present: (request: HumanInputPresentationRequest, options?: {
|
|
81
|
+
signal?: AbortSignal;
|
|
82
|
+
}) => Promise<HumanInputPresentationResult>;
|
|
83
|
+
artifactStore?: ArtifactStore;
|
|
84
|
+
getImageStore?: () => Pick<SessionImageStore, "retainContent"> | undefined;
|
|
85
|
+
signal?: AbortSignal;
|
|
86
|
+
now?: () => string;
|
|
87
|
+
}
|
|
88
|
+
export declare function createHumanInputRequest(options: HumanInputRequestOptions): HumanInputRequest;
|
|
89
|
+
export declare function appendHumanInputSnapshot(sessionManager: Pick<SessionManager, "appendCustomEntry">, snapshot: HumanInputSnapshot): string;
|
|
90
|
+
export declare function beginHumanInputRequest(sessionManager: Pick<SessionManager, "appendCustomEntry">, request: HumanInputRequest): HumanInputSnapshot;
|
|
91
|
+
export declare function getHumanInputSnapshots(entries: readonly SessionEntry[]): HumanInputSnapshot[];
|
|
92
|
+
export declare function getLatestHumanInputSnapshots(source: SessionBranchEntrySource): HumanInputSnapshot[];
|
|
93
|
+
export declare function getWorkerHumanInputsRequiringDelivery(source: SessionBranchEntrySource): HumanInputSnapshot[];
|
|
94
|
+
export declare function getResumableHumanInputSnapshot(source: SessionBranchEntrySource): HumanInputSnapshot | undefined;
|
|
95
|
+
export declare function resolveHumanInput(options: ResolveHumanInputOptions): Promise<{
|
|
96
|
+
snapshot: HumanInputSnapshot;
|
|
97
|
+
imageContents: readonly ImageContent[];
|
|
98
|
+
}>;
|
|
99
|
+
export declare function formatHumanInputAnswerText(snapshot: HumanInputSnapshot): string;
|
|
100
|
+
//# sourceMappingURL=human-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human-input.d.ts","sourceRoot":"","sources":["../../src/core/human-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { SessionEntry, SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { ImageContent } from \"@caupulican/pi-ai\";\nimport type { ArtifactStore } from \"./context/context-artifacts.ts\";\nimport type { ContextArtifactRef } from \"./context/context-item.ts\";\nimport type { SessionImageStore } from \"./session-image-store.ts\";\nimport { getActiveSessionBranchEntries, type SessionBranchEntrySource } from \"./session-snapshot.ts\";\nimport { isPlainRecord } from \"./util/value-guards.ts\";\n\nexport const HUMAN_INPUT_CUSTOM_TYPE = \"human_input_request\";\nexport const HUMAN_INPUT_WORKER_RESPONSE_CUSTOM_TYPE = \"worker-owner-response\";\nexport const HUMAN_INPUT_INLINE_BYTES = 16 * 1024;\nconst HUMAN_INPUT_PREVIEW_CHARS = 4_000;\n\nexport interface HumanInputOption {\n\tlabel: string;\n\tdescription: string;\n}\n\nexport interface HumanInputQuestion {\n\tid: string;\n\theader: string;\n\tquestion: string;\n\toptions: readonly HumanInputOption[];\n\tmultiSelect?: boolean;\n}\n\nexport interface HumanInputAnswerImage {\n\tlabel: string;\n\tmimeType: string;\n}\n\nexport interface HumanInputAnswer {\n\tid: string;\n\theader: string;\n\tquestion: string;\n\tselected: readonly string[];\n\t/** Inline answer, or a bounded preview when customArtifact is present. */\n\tcustom?: string;\n\t/** Exact full answer retained out of prompt context when it exceeds the inline bound. */\n\tcustomArtifact?: ContextArtifactRef;\n\timages?: readonly HumanInputAnswerImage[];\n\tskipped: boolean;\n}\n\nexport type HumanInputStopReason = \"user_cancelled\" | \"ui_unavailable\" | \"interrupted\" | \"invalid_questions\";\n\nexport interface HumanInputPresentationRequest {\n\trequestId: string;\n\tquestions: readonly HumanInputQuestion[];\n\tacceptsImages: boolean;\n}\n\nexport interface HumanInputPresentationResult {\n\tanswers: readonly HumanInputAnswer[];\n\tcancelled: boolean;\n\treason?: HumanInputStopReason;\n\timageContents: readonly ImageContent[];\n}\n\nexport type HumanInputSource = \"tool\" | \"worker\";\n\nexport interface HumanInputRequest {\n\trequestId: string;\n\tsource: HumanInputSource;\n\ttoolCallId?: string;\n\ttoolName?: string;\n\tworkerRequestId?: string;\n\tquestions: readonly HumanInputQuestion[];\n\tacceptsImages: boolean;\n\tcreatedAt: string;\n}\n\nexport type HumanInputStatus = \"pending\" | \"answered\" | \"cancelled\";\n\nexport interface HumanInputSnapshot {\n\trequest: HumanInputRequest;\n\tstatus: HumanInputStatus;\n\tanswers: readonly HumanInputAnswer[];\n\treason?: HumanInputStopReason;\n\tupdatedAt: string;\n}\n\ninterface HumanInputSnapshotPayload {\n\tversion: 1;\n\tsnapshot: HumanInputSnapshot;\n}\n\nexport interface HumanInputRequestOptions {\n\tsource: HumanInputSource;\n\ttoolCallId?: string;\n\ttoolName?: string;\n\tworkerRequestId?: string;\n\tquestions: readonly HumanInputQuestion[];\n\tacceptsImages: boolean;\n\tnow?: () => string;\n}\n\nexport interface ResolveHumanInputOptions {\n\tsessionManager: Pick<SessionManager, \"appendCustomEntry\">;\n\trequest: HumanInputRequest;\n\tpresent: (\n\t\trequest: HumanInputPresentationRequest,\n\t\toptions?: { signal?: AbortSignal },\n\t) => Promise<HumanInputPresentationResult>;\n\tartifactStore?: ArtifactStore;\n\tgetImageStore?: () => Pick<SessionImageStore, \"retainContent\"> | undefined;\n\tsignal?: AbortSignal;\n\tnow?: () => string;\n}\n\nfunction cloneQuestion(question: HumanInputQuestion): HumanInputQuestion {\n\treturn {\n\t\t...question,\n\t\toptions: question.options.map((option) => ({ ...option })),\n\t};\n}\n\nfunction cloneAnswer(answer: HumanInputAnswer): HumanInputAnswer {\n\treturn {\n\t\t...answer,\n\t\tselected: [...answer.selected],\n\t\tcustomArtifact: answer.customArtifact ? { ...answer.customArtifact } : undefined,\n\t\timages: answer.images?.map((image) => ({ ...image })),\n\t};\n}\n\nfunction cloneRequest(request: HumanInputRequest): HumanInputRequest {\n\treturn {\n\t\t...request,\n\t\tquestions: request.questions.map(cloneQuestion),\n\t};\n}\n\nfunction cloneSnapshot(snapshot: HumanInputSnapshot): HumanInputSnapshot {\n\treturn {\n\t\t...snapshot,\n\t\trequest: cloneRequest(snapshot.request),\n\t\tanswers: snapshot.answers.map(cloneAnswer),\n\t};\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n\treturn Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nfunction isQuestion(value: unknown): value is HumanInputQuestion {\n\tif (!isPlainRecord(value) || !Array.isArray(value.options)) return false;\n\treturn (\n\t\ttypeof value.id === \"string\" &&\n\t\ttypeof value.header === \"string\" &&\n\t\ttypeof value.question === \"string\" &&\n\t\t(value.multiSelect === undefined || typeof value.multiSelect === \"boolean\") &&\n\t\tvalue.options.every(\n\t\t\t(option) =>\n\t\t\t\tisPlainRecord(option) && typeof option.label === \"string\" && typeof option.description === \"string\",\n\t\t)\n\t);\n}\n\nfunction isArtifactRef(value: unknown): value is ContextArtifactRef {\n\treturn (\n\t\tisPlainRecord(value) &&\n\t\ttypeof value.id === \"string\" &&\n\t\ttypeof value.kind === \"string\" &&\n\t\ttypeof value.byteLength === \"number\" &&\n\t\ttypeof value.createdAtTurn === \"number\" &&\n\t\ttypeof value.reproducible === \"boolean\"\n\t);\n}\n\nfunction isAnswer(value: unknown): value is HumanInputAnswer {\n\tif (!isPlainRecord(value)) return false;\n\treturn (\n\t\ttypeof value.id === \"string\" &&\n\t\ttypeof value.header === \"string\" &&\n\t\ttypeof value.question === \"string\" &&\n\t\tisStringArray(value.selected) &&\n\t\t(value.custom === undefined || typeof value.custom === \"string\") &&\n\t\t(value.customArtifact === undefined || isArtifactRef(value.customArtifact)) &&\n\t\t(value.images === undefined ||\n\t\t\t(Array.isArray(value.images) &&\n\t\t\t\tvalue.images.every(\n\t\t\t\t\t(image) => isPlainRecord(image) && typeof image.label === \"string\" && typeof image.mimeType === \"string\",\n\t\t\t\t))) &&\n\t\ttypeof value.skipped === \"boolean\"\n\t);\n}\n\nfunction isImageContent(value: unknown): value is ImageContent {\n\treturn (\n\t\tisPlainRecord(value) &&\n\t\tvalue.type === \"image\" &&\n\t\ttypeof value.data === \"string\" &&\n\t\ttypeof value.mimeType === \"string\"\n\t);\n}\n\nfunction normalizePresentationResult(request: HumanInputRequest, value: unknown): HumanInputPresentationResult {\n\tif (!isPlainRecord(value) || typeof value.cancelled !== \"boolean\") {\n\t\tthrow new Error(\"Invalid human-input response: expected a typed presentation result\");\n\t}\n\tif (value.cancelled) {\n\t\tconst reason = value.reason;\n\t\tif (\n\t\t\treason !== undefined &&\n\t\t\treason !== \"user_cancelled\" &&\n\t\t\treason !== \"ui_unavailable\" &&\n\t\t\treason !== \"interrupted\" &&\n\t\t\treason !== \"invalid_questions\"\n\t\t) {\n\t\t\tthrow new Error(\"Invalid human-input response: unknown cancellation reason\");\n\t\t}\n\t\treturn {\n\t\t\tanswers: [],\n\t\t\tcancelled: true,\n\t\t\t...(reason ? { reason } : {}),\n\t\t\timageContents: [],\n\t\t};\n\t}\n\tif (!Array.isArray(value.answers) || !Array.isArray(value.imageContents)) {\n\t\tthrow new Error(\"Invalid human-input response: answers and imageContents must be arrays\");\n\t}\n\tconst answersById = new Map<string, HumanInputAnswer>();\n\tfor (const candidate of value.answers) {\n\t\tif (!isAnswer(candidate)) throw new Error(\"Invalid human-input response: malformed answer\");\n\t\tif (candidate.customArtifact !== undefined) {\n\t\t\tthrow new Error(\"Invalid human-input response: artifact references are harness-owned\");\n\t\t}\n\t\tif (answersById.has(candidate.id)) {\n\t\t\tthrow new Error(`Invalid human-input response: duplicate answer '${candidate.id}'`);\n\t\t}\n\t\tanswersById.set(candidate.id, candidate);\n\t}\n\tif (answersById.size !== request.questions.length) {\n\t\tthrow new Error(\"Invalid human-input response: every question must have exactly one answer\");\n\t}\n\n\tconst answers = request.questions.map((question) => {\n\t\tconst answer = answersById.get(question.id);\n\t\tif (!answer) throw new Error(`Invalid human-input response: missing answer '${question.id}'`);\n\t\tconst optionLabels = new Set(question.options.map((option) => option.label));\n\t\tif (new Set(answer.selected).size !== answer.selected.length) {\n\t\t\tthrow new Error(`Invalid human-input response: duplicate option for '${question.id}'`);\n\t\t}\n\t\tif (answer.selected.some((selection) => !optionLabels.has(selection))) {\n\t\t\tthrow new Error(`Invalid human-input response: unknown option for '${question.id}'`);\n\t\t}\n\t\tif (!question.multiSelect && answer.selected.length > 1) {\n\t\t\tthrow new Error(`Invalid human-input response: '${question.id}' is single-select`);\n\t\t}\n\t\tif (\n\t\t\tanswer.skipped &&\n\t\t\t(answer.selected.length > 0 || Boolean(answer.custom) || (answer.images?.length ?? 0) > 0)\n\t\t) {\n\t\t\tthrow new Error(`Invalid human-input response: skipped answer '${question.id}' contains a value`);\n\t\t}\n\t\treturn {\n\t\t\t...cloneAnswer(answer),\n\t\t\theader: question.header,\n\t\t\tquestion: question.question,\n\t\t};\n\t});\n\tif (!value.imageContents.every(isImageContent)) {\n\t\tthrow new Error(\"Invalid human-input response: malformed image content\");\n\t}\n\tconst answerImages = answers.flatMap((answer) => answer.images ?? []);\n\tif (answerImages.length !== value.imageContents.length) {\n\t\tthrow new Error(\"Invalid human-input response: image metadata does not match image content\");\n\t}\n\tif (!request.acceptsImages && value.imageContents.length > 0) {\n\t\tthrow new Error(\"Invalid human-input response: the selected model does not accept images\");\n\t}\n\tfor (let index = 0; index < answerImages.length; index++) {\n\t\tif (answerImages[index]?.mimeType !== value.imageContents[index]?.mimeType) {\n\t\t\tthrow new Error(\"Invalid human-input response: image MIME metadata does not match image content\");\n\t\t}\n\t}\n\treturn {\n\t\tanswers,\n\t\tcancelled: false,\n\t\timageContents: value.imageContents.map((image) => ({ ...image })),\n\t};\n}\n\nfunction persistPresentationImages(\n\tresult: HumanInputPresentationResult,\n\timageStore: Pick<SessionImageStore, \"retainContent\"> | undefined,\n): HumanInputPresentationResult {\n\tif (!imageStore || result.cancelled || result.imageContents.length === 0) return result;\n\tlet imageIndex = 0;\n\tconst durableContents: ImageContent[] = [];\n\tconst answers = result.answers.map((answer) => {\n\t\tlet custom = answer.custom;\n\t\tconst images = answer.images?.map((image) => {\n\t\t\tconst content = result.imageContents[imageIndex++];\n\t\t\tif (!content) throw new Error(\"Human-input image metadata exceeds supplied image content\");\n\t\t\tconst sequenceMatch = /^\\[Image #(\\d{1,6})\\]$/iu.exec(image.label);\n\t\t\tconst stored = imageStore.retainContent(content, sequenceMatch ? Number(sequenceMatch[1]) : undefined);\n\t\t\tconst durableLabel = `[Image #${stored.sequence}]`;\n\t\t\tif (custom?.includes(image.label)) custom = custom.split(image.label).join(durableLabel);\n\t\t\tdurableContents.push({\n\t\t\t\ttype: \"image\",\n\t\t\t\tdata: Buffer.from(stored.bytes).toString(\"base64\"),\n\t\t\t\tmimeType: stored.mimeType,\n\t\t\t});\n\t\t\treturn { label: durableLabel, mimeType: stored.mimeType };\n\t\t});\n\t\treturn {\n\t\t\t...cloneAnswer(answer),\n\t\t\t...(custom !== undefined ? { custom } : {}),\n\t\t\t...(images && images.length > 0 ? { images } : {}),\n\t\t};\n\t});\n\treturn { ...result, answers, imageContents: durableContents };\n}\n\nfunction isRequest(value: unknown): value is HumanInputRequest {\n\tif (!isPlainRecord(value) || !Array.isArray(value.questions)) return false;\n\treturn (\n\t\ttypeof value.requestId === \"string\" &&\n\t\t(value.source === \"tool\" || value.source === \"worker\") &&\n\t\t(value.toolCallId === undefined || typeof value.toolCallId === \"string\") &&\n\t\t(value.toolName === undefined || typeof value.toolName === \"string\") &&\n\t\t(value.workerRequestId === undefined || typeof value.workerRequestId === \"string\") &&\n\t\tvalue.questions.every(isQuestion) &&\n\t\ttypeof value.acceptsImages === \"boolean\" &&\n\t\ttypeof value.createdAt === \"string\"\n\t);\n}\n\nfunction decodeSnapshot(data: unknown): HumanInputSnapshot | undefined {\n\tif (!isPlainRecord(data) || data.version !== 1 || !isPlainRecord(data.snapshot)) return undefined;\n\tconst snapshot = data.snapshot;\n\tif (\n\t\t!isRequest(snapshot.request) ||\n\t\t(snapshot.status !== \"pending\" && snapshot.status !== \"answered\" && snapshot.status !== \"cancelled\") ||\n\t\t!Array.isArray(snapshot.answers) ||\n\t\t!snapshot.answers.every(isAnswer) ||\n\t\t(snapshot.reason !== undefined &&\n\t\t\tsnapshot.reason !== \"user_cancelled\" &&\n\t\t\tsnapshot.reason !== \"ui_unavailable\" &&\n\t\t\tsnapshot.reason !== \"interrupted\" &&\n\t\t\tsnapshot.reason !== \"invalid_questions\") ||\n\t\ttypeof snapshot.updatedAt !== \"string\"\n\t) {\n\t\treturn undefined;\n\t}\n\treturn cloneSnapshot(snapshot as unknown as HumanInputSnapshot);\n}\n\nexport function createHumanInputRequest(options: HumanInputRequestOptions): HumanInputRequest {\n\tconst now = options.now?.() ?? new Date().toISOString();\n\treturn {\n\t\trequestId: `human-input:${options.toolCallId ?? options.workerRequestId ?? randomUUID()}`,\n\t\tsource: options.source,\n\t\t...(options.toolCallId ? { toolCallId: options.toolCallId } : {}),\n\t\t...(options.toolName ? { toolName: options.toolName } : {}),\n\t\t...(options.workerRequestId ? { workerRequestId: options.workerRequestId } : {}),\n\t\tquestions: options.questions.map(cloneQuestion),\n\t\tacceptsImages: options.acceptsImages,\n\t\tcreatedAt: now,\n\t};\n}\n\nexport function appendHumanInputSnapshot(\n\tsessionManager: Pick<SessionManager, \"appendCustomEntry\">,\n\tsnapshot: HumanInputSnapshot,\n): string {\n\tconst payload: HumanInputSnapshotPayload = { version: 1, snapshot: cloneSnapshot(snapshot) };\n\treturn sessionManager.appendCustomEntry(HUMAN_INPUT_CUSTOM_TYPE, payload);\n}\n\nexport function beginHumanInputRequest(\n\tsessionManager: Pick<SessionManager, \"appendCustomEntry\">,\n\trequest: HumanInputRequest,\n): HumanInputSnapshot {\n\tconst snapshot: HumanInputSnapshot = {\n\t\trequest: cloneRequest(request),\n\t\tstatus: \"pending\",\n\t\tanswers: [],\n\t\tupdatedAt: request.createdAt,\n\t};\n\tappendHumanInputSnapshot(sessionManager, snapshot);\n\treturn snapshot;\n}\n\nexport function getHumanInputSnapshots(entries: readonly SessionEntry[]): HumanInputSnapshot[] {\n\tconst snapshots: HumanInputSnapshot[] = [];\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"custom\" || entry.customType !== HUMAN_INPUT_CUSTOM_TYPE) continue;\n\t\tconst snapshot = decodeSnapshot(entry.data);\n\t\tif (snapshot) snapshots.push(snapshot);\n\t}\n\treturn snapshots;\n}\n\nexport function getLatestHumanInputSnapshots(source: SessionBranchEntrySource): HumanInputSnapshot[] {\n\tconst latest = new Map<string, HumanInputSnapshot>();\n\tfor (const snapshot of getHumanInputSnapshots(getActiveSessionBranchEntries(source))) {\n\t\tlatest.set(snapshot.request.requestId, snapshot);\n\t}\n\treturn [...latest.values()];\n}\n\nexport function getWorkerHumanInputsRequiringDelivery(source: SessionBranchEntrySource): HumanInputSnapshot[] {\n\tconst entries = getActiveSessionBranchEntries(source);\n\tconst deliveredRequestIds = new Set(\n\t\tentries.flatMap((entry) => {\n\t\t\tif (\n\t\t\t\tentry.type !== \"custom_message\" ||\n\t\t\t\tentry.customType !== HUMAN_INPUT_WORKER_RESPONSE_CUSTOM_TYPE ||\n\t\t\t\t!isPlainRecord(entry.details) ||\n\t\t\t\ttypeof entry.details.requestId !== \"string\"\n\t\t\t) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\treturn [entry.details.requestId];\n\t\t}),\n\t);\n\treturn getLatestHumanInputSnapshots(source)\n\t\t.filter(\n\t\t\t(snapshot) => snapshot.request.source === \"worker\" && !deliveredRequestIds.has(snapshot.request.requestId),\n\t\t)\n\t\t.sort((left, right) => left.updatedAt.localeCompare(right.updatedAt));\n}\n\nexport function getResumableHumanInputSnapshot(source: SessionBranchEntrySource): HumanInputSnapshot | undefined {\n\tconst entries = getActiveSessionBranchEntries(source);\n\tconst requestedToolCalls = new Set(\n\t\tentries.flatMap((entry) =>\n\t\t\tentry.type === \"message\" && entry.message.role === \"assistant\"\n\t\t\t\t? entry.message.content.flatMap((part) => (part.type === \"toolCall\" ? [part.id] : []))\n\t\t\t\t: [],\n\t\t),\n\t);\n\tconst answeredToolCalls = new Set(\n\t\tentries.flatMap((entry) =>\n\t\t\tentry.type === \"message\" && entry.message.role === \"toolResult\" ? [entry.message.toolCallId] : [],\n\t\t),\n\t);\n\treturn getLatestHumanInputSnapshots(source)\n\t\t.filter(\n\t\t\t(snapshot) =>\n\t\t\t\tsnapshot.request.source === \"tool\" &&\n\t\t\t\tsnapshot.request.toolCallId !== undefined &&\n\t\t\t\trequestedToolCalls.has(snapshot.request.toolCallId) &&\n\t\t\t\t!answeredToolCalls.has(snapshot.request.toolCallId),\n\t\t)\n\t\t.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt))[0];\n}\n\nfunction preview(value: string): string {\n\tif (value.length <= HUMAN_INPUT_PREVIEW_CHARS) return value;\n\treturn `${value.slice(0, HUMAN_INPUT_PREVIEW_CHARS)}…`;\n}\n\nfunction externalizeAnswer(\n\trequest: HumanInputRequest,\n\tanswer: HumanInputAnswer,\n\tartifactStore: ArtifactStore | undefined,\n): HumanInputAnswer {\n\tif (!answer.custom || Buffer.byteLength(answer.custom, \"utf8\") <= HUMAN_INPUT_INLINE_BYTES || !artifactStore) {\n\t\treturn cloneAnswer(answer);\n\t}\n\tconst record = artifactStore.write({\n\t\tkind: \"transcript_slice\",\n\t\tcontent: answer.custom,\n\t\ttoolName: request.toolName ?? \"human_input\",\n\t\tsessionEntryId: request.requestId,\n\t\tcreatedAtTurn: 0,\n\t\treproducible: false,\n\t});\n\tif (!artifactStore.addReference(record.ref.id, request.requestId)) {\n\t\tthrow new Error(`Failed to retain human-input artifact ${record.ref.id}`);\n\t}\n\treturn {\n\t\t...cloneAnswer(answer),\n\t\tcustom: preview(answer.custom),\n\t\tcustomArtifact: record.ref,\n\t};\n}\n\nexport async function resolveHumanInput(options: ResolveHumanInputOptions): Promise<{\n\tsnapshot: HumanInputSnapshot;\n\timageContents: readonly ImageContent[];\n}> {\n\tconst now = options.now ?? (() => new Date().toISOString());\n\tlet result: HumanInputPresentationResult;\n\tif (options.signal?.aborted) {\n\t\tresult = { answers: [], cancelled: true, reason: \"interrupted\", imageContents: [] };\n\t} else {\n\t\tresult = persistPresentationImages(\n\t\t\tnormalizePresentationResult(\n\t\t\t\toptions.request,\n\t\t\t\tawait options.present(\n\t\t\t\t\t{\n\t\t\t\t\t\trequestId: options.request.requestId,\n\t\t\t\t\t\tquestions: options.request.questions,\n\t\t\t\t\t\tacceptsImages: options.request.acceptsImages,\n\t\t\t\t\t},\n\t\t\t\t\t{ signal: options.signal },\n\t\t\t\t),\n\t\t\t),\n\t\t\toptions.getImageStore?.(),\n\t\t);\n\t}\n\tconst answers = result.answers.map((answer) => externalizeAnswer(options.request, answer, options.artifactStore));\n\tconst snapshot: HumanInputSnapshot = {\n\t\trequest: cloneRequest(options.request),\n\t\tstatus: result.cancelled ? \"cancelled\" : \"answered\",\n\t\tanswers,\n\t\t...(result.reason ? { reason: result.reason } : {}),\n\t\tupdatedAt: now(),\n\t};\n\tappendHumanInputSnapshot(options.sessionManager, snapshot);\n\treturn { snapshot, imageContents: result.cancelled ? [] : result.imageContents };\n}\n\nexport function formatHumanInputAnswerText(snapshot: HumanInputSnapshot): string {\n\tif (snapshot.status === \"cancelled\") {\n\t\treturn snapshot.reason === \"interrupted\"\n\t\t\t? \"User question was interrupted.\"\n\t\t\t: snapshot.reason === \"ui_unavailable\"\n\t\t\t\t? \"User input is unavailable in this host.\"\n\t\t\t\t: \"User cancelled the question without submitting answers.\";\n\t}\n\treturn snapshot.answers\n\t\t.map((answer) => {\n\t\t\tif (answer.skipped) return `${answer.header}: user skipped this question`;\n\t\t\tconst values = [...answer.selected, ...(answer.custom ? [answer.custom] : [])];\n\t\t\tconst artifact = answer.customArtifact\n\t\t\t\t? `\\nFull answer: artifact tool-output:${answer.customArtifact.id} (${answer.customArtifact.byteLength} bytes)`\n\t\t\t\t: \"\";\n\t\t\treturn `${answer.header}: ${values.length > 1 ? \"user selected\" : \"user answered\"}: ${values.join(\", \")}${artifact}`;\n\t\t})\n\t\t.join(\"\\n\");\n}\n"]}
|