@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,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 从一段**未必完整**的 JSON 文本里,线性扫描抽出某个顶层字符串字段的值。
|
|
3
|
+
*
|
|
4
|
+
* 用途:`tool-input-preview.ts` 拿模型正在吐的入参 JSON 原始文本片段
|
|
5
|
+
* (`tool-input-delta` 的累计),实时抽出白名单工具的字段,供对话页的稿栏
|
|
6
|
+
* 边写边显示——`Write` 抽 `path` 与 `content` 两个,`Edit` **只抽 `path`**
|
|
7
|
+
* (它的入参是替换对,没有可预览的正文,见 `TOOL_INPUT_PREVIEW_FIELDS` 里
|
|
8
|
+
* 那条 `text: null`)。AI SDK 的 `parsePartialJson` 是 `Promise`,而 onChunk
|
|
9
|
+
* 是同步回调,所以这里手写一个零依赖的同步版本。
|
|
10
|
+
*
|
|
11
|
+
* **两条判据,撑起「不必真解析 JSON」这条捷径**:
|
|
12
|
+
* 1. 合法 JSON 字符串值内部的裸 `"` 一定被转义成 `\"`——从头扫到的第一个
|
|
13
|
+
* **裸** `"key"` 只可能是键本身,不会命中某个值里恰好等长的同名文本
|
|
14
|
+
* (值里那份必然是 `\"key\"`,多两个反斜杠,字面不相等)。
|
|
15
|
+
* 2. 只服务白名单工具的**扁平**入参对象——要抽的字段都是顶层字符串字段
|
|
16
|
+
* (`Write.path`/`Write.content`/`Edit.path`),不存在嵌套对象/数组里
|
|
17
|
+
* 同名键的歧义。`Edit` 另外那两个顶层字段(`old_string`/`new_string`)
|
|
18
|
+
* 这里根本不去抽,但它们同样是顶层字符串,不破坏这条前提。
|
|
19
|
+
*
|
|
20
|
+
* **加新白名单工具前,先核对它的入参 schema 仍满足这两条**:字段是顶层、
|
|
21
|
+
* 值是字符串、没有嵌套结构会带出同名键。不满足就不能简单套用这份线性扫描。
|
|
22
|
+
*/
|
|
23
|
+
export interface JsonStringFieldResult {
|
|
24
|
+
/** 已解析出的值(可能是尚未闭合的前缀)。 */
|
|
25
|
+
value: string;
|
|
26
|
+
/** 值的闭合引号是否已经到达——`false` 时 `value` 只是当前累计的前缀。 */
|
|
27
|
+
complete: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare function extractJsonStringField(raw: string, key: string): JsonStringFieldResult | null;
|
|
30
|
+
//# sourceMappingURL=json-string-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-string-field.d.ts","sourceRoot":"","sources":["../../src/turn/json-string-field.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,qBAAqB;IACpC,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAWD,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,qBAAqB,GAAG,IAAI,CA2F9B"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 从一段**未必完整**的 JSON 文本里,线性扫描抽出某个顶层字符串字段的值。
|
|
3
|
+
*
|
|
4
|
+
* 用途:`tool-input-preview.ts` 拿模型正在吐的入参 JSON 原始文本片段
|
|
5
|
+
* (`tool-input-delta` 的累计),实时抽出白名单工具的字段,供对话页的稿栏
|
|
6
|
+
* 边写边显示——`Write` 抽 `path` 与 `content` 两个,`Edit` **只抽 `path`**
|
|
7
|
+
* (它的入参是替换对,没有可预览的正文,见 `TOOL_INPUT_PREVIEW_FIELDS` 里
|
|
8
|
+
* 那条 `text: null`)。AI SDK 的 `parsePartialJson` 是 `Promise`,而 onChunk
|
|
9
|
+
* 是同步回调,所以这里手写一个零依赖的同步版本。
|
|
10
|
+
*
|
|
11
|
+
* **两条判据,撑起「不必真解析 JSON」这条捷径**:
|
|
12
|
+
* 1. 合法 JSON 字符串值内部的裸 `"` 一定被转义成 `\"`——从头扫到的第一个
|
|
13
|
+
* **裸** `"key"` 只可能是键本身,不会命中某个值里恰好等长的同名文本
|
|
14
|
+
* (值里那份必然是 `\"key\"`,多两个反斜杠,字面不相等)。
|
|
15
|
+
* 2. 只服务白名单工具的**扁平**入参对象——要抽的字段都是顶层字符串字段
|
|
16
|
+
* (`Write.path`/`Write.content`/`Edit.path`),不存在嵌套对象/数组里
|
|
17
|
+
* 同名键的歧义。`Edit` 另外那两个顶层字段(`old_string`/`new_string`)
|
|
18
|
+
* 这里根本不去抽,但它们同样是顶层字符串,不破坏这条前提。
|
|
19
|
+
*
|
|
20
|
+
* **加新白名单工具前,先核对它的入参 schema 仍满足这两条**:字段是顶层、
|
|
21
|
+
* 值是字符串、没有嵌套结构会带出同名键。不满足就不能简单套用这份线性扫描。
|
|
22
|
+
*/
|
|
23
|
+
function isWhitespace(ch) {
|
|
24
|
+
return ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r';
|
|
25
|
+
}
|
|
26
|
+
/** 0xD800–0xDBFF:UTF-16 高代理,落单时是解码半个 emoji 留下的残片。 */
|
|
27
|
+
function isHighSurrogate(code) {
|
|
28
|
+
return code >= 0xd800 && code <= 0xdbff;
|
|
29
|
+
}
|
|
30
|
+
export function extractJsonStringField(raw, key) {
|
|
31
|
+
const keyPattern = `"${key}"`;
|
|
32
|
+
const keyIdx = raw.indexOf(keyPattern);
|
|
33
|
+
if (keyIdx === -1)
|
|
34
|
+
return null;
|
|
35
|
+
let i = keyIdx + keyPattern.length;
|
|
36
|
+
while (i < raw.length && isWhitespace(raw[i]))
|
|
37
|
+
i++;
|
|
38
|
+
// 冒号还没到——「还没到」不是空串,是 null(调用方靠这个区分「值不存在」
|
|
39
|
+
// 与「值是空串」)。
|
|
40
|
+
if (i >= raw.length || raw[i] !== ':')
|
|
41
|
+
return null;
|
|
42
|
+
i++;
|
|
43
|
+
while (i < raw.length && isWhitespace(raw[i]))
|
|
44
|
+
i++;
|
|
45
|
+
// 值的开引号还没到(要么流还没吐到这,要么这个字段的值压根不是字符串,
|
|
46
|
+
// 比如数字/布尔/null)。两种情况调用方都只关心「拿不到」,统一 null。
|
|
47
|
+
if (i >= raw.length || raw[i] !== '"')
|
|
48
|
+
return null;
|
|
49
|
+
i++;
|
|
50
|
+
let value = '';
|
|
51
|
+
let complete = false;
|
|
52
|
+
scan: while (i < raw.length) {
|
|
53
|
+
const ch = raw[i];
|
|
54
|
+
if (ch === '"') {
|
|
55
|
+
complete = true;
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
if (ch === '\\') {
|
|
59
|
+
const esc = raw[i + 1];
|
|
60
|
+
// 反斜杠是这一块的最后一个字符——转义序列还没收全,丢掉它等下一块,
|
|
61
|
+
// 不能当普通字符收进 value(那样会把半个转义原样吐给界面)。
|
|
62
|
+
if (esc === undefined)
|
|
63
|
+
break scan;
|
|
64
|
+
switch (esc) {
|
|
65
|
+
case '"':
|
|
66
|
+
value += '"';
|
|
67
|
+
i += 2;
|
|
68
|
+
continue;
|
|
69
|
+
case '\\':
|
|
70
|
+
value += '\\';
|
|
71
|
+
i += 2;
|
|
72
|
+
continue;
|
|
73
|
+
case '/':
|
|
74
|
+
value += '/';
|
|
75
|
+
i += 2;
|
|
76
|
+
continue;
|
|
77
|
+
case 'b':
|
|
78
|
+
value += '\b';
|
|
79
|
+
i += 2;
|
|
80
|
+
continue;
|
|
81
|
+
case 'f':
|
|
82
|
+
value += '\f';
|
|
83
|
+
i += 2;
|
|
84
|
+
continue;
|
|
85
|
+
case 'n':
|
|
86
|
+
value += '\n';
|
|
87
|
+
i += 2;
|
|
88
|
+
continue;
|
|
89
|
+
case 'r':
|
|
90
|
+
value += '\r';
|
|
91
|
+
i += 2;
|
|
92
|
+
continue;
|
|
93
|
+
case 't':
|
|
94
|
+
value += '\t';
|
|
95
|
+
i += 2;
|
|
96
|
+
continue;
|
|
97
|
+
case 'u': {
|
|
98
|
+
const hex = raw.slice(i + 2, i + 6);
|
|
99
|
+
// 4 位十六进制还没收全——同上,丢掉整个未完的 \u 序列。
|
|
100
|
+
if (hex.length < 4)
|
|
101
|
+
break scan;
|
|
102
|
+
value += String.fromCharCode(parseInt(hex, 16));
|
|
103
|
+
i += 6;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
default:
|
|
107
|
+
// 非法转义:正常情况下不会出现(AI SDK 只吐合法 JSON 片段的前缀),
|
|
108
|
+
// 稳妥起见按「未完成」处理,不猜测。
|
|
109
|
+
break scan;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
value += ch;
|
|
113
|
+
i++;
|
|
114
|
+
}
|
|
115
|
+
// 值还没闭合时,末尾可能停在一对 UTF-16 代理对中间(高代理已到、低代理
|
|
116
|
+
// 没到)——那半个字符单独渲染出来是一个替换符,等下一块到了又变回正常
|
|
117
|
+
// 字符,界面上会抖一下。裁掉它,等凑齐了再一起吐。
|
|
118
|
+
if (!complete && value.length > 0) {
|
|
119
|
+
const lastCode = value.charCodeAt(value.length - 1);
|
|
120
|
+
if (isHighSurrogate(lastCode))
|
|
121
|
+
value = value.slice(0, -1);
|
|
122
|
+
}
|
|
123
|
+
return { value, complete };
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=json-string-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-string-field.js","sourceRoot":"","sources":["../../src/turn/json-string-field.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 重复工具调用提醒的纯文本层:链怎么记、什么时候出声、说什么、以及注入模型时的
|
|
3
|
+
* 围栏。**不碰库、不调模型**——接线在 `agent-runtime.service.ts` 的自驱循环里,
|
|
4
|
+
* 落库在 `chat-turn.service.ts` 的宿主实现里。
|
|
5
|
+
*
|
|
6
|
+
* 盯的是**模型行为**:同一个 tick 内跨 step 反复拿一模一样的参数调同一个工具
|
|
7
|
+
* (Grep 同一个词三次、每次拿到同样的结果却没据此改变做法)。跟用户重复发消息
|
|
8
|
+
* 无关。
|
|
9
|
+
*
|
|
10
|
+
* **只提醒,不阻止。** 模型有时重复调用是对的(轮询一个还没就绪的东西),拦错了
|
|
11
|
+
* 它没有申辩余地;提醒错了它可以无视。这也是 `agent.maxSteps` 的柔性版本——现在
|
|
12
|
+
* 超过上限是直接 `break`,模型既不知道自己被截断了,也没得到任何改弦更张的提示。
|
|
13
|
+
* 真要加阻止是另一个机制(走工具层的拒绝、理由随 `role=tool` 的错误结果回去),
|
|
14
|
+
* 不在这里。
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* 第几次连续重复才出声,以及出声的**递进**层级。
|
|
18
|
+
*
|
|
19
|
+
* 不是每次都喊:连着两次相同调用太常见(重试一个刚失败的写、等一个异步结果),
|
|
20
|
+
* 第三次才开始像是没在推进。此后间隔拉开,让模型有机会自己走出来——每一步都塞
|
|
21
|
+
* 一段劝告只会稀释它,还挤占上下文。
|
|
22
|
+
*/
|
|
23
|
+
export declare const LOOP_REMINDER_THRESHOLDS: readonly [3, 5, 8];
|
|
24
|
+
/**
|
|
25
|
+
* 深度键排序后的入参串——**链的比较用它,完整不截断**。
|
|
26
|
+
*
|
|
27
|
+
* 键序不该影响判定:模型两次吐 `{"path":"a","limit":2}` 与
|
|
28
|
+
* `{"limit":2,"path":"a"}` 是同一次调用,按原始字节比会把一个死循环判成「换了
|
|
29
|
+
* 参数」。截断则是另一件事,只用于提醒**文案**里的预览(见 `previewJson`)——拿
|
|
30
|
+
* 截断串当链的键,两次只在第 200 个字符处不同的大 payload 会被判成同一次调用。
|
|
31
|
+
*/
|
|
32
|
+
export declare function stableToolInputKey(input: unknown): string;
|
|
33
|
+
export interface RepeatCallChain {
|
|
34
|
+
/**
|
|
35
|
+
* 记一次工具调用,命中阈值时返回该说的那句话,否则 `null`。
|
|
36
|
+
*
|
|
37
|
+
* **在调用发起时记,与结果无关**:被拒绝的、报错的调用一样计数——模型反复撞
|
|
38
|
+
* 一个必失败的调用,正是最该提醒的循环。
|
|
39
|
+
*/
|
|
40
|
+
note(toolName: string, input: unknown): string | null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 建一条链。**一个 tick 一条**,就是 `turn-run.ts` 里 `TurnRun` 的一个字段
|
|
44
|
+
* ——那个对象一轮一个,链的生命周期因此跟着它走,不需要谁记得回收。
|
|
45
|
+
*
|
|
46
|
+
* 收窄到 tick 内的理由:那才是模型能连续犯错而没人打断的窗口。跨 tick 之间必然
|
|
47
|
+
* 夹着一条新消息(用户的,或子 Agent 回执),那本身就是链该重置的信号。收窄之后
|
|
48
|
+
* 也没有任何跨会话状态,不存在串味的可能。
|
|
49
|
+
*/
|
|
50
|
+
export declare function createRepeatCallChain(opts?: {
|
|
51
|
+
untracked?: ReadonlySet<string>;
|
|
52
|
+
}): RepeatCallChain;
|
|
53
|
+
/**
|
|
54
|
+
* 劝告文案。**说清三件事**:重复了几次、是哪次调用(工具名 + 参数预览,否则模型
|
|
55
|
+
* 在一步里调了好几个工具时根本对不上是哪个)、以及具体该怎么办。
|
|
56
|
+
*
|
|
57
|
+
* 措辞随次数**递进**,最后一档明确给出「停下来告诉用户」这条出路——一个已经绕了
|
|
58
|
+
* 八次的模型多半是缺一个体面的退出方式,而不是缺一次更严厉的批评。
|
|
59
|
+
*/
|
|
60
|
+
export declare function renderLoopAdvice(count: number, toolName: string, input: unknown): string;
|
|
61
|
+
/**
|
|
62
|
+
* 落库的纯正文 → 注入模型的那份。**平台插进会话的 user 行共用这一副围栏**:
|
|
63
|
+
* 重复调用提醒的存量行(`LOOP_REMINDER_KIND`)与待办结账提醒
|
|
64
|
+
* (`TODO_REMINDER_KIND`,见 `extensions/todo-settle.hook.ts`)。
|
|
65
|
+
*
|
|
66
|
+
* 加围栏的理由与另外两处不完全相同:这段文字是**平台生成**的,不是不可信外部
|
|
67
|
+
* 输入。它要解决的是另一件事——这条行以 `role='user'` 进上下文(协议里没有别的
|
|
68
|
+
* 位置放得下它),不标注的话模型很可能把它当成用户在说话,转而向用户道歉、解释,
|
|
69
|
+
* 而不是改变自己的做法。围栏里来自模型的片段(参数预览、待办正文)照旧转义。
|
|
70
|
+
*/
|
|
71
|
+
export declare function wrapSystemReminder(text: string): string;
|
|
72
|
+
/**
|
|
73
|
+
* 转义正文里的围栏标记,照 `escapeSubagentFence` 的既有做法在 `<` 后插反斜杠。
|
|
74
|
+
*
|
|
75
|
+
* 开闭标签**都要转**,且**替换串里绝不能再出现完整的标记**(`escapeFence` 第一版
|
|
76
|
+
* 写成「[已转义的 `</x>` 标记]」,等于把要防的东西原样放回去)。
|
|
77
|
+
*/
|
|
78
|
+
export declare function escapeLoopReminderFence(text: string): string;
|
|
79
|
+
//# sourceMappingURL=loop-reminder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-reminder.d.ts","sourceRoot":"","sources":["../../src/turn/loop-reminder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAWH;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,oBAAqB,CAAC;AAE3D;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASzD;AAYD,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;CACvD;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAO,GAC7C,eAAe,CA6BjB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,GACb,MAAM,CAqBR;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5D"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-reminder.js","sourceRoot":"","sources":["../../src/turn/loop-reminder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 把文本里的 NUL(U+0000)换成 U+FFFD。
|
|
3
|
+
*
|
|
4
|
+
* **为什么要有它**:Postgres 的 jsonb 不收 `\u0000`(「\u0000 cannot be
|
|
5
|
+
* converted to text」),而 `chat_message.parts` 是 jsonb——一段带 NUL 的工具
|
|
6
|
+
* 输出(`Bash` 里 `cat` 一个二进制文件、沙箱按 UTF-8 解码的 stdout 原样带着
|
|
7
|
+
* NUL)会让这一轮的落库失败,`agent_run` 也跟着收不了尾,最后被孤儿清扫标成
|
|
8
|
+
* 「服务中断(进程重启)」——一个与真实原因毫不相干、会把排查带偏的结论。
|
|
9
|
+
*
|
|
10
|
+
* **换在哪里是这条的全部要点**:必须在「喂给模型」与「进事件账本(→ 落库、
|
|
11
|
+
* SSE)」分叉**之前**(`TurnRun.recordToolResult`)。在 `MessageHub` 落库前换
|
|
12
|
+
* 就晚了:本轮模型看到的是带 NUL 的原文,库里存的却是替换过的,下一轮重放
|
|
13
|
+
* 与本轮逐字不同——违反「模型看得见的一切都必须能从库里重建」,而且前缀缓存
|
|
14
|
+
* 从这一条起整段 miss。
|
|
15
|
+
*
|
|
16
|
+
* 换成 U+FFFD 而不是删掉:模型能看出「这里原本有东西、不是文本」,与 UTF-8
|
|
17
|
+
* 解码非法字节时的做法一致;删掉会把 `a\0b` 拼成 `ab`,造出一段文件里并不
|
|
18
|
+
* 存在的文本。
|
|
19
|
+
*/
|
|
20
|
+
export declare function replaceNul(text: string): string;
|
|
21
|
+
//# sourceMappingURL=nul-safe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nul-safe.d.ts","sourceRoot":"","sources":["../../src/turn/nul-safe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 把文本里的 NUL(U+0000)换成 U+FFFD。
|
|
3
|
+
*
|
|
4
|
+
* **为什么要有它**:Postgres 的 jsonb 不收 `\u0000`(「\u0000 cannot be
|
|
5
|
+
* converted to text」),而 `chat_message.parts` 是 jsonb——一段带 NUL 的工具
|
|
6
|
+
* 输出(`Bash` 里 `cat` 一个二进制文件、沙箱按 UTF-8 解码的 stdout 原样带着
|
|
7
|
+
* NUL)会让这一轮的落库失败,`agent_run` 也跟着收不了尾,最后被孤儿清扫标成
|
|
8
|
+
* 「服务中断(进程重启)」——一个与真实原因毫不相干、会把排查带偏的结论。
|
|
9
|
+
*
|
|
10
|
+
* **换在哪里是这条的全部要点**:必须在「喂给模型」与「进事件账本(→ 落库、
|
|
11
|
+
* SSE)」分叉**之前**(`TurnRun.recordToolResult`)。在 `MessageHub` 落库前换
|
|
12
|
+
* 就晚了:本轮模型看到的是带 NUL 的原文,库里存的却是替换过的,下一轮重放
|
|
13
|
+
* 与本轮逐字不同——违反「模型看得见的一切都必须能从库里重建」,而且前缀缓存
|
|
14
|
+
* 从这一条起整段 miss。
|
|
15
|
+
*
|
|
16
|
+
* 换成 U+FFFD 而不是删掉:模型能看出「这里原本有东西、不是文本」,与 UTF-8
|
|
17
|
+
* 解码非法字节时的做法一致;删掉会把 `a\0b` 拼成 `ab`,造出一段文件里并不
|
|
18
|
+
* 存在的文本。
|
|
19
|
+
*/
|
|
20
|
+
export function replaceNul(text) {
|
|
21
|
+
return text.includes('\0') ? text.replaceAll('\0', '\uFFFD') : text;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=nul-safe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nul-safe.js","sourceRoot":"","sources":["../../src/turn/nul-safe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { AgentEvent } from '../schema/agent-event.js';
|
|
2
|
+
import { type MessagePart } from '../schema/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* 这次重建是不是这一轮的**最后一次**。
|
|
5
|
+
*
|
|
6
|
+
* - `'rescue'`(默认,兜底路径):这一轮已经结束,buffer 里剩下的半截东西
|
|
7
|
+
* (没等到 `text-end` 的文本、没等到 `tool-call` 的半截入参)再没有机会被
|
|
8
|
+
* 封口了,一并抢救出来——中断那一刻已经打出来的字不能丢。
|
|
9
|
+
* - `'hold'`(增量落库):轮子还在跑,只交出**已被终止符封口**的 part,半截的
|
|
10
|
+
* 留在 buffer 里等下一次。这不是洁癖:一个 step 里模型可以并行发起多次调用,
|
|
11
|
+
* 而落库发生在**逐个**工具执行的间隙——第一次 flush 时第二个调用的入参才流到
|
|
12
|
+
* 一半,按 `'rescue'` 重建就会凭空落一条「模型从没发出过、参数还是半截 JSON」
|
|
13
|
+
* 的 tool-call part,等真正的 `tool-call` 事件到了再落一条真的,库里于是两条。
|
|
14
|
+
*/
|
|
15
|
+
export type PartsTail = 'rescue' | 'hold';
|
|
16
|
+
/**
|
|
17
|
+
* 从事件账本重建 parts。**这是落库 parts 的唯一来源**:轮内由
|
|
18
|
+
* `turn-run.ts#flushStep` 带游标增量取(`tail: 'hold'`),**每一条终态路径**
|
|
19
|
+
* (正常收尾 / 中断 / 失败 / 门禁拒绝)在 `finish()` 里再取最后一次,那次用
|
|
20
|
+
* `tail: 'rescue'`。半截 tool call 也抢救出来 —— 先试 JSON.parse,失败就把
|
|
21
|
+
* 不完整的 JSON 字符串原样存下,便于排查。
|
|
22
|
+
*
|
|
23
|
+
* 曾经它只是兜底:主路径另有一套手工累积的 `acc.parts`,两者的等价性靠一句
|
|
24
|
+
* 注释担保(agent-x 的对应实现漏过 toolName,本仓漏过
|
|
25
|
+
* `isError`/`ref`/`systemNote`——事件 payload 里一直都有,是这里没读,而两边
|
|
26
|
+
* 都没有任何测试会红)。现在只剩这一条路,那族判据随之消失。
|
|
27
|
+
*
|
|
28
|
+
* **因此本函数的产出必须是「只增不改」的**:已经交出去的 part 不会因为后面又
|
|
29
|
+
* 来了事件而变形或改变位置——增量落库的游标正是建立在这条性质上(jsonb 追加
|
|
30
|
+
* 不幂等,落错了改不回来)。今天它成立是因为每种 part 都由一个明确的终止符
|
|
31
|
+
* 封口:文本靠 `text-end`、reasoning 靠「下一个非 reasoning-delta 事件」、
|
|
32
|
+
* 工具靠 `tool-call`/`tool-result` 事件本身。
|
|
33
|
+
*
|
|
34
|
+
* `reasoning-delta` 单独累积进 reasoningBuf(不与 textBuf 混)——deepseek 的
|
|
35
|
+
* reasoning 段可以很长,取消极易恰好落在纯 reasoning 阶段、后面再没有任何
|
|
36
|
+
* text-delta/tool-call 事件;若不认这个事件类型,这类中断会重建出**空** parts
|
|
37
|
+
* 数组(用户看到一条空白气泡)。`AGENT_EVENT_TYPES` 里没有 `reasoning-end`,
|
|
38
|
+
* 故 flush 时机改用"下一个非 reasoning-delta 事件到来即先 flush"这条通用规则
|
|
39
|
+
* (在 switch 之前统一处理),外加循环结束时的收尾 flush——这样即便流从头到
|
|
40
|
+
* 尾只有 reasoning-delta,也能落出一个 `{type:'reasoning'}` part。这不违反
|
|
41
|
+
* "reasoning 是回放给模型时唯一允许的有损项":那条约束在 partsToModelMessages
|
|
42
|
+
* 里生效,落库层面留着 reasoning 是为了让用户看到取消前发生了什么。
|
|
43
|
+
*
|
|
44
|
+
* flushText() 的调用时机:`text-end` 与 `tool-call` 分支都会 flush,
|
|
45
|
+
* `tool-result` 分支不需要 ——一个 step 内 tool-result 前面必然已经有过
|
|
46
|
+
* 对应的 tool-call(tool-call 分支已经 flush 过一次),tool-result 本身
|
|
47
|
+
* 不携带新文本、也不会让 textBuf 重新累积。真正会在 tool-result 之后
|
|
48
|
+
* 又产生文本的情况,是模型在拿到结果后继续输出("工具→结果→又有文本"),
|
|
49
|
+
* 这段新文本会走新的 text-delta 追加进 textBuf,直到下一次 text-end 或
|
|
50
|
+
* 循环结束时的收尾 flushText() 才落 part —— 顺序仍是
|
|
51
|
+
* text → tool-call → tool-result → text,与事件的时间顺序一致,未丢失。
|
|
52
|
+
*/
|
|
53
|
+
export declare function partsFromEventBuffer(events: readonly AgentEvent[], tail?: PartsTail): MessagePart[];
|
|
54
|
+
/**
|
|
55
|
+
* 重建结果 + **退役边界**。
|
|
56
|
+
*
|
|
57
|
+
* `uptoSeq` = 被消费进已交出 part 的**最后一个事件**的 seq(没有交出任何 part
|
|
58
|
+
* 时为 null):reasoning 段是它最后一条 `reasoning-delta`(封口它的那个事件
|
|
59
|
+
* 属于**下一段**,不算)、text 段是 `text-end`、工具是 `tool-call`/`tool-result`
|
|
60
|
+
* 事件本身。语义是「seq ≤ 它的事件,内容已经全部体现在这些 part 里」——落库成功
|
|
61
|
+
* 后会话流据此把这些事件退役(`StreamBus.retireUpTo`),刷新重建时它们由 DB 行
|
|
62
|
+
* 顶替、前端按 `metadata.flushedSeq` 把宽限期内重放的同一批事件丢掉。
|
|
63
|
+
*
|
|
64
|
+
* `'hold'` 模式下未封口的尾巴既不进 parts 也不推进边界——那正是「流里只剩未
|
|
65
|
+
* 落库的尾巴」这条不变量的另一半。
|
|
66
|
+
*/
|
|
67
|
+
export declare function partsFromEventBufferWithBoundary(events: readonly AgentEvent[], tail?: PartsTail): {
|
|
68
|
+
parts: MessagePart[];
|
|
69
|
+
uptoSeq: number | null;
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=parts-from-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parts-from-events.d.ts","sourceRoot":"","sources":["../../src/turn/parts-from-events.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,oBAAoB,CAAC;AA6B5B;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,IAAI,GAAE,SAAoB,GACzB,WAAW,EAAE,CAEf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,IAAI,GAAE,SAAoB,GACzB;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAyIlD"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { PartProviderMetadataSchema, ToolResultImageSchema, } from '../schema/index.js';
|
|
3
|
+
/** `ref` 只接受对象形态(`MessagePart.ref` 是 `Record<string, unknown>`)。 */
|
|
4
|
+
function isPlainRecord(v) {
|
|
5
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
6
|
+
}
|
|
7
|
+
const ImagesSchema = z.array(ToolResultImageSchema).min(1);
|
|
8
|
+
/**
|
|
9
|
+
* 工具调用上要回放的厂商 metadata(思考签名)。形状不对就不落——同 `images`:
|
|
10
|
+
* 进了库就是之后每一轮都发出去的东西。
|
|
11
|
+
*/
|
|
12
|
+
function providerMetadataFromPayload(v) {
|
|
13
|
+
if (v === undefined)
|
|
14
|
+
return {};
|
|
15
|
+
const parsed = PartProviderMetadataSchema.safeParse(v);
|
|
16
|
+
return parsed.success ? { providerMetadata: parsed.data } : {};
|
|
17
|
+
}
|
|
18
|
+
function imagesFromPayload(v) {
|
|
19
|
+
if (v === undefined)
|
|
20
|
+
return {};
|
|
21
|
+
const parsed = ImagesSchema.safeParse(v);
|
|
22
|
+
return parsed.success ? { images: parsed.data } : {};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 从事件账本重建 parts。**这是落库 parts 的唯一来源**:轮内由
|
|
26
|
+
* `turn-run.ts#flushStep` 带游标增量取(`tail: 'hold'`),**每一条终态路径**
|
|
27
|
+
* (正常收尾 / 中断 / 失败 / 门禁拒绝)在 `finish()` 里再取最后一次,那次用
|
|
28
|
+
* `tail: 'rescue'`。半截 tool call 也抢救出来 —— 先试 JSON.parse,失败就把
|
|
29
|
+
* 不完整的 JSON 字符串原样存下,便于排查。
|
|
30
|
+
*
|
|
31
|
+
* 曾经它只是兜底:主路径另有一套手工累积的 `acc.parts`,两者的等价性靠一句
|
|
32
|
+
* 注释担保(agent-x 的对应实现漏过 toolName,本仓漏过
|
|
33
|
+
* `isError`/`ref`/`systemNote`——事件 payload 里一直都有,是这里没读,而两边
|
|
34
|
+
* 都没有任何测试会红)。现在只剩这一条路,那族判据随之消失。
|
|
35
|
+
*
|
|
36
|
+
* **因此本函数的产出必须是「只增不改」的**:已经交出去的 part 不会因为后面又
|
|
37
|
+
* 来了事件而变形或改变位置——增量落库的游标正是建立在这条性质上(jsonb 追加
|
|
38
|
+
* 不幂等,落错了改不回来)。今天它成立是因为每种 part 都由一个明确的终止符
|
|
39
|
+
* 封口:文本靠 `text-end`、reasoning 靠「下一个非 reasoning-delta 事件」、
|
|
40
|
+
* 工具靠 `tool-call`/`tool-result` 事件本身。
|
|
41
|
+
*
|
|
42
|
+
* `reasoning-delta` 单独累积进 reasoningBuf(不与 textBuf 混)——deepseek 的
|
|
43
|
+
* reasoning 段可以很长,取消极易恰好落在纯 reasoning 阶段、后面再没有任何
|
|
44
|
+
* text-delta/tool-call 事件;若不认这个事件类型,这类中断会重建出**空** parts
|
|
45
|
+
* 数组(用户看到一条空白气泡)。`AGENT_EVENT_TYPES` 里没有 `reasoning-end`,
|
|
46
|
+
* 故 flush 时机改用"下一个非 reasoning-delta 事件到来即先 flush"这条通用规则
|
|
47
|
+
* (在 switch 之前统一处理),外加循环结束时的收尾 flush——这样即便流从头到
|
|
48
|
+
* 尾只有 reasoning-delta,也能落出一个 `{type:'reasoning'}` part。这不违反
|
|
49
|
+
* "reasoning 是回放给模型时唯一允许的有损项":那条约束在 partsToModelMessages
|
|
50
|
+
* 里生效,落库层面留着 reasoning 是为了让用户看到取消前发生了什么。
|
|
51
|
+
*
|
|
52
|
+
* flushText() 的调用时机:`text-end` 与 `tool-call` 分支都会 flush,
|
|
53
|
+
* `tool-result` 分支不需要 ——一个 step 内 tool-result 前面必然已经有过
|
|
54
|
+
* 对应的 tool-call(tool-call 分支已经 flush 过一次),tool-result 本身
|
|
55
|
+
* 不携带新文本、也不会让 textBuf 重新累积。真正会在 tool-result 之后
|
|
56
|
+
* 又产生文本的情况,是模型在拿到结果后继续输出("工具→结果→又有文本"),
|
|
57
|
+
* 这段新文本会走新的 text-delta 追加进 textBuf,直到下一次 text-end 或
|
|
58
|
+
* 循环结束时的收尾 flushText() 才落 part —— 顺序仍是
|
|
59
|
+
* text → tool-call → tool-result → text,与事件的时间顺序一致,未丢失。
|
|
60
|
+
*/
|
|
61
|
+
export function partsFromEventBuffer(events, tail = 'rescue') {
|
|
62
|
+
return partsFromEventBufferWithBoundary(events, tail).parts;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 重建结果 + **退役边界**。
|
|
66
|
+
*
|
|
67
|
+
* `uptoSeq` = 被消费进已交出 part 的**最后一个事件**的 seq(没有交出任何 part
|
|
68
|
+
* 时为 null):reasoning 段是它最后一条 `reasoning-delta`(封口它的那个事件
|
|
69
|
+
* 属于**下一段**,不算)、text 段是 `text-end`、工具是 `tool-call`/`tool-result`
|
|
70
|
+
* 事件本身。语义是「seq ≤ 它的事件,内容已经全部体现在这些 part 里」——落库成功
|
|
71
|
+
* 后会话流据此把这些事件退役(`StreamBus.retireUpTo`),刷新重建时它们由 DB 行
|
|
72
|
+
* 顶替、前端按 `metadata.flushedSeq` 把宽限期内重放的同一批事件丢掉。
|
|
73
|
+
*
|
|
74
|
+
* `'hold'` 模式下未封口的尾巴既不进 parts 也不推进边界——那正是「流里只剩未
|
|
75
|
+
* 落库的尾巴」这条不变量的另一半。
|
|
76
|
+
*/
|
|
77
|
+
export function partsFromEventBufferWithBoundary(events, tail = 'rescue') {
|
|
78
|
+
const out = [];
|
|
79
|
+
let uptoSeq = null;
|
|
80
|
+
let textBuf = '';
|
|
81
|
+
let reasoningBuf = '';
|
|
82
|
+
// 这一段思考的时间窗,取自事件自带的 `ts`(主路径在 runtime 里现测,见
|
|
83
|
+
// turn-run.ts;这条兜底路径手里只有事件,正好够)。
|
|
84
|
+
let reasoningFirstTs = null;
|
|
85
|
+
let reasoningLastTs = 0;
|
|
86
|
+
let reasoningLastSeq = 0;
|
|
87
|
+
const pendingInput = new Map();
|
|
88
|
+
const emittedCalls = new Set();
|
|
89
|
+
const flushText = (seq) => {
|
|
90
|
+
if (textBuf) {
|
|
91
|
+
out.push({ type: 'text', text: textBuf });
|
|
92
|
+
uptoSeq = seq;
|
|
93
|
+
textBuf = '';
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
const flushReasoning = () => {
|
|
97
|
+
if (reasoningBuf) {
|
|
98
|
+
out.push({
|
|
99
|
+
type: 'reasoning',
|
|
100
|
+
text: reasoningBuf,
|
|
101
|
+
// 夹到非负——挂钟回拨会让差值变负(同 turn-run.ts)。
|
|
102
|
+
...(reasoningFirstTs != null
|
|
103
|
+
? { durationMs: Math.max(0, reasoningLastTs - reasoningFirstTs) }
|
|
104
|
+
: {}),
|
|
105
|
+
});
|
|
106
|
+
uptoSeq = reasoningLastSeq;
|
|
107
|
+
reasoningBuf = '';
|
|
108
|
+
reasoningFirstTs = null;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
for (const e of events) {
|
|
112
|
+
const p = e.payload;
|
|
113
|
+
// reasoning 必然先于任何跟随其后的事件类型(无 reasoning-end 信号,
|
|
114
|
+
// 故一见到下一个非 reasoning-delta 事件就把它 flush 出去,保序)。
|
|
115
|
+
if (e.type !== 'reasoning-delta')
|
|
116
|
+
flushReasoning();
|
|
117
|
+
switch (e.type) {
|
|
118
|
+
case 'text-delta':
|
|
119
|
+
textBuf += typeof p.text === 'string' ? p.text : '';
|
|
120
|
+
break;
|
|
121
|
+
case 'reasoning-delta':
|
|
122
|
+
reasoningBuf += typeof p.text === 'string' ? p.text : '';
|
|
123
|
+
reasoningFirstTs ??= e.ts;
|
|
124
|
+
reasoningLastTs = e.ts;
|
|
125
|
+
reasoningLastSeq = e.seq;
|
|
126
|
+
break;
|
|
127
|
+
case 'text-end':
|
|
128
|
+
flushText(e.seq);
|
|
129
|
+
break;
|
|
130
|
+
case 'tool-input-start':
|
|
131
|
+
pendingInput.set(String(p.toolCallId), {
|
|
132
|
+
toolName: String(p.toolName),
|
|
133
|
+
raw: '',
|
|
134
|
+
});
|
|
135
|
+
break;
|
|
136
|
+
case 'tool-input-delta': {
|
|
137
|
+
const entry = pendingInput.get(String(p.toolCallId));
|
|
138
|
+
if (entry)
|
|
139
|
+
entry.raw += typeof p.delta === 'string' ? p.delta : '';
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
case 'tool-call':
|
|
143
|
+
flushText(e.seq);
|
|
144
|
+
pendingInput.delete(String(p.toolCallId));
|
|
145
|
+
emittedCalls.add(String(p.toolCallId));
|
|
146
|
+
out.push({
|
|
147
|
+
type: 'tool-call',
|
|
148
|
+
toolCallId: String(p.toolCallId),
|
|
149
|
+
toolName: String(p.toolName),
|
|
150
|
+
input: p.input,
|
|
151
|
+
...providerMetadataFromPayload(p.providerMetadata),
|
|
152
|
+
});
|
|
153
|
+
uptoSeq = e.seq;
|
|
154
|
+
break;
|
|
155
|
+
case 'tool-result':
|
|
156
|
+
uptoSeq = e.seq;
|
|
157
|
+
out.push({
|
|
158
|
+
type: 'tool-result',
|
|
159
|
+
toolCallId: String(p.toolCallId),
|
|
160
|
+
toolName: String(p.toolName),
|
|
161
|
+
output: p.output,
|
|
162
|
+
// `isError` / `ref` / `systemNote` 三样事件 payload 里本来就有
|
|
163
|
+
// (`recordToolResult` 一次 spread 同时喂事件与主路径 part),这条
|
|
164
|
+
// 兜底路径以前只读 `output`,于是同一次调用走主路径落库带失败标记、
|
|
165
|
+
// 走重建路径落库就是一条成功的结果。`isError` 尤其是红线级的:
|
|
166
|
+
// 投影层按它选 `error-json` 变体(parts-to-model-messages.ts),
|
|
167
|
+
// 丢了就等于下一轮把一次失败的工具调用当成功喂回模型。
|
|
168
|
+
//
|
|
169
|
+
// **逐个条件展开、不整体 spread**:主路径的 part 由
|
|
170
|
+
// `{...outcome}` 得到,`ref`/`systemNote` 没有时是「键不存在」
|
|
171
|
+
// (JSON 落库后同样不存在),照抄 undefined 会让两条路径的产物在
|
|
172
|
+
// `toStrictEqual` 下分叉。
|
|
173
|
+
...(typeof p.isError === 'boolean' ? { isError: p.isError } : {}),
|
|
174
|
+
...(isPlainRecord(p.ref) ? { ref: p.ref } : {}),
|
|
175
|
+
// `images` 同样来自事件 payload(`recordToolResult` 一次 spread)。
|
|
176
|
+
// 过一遍 schema 而不是裸 cast:这条兜底路径重建的是要落库的行,一个
|
|
177
|
+
// 形状不对的 src 进了库,下一轮投影就发出一个解析不了的引用。
|
|
178
|
+
...imagesFromPayload(p.images),
|
|
179
|
+
// 钉住不许裁剪(`AgentTool.persistPinned`)。只认字面的 `true`。
|
|
180
|
+
...(p.pinned === true ? { pinned: true } : {}),
|
|
181
|
+
...(typeof p.systemNote === 'string'
|
|
182
|
+
? { systemNote: p.systemNote }
|
|
183
|
+
: {}),
|
|
184
|
+
});
|
|
185
|
+
break;
|
|
186
|
+
default:
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// 轮子还在跑:半截的一律留在 buffer 里,等封口它的那个事件到了下一次再交
|
|
191
|
+
// (判据见 `PartsTail`)。
|
|
192
|
+
if (tail === 'hold')
|
|
193
|
+
return { parts: out, uptoSeq };
|
|
194
|
+
// 收尾:若流以纯 reasoning 结束(无后续事件触发过 flush),这里补上——
|
|
195
|
+
// 正是「取消恰好落在纯 reasoning 阶段」那个真实案例的落点。抢救出来的尾巴
|
|
196
|
+
// 把边界推到最后一个事件:这一轮已经结束,流里的一切都可以退役了。
|
|
197
|
+
const lastSeq = events.at(-1)?.seq ?? null;
|
|
198
|
+
flushReasoning();
|
|
199
|
+
flushText(lastSeq ?? 0);
|
|
200
|
+
// 抢救没等到 tool-call 的半截调用。
|
|
201
|
+
for (const [toolCallId, { toolName, raw }] of pendingInput) {
|
|
202
|
+
if (emittedCalls.has(toolCallId))
|
|
203
|
+
continue;
|
|
204
|
+
let input = raw;
|
|
205
|
+
try {
|
|
206
|
+
input = JSON.parse(raw);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// 保持原始字符串,便于排查截断点。
|
|
210
|
+
}
|
|
211
|
+
out.push({ type: 'tool-call', toolCallId, toolName, input });
|
|
212
|
+
}
|
|
213
|
+
if (out.length > 0 && lastSeq != null)
|
|
214
|
+
uptoSeq = lastSeq;
|
|
215
|
+
return { parts: out, uptoSeq };
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=parts-from-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parts-from-events.js","sourceRoot":"","sources":["../../src/turn/parts-from-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAEL,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAE5B,oEAAoE;AACpE,SAAS,aAAa,CAAC,CAAU;IAC/B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE3D;;;GAGG;AACH,SAAS,2BAA2B,CAClC,CAAU;IAEV,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,iBAAiB,CACxB,CAAU;IAEV,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAA6B,EAC7B,OAAkB,QAAQ;IAE1B,OAAO,gCAAgC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gCAAgC,CAC9C,MAA6B,EAC7B,OAAkB,QAAQ;IAE1B,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,4CAA4C;IAC5C,iCAAiC;IACjC,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAC3C,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,MAAM,YAAY,GAAG,IAAI,GAAG,EAA6C,CAAC;IAC1E,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE;QAChC,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1C,OAAO,GAAG,GAAG,CAAC;YACd,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IACF,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,YAAY,EAAE,CAAC;YACjB,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,YAAY;gBAClB,mCAAmC;gBACnC,GAAG,CAAC,gBAAgB,IAAI,IAAI;oBAC1B,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,GAAG,gBAAgB,CAAC,EAAE;oBACjE,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;YACH,OAAO,GAAG,gBAAgB,CAAC;YAC3B,YAAY,GAAG,EAAE,CAAC;YAClB,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAkC,CAAC;QAC/C,gDAAgD;QAChD,+CAA+C;QAC/C,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB;YAAE,cAAc,EAAE,CAAC;QACnD,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,YAAY;gBACf,OAAO,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,MAAM;YACR,KAAK,iBAAiB;gBACpB,YAAY,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,gBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC1B,eAAe,GAAG,CAAC,CAAC,EAAE,CAAC;gBACvB,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC;gBACzB,MAAM;YACR,KAAK,UAAU;gBACb,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACjB,MAAM;YACR,KAAK,kBAAkB;gBACrB,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;oBACrC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;oBAC5B,GAAG,EAAE,EAAE;iBACR,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;gBACrD,IAAI,KAAK;oBAAE,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,MAAM;YACR,CAAC;YACD,KAAK,WAAW;gBACd,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACjB,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC1C,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;gBACvC,GAAG,CAAC,IAAI,CAAC;oBACP,IAAI,EAAE,WAAW;oBACjB,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;oBAChC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;oBAC5B,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,GAAG,2BAA2B,CAAC,CAAC,CAAC,gBAAgB,CAAC;iBACnD,CAAC,CAAC;gBACH,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC;gBAChB,MAAM;YACR,KAAK,aAAa;gBAChB,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC;gBAChB,GAAG,CAAC,IAAI,CAAC;oBACP,IAAI,EAAE,aAAa;oBACnB,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;oBAChC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;oBAC5B,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,sDAAsD;oBACtD,mDAAmD;oBACnD,wCAAwC;oBACxC,sCAAsC;oBACtC,sDAAsD;oBACtD,6BAA6B;oBAC7B,EAAE;oBACF,oCAAoC;oBACpC,kDAAkD;oBAClD,0CAA0C;oBAC1C,uBAAuB;oBACvB,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/C,yDAAyD;oBACzD,0CAA0C;oBAC1C,mCAAmC;oBACnC,GAAG,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC9B,kDAAkD;oBAClD,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9C,GAAG,CAAC,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;wBAClC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE;wBAC9B,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC,CAAC;gBACH,MAAM;YACR;gBACE,MAAM;QACV,CAAC;IACH,CAAC;IACD,0CAA0C;IAC1C,qBAAqB;IACrB,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAEpD,8CAA8C;IAC9C,4CAA4C;IAC5C,mCAAmC;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;IAC3C,cAAc,EAAE,CAAC;IACjB,SAAS,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAExB,yBAAyB;IACzB,KAAK,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC;QAC3D,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,SAAS;QAC3C,IAAI,KAAK,GAAY,GAAG,CAAC;QACzB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB;QACrB,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,GAAG,OAAO,CAAC;IACzD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC"}
|