@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,145 @@
|
|
|
1
|
+
import { LOCK_TTL_MS, } from '../ports/coordination.js';
|
|
2
|
+
import { silentLogger } from '../ports/logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* 两次 sweep 的间隔。也是「进程被杀后多久那一轮才会被收尾」的上界之一——
|
|
5
|
+
* 另一个是会话锁的自然过期(`LOCK_TTL_MS`),两者相加即最坏延迟。
|
|
6
|
+
*/
|
|
7
|
+
export const SWEEP_INTERVAL_MS = 60_000;
|
|
8
|
+
/** run 开跑多久之后才纳入候选:给「run 刚记下、锁的抢占与本次探测交叉」留出宽限。 */
|
|
9
|
+
export const ORPHAN_MIN_AGE_MS = LOCK_TTL_MS;
|
|
10
|
+
export const INTERRUPTED_ERROR = '服务中断(进程重启),本轮未跑完。';
|
|
11
|
+
/**
|
|
12
|
+
* 收尾「进程被杀留下的半截轮次」。
|
|
13
|
+
*
|
|
14
|
+
* 一轮的终态**只存在于跑它的那个进程的内存里**:跑次的 `finish()`、消息上的终态
|
|
15
|
+
* metadata 都在 tick 跑完那一刻才写。进程没了,这两个写入永远不会发生——跑次永久
|
|
16
|
+
* 停在 running、前端把那条没盖终态的消息当成「一轮真的还在飞」,每次刷新都卡成
|
|
17
|
+
* 「进行中」,点停止也救不回来(活跃登记簿随进程没了)。
|
|
18
|
+
*
|
|
19
|
+
* 判据是 **「该会话此刻有没有 loop 持锁」**:锁在整个 tick 期间持有并定期续租,
|
|
20
|
+
* 而 `finish()` 发生在 `release()` 之前,故「无锁 + 仍 running」是确定的孤儿,多
|
|
21
|
+
* 实例部署下也不会误伤别的实例正在跑的轮次。这条判据继承了会话锁的口径(锁过期 =
|
|
22
|
+
* 跑它的 loop 已经死了),误判的后果也是收敛的:`markInterrupted` 只在仍 running
|
|
23
|
+
* 时翻牌,那个进程后来恢复并 `finish()` 会覆盖成真实终态。
|
|
24
|
+
*
|
|
25
|
+
* **周期跑而不是只在启动跑一次**:进程被杀时会话锁不会主动释放,要等 TTL 自然
|
|
26
|
+
* 过期。启动那一刻锁多半还在,启动那次会(正确地)跳过所有候选。
|
|
27
|
+
*/
|
|
28
|
+
export class OrphanRunSweeper {
|
|
29
|
+
deps;
|
|
30
|
+
timer;
|
|
31
|
+
logger;
|
|
32
|
+
constructor(deps) {
|
|
33
|
+
this.deps = deps;
|
|
34
|
+
this.logger = deps.logger ?? silentLogger('');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 启动:立刻扫一次、把 inbox 有积压的会话各叫醒一次,之后周期扫。都是
|
|
38
|
+
* fire-and-forget,绝不阻塞 / 拖垮启动。返回停止函数(同 `dispose`)。
|
|
39
|
+
*/
|
|
40
|
+
start() {
|
|
41
|
+
void this.sweep().catch(err => this.logger.error(`orphan sweep failed at boot: ${String(err)}`));
|
|
42
|
+
void this.wakePendingInboxes().catch(err => this.logger.error(`inbox wake failed at boot: ${String(err)}`));
|
|
43
|
+
this.timer ??= setInterval(() => {
|
|
44
|
+
void this.sweep().catch(err => this.logger.error(`orphan sweep failed: ${String(err)}`));
|
|
45
|
+
}, this.deps.intervalMs ?? SWEEP_INTERVAL_MS);
|
|
46
|
+
// 定时器不该拖着进程不让它退出。
|
|
47
|
+
this.timer.unref?.();
|
|
48
|
+
return () => this.dispose();
|
|
49
|
+
}
|
|
50
|
+
dispose() {
|
|
51
|
+
if (this.timer)
|
|
52
|
+
clearInterval(this.timer);
|
|
53
|
+
this.timer = undefined;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 扫一轮孤儿 run 并收尾,返回收了几条。no-throw 到单条粒度:一条坏记录不能中断
|
|
57
|
+
* sweep(否则它后面那些本可以修好的轮次会一直卡着)。
|
|
58
|
+
*/
|
|
59
|
+
async sweep() {
|
|
60
|
+
const candidates = await this.deps.runs.findStaleRunning(this.deps.minAgeMs ?? ORPHAN_MIN_AGE_MS);
|
|
61
|
+
if (candidates.length === 0)
|
|
62
|
+
return 0;
|
|
63
|
+
let swept = 0;
|
|
64
|
+
for (const run of candidates) {
|
|
65
|
+
try {
|
|
66
|
+
if (await this.finalizeOrphan(run))
|
|
67
|
+
swept++;
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
this.logger.error(`orphan sweep: finalize run ${run.id} failed: ${String(err)}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (swept > 0) {
|
|
74
|
+
this.logger.warn(`orphan sweep: finalized ${swept} interrupted run(s) of ${candidates.length} candidate(s)`);
|
|
75
|
+
}
|
|
76
|
+
return swept;
|
|
77
|
+
}
|
|
78
|
+
/** 单条候选的处置。返回它是否真的由本次调用收的尾。 */
|
|
79
|
+
async finalizeOrphan(run) {
|
|
80
|
+
const { sessionId } = run;
|
|
81
|
+
// 会话还在跑 → 不是孤儿。会话已删(sessionId 为 null)则没有锁可问,照常收尾。
|
|
82
|
+
if (sessionId && (await this.deps.lock.isHeld(sessionId)))
|
|
83
|
+
return false;
|
|
84
|
+
// 翻牌失败 = 别人抢先收过尾了,后面几步一律不做。
|
|
85
|
+
if (!(await this.deps.runs.markInterrupted(run.id, INTERRUPTED_ERROR))) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
const messageIds = await this.deps.hub.closeInterruptedTurn(run.id, sessionId);
|
|
89
|
+
if (sessionId && this.deps.onRunOrphaned) {
|
|
90
|
+
try {
|
|
91
|
+
await this.deps.onRunOrphaned({ ...run, sessionId });
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
this.logger.warn(`orphan sweep: onRunOrphaned for session ${sessionId} failed: ${String(err)}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// 补发一条 run-finish 到会话面:**已经开着页面的用户不必刷新**就能看到这轮
|
|
98
|
+
// 收尾。刷新过来的用户则靠上面盖进库的终态 metadata——两条路都要有:流有保留
|
|
99
|
+
// 期,metadata 是永久的。
|
|
100
|
+
if (sessionId && run.rootSessionId) {
|
|
101
|
+
this.publishRunFinish(run, sessionId, run.rootSessionId, messageIds[0]);
|
|
102
|
+
}
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
publishRunFinish(run, sessionId, rootSessionId, messageId) {
|
|
106
|
+
const event = {
|
|
107
|
+
// 会话面自己分配游标,seq 对它无意义。
|
|
108
|
+
seq: 0,
|
|
109
|
+
streamId: run.streamId,
|
|
110
|
+
rootSessionId,
|
|
111
|
+
sessionId,
|
|
112
|
+
runId: run.id,
|
|
113
|
+
// 没有落库过任何 assistant 段时退回 runId —— 那也正是第一段本该用的 id。
|
|
114
|
+
messageId: messageId ?? run.id,
|
|
115
|
+
parentRunId: run.parentRunId,
|
|
116
|
+
depth: run.depth,
|
|
117
|
+
ts: Date.now(),
|
|
118
|
+
type: 'run-finish',
|
|
119
|
+
payload: { status: 'aborted', stopReason: 'aborted' },
|
|
120
|
+
};
|
|
121
|
+
this.deps.bus.publishSessionEvent(event);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 把「inbox 里还有待处理项」的会话各叫醒一次(wake 是瞬时广播,没有持久化;进程
|
|
125
|
+
* 在「已投递、loop 还没取」之间被杀,那条消息就只剩存储里一行,谁也不会再来叫醒
|
|
126
|
+
* 它)。只在启动跑:正常运行期间 `onWake` 收尾时会自查并重新广播。多实例同时启动
|
|
127
|
+
* 各 wake 一次也无害——抢锁只有一个赢。
|
|
128
|
+
*/
|
|
129
|
+
async wakePendingInboxes() {
|
|
130
|
+
const sessionIds = await this.deps.hub.listSessionIdsWithPending();
|
|
131
|
+
for (const sessionId of sessionIds) {
|
|
132
|
+
try {
|
|
133
|
+
await this.deps.wake.wake(sessionId);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
this.logger.error(`inbox wake: wake(${sessionId}) failed: ${String(err)}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (sessionIds.length > 0) {
|
|
140
|
+
this.logger.warn(`inbox wake: re-woke ${sessionIds.length} session(s) with pending items at boot`);
|
|
141
|
+
}
|
|
142
|
+
return sessionIds.length;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=orphan-run.sweeper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphan-run.sweeper.js","sourceRoot":"","sources":["../../src/loop/orphan-run.sweeper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type ContextBudgetTracker } from '../context/context-budget-tracker.js';
|
|
2
|
+
import type { ContextStore } from '../ports/context-store.js';
|
|
3
|
+
import { type ProjectionOptions } from '../turn/parts-to-model-messages.js';
|
|
4
|
+
import type { TurnHost, TurnResult } from '../turn/turn-envelope.js';
|
|
5
|
+
import type { TurnRecorder } from './message-hub.js';
|
|
6
|
+
/** `createRootTurnHost` 的入参。 */
|
|
7
|
+
export interface RootTurnHostOptions {
|
|
8
|
+
/** 本轮的记录器(`MessageHub.openTurn`;`LoopDriver` 交给 `LoopHost.buildTurn` 的那一个)。 */
|
|
9
|
+
recorder: TurnRecorder;
|
|
10
|
+
/**
|
|
11
|
+
* system prompt 拼装。**只放 tick 间稳定的内容**——它一变,后面全部历史在前缀
|
|
12
|
+
* 缓存里一起 miss。
|
|
13
|
+
*/
|
|
14
|
+
assembleSystem: (agentPrompt: string) => Promise<string>;
|
|
15
|
+
/**
|
|
16
|
+
* 本轮的上下文预算(`createContextBudgetTracker`,**一个 tick 一个**:它持有轮初
|
|
17
|
+
* 那批行的快照,跨 tick 复用会让快照过期)。给了就由它投影历史、经 `turnState`
|
|
18
|
+
* 交给 `beforeModelCall` 钩子、终态落 `contextThreshold`——三方同一个实例。
|
|
19
|
+
*
|
|
20
|
+
* 不给 = 不腾空间:历史按存储里现有的两个指针直接投影。
|
|
21
|
+
*/
|
|
22
|
+
budget?: ContextBudgetTracker | null;
|
|
23
|
+
/** 不给 `budget` 时投影历史的来源(通常就是 `MessageHub.store`)。 */
|
|
24
|
+
contextStore?: ContextStore;
|
|
25
|
+
/**
|
|
26
|
+
* 本轮模型的上下文窗口,随终态落进 metadata(`contextWindow`)。**分母跟着分子一起
|
|
27
|
+
* 落**:事后去查模型行会取到此刻那一版,历史那一轮的比例就成了拿今天的分母除
|
|
28
|
+
* 昨天的分子。null / 不给 = 不落。
|
|
29
|
+
*/
|
|
30
|
+
contextWindow?: number | null;
|
|
31
|
+
/** 投影选项(宿主登记的提醒类行 `reminderKinds`、工具旧名 `toolNameAliases`)。 */
|
|
32
|
+
projection?: Pick<ProjectionOptions, 'reminderKinds' | 'toolNameAliases'>;
|
|
33
|
+
/**
|
|
34
|
+
* 收尾之后的宿主钩子(自动命名、轮后追问、形式的轮末钩子……)。`wrote` = 这一轮在
|
|
35
|
+
* 对话流里留下东西了没有(空转轮为 false,命名的材料压根不存在)。
|
|
36
|
+
*
|
|
37
|
+
* **别在这里抛**:它的调用方是一轮的收尾,这里的失败不该改写那一轮的结局。要做
|
|
38
|
+
* 慢活就自己 fire-and-forget。
|
|
39
|
+
*/
|
|
40
|
+
afterPersist?: (result: TurnResult, wrote: boolean) => void | Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 根 turn 的参考宿主:把内核那几个与消息有关的钩子(drain / 换轮探测 / 增量落库 /
|
|
44
|
+
* 收尾)接到本轮的 `TurnRecorder` 上,另外接上下文预算。**一轮一行**:一次 tick 的
|
|
45
|
+
* 全部产出落成 `id = runId` 的一条 assistant 消息。
|
|
46
|
+
*
|
|
47
|
+
* 宿主自己的东西(system prompt 拼什么、轮后做什么)经入参注入;需要更多时照着本
|
|
48
|
+
* 函数自己写一个 `TurnHost` 也完全可以,内核只认接口。
|
|
49
|
+
*/
|
|
50
|
+
export declare function createRootTurnHost(opts: RootTurnHostOptions): TurnHost;
|
|
51
|
+
//# sourceMappingURL=root-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-host.d.ts","sourceRoot":"","sources":["../../src/loop/root-host.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,gCAAgC;AAChC,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,QAAQ,EAAE,YAAY,CAAC;IACvB;;;OAGG;IACH,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrC,qDAAqD;IACrD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,8DAA8D;IAC9D,UAAU,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,GAAG,iBAAiB,CAAC,CAAC;IAC1E;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,QAAQ,CA6CtE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { CONTEXT_BUDGET_TURN_STATE_KEY, } from '../context/context-budget-tracker.js';
|
|
2
|
+
import { partsToModelMessages, } from '../turn/parts-to-model-messages.js';
|
|
3
|
+
/**
|
|
4
|
+
* 根 turn 的参考宿主:把内核那几个与消息有关的钩子(drain / 换轮探测 / 增量落库 /
|
|
5
|
+
* 收尾)接到本轮的 `TurnRecorder` 上,另外接上下文预算。**一轮一行**:一次 tick 的
|
|
6
|
+
* 全部产出落成 `id = runId` 的一条 assistant 消息。
|
|
7
|
+
*
|
|
8
|
+
* 宿主自己的东西(system prompt 拼什么、轮后做什么)经入参注入;需要更多时照着本
|
|
9
|
+
* 函数自己写一个 `TurnHost` 也完全可以,内核只认接口。
|
|
10
|
+
*/
|
|
11
|
+
export function createRootTurnHost(opts) {
|
|
12
|
+
const { recorder, budget } = opts;
|
|
13
|
+
const sessionId = recorder.sessionId;
|
|
14
|
+
if (!budget && !opts.contextStore) {
|
|
15
|
+
throw new Error('createRootTurnHost: need either budget or contextStore');
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
// 经 tracker 投影:投影出来的历史与它随后用来算切点的那份行快照必须是同一批
|
|
19
|
+
// (腾空间时替换的是这次投影出来的头部)。
|
|
20
|
+
loadContext: () => budget ? budget.load() : projectStored(opts, sessionId),
|
|
21
|
+
...(budget
|
|
22
|
+
? { turnState: new Map([[CONTEXT_BUDGET_TURN_STATE_KEY, budget]]) }
|
|
23
|
+
: {}),
|
|
24
|
+
assembleSystem: opts.assembleSystem,
|
|
25
|
+
// 取出 inbox 并落库(同一个事务);「本轮领到过东西没有」由 recorder 记账。
|
|
26
|
+
drainInbox: () => recorder.take(),
|
|
27
|
+
// 换轮判断点:只探不取,消息留给下一个 tick 的 drain。
|
|
28
|
+
hasPendingInbox: () => recorder.hasPending(),
|
|
29
|
+
onAssistantStep: (parts, uptoSeq) => recorder.record(parts, uptoSeq),
|
|
30
|
+
persist: async (result) => {
|
|
31
|
+
const threshold = budget?.threshold ?? null;
|
|
32
|
+
const wrote = await recorder.close({
|
|
33
|
+
status: result.status,
|
|
34
|
+
stopReason: result.stopReason,
|
|
35
|
+
error: result.error,
|
|
36
|
+
usage: result.usage,
|
|
37
|
+
metadata: {
|
|
38
|
+
// 下一轮开头的压力基线。落在 metadata 而不是 usage:后者是「这一轮花了
|
|
39
|
+
// 多少」的累加账单,这个是「上下文当时有多大」的一次快照。
|
|
40
|
+
...(result.contextTokens !== undefined
|
|
41
|
+
? { contextTokens: result.contextTokens }
|
|
42
|
+
: {}),
|
|
43
|
+
...(opts.contextWindow != null
|
|
44
|
+
? { contextWindow: opts.contextWindow }
|
|
45
|
+
: {}),
|
|
46
|
+
// 界面上「快满了」的判据读它,不自己再算一遍比例。
|
|
47
|
+
...(threshold !== null
|
|
48
|
+
? { contextThreshold: Math.round(threshold) }
|
|
49
|
+
: {}),
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
await opts.afterPersist?.(result, wrote);
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async function projectStored(opts, sessionId) {
|
|
57
|
+
const store = opts.contextStore;
|
|
58
|
+
const { rows, prunedUptoSeq, compactedUptoSeq } = await store.loadContextInputs(sessionId);
|
|
59
|
+
return partsToModelMessages(rows, {
|
|
60
|
+
prunedUptoSeq,
|
|
61
|
+
compactedUptoSeq,
|
|
62
|
+
...opts.projection,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=root-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-host.js","sourceRoot":"","sources":["../../src/loop/root-host.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,6BAA6B,GAE9B,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EACL,oBAAoB,GAErB,MAAM,oCAAoC,CAAC;AAyC5C;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAyB;IAC1D,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IACrC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO;QACL,4CAA4C;QAC5C,uBAAuB;QACvB,WAAW,EAAE,GAA4B,EAAE,CACzC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC;QACzD,GAAG,CAAC,MAAM;YACR,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE;YACnE,CAAC,CAAC,EAAE,CAAC;QACP,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,gDAAgD;QAChD,UAAU,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE;QACjC,mCAAmC;QACnC,eAAe,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE;QAC5C,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;QACpE,OAAO,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;YACtB,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC;gBACjC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,QAAQ,EAAE;oBACR,6CAA6C;oBAC7C,+BAA+B;oBAC/B,GAAG,CAAC,MAAM,CAAC,aAAa,KAAK,SAAS;wBACpC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE;wBACzC,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI;wBAC5B,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;wBACvC,CAAC,CAAC,EAAE,CAAC;oBACP,2BAA2B;oBAC3B,GAAG,CAAC,SAAS,KAAK,IAAI;wBACpB,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;wBAC7C,CAAC,CAAC,EAAE,CAAC;iBACR;aACF,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,IAAyB,EACzB,SAAiB;IAEjB,MAAM,KAAK,GAAG,IAAI,CAAC,YAA4B,CAAC;IAChD,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAC7C,MAAM,KAAK,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC3C,OAAO,oBAAoB,CAAC,IAAI,EAAE;QAChC,aAAa;QACb,gBAAgB;QAChB,GAAG,IAAI,CAAC,UAAU;KACnB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { MessagePart } from '../schema/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 上下文预算要的那一份会话历史里的一行。
|
|
4
|
+
*
|
|
5
|
+
* 只有投影与切点用得上的字段:`seq` 判阴影区,`kind` 让投影层认出 checkpoint 行
|
|
6
|
+
* (提到最前面 + 包围栏)——**漏给 `kind` 的症状是那条摘要排在保留下来的历史后面、
|
|
7
|
+
* 且不带围栏,两样都不报错**。宿主的行若把 kind 放在 metadata 里,在实现端口时
|
|
8
|
+
* 摊平到这里。
|
|
9
|
+
*/
|
|
10
|
+
export interface ContextRow {
|
|
11
|
+
seq: number;
|
|
12
|
+
role: string;
|
|
13
|
+
parts: MessagePart[];
|
|
14
|
+
kind?: string | null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 上下文预算的一整套输入,**必须来自同一时刻**:指针比行新会让投影裁掉一段根本
|
|
18
|
+
* 没在 `rows` 里的历史(无害),反过来则会让刚推进过的指针被一份旧快照当成
|
|
19
|
+
* 「没推进」,白白重算一次。
|
|
20
|
+
*/
|
|
21
|
+
export interface ContextInputs {
|
|
22
|
+
/** 会话的全部消息行,按 seq 升序。 */
|
|
23
|
+
rows: ContextRow[];
|
|
24
|
+
/** 裁剪指针;null = 从未裁剪。 */
|
|
25
|
+
prunedUptoSeq: number | null;
|
|
26
|
+
/** 压缩指针;null = 从未压缩。 */
|
|
27
|
+
compactedUptoSeq: number | null;
|
|
28
|
+
/**
|
|
29
|
+
* 跨轮压力基线:上一轮最后一次模型调用报回的输入 token 数(`TurnResult.contextTokens`
|
|
30
|
+
* 由宿主落库的那个数)。null = 没有(会话头一轮,或宿主不记)。
|
|
31
|
+
*/
|
|
32
|
+
baselineContextTokens: number | null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 上下文预算的存储端口:读历史与两个指针、推进裁剪指针、提交一次压缩。
|
|
36
|
+
*
|
|
37
|
+
* **只是消费方视角的一个窄接口**。agent-base 里这三件分属两处——读与裁剪指针在
|
|
38
|
+
* 会话服务、checkpoint 落库在消息中心(`chat_message` 的唯一写入方)——宿主实现
|
|
39
|
+
* 本端口时照样可以各自委托过去,端口不要求它们合并。
|
|
40
|
+
*/
|
|
41
|
+
export interface ContextStore {
|
|
42
|
+
loadContextInputs(sessionId: string): Promise<ContextInputs>;
|
|
43
|
+
/**
|
|
44
|
+
* 推进裁剪指针。**只增不减**:实现必须取 `max(旧值, seq)`(SQL 里是
|
|
45
|
+
* `greatest(coalesce(…, 0), seq)`),两个并发 tick 各自算出切点时,晚到的那个
|
|
46
|
+
* 较小值不许把指针拉回去——拉回去等于让已经换成存根的正文重新进上下文,前缀
|
|
47
|
+
* 缓存整段 miss。
|
|
48
|
+
*/
|
|
49
|
+
advancePrunedUpto(sessionId: string, seq: number): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* 提交一次压缩:落 checkpoint 行(role `user`、`kind = COMPACTION_CHECKPOINT_KIND`、
|
|
52
|
+
* 一个 text part 装摘要)+ 把压缩指针推到 `seq`(同样只增不减),**原子地**。
|
|
53
|
+
*
|
|
54
|
+
* 拆开就有两种半成品,都是静默的:只落了行 = 模型下一轮把同一段历史读两遍
|
|
55
|
+
* (原文和摘要各一份);只推了指针 = 那段历史凭空消失,且指针退不回去。
|
|
56
|
+
*
|
|
57
|
+
* 返回落下的那一行:调用方要它的 `seq` 更新快照(下一次压缩的切点必须覆盖它)。
|
|
58
|
+
*/
|
|
59
|
+
appendCheckpoint(input: {
|
|
60
|
+
sessionId: string;
|
|
61
|
+
/** 压缩切点(含)。 */
|
|
62
|
+
seq: number;
|
|
63
|
+
/** 纯摘要正文,**不带围栏**(围栏是投影时的呈现)。 */
|
|
64
|
+
summary: string;
|
|
65
|
+
}): Promise<ContextRow & {
|
|
66
|
+
id: string;
|
|
67
|
+
}>;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=context-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-store.d.ts","sourceRoot":"","sources":["../../src/ports/context-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,wBAAwB;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,wBAAwB;IACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;OAGG;IACH,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAE7D;;;;;OAKG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;;;;;;;OAQG;IACH,gBAAgB,CAAC,KAAK,EAAE;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,iCAAiC;QACjC,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,UAAU,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-store.js","sourceRoot":"","sources":["../../src/ports/context-store.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import type { MessagePart } from '../schema/index.js';
|
|
2
|
+
import type { ContextStore } from './context-store.js';
|
|
3
|
+
/**
|
|
4
|
+
* `user_message` 用户 / 父 Agent 说的话;`tool_result` 子 Agent 回执;
|
|
5
|
+
* `system_reminder` 平台自己插进会话的提醒——落库成带 `metadata.kind` 的 user 行,
|
|
6
|
+
* 投影层按那个标记包围栏。
|
|
7
|
+
*/
|
|
8
|
+
export type InboxMessageKind = 'user_message' | 'tool_result' | 'system_reminder';
|
|
9
|
+
export type InboxSourceKind = 'user' | 'tool' | 'system';
|
|
10
|
+
/** inbox 里排队的一条消息。 */
|
|
11
|
+
export interface InboxItem {
|
|
12
|
+
id: string;
|
|
13
|
+
/** 投递序(单调递增)。**取出时按它排,不按挂钟**——挂钟会回拨。 */
|
|
14
|
+
seq: number;
|
|
15
|
+
sessionId: string;
|
|
16
|
+
kind: InboxMessageKind;
|
|
17
|
+
sourceKind: InboxSourceKind;
|
|
18
|
+
/** 谁发的(系统触发为 null)。撤回按它判归属。 */
|
|
19
|
+
sourceUserId: string | null;
|
|
20
|
+
/**
|
|
21
|
+
* 结构化来源(子 Agent 回执的 handle / status / stopReason;`system_reminder` 必须
|
|
22
|
+
* 带 `{ kind }`)。
|
|
23
|
+
*/
|
|
24
|
+
source: Record<string, unknown> | null;
|
|
25
|
+
parts: MessagePart[];
|
|
26
|
+
/**
|
|
27
|
+
* 落库时要用的消息主键,投递那一刻由 `MessageHub.post` 铸好、随行贯通——前端拿到的
|
|
28
|
+
* id 与库里那一行同源。
|
|
29
|
+
*/
|
|
30
|
+
messageId: string;
|
|
31
|
+
}
|
|
32
|
+
/** 会话里落了库的一条消息。 */
|
|
33
|
+
export interface ConversationMessage {
|
|
34
|
+
id: string;
|
|
35
|
+
sessionId: string;
|
|
36
|
+
/** 会话内单调递增(裁剪 / 压缩指针按它判阴影区)。 */
|
|
37
|
+
seq: number;
|
|
38
|
+
role: 'user' | 'assistant';
|
|
39
|
+
parts: MessagePart[];
|
|
40
|
+
metadata: Record<string, unknown> | null;
|
|
41
|
+
tokenUsage?: Record<string, number> | null;
|
|
42
|
+
}
|
|
43
|
+
/** 要落的一条消息(`appendMessage` / `takeInbox` 的输入)。 */
|
|
44
|
+
export interface NewConversationMessage {
|
|
45
|
+
/** 指定主键(幂等的基础);省略则由存储生成。 */
|
|
46
|
+
id?: string;
|
|
47
|
+
sessionId: string;
|
|
48
|
+
role: 'user' | 'assistant';
|
|
49
|
+
parts: MessagePart[];
|
|
50
|
+
metadata?: Record<string, unknown>;
|
|
51
|
+
tokenUsage?: Record<string, number>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 会话存储:消息行 + inbox + 两个上下文指针(继承 `ContextStore`)。
|
|
55
|
+
*
|
|
56
|
+
* **只是存储**。「一条消息怎么产生、取出时怎么换成模型要的形态、一轮怎么收尾」归
|
|
57
|
+
* runtime 的 `MessageHub` / `TurnRecorder`——它们是本端口唯一的写入方,宿主别绕过
|
|
58
|
+
* 它们直接写(agent-base 的边界原样保留:消息中心是 `chat_message` 与 `agent_inbox`
|
|
59
|
+
* 的唯一写入方)。读不受此限。
|
|
60
|
+
*
|
|
61
|
+
* 「会话有了新动静」(列表按更新时间排序)由实现自己在 `appendMessage` /
|
|
62
|
+
* `appendAssistantStep` / `takeInbox` 里顺带记;`appendCheckpoint` /
|
|
63
|
+
* `advancePrunedUpto` **不该**记(后台腾空间不是新动静)。
|
|
64
|
+
*/
|
|
65
|
+
export interface ConversationStore extends ContextStore {
|
|
66
|
+
/** 投递进 inbox。 */
|
|
67
|
+
enqueue(item: Omit<InboxItem, 'id' | 'seq'>): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* 取出本会话 inbox 里的全部消息并落库,**原子地**(取出与落库同一个事务)。
|
|
70
|
+
*
|
|
71
|
+
* 拆成「先取后写」两步的话,中间失败就两边都没有了——丢的是用户亲手发的话。
|
|
72
|
+
* 按 `seq` 升序处理;`toMessage` 把一条 inbox 项换成要落的那一行(纯函数,
|
|
73
|
+
* 由 `MessageHub` 给)。返回每一项与它落下的那一行,顺序同 `seq`。
|
|
74
|
+
*
|
|
75
|
+
* 落库按 id 幂等(同 `appendMessage`)。
|
|
76
|
+
*/
|
|
77
|
+
takeInbox(sessionId: string, toMessage: (item: InboxItem) => NewConversationMessage): Promise<Array<{
|
|
78
|
+
item: InboxItem;
|
|
79
|
+
message: ConversationMessage;
|
|
80
|
+
}>>;
|
|
81
|
+
/** 只探不取。 */
|
|
82
|
+
hasPending(sessionId: string): Promise<boolean>;
|
|
83
|
+
/** 本会话的待处理队列(按 seq 升序)。 */
|
|
84
|
+
listPending(sessionId: string): Promise<InboxItem[]>;
|
|
85
|
+
/** 此刻还有待处理项的全部会话 id(去重)。供启动时补唤醒。 */
|
|
86
|
+
listSessionIdsWithPending(): Promise<string[]>;
|
|
87
|
+
/** 撤回:只删 `sourceUserId` 匹配的、还没被取走的那一项;返回被删项或 null。 */
|
|
88
|
+
withdraw(id: string, userId: string): Promise<InboxItem | null>;
|
|
89
|
+
/**
|
|
90
|
+
* 落一条消息。**按 id 幂等**:带 id 且已存在时返回已存在的那一行,不报错、
|
|
91
|
+
* 不返回空(撞主键静默返回空,再被当成功行用,是远离成因的 TypeError)。
|
|
92
|
+
*/
|
|
93
|
+
appendMessage(message: NewConversationMessage): Promise<ConversationMessage>;
|
|
94
|
+
/**
|
|
95
|
+
* assistant 段的增量落库:`messageId` 那一行不存在就建(role assistant、
|
|
96
|
+
* `metadata = { runId, ...metadataPatch }`),存在就把 `parts` **追加**到既有
|
|
97
|
+
* parts 之后、`metadataPatch` 合并进既有 metadata。
|
|
98
|
+
*/
|
|
99
|
+
appendAssistantStep(input: {
|
|
100
|
+
messageId: string;
|
|
101
|
+
runId: string;
|
|
102
|
+
sessionId: string;
|
|
103
|
+
parts: MessagePart[];
|
|
104
|
+
metadataPatch?: Record<string, unknown>;
|
|
105
|
+
}): Promise<void>;
|
|
106
|
+
/**
|
|
107
|
+
* 一轮收尾:`messageId` 那一行的 metadata **整体重写**为
|
|
108
|
+
* `{ runId, ...metadata }`;给了 usage 就写进 `tokenUsage`。
|
|
109
|
+
*/
|
|
110
|
+
finalizeAssistantTurn(input: {
|
|
111
|
+
messageId: string;
|
|
112
|
+
runId: string;
|
|
113
|
+
metadata: Record<string, unknown>;
|
|
114
|
+
usage?: Record<string, number>;
|
|
115
|
+
}): Promise<void>;
|
|
116
|
+
/**
|
|
117
|
+
* 给一轮里所有**还没盖过终态**(`metadata.status` 为空)、`metadata.runId` 等于
|
|
118
|
+
* `runId` 的 assistant 行合并上 `{ status: 'aborted', stopReason: 'aborted' }`,
|
|
119
|
+
* 返回被改的行 id。按 metadata 里的 runId 找、按「缺 status」筛:存量数据里
|
|
120
|
+
* 一轮可能有多段(各自的 id),且对已收尾的段必须是 no-op(幂等)。
|
|
121
|
+
*/
|
|
122
|
+
finalizeInterruptedTurn(runId: string): Promise<string[]>;
|
|
123
|
+
/** 一轮落过的 assistant 行 id(`metadata.runId` 等于它的,按 seq 升序)。 */
|
|
124
|
+
listTurnSegmentIds(runId: string): Promise<string[]>;
|
|
125
|
+
/**
|
|
126
|
+
* 会话的消息(按 seq 升序)。`filter` 缺省 = 全部;`role` 只要这一种,`afterSeq` 只要
|
|
127
|
+
* `seq > 它`的(子 Agent 回执按里程碑游标取「这一轮新说的话」)。
|
|
128
|
+
*/
|
|
129
|
+
listMessages(sessionId: string, filter?: ListMessagesFilter): Promise<ConversationMessage[]>;
|
|
130
|
+
/**
|
|
131
|
+
* 从会话的 seq 序列上取走一个号,**不落任何行**,返回它。
|
|
132
|
+
*
|
|
133
|
+
* 子 Agent 一轮一个字都没说时,里程碑游标仍要**真的前进**(父的同步等待以它为判据),
|
|
134
|
+
* 而前进到的值必须大于此刻所有消息、又永远不等于将来的任何一条——否则那条消息会被
|
|
135
|
+
* `seq > 游标` 判成「已经回投过」而永远收不到。所以不能用 `游标 + 1`,只能从序列上
|
|
136
|
+
* 取号:取走的号不会再分配给任何行。
|
|
137
|
+
*/
|
|
138
|
+
reserveSeq(sessionId: string): Promise<number>;
|
|
139
|
+
}
|
|
140
|
+
export interface ListMessagesFilter {
|
|
141
|
+
role?: 'user' | 'assistant';
|
|
142
|
+
afterSeq?: number | null;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=conversation-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-store.d.ts","sourceRoot":"","sources":["../../src/ports/conversation-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-store.js","sourceRoot":"","sources":["../../src/ports/conversation-store.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 跨实例协调的几个小端口:会话锁、唤醒 / 空闲广播、子 Agent 等待租约、树级名额。
|
|
3
|
+
* 搬自 agent-base `agent-core/loop/*` 与 `agent-core/subagent/{subagent-await,tree-budget}.service.ts`,
|
|
4
|
+
* 原来都直接用 Redis;这里只留语义,进程内实现见 `in-process/`,Redis 实现在
|
|
5
|
+
* `@qjp88995/agent-runtime-redis`。
|
|
6
|
+
*/
|
|
7
|
+
/** 会话锁的缺省 TTL:持有者崩溃后锁自然过期的上界。持有者要按更短的间隔续租。 */
|
|
8
|
+
export declare const LOCK_TTL_MS = 60000;
|
|
9
|
+
/**
|
|
10
|
+
* 「每会话同时至多一个 loop」的串行化原语。抢到给 token,续租 / 释放都比对 token,
|
|
11
|
+
* 不误伤「TTL 过期后被别人重新抢到」的锁。
|
|
12
|
+
*/
|
|
13
|
+
export interface SessionLock {
|
|
14
|
+
/** 抢锁;抢到返回 token,已被占返回 null。 */
|
|
15
|
+
acquire(sessionId: string): Promise<string | null>;
|
|
16
|
+
/** 续租;token 不再是持有者返回 false(调用方应当停止这一轮)。 */
|
|
17
|
+
renew(sessionId: string, token: string): Promise<boolean>;
|
|
18
|
+
/** 释放;token 不匹配时什么都不做。 */
|
|
19
|
+
release(sessionId: string, token: string): Promise<void>;
|
|
20
|
+
/** 只读探测此刻是否有人持锁,**不参与互斥**(判断完锁随时可能易主)。 */
|
|
21
|
+
isHeld(sessionId: string): Promise<boolean>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 唤醒与空闲广播。
|
|
25
|
+
*
|
|
26
|
+
* - `wake`:「这个会话有活了」,所有实例都收到,各自去抢会话锁,只有一个跑成。
|
|
27
|
+
* 投递方(发言、子 Agent 回投、启动补唤醒)只依赖这个口,不依赖 loop 本身。
|
|
28
|
+
* - `idle`:「这个会话的一个 tick 跑完且 inbox 已空」。runtime 只广播事实,不认识消费方;
|
|
29
|
+
* 消费方要自己有兜底扫描(tick 在准备阶段就抛错的会话不会发 idle)。
|
|
30
|
+
*
|
|
31
|
+
* 投递是 at-most-once 的广播(与 Redis pub/sub 同语义):订阅前发的收不到。
|
|
32
|
+
*/
|
|
33
|
+
export interface WakeChannel {
|
|
34
|
+
wake(sessionId: string): Promise<void>;
|
|
35
|
+
/** 订阅唤醒;返回取消订阅函数。 */
|
|
36
|
+
onWake(handler: (sessionId: string) => void): () => void;
|
|
37
|
+
idle(sessionId: string): Promise<void>;
|
|
38
|
+
/** 订阅空闲;返回取消订阅函数。 */
|
|
39
|
+
onIdle(handler: (sessionId: string) => void): () => void;
|
|
40
|
+
}
|
|
41
|
+
/** 等待租约的 TTL(秒级语义):父每 `AWAIT_RENEW_INTERVAL_MS` 续一次。 */
|
|
42
|
+
export declare const AWAIT_LEASE_TTL_MS = 60000;
|
|
43
|
+
export declare const AWAIT_RENEW_INTERVAL_MS = 10000;
|
|
44
|
+
/**
|
|
45
|
+
* 「父是否正在同步等这个子会话」的租约。
|
|
46
|
+
*
|
|
47
|
+
* 父放弃等待与子的收尾(finalizer)决定要不要把结果回投父 inbox,抢的是同一个原子 `claim`:
|
|
48
|
+
* 恰有一方胜出,既不会双份也不会两边都不管。父崩溃即停止续租,过期后 finalizer 自动恢复投递
|
|
49
|
+
* ——所以是租约,不是一个布尔列(父一崩就永久留成 true,是静默丢失)。
|
|
50
|
+
*
|
|
51
|
+
* 失败时的退化方向(实现要遵守):一律退化成异步——`begin` 失败返回 false;
|
|
52
|
+
* `isAwaited` 拿不准当作没人等;`claim` 拿不准时 parent 得 true、finalizer 得 false。
|
|
53
|
+
*/
|
|
54
|
+
export interface SubagentAwaitLease {
|
|
55
|
+
/** 登记「父开始等这个子」。失败返回 false,调用方退回异步模式。 */
|
|
56
|
+
begin(childSessionId: string): Promise<boolean>;
|
|
57
|
+
/** 心跳续租。失败不抛。 */
|
|
58
|
+
renew(childSessionId: string): Promise<void>;
|
|
59
|
+
/** 有没有人正同步等这个子——只读,不消费租约。 */
|
|
60
|
+
isAwaited(childSessionId: string): Promise<boolean>;
|
|
61
|
+
/** 抢投递权(父与 finalizer 共用)。返回是否抢到。 */
|
|
62
|
+
claim(childSessionId: string, by: 'parent' | 'finalizer'): Promise<boolean>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 树级(根会话)并发子 Agent 名额。`tryIncr` 必须是原子的「读比较写」,
|
|
66
|
+
* 否则并发派生会一起读到「未超限」而超发。
|
|
67
|
+
*/
|
|
68
|
+
export interface TreeBudget {
|
|
69
|
+
/** 当前值 < `limit` 则占一个名额返回 true,否则不变返回 false。 */
|
|
70
|
+
tryIncr(rootSessionId: string, limit: number): Promise<boolean>;
|
|
71
|
+
/** 释放一个名额;减到 ≤ 0 时清掉,不留负值。 */
|
|
72
|
+
decr(rootSessionId: string): Promise<void>;
|
|
73
|
+
/** 覆盖写(兜底扫描按实际存活数校正)。 */
|
|
74
|
+
set(rootSessionId: string, n: number): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=coordination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordination.d.ts","sourceRoot":"","sources":["../../src/ports/coordination.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8CAA8C;AAC9C,eAAO,MAAM,WAAW,QAAS,CAAC;AAElC;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnD,2CAA2C;IAC3C,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,0BAA0B;IAC1B,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,0CAA0C;IAC1C,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7C;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,qBAAqB;IACrB,MAAM,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACzD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,qBAAqB;IACrB,MAAM,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC1D;AAED,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,QAAS,CAAC;AACzC,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,KAAK,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,iBAAiB;IACjB,KAAK,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,6BAA6B;IAC7B,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,oCAAoC;IACpC,KAAK,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7E;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,gDAAgD;IAChD,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,8BAA8B;IAC9B,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,yBAAyB;IACzB,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 跨实例协调的几个小端口:会话锁、唤醒 / 空闲广播、子 Agent 等待租约、树级名额。
|
|
3
|
+
* 搬自 agent-base `agent-core/loop/*` 与 `agent-core/subagent/{subagent-await,tree-budget}.service.ts`,
|
|
4
|
+
* 原来都直接用 Redis;这里只留语义,进程内实现见 `in-process/`,Redis 实现在
|
|
5
|
+
* `@qjp88995/agent-runtime-redis`。
|
|
6
|
+
*/
|
|
7
|
+
/** 会话锁的缺省 TTL:持有者崩溃后锁自然过期的上界。持有者要按更短的间隔续租。 */
|
|
8
|
+
export const LOCK_TTL_MS = 60_000;
|
|
9
|
+
/** 等待租约的 TTL(秒级语义):父每 `AWAIT_RENEW_INTERVAL_MS` 续一次。 */
|
|
10
|
+
export const AWAIT_LEASE_TTL_MS = 60_000;
|
|
11
|
+
export const AWAIT_RENEW_INTERVAL_MS = 10_000;
|
|
12
|
+
//# sourceMappingURL=coordination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordination.js","sourceRoot":"","sources":["../../src/ports/coordination.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8CAA8C;AAC9C,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AAoClC,wDAAwD;AACxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AACzC,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC"}
|