@qjp88995/agent-runtime 0.0.0-stage → 0.1.1
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 +59 -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
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { DESC_LIMIT } from './roster-block.js';
|
|
2
|
+
/**
|
|
3
|
+
* 内置子 Agent 注册表:宿主显式 `register`(以前靠 Nest 装饰器 + DiscoveryService 扫)。
|
|
4
|
+
* 名字重复、旧名冲突、说明过长、两个互斥标记同标都在注册期抛。
|
|
5
|
+
*
|
|
6
|
+
* 花名册顺序 = 注册顺序。
|
|
7
|
+
*/
|
|
8
|
+
export class SubagentRegistry {
|
|
9
|
+
options;
|
|
10
|
+
byName = new Map();
|
|
11
|
+
/** 旧名 → 现名。 */
|
|
12
|
+
aliases = new Map();
|
|
13
|
+
labelMax;
|
|
14
|
+
constructor(options = {}) {
|
|
15
|
+
this.options = options;
|
|
16
|
+
this.labelMax = options.labelMax ?? 20;
|
|
17
|
+
}
|
|
18
|
+
register(meta, provider) {
|
|
19
|
+
const { name } = meta;
|
|
20
|
+
if (this.byName.has(name) || this.aliases.has(name)) {
|
|
21
|
+
throw new Error(`duplicate subagent name '${name}'`);
|
|
22
|
+
}
|
|
23
|
+
// 花名册每行只显示前 DESC_LIMIT 个码点。说明是我们写的,写长了就是一段没人看得见
|
|
24
|
+
// 的交代——逼着把「何时派、交回什么」写进前 60 字。
|
|
25
|
+
if (Array.from(meta.description.trim()).length > DESC_LIMIT) {
|
|
26
|
+
throw new Error(`subagent '${name}' description exceeds ${DESC_LIMIT} code points (the roster cuts the rest)`);
|
|
27
|
+
}
|
|
28
|
+
const labelLength = Array.from(meta.label.trim()).length;
|
|
29
|
+
if (labelLength === 0 || labelLength > this.labelMax) {
|
|
30
|
+
throw new Error(`subagent '${name}' label must be 1..${this.labelMax} code points`);
|
|
31
|
+
}
|
|
32
|
+
if (meta.permission && meta.optIn) {
|
|
33
|
+
throw new Error(`subagent '${name}' declares both permission and optIn`);
|
|
34
|
+
}
|
|
35
|
+
for (const former of meta.formerNames ?? []) {
|
|
36
|
+
if (former === name || this.byName.has(former)) {
|
|
37
|
+
throw new Error(`subagent former name '${former}' is also a current name`);
|
|
38
|
+
}
|
|
39
|
+
if (this.aliases.has(former)) {
|
|
40
|
+
throw new Error(`subagent former name '${former}' is claimed twice`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
this.options.validate?.(meta);
|
|
44
|
+
for (const former of meta.formerNames ?? []) {
|
|
45
|
+
this.aliases.set(former, name);
|
|
46
|
+
}
|
|
47
|
+
this.byName.set(name, provider ? { meta, provider } : { meta });
|
|
48
|
+
}
|
|
49
|
+
/** 现名(认旧名);没登记过返回 null。不看可用性。 */
|
|
50
|
+
currentName(name) {
|
|
51
|
+
if (this.byName.has(name))
|
|
52
|
+
return name;
|
|
53
|
+
return this.aliases.get(name) ?? null;
|
|
54
|
+
}
|
|
55
|
+
/** 这个名字(含旧名)的定义;没有或此刻不可用返回 null。 */
|
|
56
|
+
get(name) {
|
|
57
|
+
const current = this.currentName(name);
|
|
58
|
+
if (current === null)
|
|
59
|
+
return null;
|
|
60
|
+
const entry = this.byName.get(current);
|
|
61
|
+
return entry && this.available(entry) ? entry.meta : null;
|
|
62
|
+
}
|
|
63
|
+
/** 此刻可用的全部定义(注册顺序)。 */
|
|
64
|
+
list() {
|
|
65
|
+
return [...this.byName.values()]
|
|
66
|
+
.filter(e => this.available(e))
|
|
67
|
+
.map(e => e.meta);
|
|
68
|
+
}
|
|
69
|
+
/** 注册过的全部定义(含此刻不可用的),带可用性。后台页用。 */
|
|
70
|
+
listAll() {
|
|
71
|
+
return [...this.byName.values()].map(e => ({
|
|
72
|
+
meta: e.meta,
|
|
73
|
+
available: this.available(e),
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 注册过的全部现名,**不看可用性**。给「名字不许与内置子 Agent 撞」这类静态判断用:
|
|
78
|
+
* 按 `list()` 判的话,取数员不可用时别人就能占走它的名字,可用之后两者同名。
|
|
79
|
+
*/
|
|
80
|
+
allNames() {
|
|
81
|
+
return [...this.byName.keys()];
|
|
82
|
+
}
|
|
83
|
+
/** 名字 → 界面默认叫法,**含旧名**;不看可用性(历史里派过的照样要叫得出来)。 */
|
|
84
|
+
defaultLabels() {
|
|
85
|
+
const out = {};
|
|
86
|
+
for (const { meta } of this.byName.values())
|
|
87
|
+
out[meta.name] = meta.label;
|
|
88
|
+
for (const [former, current] of this.aliases) {
|
|
89
|
+
const entry = this.byName.get(current);
|
|
90
|
+
if (entry)
|
|
91
|
+
out[former] = entry.meta.label;
|
|
92
|
+
}
|
|
93
|
+
return out;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 这个名字是不是叶子(不给 `Delegate`、花名册清空):`leaf` / `functional` /
|
|
97
|
+
* 宿主的 `impliesLeaf`。没登记过的名字(宿主自己的子 Agent)返回 false。
|
|
98
|
+
*/
|
|
99
|
+
isLeaf(name) {
|
|
100
|
+
const meta = this.get(name);
|
|
101
|
+
if (!meta)
|
|
102
|
+
return false;
|
|
103
|
+
return (meta.leaf === true ||
|
|
104
|
+
meta.functional === true ||
|
|
105
|
+
(this.options.impliesLeaf?.(meta) ?? false));
|
|
106
|
+
}
|
|
107
|
+
/** 这个名字要的权限点;不要或没登记过返回 null。 */
|
|
108
|
+
requiredPermission(name) {
|
|
109
|
+
return this.get(name)?.permission ?? null;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 判据输入下这个定义派不派得出(花名册与派生同一句):要权限点的要发起人有且父允许;
|
|
113
|
+
* 点名挂载的要父点了名。
|
|
114
|
+
*/
|
|
115
|
+
permits(meta, access) {
|
|
116
|
+
if (meta.permission &&
|
|
117
|
+
!(access.allowPermissioned && access.permissions.has(meta.permission))) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
if (meta.optIn && !(access.optIn ?? []).includes(meta.name))
|
|
121
|
+
return false;
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 花名册:此刻可用、对这份判据输入派得出的定义。`filter` 是宿主的附加条件
|
|
126
|
+
* (agent-base:顶替型只在当前模型缺那项能力且父配了顶替模型时列)——**不广告一个
|
|
127
|
+
* 派不出来的东西**,派生那一侧(`SpawnPolicy.checkSpawn`)要用同一个判据。
|
|
128
|
+
*/
|
|
129
|
+
roster(access, filter) {
|
|
130
|
+
return this.list()
|
|
131
|
+
.filter(m => this.permits(m, access) && (filter?.(m) ?? true))
|
|
132
|
+
.map(m => ({ name: m.name, description: m.description }));
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 这个子 Agent 本轮要摘掉的恒上桌工具:声明了 `systemTools` 时,`alwaysOn` 那几组里
|
|
136
|
+
* 名单外的全部。没声明返回空数组(与父一样)。
|
|
137
|
+
*/
|
|
138
|
+
excludedSystemTools(name, tools, alwaysOnCategories = ['system']) {
|
|
139
|
+
const allow = this.get(name)?.systemTools;
|
|
140
|
+
if (!allow)
|
|
141
|
+
return [];
|
|
142
|
+
return tools
|
|
143
|
+
.listMeta()
|
|
144
|
+
.filter(m => alwaysOnCategories.includes(m.category) && !allow.includes(m.name))
|
|
145
|
+
.map(m => m.name);
|
|
146
|
+
}
|
|
147
|
+
available(entry) {
|
|
148
|
+
return entry.provider?.isAvailable?.() ?? true;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* 通用子 Agent 的固定人格提示词。**短得几乎没有内容,这是对的**:处境说明(看不到
|
|
153
|
+
* 调用方历史、产出原样回投、卡住可以交回去问)归平台,由 `buildSubagentSituationBlock`
|
|
154
|
+
* 对每个子会话注入;剩下这一句才是「通用款」独有的——它没有领域设定。
|
|
155
|
+
*/
|
|
156
|
+
export const GENERAL_PURPOSE_PROMPT = '你没有特定的领域设定,也没有预设的工作套路。按任务描述本身的要求来做:它要什么就产出什么,需要什么手段就用什么手段。';
|
|
157
|
+
/**
|
|
158
|
+
* 内置「通用子 Agent」。**除人格外一个字段都不设,是它的全部要点**:工具、步数(以及
|
|
159
|
+
* 宿主的档位、推理等级)统统由派生它的那个父决定。宿主要用就 `registry.register(GENERAL_PURPOSE_SUBAGENT)`。
|
|
160
|
+
*/
|
|
161
|
+
export const GENERAL_PURPOSE_SUBAGENT = {
|
|
162
|
+
name: 'general-purpose',
|
|
163
|
+
label: '通用 Agent',
|
|
164
|
+
description: '通用子 Agent:无特定领域设定,适合把一段自包含的任务整个交出去',
|
|
165
|
+
prompt: GENERAL_PURPOSE_PROMPT,
|
|
166
|
+
};
|
|
167
|
+
//# sourceMappingURL=subagent-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-registry.js","sourceRoot":"","sources":["../../src/subagent/subagent-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import type { MessageHub } from '../loop/message-hub.js';
|
|
2
|
+
import type { SubagentAwaitLease, TreeBudget, WakeChannel } from '../ports/coordination.js';
|
|
3
|
+
import { type LoggerFactory } from '../ports/logger.js';
|
|
4
|
+
import type { RunStore } from '../ports/run-store.js';
|
|
5
|
+
import type { SessionRecord, SessionStore } from '../ports/session-store.js';
|
|
6
|
+
import type { ToolAgentContext } from '../tools/agent-tool.interface.js';
|
|
7
|
+
/** 兜底扫描的缺省「空闲多久才算嫌疑」。 */
|
|
8
|
+
export declare const SUBAGENT_SWEEP_IDLE_MS = 60000;
|
|
9
|
+
/** 派一个新的子 Agent 的请求(`Delegate` 从 `ToolContext` 拼出来)。 */
|
|
10
|
+
export interface SpawnRequest {
|
|
11
|
+
agentName: string;
|
|
12
|
+
/** 一句话任务标题(模型显式给,界面展示)。 */
|
|
13
|
+
title: string;
|
|
14
|
+
prompt: string;
|
|
15
|
+
/** 派它的会话(父)。 */
|
|
16
|
+
parentSessionId: string;
|
|
17
|
+
rootSessionId: string;
|
|
18
|
+
/** 父这一轮的跑次 id——子会话的 `parentRunId`,父会话经它找到。 */
|
|
19
|
+
parentRunId: string;
|
|
20
|
+
/** 父这一轮的深度。 */
|
|
21
|
+
depth: number;
|
|
22
|
+
userId: string | null;
|
|
23
|
+
/** 父这一轮跑的 agent(宿主的扩展字段:跑哪个、哪一版……)与模型能力。 */
|
|
24
|
+
agent: ToolAgentContext;
|
|
25
|
+
/** 父会话的附加信息;缺省照抄给子会话。 */
|
|
26
|
+
sessionMetadata: Readonly<Record<string, unknown>>;
|
|
27
|
+
/** 发起人此刻的权限点。缺省空(fail-closed)。 */
|
|
28
|
+
initiatorPermissions: ReadonlySet<string>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 派不派得出(宿主回答)。
|
|
32
|
+
*
|
|
33
|
+
* - `unknown`:没有这个子 Agent(或此刻不可用)。`Delegate` 的报错让模型去核对花名册。
|
|
34
|
+
* - `refused`:有,但这一次不行——`message` 原样给模型,要说清「谁、为什么」不够格,
|
|
35
|
+
* 否则模型会换个名字再试(agent-base:权限点不够、「你自己就能看图,别派识图员」)。
|
|
36
|
+
* - `ok`:可以。`attrs` / `metadata` 写进子会话行(缺省:attrs 空、metadata 照抄父的)。
|
|
37
|
+
*/
|
|
38
|
+
export type SpawnCheck = {
|
|
39
|
+
ok: true;
|
|
40
|
+
attrs?: Readonly<Record<string, unknown>>;
|
|
41
|
+
metadata?: Readonly<Record<string, unknown>>;
|
|
42
|
+
} | {
|
|
43
|
+
ok: false;
|
|
44
|
+
reason: 'unknown';
|
|
45
|
+
} | {
|
|
46
|
+
ok: false;
|
|
47
|
+
reason: 'refused';
|
|
48
|
+
message: string;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* 宿主的派生策略。花名册与这里**必须是同一个判据**(花名册不列只是不广告,模型凭名字
|
|
52
|
+
* 照样派得动)——用 `SubagentRegistry` 的话,`registrySpawnPolicy` 就是现成的一份。
|
|
53
|
+
*/
|
|
54
|
+
export interface SpawnPolicy {
|
|
55
|
+
checkSpawn(req: SpawnRequest): Promise<SpawnCheck>;
|
|
56
|
+
/**
|
|
57
|
+
* 子会话建好、任务投递**之前**:宿主为子会话定下它要用的东西(agent-base 分身:
|
|
58
|
+
* 派活快照)。子会话此刻还没有任务、不会被唤醒,第一轮就能读到。抛错 = 这次派生
|
|
59
|
+
* 失败(名额归还,错误上抛)。
|
|
60
|
+
*
|
|
61
|
+
* `notes` 拼在回执最前面(「技能《×××》已停用,未带」);**为空就别给**,回执逐字不变。
|
|
62
|
+
*/
|
|
63
|
+
onSubagentCreated?(req: SpawnRequest & {
|
|
64
|
+
childSessionId: string;
|
|
65
|
+
}): Promise<{
|
|
66
|
+
notes?: string[];
|
|
67
|
+
}>;
|
|
68
|
+
}
|
|
69
|
+
export type SpawnOutcome = {
|
|
70
|
+
ok: true;
|
|
71
|
+
childSessionId: string;
|
|
72
|
+
notes?: string[];
|
|
73
|
+
} | {
|
|
74
|
+
ok: false;
|
|
75
|
+
reason: 'unknown' | 'tree_full';
|
|
76
|
+
} | {
|
|
77
|
+
ok: false;
|
|
78
|
+
reason: 'refused';
|
|
79
|
+
message: string;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* 追加任务的目标校验结果。`cursorBefore` 是发起追加**之前**的里程碑游标:同步等待据它
|
|
83
|
+
* 判「这一轮跑完了没有」,取产出也只取它之后的。首次 idle 之前追加时为 null,语义退化
|
|
84
|
+
* 成「等首次 settle」。
|
|
85
|
+
*/
|
|
86
|
+
export type FollowUpTarget = {
|
|
87
|
+
ok: true;
|
|
88
|
+
cursorBefore: number | null;
|
|
89
|
+
} | {
|
|
90
|
+
ok: false;
|
|
91
|
+
reason: 'not_found' | 'not_own_child';
|
|
92
|
+
};
|
|
93
|
+
/** 子会话一轮的回执(同步返回与回投 inbox 同源)。 */
|
|
94
|
+
export interface SubagentResult {
|
|
95
|
+
body: string;
|
|
96
|
+
status: string;
|
|
97
|
+
/** 只有失败才带(正常收尾的 `stop` 写进「原因」是误导)。 */
|
|
98
|
+
stopReason: string | null;
|
|
99
|
+
}
|
|
100
|
+
/** loop 设置一个 tick 时要的子会话信息。 */
|
|
101
|
+
export interface SubagentTickInfo {
|
|
102
|
+
kind: SessionRecord['kind'];
|
|
103
|
+
/** 子会话 = 父跑次深度 + 1;根会话 0。 */
|
|
104
|
+
depth: number;
|
|
105
|
+
parentRunId: string | null;
|
|
106
|
+
/** 子 Agent 名(钉在会话上的那个,可能是旧名);根会话 null。 */
|
|
107
|
+
agentName: string | null;
|
|
108
|
+
title: string | null;
|
|
109
|
+
}
|
|
110
|
+
export interface SubagentSessionsDeps {
|
|
111
|
+
sessions: SessionStore;
|
|
112
|
+
/** 消息中心:投递(`post`)与读消息(`store`)。 */
|
|
113
|
+
hub: MessageHub;
|
|
114
|
+
wake: WakeChannel;
|
|
115
|
+
runs: RunStore;
|
|
116
|
+
awaitLease: SubagentAwaitLease;
|
|
117
|
+
treeBudget: TreeBudget;
|
|
118
|
+
policy: SpawnPolicy;
|
|
119
|
+
/** 每棵树同时存活的子 Agent 上限,缺省 `MAX_LIVE_SUBS_PER_TREE`。 */
|
|
120
|
+
maxLivePerTree?: number;
|
|
121
|
+
/** 兜底扫描的空闲门槛,缺省 `SUBAGENT_SWEEP_IDLE_MS`。 */
|
|
122
|
+
sweepIdleMs?: number;
|
|
123
|
+
logger?: LoggerFactory;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 子会话的生命周期:派生(受理段,**不 await 子跑完**)、追加任务、取回执、收尾回投、
|
|
127
|
+
* 兜底扫描。搬自 agent-base `SubagentSessionService`,会话行走 `SessionStore`、消息走
|
|
128
|
+
* `MessageHub`,派生判据交给宿主的 `SpawnPolicy`。
|
|
129
|
+
*
|
|
130
|
+
* 子会话此后由 loop 独立驱动(inbox + 唤醒),**同步与异步是同一条实现**:子会话都是
|
|
131
|
+
* 独立持久跑的,区别只在父等不等它(`Delegate`)。
|
|
132
|
+
*
|
|
133
|
+
* 宿主要接两处:`LoopHost.afterTick` 里调 `finalizeIfIdle`,启动时调一次 `sweepStale`。
|
|
134
|
+
*/
|
|
135
|
+
export declare class SubagentSessions {
|
|
136
|
+
private readonly deps;
|
|
137
|
+
private readonly logger;
|
|
138
|
+
readonly maxLivePerTree: number;
|
|
139
|
+
constructor(deps: SubagentSessionsDeps);
|
|
140
|
+
/** 新建:问宿主 → 占名额 → 建会话 → 宿主补料 → 投任务 → 唤醒,即返 handle。 */
|
|
141
|
+
spawn(req: SpawnRequest): Promise<SpawnOutcome>;
|
|
142
|
+
/**
|
|
143
|
+
* 追加任务前的目标校验——**必须先于投递**,且与投递分两步:同步等待的租约要夹在
|
|
144
|
+
* 「校验通过」与「投递」之间(见 `Delegate` 的追加任务那段)。
|
|
145
|
+
*
|
|
146
|
+
* 归属判据是「**直接子**」(子的 `parentRunId` 所属会话 == 当前会话),不是「同一棵
|
|
147
|
+
* 树」:孙辈的 handle 本就不会出现在父的上下文里,能续到孙只可能是编了个 id 或从子的
|
|
148
|
+
* 产出正文里抄了一个。
|
|
149
|
+
*/
|
|
150
|
+
resolveFollowUpTarget(input: {
|
|
151
|
+
childSessionId: string;
|
|
152
|
+
parentSessionId: string;
|
|
153
|
+
}): Promise<FollowUpTarget>;
|
|
154
|
+
/**
|
|
155
|
+
* 把追加任务投进子会话并唤醒它。与派生尾段**逐字相同**的通道,子那边零特判——「子
|
|
156
|
+
* 记得自己写过什么」不是这里做的,是会话本身没被丢弃。子此刻仍在跑就是软插话。
|
|
157
|
+
*
|
|
158
|
+
* **不占名额**:名额记的是「同时有几个**新派生**的子」,与「存活 = 游标为 null」同一个口径。
|
|
159
|
+
*/
|
|
160
|
+
deliverFollowUp(input: {
|
|
161
|
+
childSessionId: string;
|
|
162
|
+
prompt: string;
|
|
163
|
+
userId: string | null;
|
|
164
|
+
}): Promise<void>;
|
|
165
|
+
/**
|
|
166
|
+
* 子已到达 idle 终态后,取它自 `since` 以来的回执。**与收尾回投 inbox 的那份同源**
|
|
167
|
+
* (同一个取数 + 同一套中和)——换个 `run_in_background` 值就换一份结论,是没法排查
|
|
168
|
+
* 的那类 bug。追加任务传发起前的游标,否则父会连同上一轮全文再收一遍。
|
|
169
|
+
*/
|
|
170
|
+
buildResult(childSessionId: string, since?: number | null): Promise<SubagentResult>;
|
|
171
|
+
/**
|
|
172
|
+
* 里程碑游标是否已越过 `cursor`(=子在这次等待期间到达过一次 idle 终态)。null 即
|
|
173
|
+
* 「首次 settle 了没有」。**追加任务不能沿用「非 null 即完成」**——那个条件在追加发起的
|
|
174
|
+
* 一瞬间就成立(上一轮推进过),父会立刻拿着上一轮的结果返回。
|
|
175
|
+
*/
|
|
176
|
+
hasAdvancedPast(childSessionId: string, cursor: number | null): Promise<boolean>;
|
|
177
|
+
/** loop 设置 tick 时要的子会话信息(深度、钉住的子 Agent 名……)。会话不存在返回 null。 */
|
|
178
|
+
tickInfo(sessionId: string): Promise<SubagentTickInfo | null>;
|
|
179
|
+
/**
|
|
180
|
+
* 子会话空转终态 → 把新产出中和后作为里程碑回投父 inbox 并唤醒父。
|
|
181
|
+
*
|
|
182
|
+
* loop 在每个 tick 收尾(锁已释放、re-wake 之前)对每个会话**无条件**调(`LoopHost.afterTick`),
|
|
183
|
+
* 这里自查:非子会话直接返回。
|
|
184
|
+
*
|
|
185
|
+
* **只还一次名额**:「存活」= 从派生到首次 idle 终态,判据是游标为 null。被追加任务
|
|
186
|
+
* 续跑后再次 idle 只回投新产出、不再还。
|
|
187
|
+
*
|
|
188
|
+
* **并发安全**:两次抢锁成功的唤醒可能并发进来、读到同一个旧游标。所有副作用都收在一次
|
|
189
|
+
* 乐观 CAS(`SessionStore.advanceMilestone`)之后:先按**旧**游标取产出,再把游标推进到
|
|
190
|
+
* 产出的最大 seq(无产出从序列取号);只有 CAS 成功的那一个回投 + 唤醒 + 还名额。
|
|
191
|
+
*
|
|
192
|
+
* 全程不抛:失败只记日志,兜底扫描是后备。
|
|
193
|
+
*/
|
|
194
|
+
finalizeIfIdle(childSessionId: string): Promise<void>;
|
|
195
|
+
/**
|
|
196
|
+
* 兜底:子 loop 可能在回投 / 还名额之前崩掉或丢锁。对每个嫌疑重跑一次收尾(幂等),
|
|
197
|
+
* 再把每棵被碰过的树的名额覆盖为真值。**先收尾后校正**:收尾会把游标从 null 推成非
|
|
198
|
+
* null,校正读到的才是收尾之后的存活数。宿主在启动时调一次(fire-and-forget)。
|
|
199
|
+
*/
|
|
200
|
+
sweepStale(): Promise<void>;
|
|
201
|
+
private deliver;
|
|
202
|
+
/**
|
|
203
|
+
* 子会话自 `since` 以来的 assistant 产出与终态。游标是消息 `seq`(会话内单调)——
|
|
204
|
+
* **不是时间戳**:挂钟会回拨,回拨之后新产出会被判成「旧的」直接跳过,父收到的回执
|
|
205
|
+
* 格式完好、内容缺一段。
|
|
206
|
+
*
|
|
207
|
+
* `watermark` = 取到的行里最大的 seq;没取到行时为 null(调用方从序列取号)。游标取自
|
|
208
|
+
* **取到的那些行**而不是独立取一个「当下」——后者可能跨到尚未取到的消息之后。
|
|
209
|
+
*/
|
|
210
|
+
private collectOutput;
|
|
211
|
+
private resultOf;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=subagent-sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-sessions.d.ts","sourceRoot":"","sources":["../../src/subagent/subagent-sessions.ts"],"names":[],"mappings":"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"}
|