@fitchmultz/pi-subagents 0.44.7 → 0.46.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 +264 -7
- package/LICENSE +1 -0
- package/README.md +58 -1483
- package/agents/context-builder.md +19 -1
- package/agents/debugger.md +10 -3
- package/agents/delegate.md +1 -0
- package/agents/fixer.md +4 -1
- package/agents/oracle.md +13 -2
- package/agents/planner.md +14 -3
- package/agents/researcher.md +11 -2
- package/agents/reviewer-claude.md +11 -2
- package/agents/reviewer-gpt.md +12 -2
- package/agents/reviewer-ponytail.md +11 -1
- package/agents/reviewer-security.md +13 -2
- package/agents/reviewer.md +12 -3
- package/agents/scout.md +12 -1
- package/agents/ui-designer.md +10 -3
- package/agents/watcher.md +1 -0
- package/agents/worker.md +8 -2
- package/agents/writer.md +6 -3
- package/dist/agents/agent-defaults.js +9 -0
- package/dist/agents/agent-definition.js +196 -0
- package/dist/agents/agent-management.js +64 -905
- package/dist/agents/agent-scope.js +4 -2
- package/dist/agents/agent-selection.js +10 -5
- package/dist/agents/agent-serializer.js +55 -67
- package/dist/agents/agents.js +75 -716
- package/dist/agents/builtin-overrides.js +218 -0
- package/dist/agents/chain-serializer.js +3 -367
- package/dist/agents/config-values.js +52 -0
- package/dist/agents/discovery-paths.js +91 -0
- package/dist/agents/frontmatter.js +15 -5
- package/dist/agents/identity.js +25 -8
- package/dist/agents/json-chain.js +254 -0
- package/dist/agents/management-config.js +332 -0
- package/dist/agents/management-format.js +231 -0
- package/dist/agents/management-persistence.js +287 -0
- package/dist/agents/management-targets.js +136 -0
- package/dist/agents/management-warnings.js +81 -0
- package/dist/agents/markdown-chain.js +210 -0
- package/dist/agents/package-agents.js +154 -0
- package/dist/agents/skill-files.js +157 -0
- package/dist/agents/skill-search-paths.js +246 -0
- package/dist/agents/skill-types.js +1 -0
- package/dist/agents/skills.js +54 -499
- package/dist/extension/acceptance-schema.js +55 -0
- package/dist/extension/build-info.js +1 -1
- package/dist/extension/chain-schema.js +196 -0
- package/dist/extension/child-runtime.js +237 -0
- package/dist/extension/compact-tools.js +122 -51
- package/dist/extension/config-schema.js +29 -0
- package/dist/extension/config.js +27 -11
- package/dist/extension/control-notice-schema.js +37 -0
- package/dist/extension/control-notices.js +13 -6
- package/dist/extension/delegation-bridges.js +43 -0
- package/dist/extension/doctor.js +48 -25
- package/dist/extension/everyday-schemas.js +207 -0
- package/dist/extension/fanout-child.js +18 -319
- package/dist/extension/index.js +8 -563
- package/dist/extension/message-renderers.js +225 -0
- package/dist/extension/nested-control-inbox.js +154 -0
- package/dist/extension/parent-runtime.js +339 -0
- package/dist/extension/primary-tool.js +69 -0
- package/dist/extension/result-snapshot.js +22 -0
- package/dist/extension/runtime-reload.js +62 -0
- package/dist/extension/runtime-storage.js +43 -0
- package/dist/extension/schema-overrides.js +75 -0
- package/dist/extension/schemas.js +265 -336
- package/dist/extension/tool-input.js +27 -12
- package/dist/extension/tool-result.js +19 -4
- package/dist/history/answer-texts.js +57 -0
- package/dist/history/canonical-result.js +76 -43
- package/dist/history/canonical-selection.js +40 -0
- package/dist/history/database-generation.js +82 -0
- package/dist/history/database.js +57 -33
- package/dist/history/entry-ingestion.js +61 -0
- package/dist/history/index.js +242 -97
- package/dist/history/ingest.js +168 -331
- package/dist/history/output-digests.js +40 -0
- package/dist/history/preview.js +210 -0
- package/dist/history/prune.js +33 -0
- package/dist/history/queries.js +60 -349
- package/dist/history/query-scope.js +190 -0
- package/dist/history/rows.js +77 -0
- package/dist/history/run-projection.js +137 -0
- package/dist/history/run-queries.js +153 -0
- package/dist/history/schema.js +31 -0
- package/dist/history/search-queries.js +163 -0
- package/dist/history/selected-record.js +108 -0
- package/dist/history/source-file.js +45 -0
- package/dist/history/source-watches.js +141 -0
- package/dist/history/store.js +164 -153
- package/dist/history/text-chunks.js +169 -0
- package/dist/history/text.js +35 -0
- package/dist/history/transcript-queries.js +177 -0
- package/dist/history/types.js +5 -1
- package/dist/history/values.js +36 -0
- package/dist/history/wire-inputs.js +122 -0
- package/dist/history/wire-models.js +38 -0
- package/dist/history/worker-runtime.js +441 -0
- package/dist/history/worker.js +66 -462
- package/dist/intercom/intercom-bridge.js +48 -20
- package/dist/intercom/live-intercom.js +80 -23
- package/dist/intercom/nested-result-tree.js +163 -0
- package/dist/intercom/result-delivery.js +40 -0
- package/dist/intercom/result-intercom.js +178 -261
- package/dist/pi-intercom/agent-dir.js +7 -3
- package/dist/pi-intercom/async.js +27 -0
- package/dist/pi-intercom/bridge-ask.js +57 -0
- package/dist/pi-intercom/bridge-config.js +89 -0
- package/dist/pi-intercom/bridge-http.js +86 -0
- package/dist/pi-intercom/bridge-launch-policy.js +88 -0
- package/dist/pi-intercom/bridge-launch.js +217 -0
- package/dist/pi-intercom/bridge-protocol.js +106 -0
- package/dist/pi-intercom/bridge-routes.js +72 -0
- package/dist/pi-intercom/bridge-rpc-process.js +264 -0
- package/dist/pi-intercom/bridge-session.js +420 -0
- package/dist/pi-intercom/bridge.js +221 -606
- package/dist/pi-intercom/broker/broker.js +236 -244
- package/dist/pi-intercom/broker/client.js +189 -304
- package/dist/pi-intercom/broker/connection.js +165 -0
- package/dist/pi-intercom/broker/framing.js +5 -3
- package/dist/pi-intercom/broker/paths.js +4 -1
- package/dist/pi-intercom/broker/pid.js +53 -25
- package/dist/pi-intercom/broker/snapshot-reader.js +78 -0
- package/dist/pi-intercom/broker/snapshots.js +188 -0
- package/dist/pi-intercom/broker/spawn.js +36 -25
- package/dist/pi-intercom/config.js +85 -71
- package/dist/pi-intercom/connection.js +297 -0
- package/dist/pi-intercom/identity.js +58 -0
- package/dist/pi-intercom/inbound-delivery.js +356 -0
- package/dist/pi-intercom/inbound-journal.js +303 -0
- package/dist/pi-intercom/inbound-record.js +113 -0
- package/dist/pi-intercom/inbound.js +179 -0
- package/dist/pi-intercom/index.js +79 -2933
- package/dist/pi-intercom/inspection.js +62 -0
- package/dist/pi-intercom/interview.js +236 -0
- package/dist/pi-intercom/lifecycle.js +168 -0
- package/dist/pi-intercom/message-format.js +69 -0
- package/dist/pi-intercom/outbound.js +304 -0
- package/dist/pi-intercom/peer-awareness.js +66 -0
- package/dist/pi-intercom/reply-tracker.js +62 -43
- package/dist/pi-intercom/reply-wait.js +201 -0
- package/dist/pi-intercom/runtime-types.js +3 -0
- package/dist/pi-intercom/session-events.js +180 -0
- package/dist/pi-intercom/session-targets.js +42 -34
- package/dist/pi-intercom/subagent-events.js +238 -0
- package/dist/pi-intercom/subagent-live-events.js +129 -86
- package/dist/pi-intercom/supervisor.js +282 -0
- package/dist/pi-intercom/tool-arguments.js +74 -0
- package/dist/pi-intercom/tool-registration.js +95 -0
- package/dist/pi-intercom/tool-results.js +38 -0
- package/dist/pi-intercom/tool-schemas.js +82 -0
- package/dist/pi-intercom/tools.js +51 -0
- package/dist/pi-intercom/topic-actions.js +177 -0
- package/dist/pi-intercom/topics.js +177 -92
- package/dist/pi-intercom/transport.js +1 -0
- package/dist/pi-intercom/types.js +151 -114
- package/dist/pi-intercom/ui/compose-paste.js +93 -0
- package/dist/pi-intercom/ui/compose.js +121 -143
- package/dist/pi-intercom/ui/inline-message.js +59 -59
- package/dist/pi-intercom/ui/message-renderers.js +147 -0
- package/dist/pi-intercom/ui/overlay.js +181 -0
- package/dist/pi-intercom/ui/session-format.js +124 -0
- package/dist/pi-intercom/ui/session-list.js +76 -43
- package/dist/pi-intercom/ui/tool-renderers.js +110 -0
- package/dist/pi-intercom/ui/topic-view.js +88 -0
- package/dist/pi-intercom/validation.js +59 -0
- package/dist/runs/background/async-chain-plan.js +265 -0
- package/dist/runs/background/async-control.js +134 -58
- package/dist/runs/background/async-execution.js +136 -633
- package/dist/runs/background/async-job-admission.js +40 -0
- package/dist/runs/background/async-job-projection.js +169 -0
- package/dist/runs/background/async-job-tracker.js +297 -327
- package/dist/runs/background/async-launch.js +216 -0
- package/dist/runs/background/async-plan.js +116 -0
- package/dist/runs/background/async-result-file.js +47 -23
- package/dist/runs/background/async-resume.js +195 -253
- package/dist/runs/background/async-run-discovery.js +213 -0
- package/dist/runs/background/async-run-location.js +135 -0
- package/dist/runs/background/async-run-record.js +1 -0
- package/dist/runs/background/async-run-repair.js +223 -0
- package/dist/runs/background/async-run-summary.js +1 -0
- package/dist/runs/background/async-single-plan.js +105 -0
- package/dist/runs/background/async-status-projection.js +155 -0
- package/dist/runs/background/async-status-render.js +117 -0
- package/dist/runs/background/async-status-validation.js +181 -0
- package/dist/runs/background/async-status.js +3 -442
- package/dist/runs/background/async-value.js +21 -0
- package/dist/runs/background/completion-dedupe.js +36 -12
- package/dist/runs/background/completion-delivery.js +211 -205
- package/dist/runs/background/completion-receipts.js +237 -0
- package/dist/runs/background/legacy-status-acceptance.js +34 -0
- package/dist/runs/background/notify.js +96 -48
- package/dist/runs/background/parallel-groups.js +36 -19
- package/dist/runs/background/result-payload.js +178 -0
- package/dist/runs/background/result-watcher.js +348 -339
- package/dist/runs/background/run-id-resolver.js +53 -33
- package/dist/runs/background/run-schemas.js +189 -0
- package/dist/runs/background/run-status-contracts.js +14 -0
- package/dist/runs/background/run-status-render.js +270 -0
- package/dist/runs/background/run-status.js +231 -339
- package/dist/runs/background/runner-attempt-output.js +155 -0
- package/dist/runs/background/runner-attempt.js +263 -0
- package/dist/runs/background/runner-child-executor.js +166 -0
- package/dist/runs/background/runner-child-observer.js +192 -0
- package/dist/runs/background/runner-completion-summary.js +71 -0
- package/dist/runs/background/runner-completion.js +211 -0
- package/dist/runs/background/runner-config.js +1 -0
- package/dist/runs/background/runner-contract.js +1 -0
- package/dist/runs/background/runner-dynamic.js +121 -0
- package/dist/runs/background/runner-finalization.js +149 -0
- package/dist/runs/background/runner-graph.js +68 -0
- package/dist/runs/background/runner-initial-status.js +60 -0
- package/dist/runs/background/runner-lifecycle.js +142 -0
- package/dist/runs/background/runner-monitor.js +309 -0
- package/dist/runs/background/runner-parallel.js +204 -0
- package/dist/runs/background/runner-prepare-step.js +86 -0
- package/dist/runs/background/runner-reporting.js +153 -0
- package/dist/runs/background/runner-status.js +148 -0
- package/dist/runs/background/runner-step-output.js +92 -0
- package/dist/runs/background/runner-step-record.js +45 -0
- package/dist/runs/background/runner-step.js +112 -0
- package/dist/runs/background/runner-streaming.js +173 -0
- package/dist/runs/background/runner-workflow.js +213 -0
- package/dist/runs/background/stale-run-reconciler.js +155 -292
- package/dist/runs/background/subagent-runner-launcher.js +33 -13
- package/dist/runs/background/subagent-runner.js +51 -1842
- package/dist/runs/background/top-level-async.js +2 -1
- package/dist/runs/foreground/chain-clarify.js +293 -1017
- package/dist/runs/foreground/clarification-draft.js +87 -0
- package/dist/runs/foreground/clarify-contracts.js +1 -0
- package/dist/runs/foreground/clarify-invocation.js +129 -38
- package/dist/runs/foreground/clarify-text-editor.js +210 -0
- package/dist/runs/foreground/clarify-view.js +167 -0
- package/dist/runs/foreground/execution-input.js +226 -353
- package/dist/runs/foreground/execution-routing.js +33 -0
- package/dist/runs/foreground/execution-timeout.js +81 -0
- package/dist/runs/foreground/foreground-control.js +222 -763
- package/dist/runs/foreground/foreground-memory.js +99 -0
- package/dist/runs/foreground/invocation-context.js +55 -0
- package/dist/runs/foreground/invocation-execution.js +331 -0
- package/dist/runs/foreground/invocation-expansion.js +48 -0
- package/dist/runs/foreground/management-actions.js +295 -0
- package/dist/runs/foreground/nested-control.js +179 -0
- package/dist/runs/foreground/question-continuation.js +78 -0
- package/dist/runs/foreground/question-control.js +155 -50
- package/dist/runs/foreground/resume-target.js +221 -0
- package/dist/runs/foreground/revival-launch-policy.js +58 -0
- package/dist/runs/foreground/run-async-path.js +190 -178
- package/dist/runs/foreground/run-interrupt.js +164 -0
- package/dist/runs/foreground/run-nudge.js +278 -0
- package/dist/runs/foreground/saved-revival.js +251 -0
- package/dist/runs/foreground/subagent-executor.js +135 -424
- package/dist/runs/foreground/subagent-params.js +67 -30
- package/dist/runs/foreground/wait-observation.js +104 -0
- package/dist/runs/foreground/wait-registration.js +17 -0
- package/dist/runs/foreground/wait-run.js +283 -123
- package/dist/runs/shared/acceptance-contract.js +193 -99
- package/dist/runs/shared/acceptance-defaults.js +1 -0
- package/dist/runs/shared/acceptance-evaluation.js +201 -181
- package/dist/runs/shared/acceptance-finalization.js +256 -180
- package/dist/runs/shared/acceptance-outcome.js +53 -0
- package/dist/runs/shared/acceptance-reports.js +137 -72
- package/dist/runs/shared/acceptance-submission.js +167 -0
- package/dist/runs/shared/acceptance-verification.js +100 -0
- package/dist/runs/shared/chain-outputs.js +80 -52
- package/dist/runs/shared/child-attempt-types.js +1 -0
- package/dist/runs/shared/child-attempt.js +314 -667
- package/dist/runs/shared/child-boundaries.js +173 -0
- package/dist/runs/shared/child-context-filter.js +44 -0
- package/dist/runs/shared/child-event-observer.js +390 -0
- package/dist/runs/shared/child-execution-cwd.js +73 -43
- package/dist/runs/shared/child-execution-outcome.js +72 -0
- package/dist/runs/shared/child-invocation.js +54 -0
- package/dist/runs/shared/child-message-validation.js +215 -0
- package/dist/runs/shared/child-native-accounting.js +106 -0
- package/dist/runs/shared/child-native-observation.js +69 -0
- package/dist/runs/shared/child-observation-spool.js +164 -0
- package/dist/runs/shared/child-observations.js +157 -76
- package/dist/runs/shared/child-presence.js +3 -0
- package/dist/runs/shared/child-route-env.js +119 -0
- package/dist/runs/shared/child-stream-observer.js +221 -0
- package/dist/runs/shared/child-stream-projection.js +137 -0
- package/dist/runs/shared/child-structured-tool.js +27 -0
- package/dist/runs/shared/claude-code.js +121 -158
- package/dist/runs/shared/claude-model.js +42 -0
- package/dist/runs/shared/claude-session.js +83 -0
- package/dist/runs/shared/claude-types.js +1 -0
- package/dist/runs/shared/completion-guard.js +18 -18
- package/dist/runs/shared/control-event-policy.js +8 -0
- package/dist/runs/shared/control-notification-owner.js +13 -0
- package/dist/runs/shared/dynamic-fanout.js +188 -173
- package/dist/runs/shared/dynamic-item.js +102 -0
- package/dist/runs/shared/history-index.js +62 -36
- package/dist/runs/shared/legacy-async-recovery.js +114 -0
- package/dist/runs/shared/legacy-output-recovery.js +148 -0
- package/dist/runs/shared/mcp-config-schema.js +36 -0
- package/dist/runs/shared/mcp-direct-tool-allowlist.js +147 -116
- package/dist/runs/shared/model-fallback.js +97 -38
- package/dist/runs/shared/mutating-tool-guard.js +128 -88
- package/dist/runs/shared/native-finalization-types.js +1 -0
- package/dist/runs/shared/native-finalization.js +155 -76
- package/dist/runs/shared/native-usage.js +238 -98
- package/dist/runs/shared/nested-control-records.js +128 -0
- package/dist/runs/shared/nested-events.js +8 -700
- package/dist/runs/shared/nested-path.js +32 -28
- package/dist/runs/shared/nested-projection.js +155 -0
- package/dist/runs/shared/nested-protocol.js +18 -0
- package/dist/runs/shared/nested-registry.js +191 -0
- package/dist/runs/shared/nested-render.js +106 -58
- package/dist/runs/shared/nested-route.js +220 -0
- package/dist/runs/shared/nested-validation.js +216 -0
- package/dist/runs/shared/owned-child-evidence.js +125 -0
- package/dist/runs/shared/owned-run-list.js +146 -0
- package/dist/runs/shared/owned-run-observation.js +267 -0
- package/dist/runs/shared/owned-run-progress.js +109 -0
- package/dist/runs/shared/owned-run-read-state.js +1 -0
- package/dist/runs/shared/owned-run-results.js +202 -0
- package/dist/runs/shared/owned-run-status.js +180 -0
- package/dist/runs/shared/owned-run-view.js +51 -0
- package/dist/runs/shared/owned-workflow-details.js +17 -0
- package/dist/runs/shared/owner-output.js +43 -0
- package/dist/runs/shared/parallel-utils.js +36 -28
- package/dist/runs/shared/parent-receipts.js +90 -32
- package/dist/runs/shared/parent-usage.js +169 -57
- package/dist/runs/shared/pi-args.js +108 -201
- package/dist/runs/shared/pi-launch-input.js +1 -0
- package/dist/runs/shared/pi-session-launch.js +86 -0
- package/dist/runs/shared/pi-spawn.js +35 -21
- package/dist/runs/shared/run-history-queries.js +126 -35
- package/dist/runs/shared/run-history.js +101 -35
- package/dist/runs/shared/run-metadata-paths.js +14 -0
- package/dist/runs/shared/run-metadata.js +158 -0
- package/dist/runs/shared/run-persistence.js +131 -0
- package/dist/runs/shared/run-records.js +9 -679
- package/dist/runs/shared/run-restoration.js +338 -0
- package/dist/runs/shared/run-state-owner.js +26 -0
- package/dist/runs/shared/session-cwd-preload.js +27 -18
- package/dist/runs/shared/single-output.js +148 -70
- package/dist/runs/shared/stable-value.js +15 -0
- package/dist/runs/shared/streaming-text.js +23 -12
- package/dist/runs/shared/structured-output.js +25 -13
- package/dist/runs/shared/subagent-control.js +167 -100
- package/dist/runs/shared/subagent-prompt-runtime.js +27 -130
- package/dist/runs/shared/subagent-tool-loop-guard.js +81 -52
- package/dist/runs/shared/supervisor-question-state.js +145 -0
- package/dist/runs/shared/supervisor-questions.js +185 -254
- package/dist/runs/shared/workflow-graph.js +259 -167
- package/dist/runs/shared/workflow-policy.js +120 -48
- package/dist/runs/shared/worktree-contract.js +1 -0
- package/dist/runs/shared/worktree-hook.js +138 -0
- package/dist/runs/shared/worktree-location.js +47 -0
- package/dist/runs/shared/worktree-preservation.js +8 -0
- package/dist/runs/shared/worktree-process.js +107 -0
- package/dist/runs/shared/worktree.js +183 -322
- package/dist/shared/agent-context-policy.js +34 -44
- package/dist/shared/agent-dir.js +14 -0
- package/dist/shared/artifacts.js +30 -12
- package/dist/shared/atomic-json.js +4 -1
- package/dist/shared/chain-files.js +72 -0
- package/dist/shared/concurrency.js +18 -0
- package/dist/shared/content-preview.js +115 -0
- package/dist/shared/cooperative.js +5 -2
- package/dist/shared/execution-cwd.js +13 -5
- package/dist/shared/file-coalescer.js +2 -1
- package/dist/shared/fork-context.js +10 -12
- package/dist/shared/formatters.js +45 -19
- package/dist/shared/journal-frames.js +164 -0
- package/dist/shared/journal-projections.js +121 -0
- package/dist/shared/journal-reader.js +6 -407
- package/dist/shared/json-projection.js +191 -0
- package/dist/shared/lazy-tools.js +19 -8
- package/dist/shared/message-output.js +116 -0
- package/dist/shared/model-info.js +31 -14
- package/dist/shared/native-import.js +20 -0
- package/dist/shared/native-journal.js +140 -0
- package/dist/shared/native-session-loader.js +17 -0
- package/dist/shared/native-session.js +2 -13
- package/dist/shared/native-tui.js +7 -2
- package/dist/shared/native-typebox.js +15 -3
- package/dist/shared/output-page.js +63 -0
- package/dist/shared/post-exit-stdio-guard.js +128 -88
- package/dist/shared/prompt-sections.js +2 -0
- package/dist/shared/session-entries.js +70 -35
- package/dist/shared/session-identity.js +5 -3
- package/dist/shared/settings.js +62 -192
- package/dist/shared/status-format.js +97 -37
- package/dist/shared/task-file-policy.js +24 -0
- package/dist/shared/temp-root.js +44 -15
- package/dist/shared/types/acceptance.js +1 -0
- package/dist/shared/types/async.js +1 -0
- package/dist/shared/types/config.js +1 -0
- package/dist/shared/types/details.js +1 -0
- package/dist/shared/types/history.js +1 -0
- package/dist/shared/types/inputs.js +1 -0
- package/dist/shared/types/intercom.js +1 -0
- package/dist/shared/types/launch.js +1 -0
- package/dist/shared/types/messages.js +1 -0
- package/dist/shared/types/nested.js +1 -0
- package/dist/shared/types/owned-runs.js +1 -0
- package/dist/shared/types/progress.js +1 -0
- package/dist/shared/types/questions.js +1 -0
- package/dist/shared/types/results.js +1 -0
- package/dist/shared/types/state.js +1 -0
- package/dist/shared/types/usage.js +1 -0
- package/dist/shared/types/workflow.js +1 -0
- package/dist/shared/types.js +75 -30
- package/dist/shared/unknown.js +52 -0
- package/dist/shared/utils.js +54 -260
- package/dist/slash/command-discovery.js +82 -0
- package/dist/slash/command-input.js +190 -0
- package/dist/slash/prompt-template-bridge.js +94 -270
- package/dist/slash/prompt-template-contract.js +77 -0
- package/dist/slash/prompt-template-results.js +125 -0
- package/dist/slash/request-protocol.js +68 -0
- package/dist/slash/result-delivery.js +237 -0
- package/dist/slash/saved-chain.js +78 -0
- package/dist/slash/slash-bridge.js +123 -89
- package/dist/slash/slash-commands.js +101 -572
- package/dist/slash/slash-live-state.js +68 -47
- package/dist/tui/action-hints.js +50 -22
- package/dist/tui/activity-lines.js +32 -0
- package/dist/tui/agent-browser.js +290 -0
- package/dist/tui/agent-controls.js +289 -0
- package/dist/tui/agent-conversation.js +444 -0
- package/dist/tui/agent-dock.js +171 -0
- package/dist/tui/agent-history.js +50 -183
- package/dist/tui/agent-model.js +62 -0
- package/dist/tui/agent-picker.js +262 -0
- package/dist/tui/agent-view.js +232 -1564
- package/dist/tui/compact-results.js +193 -0
- package/dist/tui/conversation-details.js +190 -0
- package/dist/tui/conversation-frame.js +135 -0
- package/dist/tui/conversation-history.js +201 -0
- package/dist/tui/conversation-menu.js +78 -0
- package/dist/tui/conversation-notices.js +79 -0
- package/dist/tui/conversation-selection.js +58 -0
- package/dist/tui/conversation-viewport.js +129 -0
- package/dist/tui/direction-message.js +27 -0
- package/dist/tui/display.js +282 -0
- package/dist/tui/editor-viewport.js +18 -0
- package/dist/tui/expanded-content.js +87 -0
- package/dist/tui/expanded-multi.js +170 -0
- package/dist/tui/expanded-single.js +65 -0
- package/dist/tui/history-cards.js +216 -0
- package/dist/tui/history-display.js +238 -0
- package/dist/tui/history-json.js +16 -0
- package/dist/tui/history-metadata.js +152 -0
- package/dist/tui/history-record.js +251 -0
- package/dist/tui/history-text.js +34 -0
- package/dist/tui/indexed-history.js +116 -0
- package/dist/tui/nested-widget.js +120 -0
- package/dist/tui/picker-page.js +59 -0
- package/dist/tui/render.js +58 -1501
- package/dist/tui/result-facts.js +64 -0
- package/dist/tui/task-observation.js +59 -0
- package/dist/tui/task-store.js +366 -0
- package/dist/tui/text-values.js +16 -0
- package/dist/tui/view-connections.js +47 -0
- package/dist/tui/view-model.js +94 -0
- package/dist/tui/view-persistence.js +51 -0
- package/dist/tui/view-ports.js +1 -0
- package/dist/tui/view-session.js +37 -0
- package/dist/tui/widget-details.js +144 -0
- package/dist/tui/widget-status.js +245 -0
- package/dist/tui/widget.js +145 -0
- package/dist/tui/workflow-labels.js +223 -0
- package/dist/tui/workflow-outcomes.js +124 -0
- package/docs/code-quality.md +38 -0
- package/docs/development.md +99 -0
- package/docs/intercom-bridge.md +77 -22
- package/docs/intercom.md +132 -106
- package/docs/performance.md +19 -17
- package/docs/reference.md +1472 -0
- package/generated/RunValidators.d.ts +28 -0
- package/generated/RunValidators.js +2 -0
- package/package.json +27 -6
- package/prompts/parallel-cleanup.md +3 -0
- package/prompts/parallel-context-build.md +3 -0
- package/prompts/parallel-handoff-plan.md +6 -0
- package/prompts/parallel-research.md +4 -0
- package/prompts/parallel-review.md +2 -0
- package/prompts/review-loop.md +2 -0
- package/scripts/build.mjs +129 -85
- package/scripts/check-compat.mjs +48 -11
- package/scripts/compat-host.mjs +35 -7
- package/scripts/generate-run-schemas.mjs +210 -0
- package/scripts/intercom-bridge-credentials.mjs +158 -29
- package/scripts/intercom-remote.mjs +213 -52
- package/scripts/local-install-smoke.mjs +47 -37
- package/scripts/native-package-smoke.mjs +135 -25
- package/scripts/package-smoke.mjs +360 -140
- package/scripts/prepare.mjs +54 -34
- package/scripts/real-pi-processes.mjs +261 -0
- package/scripts/real-pi-smoke.mjs +432 -351
- package/scripts/run-tests.mjs +29 -15
- package/skills/pi-intercom/SKILL.md +11 -11
- package/skills/pi-intercom/references/peer-sessions.md +7 -2
- package/skills/pi-subagents/SKILL.md +1 -1
- package/skills/pi-subagents/references/full-orchestration-guide.md +254 -112
- package/src/agents/agent-defaults.ts +13 -0
- package/src/agents/agent-definition.ts +253 -0
- package/src/agents/agent-management.ts +111 -808
- package/src/agents/agent-scope.ts +7 -3
- package/src/agents/agent-selection.ts +26 -16
- package/src/agents/agent-serializer.ts +84 -93
- package/src/agents/agents.ts +199 -906
- package/src/agents/builtin-overrides.ts +297 -0
- package/src/agents/chain-serializer.ts +3 -329
- package/src/agents/config-values.ts +57 -0
- package/src/agents/discovery-paths.ts +134 -0
- package/src/agents/frontmatter.ts +35 -17
- package/src/agents/identity.ts +49 -18
- package/src/agents/json-chain.ts +305 -0
- package/src/agents/management-config.ts +342 -0
- package/src/agents/management-format.ts +243 -0
- package/src/agents/management-persistence.ts +408 -0
- package/src/agents/management-targets.ts +260 -0
- package/src/agents/management-warnings.ts +115 -0
- package/src/agents/markdown-chain.ts +237 -0
- package/src/agents/package-agents.ts +231 -0
- package/src/agents/skill-files.ts +182 -0
- package/src/agents/skill-search-paths.ts +289 -0
- package/src/agents/skill-types.ts +31 -0
- package/src/agents/skills.ts +152 -610
- package/src/extension/acceptance-schema.ts +88 -0
- package/src/extension/chain-schema.ts +276 -0
- package/src/extension/child-runtime.ts +302 -0
- package/src/extension/compact-tools.ts +259 -102
- package/src/extension/config-schema.ts +59 -0
- package/src/extension/config.ts +39 -17
- package/src/extension/control-notice-schema.ts +55 -0
- package/src/extension/control-notices.ts +57 -33
- package/src/extension/delegation-bridges.ts +59 -0
- package/src/extension/doctor.ts +171 -135
- package/src/extension/everyday-schemas.ts +252 -0
- package/src/extension/fanout-child.ts +29 -308
- package/src/extension/index.ts +17 -642
- package/src/extension/message-renderers.ts +334 -0
- package/src/extension/nested-control-inbox.ts +196 -0
- package/src/extension/parent-runtime.ts +405 -0
- package/src/extension/primary-tool.ts +130 -0
- package/src/extension/result-snapshot.ts +35 -0
- package/src/extension/runtime-reload.ts +72 -0
- package/src/extension/runtime-storage.ts +49 -0
- package/src/extension/schema-overrides.ts +114 -0
- package/src/extension/schemas.ts +451 -418
- package/src/extension/tool-input.ts +40 -13
- package/src/extension/tool-result.ts +45 -14
- package/src/history/answer-texts.ts +74 -0
- package/src/history/canonical-result.ts +127 -51
- package/src/history/canonical-selection.ts +54 -0
- package/src/history/database-generation.ts +86 -0
- package/src/history/database.ts +86 -48
- package/src/history/entry-ingestion.ts +129 -0
- package/src/history/index.ts +426 -148
- package/src/history/ingest.ts +372 -342
- package/src/history/output-digests.ts +41 -0
- package/src/history/preview.ts +235 -0
- package/src/history/prune.ts +48 -0
- package/src/history/queries.ts +122 -256
- package/src/history/query-scope.ts +278 -0
- package/src/history/rows.ts +118 -0
- package/src/history/run-projection.ts +164 -0
- package/src/history/run-queries.ts +199 -0
- package/src/history/schema.ts +34 -0
- package/src/history/search-queries.ts +216 -0
- package/src/history/selected-record.ts +140 -0
- package/src/history/source-file.ts +51 -0
- package/src/history/source-watches.ts +156 -0
- package/src/history/store.ts +310 -197
- package/src/history/text-chunks.ts +181 -0
- package/src/history/text.ts +43 -0
- package/src/history/transcript-queries.ts +251 -0
- package/src/history/types.ts +27 -164
- package/src/history/values.ts +36 -0
- package/src/history/wire-inputs.ts +141 -0
- package/src/history/wire-models.ts +51 -0
- package/src/history/worker-runtime.ts +502 -0
- package/src/history/worker.ts +94 -336
- package/src/intercom/intercom-bridge.ts +136 -69
- package/src/intercom/live-intercom.ts +197 -92
- package/src/intercom/nested-result-tree.ts +213 -0
- package/src/intercom/result-delivery.ts +56 -0
- package/src/intercom/result-intercom.ts +364 -382
- package/src/pi-intercom/agent-dir.ts +9 -3
- package/src/pi-intercom/async.ts +33 -0
- package/src/pi-intercom/bridge-ask.ts +64 -0
- package/src/pi-intercom/bridge-config.ts +120 -0
- package/src/pi-intercom/bridge-http.ts +97 -0
- package/src/pi-intercom/bridge-launch-policy.ts +109 -0
- package/src/pi-intercom/bridge-launch.ts +317 -0
- package/src/pi-intercom/bridge-protocol.ts +123 -0
- package/src/pi-intercom/bridge-routes.ts +105 -0
- package/src/pi-intercom/bridge-rpc-process.ts +293 -0
- package/src/pi-intercom/bridge-session.ts +510 -0
- package/src/pi-intercom/bridge.ts +305 -549
- package/src/pi-intercom/broker/broker.ts +326 -263
- package/src/pi-intercom/broker/client.ts +273 -354
- package/src/pi-intercom/broker/connection.ts +192 -0
- package/src/pi-intercom/broker/framing.ts +11 -6
- package/src/pi-intercom/broker/paths.ts +28 -25
- package/src/pi-intercom/broker/pid.ts +68 -24
- package/src/pi-intercom/broker/snapshot-reader.ts +91 -0
- package/src/pi-intercom/broker/snapshots.ts +241 -0
- package/src/pi-intercom/broker/spawn.ts +58 -34
- package/src/pi-intercom/config.ts +113 -108
- package/src/pi-intercom/connection.ts +346 -0
- package/src/pi-intercom/identity.ts +71 -0
- package/src/pi-intercom/inbound-delivery.ts +450 -0
- package/src/pi-intercom/inbound-journal.ts +350 -0
- package/src/pi-intercom/inbound-record.ts +141 -0
- package/src/pi-intercom/inbound.ts +237 -0
- package/src/pi-intercom/index.ts +86 -2923
- package/src/pi-intercom/inspection.ts +82 -0
- package/src/pi-intercom/interview.ts +295 -0
- package/src/pi-intercom/lifecycle.ts +183 -0
- package/src/pi-intercom/message-format.ts +77 -0
- package/src/pi-intercom/outbound.ts +418 -0
- package/src/pi-intercom/peer-awareness.ts +84 -0
- package/src/pi-intercom/reply-tracker.ts +121 -59
- package/src/pi-intercom/reply-wait.ts +247 -0
- package/src/pi-intercom/runtime-types.ts +97 -0
- package/src/pi-intercom/session-events.ts +247 -0
- package/src/pi-intercom/session-targets.ts +124 -72
- package/src/pi-intercom/subagent-events.ts +299 -0
- package/src/pi-intercom/subagent-live-events.ts +212 -109
- package/src/pi-intercom/supervisor.ts +362 -0
- package/src/pi-intercom/tool-arguments.ts +120 -0
- package/src/pi-intercom/tool-registration.ts +121 -0
- package/src/pi-intercom/tool-results.ts +54 -0
- package/src/pi-intercom/tool-schemas.ts +134 -0
- package/src/pi-intercom/tools.ts +80 -0
- package/src/pi-intercom/topic-actions.ts +243 -0
- package/src/pi-intercom/topics.ts +267 -121
- package/src/pi-intercom/transport.ts +14 -0
- package/src/pi-intercom/types.ts +288 -190
- package/src/pi-intercom/ui/compose-paste.ts +109 -0
- package/src/pi-intercom/ui/compose.ts +173 -157
- package/src/pi-intercom/ui/inline-message.ts +80 -62
- package/src/pi-intercom/ui/message-renderers.ts +182 -0
- package/src/pi-intercom/ui/overlay.ts +238 -0
- package/src/pi-intercom/ui/session-format.ts +146 -0
- package/src/pi-intercom/ui/session-list.ts +145 -62
- package/src/pi-intercom/ui/tool-renderers.ts +148 -0
- package/src/pi-intercom/ui/topic-view.ts +107 -0
- package/src/pi-intercom/validation.ts +69 -0
- package/src/runs/background/async-chain-plan.ts +451 -0
- package/src/runs/background/async-control.ts +201 -71
- package/src/runs/background/async-execution.ts +206 -829
- package/src/runs/background/async-job-admission.ts +54 -0
- package/src/runs/background/async-job-projection.ts +225 -0
- package/src/runs/background/async-job-tracker.ts +416 -360
- package/src/runs/background/async-launch.ts +319 -0
- package/src/runs/background/async-plan.ts +285 -0
- package/src/runs/background/async-result-file.ts +79 -37
- package/src/runs/background/async-resume.ts +338 -285
- package/src/runs/background/async-run-discovery.ts +270 -0
- package/src/runs/background/async-run-location.ts +194 -0
- package/src/runs/background/async-run-record.ts +14 -0
- package/src/runs/background/async-run-repair.ts +307 -0
- package/src/runs/background/async-run-summary.ts +71 -0
- package/src/runs/background/async-single-plan.ts +168 -0
- package/src/runs/background/async-status-projection.ts +188 -0
- package/src/runs/background/async-status-render.ts +164 -0
- package/src/runs/background/async-status-validation.ts +238 -0
- package/src/runs/background/async-status.ts +9 -481
- package/src/runs/background/async-value.ts +29 -0
- package/src/runs/background/completion-dedupe.ts +103 -54
- package/src/runs/background/completion-delivery.ts +313 -187
- package/src/runs/background/completion-receipts.ts +309 -0
- package/src/runs/background/legacy-status-acceptance.ts +38 -0
- package/src/runs/background/notify.ts +167 -106
- package/src/runs/background/parallel-groups.ts +95 -46
- package/src/runs/background/result-payload.ts +268 -0
- package/src/runs/background/result-watcher.ts +484 -387
- package/src/runs/background/run-id-resolver.ts +126 -57
- package/src/runs/background/run-schemas.ts +240 -0
- package/src/runs/background/run-status-contracts.ts +46 -0
- package/src/runs/background/run-status-render.ts +364 -0
- package/src/runs/background/run-status.ts +338 -356
- package/src/runs/background/runner-attempt-output.ts +281 -0
- package/src/runs/background/runner-attempt.ts +354 -0
- package/src/runs/background/runner-child-executor.ts +232 -0
- package/src/runs/background/runner-child-observer.ts +270 -0
- package/src/runs/background/runner-completion-summary.ts +106 -0
- package/src/runs/background/runner-completion.ts +274 -0
- package/src/runs/background/runner-config.ts +52 -0
- package/src/runs/background/runner-contract.ts +51 -0
- package/src/runs/background/runner-dynamic.ts +185 -0
- package/src/runs/background/runner-finalization.ts +203 -0
- package/src/runs/background/runner-graph.ts +91 -0
- package/src/runs/background/runner-initial-status.ts +72 -0
- package/src/runs/background/runner-lifecycle.ts +159 -0
- package/src/runs/background/runner-monitor.ts +399 -0
- package/src/runs/background/runner-parallel.ts +280 -0
- package/src/runs/background/runner-prepare-step.ts +128 -0
- package/src/runs/background/runner-reporting.ts +192 -0
- package/src/runs/background/runner-status.ts +220 -0
- package/src/runs/background/runner-step-output.ts +158 -0
- package/src/runs/background/runner-step-record.ts +76 -0
- package/src/runs/background/runner-step.ts +150 -0
- package/src/runs/background/runner-streaming.ts +220 -0
- package/src/runs/background/runner-workflow.ts +284 -0
- package/src/runs/background/stale-run-reconciler.ts +279 -336
- package/src/runs/background/subagent-runner-launcher.ts +67 -35
- package/src/runs/background/subagent-runner.ts +80 -2048
- package/src/runs/background/top-level-async.ts +9 -7
- package/src/runs/foreground/chain-clarify.ts +499 -1334
- package/src/runs/foreground/clarification-draft.ts +92 -0
- package/src/runs/foreground/clarify-contracts.ts +33 -0
- package/src/runs/foreground/clarify-invocation.ts +192 -65
- package/src/runs/foreground/clarify-text-editor.ts +229 -0
- package/src/runs/foreground/clarify-view.ts +222 -0
- package/src/runs/foreground/execution-input.ts +358 -424
- package/src/runs/foreground/execution-routing.ts +41 -0
- package/src/runs/foreground/execution-timeout.ts +92 -0
- package/src/runs/foreground/foreground-control.ts +333 -812
- package/src/runs/foreground/foreground-memory.ts +132 -0
- package/src/runs/foreground/invocation-context.ts +88 -0
- package/src/runs/foreground/invocation-execution.ts +465 -0
- package/src/runs/foreground/invocation-expansion.ts +58 -0
- package/src/runs/foreground/management-actions.ts +360 -0
- package/src/runs/foreground/nested-control.ts +248 -0
- package/src/runs/foreground/question-continuation.ts +112 -0
- package/src/runs/foreground/question-control.ts +297 -70
- package/src/runs/foreground/resume-target.ts +330 -0
- package/src/runs/foreground/revival-launch-policy.ts +112 -0
- package/src/runs/foreground/run-async-path.ts +307 -223
- package/src/runs/foreground/run-interrupt.ts +202 -0
- package/src/runs/foreground/run-nudge.ts +355 -0
- package/src/runs/foreground/saved-revival.ts +356 -0
- package/src/runs/foreground/subagent-executor.ts +195 -493
- package/src/runs/foreground/subagent-params.ts +314 -242
- package/src/runs/foreground/wait-observation.ts +160 -0
- package/src/runs/foreground/wait-registration.ts +18 -0
- package/src/runs/foreground/wait-run.ts +361 -119
- package/src/runs/shared/acceptance-contract.ts +410 -209
- package/src/runs/shared/acceptance-defaults.ts +1 -0
- package/src/runs/shared/acceptance-evaluation.ts +314 -240
- package/src/runs/shared/acceptance-finalization.ts +447 -305
- package/src/runs/shared/acceptance-outcome.ts +69 -0
- package/src/runs/shared/acceptance-reports.ts +220 -126
- package/src/runs/shared/acceptance-submission.ts +251 -0
- package/src/runs/shared/acceptance-verification.ts +118 -0
- package/src/runs/shared/acceptance.ts +25 -25
- package/src/runs/shared/chain-outputs.ts +190 -98
- package/src/runs/shared/child-attempt-types.ts +118 -0
- package/src/runs/shared/child-attempt.ts +372 -608
- package/src/runs/shared/child-boundaries.ts +217 -0
- package/src/runs/shared/child-context-filter.ts +53 -0
- package/src/runs/shared/child-event-observer.ts +496 -0
- package/src/runs/shared/child-execution-cwd.ts +139 -68
- package/src/runs/shared/child-execution-outcome.ts +103 -0
- package/src/runs/shared/child-invocation.ts +74 -0
- package/src/runs/shared/child-message-validation.ts +233 -0
- package/src/runs/shared/child-native-accounting.ts +154 -0
- package/src/runs/shared/child-native-observation.ts +79 -0
- package/src/runs/shared/child-observation-spool.ts +188 -0
- package/src/runs/shared/child-observations.ts +219 -89
- package/src/runs/shared/child-presence.ts +6 -0
- package/src/runs/shared/child-route-env.ts +142 -0
- package/src/runs/shared/child-stream-observer.ts +302 -0
- package/src/runs/shared/child-stream-projection.ts +160 -0
- package/src/runs/shared/child-structured-tool.ts +38 -0
- package/src/runs/shared/claude-code.ts +201 -228
- package/src/runs/shared/claude-model.ts +67 -0
- package/src/runs/shared/claude-session.ts +124 -0
- package/src/runs/shared/claude-types.ts +31 -0
- package/src/runs/shared/completion-guard.ts +35 -26
- package/src/runs/shared/control-event-policy.ts +15 -0
- package/src/runs/shared/control-notification-owner.ts +20 -0
- package/src/runs/shared/dynamic-fanout.ts +402 -238
- package/src/runs/shared/dynamic-item.ts +114 -0
- package/src/runs/shared/history-index.ts +112 -51
- package/src/runs/shared/legacy-async-recovery.ts +153 -0
- package/src/runs/shared/legacy-output-recovery.ts +214 -0
- package/src/runs/shared/mcp-config-schema.ts +46 -0
- package/src/runs/shared/mcp-direct-tool-allowlist.ts +396 -307
- package/src/runs/shared/model-fallback.ts +302 -180
- package/src/runs/shared/mutating-tool-guard.ts +259 -158
- package/src/runs/shared/native-finalization-types.ts +29 -0
- package/src/runs/shared/native-finalization.ts +233 -109
- package/src/runs/shared/native-usage.ts +379 -96
- package/src/runs/shared/nested-control-records.ts +178 -0
- package/src/runs/shared/nested-events.ts +45 -752
- package/src/runs/shared/nested-path.ts +47 -34
- package/src/runs/shared/nested-projection.ts +230 -0
- package/src/runs/shared/nested-protocol.ts +67 -0
- package/src/runs/shared/nested-registry.ts +273 -0
- package/src/runs/shared/nested-render.ts +198 -100
- package/src/runs/shared/nested-route.ts +292 -0
- package/src/runs/shared/nested-validation.ts +291 -0
- package/src/runs/shared/owned-child-evidence.ts +184 -0
- package/src/runs/shared/owned-run-list.ts +187 -0
- package/src/runs/shared/owned-run-observation.ts +368 -0
- package/src/runs/shared/owned-run-progress.ts +172 -0
- package/src/runs/shared/owned-run-read-state.ts +7 -0
- package/src/runs/shared/owned-run-results.ts +289 -0
- package/src/runs/shared/owned-run-status.ts +239 -0
- package/src/runs/shared/owned-run-view.ts +65 -0
- package/src/runs/shared/owned-workflow-details.ts +24 -0
- package/src/runs/shared/owner-output.ts +73 -0
- package/src/runs/shared/parallel-utils.ts +93 -129
- package/src/runs/shared/parent-receipts.ts +177 -50
- package/src/runs/shared/parent-usage.ts +314 -91
- package/src/runs/shared/pi-args.ts +241 -311
- package/src/runs/shared/pi-launch-input.ts +48 -0
- package/src/runs/shared/pi-session-launch.ts +94 -0
- package/src/runs/shared/pi-spawn.ts +57 -33
- package/src/runs/shared/run-history-queries.ts +189 -38
- package/src/runs/shared/run-history.ts +197 -76
- package/src/runs/shared/run-id-ambiguity.ts +7 -3
- package/src/runs/shared/run-metadata-paths.ts +17 -0
- package/src/runs/shared/run-metadata.ts +240 -0
- package/src/runs/shared/run-persistence.ts +181 -0
- package/src/runs/shared/run-records.ts +19 -607
- package/src/runs/shared/run-restoration.ts +455 -0
- package/src/runs/shared/run-state-owner.ts +31 -0
- package/src/runs/shared/session-cwd-preload.ts +39 -19
- package/src/runs/shared/single-output.ts +358 -205
- package/src/runs/shared/stable-value.ts +15 -0
- package/src/runs/shared/streaming-text.ts +39 -12
- package/src/runs/shared/structured-output.ts +76 -46
- package/src/runs/shared/subagent-control.ts +330 -197
- package/src/runs/shared/subagent-prompt-runtime.ts +92 -174
- package/src/runs/shared/subagent-tool-loop-guard.ts +118 -68
- package/src/runs/shared/supervisor-question-state.ts +221 -0
- package/src/runs/shared/supervisor-questions.ts +396 -401
- package/src/runs/shared/workflow-graph.ts +400 -198
- package/src/runs/shared/workflow-policy.ts +245 -110
- package/src/runs/shared/worktree-contract.ts +29 -0
- package/src/runs/shared/worktree-hook.ts +181 -0
- package/src/runs/shared/worktree-location.ts +61 -0
- package/src/runs/shared/worktree-preservation.ts +10 -0
- package/src/runs/shared/worktree-process.ts +132 -0
- package/src/runs/shared/worktree.ts +459 -587
- package/src/shared/agent-context-policy.ts +176 -145
- package/src/shared/agent-dir.ts +15 -0
- package/src/shared/artifacts.ts +99 -68
- package/src/shared/atomic-json.ts +14 -11
- package/src/shared/chain-files.ts +72 -0
- package/src/shared/concurrency.ts +27 -0
- package/src/shared/content-preview.ts +117 -0
- package/src/shared/cooperative.ts +17 -13
- package/src/shared/execution-cwd.ts +34 -9
- package/src/shared/file-coalescer.ts +24 -22
- package/src/shared/fork-context.ts +52 -48
- package/src/shared/formatters.ts +88 -47
- package/src/shared/journal-frames.ts +197 -0
- package/src/shared/journal-projections.ts +133 -0
- package/src/shared/journal-reader.ts +18 -333
- package/src/shared/json-projection.ts +224 -0
- package/src/shared/lazy-tools.ts +76 -27
- package/src/shared/message-output.ts +146 -0
- package/src/shared/model-info.ts +94 -58
- package/src/shared/native-import.ts +25 -0
- package/src/shared/native-journal.ts +172 -0
- package/src/shared/native-session-loader.ts +13 -0
- package/src/shared/native-session.ts +3 -5
- package/src/shared/native-tui.ts +13 -3
- package/src/shared/native-typebox.ts +18 -3
- package/src/shared/output-page.ts +76 -0
- package/src/shared/post-exit-stdio-guard.ts +232 -172
- package/src/shared/prompt-sections.ts +13 -7
- package/src/shared/session-entries.ts +103 -44
- package/src/shared/session-identity.ts +17 -10
- package/src/shared/settings.ts +182 -367
- package/src/shared/status-format.ts +207 -98
- package/src/shared/stream-json.d.ts +10 -0
- package/src/shared/task-file-policy.ts +35 -0
- package/src/shared/temp-root.ts +122 -71
- package/src/shared/types/acceptance.ts +149 -0
- package/src/shared/types/async.ts +247 -0
- package/src/shared/types/config.ts +139 -0
- package/src/shared/types/details.ts +104 -0
- package/src/shared/types/history.ts +217 -0
- package/src/shared/types/inputs.ts +4 -0
- package/src/shared/types/intercom.ts +57 -0
- package/src/shared/types/launch.ts +39 -0
- package/src/shared/types/messages.ts +104 -0
- package/src/shared/types/nested.ts +153 -0
- package/src/shared/types/owned-runs.ts +148 -0
- package/src/shared/types/progress.ts +106 -0
- package/src/shared/types/questions.ts +103 -0
- package/src/shared/types/results.ts +119 -0
- package/src/shared/types/state.ts +56 -0
- package/src/shared/types/usage.ts +36 -0
- package/src/shared/types/workflow.ts +187 -0
- package/src/shared/types.ts +222 -1161
- package/src/shared/ui-mode.ts +1 -1
- package/src/shared/unknown.ts +59 -0
- package/src/shared/utils.ts +111 -305
- package/src/slash/command-discovery.ts +109 -0
- package/src/slash/command-input.ts +232 -0
- package/src/slash/prompt-template-bridge.ts +153 -400
- package/src/slash/prompt-template-contract.ts +152 -0
- package/src/slash/prompt-template-results.ts +189 -0
- package/src/slash/request-protocol.ts +87 -0
- package/src/slash/result-delivery.ts +312 -0
- package/src/slash/saved-chain.ts +115 -0
- package/src/slash/slash-bridge.ts +202 -156
- package/src/slash/slash-commands.ts +176 -598
- package/src/slash/slash-live-state.ts +287 -229
- package/src/tui/action-hints.ts +147 -61
- package/src/tui/activity-lines.ts +40 -0
- package/src/tui/agent-browser.ts +354 -0
- package/src/tui/agent-controls.ts +355 -0
- package/src/tui/agent-conversation.ts +514 -0
- package/src/tui/agent-dock.ts +250 -0
- package/src/tui/agent-history.ts +78 -203
- package/src/tui/agent-model.ts +78 -0
- package/src/tui/agent-picker.ts +325 -0
- package/src/tui/agent-view.ts +391 -1333
- package/src/tui/compact-results.ts +342 -0
- package/src/tui/conversation-details.ts +206 -0
- package/src/tui/conversation-frame.ts +184 -0
- package/src/tui/conversation-history.ts +246 -0
- package/src/tui/conversation-menu.ts +119 -0
- package/src/tui/conversation-notices.ts +116 -0
- package/src/tui/conversation-selection.ts +66 -0
- package/src/tui/conversation-viewport.ts +169 -0
- package/src/tui/direction-message.ts +35 -0
- package/src/tui/display.ts +409 -0
- package/src/tui/editor-viewport.ts +19 -0
- package/src/tui/expanded-content.ts +134 -0
- package/src/tui/expanded-multi.ts +264 -0
- package/src/tui/expanded-single.ts +92 -0
- package/src/tui/history-cards.ts +316 -0
- package/src/tui/history-display.ts +334 -0
- package/src/tui/history-json.ts +17 -0
- package/src/tui/history-metadata.ts +177 -0
- package/src/tui/history-record.ts +321 -0
- package/src/tui/history-text.ts +34 -0
- package/src/tui/indexed-history.ts +149 -0
- package/src/tui/nested-widget.ts +192 -0
- package/src/tui/picker-page.ts +80 -0
- package/src/tui/render.ts +100 -1546
- package/src/tui/result-facts.ts +99 -0
- package/src/tui/task-observation.ts +96 -0
- package/src/tui/task-store.ts +432 -0
- package/src/tui/text-values.ts +20 -0
- package/src/tui/view-connections.ts +64 -0
- package/src/tui/view-model.ts +181 -0
- package/src/tui/view-persistence.ts +57 -0
- package/src/tui/view-ports.ts +55 -0
- package/src/tui/view-session.ts +42 -0
- package/src/tui/widget-details.ts +220 -0
- package/src/tui/widget-status.ts +331 -0
- package/src/tui/widget.ts +208 -0
- package/src/tui/workflow-labels.ts +340 -0
- package/src/tui/workflow-outcomes.ts +150 -0
- package/tsconfig.build.json +11 -10
- package/tsconfig.json +30 -17
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { identity } from "./source-file.ts";
|
|
4
|
+
import type { SourceRow } from "./rows.ts";
|
|
5
|
+
|
|
6
|
+
interface WatchEvents {
|
|
7
|
+
readonly run: (id: string) => void;
|
|
8
|
+
readonly source: (id: string) => void;
|
|
9
|
+
readonly schedule: () => void;
|
|
10
|
+
}
|
|
11
|
+
/** Owns native handles, physical-directory identity and co-located run/source subscriptions. */
|
|
12
|
+
export class SourceWatches {
|
|
13
|
+
private readonly runs = new Set<string>();
|
|
14
|
+
private readonly watchers = new Map<string, fs.FSWatcher>();
|
|
15
|
+
private readonly sourceWatchers = new Map<string, fs.FSWatcher>();
|
|
16
|
+
private readonly identities = new WeakMap<fs.FSWatcher, string>();
|
|
17
|
+
private readonly sources = new Map<string, Map<string, string>>();
|
|
18
|
+
private readonly root: string;
|
|
19
|
+
private readonly events: WatchEvents;
|
|
20
|
+
constructor(agentDir: string, events: WatchEvents) {
|
|
21
|
+
this.root = path.join(agentDir, "sessions", "subagent-runs");
|
|
22
|
+
this.events = events;
|
|
23
|
+
}
|
|
24
|
+
private handle(
|
|
25
|
+
directory: string,
|
|
26
|
+
recursive: boolean,
|
|
27
|
+
listener: (name: string | null) => void,
|
|
28
|
+
source = false,
|
|
29
|
+
): void {
|
|
30
|
+
const handles = source ? this.sourceWatchers : this.watchers;
|
|
31
|
+
const existing = handles.get(directory);
|
|
32
|
+
try {
|
|
33
|
+
const physical = identity(fs.statSync(directory, { bigint: true }));
|
|
34
|
+
if (existing && this.identities.get(existing) === physical) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const watcher = fs.watch(directory, { recursive }, (event, name) => {
|
|
38
|
+
const filename = name?.toString() ?? null;
|
|
39
|
+
const selfRename = event === "rename" && filename === path.basename(directory);
|
|
40
|
+
if (selfRename && handles.get(directory) === watcher) {
|
|
41
|
+
this.identities.delete(watcher);
|
|
42
|
+
this.handle(directory, recursive, listener, source);
|
|
43
|
+
listener(null);
|
|
44
|
+
} else {
|
|
45
|
+
listener(filename);
|
|
46
|
+
}
|
|
47
|
+
if (!source) {
|
|
48
|
+
this.notifySources(directory, selfRename ? null : filename);
|
|
49
|
+
}
|
|
50
|
+
this.events.schedule();
|
|
51
|
+
});
|
|
52
|
+
this.identities.set(watcher, physical);
|
|
53
|
+
this.retireOnClose(directory, watcher, source);
|
|
54
|
+
handles.set(directory, watcher);
|
|
55
|
+
// Native close fences macOS re-registration; admit the replacement first.
|
|
56
|
+
existing?.close();
|
|
57
|
+
} catch {
|
|
58
|
+
if (existing && handles.get(directory) === existing) {
|
|
59
|
+
this.identities.delete(existing);
|
|
60
|
+
}
|
|
61
|
+
// Known-handle census recovers absent directories and dropped native watches.
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
private retireOnClose(directory: string, watcher: Readonly<fs.FSWatcher>, source: boolean): void {
|
|
65
|
+
const handles = source ? this.sourceWatchers : this.watchers;
|
|
66
|
+
const retire = () => {
|
|
67
|
+
if (handles.get(directory) === watcher) {
|
|
68
|
+
handles.delete(directory);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
watcher.on("error", () => {
|
|
72
|
+
watcher.close();
|
|
73
|
+
retire();
|
|
74
|
+
});
|
|
75
|
+
watcher.on("close", retire);
|
|
76
|
+
}
|
|
77
|
+
private reset(directory: string): void {
|
|
78
|
+
for (const handles of [this.watchers, this.sourceWatchers]) {
|
|
79
|
+
const watcher = handles.get(directory);
|
|
80
|
+
if (watcher) {
|
|
81
|
+
this.identities.delete(watcher);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
for (const id of this.sources.get(directory)?.keys() ?? []) {
|
|
85
|
+
this.events.source(id);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
private notifySources(directory: string, name: string | null): void {
|
|
89
|
+
for (const [id, filename] of this.sources.get(directory) ?? []) {
|
|
90
|
+
if (name === null || name.length === 0 || filename === name) {
|
|
91
|
+
this.events.source(id);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
sourceDirectory(directory: string): void {
|
|
96
|
+
if (!this.sources.has(directory) || this.watchers.has(directory)) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
this.handle(
|
|
100
|
+
directory,
|
|
101
|
+
false,
|
|
102
|
+
(name) => {
|
|
103
|
+
this.notifySources(directory, name);
|
|
104
|
+
},
|
|
105
|
+
true,
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
install(runIds: readonly string[], sources: readonly Pick<SourceRow, "id" | "path">[]): void {
|
|
109
|
+
for (const id of runIds) {
|
|
110
|
+
this.runs.add(id);
|
|
111
|
+
}
|
|
112
|
+
// Observe only admitted trees. Foreign run directory churn never causes a global scan.
|
|
113
|
+
this.handle(this.root, false, (name) => {
|
|
114
|
+
let ids: Iterable<string> = this.runs;
|
|
115
|
+
if (name !== null && name.length > 0) {
|
|
116
|
+
ids = this.runs.has(name) ? [name] : [];
|
|
117
|
+
}
|
|
118
|
+
for (const id of ids) {
|
|
119
|
+
this.reset(path.join(this.root, id));
|
|
120
|
+
this.events.run(id);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
for (const id of runIds) {
|
|
124
|
+
const directory = path.join(this.root, id);
|
|
125
|
+
this.handle(directory, true, (name) => {
|
|
126
|
+
if (name === null || name.length === 0) {
|
|
127
|
+
this.reset(directory);
|
|
128
|
+
}
|
|
129
|
+
this.events.run(id);
|
|
130
|
+
});
|
|
131
|
+
this.sourceDirectory(directory);
|
|
132
|
+
}
|
|
133
|
+
for (const source of sources) {
|
|
134
|
+
const directory = path.dirname(source.path);
|
|
135
|
+
let linked = this.sources.get(directory);
|
|
136
|
+
if (!linked) {
|
|
137
|
+
linked = new Map();
|
|
138
|
+
this.sources.set(directory, linked);
|
|
139
|
+
}
|
|
140
|
+
linked.set(source.id, path.basename(source.path));
|
|
141
|
+
this.sourceDirectory(directory);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
forget(source: Pick<SourceRow, "id" | "path">): void {
|
|
145
|
+
this.sources.get(path.dirname(source.path))?.delete(source.id);
|
|
146
|
+
}
|
|
147
|
+
close(): void {
|
|
148
|
+
for (const watcher of [...this.watchers.values(), ...this.sourceWatchers.values()]) {
|
|
149
|
+
watcher.close();
|
|
150
|
+
}
|
|
151
|
+
this.watchers.clear();
|
|
152
|
+
this.sourceWatchers.clear();
|
|
153
|
+
this.sources.clear();
|
|
154
|
+
this.runs.clear();
|
|
155
|
+
}
|
|
156
|
+
}
|
package/src/history/store.ts
CHANGED
|
@@ -1,203 +1,316 @@
|
|
|
1
|
-
import * as fs from "node:fs";
|
|
2
1
|
import * as path from "node:path";
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
import
|
|
2
|
+
import { openGeneration } from "./database-generation.ts";
|
|
3
|
+
import { OutputDigests } from "./output-digests.ts";
|
|
4
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
5
|
+
import { historyTransaction, openHistoryDatabase } from "./database.ts";
|
|
6
|
+
import { hash, safeText, hasText } from "./text.ts";
|
|
7
|
+
export { hash, exactTextDigest, safeText, integer, pageLimit } from "./text.ts";
|
|
8
|
+
import {
|
|
9
|
+
HistoryIndexError,
|
|
10
|
+
type HistoryEntry,
|
|
11
|
+
type HistoryFreshness,
|
|
12
|
+
type HistoryRunRow,
|
|
13
|
+
type HistoryVersion,
|
|
14
|
+
type HistoryIndexStatus,
|
|
15
|
+
} from "./types.ts";
|
|
16
|
+
import {
|
|
17
|
+
sourceRow,
|
|
18
|
+
indexRow,
|
|
19
|
+
type Row,
|
|
20
|
+
type IndexInput,
|
|
21
|
+
type SourceRow,
|
|
22
|
+
type EntryRow,
|
|
23
|
+
number,
|
|
24
|
+
text,
|
|
25
|
+
} from "./rows.ts";
|
|
26
|
+
import { parseObject, errorMessage } from "./values.ts";
|
|
10
27
|
|
|
11
|
-
export
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
export type { SourceRow, EntryRow } from "./rows.ts";
|
|
29
|
+
export class HistoryStore {
|
|
30
|
+
readonly db: DatabaseSync;
|
|
31
|
+
readonly generation: string;
|
|
32
|
+
readonly file: string;
|
|
33
|
+
readonly owner: string;
|
|
34
|
+
private readonly counters = {
|
|
35
|
+
sourceChecks: 0,
|
|
36
|
+
sourceOpens: 0,
|
|
37
|
+
sourceBytesRead: 0,
|
|
38
|
+
runProjections: 0,
|
|
39
|
+
queries: 0,
|
|
40
|
+
};
|
|
41
|
+
get operations(): Readonly<typeof this.counters> {
|
|
42
|
+
return { ...this.counters };
|
|
43
|
+
}
|
|
44
|
+
count(operation: keyof typeof this.counters, amount = 1): void {
|
|
45
|
+
this.counters[operation] += amount;
|
|
46
|
+
}
|
|
47
|
+
private ingestLock?: DatabaseSync;
|
|
48
|
+
private readonly outputDigests = new OutputDigests();
|
|
49
|
+
constructor(agentDir: string, owner: string) {
|
|
50
|
+
this.owner = owner;
|
|
51
|
+
const { db, file } = openGeneration(agentDir, owner);
|
|
52
|
+
this.db = db;
|
|
53
|
+
this.file = file;
|
|
54
|
+
try {
|
|
55
|
+
this.generation = text(
|
|
56
|
+
this.require("SELECT value FROM meta WHERE key='generation'"),
|
|
57
|
+
"value",
|
|
58
|
+
);
|
|
59
|
+
this.db.exec(
|
|
60
|
+
"CREATE TEMP TABLE pending_text(field TEXT, position INTEGER, end_position INTEGER, text TEXT)",
|
|
61
|
+
);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
this.db.close();
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
require(sql: string, ...params: readonly IndexInput[]): Row {
|
|
68
|
+
const row = this.get(sql, ...params);
|
|
69
|
+
if (!row) {
|
|
70
|
+
throw new HistoryIndexError("CORRUPT", "Missing required index row.");
|
|
71
|
+
}
|
|
72
|
+
return row;
|
|
73
|
+
}
|
|
74
|
+
get(sql: string, ...params: readonly IndexInput[]): Row | undefined {
|
|
75
|
+
const row = this.db.prepare(sql).get(...params);
|
|
76
|
+
return row === undefined ? undefined : indexRow(row);
|
|
77
|
+
}
|
|
78
|
+
all(sql: string, ...params: readonly IndexInput[]): readonly Row[] {
|
|
79
|
+
return this.db
|
|
80
|
+
.prepare(sql)
|
|
81
|
+
.all(...params)
|
|
82
|
+
.map(indexRow);
|
|
83
|
+
}
|
|
84
|
+
run(
|
|
85
|
+
sql: string,
|
|
86
|
+
...params: readonly IndexInput[]
|
|
87
|
+
): ReturnType<ReturnType<DatabaseSync["prepare"]>["run"]> {
|
|
88
|
+
return this.db.prepare(sql).run(...params);
|
|
89
|
+
}
|
|
90
|
+
deleteDocuments(sourceId: string, unpublishedOnly = false): void {
|
|
91
|
+
const where = `entry_rowid IN (SELECT rowid FROM entries WHERE source_id=?${unpublishedOnly ? " AND published=0" : ""})`;
|
|
92
|
+
this.run(
|
|
93
|
+
`DELETE FROM corpus WHERE rowid IN (SELECT id FROM documents WHERE ${where})`,
|
|
94
|
+
sourceId,
|
|
95
|
+
);
|
|
96
|
+
this.run(`DELETE FROM documents WHERE ${where}`, sourceId);
|
|
97
|
+
}
|
|
98
|
+
transaction<T>(work: () => T): T {
|
|
99
|
+
return historyTransaction(this.db, work);
|
|
100
|
+
}
|
|
101
|
+
bump(): void {
|
|
102
|
+
this.run("UPDATE meta SET value=CAST(value AS INTEGER)+1 WHERE key='version'");
|
|
103
|
+
this.run("UPDATE meta SET value=? WHERE key='indexedAt'", String(Date.now()));
|
|
104
|
+
}
|
|
105
|
+
source(id: string): SourceRow | undefined {
|
|
106
|
+
const row = this.get("SELECT * FROM sources WHERE id=?", id);
|
|
107
|
+
return row ? sourceRow(row) : undefined;
|
|
108
|
+
}
|
|
109
|
+
resetSource(id: string, state = "pending", error: string | null = null): void {
|
|
110
|
+
this.transaction(() => {
|
|
111
|
+
this.deleteDocuments(id);
|
|
112
|
+
this.run("DELETE FROM entries WHERE source_id=?", id);
|
|
113
|
+
this.run(
|
|
114
|
+
"UPDATE sources SET generation=generation+1,identity=NULL,stamp=NULL,session_id=NULL,header_digest=NULL,format_version=NULL,cursor=0,prefix_digest=NULL,state=?,error=?,malformed=0,complexity=0,checked_at=? WHERE id=?",
|
|
115
|
+
state,
|
|
116
|
+
error,
|
|
117
|
+
Date.now(),
|
|
118
|
+
id,
|
|
119
|
+
);
|
|
120
|
+
this.bump();
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
clearUnpublished(id: string): void {
|
|
124
|
+
this.transaction(() => {
|
|
125
|
+
this.deleteDocuments(id, true);
|
|
126
|
+
this.run("DELETE FROM entries WHERE source_id=? AND published=0", id);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
putView(view: HistoryRunRow, full: HistoryRunRow = view): void {
|
|
130
|
+
const attention = attentionRank(view);
|
|
131
|
+
const json = JSON.stringify(view),
|
|
132
|
+
filters = new Map(
|
|
133
|
+
full.children.map((child) => [
|
|
134
|
+
child.index,
|
|
135
|
+
safeText(
|
|
136
|
+
`${child.agent} ${child.label ?? ""} ${child.task ?? full.task}`,
|
|
137
|
+
Infinity,
|
|
138
|
+
).toLowerCase(),
|
|
139
|
+
]),
|
|
140
|
+
);
|
|
141
|
+
const filterText = safeText(
|
|
142
|
+
`${full.task} ${[...filters.values()].join(" ")}`,
|
|
143
|
+
Infinity,
|
|
144
|
+
).toLowerCase();
|
|
145
|
+
const digests = new Map(
|
|
146
|
+
full.children.map((child) => [child.index, this.outputDigests.read(child.result)]),
|
|
147
|
+
);
|
|
148
|
+
const saved = this.get("SELECT view,filter_text FROM runs WHERE id=?", view.runId);
|
|
149
|
+
if (
|
|
150
|
+
saved?.view === json &&
|
|
151
|
+
saved.filter_text === filterText &&
|
|
152
|
+
this.all("SELECT child_index,output_digest FROM children WHERE run_id=?", view.runId).every(
|
|
153
|
+
(child) => child.output_digest === digests.get(number(child, "child_index")),
|
|
154
|
+
)
|
|
155
|
+
) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
this.transaction(() => {
|
|
159
|
+
this.run(
|
|
160
|
+
"INSERT INTO runs VALUES (?,?,?,?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET attention=excluded.attention,updated=excluded.updated,negative_updated=excluded.negative_updated,state=excluded.state,filter_text=excluded.filter_text,view=excluded.view,predecessor_id=excluded.predecessor_id,predecessor_index=excluded.predecessor_index",
|
|
161
|
+
view.runId,
|
|
162
|
+
attention,
|
|
163
|
+
view.updatedAt,
|
|
164
|
+
-view.updatedAt,
|
|
165
|
+
view.state,
|
|
166
|
+
filterText,
|
|
167
|
+
json,
|
|
168
|
+
view.predecessorRunId ?? null,
|
|
169
|
+
view.predecessorIndex ?? 0,
|
|
170
|
+
);
|
|
171
|
+
this.putChildren(view, filters, digests);
|
|
172
|
+
this.bump();
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
private putChildren(
|
|
176
|
+
view: HistoryRunRow,
|
|
177
|
+
filters: Readonly<ReadonlyMap<number, string>>,
|
|
178
|
+
digests: Readonly<ReadonlyMap<number, string | null>>,
|
|
179
|
+
): void {
|
|
180
|
+
this.run("DELETE FROM children WHERE run_id=?", view.runId);
|
|
181
|
+
for (const child of view.children) {
|
|
182
|
+
let source: string | null = null;
|
|
183
|
+
if (hasText(child.sessionFile)) {
|
|
184
|
+
const file = path.resolve(child.sessionFile);
|
|
185
|
+
source = hash(file);
|
|
186
|
+
this.run(
|
|
187
|
+
"INSERT INTO sources(id,path) VALUES (?,?) ON CONFLICT(id) DO NOTHING",
|
|
188
|
+
source,
|
|
189
|
+
file,
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
const terminal = child.state !== "live" && child.state !== "unknown";
|
|
193
|
+
const boundary = terminalBoundary(child, view.updatedAt, terminal);
|
|
194
|
+
this.run(
|
|
195
|
+
"INSERT INTO children VALUES (?,?,?,?,?,?,?,?)",
|
|
196
|
+
view.runId,
|
|
197
|
+
child.index,
|
|
198
|
+
child.agent,
|
|
199
|
+
source,
|
|
200
|
+
filters.get(child.index) ?? "",
|
|
201
|
+
digests.get(child.index) ?? null,
|
|
202
|
+
boundary.entry,
|
|
203
|
+
boundary.endedAt,
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
info(pending: number, projectionErrors = 0): HistoryVersion {
|
|
208
|
+
const sources = this.require(
|
|
209
|
+
"SELECT COUNT(*) AS total,SUM(state IN ('pending','indexing')) AS pending,SUM(state IN ('degraded','missing','error')) AS errors FROM sources WHERE id IN (SELECT source_id FROM children)",
|
|
210
|
+
);
|
|
211
|
+
const indexedAtValue = Number(
|
|
212
|
+
text(this.require("SELECT value FROM meta WHERE key='indexedAt'"), "value"),
|
|
213
|
+
);
|
|
214
|
+
const indexedAt = indexedAtValue === 0 ? null : indexedAtValue;
|
|
215
|
+
const errors = Number(sources.errors ?? 0) + projectionErrors;
|
|
216
|
+
const remaining = pending + Number(sources.pending ?? 0);
|
|
217
|
+
const freshness: HistoryFreshness = {
|
|
218
|
+
authoritative: false,
|
|
219
|
+
state: freshnessState(remaining, errors),
|
|
220
|
+
pending: remaining,
|
|
221
|
+
errors,
|
|
222
|
+
indexedAt,
|
|
223
|
+
};
|
|
224
|
+
return {
|
|
225
|
+
version: Number(text(this.require("SELECT value FROM meta WHERE key='version'"), "value")),
|
|
226
|
+
indexedAt,
|
|
227
|
+
freshness,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
status(pending: number): HistoryIndexStatus {
|
|
231
|
+
return {
|
|
232
|
+
...this.info(pending),
|
|
233
|
+
databaseFile: this.file,
|
|
234
|
+
physicalSources: number(this.require("SELECT COUNT(*) AS count FROM sources"), "count"),
|
|
235
|
+
publishedEntries: number(
|
|
236
|
+
this.require("SELECT COUNT(*) AS count FROM entries WHERE published=1"),
|
|
237
|
+
"count",
|
|
238
|
+
),
|
|
239
|
+
operations: this.operations,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
entry(row: EntryRow): HistoryEntry {
|
|
243
|
+
return {
|
|
244
|
+
id: row.id,
|
|
245
|
+
nativeId: row.native_id,
|
|
246
|
+
parentId: row.parent_id,
|
|
247
|
+
sequence: row.start,
|
|
248
|
+
timestamp: row.timestamp,
|
|
249
|
+
type: row.type,
|
|
250
|
+
ref: {
|
|
251
|
+
sourceId: row.source_id,
|
|
252
|
+
generation: row.generation,
|
|
253
|
+
start: row.start,
|
|
254
|
+
end: row.end,
|
|
255
|
+
digest: row.digest,
|
|
256
|
+
},
|
|
257
|
+
entry: parseObject(row.preview),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/** A separate SQLite transaction serializes incremental staging without blocking browse queries.
|
|
261
|
+
* SQLite releases it on process death; no PID lease, expiry, or stale-file deletion is needed. */
|
|
262
|
+
beginIngest(): void {
|
|
263
|
+
if (!this.ingestLock) {
|
|
264
|
+
this.ingestLock = openHistoryDatabase(`${this.file}.ingest.sqlite`);
|
|
265
|
+
this.ingestLock.exec("PRAGMA busy_timeout=0");
|
|
266
|
+
}
|
|
267
|
+
try {
|
|
268
|
+
this.ingestLock.exec("BEGIN IMMEDIATE");
|
|
269
|
+
} catch (error) {
|
|
270
|
+
if (/locked|busy/i.test(errorMessage(error))) {
|
|
271
|
+
throw new HistoryIndexError("INDEX_BUSY", "Another worker is indexing this generation.");
|
|
272
|
+
}
|
|
273
|
+
throw error;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
endIngest(): void {
|
|
277
|
+
if (this.ingestLock?.isTransaction === true) {
|
|
278
|
+
this.ingestLock.exec("ROLLBACK");
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
close(): void {
|
|
282
|
+
this.ingestLock?.close();
|
|
283
|
+
this.db.close();
|
|
284
|
+
}
|
|
28
285
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
286
|
+
function terminalBoundary(
|
|
287
|
+
child: HistoryRunRow["children"][number],
|
|
288
|
+
updatedAt: number,
|
|
289
|
+
terminal: boolean,
|
|
290
|
+
): { readonly entry: string | null; readonly endedAt: number | null } {
|
|
291
|
+
if (!terminal) {
|
|
292
|
+
return { entry: null, endedAt: null };
|
|
293
|
+
}
|
|
294
|
+
return {
|
|
295
|
+
entry: child.result?.terminalEntryId ?? null,
|
|
296
|
+
endedAt: hasText(child.result?.terminalEntryId) ? null : updatedAt,
|
|
297
|
+
};
|
|
34
298
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const manifest = path.join(directory, `${hash(owner)}.json`);
|
|
47
|
-
let name: string | undefined;
|
|
48
|
-
try {
|
|
49
|
-
const saved = JSON.parse(fs.readFileSync(manifest, "utf8"));
|
|
50
|
-
if (typeof saved.file === "string" && /^[a-f0-9-]+\.sqlite$/.test(saved.file)) name = saved.file;
|
|
51
|
-
} catch (error) { if ((error as NodeJS.ErrnoException).code !== "ENOENT" && !(error instanceof SyntaxError)) throw error; }
|
|
52
|
-
let db: DatabaseSync | undefined;
|
|
53
|
-
if (name) {
|
|
54
|
-
try {
|
|
55
|
-
const file = path.join(directory, name);
|
|
56
|
-
if (!fs.existsSync(file) || fs.lstatSync(file).isSymbolicLink()) throw new HistoryIndexError("CORRUPT", "Invalid index generation.");
|
|
57
|
-
db = openHistoryDatabase(file);
|
|
58
|
-
if (db.prepare("PRAGMA user_version").get()?.user_version !== 5) throw new HistoryIndexError("CORRUPT", "Invalid index schema.");
|
|
59
|
-
db.prepare("SELECT value FROM meta WHERE key='generation'").get();
|
|
60
|
-
} catch (error) {
|
|
61
|
-
db?.close(); db = undefined;
|
|
62
|
-
if (!isCorruption(error)) throw error;
|
|
63
|
-
name = undefined;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
if (!name) {
|
|
67
|
-
name = `${randomUUID()}.sqlite`;
|
|
68
|
-
db = openHistoryDatabase(path.join(directory, name));
|
|
69
|
-
this.schema(db);
|
|
70
|
-
const temporary = `${manifest}.${process.pid}.${randomUUID()}`;
|
|
71
|
-
fs.writeFileSync(temporary, JSON.stringify({ file: name }), { mode: 0o600 });
|
|
72
|
-
fs.renameSync(temporary, manifest);
|
|
73
|
-
// Never rename/unlink an open SQLite generation or separate its WAL. Old corrupt
|
|
74
|
-
// generations remain private for diagnosis; the manifest selects the new projection.
|
|
75
|
-
}
|
|
76
|
-
this.db = db!; this.file = path.join(directory, name!);
|
|
77
|
-
fs.chmodSync(this.file, 0o600);
|
|
78
|
-
for (const suffix of ["-wal", "-shm"]) if (fs.existsSync(this.file + suffix)) fs.chmodSync(this.file + suffix, 0o600);
|
|
79
|
-
this.generation = String(this.get("SELECT value FROM meta WHERE key='generation'")!.value);
|
|
80
|
-
this.db.exec("CREATE TEMP TABLE pending_text(field TEXT, position INTEGER, end_position INTEGER, text TEXT)");
|
|
81
|
-
}
|
|
82
|
-
private schema(db: DatabaseSync): void {
|
|
83
|
-
db.exec(`
|
|
84
|
-
CREATE TABLE meta(key TEXT PRIMARY KEY,value TEXT NOT NULL);
|
|
85
|
-
INSERT INTO meta VALUES ('generation','${randomUUID()}'),('version','0'),('indexedAt','0');
|
|
86
|
-
CREATE TABLE runs(id TEXT PRIMARY KEY,attention INTEGER NOT NULL,updated INTEGER NOT NULL,negative_updated INTEGER NOT NULL,state TEXT NOT NULL,filter_text TEXT NOT NULL,view TEXT NOT NULL,predecessor_id TEXT,predecessor_index INTEGER);
|
|
87
|
-
CREATE INDEX runs_predecessor ON runs(predecessor_id,predecessor_index);
|
|
88
|
-
CREATE INDEX runs_attention ON runs(attention,negative_updated,id);
|
|
89
|
-
CREATE INDEX runs_newest ON runs(negative_updated,id);
|
|
90
|
-
CREATE INDEX runs_oldest ON runs(updated,id);
|
|
91
|
-
CREATE INDEX runs_state ON runs(state,attention,negative_updated,id);
|
|
92
|
-
CREATE TABLE sources(id TEXT PRIMARY KEY,path TEXT NOT NULL UNIQUE,generation INTEGER NOT NULL DEFAULT 1,identity TEXT,stamp TEXT,session_id TEXT,header_digest TEXT,cursor INTEGER NOT NULL DEFAULT 0,prefix_digest TEXT,state TEXT NOT NULL DEFAULT 'pending',error TEXT,malformed INTEGER NOT NULL DEFAULT 0,complexity INTEGER NOT NULL DEFAULT 0,checked_at INTEGER,format_version INTEGER);
|
|
93
|
-
CREATE TABLE children(run_id TEXT NOT NULL REFERENCES runs(id) ON DELETE CASCADE,child_index INTEGER NOT NULL,agent TEXT NOT NULL,source_id TEXT REFERENCES sources(id),filter_text TEXT NOT NULL,output_digest TEXT,terminal_entry_id TEXT,ended_at INTEGER,PRIMARY KEY(run_id,child_index));
|
|
94
|
-
CREATE INDEX children_source ON children(source_id);
|
|
95
|
-
CREATE INDEX children_agent ON children(agent,run_id);
|
|
96
|
-
CREATE TABLE entries(rowid INTEGER PRIMARY KEY,source_id TEXT NOT NULL REFERENCES sources(id),generation INTEGER NOT NULL,id TEXT NOT NULL,native_id TEXT,parent_id TEXT,start INTEGER NOT NULL,end INTEGER NOT NULL,digest TEXT NOT NULL,timestamp INTEGER,type TEXT NOT NULL,preview TEXT NOT NULL,published INTEGER NOT NULL DEFAULT 0,role TEXT,assistant_text INTEGER NOT NULL DEFAULT 0,visible_id TEXT,human_id TEXT,configuration_model TEXT,configuration_thinking TEXT,UNIQUE(source_id,generation,id),UNIQUE(source_id,generation,start));
|
|
97
|
-
CREATE INDEX entries_page ON entries(source_id,generation,published,start);
|
|
98
|
-
CREATE INDEX entries_time ON entries(source_id,generation,published,timestamp,start);
|
|
99
|
-
CREATE INDEX entries_human ON entries(source_id,generation,human_id,start);
|
|
100
|
-
CREATE TABLE answers(entry_rowid INTEGER NOT NULL REFERENCES entries(rowid) ON DELETE CASCADE,digest TEXT NOT NULL,item_id TEXT NOT NULL,PRIMARY KEY(entry_rowid,digest));
|
|
101
|
-
CREATE INDEX answers_digest ON answers(digest,entry_rowid);
|
|
102
|
-
CREATE TABLE tools(entry_rowid INTEGER NOT NULL REFERENCES entries(rowid) ON DELETE CASCADE,source_id TEXT NOT NULL,generation INTEGER NOT NULL,call_id TEXT NOT NULL,kind TEXT NOT NULL);
|
|
103
|
-
CREATE INDEX tools_lookup ON tools(source_id,generation,call_id,kind);
|
|
104
|
-
CREATE TABLE documents(id INTEGER PRIMARY KEY,entry_rowid INTEGER NOT NULL REFERENCES entries(rowid) ON DELETE CASCADE,field TEXT NOT NULL,text_start INTEGER NOT NULL,text_end INTEGER NOT NULL,preview TEXT NOT NULL);
|
|
105
|
-
CREATE INDEX documents_entry ON documents(entry_rowid);
|
|
106
|
-
CREATE VIRTUAL TABLE corpus USING fts5(text,content='',contentless_delete=1,tokenize='unicode61');
|
|
107
|
-
PRAGMA user_version=5;
|
|
108
|
-
`);
|
|
109
|
-
}
|
|
110
|
-
get(sql: string, ...params: SQLInputValue[]): any { return this.db.prepare(sql).get(...params); }
|
|
111
|
-
all(sql: string, ...params: SQLInputValue[]): any[] { return this.db.prepare(sql).all(...params); }
|
|
112
|
-
run(sql: string, ...params: SQLInputValue[]): ReturnType<ReturnType<DatabaseSync["prepare"]>["run"]> { return this.db.prepare(sql).run(...params); }
|
|
113
|
-
deleteDocuments(sourceId: string, unpublishedOnly = false): void {
|
|
114
|
-
const where = `entry_rowid IN (SELECT rowid FROM entries WHERE source_id=?${unpublishedOnly ? " AND published=0" : ""})`;
|
|
115
|
-
this.run(`DELETE FROM corpus WHERE rowid IN (SELECT id FROM documents WHERE ${where})`, sourceId);
|
|
116
|
-
this.run(`DELETE FROM documents WHERE ${where}`, sourceId);
|
|
117
|
-
}
|
|
118
|
-
transaction<T>(work: () => T): T { return historyTransaction(this.db, work); }
|
|
119
|
-
bump(): void { this.run("UPDATE meta SET value=CAST(value AS INTEGER)+1 WHERE key='version'"); this.run("UPDATE meta SET value=? WHERE key='indexedAt'", String(Date.now())); }
|
|
120
|
-
source(id: string): SourceRow | undefined { return this.get("SELECT * FROM sources WHERE id=?", id); }
|
|
121
|
-
resetSource(id: string, state = "pending", error: string | null = null): void {
|
|
122
|
-
this.transaction(() => {
|
|
123
|
-
this.deleteDocuments(id);
|
|
124
|
-
this.run("DELETE FROM entries WHERE source_id=?", id);
|
|
125
|
-
this.run("UPDATE sources SET generation=generation+1,identity=NULL,stamp=NULL,session_id=NULL,header_digest=NULL,format_version=NULL,cursor=0,prefix_digest=NULL,state=?,error=?,malformed=0,complexity=0,checked_at=? WHERE id=?", state, error, Date.now(), id);
|
|
126
|
-
this.bump();
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
clearUnpublished(id: string): void {
|
|
130
|
-
this.transaction(() => {
|
|
131
|
-
this.deleteDocuments(id, true);
|
|
132
|
-
this.run("DELETE FROM entries WHERE source_id=? AND published=0", id);
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
private outputDigest(result: HistoryRunRow["children"][number]["result"]): string | null {
|
|
136
|
-
if (!result) return null;
|
|
137
|
-
if (!result.fullOutputPath) return typeof result.finalOutput === "string" && result.finalOutput.length !== 8192 && !result.truncation?.truncated ? exactTextDigest(result.finalOutput) : null;
|
|
138
|
-
try {
|
|
139
|
-
const stat = fs.statSync(result.fullOutputPath, { bigint: true });
|
|
140
|
-
if (!stat.isFile() || stat.size > 16n * 1024n * 1024n) return null;
|
|
141
|
-
const stamp = `${stat.dev}:${stat.ino}:${stat.size}:${stat.mtimeNs}:${stat.ctimeNs}`;
|
|
142
|
-
const cached = this.outputDigests.get(result.fullOutputPath);
|
|
143
|
-
if (cached?.stamp === stamp) return cached.digest;
|
|
144
|
-
const text = readSavedOutput(result.fullOutputPath);
|
|
145
|
-
const digest = exactTextDigest(text);
|
|
146
|
-
this.outputDigests.set(result.fullOutputPath, { stamp, digest });
|
|
147
|
-
return digest;
|
|
148
|
-
} catch { return null; }
|
|
149
|
-
}
|
|
150
|
-
putView(view: HistoryRunRow, full: HistoryRunRow = view): void {
|
|
151
|
-
const attention = view.attention.includes("awaiting_input") ? 0 : view.attention.some((reason) => reason !== "unreviewed") ? 1 : view.state === "live" ? 2 : view.attention.length ? 3 : 4;
|
|
152
|
-
const json = JSON.stringify(view), filters = new Map(full.children.map((child) => [child.index, safeText(`${child.agent} ${child.label ?? ""} ${child.task ?? full.task}`, Infinity).toLowerCase()]));
|
|
153
|
-
const filterText = safeText(`${full.task} ${[...filters.values()].join(" ")}`, Infinity).toLowerCase();
|
|
154
|
-
const digests = new Map(full.children.map((child) => [child.index, this.outputDigest(child.result)]));
|
|
155
|
-
const saved = this.get("SELECT view,filter_text FROM runs WHERE id=?", view.runId);
|
|
156
|
-
if (saved?.view === json && saved.filter_text === filterText && this.all("SELECT child_index,output_digest FROM children WHERE run_id=?", view.runId).every((child) => child.output_digest === digests.get(child.child_index))) return;
|
|
157
|
-
this.transaction(() => {
|
|
158
|
-
this.run("INSERT INTO runs VALUES (?,?,?,?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET attention=excluded.attention,updated=excluded.updated,negative_updated=excluded.negative_updated,state=excluded.state,filter_text=excluded.filter_text,view=excluded.view,predecessor_id=excluded.predecessor_id,predecessor_index=excluded.predecessor_index", view.runId, attention, view.updatedAt, -view.updatedAt, view.state, filterText, json, view.predecessorRunId ?? null, view.predecessorIndex ?? 0);
|
|
159
|
-
this.run("DELETE FROM children WHERE run_id=?", view.runId);
|
|
160
|
-
for (const child of view.children) {
|
|
161
|
-
let source: string | null = null;
|
|
162
|
-
if (child.sessionFile) {
|
|
163
|
-
const file = path.resolve(child.sessionFile); source = hash(file);
|
|
164
|
-
this.run("INSERT INTO sources(id,path) VALUES (?,?) ON CONFLICT(id) DO NOTHING", source, file);
|
|
165
|
-
}
|
|
166
|
-
const terminal = child.state !== "live" && child.state !== "unknown";
|
|
167
|
-
this.run("INSERT INTO children VALUES (?,?,?,?,?,?,?,?)", view.runId, child.index, child.agent, source, filters.get(child.index) ?? "", digests.get(child.index) ?? null,
|
|
168
|
-
terminal ? child.result?.terminalEntryId ?? null : null, terminal && !child.result?.terminalEntryId ? view.updatedAt : null);
|
|
169
|
-
}
|
|
170
|
-
this.bump();
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
info(pending: number): HistoryVersion {
|
|
174
|
-
const sources = this.get("SELECT COUNT(*) AS total,SUM(state IN ('pending','indexing')) AS pending,SUM(state IN ('degraded','missing','error')) AS errors FROM sources WHERE id IN (SELECT source_id FROM children)");
|
|
175
|
-
const indexedAt = Number(this.get("SELECT value FROM meta WHERE key='indexedAt'").value) || null;
|
|
176
|
-
const errors = Number(sources.errors ?? 0);
|
|
177
|
-
const remaining = pending + Number(sources.pending ?? 0);
|
|
178
|
-
const freshness: HistoryFreshness = { authoritative: false, state: remaining ? "catching-up" : errors ? "degraded" : "current", pending: remaining, errors, indexedAt };
|
|
179
|
-
return { version: Number(this.get("SELECT value FROM meta WHERE key='version'").value), indexedAt, freshness };
|
|
180
|
-
}
|
|
181
|
-
entry(row: EntryRow): HistoryEntry {
|
|
182
|
-
return { id: row.id, nativeId: row.native_id, parentId: row.parent_id, sequence: row.start, timestamp: row.timestamp, type: row.type,
|
|
183
|
-
ref: { sourceId: row.source_id, generation: row.generation, start: row.start, end: row.end, digest: row.digest }, entry: JSON.parse(row.preview) };
|
|
184
|
-
}
|
|
185
|
-
/** A separate SQLite transaction serializes incremental staging without blocking browse queries.
|
|
186
|
-
* SQLite releases it on process death; no PID lease, expiry, or stale-file deletion is needed. */
|
|
187
|
-
beginIngest(): void {
|
|
188
|
-
if (!this.ingestLock) {
|
|
189
|
-
this.ingestLock = openHistoryDatabase(`${this.file}.ingest.sqlite`);
|
|
190
|
-
this.ingestLock.exec("PRAGMA busy_timeout=0");
|
|
191
|
-
}
|
|
192
|
-
try { this.ingestLock.exec("BEGIN IMMEDIATE"); }
|
|
193
|
-
catch (error) {
|
|
194
|
-
if (/locked|busy/i.test(String((error as Error).message))) throw new HistoryIndexError("INDEX_BUSY", "Another worker is indexing this generation.");
|
|
195
|
-
throw error;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
endIngest(): void { if (this.ingestLock?.isTransaction) this.ingestLock.exec("ROLLBACK"); }
|
|
199
|
-
close(): void { this.ingestLock?.close(); this.db.close(); }
|
|
299
|
+
function attentionRank(view: HistoryRunRow): number {
|
|
300
|
+
if (view.attention.includes("awaiting_input")) {
|
|
301
|
+
return 0;
|
|
302
|
+
}
|
|
303
|
+
if (view.attention.some((reason) => reason !== "unreviewed")) {
|
|
304
|
+
return 1;
|
|
305
|
+
}
|
|
306
|
+
if (view.state === "live") {
|
|
307
|
+
return 2;
|
|
308
|
+
}
|
|
309
|
+
return view.attention.length > 0 ? 3 : 4;
|
|
200
310
|
}
|
|
201
|
-
function
|
|
202
|
-
|
|
311
|
+
function freshnessState(pending: number, errors: number): HistoryFreshness["state"] {
|
|
312
|
+
if (pending > 0) {
|
|
313
|
+
return "catching-up";
|
|
314
|
+
}
|
|
315
|
+
return errors > 0 ? "degraded" : "current";
|
|
203
316
|
}
|