@animalabs/agent-framework 0.22.2 → 0.23.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/README.md +108 -4
- package/dist/src/agent.d.ts +108 -17
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +207 -67
- package/dist/src/agent.js.map +1 -1
- package/dist/src/api/mcp-server-core.js +1 -1
- package/dist/src/api/mcp-server-core.js.map +1 -1
- package/dist/src/api/server.d.ts.map +1 -1
- package/dist/src/api/server.js +5 -1
- package/dist/src/api/server.js.map +1 -1
- package/dist/src/api/types.d.ts +1 -1
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/branch-names.d.ts +14 -0
- package/dist/src/branch-names.d.ts.map +1 -0
- package/dist/src/branch-names.js +22 -0
- package/dist/src/branch-names.js.map +1 -0
- package/dist/src/closest-names.d.ts +28 -0
- package/dist/src/closest-names.d.ts.map +1 -0
- package/dist/src/closest-names.js +98 -0
- package/dist/src/closest-names.js.map +1 -0
- package/dist/src/code-execution/index.d.ts +1 -1
- package/dist/src/code-execution/index.d.ts.map +1 -1
- package/dist/src/code-execution/index.js.map +1 -1
- package/dist/src/code-execution/py-runner.d.ts +50 -7
- package/dist/src/code-execution/py-runner.d.ts.map +1 -1
- package/dist/src/code-execution/py-runner.js +258 -90
- package/dist/src/code-execution/py-runner.js.map +1 -1
- package/dist/src/code-execution/runtime-py.d.ts +3 -2
- package/dist/src/code-execution/runtime-py.d.ts.map +1 -1
- package/dist/src/code-execution/runtime-py.js +94 -8
- package/dist/src/code-execution/runtime-py.js.map +1 -1
- package/dist/src/code-execution/tool-definition.d.ts +17 -1
- package/dist/src/code-execution/tool-definition.d.ts.map +1 -1
- package/dist/src/code-execution/tool-definition.js +72 -6
- package/dist/src/code-execution/tool-definition.js.map +1 -1
- package/dist/src/config-checks.d.ts +28 -0
- package/dist/src/config-checks.d.ts.map +1 -0
- package/dist/src/config-checks.js +56 -0
- package/dist/src/config-checks.js.map +1 -0
- package/dist/src/deadline-timer.d.ts +21 -0
- package/dist/src/deadline-timer.d.ts.map +1 -0
- package/dist/src/deadline-timer.js +43 -0
- package/dist/src/deadline-timer.js.map +1 -0
- package/dist/src/error-message.d.ts +30 -0
- package/dist/src/error-message.d.ts.map +1 -0
- package/dist/src/error-message.js +50 -0
- package/dist/src/error-message.js.map +1 -0
- package/dist/src/framework.d.ts +1529 -165
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +8264 -1939
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +8 -0
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +36 -5
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/held-writes.d.ts +16 -0
- package/dist/src/held-writes.d.ts.map +1 -0
- package/dist/src/held-writes.js +56 -0
- package/dist/src/held-writes.js.map +1 -0
- package/dist/src/index.d.ts +10 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +11 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/capability-grant.d.ts +4 -0
- package/dist/src/mcpl/capability-grant.d.ts.map +1 -1
- package/dist/src/mcpl/capability-grant.js +1 -1
- package/dist/src/mcpl/capability-grant.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +233 -18
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +975 -386
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/checkpoint-manager.d.ts +21 -1
- package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -1
- package/dist/src/mcpl/checkpoint-manager.js +91 -30
- package/dist/src/mcpl/checkpoint-manager.js.map +1 -1
- package/dist/src/mcpl/conversation-router.d.ts +19 -3
- package/dist/src/mcpl/conversation-router.d.ts.map +1 -1
- package/dist/src/mcpl/conversation-router.js +23 -8
- package/dist/src/mcpl/conversation-router.js.map +1 -1
- package/dist/src/mcpl/convert-block.d.ts +20 -0
- package/dist/src/mcpl/convert-block.d.ts.map +1 -0
- package/dist/src/mcpl/convert-block.js +88 -0
- package/dist/src/mcpl/convert-block.js.map +1 -0
- package/dist/src/mcpl/errors.d.ts +13 -0
- package/dist/src/mcpl/errors.d.ts.map +1 -1
- package/dist/src/mcpl/errors.js +28 -0
- package/dist/src/mcpl/errors.js.map +1 -1
- package/dist/src/mcpl/hook-orchestrator.d.ts +23 -0
- package/dist/src/mcpl/hook-orchestrator.d.ts.map +1 -1
- package/dist/src/mcpl/hook-orchestrator.js +83 -72
- package/dist/src/mcpl/hook-orchestrator.js.map +1 -1
- package/dist/src/mcpl/inbound-source.d.ts +114 -0
- package/dist/src/mcpl/inbound-source.d.ts.map +1 -0
- package/dist/src/mcpl/inbound-source.js +83 -0
- package/dist/src/mcpl/inbound-source.js.map +1 -0
- package/dist/src/mcpl/index.d.ts +7 -1
- package/dist/src/mcpl/index.d.ts.map +1 -1
- package/dist/src/mcpl/index.js +5 -1
- package/dist/src/mcpl/index.js.map +1 -1
- package/dist/src/mcpl/inference-router.d.ts +19 -13
- package/dist/src/mcpl/inference-router.d.ts.map +1 -1
- package/dist/src/mcpl/inference-router.js +155 -87
- package/dist/src/mcpl/inference-router.js.map +1 -1
- package/dist/src/mcpl/log-value.d.ts +7 -0
- package/dist/src/mcpl/log-value.d.ts.map +1 -1
- package/dist/src/mcpl/log-value.js +9 -0
- package/dist/src/mcpl/log-value.js.map +1 -1
- package/dist/src/mcpl/modern-connection.d.ts +227 -0
- package/dist/src/mcpl/modern-connection.d.ts.map +1 -0
- package/dist/src/mcpl/modern-connection.js +1088 -0
- package/dist/src/mcpl/modern-connection.js.map +1 -0
- package/dist/src/mcpl/prefix-rule.d.ts +18 -0
- package/dist/src/mcpl/prefix-rule.d.ts.map +1 -0
- package/dist/src/mcpl/prefix-rule.js +25 -0
- package/dist/src/mcpl/prefix-rule.js.map +1 -0
- package/dist/src/mcpl/protocol-family.d.ts +179 -0
- package/dist/src/mcpl/protocol-family.d.ts.map +1 -0
- package/dist/src/mcpl/protocol-family.js +697 -0
- package/dist/src/mcpl/protocol-family.js.map +1 -0
- package/dist/src/mcpl/push-coalescer.d.ts +58 -17
- package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
- package/dist/src/mcpl/push-coalescer.js +93 -32
- package/dist/src/mcpl/push-coalescer.js.map +1 -1
- package/dist/src/mcpl/push-handler.d.ts +16 -9
- package/dist/src/mcpl/push-handler.d.ts.map +1 -1
- package/dist/src/mcpl/push-handler.js +18 -83
- package/dist/src/mcpl/push-handler.js.map +1 -1
- package/dist/src/mcpl/reference-fetcher.d.ts +76 -13
- package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
- package/dist/src/mcpl/reference-fetcher.js +275 -66
- package/dist/src/mcpl/reference-fetcher.js.map +1 -1
- package/dist/src/mcpl/references.d.ts +98 -18
- package/dist/src/mcpl/references.d.ts.map +1 -1
- package/dist/src/mcpl/references.js +170 -32
- package/dist/src/mcpl/references.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +406 -31
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +1331 -272
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/mcpl/server-registry.d.ts +35 -6
- package/dist/src/mcpl/server-registry.d.ts.map +1 -1
- package/dist/src/mcpl/server-registry.js +63 -13
- package/dist/src/mcpl/server-registry.js.map +1 -1
- package/dist/src/mcpl/skip-reply-wake.d.ts +36 -0
- package/dist/src/mcpl/skip-reply-wake.d.ts.map +1 -0
- package/dist/src/mcpl/skip-reply-wake.js +55 -0
- package/dist/src/mcpl/skip-reply-wake.js.map +1 -0
- package/dist/src/mcpl/tool-result-normalize.d.ts +54 -0
- package/dist/src/mcpl/tool-result-normalize.d.ts.map +1 -0
- package/dist/src/mcpl/tool-result-normalize.js +232 -0
- package/dist/src/mcpl/tool-result-normalize.js.map +1 -0
- package/dist/src/mcpl/transport.d.ts +104 -12
- package/dist/src/mcpl/transport.d.ts.map +1 -1
- package/dist/src/mcpl/transport.js +315 -85
- package/dist/src/mcpl/transport.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +76 -19
- package/dist/src/mcpl/types.d.ts.map +1 -1
- package/dist/src/mcpl/types.js.map +1 -1
- package/dist/src/mcpl/visible-content.d.ts +16 -0
- package/dist/src/mcpl/visible-content.d.ts.map +1 -1
- package/dist/src/mcpl/visible-content.js +26 -0
- package/dist/src/mcpl/visible-content.js.map +1 -1
- package/dist/src/module-registry.d.ts +34 -6
- package/dist/src/module-registry.d.ts.map +1 -1
- package/dist/src/module-registry.js +119 -31
- package/dist/src/module-registry.js.map +1 -1
- package/dist/src/modules/api/index.d.ts +1 -1
- package/dist/src/modules/api/index.d.ts.map +1 -1
- package/dist/src/modules/api/index.js +3 -2
- package/dist/src/modules/api/index.js.map +1 -1
- package/dist/src/modules/discord/discord-js-client.d.ts +43 -2
- package/dist/src/modules/discord/discord-js-client.d.ts.map +1 -1
- package/dist/src/modules/discord/discord-js-client.js +286 -67
- package/dist/src/modules/discord/discord-js-client.js.map +1 -1
- package/dist/src/modules/discord/index.d.ts +53 -5
- package/dist/src/modules/discord/index.d.ts.map +1 -1
- package/dist/src/modules/discord/index.js +712 -186
- package/dist/src/modules/discord/index.js.map +1 -1
- package/dist/src/modules/discord/refusal.d.ts +14 -0
- package/dist/src/modules/discord/refusal.d.ts.map +1 -0
- package/dist/src/modules/discord/refusal.js +14 -0
- package/dist/src/modules/discord/refusal.js.map +1 -0
- package/dist/src/modules/discord/types.d.ts +27 -4
- package/dist/src/modules/discord/types.d.ts.map +1 -1
- package/dist/src/modules/health/index.d.ts.map +1 -1
- package/dist/src/modules/health/index.js +8 -3
- package/dist/src/modules/health/index.js.map +1 -1
- package/dist/src/modules/history/index.d.ts +3 -1
- package/dist/src/modules/history/index.d.ts.map +1 -1
- package/dist/src/modules/history/index.js +359 -127
- package/dist/src/modules/history/index.js.map +1 -1
- package/dist/src/modules/history/semantic.d.ts +28 -1
- package/dist/src/modules/history/semantic.d.ts.map +1 -1
- package/dist/src/modules/history/semantic.js +177 -32
- package/dist/src/modules/history/semantic.js.map +1 -1
- package/dist/src/modules/index.d.ts +1 -1
- package/dist/src/modules/index.d.ts.map +1 -1
- package/dist/src/modules/index.js +1 -1
- package/dist/src/modules/index.js.map +1 -1
- package/dist/src/modules/unknown-tool.d.ts +10 -0
- package/dist/src/modules/unknown-tool.d.ts.map +1 -0
- package/dist/src/modules/unknown-tool.js +17 -0
- package/dist/src/modules/unknown-tool.js.map +1 -0
- package/dist/src/modules/workspace/disk-agreement.d.ts +57 -4
- package/dist/src/modules/workspace/disk-agreement.d.ts.map +1 -1
- package/dist/src/modules/workspace/disk-agreement.js +75 -7
- package/dist/src/modules/workspace/disk-agreement.js.map +1 -1
- package/dist/src/modules/workspace/effects.d.ts +66 -7
- package/dist/src/modules/workspace/effects.d.ts.map +1 -1
- package/dist/src/modules/workspace/effects.js +303 -46
- package/dist/src/modules/workspace/effects.js.map +1 -1
- package/dist/src/modules/workspace/index.d.ts +313 -45
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +1404 -304
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/observe.d.ts +315 -16
- package/dist/src/modules/workspace/observe.d.ts.map +1 -1
- package/dist/src/modules/workspace/observe.js +727 -37
- package/dist/src/modules/workspace/observe.js.map +1 -1
- package/dist/src/modules/workspace/reconcile.d.ts +58 -7
- package/dist/src/modules/workspace/reconcile.d.ts.map +1 -1
- package/dist/src/modules/workspace/reconcile.js +521 -56
- package/dist/src/modules/workspace/reconcile.js.map +1 -1
- package/dist/src/modules/workspace/types.d.ts +28 -5
- package/dist/src/modules/workspace/types.d.ts.map +1 -1
- package/dist/src/modules/workspace/types.js.map +1 -1
- package/dist/src/modules/workspace/watcher.d.ts +49 -2
- package/dist/src/modules/workspace/watcher.d.ts.map +1 -1
- package/dist/src/modules/workspace/watcher.js +158 -29
- package/dist/src/modules/workspace/watcher.js.map +1 -1
- package/dist/src/prose-drafts.d.ts +240 -0
- package/dist/src/prose-drafts.d.ts.map +1 -0
- package/dist/src/prose-drafts.js +362 -0
- package/dist/src/prose-drafts.js.map +1 -0
- package/dist/src/prose-segments.d.ts +21 -2
- package/dist/src/prose-segments.d.ts.map +1 -1
- package/dist/src/prose-segments.js +46 -9
- package/dist/src/prose-segments.js.map +1 -1
- package/dist/src/recovery/offline-branch.d.ts +1 -0
- package/dist/src/recovery/offline-branch.d.ts.map +1 -1
- package/dist/src/recovery/offline-branch.js +3 -1
- package/dist/src/recovery/offline-branch.js.map +1 -1
- package/dist/src/safe-slice.d.ts +5 -1
- package/dist/src/safe-slice.d.ts.map +1 -1
- package/dist/src/safe-slice.js +9 -1
- package/dist/src/safe-slice.js.map +1 -1
- package/dist/src/silent-heartbeat.d.ts +112 -39
- package/dist/src/silent-heartbeat.d.ts.map +1 -1
- package/dist/src/silent-heartbeat.js +100 -29
- package/dist/src/silent-heartbeat.js.map +1 -1
- package/dist/src/tool-args.d.ts +40 -0
- package/dist/src/tool-args.d.ts.map +1 -0
- package/dist/src/tool-args.js +207 -0
- package/dist/src/tool-args.js.map +1 -0
- package/dist/src/tool-image-ledger.d.ts +87 -19
- package/dist/src/tool-image-ledger.d.ts.map +1 -1
- package/dist/src/tool-image-ledger.js +135 -32
- package/dist/src/tool-image-ledger.js.map +1 -1
- package/dist/src/tool-presentation.d.ts +9 -0
- package/dist/src/tool-presentation.d.ts.map +1 -1
- package/dist/src/tool-presentation.js +266 -62
- package/dist/src/tool-presentation.js.map +1 -1
- package/dist/src/tool-result-guard.d.ts.map +1 -1
- package/dist/src/tool-result-guard.js +7 -10
- package/dist/src/tool-result-guard.js.map +1 -1
- package/dist/src/tool-result-history.d.ts +32 -3
- package/dist/src/tool-result-history.d.ts.map +1 -1
- package/dist/src/tool-result-history.js +106 -19
- package/dist/src/tool-result-history.js.map +1 -1
- package/dist/src/tune-out/coordinator.d.ts +25 -1
- package/dist/src/tune-out/coordinator.d.ts.map +1 -1
- package/dist/src/tune-out/coordinator.js +260 -65
- package/dist/src/tune-out/coordinator.js.map +1 -1
- package/dist/src/types/agent.d.ts +44 -22
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/events.d.ts +25 -0
- package/dist/src/types/events.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +38 -7
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/inference-log.d.ts +1 -1
- package/dist/src/types/inference-log.d.ts.map +1 -1
- package/dist/src/types/module.d.ts +77 -14
- package/dist/src/types/module.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +97 -8
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/src/usage/usage-tracker.d.ts +5 -0
- package/dist/src/usage/usage-tracker.d.ts.map +1 -1
- package/dist/src/usage/usage-tracker.js +35 -8
- package/dist/src/usage/usage-tracker.js.map +1 -1
- package/package.json +5 -4
- package/src/agent.ts +257 -72
- package/src/api/mcp-server-core.ts +1 -1
- package/src/api/server.ts +4 -1
- package/src/api/types.ts +1 -1
- package/src/branch-names.ts +19 -0
- package/src/closest-names.ts +94 -0
- package/src/code-execution/index.ts +1 -0
- package/src/code-execution/py-runner.ts +304 -93
- package/src/code-execution/runtime-py.ts +94 -8
- package/src/code-execution/tool-definition.ts +85 -7
- package/src/config-checks.ts +50 -0
- package/src/deadline-timer.ts +44 -0
- package/src/error-message.ts +48 -0
- package/src/framework.ts +8625 -1984
- package/src/gate/event-gate.ts +38 -5
- package/src/held-writes.ts +59 -0
- package/src/index.ts +29 -5
- package/src/mcpl/capability-grant.ts +1 -1
- package/src/mcpl/channel-registry.ts +1095 -411
- package/src/mcpl/checkpoint-manager.ts +104 -29
- package/src/mcpl/conversation-router.ts +28 -8
- package/src/mcpl/convert-block.ts +105 -0
- package/src/mcpl/errors.ts +28 -0
- package/src/mcpl/hook-orchestrator.ts +84 -77
- package/src/mcpl/inbound-source.ts +156 -0
- package/src/mcpl/index.ts +23 -1
- package/src/mcpl/inference-router.ts +179 -103
- package/src/mcpl/log-value.ts +10 -0
- package/src/mcpl/modern-connection.ts +1182 -0
- package/src/mcpl/prefix-rule.ts +32 -0
- package/src/mcpl/protocol-family.ts +691 -0
- package/src/mcpl/push-coalescer.ts +110 -36
- package/src/mcpl/push-handler.ts +20 -90
- package/src/mcpl/reference-fetcher.ts +318 -67
- package/src/mcpl/references.ts +183 -34
- package/src/mcpl/server-connection.ts +1404 -280
- package/src/mcpl/server-registry.ts +63 -14
- package/src/mcpl/skip-reply-wake.ts +73 -0
- package/src/mcpl/tool-result-normalize.ts +294 -0
- package/src/mcpl/transport.ts +320 -76
- package/src/mcpl/types.ts +77 -19
- package/src/mcpl/visible-content.ts +28 -0
- package/src/module-registry.ts +126 -36
- package/src/modules/api/index.ts +3 -2
- package/src/modules/discord/discord-js-client.ts +306 -74
- package/src/modules/discord/index.ts +737 -201
- package/src/modules/discord/refusal.ts +13 -0
- package/src/modules/discord/types.ts +27 -6
- package/src/modules/health/index.ts +8 -3
- package/src/modules/history/index.ts +410 -120
- package/src/modules/history/semantic.ts +189 -32
- package/src/modules/index.ts +1 -1
- package/src/modules/unknown-tool.ts +16 -0
- package/src/modules/workspace/disk-agreement.ts +97 -8
- package/src/modules/workspace/effects.ts +291 -36
- package/src/modules/workspace/index.ts +1469 -321
- package/src/modules/workspace/observe.ts +784 -41
- package/src/modules/workspace/reconcile.ts +619 -64
- package/src/modules/workspace/types.ts +28 -5
- package/src/modules/workspace/watcher.ts +154 -30
- package/src/prose-drafts.ts +481 -0
- package/src/prose-segments.ts +51 -8
- package/src/recovery/offline-branch.ts +4 -1
- package/src/safe-slice.ts +9 -1
- package/src/silent-heartbeat.ts +184 -59
- package/src/tool-args.ts +213 -0
- package/src/tool-image-ledger.ts +153 -34
- package/src/tool-presentation.ts +233 -42
- package/src/tool-result-guard.ts +7 -8
- package/src/tool-result-history.ts +124 -20
- package/src/tune-out/coordinator.ts +259 -65
- package/src/types/agent.ts +44 -24
- package/src/types/events.ts +25 -0
- package/src/types/framework.ts +38 -7
- package/src/types/inference-log.ts +1 -1
- package/src/types/module.ts +79 -14
- package/src/types/trace.ts +103 -8
- package/src/usage/usage-tracker.ts +32 -8
- package/dist/test/activation-request-sanitize.test.d.ts +0 -2
- package/dist/test/activation-request-sanitize.test.d.ts.map +0 -1
- package/dist/test/activation-request-sanitize.test.js +0 -89
- package/dist/test/activation-request-sanitize.test.js.map +0 -1
- package/dist/test/agent-cache-ttl.test.d.ts +0 -2
- package/dist/test/agent-cache-ttl.test.d.ts.map +0 -1
- package/dist/test/agent-cache-ttl.test.js +0 -41
- package/dist/test/agent-cache-ttl.test.js.map +0 -1
- package/dist/test/agent-runtime-settings.test.d.ts +0 -2
- package/dist/test/agent-runtime-settings.test.d.ts.map +0 -1
- package/dist/test/agent-runtime-settings.test.js +0 -1598
- package/dist/test/agent-runtime-settings.test.js.map +0 -1
- package/dist/test/api-admin-gate.test.d.ts +0 -2
- package/dist/test/api-admin-gate.test.d.ts.map +0 -1
- package/dist/test/api-admin-gate.test.js +0 -116
- package/dist/test/api-admin-gate.test.js.map +0 -1
- package/dist/test/assistant-persist-refusal.test.d.ts +0 -2
- package/dist/test/assistant-persist-refusal.test.d.ts.map +0 -1
- package/dist/test/assistant-persist-refusal.test.js +0 -63
- package/dist/test/assistant-persist-refusal.test.js.map +0 -1
- package/dist/test/batched-wake-locus.test.d.ts +0 -2
- package/dist/test/batched-wake-locus.test.d.ts.map +0 -1
- package/dist/test/batched-wake-locus.test.js +0 -166
- package/dist/test/batched-wake-locus.test.js.map +0 -1
- package/dist/test/busy-agent-scheduler.test.d.ts +0 -2
- package/dist/test/busy-agent-scheduler.test.d.ts.map +0 -1
- package/dist/test/busy-agent-scheduler.test.js +0 -92
- package/dist/test/busy-agent-scheduler.test.js.map +0 -1
- package/dist/test/channel-incoming-targeting.test.d.ts +0 -2
- package/dist/test/channel-incoming-targeting.test.d.ts.map +0 -1
- package/dist/test/channel-incoming-targeting.test.js +0 -81
- package/dist/test/channel-incoming-targeting.test.js.map +0 -1
- package/dist/test/channel-label-history.test.d.ts +0 -2
- package/dist/test/channel-label-history.test.d.ts.map +0 -1
- package/dist/test/channel-label-history.test.js +0 -424
- package/dist/test/channel-label-history.test.js.map +0 -1
- package/dist/test/channel-lifecycle-provenance.test.d.ts +0 -2
- package/dist/test/channel-lifecycle-provenance.test.d.ts.map +0 -1
- package/dist/test/channel-lifecycle-provenance.test.js +0 -47
- package/dist/test/channel-lifecycle-provenance.test.js.map +0 -1
- package/dist/test/channel-registry-routing.test.d.ts +0 -2
- package/dist/test/channel-registry-routing.test.d.ts.map +0 -1
- package/dist/test/channel-registry-routing.test.js +0 -446
- package/dist/test/channel-registry-routing.test.js.map +0 -1
- package/dist/test/channel-registry-typing.test.d.ts +0 -2
- package/dist/test/channel-registry-typing.test.d.ts.map +0 -1
- package/dist/test/channel-registry-typing.test.js +0 -91
- package/dist/test/channel-registry-typing.test.js.map +0 -1
- package/dist/test/channels-changed-respond-first.test.d.ts +0 -2
- package/dist/test/channels-changed-respond-first.test.d.ts.map +0 -1
- package/dist/test/channels-changed-respond-first.test.js +0 -74
- package/dist/test/channels-changed-respond-first.test.js.map +0 -1
- package/dist/test/checkpoint-attribution.test.d.ts +0 -2
- package/dist/test/checkpoint-attribution.test.d.ts.map +0 -1
- package/dist/test/checkpoint-attribution.test.js +0 -200
- package/dist/test/checkpoint-attribution.test.js.map +0 -1
- package/dist/test/code-execution.test.d.ts +0 -11
- package/dist/test/code-execution.test.d.ts.map +0 -1
- package/dist/test/code-execution.test.js +0 -1272
- package/dist/test/code-execution.test.js.map +0 -1
- package/dist/test/component-defaults.test.d.ts +0 -2
- package/dist/test/component-defaults.test.d.ts.map +0 -1
- package/dist/test/component-defaults.test.js +0 -54
- package/dist/test/component-defaults.test.js.map +0 -1
- package/dist/test/conversation-fork-injection-scoping.test.d.ts +0 -2
- package/dist/test/conversation-fork-injection-scoping.test.d.ts.map +0 -1
- package/dist/test/conversation-fork-injection-scoping.test.js +0 -200
- package/dist/test/conversation-fork-injection-scoping.test.js.map +0 -1
- package/dist/test/conversation-router.test.d.ts +0 -2
- package/dist/test/conversation-router.test.d.ts.map +0 -1
- package/dist/test/conversation-router.test.js +0 -174
- package/dist/test/conversation-router.test.js.map +0 -1
- package/dist/test/conversation-routing.test.d.ts +0 -7
- package/dist/test/conversation-routing.test.d.ts.map +0 -1
- package/dist/test/conversation-routing.test.js +0 -621
- package/dist/test/conversation-routing.test.js.map +0 -1
- package/dist/test/deferred-wake-integrity.test.d.ts +0 -29
- package/dist/test/deferred-wake-integrity.test.d.ts.map +0 -1
- package/dist/test/deferred-wake-integrity.test.js +0 -320
- package/dist/test/deferred-wake-integrity.test.js.map +0 -1
- package/dist/test/discord-awareness-outbox.test.d.ts +0 -2
- package/dist/test/discord-awareness-outbox.test.d.ts.map +0 -1
- package/dist/test/discord-awareness-outbox.test.js +0 -371
- package/dist/test/discord-awareness-outbox.test.js.map +0 -1
- package/dist/test/discord-history-delete-window.test.d.ts +0 -2
- package/dist/test/discord-history-delete-window.test.d.ts.map +0 -1
- package/dist/test/discord-history-delete-window.test.js +0 -81
- package/dist/test/discord-history-delete-window.test.js.map +0 -1
- package/dist/test/discord-history-sync.test.d.ts +0 -2
- package/dist/test/discord-history-sync.test.d.ts.map +0 -1
- package/dist/test/discord-history-sync.test.js +0 -56
- package/dist/test/discord-history-sync.test.js.map +0 -1
- package/dist/test/discord-typing-keepalive.test.d.ts +0 -2
- package/dist/test/discord-typing-keepalive.test.d.ts.map +0 -1
- package/dist/test/discord-typing-keepalive.test.js +0 -77
- package/dist/test/discord-typing-keepalive.test.js.map +0 -1
- package/dist/test/ephemeral-settle.test.d.ts +0 -2
- package/dist/test/ephemeral-settle.test.d.ts.map +0 -1
- package/dist/test/ephemeral-settle.test.js +0 -354
- package/dist/test/ephemeral-settle.test.js.map +0 -1
- package/dist/test/event-gate-passthrough.test.d.ts +0 -15
- package/dist/test/event-gate-passthrough.test.d.ts.map +0 -1
- package/dist/test/event-gate-passthrough.test.js +0 -289
- package/dist/test/event-gate-passthrough.test.js.map +0 -1
- package/dist/test/event-gate-policy-mutation.test.d.ts +0 -2
- package/dist/test/event-gate-policy-mutation.test.d.ts.map +0 -1
- package/dist/test/event-gate-policy-mutation.test.js +0 -137
- package/dist/test/event-gate-policy-mutation.test.js.map +0 -1
- package/dist/test/event-gate-rate-limit.test.d.ts +0 -2
- package/dist/test/event-gate-rate-limit.test.d.ts.map +0 -1
- package/dist/test/event-gate-rate-limit.test.js +0 -627
- package/dist/test/event-gate-rate-limit.test.js.map +0 -1
- package/dist/test/event-gate-script.test.d.ts +0 -2
- package/dist/test/event-gate-script.test.d.ts.map +0 -1
- package/dist/test/event-gate-script.test.js +0 -95
- package/dist/test/event-gate-script.test.js.map +0 -1
- package/dist/test/event-gate-selfwake.test.d.ts +0 -15
- package/dist/test/event-gate-selfwake.test.d.ts.map +0 -1
- package/dist/test/event-gate-selfwake.test.js +0 -125
- package/dist/test/event-gate-selfwake.test.js.map +0 -1
- package/dist/test/event-gate-tags.test.d.ts +0 -2
- package/dist/test/event-gate-tags.test.d.ts.map +0 -1
- package/dist/test/event-gate-tags.test.js +0 -76
- package/dist/test/event-gate-tags.test.js.map +0 -1
- package/dist/test/event-gate.test.d.ts +0 -2
- package/dist/test/event-gate.test.d.ts.map +0 -1
- package/dist/test/event-gate.test.js +0 -919
- package/dist/test/event-gate.test.js.map +0 -1
- package/dist/test/explicit-prose-routing.test.d.ts +0 -11
- package/dist/test/explicit-prose-routing.test.d.ts.map +0 -1
- package/dist/test/explicit-prose-routing.test.js +0 -1715
- package/dist/test/explicit-prose-routing.test.js.map +0 -1
- package/dist/test/framework.test.d.ts +0 -5
- package/dist/test/framework.test.d.ts.map +0 -1
- package/dist/test/framework.test.js +0 -1048
- package/dist/test/framework.test.js.map +0 -1
- package/dist/test/gather-context-timeout.test.d.ts +0 -2
- package/dist/test/gather-context-timeout.test.d.ts.map +0 -1
- package/dist/test/gather-context-timeout.test.js +0 -120
- package/dist/test/gather-context-timeout.test.js.map +0 -1
- package/dist/test/health-snapshot.test.d.ts +0 -2
- package/dist/test/health-snapshot.test.d.ts.map +0 -1
- package/dist/test/health-snapshot.test.js +0 -74
- package/dist/test/health-snapshot.test.js.map +0 -1
- package/dist/test/helpers/coalescing-fixture.d.ts +0 -74
- package/dist/test/helpers/coalescing-fixture.d.ts.map +0 -1
- package/dist/test/helpers/coalescing-fixture.js +0 -152
- package/dist/test/helpers/coalescing-fixture.js.map +0 -1
- package/dist/test/helpers/coalescing-kill-child.d.ts +0 -2
- package/dist/test/helpers/coalescing-kill-child.d.ts.map +0 -1
- package/dist/test/helpers/coalescing-kill-child.js +0 -24
- package/dist/test/helpers/coalescing-kill-child.js.map +0 -1
- package/dist/test/helpers/mock-membrane.d.ts +0 -53
- package/dist/test/helpers/mock-membrane.d.ts.map +0 -1
- package/dist/test/helpers/mock-membrane.js +0 -168
- package/dist/test/helpers/mock-membrane.js.map +0 -1
- package/dist/test/helpers/pytc-stop-rows.d.ts +0 -11
- package/dist/test/helpers/pytc-stop-rows.d.ts.map +0 -1
- package/dist/test/helpers/pytc-stop-rows.js +0 -143
- package/dist/test/helpers/pytc-stop-rows.js.map +0 -1
- package/dist/test/helpers/quiesce-crash-child.d.ts +0 -2
- package/dist/test/helpers/quiesce-crash-child.d.ts.map +0 -1
- package/dist/test/helpers/quiesce-crash-child.js +0 -156
- package/dist/test/helpers/quiesce-crash-child.js.map +0 -1
- package/dist/test/hide-then-turn.test.d.ts +0 -2
- package/dist/test/hide-then-turn.test.d.ts.map +0 -1
- package/dist/test/hide-then-turn.test.js +0 -101
- package/dist/test/hide-then-turn.test.js.map +0 -1
- package/dist/test/history-module-overview.test.d.ts +0 -2
- package/dist/test/history-module-overview.test.d.ts.map +0 -1
- package/dist/test/history-module-overview.test.js +0 -711
- package/dist/test/history-module-overview.test.js.map +0 -1
- package/dist/test/history-module-realstore.test.d.ts +0 -2
- package/dist/test/history-module-realstore.test.d.ts.map +0 -1
- package/dist/test/history-module-realstore.test.js +0 -363
- package/dist/test/history-module-realstore.test.js.map +0 -1
- package/dist/test/history-module-semantic.test.d.ts +0 -2
- package/dist/test/history-module-semantic.test.d.ts.map +0 -1
- package/dist/test/history-module-semantic.test.js +0 -213
- package/dist/test/history-module-semantic.test.js.map +0 -1
- package/dist/test/history-module-ux.test.d.ts +0 -2
- package/dist/test/history-module-ux.test.d.ts.map +0 -1
- package/dist/test/history-module-ux.test.js +0 -304
- package/dist/test/history-module-ux.test.js.map +0 -1
- package/dist/test/history-module.test.d.ts +0 -2
- package/dist/test/history-module.test.d.ts.map +0 -1
- package/dist/test/history-module.test.js +0 -619
- package/dist/test/history-module.test.js.map +0 -1
- package/dist/test/history-semantic-review-findings.test.d.ts +0 -2
- package/dist/test/history-semantic-review-findings.test.d.ts.map +0 -1
- package/dist/test/history-semantic-review-findings.test.js +0 -338
- package/dist/test/history-semantic-review-findings.test.js.map +0 -1
- package/dist/test/history-semantic-sync-converges.test.d.ts +0 -2
- package/dist/test/history-semantic-sync-converges.test.d.ts.map +0 -1
- package/dist/test/history-semantic-sync-converges.test.js +0 -109
- package/dist/test/history-semantic-sync-converges.test.js.map +0 -1
- package/dist/test/host-quiesce.test.d.ts +0 -2
- package/dist/test/host-quiesce.test.d.ts.map +0 -1
- package/dist/test/host-quiesce.test.js +0 -988
- package/dist/test/host-quiesce.test.js.map +0 -1
- package/dist/test/inference-exhaustion-rewind.test.d.ts +0 -2
- package/dist/test/inference-exhaustion-rewind.test.d.ts.map +0 -1
- package/dist/test/inference-exhaustion-rewind.test.js +0 -387
- package/dist/test/inference-exhaustion-rewind.test.js.map +0 -1
- package/dist/test/inference-failure-bounds.test.d.ts +0 -2
- package/dist/test/inference-failure-bounds.test.d.ts.map +0 -1
- package/dist/test/inference-failure-bounds.test.js +0 -1202
- package/dist/test/inference-failure-bounds.test.js.map +0 -1
- package/dist/test/inference-failure-observability.test.d.ts +0 -2
- package/dist/test/inference-failure-observability.test.d.ts.map +0 -1
- package/dist/test/inference-failure-observability.test.js +0 -84
- package/dist/test/inference-failure-observability.test.js.map +0 -1
- package/dist/test/journal-tool.test.d.ts +0 -2
- package/dist/test/journal-tool.test.d.ts.map +0 -1
- package/dist/test/journal-tool.test.js +0 -33
- package/dist/test/journal-tool.test.js.map +0 -1
- package/dist/test/kv-unified-open-flight-retry.test.d.ts +0 -2
- package/dist/test/kv-unified-open-flight-retry.test.d.ts.map +0 -1
- package/dist/test/kv-unified-open-flight-retry.test.js +0 -189
- package/dist/test/kv-unified-open-flight-retry.test.js.map +0 -1
- package/dist/test/kv-unified-wiring.test.d.ts +0 -2
- package/dist/test/kv-unified-wiring.test.d.ts.map +0 -1
- package/dist/test/kv-unified-wiring.test.js +0 -95
- package/dist/test/kv-unified-wiring.test.js.map +0 -1
- package/dist/test/late-events-after-stop.test.d.ts +0 -2
- package/dist/test/late-events-after-stop.test.d.ts.map +0 -1
- package/dist/test/late-events-after-stop.test.js +0 -122
- package/dist/test/late-events-after-stop.test.js.map +0 -1
- package/dist/test/liveness-watchdog.test.d.ts +0 -2
- package/dist/test/liveness-watchdog.test.d.ts.map +0 -1
- package/dist/test/liveness-watchdog.test.js +0 -94
- package/dist/test/liveness-watchdog.test.js.map +0 -1
- package/dist/test/machine-close-provenance.test.d.ts +0 -2
- package/dist/test/machine-close-provenance.test.d.ts.map +0 -1
- package/dist/test/machine-close-provenance.test.js +0 -116
- package/dist/test/machine-close-provenance.test.js.map +0 -1
- package/dist/test/maintenance-timer.test.d.ts +0 -2
- package/dist/test/maintenance-timer.test.d.ts.map +0 -1
- package/dist/test/maintenance-timer.test.js +0 -1827
- package/dist/test/maintenance-timer.test.js.map +0 -1
- package/dist/test/mcp-server-bin.test.d.ts +0 -2
- package/dist/test/mcp-server-bin.test.d.ts.map +0 -1
- package/dist/test/mcp-server-bin.test.js +0 -142
- package/dist/test/mcp-server-bin.test.js.map +0 -1
- package/dist/test/mcpl-access-provider.test.d.ts +0 -2
- package/dist/test/mcpl-access-provider.test.d.ts.map +0 -1
- package/dist/test/mcpl-access-provider.test.js +0 -20
- package/dist/test/mcpl-access-provider.test.js.map +0 -1
- package/dist/test/mcpl-awareness-barrier.test.d.ts +0 -2
- package/dist/test/mcpl-awareness-barrier.test.d.ts.map +0 -1
- package/dist/test/mcpl-awareness-barrier.test.js +0 -769
- package/dist/test/mcpl-awareness-barrier.test.js.map +0 -1
- package/dist/test/mcpl-capability-grant.test.d.ts +0 -10
- package/dist/test/mcpl-capability-grant.test.d.ts.map +0 -1
- package/dist/test/mcpl-capability-grant.test.js +0 -111
- package/dist/test/mcpl-capability-grant.test.js.map +0 -1
- package/dist/test/mcpl-capability-scoping.test.d.ts +0 -2
- package/dist/test/mcpl-capability-scoping.test.d.ts.map +0 -1
- package/dist/test/mcpl-capability-scoping.test.js +0 -266
- package/dist/test/mcpl-capability-scoping.test.js.map +0 -1
- package/dist/test/mcpl-child-env.test.d.ts +0 -2
- package/dist/test/mcpl-child-env.test.d.ts.map +0 -1
- package/dist/test/mcpl-child-env.test.js +0 -158
- package/dist/test/mcpl-child-env.test.js.map +0 -1
- package/dist/test/mcpl-coalesced-content-parity.test.d.ts +0 -2
- package/dist/test/mcpl-coalesced-content-parity.test.d.ts.map +0 -1
- package/dist/test/mcpl-coalesced-content-parity.test.js +0 -532
- package/dist/test/mcpl-coalesced-content-parity.test.js.map +0 -1
- package/dist/test/mcpl-coalescing.test.d.ts +0 -2
- package/dist/test/mcpl-coalescing.test.d.ts.map +0 -1
- package/dist/test/mcpl-coalescing.test.js +0 -1125
- package/dist/test/mcpl-coalescing.test.js.map +0 -1
- package/dist/test/mcpl-config-diagnostics.test.d.ts +0 -2
- package/dist/test/mcpl-config-diagnostics.test.d.ts.map +0 -1
- package/dist/test/mcpl-config-diagnostics.test.js +0 -452
- package/dist/test/mcpl-config-diagnostics.test.js.map +0 -1
- package/dist/test/mcpl-empty-content.test.d.ts +0 -2
- package/dist/test/mcpl-empty-content.test.d.ts.map +0 -1
- package/dist/test/mcpl-empty-content.test.js +0 -368
- package/dist/test/mcpl-empty-content.test.js.map +0 -1
- package/dist/test/mcpl-gate-roundtrip.test.d.ts +0 -2
- package/dist/test/mcpl-gate-roundtrip.test.d.ts.map +0 -1
- package/dist/test/mcpl-gate-roundtrip.test.js +0 -285
- package/dist/test/mcpl-gate-roundtrip.test.js.map +0 -1
- package/dist/test/mcpl-list-status.test.d.ts +0 -2
- package/dist/test/mcpl-list-status.test.d.ts.map +0 -1
- package/dist/test/mcpl-list-status.test.js +0 -82
- package/dist/test/mcpl-list-status.test.js.map +0 -1
- package/dist/test/mcpl-manifest-changed.test.d.ts +0 -2
- package/dist/test/mcpl-manifest-changed.test.d.ts.map +0 -1
- package/dist/test/mcpl-manifest-changed.test.js +0 -178
- package/dist/test/mcpl-manifest-changed.test.js.map +0 -1
- package/dist/test/mcpl-push-convert.test.d.ts +0 -2
- package/dist/test/mcpl-push-convert.test.d.ts.map +0 -1
- package/dist/test/mcpl-push-convert.test.js +0 -42
- package/dist/test/mcpl-push-convert.test.js.map +0 -1
- package/dist/test/mcpl-reconnect-events.test.d.ts +0 -2
- package/dist/test/mcpl-reconnect-events.test.d.ts.map +0 -1
- package/dist/test/mcpl-reconnect-events.test.js +0 -144
- package/dist/test/mcpl-reconnect-events.test.js.map +0 -1
- package/dist/test/mcpl-reconnect-reregistration.test.d.ts +0 -2
- package/dist/test/mcpl-reconnect-reregistration.test.d.ts.map +0 -1
- package/dist/test/mcpl-reconnect-reregistration.test.js +0 -238
- package/dist/test/mcpl-reconnect-reregistration.test.js.map +0 -1
- package/dist/test/mcpl-reference-fetcher.test.d.ts +0 -2
- package/dist/test/mcpl-reference-fetcher.test.d.ts.map +0 -1
- package/dist/test/mcpl-reference-fetcher.test.js +0 -427
- package/dist/test/mcpl-reference-fetcher.test.js.map +0 -1
- package/dist/test/mcpl-reference-fields.test.d.ts +0 -2
- package/dist/test/mcpl-reference-fields.test.d.ts.map +0 -1
- package/dist/test/mcpl-reference-fields.test.js +0 -149
- package/dist/test/mcpl-reference-fields.test.js.map +0 -1
- package/dist/test/mcpl-rejection-log-lines.test.d.ts +0 -2
- package/dist/test/mcpl-rejection-log-lines.test.d.ts.map +0 -1
- package/dist/test/mcpl-rejection-log-lines.test.js +0 -349
- package/dist/test/mcpl-rejection-log-lines.test.js.map +0 -1
- package/dist/test/mcpl-request-timeout.test.d.ts +0 -2
- package/dist/test/mcpl-request-timeout.test.d.ts.map +0 -1
- package/dist/test/mcpl-request-timeout.test.js +0 -138
- package/dist/test/mcpl-request-timeout.test.js.map +0 -1
- package/dist/test/mcpl-runtime-lifecycle.test.d.ts +0 -7
- package/dist/test/mcpl-runtime-lifecycle.test.d.ts.map +0 -1
- package/dist/test/mcpl-runtime-lifecycle.test.js +0 -142
- package/dist/test/mcpl-runtime-lifecycle.test.js.map +0 -1
- package/dist/test/mcpl-stderr-tail.test.d.ts +0 -2
- package/dist/test/mcpl-stderr-tail.test.d.ts.map +0 -1
- package/dist/test/mcpl-stderr-tail.test.js +0 -210
- package/dist/test/mcpl-stderr-tail.test.js.map +0 -1
- package/dist/test/mcpl-tool-class-listing.test.d.ts +0 -2
- package/dist/test/mcpl-tool-class-listing.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-class-listing.test.js +0 -147
- package/dist/test/mcpl-tool-class-listing.test.js.map +0 -1
- package/dist/test/mcpl-tool-classes.test.d.ts +0 -7
- package/dist/test/mcpl-tool-classes.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-classes.test.js +0 -80
- package/dist/test/mcpl-tool-classes.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts +0 -2
- package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-e2e.test.js +0 -237
- package/dist/test/mcpl-tool-lifecycle-e2e.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts +0 -11
- package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-emitter.test.js +0 -412
- package/dist/test/mcpl-tool-lifecycle-emitter.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-script.test.d.ts +0 -2
- package/dist/test/mcpl-tool-lifecycle-script.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-script.test.js +0 -288
- package/dist/test/mcpl-tool-lifecycle-script.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle.test.d.ts +0 -11
- package/dist/test/mcpl-tool-lifecycle.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle.test.js +0 -270
- package/dist/test/mcpl-tool-lifecycle.test.js.map +0 -1
- package/dist/test/mcpl-transport-close.test.d.ts +0 -2
- package/dist/test/mcpl-transport-close.test.d.ts.map +0 -1
- package/dist/test/mcpl-transport-close.test.js +0 -373
- package/dist/test/mcpl-transport-close.test.js.map +0 -1
- package/dist/test/mcpl-transport-spawn.test.d.ts +0 -2
- package/dist/test/mcpl-transport-spawn.test.d.ts.map +0 -1
- package/dist/test/mcpl-transport-spawn.test.js +0 -58
- package/dist/test/mcpl-transport-spawn.test.js.map +0 -1
- package/dist/test/mcpl-ws-transport.test.d.ts +0 -2
- package/dist/test/mcpl-ws-transport.test.d.ts.map +0 -1
- package/dist/test/mcpl-ws-transport.test.js +0 -259
- package/dist/test/mcpl-ws-transport.test.js.map +0 -1
- package/dist/test/module-context-integration.test.d.ts +0 -18
- package/dist/test/module-context-integration.test.d.ts.map +0 -1
- package/dist/test/module-context-integration.test.js +0 -181
- package/dist/test/module-context-integration.test.js.map +0 -1
- package/dist/test/offline-recovery-branch.test.d.ts +0 -2
- package/dist/test/offline-recovery-branch.test.d.ts.map +0 -1
- package/dist/test/offline-recovery-branch.test.js +0 -570
- package/dist/test/offline-recovery-branch.test.js.map +0 -1
- package/dist/test/operator-surgery.test.d.ts +0 -2
- package/dist/test/operator-surgery.test.d.ts.map +0 -1
- package/dist/test/operator-surgery.test.js +0 -595
- package/dist/test/operator-surgery.test.js.map +0 -1
- package/dist/test/ops-alert.test.d.ts +0 -2
- package/dist/test/ops-alert.test.d.ts.map +0 -1
- package/dist/test/ops-alert.test.js +0 -153
- package/dist/test/ops-alert.test.js.map +0 -1
- package/dist/test/overbudget-drain-breaker.test.d.ts +0 -2
- package/dist/test/overbudget-drain-breaker.test.d.ts.map +0 -1
- package/dist/test/overbudget-drain-breaker.test.js +0 -198
- package/dist/test/overbudget-drain-breaker.test.js.map +0 -1
- package/dist/test/pack-installs-alone.test.d.ts +0 -2
- package/dist/test/pack-installs-alone.test.d.ts.map +0 -1
- package/dist/test/pack-installs-alone.test.js +0 -284
- package/dist/test/pack-installs-alone.test.js.map +0 -1
- package/dist/test/per-agent-delivery.test.d.ts +0 -2
- package/dist/test/per-agent-delivery.test.d.ts.map +0 -1
- package/dist/test/per-agent-delivery.test.js +0 -108
- package/dist/test/per-agent-delivery.test.js.map +0 -1
- package/dist/test/physical-window-restart.test.d.ts +0 -16
- package/dist/test/physical-window-restart.test.d.ts.map +0 -1
- package/dist/test/physical-window-restart.test.js +0 -487
- package/dist/test/physical-window-restart.test.js.map +0 -1
- package/dist/test/placed-reaction-baseline.test.d.ts +0 -2
- package/dist/test/placed-reaction-baseline.test.d.ts.map +0 -1
- package/dist/test/placed-reaction-baseline.test.js +0 -312
- package/dist/test/placed-reaction-baseline.test.js.map +0 -1
- package/dist/test/present-while-acting.test.d.ts +0 -19
- package/dist/test/present-while-acting.test.d.ts.map +0 -1
- package/dist/test/present-while-acting.test.js +0 -1649
- package/dist/test/present-while-acting.test.js.map +0 -1
- package/dist/test/prose-segments.test.d.ts +0 -2
- package/dist/test/prose-segments.test.d.ts.map +0 -1
- package/dist/test/prose-segments.test.js +0 -52
- package/dist/test/prose-segments.test.js.map +0 -1
- package/dist/test/prose-stream-router.test.d.ts +0 -2
- package/dist/test/prose-stream-router.test.d.ts.map +0 -1
- package/dist/test/prose-stream-router.test.js +0 -171
- package/dist/test/prose-stream-router.test.js.map +0 -1
- package/dist/test/provider-acceleration-cooldown.test.d.ts +0 -2
- package/dist/test/provider-acceleration-cooldown.test.d.ts.map +0 -1
- package/dist/test/provider-acceleration-cooldown.test.js +0 -435
- package/dist/test/provider-acceleration-cooldown.test.js.map +0 -1
- package/dist/test/provider-waits.test.d.ts +0 -2
- package/dist/test/provider-waits.test.d.ts.map +0 -1
- package/dist/test/provider-waits.test.js +0 -2259
- package/dist/test/provider-waits.test.js.map +0 -1
- package/dist/test/puppet-tool-call.test.d.ts +0 -2
- package/dist/test/puppet-tool-call.test.d.ts.map +0 -1
- package/dist/test/puppet-tool-call.test.js +0 -226
- package/dist/test/puppet-tool-call.test.js.map +0 -1
- package/dist/test/puppet-turn-reservation.test.d.ts +0 -2
- package/dist/test/puppet-turn-reservation.test.d.ts.map +0 -1
- package/dist/test/puppet-turn-reservation.test.js +0 -139
- package/dist/test/puppet-turn-reservation.test.js.map +0 -1
- package/dist/test/reaction-baseline-platform.test.d.ts +0 -2
- package/dist/test/reaction-baseline-platform.test.d.ts.map +0 -1
- package/dist/test/reaction-baseline-platform.test.js +0 -124
- package/dist/test/reaction-baseline-platform.test.js.map +0 -1
- package/dist/test/record-journal.test.d.ts +0 -6
- package/dist/test/record-journal.test.d.ts.map +0 -1
- package/dist/test/record-journal.test.js +0 -269
- package/dist/test/record-journal.test.js.map +0 -1
- package/dist/test/refusal-reaction-baseline.test.d.ts +0 -2
- package/dist/test/refusal-reaction-baseline.test.d.ts.map +0 -1
- package/dist/test/refusal-reaction-baseline.test.js +0 -81
- package/dist/test/refusal-reaction-baseline.test.js.map +0 -1
- package/dist/test/refusal-rewind.test.d.ts +0 -2
- package/dist/test/refusal-rewind.test.d.ts.map +0 -1
- package/dist/test/refusal-rewind.test.js +0 -117
- package/dist/test/refusal-rewind.test.js.map +0 -1
- package/dist/test/refusal-single-call.test.d.ts +0 -2
- package/dist/test/refusal-single-call.test.d.ts.map +0 -1
- package/dist/test/refusal-single-call.test.js +0 -177
- package/dist/test/refusal-single-call.test.js.map +0 -1
- package/dist/test/release-bump.test.d.ts +0 -2
- package/dist/test/release-bump.test.d.ts.map +0 -1
- package/dist/test/release-bump.test.js +0 -248
- package/dist/test/release-bump.test.js.map +0 -1
- package/dist/test/release-changelog.test.d.ts +0 -2
- package/dist/test/release-changelog.test.d.ts.map +0 -1
- package/dist/test/release-changelog.test.js +0 -159
- package/dist/test/release-changelog.test.js.map +0 -1
- package/dist/test/release-holds.test.d.ts +0 -2
- package/dist/test/release-holds.test.d.ts.map +0 -1
- package/dist/test/release-holds.test.js +0 -456
- package/dist/test/release-holds.test.js.map +0 -1
- package/dist/test/same-round-think-policy.test.d.ts +0 -2
- package/dist/test/same-round-think-policy.test.d.ts.map +0 -1
- package/dist/test/same-round-think-policy.test.js +0 -853
- package/dist/test/same-round-think-policy.test.js.map +0 -1
- package/dist/test/save-recent-image.test.d.ts +0 -26
- package/dist/test/save-recent-image.test.d.ts.map +0 -1
- package/dist/test/save-recent-image.test.js +0 -974
- package/dist/test/save-recent-image.test.js.map +0 -1
- package/dist/test/shutdown-errors.test.d.ts +0 -2
- package/dist/test/shutdown-errors.test.d.ts.map +0 -1
- package/dist/test/shutdown-errors.test.js +0 -662
- package/dist/test/shutdown-errors.test.js.map +0 -1
- package/dist/test/silent-heartbeat-rows.test.d.ts +0 -2
- package/dist/test/silent-heartbeat-rows.test.d.ts.map +0 -1
- package/dist/test/silent-heartbeat-rows.test.js +0 -451
- package/dist/test/silent-heartbeat-rows.test.js.map +0 -1
- package/dist/test/silent-heartbeat.test.d.ts +0 -2
- package/dist/test/silent-heartbeat.test.d.ts.map +0 -1
- package/dist/test/silent-heartbeat.test.js +0 -165
- package/dist/test/silent-heartbeat.test.js.map +0 -1
- package/dist/test/state-scaling-e2e.test.d.ts +0 -22
- package/dist/test/state-scaling-e2e.test.d.ts.map +0 -1
- package/dist/test/state-scaling-e2e.test.js +0 -206
- package/dist/test/state-scaling-e2e.test.js.map +0 -1
- package/dist/test/state-scaling.test.d.ts +0 -12
- package/dist/test/state-scaling.test.d.ts.map +0 -1
- package/dist/test/state-scaling.test.js +0 -251
- package/dist/test/state-scaling.test.js.map +0 -1
- package/dist/test/stop-with-host-operations.test.d.ts +0 -20
- package/dist/test/stop-with-host-operations.test.d.ts.map +0 -1
- package/dist/test/stop-with-host-operations.test.js +0 -1174
- package/dist/test/stop-with-host-operations.test.js.map +0 -1
- package/dist/test/stop-with-work-in-flight.test.d.ts +0 -23
- package/dist/test/stop-with-work-in-flight.test.d.ts.map +0 -1
- package/dist/test/stop-with-work-in-flight.test.js +0 -784
- package/dist/test/stop-with-work-in-flight.test.js.map +0 -1
- package/dist/test/surgery-marks-receipt.test.d.ts +0 -2
- package/dist/test/surgery-marks-receipt.test.d.ts.map +0 -1
- package/dist/test/surgery-marks-receipt.test.js +0 -540
- package/dist/test/surgery-marks-receipt.test.js.map +0 -1
- package/dist/test/thinking-token-stamp.test.d.ts +0 -12
- package/dist/test/thinking-token-stamp.test.d.ts.map +0 -1
- package/dist/test/thinking-token-stamp.test.js +0 -129
- package/dist/test/thinking-token-stamp.test.js.map +0 -1
- package/dist/test/timezone.test.d.ts +0 -2
- package/dist/test/timezone.test.d.ts.map +0 -1
- package/dist/test/timezone.test.js +0 -18
- package/dist/test/timezone.test.js.map +0 -1
- package/dist/test/tool-batch-hook.test.d.ts +0 -8
- package/dist/test/tool-batch-hook.test.d.ts.map +0 -1
- package/dist/test/tool-batch-hook.test.js +0 -275
- package/dist/test/tool-batch-hook.test.js.map +0 -1
- package/dist/test/tool-policy.test.d.ts +0 -2
- package/dist/test/tool-policy.test.d.ts.map +0 -1
- package/dist/test/tool-policy.test.js +0 -51
- package/dist/test/tool-policy.test.js.map +0 -1
- package/dist/test/tool-presentation.test.d.ts +0 -2
- package/dist/test/tool-presentation.test.d.ts.map +0 -1
- package/dist/test/tool-presentation.test.js +0 -268
- package/dist/test/tool-presentation.test.js.map +0 -1
- package/dist/test/tool-result-content.test.d.ts +0 -2
- package/dist/test/tool-result-content.test.d.ts.map +0 -1
- package/dist/test/tool-result-content.test.js +0 -37
- package/dist/test/tool-result-content.test.js.map +0 -1
- package/dist/test/tool-result-guard.test.d.ts +0 -2
- package/dist/test/tool-result-guard.test.d.ts.map +0 -1
- package/dist/test/tool-result-guard.test.js +0 -3729
- package/dist/test/tool-result-guard.test.js.map +0 -1
- package/dist/test/tool-result-history.test.d.ts +0 -7
- package/dist/test/tool-result-history.test.d.ts.map +0 -1
- package/dist/test/tool-result-history.test.js +0 -156
- package/dist/test/tool-result-history.test.js.map +0 -1
- package/dist/test/tool-result-spill.test.d.ts +0 -13
- package/dist/test/tool-result-spill.test.d.ts.map +0 -1
- package/dist/test/tool-result-spill.test.js +0 -586
- package/dist/test/tool-result-spill.test.js.map +0 -1
- package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts +0 -2
- package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts.map +0 -1
- package/dist/test/tool-wrapper-prose-guard-integration.test.js +0 -485
- package/dist/test/tool-wrapper-prose-guard-integration.test.js.map +0 -1
- package/dist/test/tool-wrapper-prose-guard.test.d.ts +0 -2
- package/dist/test/tool-wrapper-prose-guard.test.d.ts.map +0 -1
- package/dist/test/tool-wrapper-prose-guard.test.js +0 -34
- package/dist/test/tool-wrapper-prose-guard.test.js.map +0 -1
- package/dist/test/tools-observe-parser-conformance.test.d.ts +0 -2
- package/dist/test/tools-observe-parser-conformance.test.d.ts.map +0 -1
- package/dist/test/tools-observe-parser-conformance.test.js +0 -129
- package/dist/test/tools-observe-parser-conformance.test.js.map +0 -1
- package/dist/test/trunk-channel-routing.test.d.ts +0 -19
- package/dist/test/trunk-channel-routing.test.d.ts.map +0 -1
- package/dist/test/trunk-channel-routing.test.js +0 -652
- package/dist/test/trunk-channel-routing.test.js.map +0 -1
- package/dist/test/tune-out-e2e.test.d.ts +0 -2
- package/dist/test/tune-out-e2e.test.d.ts.map +0 -1
- package/dist/test/tune-out-e2e.test.js +0 -142
- package/dist/test/tune-out-e2e.test.js.map +0 -1
- package/dist/test/tune-out-gate-composition.test.d.ts +0 -2
- package/dist/test/tune-out-gate-composition.test.d.ts.map +0 -1
- package/dist/test/tune-out-gate-composition.test.js +0 -221
- package/dist/test/tune-out-gate-composition.test.js.map +0 -1
- package/dist/test/tune-out-lifecycle.test.d.ts +0 -2
- package/dist/test/tune-out-lifecycle.test.d.ts.map +0 -1
- package/dist/test/tune-out-lifecycle.test.js +0 -121
- package/dist/test/tune-out-lifecycle.test.js.map +0 -1
- package/dist/test/turn-trigger-provenance.test.d.ts +0 -2
- package/dist/test/turn-trigger-provenance.test.d.ts.map +0 -1
- package/dist/test/turn-trigger-provenance.test.js +0 -137
- package/dist/test/turn-trigger-provenance.test.js.map +0 -1
- package/dist/test/unconvertible-tool-result.test.d.ts +0 -2
- package/dist/test/unconvertible-tool-result.test.d.ts.map +0 -1
- package/dist/test/unconvertible-tool-result.test.js +0 -358
- package/dist/test/unconvertible-tool-result.test.js.map +0 -1
- package/dist/test/unsent-compiles.test.d.ts +0 -2
- package/dist/test/unsent-compiles.test.d.ts.map +0 -1
- package/dist/test/unsent-compiles.test.js +0 -139
- package/dist/test/unsent-compiles.test.js.map +0 -1
- package/dist/test/usage-accounting.test.d.ts +0 -2
- package/dist/test/usage-accounting.test.d.ts.map +0 -1
- package/dist/test/usage-accounting.test.js +0 -13
- package/dist/test/usage-accounting.test.js.map +0 -1
- package/dist/test/usage-tracker.test.d.ts +0 -2
- package/dist/test/usage-tracker.test.d.ts.map +0 -1
- package/dist/test/usage-tracker.test.js +0 -129
- package/dist/test/usage-tracker.test.js.map +0 -1
- package/dist/test/utils-surface.test.d.ts +0 -2
- package/dist/test/utils-surface.test.d.ts.map +0 -1
- package/dist/test/utils-surface.test.js +0 -145
- package/dist/test/utils-surface.test.js.map +0 -1
- package/dist/test/workspace-branch-continuation.test.d.ts +0 -15
- package/dist/test/workspace-branch-continuation.test.d.ts.map +0 -1
- package/dist/test/workspace-branch-continuation.test.js +0 -183
- package/dist/test/workspace-branch-continuation.test.js.map +0 -1
- package/dist/test/workspace-materialize-freshness.test.d.ts +0 -16
- package/dist/test/workspace-materialize-freshness.test.d.ts.map +0 -1
- package/dist/test/workspace-materialize-freshness.test.js +0 -252
- package/dist/test/workspace-materialize-freshness.test.js.map +0 -1
- package/dist/test/workspace-path-containment.test.d.ts +0 -19
- package/dist/test/workspace-path-containment.test.d.ts.map +0 -1
- package/dist/test/workspace-path-containment.test.js +0 -91
- package/dist/test/workspace-path-containment.test.js.map +0 -1
- package/dist/test/workspace-read-file-from-disk.test.d.ts +0 -17
- package/dist/test/workspace-read-file-from-disk.test.d.ts.map +0 -1
- package/dist/test/workspace-read-file-from-disk.test.js +0 -174
- package/dist/test/workspace-read-file-from-disk.test.js.map +0 -1
- package/dist/test/workspace-read-image.test.d.ts +0 -2
- package/dist/test/workspace-read-image.test.d.ts.map +0 -1
- package/dist/test/workspace-read-image.test.js +0 -597
- package/dist/test/workspace-read-image.test.js.map +0 -1
- package/dist/test/workspace-read-text.test.d.ts +0 -2
- package/dist/test/workspace-read-text.test.d.ts.map +0 -1
- package/dist/test/workspace-read-text.test.js +0 -101
- package/dist/test/workspace-read-text.test.js.map +0 -1
- package/dist/test/workspace-restore-order.test.d.ts +0 -16
- package/dist/test/workspace-restore-order.test.d.ts.map +0 -1
- package/dist/test/workspace-restore-order.test.js +0 -140
- package/dist/test/workspace-restore-order.test.js.map +0 -1
- package/dist/test/workspace-three-way.test.d.ts +0 -12
- package/dist/test/workspace-three-way.test.d.ts.map +0 -1
- package/dist/test/workspace-three-way.test.js +0 -4094
- package/dist/test/workspace-three-way.test.js.map +0 -1
- package/dist/test/workspace-watcher.test.d.ts +0 -2
- package/dist/test/workspace-watcher.test.d.ts.map +0 -1
- package/dist/test/workspace-watcher.test.js +0 -281
- package/dist/test/workspace-watcher.test.js.map +0 -1
- package/dist/test/xml-round-persist.test.d.ts +0 -19
- package/dist/test/xml-round-persist.test.d.ts.map +0 -1
- package/dist/test/xml-round-persist.test.js +0 -235
- package/dist/test/xml-round-persist.test.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -15,10 +15,12 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';
|
|
18
|
+
import { buildChildEnv } from '../mcpl/transport.js';
|
|
18
19
|
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
19
20
|
import { tmpdir } from 'node:os';
|
|
20
|
-
import { join } from 'node:path';
|
|
21
|
+
import { join, resolve } from 'node:path';
|
|
21
22
|
import { createInterface, type Interface } from 'node:readline';
|
|
23
|
+
import { boundedErrorMessage } from '../error-message.js';
|
|
22
24
|
import { PYTHON_RUNTIME_SOURCE } from './runtime-py.js';
|
|
23
25
|
|
|
24
26
|
export interface InjectedTool {
|
|
@@ -53,11 +55,30 @@ export interface BackgroundExecOptions {
|
|
|
53
55
|
lifetimeMs: number;
|
|
54
56
|
}
|
|
55
57
|
|
|
56
|
-
/**
|
|
58
|
+
/**
|
|
59
|
+
* An inner tool call's result as the script gets it. `text` is the string
|
|
60
|
+
* its await returns, and the runner sets `.is_error` on that string from
|
|
61
|
+
* `isError`. With `structuredJson`, `text` is the JSON object a structured
|
|
62
|
+
* result reaches a script as, in any of its forms, and `.structured` reads
|
|
63
|
+
* its `structuredContent`, None for a form that holds none, such as one past
|
|
64
|
+
* the size cap; without it, `.structured` is None.
|
|
65
|
+
*/
|
|
66
|
+
export interface ScriptToolResult {
|
|
67
|
+
text: string;
|
|
68
|
+
isError: boolean;
|
|
69
|
+
structuredJson?: boolean;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Resolves inner tool calls. Must never reject — map errors to results; a
|
|
74
|
+
* rejection reaches the script as an `Error: …` result. A plain string is
|
|
75
|
+
* the result's text with nothing said about it, so the script's
|
|
76
|
+
* `.is_error` and `.structured` are None.
|
|
77
|
+
*/
|
|
57
78
|
export type ScriptToolCallHandler = (
|
|
58
79
|
toolName: string,
|
|
59
80
|
args: Record<string, unknown>,
|
|
60
|
-
) => Promise<string>;
|
|
81
|
+
) => Promise<string | ScriptToolResult>;
|
|
61
82
|
|
|
62
83
|
export interface PyRunnerOptions {
|
|
63
84
|
pythonPath?: string;
|
|
@@ -72,6 +93,19 @@ export interface PyRunnerOptions {
|
|
|
72
93
|
onToolCall: ScriptToolCallHandler;
|
|
73
94
|
/** Log prefix, typically the agent name. */
|
|
74
95
|
label?: string;
|
|
96
|
+
/** Variables for the interpreter beyond what it inherits, such as
|
|
97
|
+
* PYTHONPATH or a venv's. It inherits only what stdio MCPL children do
|
|
98
|
+
* (CHILD_ENV_ALLOWLIST and LC_*, CA bundles and proxy variables among
|
|
99
|
+
* them, and a proxy URL can carry credentials), then these, then
|
|
100
|
+
* PYTHONUNBUFFERED and PYTHONIOENCODING, which the runner sets last.
|
|
101
|
+
* Like the allowlist, this limits what the model's code inherits, not
|
|
102
|
+
* what a process running as the same user can read. */
|
|
103
|
+
env?: Record<string, string>;
|
|
104
|
+
/** Pass the host's whole environment instead of the allowlist, as before
|
|
105
|
+
* `env` existed. That hands every host variable, provider keys included,
|
|
106
|
+
* to the model's code and to every subprocess a script starts; listing
|
|
107
|
+
* what scripts need in `env` is the safer route. */
|
|
108
|
+
inheritEnv?: boolean;
|
|
75
109
|
}
|
|
76
110
|
|
|
77
111
|
const DEFAULT_TOOL_CALL_TIMEOUT_MS = 270_000;
|
|
@@ -91,6 +125,56 @@ export function formatLimit(ms: number): string {
|
|
|
91
125
|
return `${Math.round(ms / 360_000) / 10} h`;
|
|
92
126
|
}
|
|
93
127
|
|
|
128
|
+
/**
|
|
129
|
+
* What a script stopped at its time limit is told after why: that the tool
|
|
130
|
+
* calls it made keep their effects, and whether a longer limit can help,
|
|
131
|
+
* which only the deployment's ceiling for its kind of script can say. A
|
|
132
|
+
* foreground script at its ceiling is offered background mode too, when its
|
|
133
|
+
* caller passes `backgroundCeilingMs` (the framework does for an agent that
|
|
134
|
+
* could start a background script as the script starts) and a background
|
|
135
|
+
* script may run longer.
|
|
136
|
+
*/
|
|
137
|
+
function limitRemedy(limitMs: number, ceilingMs: number | undefined, background: boolean, backgroundCeilingMs?: number): string {
|
|
138
|
+
const effects = 'Tool calls it had already made keep their effects, so check them before running it again.';
|
|
139
|
+
if (ceilingMs === undefined) return effects;
|
|
140
|
+
if (limitMs < ceilingMs) return `${effects} To give it longer, ${background ? 'start it with' : 'pass'} time_limit_ms up to ${ceilingMs} (${formatLimit(ceilingMs)}).`;
|
|
141
|
+
if (background) return `${effects} ${formatLimit(limitMs)} is the longest a background script runs here; starting it again runs it from the top.`;
|
|
142
|
+
const inBackground = backgroundCeilingMs !== undefined && backgroundCeilingMs > limitMs
|
|
143
|
+
? `, or run it with background: true, where a script can run up to ${formatLimit(backgroundCeilingMs)}` : '';
|
|
144
|
+
return `${effects} ${formatLimit(limitMs)} is the longest a script can run here, so split the work across shorter scripts${inBackground}.`;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Why a script didn't run when its interpreter didn't start. A spawn that
|
|
149
|
+
* found nothing it could run (ENOENT, EACCES) fails the same way until the
|
|
150
|
+
* host changes, so that one says code_execution can't run here rather than
|
|
151
|
+
* to try again. A failure before the spawn, while creating or writing the
|
|
152
|
+
* runtime's files, is about those files rather than the interpreter, and
|
|
153
|
+
* keeps Node's own text, which names the path for an open or a mkdtemp.
|
|
154
|
+
*/
|
|
155
|
+
function startFailure(pythonPath: string, err: unknown): string {
|
|
156
|
+
const { code, syscall } = (err ?? {}) as { code?: unknown; syscall?: unknown };
|
|
157
|
+
const spawning = typeof syscall === 'string' && syscall.startsWith('spawn');
|
|
158
|
+
if (spawning && (code === 'ENOENT' || code === 'EACCES')) {
|
|
159
|
+
const until = code === 'ENOENT' ? 'installs it or points this host at one' : 'makes it executable or points this host at another';
|
|
160
|
+
return `script didn't run: this host can't start its Python interpreter, ${pythonPath} (${code}), so code_execution can't run scripts here until whoever runs this host ${until}. Calling it again before then fails the same way.`;
|
|
161
|
+
}
|
|
162
|
+
if (typeof syscall === 'string' && !spawning) {
|
|
163
|
+
return `script didn't run: this host couldn't create or write the files its Python runtime starts from (${boundedErrorMessage(err)}), so none of the script ran. Run it again; if it fails the same way, ask whoever runs this host.`;
|
|
164
|
+
}
|
|
165
|
+
const why = typeof code === 'string' ? `couldn't be started (${code})` : boundedErrorMessage(err);
|
|
166
|
+
return `script didn't run: the Python interpreter, ${pythonPath}, ${why}, so none of the script ran. Run it again; if it fails the same way, ask whoever runs this host.`;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** Why a script stopped when its interpreter exited under it, and what running it again does. */
|
|
170
|
+
function interpreterExit(exitCode: number | null, signal: NodeJS.Signals | null, background: boolean): string {
|
|
171
|
+
const how = signal ? `was ended by ${signal}` : `exited with code ${exitCode}`;
|
|
172
|
+
return `script stopped: the Python interpreter ${how} while it ran, so the rest of the script didn't run`
|
|
173
|
+
+ `${background ? '' : ', and variables from earlier scripts are gone'}. Tool calls it had already made keep their effects, `
|
|
174
|
+
+ 'so check them before you run it again in a new interpreter. If it stops the same way, check whether the script itself '
|
|
175
|
+
+ `ends the process, for example ${signal ? 'by using too much memory' : 'with os._exit()'}; if not, ask whoever runs this host.`;
|
|
176
|
+
}
|
|
177
|
+
|
|
94
178
|
interface PendingExec {
|
|
95
179
|
id: string;
|
|
96
180
|
resolve: (result: ExecResult) => void;
|
|
@@ -101,6 +185,27 @@ interface PendingExec {
|
|
|
101
185
|
settled: boolean;
|
|
102
186
|
/** Set once the deadline fired: the result then says the script ran out of time. */
|
|
103
187
|
deadlineMs: number | null;
|
|
188
|
+
/** The longest limit this exec could have had (exec's opts): whether a longer one would help. */
|
|
189
|
+
ceilingMs: number | undefined;
|
|
190
|
+
/** For a foreground exec, the longest a background script may run (exec's opts): whether background mode would help. */
|
|
191
|
+
backgroundCeilingMs: number | undefined;
|
|
192
|
+
/** A background exec has its interpreter to itself, so no earlier script's state is lost with it. */
|
|
193
|
+
background: boolean;
|
|
194
|
+
/** Set once the script went to the interpreter. Before that, the exec is
|
|
195
|
+
* waiting for the interpreter to start, and an interpreter that exits then
|
|
196
|
+
* failed to start (see exec). */
|
|
197
|
+
sent: boolean;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* The interpreter to spawn. A bare name is looked up on PATH. A path with a
|
|
202
|
+
* separator is resolved against the host's working directory, where it
|
|
203
|
+
* resolved before the interpreter got a working directory of its own: spawn
|
|
204
|
+
* would resolve it against the runtime directory instead.
|
|
205
|
+
*/
|
|
206
|
+
function spawnablePath(pythonPath: string): string {
|
|
207
|
+
const hasSeparator = pythonPath.includes('/') || (process.platform === 'win32' && pythonPath.includes('\\'));
|
|
208
|
+
return hasSeparator ? resolve(pythonPath) : pythonPath;
|
|
104
209
|
}
|
|
105
210
|
|
|
106
211
|
export class PyRunner {
|
|
@@ -111,6 +216,7 @@ export class PyRunner {
|
|
|
111
216
|
private readonly idleReclaimMs: number;
|
|
112
217
|
private readonly onToolCall: ScriptToolCallHandler;
|
|
113
218
|
private readonly label: string;
|
|
219
|
+
private readonly envOptions: { env?: Record<string, string>; inheritEnv?: boolean };
|
|
114
220
|
|
|
115
221
|
private onWake: ((line: number, payload: unknown) => Promise<string | null>) | null = null;
|
|
116
222
|
private child: ChildProcessWithoutNullStreams | null = null;
|
|
@@ -121,8 +227,6 @@ export class PyRunner {
|
|
|
121
227
|
private idleTimer: ReturnType<typeof setTimeout> | null = null;
|
|
122
228
|
private execCounter = 0;
|
|
123
229
|
private disposed = false;
|
|
124
|
-
/** An exec has passed the busy check but is still awaiting the interpreter. */
|
|
125
|
-
private starting = false;
|
|
126
230
|
|
|
127
231
|
constructor(options: PyRunnerOptions) {
|
|
128
232
|
this.pythonPath = options.pythonPath ?? 'python3';
|
|
@@ -132,10 +236,16 @@ export class PyRunner {
|
|
|
132
236
|
this.idleReclaimMs = options.idleReclaimMs ?? DEFAULT_IDLE_RECLAIM_MS;
|
|
133
237
|
this.onToolCall = options.onToolCall;
|
|
134
238
|
this.label = options.label ?? 'pytc';
|
|
239
|
+
// The interpreter runs model-authored code: the same env discipline as an
|
|
240
|
+
// MCPL connector child (#175), for a child that deserves it more. Stored
|
|
241
|
+
// as options, not a snapshot — the env is rebuilt at every spawn so a
|
|
242
|
+
// respawn after idle reclaim sees current host values, as the old
|
|
243
|
+
// per-spawn `{ ...process.env }` did.
|
|
244
|
+
this.envOptions = { env: options.env, inheritEnv: options.inheritEnv };
|
|
135
245
|
}
|
|
136
246
|
|
|
137
247
|
get busy(): boolean {
|
|
138
|
-
return this.pending !== null
|
|
248
|
+
return this.pending !== null;
|
|
139
249
|
}
|
|
140
250
|
|
|
141
251
|
/**
|
|
@@ -150,12 +260,18 @@ export class PyRunner {
|
|
|
150
260
|
*
|
|
151
261
|
* `opts.deadlineMs` replaces the runner's scriptTimeoutMs for this exec (a
|
|
152
262
|
* per-call time limit); a background exec uses its `lifetimeMs` instead.
|
|
263
|
+
* `opts.ceilingMs` is the longest limit the deployment allows this kind of
|
|
264
|
+
* script: a script stopped at its limit is offered a longer one only below
|
|
265
|
+
* it. Without it, the stop doesn't say whether a longer limit would help.
|
|
266
|
+
* `opts.backgroundCeilingMs`, for a foreground exec, is the longest a
|
|
267
|
+
* background script may run: one stopped at its ceiling is offered
|
|
268
|
+
* background mode when that is longer.
|
|
153
269
|
*/
|
|
154
270
|
async exec(
|
|
155
271
|
code: string,
|
|
156
272
|
tools: InjectedTool[],
|
|
157
273
|
background?: BackgroundExecOptions,
|
|
158
|
-
opts?: { deadlineMs?: number },
|
|
274
|
+
opts?: { deadlineMs?: number; ceilingMs?: number; backgroundCeilingMs?: number },
|
|
159
275
|
): Promise<ExecResult> {
|
|
160
276
|
if (this.disposed) {
|
|
161
277
|
return { stdout: '', stderr: 'code_execution runner disposed', returnCode: 1, aborted: true };
|
|
@@ -163,83 +279,98 @@ export class PyRunner {
|
|
|
163
279
|
if (this.busy) {
|
|
164
280
|
return {
|
|
165
281
|
stdout: '',
|
|
166
|
-
stderr: '
|
|
282
|
+
stderr: "script didn't run: another code_execution script of yours is already running, and they run one at a time. "
|
|
283
|
+
+ 'Run this one again once that one has finished, or combine the two into one script.',
|
|
167
284
|
returnCode: 1,
|
|
168
285
|
aborted: true,
|
|
169
286
|
};
|
|
170
287
|
}
|
|
171
288
|
this.clearIdleTimer();
|
|
172
289
|
|
|
173
|
-
|
|
290
|
+
// The exec claims the runner before the await: a same-tick second exec
|
|
291
|
+
// sees it busy, and abort() or dispose() while the interpreter starts
|
|
292
|
+
// settles this exec, whose script then never runs.
|
|
293
|
+
let resolveResult!: (result: ExecResult) => void;
|
|
294
|
+
const settled = new Promise<ExecResult>((resolve) => {
|
|
295
|
+
resolveResult = resolve;
|
|
296
|
+
});
|
|
297
|
+
const pending: PendingExec = {
|
|
298
|
+
id: `e${++this.execCounter}`,
|
|
299
|
+
resolve: resolveResult,
|
|
300
|
+
deadlineTimer: null,
|
|
301
|
+
killTimer: null,
|
|
302
|
+
settled: false,
|
|
303
|
+
deadlineMs: null,
|
|
304
|
+
ceilingMs: opts?.ceilingMs,
|
|
305
|
+
backgroundCeilingMs: opts?.backgroundCeilingMs,
|
|
306
|
+
background: background !== undefined,
|
|
307
|
+
sent: false,
|
|
308
|
+
};
|
|
309
|
+
this.pending = pending;
|
|
174
310
|
try {
|
|
175
311
|
await this.ensureChild();
|
|
176
312
|
} catch (err) {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
313
|
+
// Settled already when an abort or dispose reclaimed the interpreter
|
|
314
|
+
// as it started; another exec may have claimed the runner since.
|
|
315
|
+
if (!pending.settled) {
|
|
316
|
+
this.settlePending({
|
|
317
|
+
stdout: '',
|
|
318
|
+
stderr: startFailure(this.pythonPath, err),
|
|
319
|
+
returnCode: 1,
|
|
320
|
+
aborted: true,
|
|
321
|
+
});
|
|
322
|
+
this.reclaim('spawn-failed');
|
|
323
|
+
}
|
|
324
|
+
return settled;
|
|
187
325
|
}
|
|
326
|
+
if (pending.settled) return settled;
|
|
188
327
|
|
|
189
|
-
const execId =
|
|
328
|
+
const execId = pending.id;
|
|
190
329
|
// Clamped: a deadline past Node's timer range would fire at once instead of never.
|
|
191
330
|
const deadlineMs = Math.min(MAX_TIMER_MS, background?.lifetimeMs ?? opts?.deadlineMs ?? this.scriptTimeoutMs);
|
|
192
331
|
this.onWake = background?.onWake ?? null;
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
this.
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
if (background) pending.deadlineTimer.unref?.();
|
|
232
|
-
|
|
233
|
-
this.send({
|
|
234
|
-
op: 'init',
|
|
235
|
-
tools: tools.map((t) => ({ py_name: t.pyName, tool_name: t.toolName })),
|
|
236
|
-
call_timeout_s: Math.round(this.toolCallTimeoutMs / 1000),
|
|
237
|
-
...(background
|
|
238
|
-
? { background: true, log_path: background.logPath ?? null }
|
|
239
|
-
: {}),
|
|
240
|
-
});
|
|
241
|
-
this.send({ op: 'exec', id: execId, code });
|
|
332
|
+
pending.deadlineTimer = setTimeout(() => {
|
|
333
|
+
pending.deadlineMs = deadlineMs;
|
|
334
|
+
// Deadline: ask politely first (script sees CancelledError and its
|
|
335
|
+
// exec_result still flows back), then kill on unresponsiveness.
|
|
336
|
+
this.send({ op: 'cancel', id: execId, reason: 'deadline' });
|
|
337
|
+
// The cancel lands only when the script awaits. Blocking code (time.sleep, a
|
|
338
|
+
// busy loop, a blocking read) never does, so interrupt it as well: the runtime
|
|
339
|
+
// raises KeyboardInterrupt in the script's own code, or schedules the
|
|
340
|
+
// cancellation of a script that is waiting. Repeated, because a waiting script
|
|
341
|
+
// can resume into blocking code before that cancellation runs; the runtime
|
|
342
|
+
// ignores the repeats once the script was interrupted or cancelled.
|
|
343
|
+
this.interruptChild();
|
|
344
|
+
pending.interruptTimer = setInterval(() => this.interruptChild(), INTERRUPT_REPEAT_MS);
|
|
345
|
+
pending.killTimer = setTimeout(() => {
|
|
346
|
+
pending.deadlineMs = null; // this message already says why
|
|
347
|
+
this.settlePending({
|
|
348
|
+
stdout: '',
|
|
349
|
+
stderr:
|
|
350
|
+
`script stopped: it reached its ${formatLimit(deadlineMs)} time limit and did not respond, so it was killed` +
|
|
351
|
+
(pending.background ? '. ' : ' and the interpreter restarted (variables from earlier scripts are gone). ') +
|
|
352
|
+
limitRemedy(deadlineMs, pending.ceilingMs, pending.background, pending.backgroundCeilingMs),
|
|
353
|
+
returnCode: 1,
|
|
354
|
+
aborted: true,
|
|
355
|
+
});
|
|
356
|
+
this.reclaim('deadline-kill');
|
|
357
|
+
}, this.cancelGraceMs);
|
|
358
|
+
}, deadlineMs);
|
|
359
|
+
// A day-scale background deadline must not hold the process open.
|
|
360
|
+
if (background) pending.deadlineTimer.unref?.();
|
|
361
|
+
|
|
362
|
+
pending.sent = true;
|
|
363
|
+
this.send({
|
|
364
|
+
op: 'init',
|
|
365
|
+
tools: tools.map((t) => ({ py_name: t.pyName, tool_name: t.toolName })),
|
|
366
|
+
call_timeout_s: Math.round(this.toolCallTimeoutMs / 1000),
|
|
367
|
+
...(background
|
|
368
|
+
? { background: true, log_path: background.logPath ?? null }
|
|
369
|
+
: {}),
|
|
242
370
|
});
|
|
371
|
+
this.send({ op: 'exec', id: execId, code });
|
|
372
|
+
|
|
373
|
+
const result = await settled;
|
|
243
374
|
|
|
244
375
|
this.onWake = null;
|
|
245
376
|
if (!background) this.armIdleTimer();
|
|
@@ -247,9 +378,12 @@ export class PyRunner {
|
|
|
247
378
|
}
|
|
248
379
|
|
|
249
380
|
/**
|
|
250
|
-
* Abort
|
|
251
|
-
*
|
|
252
|
-
*
|
|
381
|
+
* Abort the runner's script (its turn ended or is reset to run again, or the
|
|
382
|
+
* agent was reset or stopped), whether it's running or still waiting for its
|
|
383
|
+
* interpreter to start; a waiting script then never runs. The exec settles
|
|
384
|
+
* at once, and the interpreter is reclaimed, a starting one too: after an
|
|
385
|
+
* abort its state is suspect (a script died midway), and the next exec gets
|
|
386
|
+
* a fresh one.
|
|
253
387
|
*/
|
|
254
388
|
abort(reason: string): void {
|
|
255
389
|
if (!this.pending) return;
|
|
@@ -285,13 +419,23 @@ export class PyRunner {
|
|
|
285
419
|
}
|
|
286
420
|
this.teardownChild();
|
|
287
421
|
|
|
288
|
-
|
|
422
|
+
// Absolute, since the interpreter runs in it: from a relative TMPDIR,
|
|
423
|
+
// runtime.py's path would otherwise resolve against the directory itself.
|
|
424
|
+
this.runtimeDir = resolve(mkdtempSync(join(tmpdir(), 'af-pytc-')));
|
|
289
425
|
const runtimePath = join(this.runtimeDir, 'runtime.py');
|
|
290
426
|
writeFileSync(runtimePath, PYTHON_RUNTIME_SOURCE, 'utf8');
|
|
291
427
|
|
|
292
|
-
const child = spawn(this.pythonPath, [runtimePath], {
|
|
428
|
+
const child = spawn(spawnablePath(this.pythonPath), [runtimePath], {
|
|
293
429
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
294
|
-
|
|
430
|
+
// The runtime directory, not the host's working directory: a script's
|
|
431
|
+
// relative paths land here, and go at teardown, rather than beside the
|
|
432
|
+
// host's .env and data. An absolute path still reaches the host's files.
|
|
433
|
+
cwd: this.runtimeDir,
|
|
434
|
+
// Set last, over a declared env: the protocol needs both. It writes
|
|
435
|
+
// non-ASCII JSON on piped stdio, which Python before 3.15 on Windows
|
|
436
|
+
// encodes in the ANSI code page unless told otherwise, and a host's
|
|
437
|
+
// own PYTHONUTF8 no longer reaches the interpreter.
|
|
438
|
+
env: { ...buildChildEnv(this.envOptions), PYTHONUNBUFFERED: '1', PYTHONIOENCODING: 'utf-8' },
|
|
295
439
|
});
|
|
296
440
|
this.child = child;
|
|
297
441
|
|
|
@@ -302,16 +446,38 @@ export class PyRunner {
|
|
|
302
446
|
console.error(`[pytc:${this.label}] ${chunk.trimEnd()}`);
|
|
303
447
|
});
|
|
304
448
|
|
|
449
|
+
// A write to an interpreter that no longer reads its input fails on the
|
|
450
|
+
// stream after write() returns; with no listener, that error is thrown as
|
|
451
|
+
// an uncaught exception. Such an interpreter can go on running, as after a
|
|
452
|
+
// script closes file descriptor 0, and every later message to it is lost:
|
|
453
|
+
// its exec would wait out its time limit. So end it, and its exit settles
|
|
454
|
+
// the exec now. One already dead or killed is left to its own exit.
|
|
455
|
+
let inputFailed = false;
|
|
456
|
+
child.stdin.on('error', (err) => {
|
|
457
|
+
console.error(`[pytc:${this.label}] write to the python runtime failed: ${err.message}`);
|
|
458
|
+
if (child.exitCode === null && !child.killed && child.pid !== undefined) {
|
|
459
|
+
inputFailed = true;
|
|
460
|
+
child.kill('SIGKILL');
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
|
|
305
464
|
child.on('error', (err) => {
|
|
306
465
|
// Spawn failure lands here (e.g. python3 missing); readiness rejects.
|
|
307
466
|
console.error(`[pytc:${this.label}] python process error: ${err.message}`);
|
|
308
467
|
});
|
|
309
468
|
|
|
310
469
|
child.on('exit', (exitCode, signal) => {
|
|
311
|
-
|
|
470
|
+
// An exec still waiting for the interpreter is settled by exec, as a
|
|
471
|
+
// runtime that failed to start.
|
|
472
|
+
if (this.pending?.sent) {
|
|
312
473
|
this.settlePending({
|
|
313
474
|
stdout: '',
|
|
314
|
-
stderr:
|
|
475
|
+
stderr:
|
|
476
|
+
inputFailed && signal === 'SIGKILL'
|
|
477
|
+
? 'python runtime stopped reading its input, so it was killed and the interpreter restarted ' +
|
|
478
|
+
'(variables from earlier scripts are gone). A script that closes its standard input ' +
|
|
479
|
+
'(file descriptor 0) does this.'
|
|
480
|
+
: interpreterExit(exitCode, signal, this.pending.background),
|
|
315
481
|
returnCode: 1,
|
|
316
482
|
aborted: true,
|
|
317
483
|
});
|
|
@@ -331,7 +497,7 @@ export class PyRunner {
|
|
|
331
497
|
};
|
|
332
498
|
const onExit = () => {
|
|
333
499
|
cleanup();
|
|
334
|
-
reject(new Error('
|
|
500
|
+
reject(new Error('exited as it started'));
|
|
335
501
|
};
|
|
336
502
|
const onError = (err: Error) => {
|
|
337
503
|
cleanup();
|
|
@@ -339,15 +505,17 @@ export class PyRunner {
|
|
|
339
505
|
};
|
|
340
506
|
const timeout = setTimeout(() => {
|
|
341
507
|
cleanup();
|
|
342
|
-
reject(new Error('
|
|
508
|
+
reject(new Error("didn't start within 15 seconds"));
|
|
343
509
|
}, 15_000);
|
|
344
510
|
const cleanup = () => {
|
|
345
511
|
clearTimeout(timeout);
|
|
346
512
|
this.readyResolver = null;
|
|
513
|
+
this.readyFailer = null;
|
|
347
514
|
child.off('exit', onExit);
|
|
348
515
|
child.off('error', onError);
|
|
349
516
|
};
|
|
350
517
|
this.readyResolver = onReady;
|
|
518
|
+
this.readyFailer = onError;
|
|
351
519
|
child.on('exit', onExit);
|
|
352
520
|
child.on('error', onError);
|
|
353
521
|
});
|
|
@@ -355,6 +523,8 @@ export class PyRunner {
|
|
|
355
523
|
}
|
|
356
524
|
|
|
357
525
|
private readyResolver: (() => void) | null = null;
|
|
526
|
+
/** Fails the readiness of an interpreter that is still starting (see reclaim). */
|
|
527
|
+
private readyFailer: ((err: Error) => void) | null = null;
|
|
358
528
|
|
|
359
529
|
private handleLine(line: string, child: ChildProcessWithoutNullStreams): void {
|
|
360
530
|
let msg: { op?: string; id?: string; name?: string; args?: unknown; stdout?: string; stderr?: string; return_code?: number };
|
|
@@ -379,9 +549,24 @@ export class PyRunner {
|
|
|
379
549
|
? (msg.args as Record<string, unknown>)
|
|
380
550
|
: {};
|
|
381
551
|
this.onToolCall(toolName, args)
|
|
382
|
-
.catch((err)
|
|
552
|
+
.catch((err): ScriptToolResult => ({
|
|
553
|
+
text: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
554
|
+
isError: true,
|
|
555
|
+
}))
|
|
383
556
|
.then((result) => {
|
|
384
|
-
|
|
557
|
+
// Only an object is a ScriptToolResult. Anything else a handler
|
|
558
|
+
// resolves with, a string or a value its type rules out, is sent
|
|
559
|
+
// as it is, so the call is still answered.
|
|
560
|
+
const reply = typeof result === 'object' && result !== null
|
|
561
|
+
? {
|
|
562
|
+
op: 'tool_result',
|
|
563
|
+
id: callId,
|
|
564
|
+
result: result.text,
|
|
565
|
+
is_error: result.isError,
|
|
566
|
+
...(result.structuredJson ? { structured_json: true } : {}),
|
|
567
|
+
}
|
|
568
|
+
: { op: 'tool_result', id: callId, result };
|
|
569
|
+
this.reply(child, reply, `result of ${toolName} call ${callId}`);
|
|
385
570
|
});
|
|
386
571
|
return;
|
|
387
572
|
}
|
|
@@ -431,9 +616,12 @@ export class PyRunner {
|
|
|
431
616
|
// Only a script that ended unsuccessfully was stopped: one that caught the cancellation
|
|
432
617
|
// and finished its work returns 0, and must not read as stopped.
|
|
433
618
|
if (pending.deadlineMs !== null && result.returnCode !== 0) {
|
|
434
|
-
const note = `script stopped: it reached its ${formatLimit(pending.deadlineMs)} time limit
|
|
619
|
+
const note = `script stopped: it reached its ${formatLimit(pending.deadlineMs)} time limit. `
|
|
620
|
+
+ `${limitRemedy(pending.deadlineMs, pending.ceilingMs, pending.background, pending.backgroundCeilingMs)}\n`;
|
|
621
|
+
// On a line of its own: the runner's own texts, such as an interpreter's exit, end without a newline.
|
|
622
|
+
const withNote = (text: string) => (text === '' || text.endsWith('\n') ? text : `${text}\n`) + note;
|
|
435
623
|
// A background script reports its output tail, so the note goes there too.
|
|
436
|
-
result = { ...result, stderr: result.stderr
|
|
624
|
+
result = { ...result, stderr: withNote(result.stderr), ...(result.tail !== undefined ? { tail: withNote(result.tail) } : {}) };
|
|
437
625
|
}
|
|
438
626
|
if (pending.deadlineTimer) clearTimeout(pending.deadlineTimer);
|
|
439
627
|
if (pending.killTimer) clearTimeout(pending.killTimer);
|
|
@@ -492,6 +680,12 @@ export class PyRunner {
|
|
|
492
680
|
if (this.child) {
|
|
493
681
|
console.error(`[pytc:${this.label}] reclaiming python interpreter (${reason})`);
|
|
494
682
|
}
|
|
683
|
+
// An interpreter killed as it starts never says it's ready: fail its
|
|
684
|
+
// readiness now, so an exec waiting on it returns at once rather than at
|
|
685
|
+
// the 15 s timeout. Here rather than in teardownChild, which an
|
|
686
|
+
// interpreter's own exit also runs, so that one still reads "exited as
|
|
687
|
+
// it started".
|
|
688
|
+
this.readyFailer?.(new Error(`python runtime reclaimed (${reason}) before it was ready`));
|
|
495
689
|
this.teardownChild();
|
|
496
690
|
this.clearIdleTimer();
|
|
497
691
|
}
|
|
@@ -501,28 +695,45 @@ export class PyRunner {
|
|
|
501
695
|
this.reader.close();
|
|
502
696
|
this.reader = null;
|
|
503
697
|
}
|
|
504
|
-
|
|
505
|
-
|
|
698
|
+
const child = this.child;
|
|
699
|
+
if (child) {
|
|
506
700
|
this.child = null;
|
|
507
701
|
this.childReady = null;
|
|
508
702
|
this.readyResolver = null;
|
|
703
|
+
this.readyFailer = null;
|
|
509
704
|
child.removeAllListeners('exit');
|
|
510
705
|
try {
|
|
511
706
|
child.stdin.end();
|
|
512
707
|
} catch {
|
|
513
708
|
// stream may already be destroyed
|
|
514
709
|
}
|
|
515
|
-
|
|
710
|
+
// A child whose spawn failed has no pid, and its exitCode stays null
|
|
711
|
+
// until Node's 'error' for it, a tick later. A kill() in that tick, as
|
|
712
|
+
// from an abort or dispose on the tick exec was called, signals no
|
|
713
|
+
// child of ours but whatever pid Node's handle held: the host's own
|
|
714
|
+
// process group on Node 20.20.2, another process's pid on 24.19.
|
|
715
|
+
if (child.exitCode === null && !child.killed && child.pid !== undefined) {
|
|
516
716
|
child.kill('SIGKILL');
|
|
517
717
|
}
|
|
518
718
|
}
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
719
|
+
const dir = this.runtimeDir;
|
|
720
|
+
this.runtimeDir = null;
|
|
721
|
+
if (dir) {
|
|
722
|
+
const remove = (): void => {
|
|
723
|
+
try {
|
|
724
|
+
rmSync(dir, { recursive: true, force: true });
|
|
725
|
+
} catch {
|
|
726
|
+
// temp cleanup is best-effort
|
|
727
|
+
}
|
|
728
|
+
};
|
|
729
|
+
// The directory is the interpreter's working directory, which Windows
|
|
730
|
+
// won't remove while the process lives, so there it goes once the
|
|
731
|
+
// process has. Elsewhere it goes now, so a host that exits right after
|
|
732
|
+
// this doesn't leave it behind. A child that never started has no exit
|
|
733
|
+
// to wait for.
|
|
734
|
+
const running = child !== null && child.pid !== undefined && child.exitCode === null && child.signalCode === null;
|
|
735
|
+
if (running && process.platform === 'win32') child.once('exit', remove);
|
|
736
|
+
else remove();
|
|
526
737
|
}
|
|
527
738
|
}
|
|
528
739
|
|