@caupulican/pi-adaptative 0.94.0 → 0.95.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/README.md +32 -13
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts +7 -4
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +173 -293
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +247 -392
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.d.ts +52 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.d.ts.map +1 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.js +118 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.js.map +1 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.ts +169 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/templates/builder-validator.json +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/templates/provider-prompt-smoke.json +1 -1
- package/dist/bundled-resources/skills/pi-harness-learning/SKILL.md +13 -7
- package/dist/bundled-resources/skills/worker-profile-writer/SKILL.md +11 -11
- package/dist/core/agent-paths.d.ts +2 -0
- package/dist/core/agent-paths.d.ts.map +1 -1
- package/dist/core/agent-paths.js +7 -0
- package/dist/core/agent-paths.js.map +1 -1
- package/dist/core/agent-session.d.ts +11 -41
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +98 -161
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/autonomy/envelope-enforcement.d.ts +6 -1
- package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
- package/dist/core/autonomy/envelope-enforcement.js +26 -25
- package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
- package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -1
- package/dist/core/autonomy/lane-private-paths.js +2 -1
- package/dist/core/autonomy/lane-private-paths.js.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.d.ts +8 -8
- package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.js +45 -30
- package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
- package/dist/core/autonomy/worker-session-private-scope.d.ts +12 -0
- package/dist/core/autonomy/worker-session-private-scope.d.ts.map +1 -0
- package/dist/core/autonomy/worker-session-private-scope.js +42 -0
- package/dist/core/autonomy/worker-session-private-scope.js.map +1 -0
- package/dist/core/autonomy/worker-tool-adapter-registry.d.ts +65 -0
- package/dist/core/autonomy/worker-tool-adapter-registry.d.ts.map +1 -0
- package/dist/core/autonomy/worker-tool-adapter-registry.js +145 -0
- package/dist/core/autonomy/worker-tool-adapter-registry.js.map +1 -0
- package/dist/core/background-lane-controller.d.ts +9 -1
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +76 -6
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/background-tool-task-controller.d.ts +23 -2
- package/dist/core/background-tool-task-controller.d.ts.map +1 -1
- package/dist/core/background-tool-task-controller.js +132 -17
- package/dist/core/background-tool-task-controller.js.map +1 -1
- package/dist/core/context/long-term-memory-trigger.d.ts +3 -1
- package/dist/core/context/long-term-memory-trigger.d.ts.map +1 -1
- package/dist/core/context/long-term-memory-trigger.js +1 -1
- package/dist/core/context/long-term-memory-trigger.js.map +1 -1
- package/dist/core/context/okf-memory-provider.d.ts +3 -0
- package/dist/core/context/okf-memory-provider.d.ts.map +1 -1
- package/dist/core/context/okf-memory-provider.js +66 -31
- package/dist/core/context/okf-memory-provider.js.map +1 -1
- package/dist/core/context/okf-memory.d.ts +18 -1
- package/dist/core/context/okf-memory.d.ts.map +1 -1
- package/dist/core/context/okf-memory.js +48 -0
- package/dist/core/context/okf-memory.js.map +1 -1
- package/dist/core/cost-guard-controller.d.ts +37 -0
- package/dist/core/cost-guard-controller.d.ts.map +1 -0
- package/dist/core/cost-guard-controller.js +71 -0
- package/dist/core/cost-guard-controller.js.map +1 -0
- package/dist/core/cost-guard.d.ts +9 -4
- package/dist/core/cost-guard.d.ts.map +1 -1
- package/dist/core/cost-guard.js +7 -3
- package/dist/core/cost-guard.js.map +1 -1
- package/dist/core/delegation/worker-agent-control.d.ts +4 -0
- package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control.js.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.js +0 -1
- package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
- package/dist/core/delegation/worker-authority-resolver.d.ts +16 -3
- package/dist/core/delegation/worker-authority-resolver.d.ts.map +1 -1
- package/dist/core/delegation/worker-authority-resolver.js +114 -55
- package/dist/core/delegation/worker-authority-resolver.js.map +1 -1
- package/dist/core/delegation/worker-claim.d.ts +1 -2
- package/dist/core/delegation/worker-claim.d.ts.map +1 -1
- package/dist/core/delegation/worker-claim.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts +19 -6
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +125 -40
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/delegation/worker-delegation-request.d.ts +3 -3
- package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-request.js +13 -19
- package/dist/core/delegation/worker-delegation-request.js.map +1 -1
- package/dist/core/delegation/worker-execution-policy.d.ts +3 -2
- package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
- package/dist/core/delegation/worker-execution-policy.js +54 -39
- package/dist/core/delegation/worker-execution-policy.js.map +1 -1
- package/dist/core/delegation/worker-fleet-limits.d.ts +3 -3
- package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -1
- package/dist/core/delegation/worker-fleet-limits.js +7 -7
- package/dist/core/delegation/worker-fleet-limits.js.map +1 -1
- package/dist/core/delegation/worker-machine-scope.d.ts +12 -0
- package/dist/core/delegation/worker-machine-scope.d.ts.map +1 -0
- package/dist/core/delegation/worker-machine-scope.js +38 -0
- package/dist/core/delegation/worker-machine-scope.js.map +1 -0
- package/dist/core/delegation/worker-notification-coordinator.d.ts +10 -0
- package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.js +69 -3
- package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-recovery-coordinator.js +6 -1
- package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-runner.d.ts +5 -7
- package/dist/core/delegation/worker-runner.d.ts.map +1 -1
- package/dist/core/delegation/worker-runner.js +1 -4
- package/dist/core/delegation/worker-runner.js.map +1 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.d.ts +3 -2
- package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.js +50 -25
- package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
- package/dist/core/durable-custom-message-turn-controller.d.ts +6 -0
- package/dist/core/durable-custom-message-turn-controller.d.ts.map +1 -1
- package/dist/core/durable-custom-message-turn-controller.js +38 -15
- package/dist/core/durable-custom-message-turn-controller.js.map +1 -1
- package/dist/core/extension-binding-controller.d.ts +5 -1
- package/dist/core/extension-binding-controller.d.ts.map +1 -1
- package/dist/core/extension-binding-controller.js +15 -0
- package/dist/core/extension-binding-controller.js.map +1 -1
- package/dist/core/extensions/factory-runtime.d.ts.map +1 -1
- package/dist/core/extensions/factory-runtime.js +5 -0
- package/dist/core/extensions/factory-runtime.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +1 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +8 -4
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts +31 -0
- package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.js +239 -55
- package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
- package/dist/core/goals/goal-session-controller.d.ts +2 -0
- package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-session-controller.js +8 -0
- package/dist/core/goals/goal-session-controller.js.map +1 -1
- package/dist/core/goals/goal-tool-core.d.ts +5 -4
- package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
- package/dist/core/goals/goal-tool-core.js +23 -19
- package/dist/core/goals/goal-tool-core.js.map +1 -1
- package/dist/core/learning/auto-learn-settings.d.ts +84 -0
- package/dist/core/learning/auto-learn-settings.d.ts.map +1 -0
- package/dist/core/learning/auto-learn-settings.js +66 -0
- package/dist/core/learning/auto-learn-settings.js.map +1 -0
- package/dist/core/learning/learning-audit.d.ts +5 -1
- package/dist/core/learning/learning-audit.d.ts.map +1 -1
- package/dist/core/learning/learning-audit.js +32 -1
- package/dist/core/learning/learning-audit.js.map +1 -1
- package/dist/core/learning/reflection-engine.d.ts +24 -0
- package/dist/core/learning/reflection-engine.d.ts.map +1 -1
- package/dist/core/learning/reflection-engine.js +104 -8
- package/dist/core/learning/reflection-engine.js.map +1 -1
- package/dist/core/local-prefix-warm-controller.d.ts +24 -0
- package/dist/core/local-prefix-warm-controller.d.ts.map +1 -0
- package/dist/core/local-prefix-warm-controller.js +79 -0
- package/dist/core/local-prefix-warm-controller.js.map +1 -0
- package/dist/core/memory/okf-project-memory-store.d.ts +28 -0
- package/dist/core/memory/okf-project-memory-store.d.ts.map +1 -0
- package/dist/core/memory/okf-project-memory-store.js +111 -0
- package/dist/core/memory/okf-project-memory-store.js.map +1 -0
- package/dist/core/memory/providers/file-store.d.ts +44 -1
- package/dist/core/memory/providers/file-store.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.js +341 -24
- package/dist/core/memory/providers/file-store.js.map +1 -1
- package/dist/core/memory/worker-memory-tools.d.ts +5 -0
- package/dist/core/memory/worker-memory-tools.d.ts.map +1 -0
- package/dist/core/memory/worker-memory-tools.js +5 -0
- package/dist/core/memory/worker-memory-tools.js.map +1 -0
- package/dist/core/memory-controller.d.ts +10 -1
- package/dist/core/memory-controller.d.ts.map +1 -1
- package/dist/core/memory-controller.js +72 -8
- package/dist/core/memory-controller.js.map +1 -1
- package/dist/core/model-capability.d.ts +7 -0
- package/dist/core/model-capability.d.ts.map +1 -1
- package/dist/core/model-capability.js +12 -0
- package/dist/core/model-capability.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +2 -10
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-router-controller.d.ts +3 -2
- package/dist/core/model-router-controller.d.ts.map +1 -1
- package/dist/core/model-router-controller.js +3 -2
- package/dist/core/model-router-controller.js.map +1 -1
- package/dist/core/orchestration/contracts.d.ts +16 -12
- package/dist/core/orchestration/contracts.d.ts.map +1 -1
- package/dist/core/orchestration/contracts.js +2 -2
- package/dist/core/orchestration/contracts.js.map +1 -1
- package/dist/core/orchestration/lane-tool-manifests.d.ts +2 -2
- package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
- package/dist/core/orchestration/lane-tool-manifests.js +6 -1
- package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
- package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
- package/dist/core/orchestration/profile-registry.js +14 -0
- package/dist/core/orchestration/profile-registry.js.map +1 -1
- package/dist/core/orchestration/task-profile-writer.d.ts +7 -4
- package/dist/core/orchestration/task-profile-writer.d.ts.map +1 -1
- package/dist/core/orchestration/task-profile-writer.js +71 -59
- package/dist/core/orchestration/task-profile-writer.js.map +1 -1
- package/dist/core/orchestration/thinking-level-schema.d.ts +7 -0
- package/dist/core/orchestration/thinking-level-schema.d.ts.map +1 -0
- package/dist/core/orchestration/thinking-level-schema.js +19 -0
- package/dist/core/orchestration/thinking-level-schema.js.map +1 -0
- package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
- package/dist/core/orchestration/worker-execution-contract.js +12 -5
- package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
- package/dist/core/provider-prompt-contracts.d.ts +1 -4
- package/dist/core/provider-prompt-contracts.d.ts.map +1 -1
- package/dist/core/provider-prompt-contracts.js +13 -29
- package/dist/core/provider-prompt-contracts.js.map +1 -1
- package/dist/core/provider-request-context-controller.d.ts +2 -0
- package/dist/core/provider-request-context-controller.d.ts.map +1 -1
- package/dist/core/provider-request-context-controller.js +10 -3
- package/dist/core/provider-request-context-controller.js.map +1 -1
- package/dist/core/reflection-controller.d.ts +63 -27
- package/dist/core/reflection-controller.d.ts.map +1 -1
- package/dist/core/reflection-controller.js +300 -132
- package/dist/core/reflection-controller.js.map +1 -1
- package/dist/core/runtime-builder.d.ts +1 -0
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +25 -14
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
- package/dist/core/secrets/credential-exposure-guard.js +55 -10
- package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
- package/dist/core/session-role.d.ts +6 -8
- package/dist/core/session-role.d.ts.map +1 -1
- package/dist/core/session-role.js +8 -18
- package/dist/core/session-role.js.map +1 -1
- package/dist/core/settings-manager.d.ts +13 -16
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +53 -50
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skill-vault.d.ts +15 -0
- package/dist/core/skill-vault.d.ts.map +1 -1
- package/dist/core/skill-vault.js +79 -45
- package/dist/core/skill-vault.js.map +1 -1
- package/dist/core/skills.d.ts +3 -0
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +6 -6
- package/dist/core/skills.js.map +1 -1
- package/dist/core/system-prompt-builder.d.ts +2 -0
- package/dist/core/system-prompt-builder.d.ts.map +1 -1
- package/dist/core/system-prompt-builder.js +52 -12
- package/dist/core/system-prompt-builder.js.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tool-capability-policy.d.ts +3 -0
- package/dist/core/tool-capability-policy.d.ts.map +1 -1
- package/dist/core/tool-capability-policy.js +13 -2
- package/dist/core/tool-capability-policy.js.map +1 -1
- package/dist/core/toolkit/script-runner.d.ts +2 -1
- package/dist/core/toolkit/script-runner.d.ts.map +1 -1
- package/dist/core/toolkit/script-runner.js +10 -2
- package/dist/core/toolkit/script-runner.js.map +1 -1
- package/dist/core/tools/delegate-status.d.ts +3 -1
- package/dist/core/tools/delegate-status.d.ts.map +1 -1
- package/dist/core/tools/delegate-status.js +5 -1
- package/dist/core/tools/delegate-status.js.map +1 -1
- package/dist/core/tools/delegate.d.ts +4 -13
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +173 -73
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/goal.d.ts +3 -4
- package/dist/core/tools/goal.d.ts.map +1 -1
- package/dist/core/tools/goal.js +24 -7
- package/dist/core/tools/goal.js.map +1 -1
- package/dist/core/tools/profile-writer.d.ts +2 -8
- package/dist/core/tools/profile-writer.d.ts.map +1 -1
- package/dist/core/tools/profile-writer.js +6 -18
- package/dist/core/tools/profile-writer.js.map +1 -1
- package/dist/core/tools/run-toolkit-script.d.ts +1 -1
- package/dist/core/tools/run-toolkit-script.d.ts.map +1 -1
- package/dist/core/tools/run-toolkit-script.js +2 -2
- package/dist/core/tools/run-toolkit-script.js.map +1 -1
- package/dist/core/tools/skill-audit.d.ts +28 -1
- package/dist/core/tools/skill-audit.d.ts.map +1 -1
- package/dist/core/tools/skill-audit.js +56 -12
- package/dist/core/tools/skill-audit.js.map +1 -1
- package/dist/core/tools/skill.d.ts +12 -1
- package/dist/core/tools/skill.d.ts.map +1 -1
- package/dist/core/tools/skill.js +52 -0
- package/dist/core/tools/skill.js.map +1 -1
- package/dist/core/tools/skillify.d.ts.map +1 -1
- package/dist/core/tools/skillify.js +16 -7
- package/dist/core/tools/skillify.js.map +1 -1
- package/dist/core/tools/task-steps.js +1 -1
- package/dist/core/tools/task-steps.js.map +1 -1
- package/dist/core/tools/tmux-dispatch.d.ts +4 -16
- package/dist/core/tools/tmux-dispatch.d.ts.map +1 -1
- package/dist/core/tools/tmux-dispatch.js +5 -20
- package/dist/core/tools/tmux-dispatch.js.map +1 -1
- package/dist/core/tools/tool-task.d.ts +1 -0
- package/dist/core/tools/tool-task.d.ts.map +1 -1
- package/dist/core/tools/tool-task.js +13 -8
- package/dist/core/tools/tool-task.js.map +1 -1
- package/dist/core/util/atomic-file.d.ts +2 -0
- package/dist/core/util/atomic-file.d.ts.map +1 -1
- package/dist/core/util/atomic-file.js +4 -0
- package/dist/core/util/atomic-file.js.map +1 -1
- package/dist/core/worktree-sync/codes.d.ts +1 -2
- package/dist/core/worktree-sync/codes.d.ts.map +1 -1
- package/dist/core/worktree-sync/codes.js +1 -2
- package/dist/core/worktree-sync/codes.js.map +1 -1
- package/dist/core/worktree-sync/lane-gate.d.ts +4 -8
- package/dist/core/worktree-sync/lane-gate.d.ts.map +1 -1
- package/dist/core/worktree-sync/lane-gate.js +5 -51
- package/dist/core/worktree-sync/lane-gate.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.d.ts +6 -7
- package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.js +32 -207
- package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
- package/dist/modes/interactive/autonomy-commands.js +2 -2
- package/dist/modes/interactive/autonomy-commands.js.map +1 -1
- package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
- package/dist/modes/interactive/components/activity-lane.js +12 -23
- package/dist/modes/interactive/components/activity-lane.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +142 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/fitness-role-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/fitness-role-selector.js +2 -2
- package/dist/modes/interactive/components/fitness-role-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +150 -73
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/report-commands.d.ts.map +1 -1
- package/dist/modes/interactive/report-commands.js +8 -4
- package/dist/modes/interactive/report-commands.js.map +1 -1
- package/dist/modes/interactive/settings-selector-flow.d.ts.map +1 -1
- package/dist/modes/interactive/settings-selector-flow.js +10 -0
- package/dist/modes/interactive/settings-selector-flow.js.map +1 -1
- package/docs/extensions.md +8 -0
- package/docs/harness-architecture.md +28 -32
- package/docs/index.md +1 -1
- package/docs/process-matrix.md +8 -6
- package/docs/resources.md +1 -1
- package/docs/settings.md +61 -51
- package/docs/tmux-agent-manager.md +47 -40
- package/docs/usage.md +1 -1
- package/docs/worker-profiles.md +8 -6
- package/docs/worktree-sync.md +26 -20
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts +0 -133
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +0 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +0 -199
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +0 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +0 -312
|
@@ -1,312 +0,0 @@
|
|
|
1
|
-
import * as crypto from "node:crypto";
|
|
2
|
-
import type { Usage } from "@caupulican/pi-ai";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* The STANDING GRANT for approval-gated tmux dispatch (owner authorizes once via `grant_dispatch`;
|
|
6
|
-
* the extension then dispatches unattended WITHIN the grant's bounds). Pure data + pure decode/decision
|
|
7
|
-
* logic only — no session/tmux/filesystem access, so every function here is directly unit-testable.
|
|
8
|
-
* The extension (index.ts) owns reading/writing session custom entries and calls into this module for
|
|
9
|
-
* decoding and authorization decisions.
|
|
10
|
-
*
|
|
11
|
-
* HONEST TRUST BOUNDARY: this grant bounds WHO may be launched, HOW OFTEN, and WITH WHAT launch-time
|
|
12
|
-
* envelope (pushed into the child's own CLI flags) — it never claims to gate the child's in-process
|
|
13
|
-
* tool loop, which is a separate OS process outside this runtime's `beforeToolCall` machinery.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
export type Provider = "pi" | "codex" | "agy" | "claude" | "opencode" | "custom";
|
|
17
|
-
|
|
18
|
-
export const GRANT_CUSTOM_TYPE = "tmux-dispatch-grant";
|
|
19
|
-
export const GRANT_USAGE_CUSTOM_TYPE = "tmux-dispatch-grant-usage";
|
|
20
|
-
|
|
21
|
-
export interface TmuxDispatchGrantEnvelope {
|
|
22
|
-
allowedTools?: string[];
|
|
23
|
-
resourceProfile?: string;
|
|
24
|
-
writePaths?: string[];
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export interface TmuxDispatchGrantBudget {
|
|
28
|
-
maxLaunches: number;
|
|
29
|
-
maxWallClockMs?: number;
|
|
30
|
-
maxUsdAdvisory?: number;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface TmuxDispatchGrant {
|
|
34
|
-
grantId: string;
|
|
35
|
-
createdAt: string;
|
|
36
|
-
agent: Provider;
|
|
37
|
-
scope: { goalId?: string };
|
|
38
|
-
envelope: TmuxDispatchGrantEnvelope;
|
|
39
|
-
budget: TmuxDispatchGrantBudget;
|
|
40
|
-
expiresAt?: string;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/** Appended by `revoke_grant`. Shares `GRANT_CUSTOM_TYPE` so the SAME latest-on-branch read that
|
|
44
|
-
* resolves an active grant also sees a revocation and stops treating any older grant beneath it as
|
|
45
|
-
* active — a tombstone is a hard stop, never skipped over to resurrect an earlier grant. */
|
|
46
|
-
export interface TmuxDispatchGrantTombstone {
|
|
47
|
-
tombstone: true;
|
|
48
|
-
grantId: string;
|
|
49
|
-
revokedAt: string;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export interface TmuxDispatchGrantUsage {
|
|
53
|
-
grantId: string;
|
|
54
|
-
jobId: string;
|
|
55
|
-
at: string;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const PROVIDERS: readonly Provider[] = ["pi", "codex", "agy", "claude", "opencode", "custom"];
|
|
59
|
-
|
|
60
|
-
function isProvider(value: unknown): value is Provider {
|
|
61
|
-
return typeof value === "string" && (PROVIDERS as readonly string[]).includes(value);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function isPlainRecord(value: unknown): value is Record<string, unknown> {
|
|
65
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export function isTmuxDispatchGrantTombstone(value: unknown): value is TmuxDispatchGrantTombstone {
|
|
69
|
-
if (!isPlainRecord(value)) return false;
|
|
70
|
-
return value.tombstone === true && typeof value.grantId === "string" && typeof value.revokedAt === "string";
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export function isTmuxDispatchGrant(value: unknown): value is TmuxDispatchGrant {
|
|
74
|
-
if (!isPlainRecord(value) || value.tombstone === true) return false;
|
|
75
|
-
if (typeof value.grantId !== "string" || typeof value.createdAt !== "string" || !isProvider(value.agent))
|
|
76
|
-
return false;
|
|
77
|
-
if (!isPlainRecord(value.scope) || !isPlainRecord(value.envelope) || !isPlainRecord(value.budget)) return false;
|
|
78
|
-
return typeof value.budget.maxLaunches === "number" && Number.isFinite(value.budget.maxLaunches);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export function isTmuxDispatchGrantUsage(value: unknown): value is TmuxDispatchGrantUsage {
|
|
82
|
-
if (!isPlainRecord(value)) return false;
|
|
83
|
-
return typeof value.grantId === "string" && typeof value.jobId === "string" && typeof value.at === "string";
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export function makeGrantId(): string {
|
|
87
|
-
return `grant-${Date.now().toString(36)}-${crypto.randomBytes(4).toString("hex")}`;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export interface GrantCoverageRequest {
|
|
91
|
-
agent: Provider;
|
|
92
|
-
goalId?: string;
|
|
93
|
-
nowIso?: string;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/** Whether `grant` authorizes a launch for `request`: same agent, goal-scope match (an UNSCOPED grant
|
|
97
|
-
* covers any goal including none; a goal-SCOPED grant covers ONLY that exact goalId), and the grant is
|
|
98
|
-
* not past `expiresAt`. Budget (maxLaunches) is checked separately via {@link isGrantBudgetExhausted}
|
|
99
|
-
* because counting usages requires the caller's session-entry access. */
|
|
100
|
-
export function grantCovers(grant: TmuxDispatchGrant, request: GrantCoverageRequest): boolean {
|
|
101
|
-
if (grant.agent !== request.agent) return false;
|
|
102
|
-
if (grant.scope.goalId && grant.scope.goalId !== request.goalId) return false;
|
|
103
|
-
if (grant.expiresAt) {
|
|
104
|
-
const now = Date.parse(request.nowIso ?? new Date().toISOString());
|
|
105
|
-
const expiry = Date.parse(grant.expiresAt);
|
|
106
|
-
if (Number.isFinite(expiry) && Number.isFinite(now) && now >= expiry) return false;
|
|
107
|
-
}
|
|
108
|
-
return true;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/** Count spend entries for `grantId` among already-decoded custom-entry payloads (the caller walks the
|
|
112
|
-
* session branch and passes the raw `data` values — this stays pure/session-agnostic). */
|
|
113
|
-
export function countGrantUsages(grantId: string, usageEntries: readonly unknown[]): number {
|
|
114
|
-
let count = 0;
|
|
115
|
-
for (const entry of usageEntries) if (isTmuxDispatchGrantUsage(entry) && entry.grantId === grantId) count++;
|
|
116
|
-
return count;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export function isGrantBudgetExhausted(grant: TmuxDispatchGrant, usedCount: number): boolean {
|
|
120
|
-
return usedCount >= grant.budget.maxLaunches;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
export function buildGrantUsageEntry(
|
|
124
|
-
grantId: string,
|
|
125
|
-
jobId: string,
|
|
126
|
-
nowIso = new Date().toISOString(),
|
|
127
|
-
): TmuxDispatchGrantUsage {
|
|
128
|
-
return { grantId, jobId, at: nowIso };
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export function buildTombstone(grantId: string, nowIso = new Date().toISOString()): TmuxDispatchGrantTombstone {
|
|
132
|
-
return { tombstone: true, grantId, revokedAt: nowIso };
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
export interface GrantDispatchParams {
|
|
136
|
-
agent: Provider;
|
|
137
|
-
goalId?: string;
|
|
138
|
-
allowedTools?: string[];
|
|
139
|
-
resourceProfile?: string;
|
|
140
|
-
writePaths?: string[];
|
|
141
|
-
maxLaunches: number;
|
|
142
|
-
expiresInMinutes?: number;
|
|
143
|
-
maxUsdAdvisory?: number;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/** Build a new grant record from `grant_dispatch` params. Pure — the caller (index.ts) owns the
|
|
147
|
-
* approval gate (ui.confirm / opt-in flag) and the `pi.appendEntry` persistence; this only shapes the
|
|
148
|
-
* data, so it stays independently testable and never itself decides whether creation is authorized. */
|
|
149
|
-
export function buildGrant(params: GrantDispatchParams, nowIso = new Date().toISOString()): TmuxDispatchGrant {
|
|
150
|
-
if (!Number.isFinite(params.maxLaunches) || params.maxLaunches < 1)
|
|
151
|
-
throw new Error("grant_dispatch requires maxLaunches >= 1");
|
|
152
|
-
const expiresAt =
|
|
153
|
-
params.expiresInMinutes !== undefined
|
|
154
|
-
? new Date(Date.parse(nowIso) + Math.max(1, params.expiresInMinutes) * 60_000).toISOString()
|
|
155
|
-
: undefined;
|
|
156
|
-
return {
|
|
157
|
-
grantId: makeGrantId(),
|
|
158
|
-
createdAt: nowIso,
|
|
159
|
-
agent: params.agent,
|
|
160
|
-
scope: { goalId: params.goalId },
|
|
161
|
-
envelope: {
|
|
162
|
-
allowedTools: params.allowedTools,
|
|
163
|
-
resourceProfile: params.resourceProfile,
|
|
164
|
-
writePaths: params.writePaths,
|
|
165
|
-
},
|
|
166
|
-
budget: {
|
|
167
|
-
maxLaunches: Math.trunc(params.maxLaunches),
|
|
168
|
-
maxUsdAdvisory: params.maxUsdAdvisory,
|
|
169
|
-
},
|
|
170
|
-
expiresAt,
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
export function describeGrant(grant: TmuxDispatchGrant): string {
|
|
175
|
-
return [
|
|
176
|
-
`Grant id: ${grant.grantId}`,
|
|
177
|
-
`Agent: ${grant.agent}`,
|
|
178
|
-
grant.scope.goalId ? `Goal scope: ${grant.scope.goalId}` : "Goal scope: none (covers any goal)",
|
|
179
|
-
`Max launches: ${grant.budget.maxLaunches}`,
|
|
180
|
-
grant.expiresAt ? `Expires: ${grant.expiresAt}` : "Expires: never (until revoke_grant)",
|
|
181
|
-
grant.envelope.allowedTools?.length
|
|
182
|
-
? `Allowed tools: ${grant.envelope.allowedTools.join(", ")}`
|
|
183
|
-
: `Allowed tools: read-biased safe default (${DEFAULT_READ_BIASED_TOOLS.join(", ")})`,
|
|
184
|
-
grant.envelope.resourceProfile
|
|
185
|
-
? `Resource profile: ${grant.envelope.resourceProfile}`
|
|
186
|
-
: "Resource profile: none (child launches with --no-extensions --no-skills)",
|
|
187
|
-
grant.envelope.writePaths?.length
|
|
188
|
-
? `Write paths: ${grant.envelope.writePaths.join(", ")}`
|
|
189
|
-
: "Write paths: none declared",
|
|
190
|
-
grant.budget.maxUsdAdvisory !== undefined
|
|
191
|
-
? `Advisory USD cap: ${grant.budget.maxUsdAdvisory} (not enforced across the process boundary — advisory only)`
|
|
192
|
-
: undefined,
|
|
193
|
-
]
|
|
194
|
-
.filter((line): line is string => Boolean(line))
|
|
195
|
-
.join("\n");
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// ---------------------------------------------------------------------------
|
|
199
|
-
// Launch-profile flags: the REAL lever — pushed into the child `pi` CLI's own config.
|
|
200
|
-
// ---------------------------------------------------------------------------
|
|
201
|
-
|
|
202
|
-
export const DEFAULT_READ_BIASED_TOOLS: readonly string[] = ["read", "grep", "find", "ls"];
|
|
203
|
-
|
|
204
|
-
export interface LaunchProfileSource {
|
|
205
|
-
/** Human-readable identity for the scoped system prompt (e.g. "grant <id>" or a one-shot label). */
|
|
206
|
-
identity: string;
|
|
207
|
-
allowedTools?: string[];
|
|
208
|
-
resourceProfile?: string;
|
|
209
|
-
writePaths?: string[];
|
|
210
|
-
/**
|
|
211
|
-
* Worktree-sync lane key this launch is bound to (per-agent -- see `applyLaunchProfile`'s caller,
|
|
212
|
-
* which builds a per-agent `LaunchProfileSource` only when that agent carries `worktreeLane`).
|
|
213
|
-
* When present, `buildLaunchProfileFlags` appends `--worktree-lane <key>` (the same CLI flag
|
|
214
|
-
* `src/cli/args.ts` already exposes, sugar over the `PI_WORKTREE_LANE` env contract) and
|
|
215
|
-
* `buildScopedSystemPrompt` appends one lane-doctrine sentence.
|
|
216
|
-
*/
|
|
217
|
-
worktreeLane?: string;
|
|
218
|
-
/**
|
|
219
|
-
* Process-matrix parent identity for this launch (see `core/process-matrix/runtime.ts`): the
|
|
220
|
-
* dispatching process's own pid/sessionId. When present, `buildLaunchProfileFlags` appends
|
|
221
|
-
* `--parent-pid`/`--parent-session` (sugar over `PI_PARENT_PID`/`PI_PARENT_SESSION`) so the
|
|
222
|
-
* child self-registers as a worker of this session and winds down gracefully if it disappears.
|
|
223
|
-
*/
|
|
224
|
-
parentPid?: number;
|
|
225
|
-
parentSession?: string;
|
|
226
|
-
/** Stable goal/task identity used to fence process-matrix recovery. */
|
|
227
|
-
taskRef?: string;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/** A grant-covered launch derives its profile from the grant's envelope. */
|
|
231
|
-
export function launchProfileSourceFromGrant(grant: TmuxDispatchGrant): LaunchProfileSource {
|
|
232
|
-
return {
|
|
233
|
-
identity: `grant ${grant.grantId}`,
|
|
234
|
-
allowedTools: grant.envelope.allowedTools,
|
|
235
|
-
resourceProfile: grant.envelope.resourceProfile,
|
|
236
|
-
writePaths: grant.envelope.writePaths,
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/** A one-shot interactively-approved launch (no standing grant) still gets the conservative default
|
|
241
|
-
* profile — approving a single launch is not the same as defining an unrestricted envelope. */
|
|
242
|
-
export const ONE_SHOT_LAUNCH_PROFILE_SOURCE: LaunchProfileSource = {
|
|
243
|
-
identity: "a one-shot owner-approved tmux dispatch (no standing grant)",
|
|
244
|
-
};
|
|
245
|
-
|
|
246
|
-
export interface LaunchProfileFlag {
|
|
247
|
-
flag: string;
|
|
248
|
-
value?: string;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/** Build the CLI flags to append to a child `pi` invocation so the grant's envelope lives in the
|
|
252
|
-
* child's OWN launch config (verified flag names: --tools, --resource-profile, --no-extensions,
|
|
253
|
-
* --no-skills, --append-system-prompt). Never includes --no-approve: the child must keep gating its
|
|
254
|
-
* own hard stops. */
|
|
255
|
-
export function buildLaunchProfileFlags(source: LaunchProfileSource): LaunchProfileFlag[] {
|
|
256
|
-
const tools = source.allowedTools?.length ? source.allowedTools : DEFAULT_READ_BIASED_TOOLS;
|
|
257
|
-
const flags: LaunchProfileFlag[] = [{ flag: "--tools", value: tools.join(",") }];
|
|
258
|
-
if (source.resourceProfile) flags.push({ flag: "--resource-profile", value: source.resourceProfile });
|
|
259
|
-
else flags.push({ flag: "--no-extensions" }, { flag: "--no-skills" });
|
|
260
|
-
if (source.worktreeLane) flags.push({ flag: "--worktree-lane", value: source.worktreeLane });
|
|
261
|
-
if (source.parentPid !== undefined) flags.push({ flag: "--parent-pid", value: String(source.parentPid) });
|
|
262
|
-
if (source.parentSession) flags.push({ flag: "--parent-session", value: source.parentSession });
|
|
263
|
-
if (source.taskRef) flags.push({ flag: "--task-ref", value: source.taskRef });
|
|
264
|
-
flags.push({ flag: "--append-system-prompt", value: buildScopedSystemPrompt(source) });
|
|
265
|
-
flags.push({ flag: "--session-mode", value: "worker" });
|
|
266
|
-
return flags;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
export function buildScopedSystemPrompt(source: LaunchProfileSource): string {
|
|
270
|
-
const paths = source.writePaths?.length ? source.writePaths.join(", ") : "no additional paths granted";
|
|
271
|
-
const sentences = [
|
|
272
|
-
`You are a tmux worker dispatched under ${source.identity}.`,
|
|
273
|
-
`Stay within these write paths: ${paths}.`,
|
|
274
|
-
"Hard stops — publishing/npm, git push, tagging a release, changing credentials/auth, or destructive deletion — require returning BLOCKED for owner approval. Never self-approve a hard stop.",
|
|
275
|
-
];
|
|
276
|
-
if (source.worktreeLane) {
|
|
277
|
-
sentences.push(
|
|
278
|
-
`You are bound to worktree-sync lane '${source.worktreeLane}': work only inside this lane's own worktree, integrate exclusively via worktree_sync land, and never touch main directly.`,
|
|
279
|
-
);
|
|
280
|
-
}
|
|
281
|
-
return sentences.join(" ");
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// ---------------------------------------------------------------------------
|
|
285
|
-
// Advisory worker usage claim: budget stays advisory across the process boundary.
|
|
286
|
-
// ---------------------------------------------------------------------------
|
|
287
|
-
|
|
288
|
-
/** Permissively decode a worker-reported usage CLAIM (a cooperative worker may write this to a
|
|
289
|
-
* well-known sibling file before printing its completion marker). Read-defensive: missing/malformed
|
|
290
|
-
* numeric fields default to 0 rather than throwing — this is untrusted, OPTIONAL, advisory input, never
|
|
291
|
-
* an authoritative billing record. Returns undefined only when `raw` isn't even an object, so the
|
|
292
|
-
* caller can distinguish "no claim offered" (skip reporting) from "a claim was offered" (report it,
|
|
293
|
-
* however partial). */
|
|
294
|
-
export function decodeTmuxWorkerUsageClaim(raw: unknown): Usage | undefined {
|
|
295
|
-
if (!isPlainRecord(raw)) return undefined;
|
|
296
|
-
const num = (value: unknown): number => (typeof value === "number" && Number.isFinite(value) ? value : 0);
|
|
297
|
-
const cost = isPlainRecord(raw.cost) ? raw.cost : {};
|
|
298
|
-
return {
|
|
299
|
-
input: num(raw.input),
|
|
300
|
-
output: num(raw.output),
|
|
301
|
-
cacheRead: num(raw.cacheRead),
|
|
302
|
-
cacheWrite: num(raw.cacheWrite),
|
|
303
|
-
totalTokens: num(raw.totalTokens),
|
|
304
|
-
cost: {
|
|
305
|
-
input: num(cost.input),
|
|
306
|
-
output: num(cost.output),
|
|
307
|
-
cacheRead: num(cost.cacheRead),
|
|
308
|
-
cacheWrite: num(cost.cacheWrite),
|
|
309
|
-
total: num(cost.total),
|
|
310
|
-
},
|
|
311
|
-
};
|
|
312
|
-
}
|