@gajae-code/coding-agent 0.13.3 → 0.14.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 +184 -2
- package/README.md +2 -0
- package/bin/gajaessi.js +4 -0
- package/dist/types/async/job-manager.d.ts +55 -2
- package/dist/types/async/support.d.ts +14 -0
- package/dist/types/capability/mcp.d.ts +6 -0
- package/dist/types/capability/types.d.ts +6 -0
- package/dist/types/cli/accounts-cli.d.ts +19 -0
- package/dist/types/cli/args.d.ts +3 -0
- package/dist/types/cli/config-cli.d.ts +6 -0
- package/dist/types/cli/crash-cli.d.ts +10 -0
- package/dist/types/cli/customize-doctor.d.ts +145 -0
- package/dist/types/cli/daemon-cli.d.ts +3 -1
- package/dist/types/cli/mcp-cli.d.ts +11 -0
- package/dist/types/cli/notify-cli.d.ts +1 -1
- package/dist/types/cli/root-flags.d.ts +12 -0
- package/dist/types/cli/setup-cli.d.ts +3 -1
- package/dist/types/cli/skills-cli.d.ts +2 -1
- package/dist/types/cli/update-cli.d.ts +19 -1
- package/dist/types/cli.d.ts +6 -0
- package/dist/types/commands/accounts.d.ts +40 -0
- package/dist/types/commands/crash.d.ts +24 -0
- package/dist/types/commands/customize.d.ts +22 -0
- package/dist/types/commands/daemon.d.ts +1 -1
- package/dist/types/commands/launch.d.ts +6 -0
- package/dist/types/commands/setup.d.ts +6 -0
- package/dist/types/commands/skills.d.ts +6 -1
- package/dist/types/commands/update.d.ts +7 -0
- package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
- package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
- package/dist/types/config/config-schema-version.d.ts +10 -0
- package/dist/types/config/file-lock.d.ts +18 -0
- package/dist/types/config/model-profile-activation.d.ts +3 -1
- package/dist/types/config/model-registry.d.ts +9 -1
- package/dist/types/config/models-config-schema.d.ts +2 -0
- package/dist/types/config/settings-schema.d.ts +70 -6
- package/dist/types/config/settings.d.ts +63 -0
- package/dist/types/config/skill-settings-defaults.d.ts +26 -0
- package/dist/types/config/task-delegation.d.ts +39 -0
- package/dist/types/config/update-channel.d.ts +10 -0
- package/dist/types/coordinator-mcp/server.d.ts +5 -1
- package/dist/types/crash/index-store.d.ts +87 -0
- package/dist/types/crash/nudge.d.ts +50 -0
- package/dist/types/crash/record-loader.d.ts +17 -0
- package/dist/types/crash/report.d.ts +134 -0
- package/dist/types/crash/sanitize.d.ts +25 -0
- package/dist/types/cursor.d.ts +13 -2
- package/dist/types/customization/import.d.ts +37 -0
- package/dist/types/customization/index.d.ts +4 -0
- package/dist/types/customization/inventory.d.ts +25 -0
- package/dist/types/customization/mutations.d.ts +32 -0
- package/dist/types/customization/types.d.ts +115 -0
- package/dist/types/daemon/control-types.d.ts +8 -1
- package/dist/types/daemon/operator-contract.d.ts +4 -4
- package/dist/types/discovery/claude.d.ts +39 -1
- package/dist/types/discovery/codex.d.ts +39 -1
- package/dist/types/discovery/index.d.ts +2 -0
- package/dist/types/discovery/mcp-compat.d.ts +30 -0
- package/dist/types/edit/renderer.d.ts +23 -0
- package/dist/types/extensibility/extensions/runner.d.ts +3 -0
- package/dist/types/extensibility/extensions/types.d.ts +21 -4
- package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
- package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
- package/dist/types/extensibility/hooks/loader.d.ts +19 -5
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
- package/dist/types/extensibility/skill-management.d.ts +107 -0
- package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
- package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
- package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
- package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
- package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
- package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
- package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
- package/dist/types/hooks/events.d.ts +60 -0
- package/dist/types/hooks/normalize.d.ts +83 -0
- package/dist/types/hooks/skill-state.d.ts +9 -2
- package/dist/types/main.d.ts +1 -1
- package/dist/types/modes/acp/abort-scope.d.ts +13 -0
- package/dist/types/modes/acp/acp-agent.d.ts +7 -4
- package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
- package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
- package/dist/types/modes/components/customization/index.d.ts +1 -0
- package/dist/types/modes/components/gajae-pet-widget.d.ts +8 -30
- package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
- package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
- package/dist/types/modes/components/oauth-selector.d.ts +10 -4
- package/dist/types/modes/components/pet-capability.d.ts +11 -25
- package/dist/types/modes/components/status-line/gh.d.ts +6 -2
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
- package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
- package/dist/types/modes/interactive-mode.d.ts +1 -0
- package/dist/types/modes/types.d.ts +1 -0
- package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
- package/dist/types/runtime-mcp/config.d.ts +9 -0
- package/dist/types/runtime-mcp/manager.d.ts +26 -1
- package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
- package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
- package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
- package/dist/types/runtime-mcp/protocol.d.ts +278 -0
- package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
- package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
- package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
- package/dist/types/runtime-mcp/types.d.ts +102 -10
- package/dist/types/sdk/acp/adapter.d.ts +26 -5
- package/dist/types/sdk/broker/broker.d.ts +3 -55
- package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
- package/dist/types/sdk/broker/session-index.d.ts +14 -5
- package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
- package/dist/types/sdk/bus/config.d.ts +11 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
- package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
- package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
- package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
- package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
- package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
- package/dist/types/sdk/bus/index.d.ts +85 -99
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
- package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
- package/dist/types/sdk/bus/notification-service.d.ts +52 -0
- package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
- package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
- package/dist/types/sdk/bus/session-control.d.ts +25 -1
- package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
- package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
- package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
- package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
- package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
- package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
- package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
- package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
- package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
- package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
- package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
- package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
- package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
- package/dist/types/sdk/cli/rows.d.ts +2 -11
- package/dist/types/sdk/cli/session-cli.d.ts +15 -25
- package/dist/types/sdk/client/client.d.ts +97 -1
- package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
- package/dist/types/sdk/host/control/index.d.ts +1 -1
- package/dist/types/sdk/host/control/operations.d.ts +18 -5
- package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
- package/dist/types/sdk/host/host.d.ts +15 -1
- package/dist/types/sdk/host/query/handlers.d.ts +5 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
- package/dist/types/sdk/host/session-runtime.d.ts +127 -7
- package/dist/types/sdk/host/types.d.ts +1 -1
- package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
- package/dist/types/sdk/index.d.ts +2 -1
- package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
- package/dist/types/sdk/lifecycle/client.d.ts +59 -0
- package/dist/types/sdk/lifecycle/index.d.ts +3 -0
- package/dist/types/sdk/lifecycle/service.d.ts +232 -0
- package/dist/types/sdk/mcp/server.d.ts +9 -6
- package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
- package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
- package/dist/types/sdk/prompt-status.d.ts +10 -3
- package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
- package/dist/types/sdk/receipt-state.d.ts +17 -0
- package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
- package/dist/types/sdk/router/index.d.ts +1 -0
- package/dist/types/sdk/router/session-router.d.ts +152 -0
- package/dist/types/sdk/session-list.d.ts +22 -0
- package/dist/types/sdk/session-reconnect.d.ts +43 -1
- package/dist/types/sdk/session.d.ts +34 -1
- package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
- package/dist/types/session/account-inventory.d.ts +86 -0
- package/dist/types/session/agent-session.d.ts +145 -6
- package/dist/types/session/agent-storage.d.ts +10 -0
- package/dist/types/session/coordinator-tool-label.d.ts +28 -0
- package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
- package/dist/types/session/messages.d.ts +1 -1
- package/dist/types/session/secure-token-file.d.ts +3 -0
- package/dist/types/session/session-manager.d.ts +40 -1
- package/dist/types/session/startup-auth-config.d.ts +44 -0
- package/dist/types/session/terminal-abort.d.ts +378 -0
- package/dist/types/session/yield-queue.d.ts +7 -0
- package/dist/types/session-import/claude.d.ts +26 -0
- package/dist/types/session-import/codex.d.ts +88 -0
- package/dist/types/session-import/command.d.ts +35 -0
- package/dist/types/session-import/detect.d.ts +22 -0
- package/dist/types/session-import/index.d.ts +7 -0
- package/dist/types/session-import/provider-codex.d.ts +22 -0
- package/dist/types/session-import/provider-service.d.ts +38 -0
- package/dist/types/session-import/redact.d.ts +23 -0
- package/dist/types/session-import/service.d.ts +47 -0
- package/dist/types/session-import/types.d.ts +120 -0
- package/dist/types/setup/paseo/check.d.ts +16 -0
- package/dist/types/setup/paseo/install-saga.d.ts +115 -0
- package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
- package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
- package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
- package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
- package/dist/types/setup/paseo/provider-config.d.ts +35 -0
- package/dist/types/setup/paseo/remove.d.ts +14 -0
- package/dist/types/setup/paseo/result-types.d.ts +59 -0
- package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
- package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
- package/dist/types/skill-state/active-state.d.ts +5 -1
- package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
- package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
- package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
- package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
- package/dist/types/slash-commands/types.d.ts +7 -1
- package/dist/types/task/executor.d.ts +10 -0
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/tools/ask-answer-registry.d.ts +6 -3
- package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
- package/dist/types/tools/bash.d.ts +2 -6
- package/dist/types/tools/browser/attach.d.ts +11 -0
- package/dist/types/tools/browser/launch.d.ts +20 -0
- package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
- package/dist/types/tools/browser/render.d.ts +1 -0
- package/dist/types/tools/browser.d.ts +3 -1
- package/dist/types/tools/image-gen.d.ts +9 -2
- package/dist/types/tools/index.d.ts +8 -0
- package/dist/types/tools/monitor.d.ts +1 -1
- package/dist/types/tools/skill-discovery.d.ts +8 -1
- package/dist/types/tools/subagent.d.ts +2 -0
- package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
- package/dist/types/utils/herdr-pane.d.ts +76 -0
- package/package.json +19 -9
- package/scripts/build-binary.ts +2 -1
- package/scripts/build-sdk-package-smoke.ts +2 -13
- package/scripts/capture-sticky-viewport-showcase.ts +0 -1
- package/scripts/compile-args.ts +2 -0
- package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
- package/scripts/generate-sdk-operation-inventory.ts +28 -0
- package/scripts/generate-telegram-baseline-manifest.ts +1 -0
- package/scripts/generate-tool-catalog.ts +6 -4
- package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
- package/src/async/job-manager.ts +352 -17
- package/src/async/support.ts +25 -0
- package/src/autoresearch/dashboard.ts +28 -13
- package/src/capability/index.ts +3 -1
- package/src/capability/mcp.ts +6 -0
- package/src/capability/types.ts +6 -0
- package/src/cli/accounts-cli.ts +395 -0
- package/src/cli/args.ts +23 -0
- package/src/cli/auth-broker-cli.ts +136 -66
- package/src/cli/auth-gateway-cli.ts +94 -70
- package/src/cli/config-cli.ts +27 -2
- package/src/cli/crash-cli.ts +78 -0
- package/src/cli/customize-doctor.ts +1605 -0
- package/src/cli/daemon-cli.ts +12 -3
- package/src/cli/fast-help.ts +1 -0
- package/src/cli/mcp-cli.ts +128 -60
- package/src/cli/notify-cli.ts +8 -14
- package/src/cli/root-flags.ts +8 -0
- package/src/cli/setup-cli.ts +145 -0
- package/src/cli/skills-cli.ts +38 -2
- package/src/cli/update-cli.ts +167 -12
- package/src/cli.ts +4 -0
- package/src/commands/accounts.ts +71 -0
- package/src/commands/crash.ts +35 -0
- package/src/commands/customize.ts +84 -0
- package/src/commands/daemon.ts +2 -2
- package/src/commands/deep-interview.ts +2 -0
- package/src/commands/launch.ts +1 -0
- package/src/commands/mcp.ts +12 -7
- package/src/commands/ralplan.ts +2 -0
- package/src/commands/sdk.ts +65 -32
- package/src/commands/setup.ts +5 -0
- package/src/commands/skills.ts +14 -4
- package/src/commands/ultragoal.ts +10 -1
- package/src/commands/update.ts +26 -15
- package/src/config/atomic-yaml-patch-worker.ts +57 -0
- package/src/config/atomic-yaml-patch.ts +769 -29
- package/src/config/config-schema-version.ts +10 -0
- package/src/config/file-lock.ts +70 -1
- package/src/config/mcp-schema.json +52 -14
- package/src/config/model-profile-activation.ts +20 -1
- package/src/config/model-profiles.ts +29 -19
- package/src/config/model-registry.ts +132 -21
- package/src/config/models-config-schema.ts +1 -1
- package/src/config/settings-schema.ts +76 -6
- package/src/config/settings.ts +4038 -199
- package/src/config/skill-settings-defaults.ts +41 -3
- package/src/config/task-delegation.ts +87 -0
- package/src/config/update-channel.ts +23 -0
- package/src/coordinator-mcp/server.ts +377 -308
- package/src/crash/index-store.ts +723 -0
- package/src/crash/nudge.ts +89 -0
- package/src/crash/record-loader.ts +149 -0
- package/src/crash/report.ts +551 -0
- package/src/crash/sanitize.ts +129 -0
- package/src/cursor.ts +36 -10
- package/src/customization/import.ts +946 -0
- package/src/customization/index.ts +4 -0
- package/src/customization/inventory.ts +335 -0
- package/src/customization/mutations.ts +141 -0
- package/src/customization/types.ts +223 -0
- package/src/daemon/control-types.ts +8 -1
- package/src/daemon/operator-contract.ts +6 -6
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
- package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
- package/src/discovery/claude-hooks.ts +38 -0
- package/src/discovery/claude.ts +142 -209
- package/src/discovery/codex-hooks.ts +38 -0
- package/src/discovery/codex.ts +132 -198
- package/src/discovery/helpers.ts +8 -1
- package/src/discovery/index.ts +2 -0
- package/src/discovery/mcp-compat.ts +234 -0
- package/src/discovery/mcp-json.ts +6 -0
- package/src/edit/renderer.ts +40 -0
- package/src/edit/streaming.ts +4 -2
- package/src/exec/bash-executor.ts +24 -20
- package/src/export/html/index.ts +51 -2
- package/src/extensibility/extensions/loader.ts +9 -1
- package/src/extensibility/extensions/runner.ts +17 -4
- package/src/extensibility/extensions/types.ts +31 -6
- package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
- package/src/extensibility/gjc-plugins/installer.ts +9 -5
- package/src/extensibility/gjc-plugins/observability.ts +8 -2
- package/src/extensibility/gjc-plugins/registry.ts +13 -2
- package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
- package/src/extensibility/gjc-plugins/schema.ts +222 -39
- package/src/extensibility/hooks/loader.ts +154 -10
- package/src/extensibility/runtime-skill-discovery.ts +257 -60
- package/src/extensibility/skill-management.ts +368 -0
- package/src/extensibility/skills.ts +52 -16
- package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
- package/src/gjc-runtime/launch-worktree.ts +56 -2
- package/src/gjc-runtime/linux-proc.ts +7 -1
- package/src/gjc-runtime/ralplan-runtime.ts +100 -164
- package/src/gjc-runtime/session-state-lock.ts +992 -0
- package/src/gjc-runtime/session-state-sidecar.ts +644 -142
- package/src/gjc-runtime/state-writer.ts +39 -14
- package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
- package/src/gjc-runtime/ultragoal-guard.ts +11 -4
- package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
- package/src/gjc-runtime/workflow-settings.ts +596 -0
- package/src/goals/tools/goal-tool.ts +6 -1
- package/src/hooks/events.ts +291 -0
- package/src/hooks/native-skill-hook.ts +4 -0
- package/src/hooks/normalize.ts +369 -0
- package/src/hooks/skill-state.ts +165 -46
- package/src/internal-urls/docs-index.generated.ts +40 -32
- package/src/main.ts +32 -5
- package/src/migrate/mcp-mapper.ts +25 -2
- package/src/modes/acp/abort-scope.ts +29 -0
- package/src/modes/acp/acp-agent.ts +423 -98
- package/src/modes/components/assistant-message.ts +6 -1
- package/src/modes/components/customization/customization-dashboard.ts +443 -0
- package/src/modes/components/customization/import-wizard.ts +372 -0
- package/src/modes/components/customization/index.ts +1 -0
- package/src/modes/components/gajae-pet-widget.ts +539 -213
- package/src/modes/components/irc-sidebar.ts +11 -0
- package/src/modes/components/iterm-pet-transport.ts +585 -0
- package/src/modes/components/oauth-selector.ts +277 -86
- package/src/modes/components/pet-capability.ts +39 -40
- package/src/modes/components/settings-selector.ts +9 -0
- package/src/modes/components/status-line/gh.ts +45 -1
- package/src/modes/components/status-line/segments.ts +16 -1
- package/src/modes/components/tool-status-header.ts +13 -3
- package/src/modes/controllers/command-controller.ts +20 -8
- package/src/modes/controllers/extension-ui-controller.ts +56 -257
- package/src/modes/controllers/input-controller.ts +10 -0
- package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
- package/src/modes/controllers/selector-controller.ts +177 -72
- package/src/modes/controllers/stt-controller.ts +3 -3
- package/src/modes/interactive-mode.ts +88 -16
- package/src/modes/print-mode.ts +35 -6
- package/src/modes/runtime-init.ts +21 -68
- package/src/modes/types.ts +1 -0
- package/src/modes/utils/injected-user-submission.ts +25 -0
- package/src/modes/utils/terminal-bell.ts +15 -1
- package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
- package/src/prompts/agent-fragments/restricted-bash.md +1 -1
- package/src/prompts/agents/critic.md +1 -1
- package/src/prompts/system/rlm-research.md +1 -1
- package/src/prompts/system/system-prompt.md +0 -2
- package/src/prompts/tools/bash.md +7 -1
- package/src/prompts/tools/browser.md +1 -1
- package/src/prompts/tools/cron.md +6 -6
- package/src/prompts/tools/read.md +0 -2
- package/src/prompts/tools/skill-discovery.md +4 -2
- package/src/runtime-mcp/client.ts +427 -23
- package/src/runtime-mcp/config.ts +37 -5
- package/src/runtime-mcp/manager-pool.test.ts +56 -0
- package/src/runtime-mcp/manager.ts +52 -2
- package/src/runtime-mcp/oauth-discovery.ts +13 -0
- package/src/runtime-mcp/oauth-flow.ts +46 -1
- package/src/runtime-mcp/pool-key.ts +5 -1
- package/src/runtime-mcp/pool.test.ts +9 -0
- package/src/runtime-mcp/protocol.test.ts +353 -0
- package/src/runtime-mcp/protocol.ts +624 -0
- package/src/runtime-mcp/scope-config.ts +78 -0
- package/src/runtime-mcp/tool-bridge.ts +44 -10
- package/src/runtime-mcp/transports/http.ts +84 -13
- package/src/runtime-mcp/types.ts +123 -12
- package/src/sdk/acp/adapter.ts +328 -97
- package/src/sdk/broker/broker.ts +160 -741
- package/src/sdk/broker/ensure.ts +9 -1
- package/src/sdk/broker/lifecycle.ts +510 -116
- package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
- package/src/sdk/broker/process-incarnation.ts +19 -0
- package/src/sdk/broker/session-index.ts +516 -117
- package/src/sdk/broker/startup-failure.ts +28 -5
- package/src/sdk/broker/transport.ts +1 -13
- package/src/sdk/bus/chat-daemon-cli.ts +4 -2
- package/src/sdk/bus/chat-daemon-control.ts +67 -6
- package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
- package/src/sdk/bus/config.ts +13 -0
- package/src/sdk/bus/conversation-store.ts +59 -171
- package/src/sdk/bus/daemon-paths.ts +20 -0
- package/src/sdk/bus/discord-conversation.ts +2 -0
- package/src/sdk/bus/discord-daemon.ts +524 -126
- package/src/sdk/bus/discord-live-provider.ts +206 -79
- package/src/sdk/bus/existing-thread-readiness.ts +4 -97
- package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
- package/src/sdk/bus/index.ts +2480 -456
- package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
- package/src/sdk/bus/lifecycle-commands.ts +2 -2
- package/src/sdk/bus/managed-daemon.ts +2 -145
- package/src/sdk/bus/notification-service.ts +196 -0
- package/src/sdk/bus/operator-runtime.ts +1 -1
- package/src/sdk/bus/prompt-reconciliation.ts +24 -15
- package/src/sdk/bus/reconciliation-store.ts +553 -24
- package/src/sdk/bus/session-control.ts +49 -3
- package/src/sdk/bus/slack-conversation.ts +4 -0
- package/src/sdk/bus/slack-daemon.ts +733 -134
- package/src/sdk/bus/slack-live-provider.ts +65 -15
- package/src/sdk/bus/slack-provider.ts +4 -0
- package/src/sdk/bus/slack-thread-binding.ts +9 -104
- package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
- package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
- package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
- package/src/sdk/bus/telegram-daemon-control.ts +3 -13
- package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
- package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
- package/src/sdk/bus/telegram-daemon.ts +2552 -2280
- package/src/sdk/bus/telegram-reference.ts +1 -226
- package/src/sdk/bus/telegram-setup.ts +2 -2
- package/src/sdk/bus/threaded-render.ts +1 -0
- package/src/sdk/bus/topic-registry.ts +279 -146
- package/src/sdk/cli/rows.ts +2 -35
- package/src/sdk/cli/session-cli.ts +776 -700
- package/src/sdk/client/client.ts +892 -1
- package/src/sdk/host/control/dispatch.ts +93 -58
- package/src/sdk/host/control/index.ts +1 -1
- package/src/sdk/host/control/operations.ts +18 -10
- package/src/sdk/host/control/runtime-gate.ts +40 -0
- package/src/sdk/host/host.ts +63 -12
- package/src/sdk/host/query/handlers.ts +66 -7
- package/src/sdk/host/reverse-leases.ts +2 -2
- package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
- package/src/sdk/host/session-runtime.test.ts +2787 -34
- package/src/sdk/host/session-runtime.ts +1489 -101
- package/src/sdk/host/surface-policy.ts +12 -8
- package/src/sdk/host/types.ts +1 -1
- package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
- package/src/sdk/host/websocket-transport.ts +85 -50
- package/src/sdk/index.ts +2 -1
- package/src/sdk/lifecycle/broker-client.ts +53 -0
- package/src/sdk/lifecycle/client.ts +234 -0
- package/src/sdk/lifecycle/index.ts +3 -0
- package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
- package/src/sdk/lifecycle/service.ts +720 -0
- package/src/sdk/mcp/server.ts +226 -188
- package/src/sdk/prompt-deadline-lease.ts +55 -0
- package/src/sdk/prompt-deadline-manager.ts +148 -0
- package/src/sdk/prompt-status.ts +11 -3
- package/src/sdk/protocol/operation-inventory.generated.json +272 -129
- package/src/sdk/protocol/operation-registry.ts +71 -8
- package/src/sdk/receipt-state.ts +43 -0
- package/src/sdk/reconciliation-extensions.ts +14 -0
- package/src/sdk/router/index.ts +1 -0
- package/src/sdk/router/session-router.ts +1658 -0
- package/src/sdk/session-list.ts +93 -0
- package/src/sdk/session-reconnect.ts +45 -1
- package/src/sdk/session.ts +716 -120
- package/src/sdk/transport/serve-cli.ts +18 -34
- package/src/session/account-inventory.ts +603 -0
- package/src/session/agent-session.ts +2857 -582
- package/src/session/agent-storage.ts +35 -0
- package/src/session/blob-store.ts +32 -1
- package/src/session/coordinator-tool-label.ts +40 -0
- package/src/session/internal/managed-session-scope.ts +4 -0
- package/src/session/internal/managed-session-storage.ts +173 -12
- package/src/session/messages.ts +1 -1
- package/src/session/secure-token-file.ts +80 -0
- package/src/session/session-manager.ts +730 -58
- package/src/session/session-storage.ts +25 -16
- package/src/session/startup-auth-config.ts +297 -0
- package/src/session/terminal-abort.ts +1253 -0
- package/src/session/yield-queue.ts +57 -15
- package/src/session-import/claude.ts +334 -0
- package/src/session-import/codex.ts +1033 -0
- package/src/session-import/command.ts +77 -0
- package/src/session-import/detect.ts +133 -0
- package/src/session-import/index.ts +7 -0
- package/src/session-import/provider-codex.ts +327 -0
- package/src/session-import/provider-service.ts +457 -0
- package/src/session-import/redact.ts +128 -0
- package/src/session-import/service.ts +1264 -0
- package/src/session-import/types.ts +148 -0
- package/src/setup/paseo/check.ts +213 -0
- package/src/setup/paseo/install-saga.ts +293 -0
- package/src/setup/paseo/json-publisher.ts +263 -0
- package/src/setup/paseo/orchestration-preferences.ts +86 -0
- package/src/setup/paseo/paseo-ownership.ts +224 -0
- package/src/setup/paseo/paseo-setup.ts +253 -0
- package/src/setup/paseo/provider-config.ts +139 -0
- package/src/setup/paseo/remove.ts +183 -0
- package/src/setup/paseo/result-types.ts +79 -0
- package/src/setup/paseo/setup-deps.ts +175 -0
- package/src/setup/paseo/skills-bridge.ts +260 -0
- package/src/skill-state/active-state.ts +21 -11
- package/src/slash-commands/acp-builtins.ts +9 -1
- package/src/slash-commands/builtin-registry.ts +98 -16
- package/src/slash-commands/helpers/credential-switch.ts +143 -0
- package/src/slash-commands/helpers/mcp.ts +9 -3
- package/src/slash-commands/helpers/usage-report.ts +61 -56
- package/src/slash-commands/types.ts +7 -2
- package/src/task/executor.ts +30 -11
- package/src/task/index.ts +66 -7
- package/src/task/render.ts +23 -9
- package/src/tools/ask-answer-registry.ts +23 -7
- package/src/tools/ask.ts +8 -4
- package/src/tools/bash-sleep-advisory.ts +115 -0
- package/src/tools/bash.ts +98 -18
- package/src/tools/browser/attach.ts +71 -3
- package/src/tools/browser/launch.ts +86 -13
- package/src/tools/browser/profile-discovery.ts +57 -7
- package/src/tools/browser/render.ts +8 -1
- package/src/tools/browser.ts +130 -21
- package/src/tools/computer.enforcement.test.ts +1 -1
- package/src/tools/computer.ts +3 -2
- package/src/tools/cron.ts +12 -1
- package/src/tools/image-gen.ts +27 -16
- package/src/tools/index.ts +8 -0
- package/src/tools/job.ts +33 -6
- package/src/tools/monitor.ts +41 -2
- package/src/tools/skill-discovery.ts +21 -29
- package/src/tools/subagent.ts +142 -24
- package/src/tools/tool-catalog.generated.ts +6 -6
- package/src/tools/ultragoal-ask-guard.ts +10 -3
- package/src/utils/herdr-pane.ts +345 -0
- package/src/utils/title-generator.ts +2 -0
- package/src/web/scrapers/index.ts +6 -4
- package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
- package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
- package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
- package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
- package/dist/types/runtime/lazy-service.test.d.ts +0 -1
- package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
- package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
- package/dist/types/runtime-mcp/config.test.d.ts +0 -1
- package/dist/types/runtime-mcp/http.test.d.ts +0 -1
- package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
- package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
- package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
- package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
- package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
- package/dist/types/sdk/elevation/audit.d.ts +0 -93
- package/dist/types/sdk/elevation/capability.d.ts +0 -3
- package/dist/types/sdk/elevation/digest.d.ts +0 -72
- package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
- package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
- package/dist/types/sdk/elevation/owner.d.ts +0 -48
- package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
- package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
- package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
- package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
- package/dist/types/session/auth-broker-config.d.ts +0 -13
- package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
- package/dist/types/skills/skills.test.d.ts +0 -1
- package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
- package/dist/types/task/token-log.test.d.ts +0 -1
- package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
- package/dist/types/tools/descriptors.test.d.ts +0 -1
- package/scripts/g005-daemon-smoke.ts +0 -180
- package/scripts/g011-daemon-path-smoke.ts +0 -153
- package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
- package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
- package/src/sdk/bus/telegram-cli.ts +0 -212
- package/src/sdk/elevation/allowlist.ts +0 -54
- package/src/sdk/elevation/audit.ts +0 -208
- package/src/sdk/elevation/capability.ts +0 -41
- package/src/sdk/elevation/digest.ts +0 -129
- package/src/sdk/elevation/dispatch-receipt.ts +0 -184
- package/src/sdk/elevation/grant-ledger.ts +0 -1142
- package/src/sdk/elevation/owner.ts +0 -109
- package/src/session/auth-broker-config.ts +0 -109
- /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
- /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
- /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/import-session` slash-command surface (issue #3709).
|
|
3
|
+
*
|
|
4
|
+
* The documented CLI contract:
|
|
5
|
+
*
|
|
6
|
+
* /import-session <transcript-file> [--provider codex|claude]
|
|
7
|
+
*
|
|
8
|
+
* The file argument is an explicit user-selected Codex rollout transcript,
|
|
9
|
+
* Claude Code transcript, or claude.ai export. Provider detection is automatic;
|
|
10
|
+
* `--provider` narrows it and fails closed on a mismatch.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { parseCommandArgs } from "../utils/command-args";
|
|
14
|
+
import { formatProviderSessionImportError, importProviderSessionFile } from "./provider-service";
|
|
15
|
+
import type { SessionImportCompleted, SessionImportProviderId } from "./types";
|
|
16
|
+
|
|
17
|
+
export const IMPORT_SESSION_USAGE = "Usage: /import-session <transcript-file> [--provider codex|claude]";
|
|
18
|
+
|
|
19
|
+
export type ParsedImportSessionArgs =
|
|
20
|
+
| { kind: "ok"; sourcePath: string; provider?: SessionImportProviderId }
|
|
21
|
+
| { kind: "error"; message: string };
|
|
22
|
+
|
|
23
|
+
export function parseImportSessionArgs(args: string): ParsedImportSessionArgs {
|
|
24
|
+
const tokens = parseCommandArgs(args);
|
|
25
|
+
let provider: SessionImportProviderId | undefined;
|
|
26
|
+
const positional: string[] = [];
|
|
27
|
+
for (let index = 0; index < tokens.length; index++) {
|
|
28
|
+
const token = tokens[index]!;
|
|
29
|
+
if (token === "--provider" || token.startsWith("--provider=")) {
|
|
30
|
+
const value = token === "--provider" ? tokens[++index] : token.slice("--provider=".length);
|
|
31
|
+
if (value !== "codex" && value !== "claude") {
|
|
32
|
+
return { kind: "error", message: `--provider must be codex or claude.\n${IMPORT_SESSION_USAGE}` };
|
|
33
|
+
}
|
|
34
|
+
if (provider && provider !== value) {
|
|
35
|
+
return { kind: "error", message: `Conflicting --provider values.\n${IMPORT_SESSION_USAGE}` };
|
|
36
|
+
}
|
|
37
|
+
provider = value;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (token.startsWith("--")) {
|
|
41
|
+
return { kind: "error", message: `Unknown option: ${token}\n${IMPORT_SESSION_USAGE}` };
|
|
42
|
+
}
|
|
43
|
+
positional.push(token);
|
|
44
|
+
}
|
|
45
|
+
if (positional.length === 0) return { kind: "error", message: IMPORT_SESSION_USAGE };
|
|
46
|
+
if (positional.length > 1) {
|
|
47
|
+
return {
|
|
48
|
+
kind: "error",
|
|
49
|
+
message: `Expected exactly one transcript file; got ${positional.length} arguments.\n${IMPORT_SESSION_USAGE}`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return { kind: "ok", sourcePath: positional[0]!, ...(provider ? { provider } : {}) };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export type SessionImportCommandOutcome =
|
|
56
|
+
| { kind: "imported"; result: SessionImportCompleted }
|
|
57
|
+
| { kind: "error"; message: string };
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Shared non-UI flow for both the text/ACP handler and the TUI handler:
|
|
61
|
+
* import into a NEW session file; the caller decides how to present/switch.
|
|
62
|
+
* Never mutates the current session.
|
|
63
|
+
*/
|
|
64
|
+
export async function runSessionImportCommand(args: string, cwd: string): Promise<SessionImportCommandOutcome> {
|
|
65
|
+
const parsed = parseImportSessionArgs(args);
|
|
66
|
+
if (parsed.kind === "error") return { kind: "error", message: parsed.message };
|
|
67
|
+
try {
|
|
68
|
+
const result = await importProviderSessionFile({
|
|
69
|
+
sourcePath: parsed.sourcePath,
|
|
70
|
+
...(parsed.provider ? { provider: parsed.provider } : {}),
|
|
71
|
+
cwd,
|
|
72
|
+
});
|
|
73
|
+
return { kind: "imported", result };
|
|
74
|
+
} catch (error) {
|
|
75
|
+
return { kind: "error", message: formatProviderSessionImportError(error) };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic source-format detection (issue #3709).
|
|
3
|
+
*
|
|
4
|
+
* Detection inspects only the already-read source bytes: a bounded leading
|
|
5
|
+
* sample decides JSONL-vs-JSON and provider by envelope markers. An explicit
|
|
6
|
+
* `--provider` selection narrows candidates; a sample that matches a different
|
|
7
|
+
* provider than requested fails closed with `format_mismatch`. Detection never
|
|
8
|
+
* guesses: a sample matching no supported envelope fails with
|
|
9
|
+
* `unsupported_format` rather than falling back to a speculative parse.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { SessionImportError, type SessionImportFormatId, type SessionImportProviderId } from "./types";
|
|
13
|
+
|
|
14
|
+
/** Leading bytes consulted for envelope sniffing. */
|
|
15
|
+
const DETECTION_SAMPLE_BYTES = 256 * 1024;
|
|
16
|
+
|
|
17
|
+
type JsonRecord = Record<string, unknown>;
|
|
18
|
+
|
|
19
|
+
function isRecord(value: unknown): value is JsonRecord {
|
|
20
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface SessionImportDetection {
|
|
24
|
+
provider: SessionImportProviderId;
|
|
25
|
+
format: SessionImportFormatId;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function detectJsonlFormat(text: string): SessionImportDetection | undefined {
|
|
29
|
+
const lines = text.split("\n");
|
|
30
|
+
let sawCodex = false;
|
|
31
|
+
let sawClaude = false;
|
|
32
|
+
let examined = 0;
|
|
33
|
+
for (const line of lines) {
|
|
34
|
+
const trimmed = line.trim();
|
|
35
|
+
if (trimmed.length === 0) continue;
|
|
36
|
+
let value: unknown;
|
|
37
|
+
try {
|
|
38
|
+
value = JSON.parse(trimmed);
|
|
39
|
+
} catch {
|
|
40
|
+
// A malformed early line does not decide detection; the adapter reports it.
|
|
41
|
+
if (examined >= 8) break;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (!isRecord(value)) continue;
|
|
45
|
+
examined++;
|
|
46
|
+
if (value.type === "session_meta" && isRecord(value.payload))
|
|
47
|
+
return { provider: "codex", format: "codex-rollout-jsonl" };
|
|
48
|
+
if (value.type === "response_item" || value.type === "turn_context" || value.type === "world_state")
|
|
49
|
+
sawCodex = true;
|
|
50
|
+
if (value.type === "event_msg") sawCodex = true;
|
|
51
|
+
if (
|
|
52
|
+
(value.type === "user" || value.type === "assistant" || value.type === "summary" || value.type === "system") &&
|
|
53
|
+
(value.sessionId !== undefined ||
|
|
54
|
+
value.parentUuid !== undefined ||
|
|
55
|
+
value.leafUuid !== undefined ||
|
|
56
|
+
isRecord(value.message))
|
|
57
|
+
) {
|
|
58
|
+
sawClaude = true;
|
|
59
|
+
}
|
|
60
|
+
if (sawCodex && sawClaude) break;
|
|
61
|
+
if (examined >= 32) break;
|
|
62
|
+
}
|
|
63
|
+
if (sawCodex && !sawClaude) return { provider: "codex", format: "codex-rollout-jsonl" };
|
|
64
|
+
if (sawClaude && !sawCodex) return { provider: "claude", format: "claude-code-jsonl" };
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function looksLikeClaudeExport(value: unknown): boolean {
|
|
69
|
+
const conversations = Array.isArray(value) ? value : [value];
|
|
70
|
+
if (conversations.length === 0 || !conversations.every(isRecord)) return false;
|
|
71
|
+
return conversations.every(conversation => {
|
|
72
|
+
if (!Array.isArray(conversation.chat_messages)) return false;
|
|
73
|
+
// `uuid`+`chat_messages` is the claude.ai export envelope; a bare
|
|
74
|
+
// chat_messages array without any sender markers is not enough.
|
|
75
|
+
const senders = conversation.chat_messages.slice(0, 8);
|
|
76
|
+
return (
|
|
77
|
+
typeof conversation.uuid === "string" ||
|
|
78
|
+
senders.some(message => isRecord(message) && (message.sender === "human" || message.sender === "assistant"))
|
|
79
|
+
);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Detect the provider/format of an explicit transcript file.
|
|
85
|
+
*
|
|
86
|
+
* @param text Full source text (already size-bounded by the caller).
|
|
87
|
+
* @param requestedProvider Explicit provider selection; undefined = auto.
|
|
88
|
+
*/
|
|
89
|
+
export function detectSessionImportFormat(
|
|
90
|
+
text: string,
|
|
91
|
+
requestedProvider: SessionImportProviderId | undefined,
|
|
92
|
+
): SessionImportDetection {
|
|
93
|
+
const sample = text.slice(0, DETECTION_SAMPLE_BYTES);
|
|
94
|
+
let detected: SessionImportDetection | undefined;
|
|
95
|
+
|
|
96
|
+
const trimmed = sample.trimStart();
|
|
97
|
+
if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
|
|
98
|
+
// Ambiguous between "JSON document" and "JSONL": try whole-document parse
|
|
99
|
+
// only against the sample when the whole text is the sample; otherwise a
|
|
100
|
+
// leading `{`/`[` with newline-delimited records falls through to JSONL.
|
|
101
|
+
let documentValue: unknown;
|
|
102
|
+
let isJsonDocument = false;
|
|
103
|
+
try {
|
|
104
|
+
documentValue = JSON.parse(text);
|
|
105
|
+
isJsonDocument = true;
|
|
106
|
+
} catch {
|
|
107
|
+
isJsonDocument = false;
|
|
108
|
+
}
|
|
109
|
+
if (isJsonDocument && looksLikeClaudeExport(documentValue)) {
|
|
110
|
+
detected = { provider: "claude", format: "claude-export-json" };
|
|
111
|
+
}
|
|
112
|
+
// A whole-document JSON parse also succeeds for a single-line JSONL
|
|
113
|
+
// transcript, so a non-export document falls through to JSONL detection
|
|
114
|
+
// before anything is declared unsupported.
|
|
115
|
+
}
|
|
116
|
+
if (!detected) detected = detectJsonlFormat(sample);
|
|
117
|
+
|
|
118
|
+
if (!detected) {
|
|
119
|
+
throw new SessionImportError(
|
|
120
|
+
"unsupported_format",
|
|
121
|
+
"detect",
|
|
122
|
+
"Could not detect a supported Codex or Claude transcript format. Pass --provider codex|claude to force a provider, or export the session again.",
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
if (requestedProvider && detected.provider !== requestedProvider) {
|
|
126
|
+
throw new SessionImportError(
|
|
127
|
+
"format_mismatch",
|
|
128
|
+
"detect",
|
|
129
|
+
`The source looks like a ${detected.provider} transcript (${detected.format}) but --provider ${requestedProvider} was requested.`,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
return detected;
|
|
133
|
+
}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex adapter (issue #3709).
|
|
3
|
+
*
|
|
4
|
+
* Parses the Codex CLI rollout transcript: one JSON object per line
|
|
5
|
+
* (`rollout-*.jsonl`, e.g. `~/.codex/sessions/2026/08/01/rollout-….jsonl`).
|
|
6
|
+
* This is Codex's own observable transcript format; the file the user passes is
|
|
7
|
+
* treated as an explicit export and is only read.
|
|
8
|
+
*
|
|
9
|
+
* Strictness contract: records that fail to parse or lack required fields are
|
|
10
|
+
* quarantined with deterministic digests — never silently dropped. Unknown
|
|
11
|
+
* record/event types are mapped when their payload shape is recognized and
|
|
12
|
+
* quarantined otherwise.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { createHash } from "node:crypto";
|
|
16
|
+
import { redactImportedText } from "./redact";
|
|
17
|
+
import type { ImportedConversation, ImportedMessage, ImportQuarantineRecord, SessionImportCounts } from "./types";
|
|
18
|
+
|
|
19
|
+
type JsonRecord = Record<string, unknown>;
|
|
20
|
+
|
|
21
|
+
export interface CodexParseResult {
|
|
22
|
+
conversation: ImportedConversation;
|
|
23
|
+
quarantine: ImportQuarantineRecord[];
|
|
24
|
+
counts: SessionImportCounts;
|
|
25
|
+
redactionKinds: string[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const MAX_EVIDENCE_LINE_CHARS = 400;
|
|
29
|
+
|
|
30
|
+
function isRecord(value: unknown): value is JsonRecord {
|
|
31
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function textFromContentBlocks(content: unknown): string {
|
|
35
|
+
if (typeof content === "string") return content;
|
|
36
|
+
if (!Array.isArray(content)) return "";
|
|
37
|
+
const parts: string[] = [];
|
|
38
|
+
for (const block of content) {
|
|
39
|
+
if (!isRecord(block)) continue;
|
|
40
|
+
// Codex rollout uses output_text/input_text; accept plain text blocks too.
|
|
41
|
+
if (
|
|
42
|
+
typeof block.text === "string" &&
|
|
43
|
+
(block.type === "output_text" || block.type === "input_text" || block.type === "text")
|
|
44
|
+
) {
|
|
45
|
+
parts.push(block.text);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return parts.join("\n");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function summarizeArguments(args: unknown): string {
|
|
52
|
+
if (typeof args !== "string" || args.length === 0) return "";
|
|
53
|
+
const trimmed = args.trim();
|
|
54
|
+
try {
|
|
55
|
+
const parsed: unknown = JSON.parse(trimmed);
|
|
56
|
+
if (isRecord(parsed)) {
|
|
57
|
+
const command = parsed.command;
|
|
58
|
+
if (Array.isArray(command) && command.every(part => typeof part === "string")) {
|
|
59
|
+
return command.join(" ");
|
|
60
|
+
}
|
|
61
|
+
if (typeof command === "string") return command;
|
|
62
|
+
if (typeof parsed.cmd === "string") return parsed.cmd;
|
|
63
|
+
if (typeof parsed.path === "string") return parsed.path;
|
|
64
|
+
if (typeof parsed.file_path === "string") return parsed.file_path;
|
|
65
|
+
if (typeof parsed.input === "string") return parsed.input;
|
|
66
|
+
if (typeof parsed.query === "string") return parsed.query;
|
|
67
|
+
}
|
|
68
|
+
} catch {
|
|
69
|
+
// Fall through to the bounded raw form.
|
|
70
|
+
}
|
|
71
|
+
return trimmed;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function boundEvidence(text: string): string {
|
|
75
|
+
const singleLine = text.replace(/\s+/g, " ").trim();
|
|
76
|
+
if (singleLine.length <= MAX_EVIDENCE_LINE_CHARS) return singleLine;
|
|
77
|
+
return `${singleLine.slice(0, MAX_EVIDENCE_LINE_CHARS - 1)}…`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
class EvidenceCollector {
|
|
81
|
+
readonly #lines: string[] = [];
|
|
82
|
+
#bytes = 0;
|
|
83
|
+
truncated = false;
|
|
84
|
+
|
|
85
|
+
static readonly MAX_LINES = 100;
|
|
86
|
+
static readonly MAX_BYTES = 8 * 1024;
|
|
87
|
+
|
|
88
|
+
add(line: string): void {
|
|
89
|
+
if (line.length === 0) return;
|
|
90
|
+
if (
|
|
91
|
+
this.#lines.length >= EvidenceCollector.MAX_LINES ||
|
|
92
|
+
this.#bytes + line.length > EvidenceCollector.MAX_BYTES
|
|
93
|
+
) {
|
|
94
|
+
this.truncated = true;
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
this.#lines.push(line);
|
|
98
|
+
this.#bytes += line.length;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
get lines(): string[] {
|
|
102
|
+
return this.#lines;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Parse a Codex rollout JSONL transcript into the provider-neutral IR. */
|
|
107
|
+
export function parseCodexRollout(text: string): CodexParseResult {
|
|
108
|
+
const maxQuarantineRecords = 512;
|
|
109
|
+
const messages: ImportedMessage[] = [];
|
|
110
|
+
const quarantine: ImportQuarantineRecord[] = [];
|
|
111
|
+
const counts: SessionImportCounts = { mapped: 0, quarantined: 0, redacted: 0, omitted: 0 };
|
|
112
|
+
const redactionKinds = new Set<string>();
|
|
113
|
+
const redact = (input: string): string => {
|
|
114
|
+
const result = redactImportedText(input);
|
|
115
|
+
counts.redacted += result.redacted;
|
|
116
|
+
for (const kind of result.kinds) redactionKinds.add(kind);
|
|
117
|
+
return result.value;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
let sourceSessionId: string | undefined;
|
|
121
|
+
let title: string | undefined;
|
|
122
|
+
let cwd: string | undefined;
|
|
123
|
+
let current: ImportedMessage | undefined;
|
|
124
|
+
let evidence = new EvidenceCollector();
|
|
125
|
+
|
|
126
|
+
const closeEvidence = (): void => {
|
|
127
|
+
if (!current) {
|
|
128
|
+
evidence = new EvidenceCollector();
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (evidence.lines.length > 0) {
|
|
132
|
+
current.toolEvidence = [...(current.toolEvidence ?? []), ...evidence.lines];
|
|
133
|
+
}
|
|
134
|
+
evidence = new EvidenceCollector();
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/** Assemble visible text into the running conversation. `mapped` is counted by the caller per recognized record. */
|
|
138
|
+
const pushMessage = (role: "user" | "assistant", rawText: string, timestamp?: string): void => {
|
|
139
|
+
const sanitized = redact(rawText).trim();
|
|
140
|
+
if (role === "user") {
|
|
141
|
+
closeEvidence();
|
|
142
|
+
if (!sanitized) {
|
|
143
|
+
current = undefined;
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
current = { role, text: sanitized, ...(timestamp ? { timestamp } : {}) };
|
|
147
|
+
messages.push(current);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (!sanitized) return;
|
|
151
|
+
if (current?.role === "assistant") {
|
|
152
|
+
current.text = current.text ? `${current.text}\n\n${sanitized}` : sanitized;
|
|
153
|
+
} else {
|
|
154
|
+
closeEvidence();
|
|
155
|
+
current = { role, text: sanitized, ...(timestamp ? { timestamp } : {}) };
|
|
156
|
+
messages.push(current);
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
const quarantineRecord = (record: number, line: string, reason: ImportQuarantineRecord["reason"]): void => {
|
|
161
|
+
if (quarantine.length < maxQuarantineRecords) {
|
|
162
|
+
quarantine.push({ record, byteLength: Buffer.byteLength(line, "utf8"), sha256: sha256Hex(line), reason });
|
|
163
|
+
}
|
|
164
|
+
counts.quarantined++;
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
const lines = text.split("\n");
|
|
168
|
+
for (let index = 0; index < lines.length; index++) {
|
|
169
|
+
const line = lines[index]!.trim();
|
|
170
|
+
if (line.length === 0) continue;
|
|
171
|
+
const recordNumber = index + 1;
|
|
172
|
+
let record: unknown;
|
|
173
|
+
try {
|
|
174
|
+
record = JSON.parse(line);
|
|
175
|
+
} catch {
|
|
176
|
+
quarantineRecord(recordNumber, line, "invalid_json");
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
if (!isRecord(record) || typeof record.type !== "string") {
|
|
180
|
+
quarantineRecord(recordNumber, line, "invalid_json");
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
const timestamp = typeof record.timestamp === "string" ? record.timestamp : undefined;
|
|
184
|
+
|
|
185
|
+
switch (record.type) {
|
|
186
|
+
case "session_meta": {
|
|
187
|
+
const payload = record.payload;
|
|
188
|
+
if (!isRecord(payload)) {
|
|
189
|
+
quarantineRecord(recordNumber, line, "missing_fields");
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
if (typeof payload.id === "string") sourceSessionId = redact(payload.id);
|
|
193
|
+
if (typeof payload.cwd === "string") cwd = redact(payload.cwd);
|
|
194
|
+
if (typeof payload.title === "string" && payload.title.trim().length > 0) {
|
|
195
|
+
title = redact(payload.title).trim();
|
|
196
|
+
}
|
|
197
|
+
counts.mapped++;
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
case "response_item": {
|
|
201
|
+
const payload = record.payload;
|
|
202
|
+
if (!isRecord(payload) || typeof payload.type !== "string") {
|
|
203
|
+
quarantineRecord(recordNumber, line, "missing_fields");
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
switch (payload.type) {
|
|
207
|
+
case "message": {
|
|
208
|
+
const role = payload.role;
|
|
209
|
+
if (role !== "user" && role !== "assistant") {
|
|
210
|
+
// developer/system prompts are provider framing, not conversation.
|
|
211
|
+
counts.mapped++;
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
counts.mapped++;
|
|
215
|
+
pushMessage(role, textFromContentBlocks(payload.content), timestamp);
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
case "reasoning": {
|
|
219
|
+
// Model-internal reasoning is never imported (non-goal).
|
|
220
|
+
counts.mapped++;
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
case "function_call": {
|
|
224
|
+
const name = redact(typeof payload.name === "string" ? payload.name : "tool");
|
|
225
|
+
const summary = redact(boundEvidence(summarizeArguments(payload.arguments)));
|
|
226
|
+
evidence.add(summary ? `$ ${name} ${summary}` : `$ ${name}`);
|
|
227
|
+
counts.mapped++;
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
case "function_call_output":
|
|
231
|
+
case "custom_tool_call_output": {
|
|
232
|
+
const output = isRecord(payload.output)
|
|
233
|
+
? JSON.stringify(payload.output)
|
|
234
|
+
: typeof payload.output === "string"
|
|
235
|
+
? payload.output
|
|
236
|
+
: "";
|
|
237
|
+
const summary = redact(boundEvidence(output));
|
|
238
|
+
if (summary) evidence.add(`→ ${summary}`);
|
|
239
|
+
counts.mapped++;
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
case "custom_tool_call": {
|
|
243
|
+
const name = redact(typeof payload.name === "string" ? payload.name : "tool");
|
|
244
|
+
const input = typeof payload.input === "string" ? payload.input : "";
|
|
245
|
+
const summary = redact(boundEvidence(input));
|
|
246
|
+
evidence.add(summary ? `$ ${name} ${summary}` : `$ ${name}`);
|
|
247
|
+
counts.mapped++;
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
case "local_shell_call": {
|
|
251
|
+
const action = isRecord(payload.action) ? payload.action : undefined;
|
|
252
|
+
const command = action && Array.isArray(action.command) ? action.command.join(" ") : "";
|
|
253
|
+
const summary = redact(boundEvidence(command));
|
|
254
|
+
evidence.add(summary ? `$ ${summary}` : "$ shell");
|
|
255
|
+
counts.mapped++;
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
case "web_search_call": {
|
|
259
|
+
evidence.add("[web search]");
|
|
260
|
+
counts.mapped++;
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
default:
|
|
264
|
+
quarantineRecord(recordNumber, line, "unknown_record");
|
|
265
|
+
}
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
case "event_msg": {
|
|
269
|
+
const payload = record.payload;
|
|
270
|
+
if (!isRecord(payload) || typeof payload.type !== "string") {
|
|
271
|
+
quarantineRecord(recordNumber, line, "missing_fields");
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
switch (payload.type) {
|
|
275
|
+
case "user_message":
|
|
276
|
+
counts.mapped++;
|
|
277
|
+
pushMessage("user", typeof payload.message === "string" ? payload.message : "", timestamp);
|
|
278
|
+
break;
|
|
279
|
+
case "agent_message":
|
|
280
|
+
counts.mapped++;
|
|
281
|
+
pushMessage("assistant", typeof payload.message === "string" ? payload.message : "", timestamp);
|
|
282
|
+
break;
|
|
283
|
+
case "agent_reasoning":
|
|
284
|
+
case "agent_reasoning_delta":
|
|
285
|
+
case "agent_reasoning_raw_content":
|
|
286
|
+
case "agent_reasoning_raw_content_delta":
|
|
287
|
+
case "agent_reasoning_section_break":
|
|
288
|
+
case "token_count":
|
|
289
|
+
// Reasoning/token telemetry is model-internal or display-only.
|
|
290
|
+
counts.mapped++;
|
|
291
|
+
break;
|
|
292
|
+
default:
|
|
293
|
+
// Recognized event envelope, unmapped payload variant.
|
|
294
|
+
quarantineRecord(recordNumber, line, "unknown_record");
|
|
295
|
+
}
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
case "turn_context":
|
|
299
|
+
case "world_state":
|
|
300
|
+
// Provider environment framing; not conversation content.
|
|
301
|
+
counts.mapped++;
|
|
302
|
+
break;
|
|
303
|
+
default:
|
|
304
|
+
quarantineRecord(recordNumber, line, "unknown_record");
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
closeEvidence();
|
|
308
|
+
|
|
309
|
+
return {
|
|
310
|
+
conversation: {
|
|
311
|
+
provider: "codex",
|
|
312
|
+
format: "codex-rollout-jsonl",
|
|
313
|
+
...(sourceSessionId ? { sourceSessionId } : {}),
|
|
314
|
+
...(title ? { title } : {}),
|
|
315
|
+
...(cwd ? { cwd } : {}),
|
|
316
|
+
messages,
|
|
317
|
+
},
|
|
318
|
+
quarantine,
|
|
319
|
+
counts,
|
|
320
|
+
redactionKinds: [...redactionKinds].sort(),
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function sha256Hex(text: string): string {
|
|
325
|
+
// Deterministic per-record digest for quarantine evidence (content never stored).
|
|
326
|
+
return createHash("sha256").update(text, "utf8").digest("hex");
|
|
327
|
+
}
|