@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
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import type { SessionLock } from '../ports/coordination.js';
|
|
2
|
+
import { type LoggerFactory } from '../ports/logger.js';
|
|
3
|
+
import { type QuestionRecord, type QuestionStore, type SettledQuestionStatus } from '../ports/question-store.js';
|
|
4
|
+
import type { SessionRecord, SessionStore } from '../ports/session-store.js';
|
|
5
|
+
import type { StreamBus } from '../ports/stream-bus.js';
|
|
6
|
+
import type { AgentQuestion, AnswerAgentQuestionRequest, AskInput } from './ask-schema.js';
|
|
7
|
+
/** `timeoutSeconds` 的缺省允许范围(秒)。宿主经 `AskServiceDeps.timeoutBounds` 换。 */
|
|
8
|
+
export declare const ASK_TIMEOUT_MIN_DEFAULT = 30;
|
|
9
|
+
export declare const ASK_TIMEOUT_MAX_DEFAULT = 1800;
|
|
10
|
+
/**
|
|
11
|
+
* 不限时的问题最多等多久(秒)。「一直等」需要一个上限:等待期间那一轮占着会话锁、
|
|
12
|
+
* 占着一个 tick,而进程迟早要重启。到点问题作废(**不是**按默认项继续——不限时的
|
|
13
|
+
* 问题多半根本没有默认项,那正是模型选择不设超时的原因)。
|
|
14
|
+
*/
|
|
15
|
+
export declare const ASK_MAX_WAIT_SECONDS: number;
|
|
16
|
+
/** 等待期间多久看一眼那一行。回答接口可能落在另一个实例上,所以是查存储而不是进程内通知。 */
|
|
17
|
+
export declare const ASK_POLL_INTERVAL_MS = 1000;
|
|
18
|
+
/** 有了结局的一行(`waitForOutcome` 的产出)。 */
|
|
19
|
+
export type SettledQuestion = QuestionRecord & {
|
|
20
|
+
status: SettledQuestionStatus;
|
|
21
|
+
};
|
|
22
|
+
export type AskOutcome = {
|
|
23
|
+
ok: true;
|
|
24
|
+
question: AgentQuestion;
|
|
25
|
+
} | {
|
|
26
|
+
ok: false;
|
|
27
|
+
message: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* 回答接口的失败。三种 `code` 对应 agent-base 的三个错误类,宿主按它映射 HTTP
|
|
31
|
+
* (not_found → 404,not_pending → 409,invalid → 400)。
|
|
32
|
+
*/
|
|
33
|
+
export declare class AskAnswerError extends Error {
|
|
34
|
+
readonly code: 'not_found' | 'not_pending' | 'invalid';
|
|
35
|
+
/** `not_pending` 时那一行此刻的状态(`'unknown'` = 读不到了)。 */
|
|
36
|
+
readonly status?: string | undefined;
|
|
37
|
+
constructor(code: 'not_found' | 'not_pending' | 'invalid', message: string,
|
|
38
|
+
/** `not_pending` 时那一行此刻的状态(`'unknown'` = 读不到了)。 */
|
|
39
|
+
status?: string | undefined);
|
|
40
|
+
}
|
|
41
|
+
export interface AskServiceDeps {
|
|
42
|
+
questions: QuestionStore;
|
|
43
|
+
sessions: Pick<SessionStore, 'getSession'>;
|
|
44
|
+
/** 「等的那一轮还活着吗」= 会话锁有没有人持有。 */
|
|
45
|
+
lock: Pick<SessionLock, 'isHeld'>;
|
|
46
|
+
bus: Pick<StreamBus, 'publishSessionEvent'>;
|
|
47
|
+
/**
|
|
48
|
+
* 这条会话对面有人在看吗(挂在某个界面名下)。宿主的判据——agent-base 里是
|
|
49
|
+
* 「会话所属的形式有没有观看者」。只对有属主的根会话问。
|
|
50
|
+
*/
|
|
51
|
+
hasViewer: (session: SessionRecord) => boolean | Promise<boolean>;
|
|
52
|
+
/** 本次部署允许的 `timeoutSeconds` 范围;每次提问现取(宿主可接系统参数)。 */
|
|
53
|
+
timeoutBounds?: () => {
|
|
54
|
+
min: number;
|
|
55
|
+
max: number;
|
|
56
|
+
};
|
|
57
|
+
/** 缺省 `ASK_MAX_WAIT_SECONDS`。 */
|
|
58
|
+
maxWaitSeconds?: number;
|
|
59
|
+
/** 缺省 `ASK_POLL_INTERVAL_MS`。 */
|
|
60
|
+
pollIntervalMs?: number;
|
|
61
|
+
logger?: LoggerFactory;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Agent 停下来问用户。搬自 agent-base `AskUserQuestionService`。
|
|
65
|
+
*
|
|
66
|
+
* ## 同步:工具在这一轮里等用户回答
|
|
67
|
+
*
|
|
68
|
+
* `AskTool` 落一行 pending,然后 `waitForOutcome` 一直等到这一行有了结局,把结局
|
|
69
|
+
* 作为工具的返回值交给模型。这一轮因此**没有结束**:同一个 run、同一条 assistant
|
|
70
|
+
* 消息,模型拿到回答接着干。
|
|
71
|
+
*
|
|
72
|
+
* **选同步不是因为它省事,是因为它不碰「一轮 = 一段完整的活」这条到处被默认的
|
|
73
|
+
* 前提。** agent-base 的第一版是挂起式的(问完本轮就结束、回答经 inbox 唤醒下一轮),
|
|
74
|
+
* 结果一路撞上这条前提的消费方:消息底部的动作栏挂在半句话下面、追问与产出整理在
|
|
75
|
+
* 「活做到一半」时就跑了、模型生成提问那几秒里用户发的插话被下一轮当成了回答。
|
|
76
|
+
* 同步之下这些问题整类不存在:等待期间到达的一切只是在 inbox 里排着。
|
|
77
|
+
*
|
|
78
|
+
* 代价是明确的、且都是**看得见的**失败:
|
|
79
|
+
* - 进程重启会打断正在等的那一轮(同 `Delegate` 同步等待):宿主在孤儿 run 收尾里
|
|
80
|
+
* 调 `cancelPending`,界面显示「已中断」,用户说一句「继续」。
|
|
81
|
+
* - 「一直等」有上限(`maxWaitSeconds`)。
|
|
82
|
+
*
|
|
83
|
+
* ## 结局只有一个持有者
|
|
84
|
+
*
|
|
85
|
+
* 五种结局——用户点选(`answer`)、到点按默认项(等待方自己收)、用户改为打字回答
|
|
86
|
+
* (`supersedeOnUserTurn`)、停止 / 中断(`cancelPending`)、等过了上限——抢的是
|
|
87
|
+
* **同一个**带 pending 谓词的原子更新(`QuestionStore.settle` / `settleSession`)。
|
|
88
|
+
*
|
|
89
|
+
* ## 状态每变一次都经会话流广播
|
|
90
|
+
*
|
|
91
|
+
* `agent-question` 会话级事件,载荷 `{question}`(线上形态)。界面只认这一条通道。
|
|
92
|
+
*
|
|
93
|
+
* ## 宿主要接的线
|
|
94
|
+
*
|
|
95
|
+
* - 每 tick 问 `availableFor`,为假就把 `Ask` 放进 `excludeTools`。
|
|
96
|
+
* - 用户点名回答某个问题时发的那句话:`supersedeOnUserTurn`。
|
|
97
|
+
* - 停止会话(与 `LoopDriver.stopSession` 一起调)、孤儿 run 收尾
|
|
98
|
+
* (`OrphanRunSweeper` 的 `onRunOrphaned: run => ask.cancelPending(run.sessionId)`):
|
|
99
|
+
* `cancelPending`。
|
|
100
|
+
* - 回答接口:`answer`;开始作答(停表):`hold`;列表:`list`。
|
|
101
|
+
*/
|
|
102
|
+
export declare class AskService {
|
|
103
|
+
private readonly deps;
|
|
104
|
+
private readonly store;
|
|
105
|
+
private readonly logger;
|
|
106
|
+
readonly maxWaitSeconds: number;
|
|
107
|
+
private readonly pollIntervalMs;
|
|
108
|
+
constructor(deps: AskServiceDeps);
|
|
109
|
+
/**
|
|
110
|
+
* 这个会话问得了用户吗:根会话、有属主、且对面有人在看。
|
|
111
|
+
*
|
|
112
|
+
* 子 Agent、系统触发的运行这类会话对面没有人,端上桌只会让模型问出一个没人答的
|
|
113
|
+
* 问题,而那一轮会一直等到上限。
|
|
114
|
+
*/
|
|
115
|
+
availableFor(session: SessionRecord): Promise<boolean>;
|
|
116
|
+
/**
|
|
117
|
+
* 工具落问题。**失败以 `{ok:false}` 返回而不抛**——每一条都是要原样说给模型
|
|
118
|
+
* 听、让它改了重来的话,不是故障。
|
|
119
|
+
*/
|
|
120
|
+
ask(input: {
|
|
121
|
+
sessionId: string;
|
|
122
|
+
runId: string;
|
|
123
|
+
toolCallId: string;
|
|
124
|
+
request: AskInput;
|
|
125
|
+
}): Promise<AskOutcome>;
|
|
126
|
+
/**
|
|
127
|
+
* 等到这个问题有了结局,返回那一行。**工具就阻塞在这里。**
|
|
128
|
+
*
|
|
129
|
+
* 每隔 `pollIntervalMs` 看一眼那一行。三件事由等待方自己收:
|
|
130
|
+
* - **到点**:按默认项翻成 expired。没有单独的 sweeper——有人等着的问题由等的人
|
|
131
|
+
* 收;没人等的(等待方死了)不该按默认项继续,该作废,那归孤儿收尾。
|
|
132
|
+
* - **中止**(用户按了停止 / 进程优雅停机):翻成 cancelled 再返回。
|
|
133
|
+
* - **等过了上限**:同上。
|
|
134
|
+
*
|
|
135
|
+
* 每一次「翻」都是带 pending 谓词的原子更新;没抢到就说明别的路径先给了结局,
|
|
136
|
+
* 下一圈读到那一行即返回。行没了(会话被删)返回 null。
|
|
137
|
+
*/
|
|
138
|
+
waitForOutcome(questionId: string, signal: AbortSignal): Promise<SettledQuestion | null>;
|
|
139
|
+
/**
|
|
140
|
+
* 用户点选后提交。**鉴权(这个会话是不是他的)是宿主的事**,在调用之前做。
|
|
141
|
+
*
|
|
142
|
+
* 到点之后、等待方还没来得及收的那一刻提交的回答**照收**:人就在这儿,没有
|
|
143
|
+
* 理由因为晚了一秒把他的选择换成默认项。
|
|
144
|
+
*
|
|
145
|
+
* **等的那一轮已经死了就拒绝**(会话锁没人持有——问题挂着期间,能持有这把锁的
|
|
146
|
+
* 只有提问的那一轮):收下的话界面上是「你已回答」,而什么都不会发生。把问题
|
|
147
|
+
* 作废并如实说,用户说一句「继续」即可。
|
|
148
|
+
*/
|
|
149
|
+
answer(input: {
|
|
150
|
+
sessionId: string;
|
|
151
|
+
questionId: string;
|
|
152
|
+
request: AnswerAgentQuestionRequest;
|
|
153
|
+
}): Promise<AgentQuestion>;
|
|
154
|
+
/**
|
|
155
|
+
* 用户开始作答了(点了任意选项、或在「其他」里打了字):**停表**——摘掉期限,
|
|
156
|
+
* 这个问题改为一直等到他点确定(仍受 `maxWaitSeconds` 约束)。
|
|
157
|
+
*
|
|
158
|
+
* 超时存在的理由是「人不在」。人在的时候让它走完,结局就是用户答到第三题时
|
|
159
|
+
* 默认项抢先生效,而他手上那份答到一半的选择换来一个冲突。
|
|
160
|
+
*
|
|
161
|
+
* 不是一种结局(状态仍是 pending),与到点互斥靠同一个 pending 谓词。幂等:已经
|
|
162
|
+
* 停过表、或已经有了结局,原样返回当前这一行。
|
|
163
|
+
*/
|
|
164
|
+
hold(sessionId: string, questionId: string): Promise<AgentQuestion>;
|
|
165
|
+
/**
|
|
166
|
+
* 用户选了「改为打字回答」、发了一句话:那句话本身就是回答,这个问题记
|
|
167
|
+
* `superseded`。等着它的工具随即返回,内核回到循环顶部探到 inbox 有货、换轮,
|
|
168
|
+
* 那句话在下一轮被领走——模型读到的是「提问 → 用户直接回复了 → 那句话」。
|
|
169
|
+
*
|
|
170
|
+
* **只认界面点名的那一个问题**:没点名的发言是插话,不碰问题(用户发那句话的
|
|
171
|
+
* 时候可能还没见过这个问题),它在 inbox 里排着,等工具返回之后照常处理。
|
|
172
|
+
* **绝不抛**:消息已经进了 inbox,这边记账失败不能让那次发言报错。
|
|
173
|
+
*/
|
|
174
|
+
supersedeOnUserTurn(sessionId: string, questionId: string): Promise<void>;
|
|
175
|
+
/**
|
|
176
|
+
* 这条会话挂着的问题一律作废。两个调用方:用户按了停止(等着它的工具同时会收到
|
|
177
|
+
* 中止信号,两条路抢同一句更新,谁先到都一样);孤儿 run 收尾(等的那一轮已经
|
|
178
|
+
* 死了,问题留着只会让用户对着一个答了也没人接的面板)。**绝不抛**。
|
|
179
|
+
*/
|
|
180
|
+
cancelPending(sessionId: string): Promise<void>;
|
|
181
|
+
/** 这条会话问过的全部问题(按时间正序)。界面按 `toolCallId` 对到工具卡上。 */
|
|
182
|
+
list(sessionId: string): Promise<AgentQuestion[]>;
|
|
183
|
+
/** 本次部署允许的 `timeoutSeconds` 范围。 */
|
|
184
|
+
timeoutBounds(): {
|
|
185
|
+
min: number;
|
|
186
|
+
max: number;
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* 给一个 pending 的问题一个结局——单个问题写结局的唯一入口(`settleQuietly` 是
|
|
190
|
+
* 按会话的批量版)。没抢到返回 null;抢到就广播。
|
|
191
|
+
*/
|
|
192
|
+
private claim;
|
|
193
|
+
private settleQuietly;
|
|
194
|
+
/**
|
|
195
|
+
* 等这个问题的那一轮还活着吗。问题挂着期间,能持有会话锁的只有提问的那一轮
|
|
196
|
+
* (别的 tick 起不来),所以「锁有没有人持有」就是答案。
|
|
197
|
+
*
|
|
198
|
+
* 问不到时**当作还活着**:收下回答的最坏结果是没人接、稍后被孤儿收尾作废;
|
|
199
|
+
* 反过来猜「死了」会把一个正常在等的问题作废掉,那一轮拿到的是「用户取消了」。
|
|
200
|
+
*/
|
|
201
|
+
private waiterAlive;
|
|
202
|
+
/** 行 → 线上形态。`remainingMs` 要存储时钟,只在有限时的 pending 行时才问。 */
|
|
203
|
+
private toWires;
|
|
204
|
+
private publishRows;
|
|
205
|
+
/** 会话级事件:`seq` / `streamId` / `runId` 是占位(见 `publishSessionEvent`)。 */
|
|
206
|
+
private publish;
|
|
207
|
+
}
|
|
208
|
+
/** 行 → 线上形态。`storeNow` 是存储时钟(算 `remainingMs`),不需要时可为 null。 */
|
|
209
|
+
export declare function toQuestionWire(row: QuestionRecord, storeNow: Date | null): AgentQuestion;
|
|
210
|
+
//# sourceMappingURL=ask.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.service.d.ts","sourceRoot":"","sources":["../../src/builtins/ask.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { silentLogger, } from '../ports/logger.js';
|
|
2
|
+
import { QuestionConflictError, } from '../ports/question-store.js';
|
|
3
|
+
import { ASK_TOOL_NAME } from '../tools/builtin-names.js';
|
|
4
|
+
import { defaultAnswers, validateAnswers } from './ask-outcome.js';
|
|
5
|
+
/** `timeoutSeconds` 的缺省允许范围(秒)。宿主经 `AskServiceDeps.timeoutBounds` 换。 */
|
|
6
|
+
export const ASK_TIMEOUT_MIN_DEFAULT = 30;
|
|
7
|
+
export const ASK_TIMEOUT_MAX_DEFAULT = 1800;
|
|
8
|
+
/**
|
|
9
|
+
* 不限时的问题最多等多久(秒)。「一直等」需要一个上限:等待期间那一轮占着会话锁、
|
|
10
|
+
* 占着一个 tick,而进程迟早要重启。到点问题作废(**不是**按默认项继续——不限时的
|
|
11
|
+
* 问题多半根本没有默认项,那正是模型选择不设超时的原因)。
|
|
12
|
+
*/
|
|
13
|
+
export const ASK_MAX_WAIT_SECONDS = 24 * 3600;
|
|
14
|
+
/** 等待期间多久看一眼那一行。回答接口可能落在另一个实例上,所以是查存储而不是进程内通知。 */
|
|
15
|
+
export const ASK_POLL_INTERVAL_MS = 1_000;
|
|
16
|
+
/**
|
|
17
|
+
* 回答接口的失败。三种 `code` 对应 agent-base 的三个错误类,宿主按它映射 HTTP
|
|
18
|
+
* (not_found → 404,not_pending → 409,invalid → 400)。
|
|
19
|
+
*/
|
|
20
|
+
export class AskAnswerError extends Error {
|
|
21
|
+
code;
|
|
22
|
+
status;
|
|
23
|
+
constructor(code, message,
|
|
24
|
+
/** `not_pending` 时那一行此刻的状态(`'unknown'` = 读不到了)。 */
|
|
25
|
+
status) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.code = code;
|
|
28
|
+
this.status = status;
|
|
29
|
+
this.name = 'AskAnswerError';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Agent 停下来问用户。搬自 agent-base `AskUserQuestionService`。
|
|
34
|
+
*
|
|
35
|
+
* ## 同步:工具在这一轮里等用户回答
|
|
36
|
+
*
|
|
37
|
+
* `AskTool` 落一行 pending,然后 `waitForOutcome` 一直等到这一行有了结局,把结局
|
|
38
|
+
* 作为工具的返回值交给模型。这一轮因此**没有结束**:同一个 run、同一条 assistant
|
|
39
|
+
* 消息,模型拿到回答接着干。
|
|
40
|
+
*
|
|
41
|
+
* **选同步不是因为它省事,是因为它不碰「一轮 = 一段完整的活」这条到处被默认的
|
|
42
|
+
* 前提。** agent-base 的第一版是挂起式的(问完本轮就结束、回答经 inbox 唤醒下一轮),
|
|
43
|
+
* 结果一路撞上这条前提的消费方:消息底部的动作栏挂在半句话下面、追问与产出整理在
|
|
44
|
+
* 「活做到一半」时就跑了、模型生成提问那几秒里用户发的插话被下一轮当成了回答。
|
|
45
|
+
* 同步之下这些问题整类不存在:等待期间到达的一切只是在 inbox 里排着。
|
|
46
|
+
*
|
|
47
|
+
* 代价是明确的、且都是**看得见的**失败:
|
|
48
|
+
* - 进程重启会打断正在等的那一轮(同 `Delegate` 同步等待):宿主在孤儿 run 收尾里
|
|
49
|
+
* 调 `cancelPending`,界面显示「已中断」,用户说一句「继续」。
|
|
50
|
+
* - 「一直等」有上限(`maxWaitSeconds`)。
|
|
51
|
+
*
|
|
52
|
+
* ## 结局只有一个持有者
|
|
53
|
+
*
|
|
54
|
+
* 五种结局——用户点选(`answer`)、到点按默认项(等待方自己收)、用户改为打字回答
|
|
55
|
+
* (`supersedeOnUserTurn`)、停止 / 中断(`cancelPending`)、等过了上限——抢的是
|
|
56
|
+
* **同一个**带 pending 谓词的原子更新(`QuestionStore.settle` / `settleSession`)。
|
|
57
|
+
*
|
|
58
|
+
* ## 状态每变一次都经会话流广播
|
|
59
|
+
*
|
|
60
|
+
* `agent-question` 会话级事件,载荷 `{question}`(线上形态)。界面只认这一条通道。
|
|
61
|
+
*
|
|
62
|
+
* ## 宿主要接的线
|
|
63
|
+
*
|
|
64
|
+
* - 每 tick 问 `availableFor`,为假就把 `Ask` 放进 `excludeTools`。
|
|
65
|
+
* - 用户点名回答某个问题时发的那句话:`supersedeOnUserTurn`。
|
|
66
|
+
* - 停止会话(与 `LoopDriver.stopSession` 一起调)、孤儿 run 收尾
|
|
67
|
+
* (`OrphanRunSweeper` 的 `onRunOrphaned: run => ask.cancelPending(run.sessionId)`):
|
|
68
|
+
* `cancelPending`。
|
|
69
|
+
* - 回答接口:`answer`;开始作答(停表):`hold`;列表:`list`。
|
|
70
|
+
*/
|
|
71
|
+
export class AskService {
|
|
72
|
+
deps;
|
|
73
|
+
store;
|
|
74
|
+
logger;
|
|
75
|
+
maxWaitSeconds;
|
|
76
|
+
pollIntervalMs;
|
|
77
|
+
constructor(deps) {
|
|
78
|
+
this.deps = deps;
|
|
79
|
+
this.store = deps.questions;
|
|
80
|
+
this.logger = (deps.logger ?? silentLogger)('AskService');
|
|
81
|
+
this.maxWaitSeconds = deps.maxWaitSeconds ?? ASK_MAX_WAIT_SECONDS;
|
|
82
|
+
this.pollIntervalMs = deps.pollIntervalMs ?? ASK_POLL_INTERVAL_MS;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 这个会话问得了用户吗:根会话、有属主、且对面有人在看。
|
|
86
|
+
*
|
|
87
|
+
* 子 Agent、系统触发的运行这类会话对面没有人,端上桌只会让模型问出一个没人答的
|
|
88
|
+
* 问题,而那一轮会一直等到上限。
|
|
89
|
+
*/
|
|
90
|
+
async availableFor(session) {
|
|
91
|
+
if (session.kind !== 'root' || !session.userId)
|
|
92
|
+
return false;
|
|
93
|
+
return this.deps.hasViewer(session);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 工具落问题。**失败以 `{ok:false}` 返回而不抛**——每一条都是要原样说给模型
|
|
97
|
+
* 听、让它改了重来的话,不是故障。
|
|
98
|
+
*/
|
|
99
|
+
async ask(input) {
|
|
100
|
+
const { request } = input;
|
|
101
|
+
const session = await this.deps.sessions.getSession(input.sessionId);
|
|
102
|
+
if (!session || !session.userId || !(await this.availableFor(session))) {
|
|
103
|
+
return {
|
|
104
|
+
ok: false,
|
|
105
|
+
message: '这个会话没有可以回答问题的用户(子 Agent 或系统触发的运行)。' +
|
|
106
|
+
'自己按最合理的选择继续,并在产出里写明这一项是你定的;' +
|
|
107
|
+
'如果你是子 Agent 且这件事必须由人决定,把问题写进产出交回给调用方。',
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const bounds = this.timeoutBounds();
|
|
111
|
+
if (request.timeoutSeconds !== undefined &&
|
|
112
|
+
(request.timeoutSeconds < bounds.min ||
|
|
113
|
+
request.timeoutSeconds > bounds.max)) {
|
|
114
|
+
// 拒绝而不是钳到范围内:钳了之后模型在正文里说的「5 分钟」就和界面上的
|
|
115
|
+
// 倒计时对不上,而它自己不知道。
|
|
116
|
+
return {
|
|
117
|
+
ok: false,
|
|
118
|
+
message: `timeoutSeconds 必须在 ${bounds.min}–${bounds.max} 秒之间(收到 ${request.timeoutSeconds})。要等更久就不要给 timeoutSeconds,一直等到用户回答。`,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
const { question, swept } = await this.store.open({
|
|
123
|
+
sessionId: input.sessionId,
|
|
124
|
+
userId: session.userId,
|
|
125
|
+
runId: input.runId,
|
|
126
|
+
toolCallId: input.toolCallId,
|
|
127
|
+
questions: request.questions,
|
|
128
|
+
timeoutSeconds: request.timeoutSeconds,
|
|
129
|
+
});
|
|
130
|
+
const wires = await this.toWires([...swept, question]);
|
|
131
|
+
for (const w of wires)
|
|
132
|
+
this.publish(session, w);
|
|
133
|
+
return { ok: true, question: wires[wires.length - 1] };
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
if (err instanceof QuestionConflictError) {
|
|
137
|
+
return {
|
|
138
|
+
ok: false,
|
|
139
|
+
message: `这一轮已经有一个问题在等用户回答。一次只能有一个 ${ASK_TOOL_NAME} ` +
|
|
140
|
+
'在等——把要问的全部放进同一次调用的 questions 里(最多 4 题)。',
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
throw err;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* 等到这个问题有了结局,返回那一行。**工具就阻塞在这里。**
|
|
148
|
+
*
|
|
149
|
+
* 每隔 `pollIntervalMs` 看一眼那一行。三件事由等待方自己收:
|
|
150
|
+
* - **到点**:按默认项翻成 expired。没有单独的 sweeper——有人等着的问题由等的人
|
|
151
|
+
* 收;没人等的(等待方死了)不该按默认项继续,该作废,那归孤儿收尾。
|
|
152
|
+
* - **中止**(用户按了停止 / 进程优雅停机):翻成 cancelled 再返回。
|
|
153
|
+
* - **等过了上限**:同上。
|
|
154
|
+
*
|
|
155
|
+
* 每一次「翻」都是带 pending 谓词的原子更新;没抢到就说明别的路径先给了结局,
|
|
156
|
+
* 下一圈读到那一行即返回。行没了(会话被删)返回 null。
|
|
157
|
+
*/
|
|
158
|
+
async waitForOutcome(questionId, signal) {
|
|
159
|
+
for (;;) {
|
|
160
|
+
const found = await this.store.probe(questionId, this.maxWaitSeconds);
|
|
161
|
+
if (!found)
|
|
162
|
+
return null;
|
|
163
|
+
const { question } = found;
|
|
164
|
+
if (question.status !== 'pending')
|
|
165
|
+
return question;
|
|
166
|
+
if (signal.aborted || found.overdue) {
|
|
167
|
+
await this.claim(questionId, 'cancelled', null);
|
|
168
|
+
}
|
|
169
|
+
else if (found.due) {
|
|
170
|
+
const answers = defaultAnswers(question.questions);
|
|
171
|
+
// 限时却缺默认项——入参校验保证不了的只有坏数据。不替用户编答案:作废。
|
|
172
|
+
await this.claim(questionId, answers ? 'expired' : 'cancelled', answers);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
await sleep(this.pollIntervalMs, signal);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* 用户点选后提交。**鉴权(这个会话是不是他的)是宿主的事**,在调用之前做。
|
|
181
|
+
*
|
|
182
|
+
* 到点之后、等待方还没来得及收的那一刻提交的回答**照收**:人就在这儿,没有
|
|
183
|
+
* 理由因为晚了一秒把他的选择换成默认项。
|
|
184
|
+
*
|
|
185
|
+
* **等的那一轮已经死了就拒绝**(会话锁没人持有——问题挂着期间,能持有这把锁的
|
|
186
|
+
* 只有提问的那一轮):收下的话界面上是「你已回答」,而什么都不会发生。把问题
|
|
187
|
+
* 作废并如实说,用户说一句「继续」即可。
|
|
188
|
+
*/
|
|
189
|
+
async answer(input) {
|
|
190
|
+
const current = await this.store.get(input.questionId, input.sessionId);
|
|
191
|
+
if (!current) {
|
|
192
|
+
throw new AskAnswerError('not_found', `question ${input.questionId} not found`);
|
|
193
|
+
}
|
|
194
|
+
if (current.status !== 'pending') {
|
|
195
|
+
throw notPending(current.id, current.status);
|
|
196
|
+
}
|
|
197
|
+
if (!(await this.waiterAlive(input.sessionId))) {
|
|
198
|
+
await this.cancelPending(input.sessionId);
|
|
199
|
+
throw notPending(current.id, 'cancelled');
|
|
200
|
+
}
|
|
201
|
+
const checked = validateAnswers(current.questions, input.request);
|
|
202
|
+
if (!checked.ok)
|
|
203
|
+
throw new AskAnswerError('invalid', checked.message);
|
|
204
|
+
const row = await this.claim(input.questionId, 'answered', checked.answers);
|
|
205
|
+
if (!row) {
|
|
206
|
+
// 校验与抢占之间被别的路径抢走了——回头读一眼它现在是什么。
|
|
207
|
+
const now = await this.store.get(input.questionId, input.sessionId);
|
|
208
|
+
throw notPending(input.questionId, now?.status ?? 'unknown');
|
|
209
|
+
}
|
|
210
|
+
const [wire] = await this.toWires([row]);
|
|
211
|
+
return wire;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* 用户开始作答了(点了任意选项、或在「其他」里打了字):**停表**——摘掉期限,
|
|
215
|
+
* 这个问题改为一直等到他点确定(仍受 `maxWaitSeconds` 约束)。
|
|
216
|
+
*
|
|
217
|
+
* 超时存在的理由是「人不在」。人在的时候让它走完,结局就是用户答到第三题时
|
|
218
|
+
* 默认项抢先生效,而他手上那份答到一半的选择换来一个冲突。
|
|
219
|
+
*
|
|
220
|
+
* 不是一种结局(状态仍是 pending),与到点互斥靠同一个 pending 谓词。幂等:已经
|
|
221
|
+
* 停过表、或已经有了结局,原样返回当前这一行。
|
|
222
|
+
*/
|
|
223
|
+
async hold(sessionId, questionId) {
|
|
224
|
+
const held = await this.store.hold(questionId, sessionId);
|
|
225
|
+
if (held) {
|
|
226
|
+
const [wire] = await this.toWires([held]);
|
|
227
|
+
await this.publishRows(sessionId, [wire]);
|
|
228
|
+
return wire;
|
|
229
|
+
}
|
|
230
|
+
const current = await this.store.get(questionId, sessionId);
|
|
231
|
+
if (!current) {
|
|
232
|
+
throw new AskAnswerError('not_found', `question ${questionId} not found`);
|
|
233
|
+
}
|
|
234
|
+
const [wire] = await this.toWires([current]);
|
|
235
|
+
return wire;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* 用户选了「改为打字回答」、发了一句话:那句话本身就是回答,这个问题记
|
|
239
|
+
* `superseded`。等着它的工具随即返回,内核回到循环顶部探到 inbox 有货、换轮,
|
|
240
|
+
* 那句话在下一轮被领走——模型读到的是「提问 → 用户直接回复了 → 那句话」。
|
|
241
|
+
*
|
|
242
|
+
* **只认界面点名的那一个问题**:没点名的发言是插话,不碰问题(用户发那句话的
|
|
243
|
+
* 时候可能还没见过这个问题),它在 inbox 里排着,等工具返回之后照常处理。
|
|
244
|
+
* **绝不抛**:消息已经进了 inbox,这边记账失败不能让那次发言报错。
|
|
245
|
+
*/
|
|
246
|
+
async supersedeOnUserTurn(sessionId, questionId) {
|
|
247
|
+
await this.settleQuietly(sessionId, 'superseded', questionId);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* 这条会话挂着的问题一律作废。两个调用方:用户按了停止(等着它的工具同时会收到
|
|
251
|
+
* 中止信号,两条路抢同一句更新,谁先到都一样);孤儿 run 收尾(等的那一轮已经
|
|
252
|
+
* 死了,问题留着只会让用户对着一个答了也没人接的面板)。**绝不抛**。
|
|
253
|
+
*/
|
|
254
|
+
async cancelPending(sessionId) {
|
|
255
|
+
await this.settleQuietly(sessionId, 'cancelled');
|
|
256
|
+
}
|
|
257
|
+
/** 这条会话问过的全部问题(按时间正序)。界面按 `toolCallId` 对到工具卡上。 */
|
|
258
|
+
async list(sessionId) {
|
|
259
|
+
return this.toWires(await this.store.list(sessionId));
|
|
260
|
+
}
|
|
261
|
+
/** 本次部署允许的 `timeoutSeconds` 范围。 */
|
|
262
|
+
timeoutBounds() {
|
|
263
|
+
const { min, max } = this.deps.timeoutBounds?.() ?? {
|
|
264
|
+
min: ASK_TIMEOUT_MIN_DEFAULT,
|
|
265
|
+
max: ASK_TIMEOUT_MAX_DEFAULT,
|
|
266
|
+
};
|
|
267
|
+
// 两个值各自合法、合起来却可能倒挂(运营把下限调过了上限)。那时以上限为准
|
|
268
|
+
// 收成一个点,而不是让每一次带超时的提问都被拒。
|
|
269
|
+
return { min: Math.min(min, max), max };
|
|
270
|
+
}
|
|
271
|
+
// -------------------------------------------------------------------------
|
|
272
|
+
/**
|
|
273
|
+
* 给一个 pending 的问题一个结局——单个问题写结局的唯一入口(`settleQuietly` 是
|
|
274
|
+
* 按会话的批量版)。没抢到返回 null;抢到就广播。
|
|
275
|
+
*/
|
|
276
|
+
async claim(questionId, status, answers) {
|
|
277
|
+
const row = await this.store.settle(questionId, status, answers);
|
|
278
|
+
if (!row)
|
|
279
|
+
return null;
|
|
280
|
+
await this.publishRows(row.sessionId, await this.toWires([row]));
|
|
281
|
+
return row;
|
|
282
|
+
}
|
|
283
|
+
async settleQuietly(sessionId, status, questionId) {
|
|
284
|
+
try {
|
|
285
|
+
const rows = await this.store.settleSession(sessionId, status, questionId);
|
|
286
|
+
await this.publishRows(sessionId, await this.toWires(rows));
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
this.logger.warn(`settling questions of session ${sessionId} as ${status} failed: ${String(err)}`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* 等这个问题的那一轮还活着吗。问题挂着期间,能持有会话锁的只有提问的那一轮
|
|
294
|
+
* (别的 tick 起不来),所以「锁有没有人持有」就是答案。
|
|
295
|
+
*
|
|
296
|
+
* 问不到时**当作还活着**:收下回答的最坏结果是没人接、稍后被孤儿收尾作废;
|
|
297
|
+
* 反过来猜「死了」会把一个正常在等的问题作废掉,那一轮拿到的是「用户取消了」。
|
|
298
|
+
*/
|
|
299
|
+
async waiterAlive(sessionId) {
|
|
300
|
+
try {
|
|
301
|
+
return await this.deps.lock.isHeld(sessionId);
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
this.logger.warn(`lock probe for session ${sessionId} failed, assuming alive: ${String(err)}`);
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/** 行 → 线上形态。`remainingMs` 要存储时钟,只在有限时的 pending 行时才问。 */
|
|
309
|
+
async toWires(rows) {
|
|
310
|
+
const timed = rows.some(r => r.status === 'pending' && r.deadlineAt);
|
|
311
|
+
const storeNow = timed ? await this.store.now() : null;
|
|
312
|
+
return rows.map(row => toQuestionWire(row, storeNow));
|
|
313
|
+
}
|
|
314
|
+
async publishRows(sessionId, wires) {
|
|
315
|
+
if (wires.length === 0)
|
|
316
|
+
return;
|
|
317
|
+
const session = await this.deps.sessions.getSession(sessionId);
|
|
318
|
+
if (!session)
|
|
319
|
+
return;
|
|
320
|
+
for (const w of wires)
|
|
321
|
+
this.publish(session, w);
|
|
322
|
+
}
|
|
323
|
+
/** 会话级事件:`seq` / `streamId` / `runId` 是占位(见 `publishSessionEvent`)。 */
|
|
324
|
+
publish(session, question) {
|
|
325
|
+
this.deps.bus.publishSessionEvent({
|
|
326
|
+
seq: 0,
|
|
327
|
+
streamId: session.id,
|
|
328
|
+
rootSessionId: session.rootSessionId,
|
|
329
|
+
sessionId: session.id,
|
|
330
|
+
runId: session.id,
|
|
331
|
+
parentRunId: null,
|
|
332
|
+
depth: 0,
|
|
333
|
+
ts: Date.now(),
|
|
334
|
+
type: 'agent-question',
|
|
335
|
+
payload: { question },
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/** 行 → 线上形态。`storeNow` 是存储时钟(算 `remainingMs`),不需要时可为 null。 */
|
|
340
|
+
export function toQuestionWire(row, storeNow) {
|
|
341
|
+
const live = row.status === 'pending' && row.deadlineAt !== null;
|
|
342
|
+
return {
|
|
343
|
+
id: row.id,
|
|
344
|
+
sessionId: row.sessionId,
|
|
345
|
+
runId: row.runId,
|
|
346
|
+
toolCallId: row.toolCallId,
|
|
347
|
+
questions: row.questions,
|
|
348
|
+
status: row.status,
|
|
349
|
+
deadlineAt: row.deadlineAt?.toISOString() ?? null,
|
|
350
|
+
remainingMs: live && storeNow && row.deadlineAt
|
|
351
|
+
? Math.max(0, row.deadlineAt.getTime() - storeNow.getTime())
|
|
352
|
+
: null,
|
|
353
|
+
answers: row.answers,
|
|
354
|
+
createdAt: row.createdAt.toISOString(),
|
|
355
|
+
resolvedAt: row.resolvedAt?.toISOString() ?? null,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
function notPending(id, status) {
|
|
359
|
+
return new AskAnswerError('not_pending', `question ${id} is not pending (${status})`, status);
|
|
360
|
+
}
|
|
361
|
+
/** 可中止的 sleep:信号一来立刻醒,不等这一拍走完。 */
|
|
362
|
+
function sleep(ms, signal) {
|
|
363
|
+
return new Promise(resolve => {
|
|
364
|
+
const timer = setTimeout(done, ms);
|
|
365
|
+
signal.addEventListener('abort', done, { once: true });
|
|
366
|
+
function done() {
|
|
367
|
+
clearTimeout(timer);
|
|
368
|
+
signal.removeEventListener('abort', done);
|
|
369
|
+
resolve();
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=ask.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.service.js","sourceRoot":"","sources":["../../src/builtins/ask.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
import { AgentTool } from '../tools/agent-tool.base.js';
|
|
3
|
+
import type { ToolContext } from '../tools/agent-tool.interface.js';
|
|
4
|
+
import type { ToolMeta } from '../tools/tool-meta.js';
|
|
5
|
+
import type { ToolRegistry } from '../tools/tool-registry.js';
|
|
6
|
+
import { type ToolOut } from '../tools/tool-result.js';
|
|
7
|
+
import type { AskService } from './ask.service.js';
|
|
8
|
+
import { type AskInput } from './ask-schema.js';
|
|
9
|
+
interface Out {
|
|
10
|
+
questionId: string;
|
|
11
|
+
/** 给模型看的那段话:问题的结局(用户选了什么 / 超时按默认项 / 改为打字 / 作废)。 */
|
|
12
|
+
text: string;
|
|
13
|
+
}
|
|
14
|
+
/** `Ask` 的登记信息。 */
|
|
15
|
+
export declare const ASK_TOOL_META: ToolMeta;
|
|
16
|
+
/**
|
|
17
|
+
* 向用户提问,**等到有了结局再返回**(原名见 `ASK_FORMER_NAMES`)。
|
|
18
|
+
*
|
|
19
|
+
* 同步工具:这一轮不结束,模型拿到回答接着干。为什么不做成「问完本轮就结束、
|
|
20
|
+
* 回答再唤醒下一轮」,见 `AskService` 的类注释。
|
|
21
|
+
*
|
|
22
|
+
* 等待由服务负责(`waitForOutcome`);`ctx.abortSignal` 是「用户中止 ∪ 本工具超时」
|
|
23
|
+
* 的合成信号,两种情形服务都会把问题作废再返回。
|
|
24
|
+
*/
|
|
25
|
+
export declare class AskTool extends AgentTool<AskInput, Out> {
|
|
26
|
+
private readonly questions;
|
|
27
|
+
readonly inputSchema: z.ZodType<AskInput>;
|
|
28
|
+
/**
|
|
29
|
+
* 比服务里的等待上限多留两分钟:上限到点由服务把问题**作废**并正常返回一句话,
|
|
30
|
+
* 不该让基类的超时抢先把它变成一条「工具执行超时」的错误。
|
|
31
|
+
*/
|
|
32
|
+
protected readonly timeoutMs: number;
|
|
33
|
+
constructor(questions: AskService);
|
|
34
|
+
protected run(raw: AskInput, ctx: ToolContext): Promise<ToolOut<Out>>;
|
|
35
|
+
protected render(out: {
|
|
36
|
+
kind: 'ok';
|
|
37
|
+
} & Out): string;
|
|
38
|
+
/** 界面按它把那一行问题对到这张工具卡上。 */
|
|
39
|
+
protected persistRef(out: ToolOut<Out>): Record<string, unknown> | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* 钉住,不许上下文裁剪换成存根:这是一两句话的**用户决定**,裁掉之后模型无从
|
|
42
|
+
* 重新得知,只会按自己的猜测往下写、或把同一个问题再问一遍。
|
|
43
|
+
*/
|
|
44
|
+
protected persistPinned(out: ToolOut<Out>): boolean;
|
|
45
|
+
}
|
|
46
|
+
/** 登记 `Ask`。 */
|
|
47
|
+
export declare function registerAskTool(tools: ToolRegistry, service: AskService): AskTool;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=ask.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.tool.d.ts","sourceRoot":"","sources":["../../src/builtins/ask.tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,iBAAiB,CAAC;AAEhE,UAAU,GAAG;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,mBAAmB;AACnB,eAAO,MAAM,aAAa,EAAE,QAoB3B,CAAC;AAEF;;;;;;;;GAQG;AACH,qBAAa,OAAQ,SAAQ,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC;IAWvC,OAAO,CAAC,QAAQ,CAAC,SAAS;IARtC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAkB;IAE3D;;;OAGG;IACH,mBAA4B,SAAS,EAAE,MAAM,CAAC;gBAEjB,SAAS,EAAE,UAAU;cAKlC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IA6C3E,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,GAAG,GAAG,GAAG,MAAM;IAInD,0BAA0B;IAC1B,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAI5E;;;OAGG;IACH,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO;CAGpD;AAED,gBAAgB;AAChB,wBAAgB,eAAe,CAC7B,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,UAAU,GAClB,OAAO,CAIT"}
|