@gajae-code/coding-agent 0.17.1 → 0.17.4
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 +266 -0
- package/dist/types/async/job-manager.d.ts +7 -6
- package/dist/types/cli/daemon-cli.d.ts +3 -1
- package/dist/types/cli/github-release.d.ts +17 -0
- package/dist/types/cli/public-command-entry.d.ts +56 -0
- package/dist/types/cli/public-command-errors.d.ts +126 -0
- package/dist/types/cli/public-command-evidence.d.ts +99 -0
- package/dist/types/cli/public-command-help.d.ts +65 -0
- package/dist/types/cli/public-command-registry.d.ts +69 -0
- package/dist/types/cli/session-picker.d.ts +1 -1
- package/dist/types/cli/setup-cli.d.ts +1 -0
- package/dist/types/cli/skills-cli.d.ts +5 -0
- package/dist/types/cli.d.ts +3 -0
- package/dist/types/commands/daemon.d.ts +4 -50
- package/dist/types/commands/sdk.d.ts +20 -37
- package/dist/types/commands/setup.d.ts +3 -0
- package/dist/types/commands/skills.d.ts +9 -0
- package/dist/types/config/autorouting-tier-map.d.ts +24 -0
- package/dist/types/config/file-lock.d.ts +10 -1
- package/dist/types/config/model-profile-activation.d.ts +63 -4
- package/dist/types/config/model-registry.d.ts +20 -2
- package/dist/types/config/settings-schema.d.ts +11 -0
- package/dist/types/coordinator-mcp/question-state.d.ts +6 -1
- package/dist/types/coordinator-mcp/server.d.ts +3 -0
- package/dist/types/daemon/operator-contract.d.ts +5 -1
- package/dist/types/eval/js/worker-protocol.d.ts +2 -0
- package/dist/types/extensibility/extensions/types.d.ts +12 -0
- package/dist/types/extensibility/gjc-plugins/registry.d.ts +4 -0
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +18 -0
- package/dist/types/extensibility/shared-events.d.ts +3 -1
- package/dist/types/gjc-runtime/session-state-lock.d.ts +61 -0
- package/dist/types/internal-urls/embedded-protocol.d.ts +9 -0
- package/dist/types/internal-urls/index.d.ts +1 -0
- package/dist/types/internal-urls/parse.d.ts +9 -1
- package/dist/types/main.d.ts +22 -0
- package/dist/types/modes/acp/acp-agent.d.ts +94 -1
- package/dist/types/modes/acp/startup-provenance.d.ts +16 -0
- package/dist/types/modes/components/custom-provider-wizard.d.ts +19 -1
- package/dist/types/modes/components/session-selector.d.ts +5 -2
- package/dist/types/modes/components/thinking-selector.d.ts +2 -1
- package/dist/types/modes/components/user-message-selector.d.ts +5 -2
- package/dist/types/modes/controllers/command-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +1 -1
- package/dist/types/modes/interactive-mode.d.ts +1 -1
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +11 -1
- package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +14 -1
- package/dist/types/modes/types.d.ts +2 -2
- package/dist/types/runtime/process-lifecycle.d.ts +2 -0
- package/dist/types/runtime-mcp/manager.d.ts +56 -0
- package/dist/types/runtime-mcp/pool.d.ts +17 -0
- package/dist/types/runtime-mcp/redaction.d.ts +20 -0
- package/dist/types/runtime-mcp/startup-policy.d.ts +6 -0
- package/dist/types/runtime-mcp/tool-bridge.d.ts +9 -0
- package/dist/types/runtime-mcp/transports/http.d.ts +11 -0
- package/dist/types/sdk/acp/adapter.d.ts +27 -0
- package/dist/types/sdk/acp/final-text.d.ts +8 -0
- package/dist/types/sdk/broker/broker.d.ts +13 -2
- package/dist/types/sdk/broker/ensure.d.ts +46 -1
- package/dist/types/sdk/broker/identity.d.ts +3 -1
- package/dist/types/sdk/broker/lifecycle-ledger.d.ts +23 -3
- package/dist/types/sdk/broker/lifecycle.d.ts +15 -8
- package/dist/types/sdk/broker/runtime.d.ts +1 -1
- package/dist/types/sdk/broker/session-index.d.ts +22 -3
- package/dist/types/sdk/broker/spawn-authority.d.ts +4 -0
- package/dist/types/sdk/broker/stderr-drainer.d.ts +13 -0
- package/dist/types/sdk/bus/index.d.ts +19 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +3 -1
- package/dist/types/sdk/bus/telegram-daemon.d.ts +5 -0
- package/dist/types/sdk/cli/master-cli.d.ts +6 -10
- package/dist/types/sdk/cli/rows.d.ts +19 -1
- package/dist/types/sdk/cli/session-cli.d.ts +22 -5
- package/dist/types/sdk/client/client.d.ts +2 -0
- package/dist/types/sdk/guides/cli.d.ts +3 -4
- package/dist/types/sdk/guides/verify.d.ts +2 -0
- package/dist/types/sdk/host/host.d.ts +9 -0
- package/dist/types/sdk/host/session-runtime.d.ts +31 -0
- package/dist/types/sdk/host/types.d.ts +10 -0
- package/dist/types/sdk/index.d.ts +1 -0
- package/dist/types/sdk/prompt-deadline-flush.d.ts +83 -0
- package/dist/types/sdk/prompt-deadline-manager.d.ts +38 -1
- package/dist/types/sdk/prompt-failure.d.ts +30 -1
- package/dist/types/sdk/prompt-status.d.ts +8 -0
- package/dist/types/sdk/prompt-tool-boundary.d.ts +73 -0
- package/dist/types/sdk/router/replay-retention-gap-cache.d.ts +13 -0
- package/dist/types/sdk/router/session-router.d.ts +2 -0
- package/dist/types/sdk/startup-capability.d.ts +2 -0
- package/dist/types/sdk/transport/relay.d.ts +1 -0
- package/dist/types/sdk/transport/serve-cli.d.ts +73 -2
- package/dist/types/sdk/transport/stdio.d.ts +5 -1
- package/dist/types/session/agent-session.d.ts +168 -21
- package/dist/types/session/fallback-chain-controller.d.ts +6 -6
- package/dist/types/session/fold-coordinator.d.ts +17 -3
- package/dist/types/session/internal/managed-session-storage.d.ts +7 -1
- package/dist/types/session/session-manager.d.ts +64 -1
- package/dist/types/session/session-work-lease.d.ts +14 -0
- package/dist/types/setup/model-onboarding-guidance.d.ts +1 -1
- package/dist/types/setup/provider-onboarding.d.ts +81 -1
- package/dist/types/thinking.d.ts +3 -1
- package/dist/types/tools/bash.d.ts +37 -11
- package/dist/types/tools/job.d.ts +1 -1
- package/dist/types/tools/steer-fold.d.ts +31 -0
- package/dist/types/utils/git.d.ts +28 -2
- package/dist/types/utils/mupdf-embedded.d.ts +2 -0
- package/dist/types/utils/mupdf-wasm-embedded.d.ts +2 -0
- package/dist/types/utils/mupdf.d.ts +4 -0
- package/dist/types/utils/session-title-generation.d.ts +6 -0
- package/dist/types/utils/title-generator.d.ts +11 -2
- package/dist/types/web/scrapers/types.d.ts +3 -0
- package/package.json +18 -10
- package/scripts/build-binary.ts +9 -3
- package/scripts/compile-args.ts +0 -9
- package/scripts/embed-mupdf.ts +52 -0
- package/scripts/generate-sdk-operation-inventory.ts +31 -1
- package/scripts/vendor-markit.ts +196 -0
- package/src/async/job-manager.ts +60 -9
- package/src/cli/daemon-cli.ts +53 -18
- package/src/cli/github-release.ts +87 -5
- package/src/cli/mcp-cli.ts +38 -4
- package/src/cli/public-command-entry.ts +450 -0
- package/src/cli/public-command-errors.ts +581 -0
- package/src/cli/public-command-evidence.ts +717 -0
- package/src/cli/public-command-help.ts +360 -0
- package/src/cli/public-command-registry.ts +535 -0
- package/src/cli/session-picker.ts +2 -1
- package/src/cli/setup-cli.ts +9 -1
- package/src/cli/skills-cli.ts +46 -2
- package/src/cli.ts +61 -1
- package/src/commands/daemon.ts +65 -69
- package/src/commands/sdk.ts +232 -100
- package/src/commands/setup.ts +2 -0
- package/src/commands/skills.ts +11 -0
- package/src/config/autorouting-tier-map.ts +16 -0
- package/src/config/file-lock.ts +199 -68
- package/src/config/model-profile-activation.ts +406 -53
- package/src/config/model-registry.ts +204 -25
- package/src/config/settings-schema.ts +26 -2
- package/src/coordinator-mcp/policy.ts +10 -5
- package/src/coordinator-mcp/question-gate-codec.ts +17 -0
- package/src/coordinator-mcp/question-state.ts +175 -8
- package/src/coordinator-mcp/server.ts +528 -87
- package/src/coordinator-mcp/session-reaper.ts +6 -4
- package/src/crash/record-loader.ts +6 -2
- package/src/daemon/operator-contract.ts +26 -12
- package/src/debug/report-bundle.ts +114 -24
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +1 -1
- package/src/eval/js/context-manager.ts +8 -8
- package/src/eval/js/worker-core.ts +9 -4
- package/src/eval/js/worker-protocol.ts +2 -0
- package/src/extensibility/extensions/runner.ts +52 -4
- package/src/extensibility/extensions/types.ts +10 -0
- package/src/extensibility/gjc-plugins/registry.ts +196 -37
- package/src/extensibility/runtime-skill-discovery.ts +61 -3
- package/src/extensibility/shared-events.ts +3 -1
- package/src/gjc-runtime/managed-owner-admission.ts +67 -50
- package/src/gjc-runtime/session-state-lock.ts +165 -24
- package/src/gjc-runtime/ultragoal-succession.ts +31 -3
- package/src/internal-urls/docs-index.generated.ts +21 -19
- package/src/internal-urls/embedded-protocol.ts +83 -0
- package/src/internal-urls/index.ts +1 -0
- package/src/internal-urls/parse.ts +21 -1
- package/src/internal-urls/router.ts +4 -2
- package/src/main.ts +123 -55
- package/src/modes/acp/acp-agent.ts +593 -47
- package/src/modes/acp/acp-event-mapper.ts +9 -0
- package/src/modes/acp/startup-provenance.ts +59 -0
- package/src/modes/components/custom-provider-wizard.ts +308 -7
- package/src/modes/components/model-selector.ts +31 -15
- package/src/modes/components/oauth-selector.ts +9 -0
- package/src/modes/components/session-selector.ts +47 -4
- package/src/modes/components/status-line/segments.ts +6 -1
- package/src/modes/components/thinking-selector.ts +7 -3
- package/src/modes/components/user-message-selector.ts +57 -15
- package/src/modes/controllers/command-controller.ts +58 -32
- package/src/modes/controllers/extension-ui-controller.ts +33 -7
- package/src/modes/controllers/input-controller.ts +4 -0
- package/src/modes/controllers/selector-controller.ts +177 -18
- package/src/modes/interactive-mode.ts +21 -7
- package/src/modes/runtime-init.ts +1 -0
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +124 -7
- package/src/modes/shared/agent-wire/workflow-gate-types.ts +16 -2
- package/src/modes/types.ts +2 -2
- package/src/prompts/agent-fragments/browser-aside.md +1 -0
- package/src/prompts/system/title-system.md +1 -1
- package/src/prompts/tools/bash.md +1 -1
- package/src/prompts/tools/job.md +1 -1
- package/src/prompts/tools/read.md +2 -0
- package/src/runtime/network-prewarm-service.test.ts +36 -1
- package/src/runtime/network-prewarm-service.ts +28 -3
- package/src/runtime/process-lifecycle.ts +22 -11
- package/src/runtime-mcp/config.ts +16 -1
- package/src/runtime-mcp/manager.ts +689 -55
- package/src/runtime-mcp/pool.test.ts +31 -0
- package/src/runtime-mcp/pool.ts +304 -28
- package/src/runtime-mcp/redaction.ts +42 -0
- package/src/runtime-mcp/startup-policy.ts +7 -0
- package/src/runtime-mcp/tool-bridge.ts +71 -0
- package/src/runtime-mcp/transports/http.ts +108 -25
- package/src/sdk/acp/adapter.ts +90 -9
- package/src/sdk/acp/final-text.ts +19 -2
- package/src/sdk/broker/broker.ts +378 -52
- package/src/sdk/broker/ensure.ts +97 -19
- package/src/sdk/broker/identity.ts +9 -1
- package/src/sdk/broker/lifecycle-ledger.ts +95 -31
- package/src/sdk/broker/lifecycle.ts +690 -141
- package/src/sdk/broker/runtime.ts +1 -1
- package/src/sdk/broker/session-index.ts +97 -4
- package/src/sdk/broker/spawn-authority.ts +35 -7
- package/src/sdk/broker/stderr-drainer.ts +59 -0
- package/src/sdk/bus/chat-daemon-control.ts +2 -2
- package/src/sdk/bus/chat-daemon-runtime.ts +1 -0
- package/src/sdk/bus/index.ts +721 -84
- package/src/sdk/bus/telegram-daemon-cli.ts +31 -2
- package/src/sdk/bus/telegram-daemon-contract.ts +3 -1
- package/src/sdk/bus/telegram-daemon.ts +10 -3
- package/src/sdk/cli/master-cli.ts +47 -36
- package/src/sdk/cli/rows.ts +30 -7
- package/src/sdk/cli/session-cli.ts +687 -184
- package/src/sdk/client/client.ts +18 -0
- package/src/sdk/guides/catalog.ts +2 -2
- package/src/sdk/guides/cli.ts +20 -62
- package/src/sdk/guides/verify.ts +14 -0
- package/src/sdk/host/host.ts +49 -5
- package/src/sdk/host/session-runtime.test.ts +636 -9
- package/src/sdk/host/session-runtime.ts +499 -118
- package/src/sdk/host/types.ts +12 -1
- package/src/sdk/host/websocket-transport.lifecycle.test.ts +84 -0
- package/src/sdk/host/websocket-transport.ts +40 -6
- package/src/sdk/index.ts +11 -0
- package/src/sdk/prompt-deadline-flush.ts +334 -0
- package/src/sdk/prompt-deadline-manager.ts +136 -4
- package/src/sdk/prompt-failure.ts +43 -1
- package/src/sdk/prompt-status.ts +8 -0
- package/src/sdk/prompt-tool-boundary.ts +121 -0
- package/src/sdk/protocol/operation-inventory.generated.json +106 -0
- package/src/sdk/router/replay-retention-gap-cache.ts +27 -0
- package/src/sdk/router/session-router.ts +31 -4
- package/src/sdk/session.ts +194 -16
- package/src/sdk/startup-capability.ts +1 -1
- package/src/sdk/transport/relay.ts +71 -6
- package/src/sdk/transport/serve-cli.ts +494 -49
- package/src/sdk/transport/socket.ts +12 -11
- package/src/sdk/transport/stdio.ts +7 -3
- package/src/session/agent-session.ts +2437 -400
- package/src/session/fallback-chain-controller.ts +6 -7
- package/src/session/fold-coordinator.ts +24 -5
- package/src/session/internal/managed-session-scope.ts +58 -18
- package/src/session/internal/managed-session-storage.ts +304 -11
- package/src/session/session-manager.ts +382 -44
- package/src/session/session-work-lease.ts +34 -0
- package/src/session-import/codex.ts +12 -3
- package/src/setup/model-onboarding-guidance.ts +1 -1
- package/src/setup/provider-onboarding.ts +397 -24
- package/src/slash-commands/builtin-registry.ts +258 -14
- package/src/task/index.ts +14 -2
- package/src/thinking.ts +21 -2
- package/src/tools/bash.ts +98 -78
- package/src/tools/fetch.ts +119 -20
- package/src/tools/job.ts +151 -25
- package/src/tools/output-meta.ts +15 -2
- package/src/tools/path-utils.ts +27 -3
- package/src/tools/read.ts +3 -3
- package/src/tools/steer-fold.ts +107 -0
- package/src/tools/tool-catalog.generated.ts +29 -2
- package/src/tools/tool-errors.ts +4 -0
- package/src/utils/git.ts +53 -3
- package/src/utils/markit.ts +55 -41
- package/src/utils/mupdf-assets.d.ts +4 -0
- package/src/utils/mupdf-embedded.ts +4 -0
- package/src/utils/mupdf-wasm-embedded.ts +3 -0
- package/src/utils/mupdf-wasm.ts +24 -2
- package/src/utils/mupdf.ts +129 -0
- package/src/utils/session-title-generation.ts +29 -0
- package/src/utils/title-generator.ts +46 -2
- package/src/web/scrapers/types.ts +24 -3
- package/vendor/markit-ai/LICENSE +21 -0
- package/vendor/markit-ai/MANIFEST.json +412 -0
- package/vendor/markit-ai/dist/commands/config.d.ts +4 -0
- package/vendor/markit-ai/dist/commands/config.js +139 -0
- package/vendor/markit-ai/dist/commands/convert.d.ts +6 -0
- package/vendor/markit-ai/dist/commands/convert.js +113 -0
- package/vendor/markit-ai/dist/commands/formats.d.ts +2 -0
- package/vendor/markit-ai/dist/commands/formats.js +92 -0
- package/vendor/markit-ai/dist/commands/init.d.ts +2 -0
- package/vendor/markit-ai/dist/commands/init.js +29 -0
- package/vendor/markit-ai/dist/commands/onboard.d.ts +2 -0
- package/vendor/markit-ai/dist/commands/onboard.js +61 -0
- package/vendor/markit-ai/dist/commands/plugin.d.ts +4 -0
- package/vendor/markit-ai/dist/commands/plugin.js +58 -0
- package/vendor/markit-ai/dist/config.d.ts +26 -0
- package/vendor/markit-ai/dist/config.js +42 -0
- package/vendor/markit-ai/dist/converters/audio.d.ts +7 -0
- package/vendor/markit-ai/dist/converters/audio.js +104 -0
- package/vendor/markit-ai/dist/converters/csv.d.ts +7 -0
- package/vendor/markit-ai/dist/converters/csv.js +83 -0
- package/vendor/markit-ai/dist/converters/docx.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/docx.js +57 -0
- package/vendor/markit-ai/dist/converters/epub.d.ts +8 -0
- package/vendor/markit-ai/dist/converters/epub.js +128 -0
- package/vendor/markit-ai/dist/converters/github.d.ts +18 -0
- package/vendor/markit-ai/dist/converters/github.js +148 -0
- package/vendor/markit-ai/dist/converters/html.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/html.js +30 -0
- package/vendor/markit-ai/dist/converters/image.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/image.js +124 -0
- package/vendor/markit-ai/dist/converters/ipynb.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/ipynb.js +75 -0
- package/vendor/markit-ai/dist/converters/iwork.d.ts +20 -0
- package/vendor/markit-ai/dist/converters/iwork.js +391 -0
- package/vendor/markit-ai/dist/converters/json.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/json.js +21 -0
- package/vendor/markit-ai/dist/converters/pdf/columns.d.ts +35 -0
- package/vendor/markit-ai/dist/converters/pdf/columns.js +93 -0
- package/vendor/markit-ai/dist/converters/pdf/extract.d.ts +19 -0
- package/vendor/markit-ai/dist/converters/pdf/extract.js +514 -0
- package/vendor/markit-ai/dist/converters/pdf/grid.d.ts +25 -0
- package/vendor/markit-ai/dist/converters/pdf/grid.js +795 -0
- package/vendor/markit-ai/dist/converters/pdf/headers.d.ts +24 -0
- package/vendor/markit-ai/dist/converters/pdf/headers.js +108 -0
- package/vendor/markit-ai/dist/converters/pdf/index.d.ts +19 -0
- package/vendor/markit-ai/dist/converters/pdf/index.js +136 -0
- package/vendor/markit-ai/dist/converters/pdf/mupdf-loader.js +9 -0
- package/vendor/markit-ai/dist/converters/pdf/render.d.ts +24 -0
- package/vendor/markit-ai/dist/converters/pdf/render.js +513 -0
- package/vendor/markit-ai/dist/converters/pdf/types.d.ts +75 -0
- package/vendor/markit-ai/dist/converters/pdf/types.js +1 -0
- package/vendor/markit-ai/dist/converters/plain-text.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/plain-text.js +87 -0
- package/vendor/markit-ai/dist/converters/pptx.d.ts +8 -0
- package/vendor/markit-ai/dist/converters/pptx.js +289 -0
- package/vendor/markit-ai/dist/converters/rss.d.ts +11 -0
- package/vendor/markit-ai/dist/converters/rss.js +138 -0
- package/vendor/markit-ai/dist/converters/wikipedia.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/wikipedia.js +33 -0
- package/vendor/markit-ai/dist/converters/xlsx.d.ts +8 -0
- package/vendor/markit-ai/dist/converters/xlsx.js +147 -0
- package/vendor/markit-ai/dist/converters/xml.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/xml.js +18 -0
- package/vendor/markit-ai/dist/converters/yaml.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/yaml.js +17 -0
- package/vendor/markit-ai/dist/converters/zip.d.ts +8 -0
- package/vendor/markit-ai/dist/converters/zip.js +57 -0
- package/vendor/markit-ai/dist/index.d.ts +30 -0
- package/vendor/markit-ai/dist/index.js +26 -0
- package/vendor/markit-ai/dist/main.d.ts +2 -0
- package/vendor/markit-ai/dist/main.js +191 -0
- package/vendor/markit-ai/dist/markit.d.ts +45 -0
- package/vendor/markit-ai/dist/markit.js +267 -0
- package/vendor/markit-ai/dist/plugins/api.d.ts +7 -0
- package/vendor/markit-ai/dist/plugins/api.js +42 -0
- package/vendor/markit-ai/dist/plugins/index.d.ts +4 -0
- package/vendor/markit-ai/dist/plugins/index.js +3 -0
- package/vendor/markit-ai/dist/plugins/installer.d.ts +25 -0
- package/vendor/markit-ai/dist/plugins/installer.js +176 -0
- package/vendor/markit-ai/dist/plugins/loader.d.ts +6 -0
- package/vendor/markit-ai/dist/plugins/loader.js +61 -0
- package/vendor/markit-ai/dist/plugins/types.d.ts +25 -0
- package/vendor/markit-ai/dist/plugins/types.js +1 -0
- package/vendor/markit-ai/dist/providers/anthropic.d.ts +2 -0
- package/vendor/markit-ai/dist/providers/anthropic.js +47 -0
- package/vendor/markit-ai/dist/providers/index.d.ts +21 -0
- package/vendor/markit-ai/dist/providers/index.js +56 -0
- package/vendor/markit-ai/dist/providers/openai.d.ts +2 -0
- package/vendor/markit-ai/dist/providers/openai.js +76 -0
- package/vendor/markit-ai/dist/providers/types.d.ts +26 -0
- package/vendor/markit-ai/dist/providers/types.js +1 -0
- package/vendor/markit-ai/dist/types.d.ts +36 -0
- package/vendor/markit-ai/dist/types.js +1 -0
- package/vendor/markit-ai/dist/utils/exit-codes.d.ts +4 -0
- package/vendor/markit-ai/dist/utils/exit-codes.js +4 -0
- package/vendor/markit-ai/dist/utils/output.d.ts +22 -0
- package/vendor/markit-ai/dist/utils/output.js +31 -0
- package/vendor/markit-ai/dist/utils/turndown.d.ts +8 -0
- package/vendor/markit-ai/dist/utils/turndown.js +70 -0
- package/vendor/markit-ai/package.json +74 -0
- package/vendor/markit-ai.patch +49 -0
|
@@ -6,7 +6,7 @@ import { currentExecutablePath } from "@gajae-code/natives";
|
|
|
6
6
|
|
|
7
7
|
import internalSourceMarker from "./internal-source-marker-2178.txt" with { type: "file" };
|
|
8
8
|
|
|
9
|
-
export type SdkInternalAction = "broker-internal" | "session-host-internal";
|
|
9
|
+
export type SdkInternalAction = "broker-internal" | "session-host-internal" | "stderr-drain-internal";
|
|
10
10
|
|
|
11
11
|
export type SdkInternalSpawnCommand =
|
|
12
12
|
| {
|
|
@@ -5,6 +5,7 @@ import { logger, resolveEquivalentPath } from "@gajae-code/utils";
|
|
|
5
5
|
import { nativeProcessBindings } from "@gajae-code/utils/native-process";
|
|
6
6
|
import { withFileLock } from "../../config/file-lock";
|
|
7
7
|
import { repo } from "../../utils/git";
|
|
8
|
+
import { endpointIncarnation } from "./endpoint-authority";
|
|
8
9
|
import { processIncarnation } from "./process-incarnation";
|
|
9
10
|
import {
|
|
10
11
|
assertSupportedSessionIndexEventVersion,
|
|
@@ -26,7 +27,7 @@ export type SessionIndexEventType =
|
|
|
26
27
|
| "record_reconciled";
|
|
27
28
|
|
|
28
29
|
export type SessionActivityState = "active" | "idle";
|
|
29
|
-
/**
|
|
30
|
+
/** Host-reported or broker-coalesced heartbeat: state plus the observation time. */
|
|
30
31
|
export interface SessionActivity {
|
|
31
32
|
state: SessionActivityState;
|
|
32
33
|
at: number;
|
|
@@ -34,6 +35,8 @@ export interface SessionActivity {
|
|
|
34
35
|
/** Events persisted without an OS process incarnation (v1/v2 era) are legacy provenance. */
|
|
35
36
|
export type SessionIdentityProvenance = "composite" | "legacy";
|
|
36
37
|
export type SessionTombstoneRule = "retain" | "expire";
|
|
38
|
+
/** Durable provenance for a retired host registration. */
|
|
39
|
+
export type HostUnregisteredReason = "process_exited" | "detached_idle";
|
|
37
40
|
/**
|
|
38
41
|
* Injected retention policy (C3). The broker schedules compaction independently of
|
|
39
42
|
* rotation; settings apply at the next scheduled compaction. `clock` drives both
|
|
@@ -141,6 +144,7 @@ export interface SessionIndexEvent {
|
|
|
141
144
|
/** Immutable endpoint file identity captured by the broker at registration. */
|
|
142
145
|
endpointFileId?: string;
|
|
143
146
|
lifecycleRequestId?: string;
|
|
147
|
+
hostUnregisteredReason?: HostUnregisteredReason;
|
|
144
148
|
terminalUncertain?: boolean;
|
|
145
149
|
/**
|
|
146
150
|
* Distinguishes the terminal-uncertain claim written by a forced stop of a
|
|
@@ -170,6 +174,7 @@ export interface IndexedSession {
|
|
|
170
174
|
live: boolean;
|
|
171
175
|
indexSeq: number;
|
|
172
176
|
lifecycleRequestId?: string;
|
|
177
|
+
hostUnregisteredReason?: HostUnregisteredReason;
|
|
173
178
|
terminalUncertain?: boolean;
|
|
174
179
|
/** True only for a terminal-uncertain claim written by a forced stale-worktree release. */
|
|
175
180
|
forcedStaleRelease?: boolean;
|
|
@@ -345,6 +350,8 @@ function sameIndexChangeStamp(a: SessionIndexChangeStamp, b: SessionIndexChangeS
|
|
|
345
350
|
const ROTATE_BYTES = 4 * 1024 * 1024;
|
|
346
351
|
/** Coalesced heartbeat checkpoint rate cap (C2): at most one per session per minute. */
|
|
347
352
|
export const SESSION_HEARTBEAT_INTERVAL_MS = 60_000;
|
|
353
|
+
/** A stale-host retirement requires silence well beyond the broker freshness window. */
|
|
354
|
+
export const DEAD_HOST_HEARTBEAT_SILENCE_MS = 10 * SESSION_HEARTBEAT_INTERVAL_MS;
|
|
348
355
|
export const DEFAULT_SESSION_RETENTION_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;
|
|
349
356
|
export const DEFAULT_SESSION_RETENTION_MAX_ROWS = 25_000;
|
|
350
357
|
|
|
@@ -571,6 +578,10 @@ function projectIdentity(
|
|
|
571
578
|
const { latest, heartbeat } = state;
|
|
572
579
|
const terminal = isTerminalEvent(latest);
|
|
573
580
|
const terminalUncertain = latest.type === "lifecycle_terminal" || latest.terminalUncertain === true;
|
|
581
|
+
const hostUnregisteredReason =
|
|
582
|
+
latest.hostUnregisteredReason === "process_exited" || latest.hostUnregisteredReason === "detached_idle"
|
|
583
|
+
? latest.hostUnregisteredReason
|
|
584
|
+
: undefined;
|
|
574
585
|
const pidAlive = alive(latest.pid);
|
|
575
586
|
// Liveness evidence is host-written: a checkpointed heartbeat, or the
|
|
576
587
|
// `host_registered` event the host appended itself. Counting registration
|
|
@@ -606,6 +617,7 @@ function projectIdentity(
|
|
|
606
617
|
endpointMtimeMs: latest.endpointMtimeMs,
|
|
607
618
|
endpointFileId: latest.endpointFileId,
|
|
608
619
|
lifecycleRequestId: latest.lifecycleRequestId,
|
|
620
|
+
...(hostUnregisteredReason === undefined ? {} : { hostUnregisteredReason }),
|
|
609
621
|
terminalUncertain,
|
|
610
622
|
...(latest.forcedStaleRelease === true ? { forcedStaleRelease: true } : {}),
|
|
611
623
|
indexSeq: latest.indexSeq,
|
|
@@ -1687,6 +1699,82 @@ export class SessionIndex {
|
|
|
1687
1699
|
});
|
|
1688
1700
|
});
|
|
1689
1701
|
}
|
|
1702
|
+
|
|
1703
|
+
/**
|
|
1704
|
+
* Atomically fence an exact, long-silent dead-host authority before a caller
|
|
1705
|
+
* removes state outside the broker index. The comparison and terminal event
|
|
1706
|
+
* append share the machine-global index lock, so a heartbeat, successor
|
|
1707
|
+
* registration, or unresolved-authority update that wins the lock prevents
|
|
1708
|
+
* destructive coordinator cleanup.
|
|
1709
|
+
*/
|
|
1710
|
+
async retireStaleIfCurrent(expected: {
|
|
1711
|
+
sessionId: string;
|
|
1712
|
+
workspace: string;
|
|
1713
|
+
endpointGeneration: number;
|
|
1714
|
+
endpointIncarnation: string;
|
|
1715
|
+
}): Promise<"retired" | "already_retired" | "not_found" | "stale"> {
|
|
1716
|
+
const indexPath = path.resolve(logFor(this.#agentDir));
|
|
1717
|
+
// Process-incarnation observations are gathered before the lock. The locked
|
|
1718
|
+
// projection then uses this fixed batch, avoiding an unbounded OS probe while
|
|
1719
|
+
// holding the machine-global index lock.
|
|
1720
|
+
const probed = new Map<string, string | undefined>();
|
|
1721
|
+
for (const row of reduceEvents(this.#events, this.#policy.clock(), this.#agentDir).identities) {
|
|
1722
|
+
const recordedIncarnation = row.hostIncarnation ?? row.processIncarnation;
|
|
1723
|
+
if (recordedIncarnation === undefined || !alive(row.pid)) continue;
|
|
1724
|
+
probed.set(`${row.sessionId}\u0000${row.endpointGeneration}\u0000${row.pid}`, processIncarnation(row.pid));
|
|
1725
|
+
}
|
|
1726
|
+
return await SessionIndex.#enqueue(indexPath, async () => {
|
|
1727
|
+
try {
|
|
1728
|
+
await fs.stat(dirFor(this.#agentDir));
|
|
1729
|
+
} catch (error) {
|
|
1730
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return "not_found";
|
|
1731
|
+
throw error;
|
|
1732
|
+
}
|
|
1733
|
+
return await withSessionIndexLock("stale session retirement", this.#agentDir, async () => {
|
|
1734
|
+
await this.#replayUnderLock();
|
|
1735
|
+
if (this.#corruptSuffix) throw new Error("Cannot retire a session from a corrupt session index");
|
|
1736
|
+
const current = this.listSessions(probed).sessions.find(
|
|
1737
|
+
session => session.sessionId === expected.sessionId,
|
|
1738
|
+
);
|
|
1739
|
+
if (!current) return "not_found";
|
|
1740
|
+
if (
|
|
1741
|
+
resolveEquivalentPath(current.locator.cwd) !== resolveEquivalentPath(expected.workspace) ||
|
|
1742
|
+
current.endpointGeneration !== expected.endpointGeneration ||
|
|
1743
|
+
endpointIncarnation(current, expected.sessionId) !== expected.endpointIncarnation
|
|
1744
|
+
)
|
|
1745
|
+
return "stale";
|
|
1746
|
+
if (current.ambiguous || current.terminalUncertain) return "stale";
|
|
1747
|
+
if (current.terminal) return "already_retired";
|
|
1748
|
+
if (
|
|
1749
|
+
current.live !== false ||
|
|
1750
|
+
current.lastHeartbeatAt === undefined ||
|
|
1751
|
+
this.#policy.clock() - current.lastHeartbeatAt < DEAD_HOST_HEARTBEAT_SILENCE_MS
|
|
1752
|
+
)
|
|
1753
|
+
return "stale";
|
|
1754
|
+
const unsigned: Omit<SessionIndexEvent, "checksum"> = {
|
|
1755
|
+
version: SESSION_INDEX_EVENT_VERSION,
|
|
1756
|
+
indexSeq: this.indexSeq + 1,
|
|
1757
|
+
ts: Date.now(),
|
|
1758
|
+
type: "session_closed",
|
|
1759
|
+
sessionId: current.sessionId,
|
|
1760
|
+
locator: current.locator,
|
|
1761
|
+
endpointGeneration: current.endpointGeneration,
|
|
1762
|
+
pid: current.pid,
|
|
1763
|
+
...(current.processIncarnation === undefined ? {} : { processIncarnation: current.processIncarnation }),
|
|
1764
|
+
...(current.hostIncarnation === undefined ? {} : { hostIncarnation: current.hostIncarnation }),
|
|
1765
|
+
...(current.endpointMtimeMs === undefined ? {} : { endpointMtimeMs: current.endpointMtimeMs }),
|
|
1766
|
+
...(current.endpointFileId === undefined ? {} : { endpointFileId: current.endpointFileId }),
|
|
1767
|
+
...(current.lifecycleRequestId === undefined ? {} : { lifecycleRequestId: current.lifecycleRequestId }),
|
|
1768
|
+
};
|
|
1769
|
+
const event: SessionIndexEvent = { ...unsigned, checksum: sessionIndexChecksum(unsigned) };
|
|
1770
|
+
await appendSync(logFor(this.#agentDir), JSON.stringify(event));
|
|
1771
|
+
await this.#refreshUnderLock();
|
|
1772
|
+
if ((await fs.stat(logFor(this.#agentDir))).size >= ROTATE_BYTES) await this.#rotate();
|
|
1773
|
+
return "retired";
|
|
1774
|
+
});
|
|
1775
|
+
});
|
|
1776
|
+
}
|
|
1777
|
+
|
|
1690
1778
|
async unregisterIfCurrent(
|
|
1691
1779
|
expected: Pick<
|
|
1692
1780
|
SessionIndexEvent,
|
|
@@ -1701,6 +1789,7 @@ export class SessionIndex {
|
|
|
1701
1789
|
| "processIncarnation"
|
|
1702
1790
|
| "hostIncarnation"
|
|
1703
1791
|
>,
|
|
1792
|
+
reason?: HostUnregisteredReason,
|
|
1704
1793
|
): Promise<boolean> {
|
|
1705
1794
|
const indexPath = path.resolve(logFor(this.#agentDir));
|
|
1706
1795
|
return await SessionIndex.#enqueue(indexPath, async () => {
|
|
@@ -1781,6 +1870,7 @@ export class SessionIndex {
|
|
|
1781
1870
|
...(expected.lifecycleRequestId === undefined
|
|
1782
1871
|
? {}
|
|
1783
1872
|
: { lifecycleRequestId: expected.lifecycleRequestId }),
|
|
1873
|
+
...(reason === undefined ? {} : { hostUnregisteredReason: reason }),
|
|
1784
1874
|
};
|
|
1785
1875
|
const event: SessionIndexEvent = { ...unsigned, checksum: sessionIndexChecksum(unsigned) };
|
|
1786
1876
|
await appendSync(logFor(this.#agentDir), JSON.stringify(event));
|
|
@@ -1866,10 +1956,10 @@ export class SessionIndex {
|
|
|
1866
1956
|
this.#changeStamp = await readIndexChangeStamp(this.#agentDir);
|
|
1867
1957
|
}
|
|
1868
1958
|
|
|
1869
|
-
listSessions(): SessionList {
|
|
1959
|
+
listSessions(probedIncarnations?: ReadonlyMap<string, string | undefined>): SessionList {
|
|
1870
1960
|
return {
|
|
1871
1961
|
indexSeq: this.indexSeq,
|
|
1872
|
-
sessions: reduceEvents(this.#events, this.#policy.clock(), this.#agentDir).sessions,
|
|
1962
|
+
sessions: reduceEvents(this.#events, this.#policy.clock(), this.#agentDir, probedIncarnations).sessions,
|
|
1873
1963
|
warnings: this.#warnings,
|
|
1874
1964
|
};
|
|
1875
1965
|
}
|
|
@@ -2323,7 +2413,10 @@ export class SessionIndex {
|
|
|
2323
2413
|
...(row.processIncarnation === undefined ? {} : { processIncarnation: row.processIncarnation }),
|
|
2324
2414
|
...(row.hostIncarnation === undefined ? {} : { hostIncarnation: row.hostIncarnation }),
|
|
2325
2415
|
...(row.masterRole === undefined ? {} : { masterRole: row.masterRole }),
|
|
2326
|
-
|
|
2416
|
+
// Preserve the host's last observed activity state while this
|
|
2417
|
+
// broker-owned heartbeat only renews liveness. A live idle host
|
|
2418
|
+
// must not be rewritten as active merely because its pid is alive.
|
|
2419
|
+
activity: row.activity ?? { state: "active", at: now },
|
|
2327
2420
|
ts: now,
|
|
2328
2421
|
};
|
|
2329
2422
|
events.push({ ...unsigned, checksum: sessionIndexChecksum(unsigned) });
|
|
@@ -23,6 +23,8 @@ export type SpawnClaimV2 = {
|
|
|
23
23
|
failure?: SpawnSubstrateFailure;
|
|
24
24
|
preSendLease?: { epoch: string; status: "owned" | "consumed" };
|
|
25
25
|
childId?: string;
|
|
26
|
+
/** Launch proof retained while registration is still unbound so a later retry can re-prove or close it. */
|
|
27
|
+
substrateProof?: SpawnSubstrateProof;
|
|
26
28
|
seed?: SeedDeliveryV2;
|
|
27
29
|
authorityRef?: string;
|
|
28
30
|
createdAt: number;
|
|
@@ -139,6 +141,8 @@ export type SpawnClaimTransition = {
|
|
|
139
141
|
leaseEpoch?: string;
|
|
140
142
|
/** The fresh child ID is committed before substrate launch. */
|
|
141
143
|
childId?: string;
|
|
144
|
+
/** Launch proof may be appended to the pre-registration state for later reconciliation. */
|
|
145
|
+
substrateProof?: SpawnSubstrateProof;
|
|
142
146
|
/** Required for seed and terminal state transitions that carry Q26 facts. */
|
|
143
147
|
seed?: SeedDeliveryV2;
|
|
144
148
|
failure?: SpawnSubstrateFailure;
|
|
@@ -225,6 +229,7 @@ const CLAIM_KEYS = new Set([
|
|
|
225
229
|
"failure",
|
|
226
230
|
"preSendLease",
|
|
227
231
|
"childId",
|
|
232
|
+
"substrateProof",
|
|
228
233
|
"seed",
|
|
229
234
|
"authorityRef",
|
|
230
235
|
"createdAt",
|
|
@@ -272,13 +277,13 @@ const FORBIDDEN_FIELD =
|
|
|
272
277
|
/(?:task|prompt|capability|idempotency|fingerprint|requesthash|digest|credential|token|secret|password|stderr)/i;
|
|
273
278
|
const TRANSITION_EDGES: Readonly<Record<SpawnClaimV2["state"], readonly SpawnClaimV2["state"][]>> = {
|
|
274
279
|
prepared: ["substrate_starting", "pre_send_rejected", "uncertain", "closed"],
|
|
275
|
-
substrate_starting: ["authority_active", "pre_send_rejected", "uncertain", "closed"],
|
|
280
|
+
substrate_starting: ["substrate_starting", "authority_active", "pre_send_rejected", "uncertain", "closed"],
|
|
276
281
|
authority_active: ["seed_prepared", "pre_send_rejected", "uncertain", "closed"],
|
|
277
282
|
seed_prepared: ["dispatching", "pre_send_rejected", "uncertain", "closed"],
|
|
278
283
|
dispatching: ["accepted", "pre_send_rejected", "uncertain", "closed"],
|
|
279
284
|
accepted: ["uncertain", "closed"],
|
|
280
285
|
pre_send_rejected: ["uncertain", "closed"],
|
|
281
|
-
uncertain: ["closed"],
|
|
286
|
+
uncertain: ["pre_send_rejected", "closed"],
|
|
282
287
|
closed: [],
|
|
283
288
|
};
|
|
284
289
|
|
|
@@ -476,6 +481,7 @@ export function isSpawnClaimV2(value: unknown): value is SpawnClaimV2 {
|
|
|
476
481
|
((lease as { status?: unknown }).status === "owned" ||
|
|
477
482
|
(lease as { status?: unknown }).status === "consumed"))) &&
|
|
478
483
|
(claim.childId === undefined || isOpaque(claim.childId)) &&
|
|
484
|
+
(claim.substrateProof === undefined || isSpawnSubstrateProof(claim.substrateProof)) &&
|
|
479
485
|
(claim.seed === undefined || isSeed(claim.seed)) &&
|
|
480
486
|
(claim.authorityRef === undefined || isOpaque(claim.authorityRef)) &&
|
|
481
487
|
(claim.failure === undefined || isSpawnSubstrateFailure(claim.failure)) &&
|
|
@@ -698,10 +704,19 @@ export class SpawnAuthorityStore {
|
|
|
698
704
|
!isOpaque(transition.childId) ||
|
|
699
705
|
transition.seed !== undefined ||
|
|
700
706
|
transition.authority !== undefined ||
|
|
701
|
-
transition.failure !== undefined
|
|
707
|
+
transition.failure !== undefined ||
|
|
708
|
+
(transition.substrateProof !== undefined && !isSpawnSubstrateProof(transition.substrateProof)) ||
|
|
709
|
+
(current.state === "prepared" && transition.substrateProof !== undefined) ||
|
|
710
|
+
(current.state === "substrate_starting" && transition.substrateProof === undefined) ||
|
|
711
|
+
(current.state === "substrate_starting" && transition.childId !== current.childId)
|
|
702
712
|
)
|
|
703
713
|
throw new SpawnAuthorityTransitionError("invalid_transition");
|
|
704
|
-
next = {
|
|
714
|
+
next = {
|
|
715
|
+
...current,
|
|
716
|
+
state: "substrate_starting",
|
|
717
|
+
childId: transition.childId,
|
|
718
|
+
...(transition.substrateProof === undefined ? {} : { substrateProof: transition.substrateProof }),
|
|
719
|
+
};
|
|
705
720
|
break;
|
|
706
721
|
}
|
|
707
722
|
case "authority_active": {
|
|
@@ -804,7 +819,11 @@ export class SpawnAuthorityStore {
|
|
|
804
819
|
break;
|
|
805
820
|
}
|
|
806
821
|
case "uncertain": {
|
|
807
|
-
if (
|
|
822
|
+
if (
|
|
823
|
+
transition.childId !== undefined ||
|
|
824
|
+
transition.authority !== undefined ||
|
|
825
|
+
(transition.failure !== undefined && !isSpawnSubstrateFailure(transition.failure))
|
|
826
|
+
)
|
|
808
827
|
throw new SpawnAuthorityTransitionError("invalid_transition");
|
|
809
828
|
if (current.seed) {
|
|
810
829
|
if (
|
|
@@ -813,10 +832,19 @@ export class SpawnAuthorityStore {
|
|
|
813
832
|
!sameSeedIdentity(current.seed, transition.seed)
|
|
814
833
|
)
|
|
815
834
|
throw new SpawnAuthorityTransitionError("invalid_transition");
|
|
816
|
-
next = {
|
|
835
|
+
next = {
|
|
836
|
+
...current,
|
|
837
|
+
state: "uncertain",
|
|
838
|
+
seed: transition.seed,
|
|
839
|
+
...(transition.failure === undefined ? {} : { failure: transition.failure }),
|
|
840
|
+
};
|
|
817
841
|
} else {
|
|
818
842
|
if (transition.seed !== undefined) throw new SpawnAuthorityTransitionError("invalid_transition");
|
|
819
|
-
next = {
|
|
843
|
+
next = {
|
|
844
|
+
...current,
|
|
845
|
+
state: "uncertain",
|
|
846
|
+
...(transition.failure === undefined ? {} : { failure: transition.failure }),
|
|
847
|
+
};
|
|
820
848
|
}
|
|
821
849
|
break;
|
|
822
850
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
|
|
4
|
+
const MAX_DRAIN_BYTES = 64 * 1024;
|
|
5
|
+
|
|
6
|
+
function parseMaxBytes(value: string): number {
|
|
7
|
+
if (!/^[0-9]+$/u.test(value)) throw new Error("Invalid lifecycle stderr drainer byte limit.");
|
|
8
|
+
const maxBytes = Number(value);
|
|
9
|
+
if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0 || maxBytes > MAX_DRAIN_BYTES)
|
|
10
|
+
throw new Error("Invalid lifecycle stderr drainer byte limit.");
|
|
11
|
+
return maxBytes;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Parse and run the private source/compiled CLI drainer route. */
|
|
15
|
+
export async function runSdkStderrDrainerFromArgv(argv: readonly string[]): Promise<void> {
|
|
16
|
+
if (argv.length !== 4 || argv[0] !== "--path" || argv[1] === undefined || argv[2] !== "--max-bytes")
|
|
17
|
+
throw new Error("Invalid lifecycle stderr drainer invocation.");
|
|
18
|
+
if (!path.isAbsolute(argv[1])) throw new Error("Invalid lifecycle stderr drainer path.");
|
|
19
|
+
await runSdkStderrDrainer(argv[1], parseMaxBytes(argv[3] ?? ""));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Drain a detached lifecycle host's stderr without letting a noisy child grow
|
|
24
|
+
* its diagnostic artifact. The drainer owns the read side of the pipe, so the
|
|
25
|
+
* host remains attached to a process that outlives the broker itself.
|
|
26
|
+
*
|
|
27
|
+
* The artifact is written through one descriptor opened up front: once the
|
|
28
|
+
* broker has finished reading the startup diagnostic it unlinks the path, and
|
|
29
|
+
* the remaining output lands on an unlinked inode that disappears with this
|
|
30
|
+
* process instead of accumulating under the agent directory.
|
|
31
|
+
*/
|
|
32
|
+
export async function runSdkStderrDrainer(logPath: string, maxBytes: number): Promise<void> {
|
|
33
|
+
let handle: fs.FileHandle | undefined;
|
|
34
|
+
try {
|
|
35
|
+
handle = await fs.open(logPath, "w", 0o600);
|
|
36
|
+
} catch {
|
|
37
|
+
// Diagnostics are best effort; keep draining so the host never blocks.
|
|
38
|
+
}
|
|
39
|
+
let tail = Buffer.alloc(0);
|
|
40
|
+
try {
|
|
41
|
+
for await (const chunk of process.stdin) {
|
|
42
|
+
const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk as Uint8Array);
|
|
43
|
+
if (bytes.length >= maxBytes) tail = Buffer.from(bytes.subarray(bytes.length - maxBytes));
|
|
44
|
+
else {
|
|
45
|
+
const combined = Buffer.concat([tail, bytes]);
|
|
46
|
+
tail = combined.length > maxBytes ? Buffer.from(combined.subarray(combined.length - maxBytes)) : combined;
|
|
47
|
+
}
|
|
48
|
+
if (!handle) continue;
|
|
49
|
+
try {
|
|
50
|
+
await handle.truncate(0);
|
|
51
|
+
await handle.write(tail, 0, tail.length, 0);
|
|
52
|
+
} catch {
|
|
53
|
+
// Diagnostics are best effort; continue draining so the host never blocks.
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
} finally {
|
|
57
|
+
await handle?.close().catch(() => undefined);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -141,8 +141,8 @@ export type ChatDaemonAction = "stop" | "reload";
|
|
|
141
141
|
* crashes, recovery, and attachment retirement cannot replay ambiguous work.
|
|
142
142
|
*/
|
|
143
143
|
export const CHAT_DAEMON_GENERATIONS: Readonly<Record<ChatDaemonKind, number>> = {
|
|
144
|
-
discord:
|
|
145
|
-
slack:
|
|
144
|
+
discord: 79,
|
|
145
|
+
slack: 86,
|
|
146
146
|
};
|
|
147
147
|
|
|
148
148
|
export function chatDaemonGeneration(kind: ChatDaemonKind): number {
|