@qjp88995/agent-runtime 0.0.0-stage → 0.1.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/dist/agent-extensions.d.ts +30 -0
- package/dist/agent-extensions.d.ts.map +1 -0
- package/dist/agent-extensions.js +4 -0
- package/dist/agent-extensions.js.map +1 -0
- package/dist/builtins/ask-outcome.d.ts +49 -0
- package/dist/builtins/ask-outcome.d.ts.map +1 -0
- package/dist/builtins/ask-outcome.js +128 -0
- package/dist/builtins/ask-outcome.js.map +1 -0
- package/dist/builtins/ask-schema.d.ts +110 -0
- package/dist/builtins/ask-schema.d.ts.map +1 -0
- package/dist/builtins/ask-schema.js +124 -0
- package/dist/builtins/ask-schema.js.map +1 -0
- package/dist/builtins/ask.service.d.ts +210 -0
- package/dist/builtins/ask.service.d.ts.map +1 -0
- package/dist/builtins/ask.service.js +373 -0
- package/dist/builtins/ask.service.js.map +1 -0
- package/dist/builtins/ask.tool.d.ts +49 -0
- package/dist/builtins/ask.tool.d.ts.map +1 -0
- package/dist/builtins/ask.tool.js +109 -0
- package/dist/builtins/ask.tool.js.map +1 -0
- package/dist/builtins/index.d.ts +8 -0
- package/dist/builtins/index.d.ts.map +1 -0
- package/dist/builtins/index.js +8 -0
- package/dist/builtins/index.js.map +1 -0
- package/dist/builtins/todo-schema.d.ts +90 -0
- package/dist/builtins/todo-schema.d.ts.map +1 -0
- package/dist/builtins/todo-schema.js +97 -0
- package/dist/builtins/todo-schema.js.map +1 -0
- package/dist/builtins/todo-settle.hook.d.ts +110 -0
- package/dist/builtins/todo-settle.hook.d.ts.map +1 -0
- package/dist/builtins/todo-settle.hook.js +174 -0
- package/dist/builtins/todo-settle.hook.js.map +1 -0
- package/dist/builtins/todo.tool.d.ts +59 -0
- package/dist/builtins/todo.tool.d.ts.map +1 -0
- package/dist/builtins/todo.tool.js +107 -0
- package/dist/builtins/todo.tool.js.map +1 -0
- package/dist/context/context-budget-tracker.d.ts +185 -0
- package/dist/context/context-budget-tracker.d.ts.map +1 -0
- package/dist/context/context-budget-tracker.js +400 -0
- package/dist/context/context-budget-tracker.js.map +1 -0
- package/dist/context/context-budget.d.ts +48 -0
- package/dist/context/context-budget.d.ts.map +1 -0
- package/dist/context/context-budget.js +89 -0
- package/dist/context/context-budget.js.map +1 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +3 -0
- package/dist/context/index.js.map +1 -0
- package/dist/extensions/repeat-call.hook.d.ts +32 -0
- package/dist/extensions/repeat-call.hook.d.ts.map +1 -0
- package/dist/extensions/repeat-call.hook.js +54 -0
- package/dist/extensions/repeat-call.hook.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +3 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/turn-hook.registry.d.ts +51 -0
- package/dist/hooks/turn-hook.registry.d.ts.map +1 -0
- package/dist/hooks/turn-hook.registry.js +233 -0
- package/dist/hooks/turn-hook.registry.js.map +1 -0
- package/dist/hooks/turn-hook.types.d.ts +179 -0
- package/dist/hooks/turn-hook.types.d.ts.map +1 -0
- package/dist/hooks/turn-hook.types.js +48 -0
- package/dist/hooks/turn-hook.types.js.map +1 -0
- package/dist/images/byte-cache.d.ts +24 -0
- package/dist/images/byte-cache.d.ts.map +1 -0
- package/dist/images/byte-cache.js +51 -0
- package/dist/images/byte-cache.js.map +1 -0
- package/dist/images/delivery.d.ts +115 -0
- package/dist/images/delivery.d.ts.map +1 -0
- package/dist/images/delivery.js +321 -0
- package/dist/images/delivery.js.map +1 -0
- package/dist/images/index.d.ts +5 -0
- package/dist/images/index.d.ts.map +1 -0
- package/dist/images/index.js +5 -0
- package/dist/images/index.js.map +1 -0
- package/dist/images/prompt.d.ts +151 -0
- package/dist/images/prompt.d.ts.map +1 -0
- package/dist/images/prompt.js +172 -0
- package/dist/images/prompt.js.map +1 -0
- package/dist/images/vendor-files.d.ts +93 -0
- package/dist/images/vendor-files.d.ts.map +1 -0
- package/dist/images/vendor-files.js +156 -0
- package/dist/images/vendor-files.js.map +1 -0
- package/dist/in-process/conversation-store.d.ts +64 -0
- package/dist/in-process/conversation-store.d.ts.map +1 -0
- package/dist/in-process/conversation-store.js +222 -0
- package/dist/in-process/conversation-store.js.map +1 -0
- package/dist/in-process/coordination.d.ts +54 -0
- package/dist/in-process/coordination.d.ts.map +1 -0
- package/dist/in-process/coordination.js +137 -0
- package/dist/in-process/coordination.js.map +1 -0
- package/dist/in-process/image-source.d.ts +15 -0
- package/dist/in-process/image-source.d.ts.map +1 -0
- package/dist/in-process/image-source.js +27 -0
- package/dist/in-process/image-source.js.map +1 -0
- package/dist/in-process/index.d.ts +36 -0
- package/dist/in-process/index.d.ts.map +1 -0
- package/dist/in-process/index.js +37 -0
- package/dist/in-process/index.js.map +1 -0
- package/dist/in-process/question-store.d.ts +28 -0
- package/dist/in-process/question-store.d.ts.map +1 -0
- package/dist/in-process/question-store.js +122 -0
- package/dist/in-process/question-store.js.map +1 -0
- package/dist/in-process/run-store.d.ts +36 -0
- package/dist/in-process/run-store.d.ts.map +1 -0
- package/dist/in-process/run-store.js +81 -0
- package/dist/in-process/run-store.js.map +1 -0
- package/dist/in-process/session-store.d.ts +33 -0
- package/dist/in-process/session-store.d.ts.map +1 -0
- package/dist/in-process/session-store.js +93 -0
- package/dist/in-process/session-store.js.map +1 -0
- package/dist/in-process/stream-bus.d.ts +52 -0
- package/dist/in-process/stream-bus.d.ts.map +1 -0
- package/dist/in-process/stream-bus.js +200 -0
- package/dist/in-process/stream-bus.js.map +1 -0
- package/dist/in-process/vendor-file-cache.d.ts +11 -0
- package/dist/in-process/vendor-file-cache.d.ts.map +1 -0
- package/dist/in-process/vendor-file-cache.js +47 -0
- package/dist/in-process/vendor-file-cache.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/loop/active-tick.registry.d.ts +31 -0
- package/dist/loop/active-tick.registry.d.ts.map +1 -0
- package/dist/loop/active-tick.registry.js +45 -0
- package/dist/loop/active-tick.registry.js.map +1 -0
- package/dist/loop/index.d.ts +6 -0
- package/dist/loop/index.d.ts.map +1 -0
- package/dist/loop/index.js +6 -0
- package/dist/loop/index.js.map +1 -0
- package/dist/loop/loop-driver.d.ts +127 -0
- package/dist/loop/loop-driver.d.ts.map +1 -0
- package/dist/loop/loop-driver.js +199 -0
- package/dist/loop/loop-driver.js.map +1 -0
- package/dist/loop/message-hub.d.ts +236 -0
- package/dist/loop/message-hub.d.ts.map +1 -0
- package/dist/loop/message-hub.js +439 -0
- package/dist/loop/message-hub.js.map +1 -0
- package/dist/loop/orphan-run.sweeper.d.ts +79 -0
- package/dist/loop/orphan-run.sweeper.d.ts.map +1 -0
- package/dist/loop/orphan-run.sweeper.js +145 -0
- package/dist/loop/orphan-run.sweeper.js.map +1 -0
- package/dist/loop/root-host.d.ts +51 -0
- package/dist/loop/root-host.d.ts.map +1 -0
- package/dist/loop/root-host.js +65 -0
- package/dist/loop/root-host.js.map +1 -0
- package/dist/ports/context-store.d.ts +69 -0
- package/dist/ports/context-store.d.ts.map +1 -0
- package/dist/ports/context-store.js +2 -0
- package/dist/ports/context-store.js.map +1 -0
- package/dist/ports/conversation-store.d.ts +144 -0
- package/dist/ports/conversation-store.d.ts.map +1 -0
- package/dist/ports/conversation-store.js +2 -0
- package/dist/ports/conversation-store.js.map +1 -0
- package/dist/ports/coordination.d.ts +76 -0
- package/dist/ports/coordination.d.ts.map +1 -0
- package/dist/ports/coordination.js +12 -0
- package/dist/ports/coordination.js.map +1 -0
- package/dist/ports/image-source.d.ts +26 -0
- package/dist/ports/image-source.d.ts.map +1 -0
- package/dist/ports/image-source.js +2 -0
- package/dist/ports/image-source.js.map +1 -0
- package/dist/ports/index.d.ts +11 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +4 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/logger.d.ts +14 -0
- package/dist/ports/logger.d.ts.map +1 -0
- package/dist/ports/logger.js +23 -0
- package/dist/ports/logger.js.map +1 -0
- package/dist/ports/question-store.d.ts +91 -0
- package/dist/ports/question-store.d.ts.map +1 -0
- package/dist/ports/question-store.js +8 -0
- package/dist/ports/question-store.js.map +1 -0
- package/dist/ports/run-store.d.ts +66 -0
- package/dist/ports/run-store.d.ts.map +1 -0
- package/dist/ports/run-store.js +2 -0
- package/dist/ports/run-store.js.map +1 -0
- package/dist/ports/session-store.d.ts +72 -0
- package/dist/ports/session-store.d.ts.map +1 -0
- package/dist/ports/session-store.js +9 -0
- package/dist/ports/session-store.js.map +1 -0
- package/dist/ports/stream-bus.d.ts +52 -0
- package/dist/ports/stream-bus.d.ts.map +1 -0
- package/dist/ports/stream-bus.js +2 -0
- package/dist/ports/stream-bus.js.map +1 -0
- package/dist/ports/vendor-file-cache.d.ts +46 -0
- package/dist/ports/vendor-file-cache.d.ts.map +1 -0
- package/dist/ports/vendor-file-cache.js +2 -0
- package/dist/ports/vendor-file-cache.js.map +1 -0
- package/dist/schema/agent-event.d.ts +35 -0
- package/dist/schema/agent-event.d.ts.map +1 -0
- package/dist/schema/agent-event.js +46 -0
- package/dist/schema/agent-event.js.map +1 -0
- package/dist/schema/agent-run.d.ts +23 -0
- package/dist/schema/agent-run.d.ts.map +1 -0
- package/dist/schema/agent-run.js +37 -0
- package/dist/schema/agent-run.js.map +1 -0
- package/dist/schema/index.d.ts +4 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +4 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/message-part.d.ts +73 -0
- package/dist/schema/message-part.d.ts.map +1 -0
- package/dist/schema/message-part.js +90 -0
- package/dist/schema/message-part.js.map +1 -0
- package/dist/subagent/delegate.tool.d.ts +145 -0
- package/dist/subagent/delegate.tool.d.ts.map +1 -0
- package/dist/subagent/delegate.tool.js +329 -0
- package/dist/subagent/delegate.tool.js.map +1 -0
- package/dist/subagent/index.d.ts +10 -0
- package/dist/subagent/index.d.ts.map +1 -0
- package/dist/subagent/index.js +10 -0
- package/dist/subagent/index.js.map +1 -0
- package/dist/subagent/milestone-body.d.ts +82 -0
- package/dist/subagent/milestone-body.d.ts.map +1 -0
- package/dist/subagent/milestone-body.js +112 -0
- package/dist/subagent/milestone-body.js.map +1 -0
- package/dist/subagent/output-scan.d.ts +14 -0
- package/dist/subagent/output-scan.d.ts.map +1 -0
- package/dist/subagent/output-scan.js +41 -0
- package/dist/subagent/output-scan.js.map +1 -0
- package/dist/subagent/registry-spawn-policy.d.ts +32 -0
- package/dist/subagent/registry-spawn-policy.d.ts.map +1 -0
- package/dist/subagent/registry-spawn-policy.js +48 -0
- package/dist/subagent/registry-spawn-policy.js.map +1 -0
- package/dist/subagent/roster-block.d.ts +45 -0
- package/dist/subagent/roster-block.d.ts.map +1 -0
- package/dist/subagent/roster-block.js +69 -0
- package/dist/subagent/roster-block.js.map +1 -0
- package/dist/subagent/situation-block.d.ts +16 -0
- package/dist/subagent/situation-block.d.ts.map +1 -0
- package/dist/subagent/situation-block.js +71 -0
- package/dist/subagent/situation-block.js.map +1 -0
- package/dist/subagent/spawn-guards.d.ts +32 -0
- package/dist/subagent/spawn-guards.d.ts.map +1 -0
- package/dist/subagent/spawn-guards.js +39 -0
- package/dist/subagent/spawn-guards.js.map +1 -0
- package/dist/subagent/subagent-registry.d.ts +150 -0
- package/dist/subagent/subagent-registry.d.ts.map +1 -0
- package/dist/subagent/subagent-registry.js +167 -0
- package/dist/subagent/subagent-registry.js.map +1 -0
- package/dist/subagent/subagent-sessions.d.ts +213 -0
- package/dist/subagent/subagent-sessions.d.ts.map +1 -0
- package/dist/subagent/subagent-sessions.js +295 -0
- package/dist/subagent/subagent-sessions.js.map +1 -0
- package/dist/testing/contracts.d.ts +37 -0
- package/dist/testing/contracts.d.ts.map +1 -0
- package/dist/testing/contracts.js +607 -0
- package/dist/testing/contracts.js.map +1 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/stub.d.ts +28 -0
- package/dist/testing/stub.d.ts.map +1 -0
- package/dist/testing/stub.js +3 -0
- package/dist/testing/stub.js.map +1 -0
- package/dist/tools/agent-tool.base.d.ts +186 -0
- package/dist/tools/agent-tool.base.d.ts.map +1 -0
- package/dist/tools/agent-tool.base.js +243 -0
- package/dist/tools/agent-tool.base.js.map +1 -0
- package/dist/tools/agent-tool.interface.d.ts +95 -0
- package/dist/tools/agent-tool.interface.d.ts.map +1 -0
- package/dist/tools/agent-tool.interface.js +2 -0
- package/dist/tools/agent-tool.interface.js.map +1 -0
- package/dist/tools/builtin-names.d.ts +18 -0
- package/dist/tools/builtin-names.d.ts.map +1 -0
- package/dist/tools/builtin-names.js +20 -0
- package/dist/tools/builtin-names.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/tool-definition.d.ts +18 -0
- package/dist/tools/tool-definition.d.ts.map +1 -0
- package/dist/tools/tool-definition.js +77 -0
- package/dist/tools/tool-definition.js.map +1 -0
- package/dist/tools/tool-meta.d.ts +55 -0
- package/dist/tools/tool-meta.d.ts.map +1 -0
- package/dist/tools/tool-meta.js +2 -0
- package/dist/tools/tool-meta.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +190 -0
- package/dist/tools/tool-registry.d.ts.map +1 -0
- package/dist/tools/tool-registry.js +379 -0
- package/dist/tools/tool-registry.js.map +1 -0
- package/dist/tools/tool-result.d.ts +41 -0
- package/dist/tools/tool-result.d.ts.map +1 -0
- package/dist/tools/tool-result.js +19 -0
- package/dist/tools/tool-result.js.map +1 -0
- package/dist/tools/tool-wire.d.ts +24 -0
- package/dist/tools/tool-wire.d.ts.map +1 -0
- package/dist/tools/tool-wire.js +2 -0
- package/dist/tools/tool-wire.js.map +1 -0
- package/dist/turn/agent-runtime.d.ts +31 -0
- package/dist/turn/agent-runtime.d.ts.map +1 -0
- package/dist/turn/agent-runtime.js +30 -0
- package/dist/turn/agent-runtime.js.map +1 -0
- package/dist/turn/chunk-projection.d.ts +32 -0
- package/dist/turn/chunk-projection.d.ts.map +1 -0
- package/dist/turn/chunk-projection.js +62 -0
- package/dist/turn/chunk-projection.js.map +1 -0
- package/dist/turn/compaction.d.ts +48 -0
- package/dist/turn/compaction.d.ts.map +1 -0
- package/dist/turn/compaction.js +89 -0
- package/dist/turn/compaction.js.map +1 -0
- package/dist/turn/context-overflow.d.ts +11 -0
- package/dist/turn/context-overflow.d.ts.map +1 -0
- package/dist/turn/context-overflow.js +53 -0
- package/dist/turn/context-overflow.js.map +1 -0
- package/dist/turn/context-pressure.d.ts +100 -0
- package/dist/turn/context-pressure.d.ts.map +1 -0
- package/dist/turn/context-pressure.js +21 -0
- package/dist/turn/context-pressure.js.map +1 -0
- package/dist/turn/events-to-steps.d.ts +8 -0
- package/dist/turn/events-to-steps.d.ts.map +1 -0
- package/dist/turn/events-to-steps.js +64 -0
- package/dist/turn/events-to-steps.js.map +1 -0
- package/dist/turn/index.d.ts +17 -0
- package/dist/turn/index.d.ts.map +1 -0
- package/dist/turn/index.js +16 -0
- package/dist/turn/index.js.map +1 -0
- package/dist/turn/json-preview.d.ts +22 -0
- package/dist/turn/json-preview.d.ts.map +1 -0
- package/dist/turn/json-preview.js +34 -0
- package/dist/turn/json-preview.js.map +1 -0
- package/dist/turn/json-string-field.d.ts +30 -0
- package/dist/turn/json-string-field.d.ts.map +1 -0
- package/dist/turn/json-string-field.js +125 -0
- package/dist/turn/json-string-field.js.map +1 -0
- package/dist/turn/loop-reminder.d.ts +79 -0
- package/dist/turn/loop-reminder.d.ts.map +1 -0
- package/dist/turn/loop-reminder.js +0 -0
- package/dist/turn/loop-reminder.js.map +1 -0
- package/dist/turn/nul-safe.d.ts +21 -0
- package/dist/turn/nul-safe.d.ts.map +1 -0
- package/dist/turn/nul-safe.js +23 -0
- package/dist/turn/nul-safe.js.map +1 -0
- package/dist/turn/parts-from-events.d.ts +71 -0
- package/dist/turn/parts-from-events.d.ts.map +1 -0
- package/dist/turn/parts-from-events.js +217 -0
- package/dist/turn/parts-from-events.js.map +1 -0
- package/dist/turn/parts-to-model-messages.d.ts +158 -0
- package/dist/turn/parts-to-model-messages.d.ts.map +1 -0
- package/dist/turn/parts-to-model-messages.js +334 -0
- package/dist/turn/parts-to-model-messages.js.map +1 -0
- package/dist/turn/pending-work.d.ts +10 -0
- package/dist/turn/pending-work.d.ts.map +1 -0
- package/dist/turn/pending-work.js +14 -0
- package/dist/turn/pending-work.js.map +1 -0
- package/dist/turn/provider-error.d.ts +45 -0
- package/dist/turn/provider-error.d.ts.map +1 -0
- package/dist/turn/provider-error.js +154 -0
- package/dist/turn/provider-error.js.map +1 -0
- package/dist/turn/tool-input-preview.d.ts +94 -0
- package/dist/turn/tool-input-preview.d.ts.map +1 -0
- package/dist/turn/tool-input-preview.js +143 -0
- package/dist/turn/tool-input-preview.js.map +1 -0
- package/dist/turn/tool-input-progress.d.ts +47 -0
- package/dist/turn/tool-input-progress.d.ts.map +1 -0
- package/dist/turn/tool-input-progress.js +50 -0
- package/dist/turn/tool-input-progress.js.map +1 -0
- package/dist/turn/turn-envelope.d.ts +184 -0
- package/dist/turn/turn-envelope.d.ts.map +1 -0
- package/dist/turn/turn-envelope.js +2 -0
- package/dist/turn/turn-envelope.js.map +1 -0
- package/dist/turn/turn-journal.d.ts +49 -0
- package/dist/turn/turn-journal.d.ts.map +1 -0
- package/dist/turn/turn-journal.js +51 -0
- package/dist/turn/turn-journal.js.map +1 -0
- package/dist/turn/turn-run.d.ts +487 -0
- package/dist/turn/turn-run.d.ts.map +1 -0
- package/dist/turn/turn-run.js +1167 -0
- package/dist/turn/turn-run.js.map +1 -0
- package/dist/turn/usage.d.ts +27 -0
- package/dist/turn/usage.d.ts.map +1 -0
- package/dist/turn/usage.js +51 -0
- package/dist/turn/usage.js.map +1 -0
- package/package.json +55 -3
- package/src/agent-extensions.ts +33 -0
- package/src/builtins/ask-outcome.ts +168 -0
- package/src/builtins/ask-schema.ts +186 -0
- package/src/builtins/ask.service.ts +482 -0
- package/src/builtins/ask.tool.ts +138 -0
- package/src/builtins/index.ts +25 -0
- package/src/builtins/todo-schema.ts +108 -0
- package/src/builtins/todo-settle.hook.ts +221 -0
- package/src/builtins/todo.tool.ts +134 -0
- package/src/context/context-budget-tracker.ts +519 -0
- package/src/context/context-budget.ts +124 -0
- package/src/context/index.ts +17 -0
- package/src/extensions/repeat-call.hook.ts +77 -0
- package/src/hooks/index.ts +19 -0
- package/src/hooks/turn-hook.registry.ts +307 -0
- package/src/hooks/turn-hook.types.ts +210 -0
- package/src/images/byte-cache.ts +61 -0
- package/src/images/delivery.ts +508 -0
- package/src/images/index.ts +35 -0
- package/src/images/prompt.ts +289 -0
- package/src/images/vendor-files.ts +235 -0
- package/src/in-process/conversation-store.ts +304 -0
- package/src/in-process/coordination.ts +177 -0
- package/src/in-process/image-source.ts +29 -0
- package/src/in-process/index.ts +52 -0
- package/src/in-process/question-store.ts +155 -0
- package/src/in-process/run-store.ts +115 -0
- package/src/in-process/session-store.ts +118 -0
- package/src/in-process/stream-bus.ts +244 -0
- package/src/in-process/vendor-file-cache.ts +67 -0
- package/src/index.ts +28 -0
- package/src/loop/active-tick.registry.ts +49 -0
- package/src/loop/index.ts +25 -0
- package/src/loop/loop-driver.ts +275 -0
- package/src/loop/message-hub.ts +532 -0
- package/src/loop/orphan-run.sweeper.ts +204 -0
- package/src/loop/root-host.ts +119 -0
- package/src/ports/context-store.ts +71 -0
- package/src/ports/conversation-store.ts +165 -0
- package/src/ports/coordination.ts +81 -0
- package/src/ports/image-source.ts +26 -0
- package/src/ports/index.ts +56 -0
- package/src/ports/logger.ts +34 -0
- package/src/ports/question-store.ts +117 -0
- package/src/ports/run-store.ts +69 -0
- package/src/ports/session-store.ts +80 -0
- package/src/ports/stream-bus.ts +59 -0
- package/src/ports/vendor-file-cache.ts +54 -0
- package/src/schema/agent-event.ts +69 -0
- package/src/schema/agent-run.ts +44 -0
- package/src/schema/index.ts +25 -0
- package/src/schema/message-part.ts +100 -0
- package/src/subagent/delegate.tool.ts +476 -0
- package/src/subagent/index.ts +63 -0
- package/src/subagent/milestone-body.ts +144 -0
- package/src/subagent/output-scan.ts +56 -0
- package/src/subagent/registry-spawn-policy.ts +85 -0
- package/src/subagent/roster-block.ts +103 -0
- package/src/subagent/situation-block.ts +83 -0
- package/src/subagent/spawn-guards.ts +54 -0
- package/src/subagent/subagent-registry.ts +283 -0
- package/src/subagent/subagent-sessions.ts +496 -0
- package/src/testing/contracts.ts +882 -0
- package/src/testing/index.ts +14 -0
- package/src/testing/stub.ts +28 -0
- package/src/tools/agent-tool.base.ts +361 -0
- package/src/tools/agent-tool.interface.ts +101 -0
- package/src/tools/builtin-names.ts +26 -0
- package/src/tools/index.ts +39 -0
- package/src/tools/tool-definition.ts +93 -0
- package/src/tools/tool-meta.ts +60 -0
- package/src/tools/tool-registry.ts +513 -0
- package/src/tools/tool-result.ts +45 -0
- package/src/tools/tool-wire.ts +24 -0
- package/src/turn/agent-runtime.ts +43 -0
- package/src/turn/chunk-projection.ts +81 -0
- package/src/turn/compaction.ts +103 -0
- package/src/turn/context-overflow.ts +54 -0
- package/src/turn/context-pressure.ts +114 -0
- package/src/turn/events-to-steps.ts +73 -0
- package/src/turn/index.ts +71 -0
- package/src/turn/json-preview.ts +36 -0
- package/src/turn/json-string-field.ts +134 -0
- package/src/turn/loop-reminder.ts +0 -0
- package/src/turn/nul-safe.ts +22 -0
- package/src/turn/parts-from-events.ts +248 -0
- package/src/turn/parts-to-model-messages.ts +428 -0
- package/src/turn/pending-work.ts +14 -0
- package/src/turn/provider-error.ts +160 -0
- package/src/turn/tool-input-preview.ts +223 -0
- package/src/turn/tool-input-progress.ts +76 -0
- package/src/turn/turn-envelope.ts +185 -0
- package/src/turn/turn-journal.ts +102 -0
- package/src/turn/turn-run.ts +1479 -0
- package/src/turn/usage.ts +56 -0
- package/README.md +0 -3
package/src/index.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @qjp88995/agent-runtime:agent 运行时。
|
|
3
|
+
*
|
|
4
|
+
* 不依赖 Redis、数据库或任何框架:外部件一律经端口(`ports/`),每个端口都有进程内实现
|
|
5
|
+
* (`in-process/`),零配置单进程能跑;多实例换适配包。宿主的 agent 字段经
|
|
6
|
+
* `AgentExtensions`(module augmentation)带进工具与钩子。
|
|
7
|
+
*/
|
|
8
|
+
export {
|
|
9
|
+
type AgentExtensions,
|
|
10
|
+
type Initiator,
|
|
11
|
+
NO_INITIATOR,
|
|
12
|
+
} from './agent-extensions.js';
|
|
13
|
+
export * from './builtins/index.js';
|
|
14
|
+
export * from './context/index.js';
|
|
15
|
+
export {
|
|
16
|
+
registerRepeatCallHook,
|
|
17
|
+
REPEAT_CALL_HOOK_META,
|
|
18
|
+
RepeatCallHook,
|
|
19
|
+
} from './extensions/repeat-call.hook.js';
|
|
20
|
+
export * from './hooks/index.js';
|
|
21
|
+
export * from './images/index.js';
|
|
22
|
+
export * from './in-process/index.js';
|
|
23
|
+
export * from './loop/index.js';
|
|
24
|
+
export * from './ports/index.js';
|
|
25
|
+
export * from './schema/index.js';
|
|
26
|
+
export * from './subagent/index.js';
|
|
27
|
+
export * from './tools/index.js';
|
|
28
|
+
export * from './turn/index.js';
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { StreamBus } from '../ports/stream-bus.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 「本进程此刻有哪些 tick 在跑」的登记簿:sessionId → 该 tick 的 streamId。
|
|
5
|
+
*
|
|
6
|
+
* **进程内的**(跟 stream 本身一样)——写方是 `LoopDriver` 的 tick,读方是
|
|
7
|
+
* `LoopDriver.stopSession`(会话级中断要解析出目标 stream)与停机收尾。跨实例
|
|
8
|
+
* 仍是 best-effort:tick 可能跑在任何实例上,这里查不到不代表没在跑
|
|
9
|
+
* (`OrphanRunSweeper` 兜的正是这一类)。
|
|
10
|
+
*/
|
|
11
|
+
export class ActiveTickRegistry {
|
|
12
|
+
private readonly bySession = new Map<string, string>();
|
|
13
|
+
|
|
14
|
+
constructor(private readonly bus: StreamBus) {}
|
|
15
|
+
|
|
16
|
+
/** tick 开跑:登记它的 stream。 */
|
|
17
|
+
open(sessionId: string, streamId: string): void {
|
|
18
|
+
this.bySession.set(sessionId, streamId);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* tick 收尾:**只在登记的仍是自己那条 stream 时**才摘(同一会话的下一个 tick
|
|
23
|
+
* 可能已经登记进来,摘掉别人的会让「停止」按钮对着空气按)。
|
|
24
|
+
*/
|
|
25
|
+
close(sessionId: string, streamId: string): void {
|
|
26
|
+
if (this.bySession.get(sessionId) === streamId) {
|
|
27
|
+
this.bySession.delete(sessionId);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* 该会话此刻的活跃 stream,没有则 null。**登记在册还不够**——总线上那条流
|
|
33
|
+
* 可能已经关了(tick 正走 finally),故再问一次 `isActive`。
|
|
34
|
+
*/
|
|
35
|
+
streamOf(sessionId: string): string | null {
|
|
36
|
+
const id = this.bySession.get(sessionId);
|
|
37
|
+
return id && this.bus.isActive(id) ? id : null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** 停机收尾用:本进程登记在册的全部 stream(不过滤,见 `streamOf`)。 */
|
|
41
|
+
streamIds(): string[] {
|
|
42
|
+
return [...this.bySession.values()];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** 停机收尾的等待判据:还有几个 tick 没摘牌。 */
|
|
46
|
+
get size(): number {
|
|
47
|
+
return this.bySession.size;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export { ActiveTickRegistry } from './active-tick.registry.js';
|
|
2
|
+
export {
|
|
3
|
+
LOCK_RENEW_INTERVAL_MS,
|
|
4
|
+
LoopDriver,
|
|
5
|
+
type LoopDriverDeps,
|
|
6
|
+
type LoopHost,
|
|
7
|
+
SHUTDOWN_DRAIN_MS,
|
|
8
|
+
type TickRunArgs,
|
|
9
|
+
type TickTurn,
|
|
10
|
+
} from './loop-driver.js';
|
|
11
|
+
export {
|
|
12
|
+
INTERRUPTED_PLACEHOLDER,
|
|
13
|
+
MessageHub,
|
|
14
|
+
type PostInput,
|
|
15
|
+
TurnRecorder,
|
|
16
|
+
type TurnTerminal,
|
|
17
|
+
} from './message-hub.js';
|
|
18
|
+
export {
|
|
19
|
+
INTERRUPTED_ERROR,
|
|
20
|
+
ORPHAN_MIN_AGE_MS,
|
|
21
|
+
OrphanRunSweeper,
|
|
22
|
+
type OrphanRunSweeperDeps,
|
|
23
|
+
SWEEP_INTERVAL_MS,
|
|
24
|
+
} from './orphan-run.sweeper.js';
|
|
25
|
+
export { createRootTurnHost, type RootTurnHostOptions } from './root-host.js';
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import type { SessionLock, WakeChannel } from '../ports/coordination.js';
|
|
2
|
+
import { type Logger, silentLogger } from '../ports/logger.js';
|
|
3
|
+
import type { StreamBus } from '../ports/stream-bus.js';
|
|
4
|
+
import type { AgentRuntime } from '../turn/agent-runtime.js';
|
|
5
|
+
import type { RunTurnArgs } from '../turn/turn-run.js';
|
|
6
|
+
import { ActiveTickRegistry } from './active-tick.registry.js';
|
|
7
|
+
import type { MessageHub, PostInput, TurnRecorder } from './message-hub.js';
|
|
8
|
+
|
|
9
|
+
/** 锁 TTL 60s(`LOCK_TTL_MS`),20s 续租留足冗余。 */
|
|
10
|
+
export const LOCK_RENEW_INTERVAL_MS = 20_000;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 停机时留给在跑的 tick 自行收尾的预算。`docker stop` 默认 SIGTERM 之后 10s
|
|
14
|
+
* 才 SIGKILL,取 7s 留出余量给宿主其余的关闭钩子。
|
|
15
|
+
*
|
|
16
|
+
* 超时**不是**故障:`OrphanRunSweeper` 仍然兜底,只是用户要多等一会儿。故这里
|
|
17
|
+
* 宁可早点放手,也不能赌满 10s——被 SIGKILL 打断的话,连锁的主动释放都没做成。
|
|
18
|
+
*/
|
|
19
|
+
export const SHUTDOWN_DRAIN_MS = 7_000;
|
|
20
|
+
const SHUTDOWN_POLL_MS = 50;
|
|
21
|
+
|
|
22
|
+
/** 一轮开张时 driver 交给宿主的东西。 */
|
|
23
|
+
export interface TickTurn {
|
|
24
|
+
sessionId: string;
|
|
25
|
+
/** = streamId = 本轮 assistant 行主键(`MessageHub.openTurn` 铸的)。 */
|
|
26
|
+
runId: string;
|
|
27
|
+
streamId: string;
|
|
28
|
+
/** 本轮的落库口,交给 `createRootTurnHost`(或宿主自己的 `TurnHost`)。 */
|
|
29
|
+
recorder: TurnRecorder;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** 宿主为一轮要组装的 `runTurn` 入参——除了 driver 自己递的那三样。 */
|
|
33
|
+
export type TickRunArgs = Omit<RunTurnArgs, 'nextSeq' | 'sink' | 'abortSignal'>;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* loop 向宿主要的东西:一轮跑什么。会话 / agent / 模型怎么解析、system prompt 拼
|
|
37
|
+
* 什么、工具摘哪些——全是宿主的事(agent-base 里是形式层 + `prepareTurn`)。
|
|
38
|
+
*
|
|
39
|
+
* 拆成两段是因为**两段失败的处置不同**:
|
|
40
|
+
* - `setupTick` 在流打开之前(取会话行、解析 agent 与模型)。抛错 = 这一轮压根
|
|
41
|
+
* 跑不起来,driver 落一条可见的 setup-error 占位(不补的话消息已进 inbox、界面
|
|
42
|
+
* 上却什么都不会发生),再把错误抛给 `onWake` 的调用方。
|
|
43
|
+
* - `buildTurn` 在流打开之后、拿着本轮的 recorder 组装 `runTurn` 的入参(宿主
|
|
44
|
+
* 通常在这里 `createRootTurnHost`)。抛错 = 这一 tick 崩了,流照常关闭。
|
|
45
|
+
*/
|
|
46
|
+
export interface LoopHost<TSetup> {
|
|
47
|
+
setupTick(sessionId: string): Promise<TSetup>;
|
|
48
|
+
buildTurn(setup: TSetup, turn: TickTurn): Promise<TickRunArgs>;
|
|
49
|
+
/**
|
|
50
|
+
* setup 失败时那条占位的正文。缺省 `本轮无法启动:<message>`。宿主可在这里
|
|
51
|
+
* 净化报错(如去掉第三方服务名)、补一句排查提示。
|
|
52
|
+
*/
|
|
53
|
+
describeSetupError?(error: unknown): string;
|
|
54
|
+
/**
|
|
55
|
+
* tick 收尾(锁已释放)之后、re-wake 之前调,对每个会话无条件调。子 Agent 的
|
|
56
|
+
* 里程碑回投(`finalizeIfIdle`)挂在这里。
|
|
57
|
+
*
|
|
58
|
+
* **必须排在 re-wake 之前**:finalizer 判「子空闲了没」的唯一依据就是 inbox
|
|
59
|
+
* 空不空,而 re-wake 广播出去之后,某个实例随时会抢到刚释放的锁、起一个新 tick
|
|
60
|
+
* 把消息 drain 走——那时 finalizer 会把一个正在跑的子判成空闲。放在前面则不存在
|
|
61
|
+
* 这个窗口:此刻锁虽已释放,但还没有任何人被叫醒。
|
|
62
|
+
*/
|
|
63
|
+
afterTick?(sessionId: string): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface LoopDriverDeps<TSetup> {
|
|
67
|
+
lock: SessionLock;
|
|
68
|
+
wake: WakeChannel;
|
|
69
|
+
bus: StreamBus;
|
|
70
|
+
hub: MessageHub;
|
|
71
|
+
runtime: AgentRuntime;
|
|
72
|
+
host: LoopHost<TSetup>;
|
|
73
|
+
logger?: Logger;
|
|
74
|
+
/** 缺省 `LOCK_RENEW_INTERVAL_MS`;单测可调小。 */
|
|
75
|
+
renewIntervalMs?: number;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* inbox 驱动的 agent loop 调度器。`wake` 经 `WakeChannel` 广播(多实例时跨实例);
|
|
80
|
+
* 每个实例的订阅者收到即 `onWake` —— 试抢会话锁,只有抢到的那个实例跑一个 tick
|
|
81
|
+
* (一次 `runTurn` 自驱 loop,drain-first)。tick 收尾释放锁后再查一次 inbox:
|
|
82
|
+
* 若期间又有新消息进来(插话 / 子 Agent 回投),重新 wake,闭合「刚 drain 完又来
|
|
83
|
+
* 一条、锁还没放」的丢唤醒窗口。
|
|
84
|
+
*
|
|
85
|
+
* 流的生命周期(open / close)完全落在 tick 内,与任何 HTTP 连接解耦。
|
|
86
|
+
*/
|
|
87
|
+
export class LoopDriver<TSetup = unknown> {
|
|
88
|
+
readonly active: ActiveTickRegistry;
|
|
89
|
+
private readonly logger: Logger;
|
|
90
|
+
private unsubscribe?: () => void;
|
|
91
|
+
|
|
92
|
+
constructor(private readonly deps: LoopDriverDeps<TSetup>) {
|
|
93
|
+
this.active = new ActiveTickRegistry(deps.bus);
|
|
94
|
+
this.logger = deps.logger ?? silentLogger('');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** 订阅唤醒。返回退订函数(`shutdown` 也会退订)。 */
|
|
98
|
+
start(): () => void {
|
|
99
|
+
this.unsubscribe ??= this.deps.wake.onWake(sessionId => {
|
|
100
|
+
void this.onWake(sessionId).catch(err =>
|
|
101
|
+
this.logger.error(`onWake(${sessionId}) failed: ${String(err)}`)
|
|
102
|
+
);
|
|
103
|
+
});
|
|
104
|
+
return () => this.stopListening();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private stopListening(): void {
|
|
108
|
+
this.unsubscribe?.();
|
|
109
|
+
this.unsubscribe = undefined;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* 投递一条消息并唤醒(**post-first**:先写 inbox 再 wake)。宿主的准入检查
|
|
114
|
+
* (会话能不能发言等)在调它之前自己做。
|
|
115
|
+
*/
|
|
116
|
+
async post(input: PostInput): Promise<{ messageId: string }> {
|
|
117
|
+
const out = await this.deps.hub.post(input);
|
|
118
|
+
await this.deps.wake.wake(input.sessionId);
|
|
119
|
+
return out;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** 该会话此刻在本进程跑着的流,没有则 null。 */
|
|
123
|
+
activeStreamOf(sessionId: string): string | null {
|
|
124
|
+
return this.active.streamOf(sessionId);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 会话级中断:解析该会话当前活跃 tick 的流 → abort。跨实例 best-effort(tick 跑在
|
|
129
|
+
* 别的实例上时这里查不到)。返回是否真的中断了一条流。宿主挂着的同步等待(提问
|
|
130
|
+
* 面板等)自己作废。
|
|
131
|
+
*/
|
|
132
|
+
stopSession(sessionId: string): boolean {
|
|
133
|
+
const streamId = this.active.streamOf(sessionId);
|
|
134
|
+
if (!streamId) return false;
|
|
135
|
+
this.deps.bus.abort(streamId);
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 停机前把本进程正在跑的 tick 全部 abort 掉,并**等它们收完尾**。
|
|
141
|
+
*
|
|
142
|
+
* 不做的话,那些轮次的终态就随进程一起没了:跑次停在 running、消息没盖终态。
|
|
143
|
+
* sweeper 能修,但代价是至少一个锁 TTL(进程被杀时锁不会主动释放)。主动重启
|
|
144
|
+
* 占了重启的绝大多数,这条路让它们几乎瞬时收尾,sweeper 退回去只兜底真正的崩溃。
|
|
145
|
+
*
|
|
146
|
+
* **走的是内核既有的 abort 路径**:`bus.abort` → `runTurn` 照常以 aborted 收尾 →
|
|
147
|
+
* `host.persist` 盖终态、发 `run-finish`,等价于用户点了停止。
|
|
148
|
+
*
|
|
149
|
+
* **必须等**:abort 只是置了标记,立刻返回就等于没做。等到登记簿清空为准,超时
|
|
150
|
+
* 则放手交给 sweeper。返回是否在预算内清空。
|
|
151
|
+
*/
|
|
152
|
+
async shutdown(budgetMs: number = SHUTDOWN_DRAIN_MS): Promise<boolean> {
|
|
153
|
+
this.stopListening();
|
|
154
|
+
const streams = this.active.streamIds();
|
|
155
|
+
if (streams.length === 0) return true;
|
|
156
|
+
this.logger.warn(
|
|
157
|
+
`shutdown: aborting ${streams.length} in-flight tick(s) so they land a terminal state`
|
|
158
|
+
);
|
|
159
|
+
for (const streamId of streams) this.deps.bus.abort(streamId);
|
|
160
|
+
const deadline = Date.now() + budgetMs;
|
|
161
|
+
while (this.active.size > 0) {
|
|
162
|
+
if (Date.now() >= deadline) {
|
|
163
|
+
this.logger.warn(
|
|
164
|
+
`shutdown: ${this.active.size} tick(s) still running after ${budgetMs}ms; OrphanRunSweeper will finish them`
|
|
165
|
+
);
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
await new Promise(resolve => setTimeout(resolve, SHUTDOWN_POLL_MS));
|
|
169
|
+
}
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
async onWake(sessionId: string): Promise<void> {
|
|
174
|
+
const { lock, hub, wake } = this.deps;
|
|
175
|
+
const token = await lock.acquire(sessionId);
|
|
176
|
+
if (!token) return; // 已有 loop 在跑,它会 re-drain
|
|
177
|
+
const renew = setInterval(
|
|
178
|
+
() => void lock.renew(sessionId, token).catch(() => undefined),
|
|
179
|
+
this.deps.renewIntervalMs ?? LOCK_RENEW_INTERVAL_MS
|
|
180
|
+
);
|
|
181
|
+
try {
|
|
182
|
+
// 抢到锁之后再确认一次真有货。每一个投递方都是 post-first,另外两个唤醒源
|
|
183
|
+
// (下面的 re-wake、启动时的 `wakePendingInboxes`)本就以 `hasPending` 为
|
|
184
|
+
// 条件——所以「持锁而 inbox 空」只有一个成因:这批货在 wake 与抢锁之间没了
|
|
185
|
+
// (被上一个 tick 领走或被用户撤回)。空跑一趟会开流、开跑次、发 run-start /
|
|
186
|
+
// run-finish,前端建一个空气泡再收起来。
|
|
187
|
+
//
|
|
188
|
+
// **不能直接 return**:跳过的只是 tick,下面的 release 与重新自查必须照走,
|
|
189
|
+
// 否则一次 wake 落在「查完到释放锁」之间就丢了。
|
|
190
|
+
if (await hub.hasPending(sessionId)) {
|
|
191
|
+
await this.runTick(sessionId);
|
|
192
|
+
}
|
|
193
|
+
} finally {
|
|
194
|
+
clearInterval(renew);
|
|
195
|
+
await lock.release(sessionId, token);
|
|
196
|
+
}
|
|
197
|
+
// 必须排在 re-wake 之前,判据见 `LoopHost.afterTick`。
|
|
198
|
+
await this.deps.host.afterTick?.(sessionId);
|
|
199
|
+
// 关丢唤醒:释放后再查一次,非空则重新广播(锁此刻空闲,可被重新抢到)。
|
|
200
|
+
if (await hub.hasPending(sessionId)) {
|
|
201
|
+
await wake.wake(sessionId);
|
|
202
|
+
} else {
|
|
203
|
+
// idle 广播:tick 跑完且 inbox 已空。尽力而为——发不出去只记日志,消费方
|
|
204
|
+
// 各自有兜底。
|
|
205
|
+
await wake
|
|
206
|
+
.idle(sessionId)
|
|
207
|
+
.catch(err =>
|
|
208
|
+
this.logger.warn(`publish idle(${sessionId}) failed: ${String(err)}`)
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
private async runTick(sessionId: string): Promise<void> {
|
|
214
|
+
const { bus, hub, host, runtime } = this.deps;
|
|
215
|
+
const setup = await this.resolveSetup(sessionId);
|
|
216
|
+
|
|
217
|
+
// 三位一体的 id 由消息中心铸,**别在这里各生成各的**。recorder 的生命周期
|
|
218
|
+
// 正好是这个 tick。
|
|
219
|
+
const recorder = hub.openTurn(sessionId);
|
|
220
|
+
const { runId, streamId } = recorder;
|
|
221
|
+
const { nextSeq } = bus.open(streamId);
|
|
222
|
+
this.active.open(sessionId, streamId);
|
|
223
|
+
try {
|
|
224
|
+
// **不给兜底信号**——`open` 之后 `signalOf` 必然有值,拿不到是接线坏了;拿
|
|
225
|
+
// 一个永不 abort 的空信号顶上去,会把「停止按钮按了没反应」变成一个不报错的
|
|
226
|
+
// 静默症状。
|
|
227
|
+
const abortSignal = bus.signalOf(streamId);
|
|
228
|
+
if (!abortSignal) {
|
|
229
|
+
throw new Error(`stream ${streamId} opened without an abort signal`);
|
|
230
|
+
}
|
|
231
|
+
const args = await host.buildTurn(setup, {
|
|
232
|
+
sessionId,
|
|
233
|
+
runId,
|
|
234
|
+
streamId,
|
|
235
|
+
recorder,
|
|
236
|
+
});
|
|
237
|
+
await runtime.runTurn({
|
|
238
|
+
...args,
|
|
239
|
+
nextSeq,
|
|
240
|
+
// 事件的去向:本轮的 recorder(消息中心)。内核只认识一个同步投递口。
|
|
241
|
+
sink: e => recorder.emit(e),
|
|
242
|
+
abortSignal,
|
|
243
|
+
});
|
|
244
|
+
} catch (err) {
|
|
245
|
+
this.logger.error(`tick ${streamId} crashed: ${String(err)}`);
|
|
246
|
+
} finally {
|
|
247
|
+
bus.close(streamId);
|
|
248
|
+
this.active.close(sessionId, streamId);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* setup 阶段:任一步都可能抛(agent 已停用、模型已删除……)。流此时还没开,唯一
|
|
254
|
+
* 能让用户看到「发生了什么」的办法是补一条可见占位。落占位失败只记日志(不能
|
|
255
|
+
* 反过来吞掉 / 替换原始 setup 错误),随后原样重新抛出,交由 `onWake` 的 finally
|
|
256
|
+
* 照常 release 锁。
|
|
257
|
+
*/
|
|
258
|
+
private async resolveSetup(sessionId: string): Promise<TSetup> {
|
|
259
|
+
try {
|
|
260
|
+
return await this.deps.host.setupTick(sessionId);
|
|
261
|
+
} catch (err) {
|
|
262
|
+
const text =
|
|
263
|
+
this.deps.host.describeSetupError?.(err) ??
|
|
264
|
+
`本轮无法启动:${err instanceof Error ? err.message : String(err)}`;
|
|
265
|
+
try {
|
|
266
|
+
await this.deps.hub.appendSetupError(sessionId, text);
|
|
267
|
+
} catch (persistErr) {
|
|
268
|
+
this.logger.error(
|
|
269
|
+
`appendSetupError(${sessionId}) failed: ${String(persistErr)}`
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
throw err;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|