@sema-agent/core 7.51.2 → 7.53.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/CHANGELOG.md +698 -2
- package/README.md +3 -1
- package/dist/agents/agent-transcript-tool.d.ts +1 -1
- package/dist/agents/cascade.js +4 -0
- package/dist/agents/cross-session-envelope.d.ts +8 -0
- package/dist/agents/cross-session-envelope.js +6 -0
- package/dist/agents/cross-session-judge.d.ts +21 -1
- package/dist/agents/cross-session-judge.js +8 -0
- package/dist/agents/cross-session-ref.d.ts +5 -0
- package/dist/agents/cross-session-ref.js +1 -0
- package/dist/agents/cumulative-stats.d.ts +3 -0
- package/dist/agents/cumulative-stats.js +3 -0
- package/dist/agents/list-agents-tool.d.ts +1 -1
- package/dist/agents/org-delivery-gate.d.ts +122 -0
- package/dist/agents/org-delivery-gate.js +69 -0
- package/dist/agents/peer-held-queue.d.ts +9 -4
- package/dist/agents/peer-held-queue.js +6 -5
- package/dist/agents/peer-session-drain.d.ts +35 -5
- package/dist/agents/peer-session-drain.js +271 -180
- package/dist/agents/read-inbox-tool.d.ts +8 -1
- package/dist/agents/read-inbox-tool.js +5 -1
- package/dist/agents/repair-loop.js +4 -0
- package/dist/agents/send-message-tool.d.ts +11 -16
- package/dist/agents/send-message-tool.js +11 -13
- package/dist/agents/subagent.d.ts +3 -0
- package/dist/agents/subagent.js +105 -76
- package/dist/agents/tool-filter.d.ts +58 -13
- package/dist/agents/tool-filter.js +34 -14
- package/dist/bench/metrics.d.ts +1 -0
- package/dist/brain/anthropic.d.ts +6 -1
- package/dist/brain/anthropic.js +17 -13
- package/dist/brain/model-presets.d.ts +4 -5
- package/dist/brain/model-presets.js +6 -5
- package/dist/brain/open-responses.js +16 -12
- package/dist/brain/openai.js +16 -12
- package/dist/brain/request-params.d.ts +12 -33
- package/dist/brain/request-params.js +5 -2
- package/dist/brain/request-route.d.ts +9 -8
- package/dist/brain/request-route.js +1 -0
- package/dist/brain/route-adjudicator.d.ts +123 -47
- package/dist/brain/route-adjudicator.js +171 -42
- package/dist/brain/route-conformance.js +2 -2
- package/dist/brain/routing.d.ts +24 -1
- package/dist/brain/routing.js +54 -19
- package/dist/brain/status-sink.d.ts +18 -0
- package/dist/brain/status-sink.js +7 -0
- package/dist/brain/timeout.js +5 -4
- package/dist/core/a2a.d.ts +5 -2
- package/dist/core/a2a.js +30 -13
- package/dist/core/allow-entry.d.ts +42 -9
- package/dist/core/allow-entry.js +25 -18
- package/dist/core/auto-compaction.d.ts +80 -20
- package/dist/core/auto-compaction.js +65 -18
- package/dist/core/auto-promote.d.ts +2 -1
- package/dist/core/auto-promote.js +2 -2
- package/dist/core/caller-tool-name.d.ts +9 -0
- package/dist/core/caller-tool-name.js +13 -0
- package/dist/core/checkpoint-requirements.d.ts +7 -1
- package/dist/core/checkpoint-requirements.js +2 -0
- package/dist/core/checkpoint-store.d.ts +57 -24
- package/dist/core/checkpoint-store.js +3 -3
- package/dist/core/child-clamp-seats.d.ts +6 -0
- package/dist/core/child-clamp-seats.js +2 -1
- package/dist/core/compliance.js +3 -1
- package/dist/core/credential-vocabulary.d.ts +33 -8
- package/dist/core/credential-vocabulary.js +32 -7
- package/dist/core/decision-receipt.d.ts +2 -2
- package/dist/core/delegation-frames.d.ts +9 -2
- package/dist/core/delegation-name.d.ts +18 -0
- package/dist/core/delegation-name.js +47 -0
- package/dist/core/effective-path-target.d.ts +25 -6
- package/dist/core/effective-path-target.js +24 -2
- package/dist/core/engine-capabilities.d.ts +8 -1
- package/dist/core/engine-capabilities.js +1 -1
- package/dist/core/engine-notice.d.ts +49 -21
- package/dist/core/frontmatter-fence.d.ts +10 -0
- package/dist/core/frontmatter-fence.js +6 -0
- package/dist/core/gate-fold.js +8 -25
- package/dist/core/gate-lanes.js +358 -274
- package/dist/core/gate-outcome.d.ts +11 -6
- package/dist/core/governance-codes.d.ts +11 -4
- package/dist/core/governance-codes.js +12 -3
- package/dist/core/hands-band-screen.d.ts +7 -0
- package/dist/core/hands-band-screen.js +32 -0
- package/dist/core/hooks.d.ts +283 -739
- package/dist/core/hooks.js +100 -193
- package/dist/{tools/fs → core}/image-admission.d.ts +21 -3
- package/dist/{tools/fs → core}/image-admission.js +24 -6
- package/dist/core/locked-config.d.ts +84 -32
- package/dist/core/locked-config.js +128 -42
- package/dist/core/mcp-connection-pool.d.ts +4 -1
- package/dist/core/mcp-connection-pool.js +7 -2
- package/dist/core/mcp-probe.d.ts +12 -9
- package/dist/core/mcp-probe.js +3 -3
- package/dist/core/mcp-server-spec.d.ts +104 -10
- package/dist/core/mcp-server-spec.js +183 -33
- package/dist/core/mcp.d.ts +31 -20
- package/dist/core/mcp.js +66 -56
- package/dist/core/memory-engine/data-plane.js +5 -1
- package/dist/core/memory-engine/distiller.js +16 -2
- package/dist/core/memory-engine/engine.d.ts +22 -30
- package/dist/core/memory-engine/engine.js +16 -10
- package/dist/core/memory-engine/frontmatter.d.ts +6 -0
- package/dist/core/memory-engine/frontmatter.js +19 -16
- package/dist/core/memory.d.ts +2 -2
- package/dist/core/mode-policy.d.ts +5 -16
- package/dist/core/mode-policy.js +7 -19
- package/dist/core/model-seat.d.ts +4 -1
- package/dist/core/mods/dollar.d.ts +109 -0
- package/dist/core/mods/dollar.js +154 -0
- package/dist/core/mods/host.d.ts +23 -0
- package/dist/core/mods/host.js +21 -0
- package/dist/core/mods/kernel/budget.d.ts +43 -0
- package/dist/core/mods/kernel/budget.js +83 -0
- package/dist/core/mods/kernel/dispatch.d.ts +100 -0
- package/dist/core/mods/kernel/dispatch.js +699 -0
- package/dist/core/mods/kernel/events.d.ts +245 -0
- package/dist/core/mods/kernel/events.js +210 -0
- package/dist/core/mods/kernel/index.d.ts +6 -0
- package/dist/core/mods/kernel/index.js +5 -0
- package/dist/core/mods/kernel/receive.d.ts +94 -0
- package/dist/core/mods/kernel/receive.js +188 -0
- package/dist/core/mods/kernel/registration.d.ts +131 -0
- package/dist/core/mods/kernel/registration.js +102 -0
- package/dist/core/mods/kernel/site-rules.d.ts +149 -0
- package/dist/core/mods/kernel/site-rules.js +296 -0
- package/dist/core/mods/stations.d.ts +344 -0
- package/dist/core/mods/stations.js +437 -0
- package/dist/core/mounted-mcp.d.ts +57 -0
- package/dist/core/mounted-mcp.js +71 -2
- package/dist/core/own-property-receipt.d.ts +13 -0
- package/dist/core/own-property-receipt.js +13 -23
- package/dist/core/parent-spec-seat.d.ts +18 -7
- package/dist/core/parent-spec-seat.js +6 -2
- package/dist/core/path-identity.js +2 -1
- package/dist/core/permission-rule-model.d.ts +58 -9
- package/dist/core/permission-rule-model.js +81 -7
- package/dist/core/permission-rule-org.d.ts +163 -33
- package/dist/core/permission-rule-org.js +205 -71
- package/dist/core/permission-rule-syntax.d.ts +15 -0
- package/dist/core/permission-rule-syntax.js +24 -16
- package/dist/core/permission-rules.d.ts +14 -2
- package/dist/core/permission-rules.js +63 -23
- package/dist/core/prompt-section-seat.d.ts +15 -27
- package/dist/core/prompt-section-seat.js +73 -40
- package/dist/core/protocol-http-auth.d.ts +3 -1
- package/dist/core/protocol-http-auth.js +2 -0
- package/dist/core/reminder-mint.d.ts +2 -2
- package/dist/core/remote-env.d.ts +24 -12
- package/dist/core/remote-env.js +1 -0
- package/dist/core/resume-startup-cause.d.ts +16 -1
- package/dist/core/resume-startup-cause.js +4 -1
- package/dist/core/retention.js +7 -2
- package/dist/core/retired-keys.d.ts +12 -2
- package/dist/core/retired-keys.js +15 -1
- package/dist/core/roles.js +60 -10
- package/dist/core/rule-lane-reads.js +1 -1
- package/dist/core/runner/announce-once-ledger.d.ts +31 -1
- package/dist/core/runner/announce-once-ledger.js +22 -0
- package/dist/core/runner/assemble-result.d.ts +9 -0
- package/dist/core/runner/assemble-result.js +3 -1
- package/dist/core/runner/call-hook-stations.d.ts +23 -27
- package/dist/core/runner/call-hook-stations.js +58 -42
- package/dist/core/runner/caller-stop-gate.d.ts +25 -0
- package/dist/core/runner/caller-stop-gate.js +7 -0
- package/dist/core/runner/compaction-seams.d.ts +8 -22
- package/dist/core/runner/compaction-seams.js +28 -53
- package/dist/core/runner/construction-doors.js +11 -1
- package/dist/core/runner/contracts.d.ts +86 -83
- package/dist/core/runner/credential-origin-seat.d.ts +2 -0
- package/dist/core/runner/credential-origin-seat.js +19 -0
- package/dist/core/runner/extra-body-dropped-seat.d.ts +2 -6
- package/dist/core/runner/gate-exit.d.ts +47 -36
- package/dist/core/runner/gate-exit.js +12 -5
- package/dist/core/runner/image.js +1 -2
- package/dist/core/runner/inline-image.js +1 -1
- package/dist/core/runner/mcp-redial.d.ts +52 -10
- package/dist/core/runner/mcp-redial.js +38 -9
- package/dist/core/runner/notice-seat-input.d.ts +11 -0
- package/dist/core/runner/notice-seat-input.js +1 -0
- package/dist/core/runner/permission-rule-lanes.d.ts +5 -2
- package/dist/core/runner/permission-rule-lanes.js +22 -10
- package/dist/core/runner/person-path-rows.d.ts +3 -1
- package/dist/core/runner/person-path-rows.js +3 -2
- package/dist/core/runner/prepare-acquire-reconcile.js +5 -1
- package/dist/core/runner/prepare-ask-lane.d.ts +5 -7
- package/dist/core/runner/prepare-ask-lane.js +6 -15
- package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -2
- package/dist/core/runner/prepare-caps-and-workflow.js +25 -8
- package/dist/core/runner/prepare-config-doors.d.ts +52 -1
- package/dist/core/runner/prepare-config-doors.js +168 -143
- package/dist/core/runner/prepare-defer-classify.js +7 -11
- package/dist/core/runner/prepare-delegation-surface.d.ts +2 -2
- package/dist/core/runner/prepare-delegation-surface.js +7 -5
- package/dist/core/runner/prepare-gate-stations.d.ts +8 -11
- package/dist/core/runner/prepare-gate-stations.js +11 -10
- package/dist/core/runner/prepare-hands-readface.d.ts +1 -1
- package/dist/core/runner/prepare-hands-readface.js +2 -1
- package/dist/core/runner/prepare-inherited-gate.d.ts +8 -12
- package/dist/core/runner/prepare-inherited-gate.js +10 -23
- package/dist/core/runner/prepare-listings.d.ts +1 -1
- package/dist/core/runner/prepare-listings.js +4 -2
- package/dist/core/runner/prepare-memory-engine-session.d.ts +0 -6
- package/dist/core/runner/prepare-memory-engine-session.js +20 -7
- package/dist/core/runner/prepare-memory.d.ts +3 -2
- package/dist/core/runner/prepare-memory.js +6 -2
- package/dist/core/runner/prepare-offload-wrappers.d.ts +4 -4
- package/dist/core/runner/prepare-offload-wrappers.js +2 -1
- package/dist/core/runner/prepare-park-ask.js +10 -14
- package/dist/core/runner/prepare-policy-chain.d.ts +17 -15
- package/dist/core/runner/prepare-policy-chain.js +104 -109
- package/dist/core/runner/prepare-project-context.d.ts +1 -1
- package/dist/core/runner/prepare-project-context.js +11 -12
- package/dist/core/runner/prepare-prompt-assembly.d.ts +45 -40
- package/dist/core/runner/prepare-prompt-assembly.js +138 -101
- package/dist/core/runner/prepare-prompt-inputs.d.ts +28 -23
- package/dist/core/runner/prepare-prompt-inputs.js +11 -10
- package/dist/core/runner/prepare-protocol-tools.d.ts +11 -7
- package/dist/core/runner/prepare-protocol-tools.js +20 -13
- package/dist/core/runner/prepare-question-face.d.ts +4 -2
- package/dist/core/runner/prepare-question-face.js +4 -3
- package/dist/core/runner/prepare-safety-scan.js +6 -10
- package/dist/core/runner/prepare-suspend-saga.d.ts +6 -0
- package/dist/core/runner/prepare-suspend-saga.js +7 -5
- package/dist/core/runner/prepare-task.js +41 -23
- package/dist/core/runner/prepare-turn-wiring.d.ts +13 -15
- package/dist/core/runner/prepare-turn-wiring.js +29 -27
- package/dist/core/runner/prepare-wiring-manifest.d.ts +13 -9
- package/dist/core/runner/prepare-wiring-manifest.js +14 -11
- package/dist/core/runner/resume-admission.d.ts +4 -1
- package/dist/core/runner/resume-admission.js +7 -5
- package/dist/core/runner/resume-apply.d.ts +5 -2
- package/dist/core/runner/resume-apply.js +24 -42
- package/dist/core/runner/resume-checkpoint-screen.d.ts +1 -0
- package/dist/core/runner/resume-checkpoint-screen.js +9 -1
- package/dist/core/runner/resume-internals-and-config.d.ts +3 -3
- package/dist/core/runner/resume-internals-and-config.js +3 -8
- package/dist/core/runner/resume-preflight.js +38 -16
- package/dist/core/runner/retired-runner-deps.d.ts +5 -6
- package/dist/core/runner/retired-runner-deps.js +4 -5
- package/dist/core/runner/run-brain-sinks.d.ts +3 -2
- package/dist/core/runner/run-brain-sinks.js +5 -1
- package/dist/core/runner/run-compaction-machinery.d.ts +7 -1
- package/dist/core/runner/run-compaction-machinery.js +7 -33
- package/dist/core/runner/run-harness-handlers.js +4 -2
- package/dist/core/runner/run-identity-wiring.d.ts +3 -1
- package/dist/core/runner/run-identity-wiring.js +3 -2
- package/dist/core/runner/run-leg.js +103 -95
- package/dist/core/runner/run-notification-lane.js +1 -0
- package/dist/core/runner/run-recovery-lanes.d.ts +3 -0
- package/dist/core/runner/run-recovery-lanes.js +14 -11
- package/dist/core/runner/run-settle-and-teardown.js +9 -28
- package/dist/core/runner/run-stop-and-final-verify.js +18 -25
- package/dist/core/runner/run-terminal-adoption.d.ts +3 -0
- package/dist/core/runner/run-terminal-adoption.js +34 -22
- package/dist/core/runner/run-tool-mount-facts.js +5 -3
- package/dist/core/runner/run-turn-boundary.js +32 -37
- package/dist/core/runner/runtask.d.ts +6 -7
- package/dist/core/runner/runtask.js +15 -73
- package/dist/core/runner/session-rule-policy.d.ts +5 -5
- package/dist/core/runner/session-rule-policy.js +13 -8
- package/dist/core/runner/side-call-account.d.ts +68 -0
- package/dist/core/runner/side-call-account.js +61 -0
- package/dist/core/runner/skills-seat.d.ts +15 -0
- package/dist/core/runner/skills-seat.js +57 -0
- package/dist/core/runner/stream-halt-verbs.js +12 -17
- package/dist/core/runner/stream-lifecycle-verbs.js +8 -5
- package/dist/core/runner/stream-steer-verb.d.ts +1 -1
- package/dist/core/runner/stream-steer-verb.js +20 -38
- package/dist/core/runner/sub-agent-deny-lists.d.ts +124 -23
- package/dist/core/runner/sub-agent-deny-lists.js +230 -71
- package/dist/core/runner/synthetic-tools.d.ts +5 -2
- package/dist/core/runner/synthetic-tools.js +2 -12
- package/dist/core/runner/tool-end-body.d.ts +5 -6
- package/dist/core/runner/tool-end-body.js +6 -4
- package/dist/core/runner/tool-not-executed.d.ts +15 -0
- package/dist/core/runner/tool-not-executed.js +30 -0
- package/dist/core/runner/tool-occurrence.d.ts +8 -7
- package/dist/core/runner/tool-occurrence.js +5 -5
- package/dist/core/runner/tool-result-media-seat.d.ts +1 -1
- package/dist/core/runner-deps.d.ts +43 -36
- package/dist/core/safety-merge-corpus.js +18 -2
- package/dist/core/secret-env.d.ts +88 -20
- package/dist/core/secret-env.js +192 -38
- package/dist/core/session-policy-store.d.ts +71 -16
- package/dist/core/session-policy-store.js +138 -28
- package/dist/core/session-reconcile.d.ts +4 -0
- package/dist/core/session-reconcile.js +2 -1
- package/dist/core/shell-read-silence.js +3 -32
- package/dist/core/side-query.d.ts +5 -3
- package/dist/core/skill-grant.d.ts +3 -2
- package/dist/core/skill-grant.js +17 -9
- package/dist/core/skills-directory.d.ts +31 -11
- package/dist/core/skills-directory.js +655 -104
- package/dist/core/store-contracts/mailbox-store-contract.js +13 -0
- package/dist/core/task-event.d.ts +49 -3
- package/dist/core/task-notification.js +2 -2
- package/dist/core/task-result.d.ts +8 -0
- package/dist/core/task-spec.d.ts +20 -19
- package/dist/core/task-stream.d.ts +14 -4
- package/dist/core/tighten-task-spec.d.ts +4 -3
- package/dist/core/tighten-task-spec.js +2 -4
- package/dist/core/tool-check-reading.d.ts +74 -0
- package/dist/core/tool-check-reading.js +80 -0
- package/dist/core/tool-policy.d.ts +62 -18
- package/dist/core/tool-policy.js +86 -15
- package/dist/core/tool-registry.d.ts +20 -0
- package/dist/core/tool-registry.js +4 -0
- package/dist/core/tool-spec.d.ts +10 -6
- package/dist/core/tools.js +2 -0
- package/dist/core/trace.d.ts +51 -32
- package/dist/core/types.d.ts +2 -2
- package/dist/core/types.js +1 -1
- package/dist/core/unc-spelling.d.ts +10 -0
- package/dist/core/unc-spelling.js +3 -0
- package/dist/core/untrusted-egress.d.ts +8 -0
- package/dist/core/untrusted-egress.js +4 -1
- package/dist/core/untrusted-text.d.ts +16 -0
- package/dist/core/untrusted-text.js +7 -2
- package/dist/core/user-attachment.d.ts +25 -4
- package/dist/core/user-attachment.js +63 -42
- package/dist/core/wiring-manifest.d.ts +18 -15
- package/dist/core/wiring-manifest.js +2 -2
- package/dist/engine/compaction/utils.js +1 -2
- package/dist/engine/execution-env/node-execution-env.d.ts +4 -3
- package/dist/engine/execution-env/symlink-chain.js +1 -1
- package/dist/engine/harness/agent-harness.d.ts +1 -1
- package/dist/engine/harness/agent-harness.js +5 -4
- package/dist/engine/harness/types.d.ts +20 -16
- package/dist/engine/harness/types.js +7 -1
- package/dist/engine/llm/types.d.ts +12 -7
- package/dist/engine/loop/agent-loop.d.ts +12 -1
- package/dist/engine/loop/agent-loop.js +18 -6
- package/dist/engine/loop/types.d.ts +8 -2
- package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
- package/dist/engine/session/import-validate.js +3 -10
- package/dist/engine/session/session.d.ts +4 -4
- package/dist/engine/session/session.js +4 -4
- package/dist/index.d.ts +33 -23
- package/dist/index.js +23 -15
- package/dist/internal/harness.d.ts +2 -1
- package/dist/internal/harness.js +2 -1
- package/dist/orchestration/goal.d.ts +24 -1
- package/dist/orchestration/goal.js +3 -2
- package/dist/orchestration/run-spec.d.ts +4 -6
- package/dist/orchestration/run-spec.js +39 -63
- package/dist/orchestration/run-workflow-tool.js +1 -2
- package/dist/orchestration/workflow.d.ts +11 -3
- package/dist/orchestration/workflow.js +11 -2
- package/dist/prompt-assembly/artifact-store.d.ts +72 -56
- package/dist/prompt-assembly/artifact-store.js +60 -52
- package/dist/prompt-assembly/artifact.d.ts +90 -76
- package/dist/prompt-assembly/artifact.js +197 -145
- package/dist/prompt-assembly/assemble.d.ts +36 -29
- package/dist/prompt-assembly/assemble.js +34 -220
- package/dist/prompt-assembly/bands.d.ts +20 -0
- package/dist/prompt-assembly/bands.js +18 -0
- package/dist/prompt-assembly/catalog/constitution.d.ts +23 -0
- package/dist/prompt-assembly/catalog/constitution.js +69 -0
- package/dist/prompt-assembly/catalog/core-behavior.d.ts +9 -0
- package/dist/prompt-assembly/catalog/core-behavior.js +85 -0
- package/dist/prompt-assembly/catalog/index.d.ts +11 -0
- package/dist/prompt-assembly/catalog/index.js +60 -0
- package/dist/prompt-assembly/catalog/memory.d.ts +13 -0
- package/dist/prompt-assembly/catalog/memory.js +6 -0
- package/dist/prompt-assembly/catalog/modes.d.ts +15 -0
- package/dist/prompt-assembly/catalog/modes.js +137 -0
- package/dist/prompt-assembly/catalog/role.d.ts +10 -0
- package/dist/prompt-assembly/catalog/role.js +157 -0
- package/dist/prompt-assembly/catalog/schema.d.ts +138 -0
- package/dist/prompt-assembly/catalog/schema.js +25 -0
- package/dist/prompt-assembly/catalog/sections.d.ts +9 -0
- package/dist/prompt-assembly/catalog/sections.js +98 -0
- package/dist/prompt-assembly/catalog/team.d.ts +4 -0
- package/dist/prompt-assembly/catalog/team.js +258 -0
- package/dist/prompt-assembly/composer.d.ts +26 -28
- package/dist/prompt-assembly/composer.js +124 -46
- package/dist/prompt-assembly/epoch.d.ts +89 -79
- package/dist/prompt-assembly/epoch.js +115 -142
- package/dist/prompt-assembly/explain.d.ts +58 -34
- package/dist/prompt-assembly/explain.js +21 -24
- package/dist/prompt-assembly/overlay.d.ts +137 -0
- package/dist/prompt-assembly/overlay.js +339 -0
- package/dist/prompt-assembly/renderers.d.ts +21 -0
- package/dist/prompt-assembly/renderers.js +39 -0
- package/dist/prompt-assembly/section-usage.d.ts +3 -3
- package/dist/prompt-assembly/section-usage.js +1 -1
- package/dist/prompt-assembly/select.d.ts +71 -0
- package/dist/prompt-assembly/select.js +106 -0
- package/dist/prompt-assembly/sugar.d.ts +31 -0
- package/dist/prompt-assembly/sugar.js +20 -0
- package/dist/prompt-assembly/turn-snapshot.d.ts +3 -2
- package/dist/prompt-assembly/types.d.ts +45 -148
- package/dist/prompts/coordinator.d.ts +2 -21
- package/dist/prompts/coordinator.js +3 -255
- package/dist/prompts/cowork.d.ts +27 -16
- package/dist/prompts/cowork.js +2 -23
- package/dist/prompts/default.d.ts +38 -511
- package/dist/prompts/default.js +20 -288
- package/dist/prompts/supervisor.d.ts +6 -71
- package/dist/prompts/supervisor.js +6 -117
- package/dist/stores/file/permission-rule-store.d.ts +1 -1
- package/dist/stores/file/permission-rule-store.js +2 -1
- package/dist/tools/artifact/artifact-tool.js +4 -3
- package/dist/tools/fs/bash-readonly-classifier.d.ts +6 -5
- package/dist/tools/fs/dir-entries.d.ts +4 -2
- package/dist/tools/fs/dir-entries.js +16 -4
- package/dist/tools/fs/fs-bash.d.ts +1 -1
- package/dist/tools/fs/fs-bash.js +22 -11
- package/dist/tools/fs/fs-pdf.js +17 -13
- package/dist/tools/fs/fs-read.js +4 -3
- package/dist/tools/fs/fs-shared.d.ts +1 -10
- package/dist/tools/fs/fs-shared.js +3 -4
- package/dist/tools/fs/fs-write.js +2 -1
- package/dist/tools/fs/notebook.js +1 -1
- package/dist/tools/fs/pdf.d.ts +20 -10
- package/dist/tools/fs/pdf.js +19 -10
- package/dist/tools/fs/program-read-model.d.ts +68 -8
- package/dist/tools/fs/program-read-model.js +112 -33
- package/dist/tools/fs/program-read-model.rows.js +30 -10
- package/dist/tools/fs/read-deny-home.d.ts +25 -9
- package/dist/tools/fs/read-deny-home.js +28 -27
- package/dist/tools/fs/read-deny.d.ts +41 -11
- package/dist/tools/fs/read-deny.js +51 -5
- package/dist/tools/fs/safety.d.ts +4 -26
- package/dist/tools/fs/safety.js +10 -32
- package/dist/tools/fs/search.js +15 -10
- package/dist/tools/fs/shell-read-argv.d.ts +3 -2
- package/dist/tools/fs/shell-read-argv.js +118 -38
- package/dist/tools/fs/shell-read-establish.d.ts +5 -5
- package/dist/tools/fs/shell-read-establish.js +11 -61
- package/dist/tools/fs/shell-read-identity.js +6 -3
- package/dist/tools/fs/shell-read-judge.d.ts +13 -15
- package/dist/tools/fs/shell-read-judge.js +18 -4
- package/dist/tools/fs/shell-read-plan.d.ts +2 -2
- package/dist/tools/web.js +1 -1
- package/package.json +13 -1
- package/test/export-surface.snapshot.json +306 -103
- package/wire-changes/core@7.52.0.json +5859 -0
- package/wire-changes/core@7.53.0.json +1946 -0
- package/dist/core/hook-seats.d.ts +0 -66
- package/dist/core/hook-seats.js +0 -37
- package/dist/prompt-assembly/packs/sema-default.d.ts +0 -2
- package/dist/prompt-assembly/packs/sema-default.js +0 -147
- package/dist/prompts/simple-sections.d.ts +0 -58
- package/dist/prompts/simple-sections.js +0 -43
|
@@ -0,0 +1,699 @@
|
|
|
1
|
+
import { CATCH_BUDGET_MS, createSelfBudget, POST_ABORT_GRACE_MS, RUNAWAY_AFTER_MS, unrefTimer, watchRunaway } from "./budget.js";
|
|
2
|
+
import { expandModPattern, isModEventName, MOD_SEATS, nextToRefusal, stationOn } from "./events.js";
|
|
3
|
+
import { ENGINE_ORIGIN, modsInvalid, screenModSeats, } from "./registration.js";
|
|
4
|
+
import { answerUpward, answerViolation, detachedCopy, engineObjectsOnce, handedOn, matcherMatches, matcherViolation, methodAnswerViolation, NEXT_IN_FLIGHT, receiveAnswer, receiveEvent, receivePayload, } from "./site-rules.js";
|
|
5
|
+
const TIER_RANK = { prepend: 0, user: 1, append: 2, builtin: 3, core: 4 };
|
|
6
|
+
const bypassed = (floors, tier) => floors.some((f) => TIER_RANK[f.from] < TIER_RANK[tier] && TIER_RANK[tier] < TIER_RANK[f.to]);
|
|
7
|
+
export async function admitMods(input) {
|
|
8
|
+
const report = safeReport(input.report);
|
|
9
|
+
const screened = screenModSeats(input.seats, input.side, (err) => report(err));
|
|
10
|
+
const mounted = [];
|
|
11
|
+
const records = [];
|
|
12
|
+
const describe = safeDescribe(input.describeThrown);
|
|
13
|
+
const bus = createBus(input.side, mounted, input.bottoms, report, records, describe, input.isProxy);
|
|
14
|
+
const admitted = Object.freeze({ admitted: true });
|
|
15
|
+
for (const cand of screened) {
|
|
16
|
+
if (input.signal?.aborted === true)
|
|
17
|
+
throw input.signal.reason;
|
|
18
|
+
const e = Object.freeze({
|
|
19
|
+
name: cand.name,
|
|
20
|
+
seat: cand.seat,
|
|
21
|
+
tier: cand.tier,
|
|
22
|
+
...(cand.provenance !== undefined ? { provenance: cand.provenance } : {}),
|
|
23
|
+
uses: Object.freeze({ events: cand.uses.events, calls: cand.uses.calls }),
|
|
24
|
+
});
|
|
25
|
+
const outcome = await bus.dispatch("plugin.register", e, {
|
|
26
|
+
bottom: () => admitted,
|
|
27
|
+
...(input.signal !== undefined ? { signal: input.signal } : {}),
|
|
28
|
+
checkAnswer: (a, judged, by) => a === admitted
|
|
29
|
+
? undefined
|
|
30
|
+
: refusalOf(a) === undefined
|
|
31
|
+
? "takes next(e) or { refuse: <reason> }"
|
|
32
|
+
: MOD_SEATS.indexOf(by.seat) > MOD_SEATS.findIndex((s) => s === judged["seat"])
|
|
33
|
+
? `a ${by.seat} registration may not refuse a ${String(judged["seat"])} registration`
|
|
34
|
+
: undefined,
|
|
35
|
+
});
|
|
36
|
+
if (outcome.kind === "aborted")
|
|
37
|
+
throw input.signal?.reason ?? new Error("admission aborted");
|
|
38
|
+
if (outcome.kind === "failed") {
|
|
39
|
+
records.push(Object.freeze({ name: cand.name, seat: cand.seat, tier: cand.tier, refusedBy: outcome.registration, reason: `${outcome.registration} failed: ${outcome.reason}` }));
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const refused = refusalOf(outcome.answer);
|
|
43
|
+
if (refused !== undefined) {
|
|
44
|
+
records.push(Object.freeze({ name: cand.name, seat: cand.seat, tier: cand.tier, refusedBy: outcome.answeredBy ?? "engine", reason: refused }));
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const own = mountOne(cand, input.side, describe);
|
|
48
|
+
mounted.push(...own);
|
|
49
|
+
const events = unique(own.map((h) => h.pattern));
|
|
50
|
+
const observe = unique(own.filter((h) => h.observe).map((h) => h.pattern));
|
|
51
|
+
records.push(Object.freeze({
|
|
52
|
+
name: cand.name,
|
|
53
|
+
seat: cand.seat,
|
|
54
|
+
tier: cand.tier,
|
|
55
|
+
events,
|
|
56
|
+
...(observe.length > 0 ? { observe } : {}),
|
|
57
|
+
...(outcome.skipped.length > 0 ? { skipped: outcome.skipped } : {}),
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
return bus;
|
|
61
|
+
}
|
|
62
|
+
function refusalOf(a) {
|
|
63
|
+
if (typeof a !== "object" || a === null || !Object.prototype.hasOwnProperty.call(a, "refuse"))
|
|
64
|
+
return undefined;
|
|
65
|
+
const r = Reflect.get(a, "refuse");
|
|
66
|
+
return typeof r === "string" && r !== "" ? r : undefined;
|
|
67
|
+
}
|
|
68
|
+
function unique(xs) {
|
|
69
|
+
return Object.freeze([...new Set(xs)]);
|
|
70
|
+
}
|
|
71
|
+
function safeDescribe(describe) {
|
|
72
|
+
return (err) => {
|
|
73
|
+
try {
|
|
74
|
+
const text = describe(err);
|
|
75
|
+
if (typeof text === "string")
|
|
76
|
+
return text;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
}
|
|
80
|
+
return "a value the host's renderer could not describe";
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function safeReport(report) {
|
|
84
|
+
return (err, classification) => {
|
|
85
|
+
try {
|
|
86
|
+
report(err, classification);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function mountOne(cand, side, describe) {
|
|
93
|
+
const own = [];
|
|
94
|
+
let sealed = false;
|
|
95
|
+
let problem;
|
|
96
|
+
const fail = (why) => {
|
|
97
|
+
problem ??= why;
|
|
98
|
+
throw modsInvalid(`${cand.name}: ${why}`);
|
|
99
|
+
};
|
|
100
|
+
const on = (pattern, a, b, c) => {
|
|
101
|
+
if (sealed)
|
|
102
|
+
throw modsInvalid(`${cand.name}: on() was called after register() returned`);
|
|
103
|
+
const withMatcher = typeof a !== "function";
|
|
104
|
+
const fn = withMatcher ? b : a;
|
|
105
|
+
const opts = withMatcher ? c : b;
|
|
106
|
+
if (typeof fn !== "function")
|
|
107
|
+
fail(`on("${String(pattern)}") takes a handler function`);
|
|
108
|
+
if (withMatcher) {
|
|
109
|
+
const why = matcherViolation(a);
|
|
110
|
+
if (why !== undefined)
|
|
111
|
+
fail(`on("${String(pattern)}"): ${why}`);
|
|
112
|
+
}
|
|
113
|
+
const parsed = handlerOptions(opts);
|
|
114
|
+
if (typeof parsed === "string")
|
|
115
|
+
fail(`on("${String(pattern)}"): ${parsed}`);
|
|
116
|
+
const expanded = expandModPattern(pattern);
|
|
117
|
+
if ("refusal" in expanded)
|
|
118
|
+
return void fail(`on(): ${expanded.refusal}`);
|
|
119
|
+
const outside = expanded.names.filter((n) => !cand.eventsBound.has(n));
|
|
120
|
+
if (outside.length > 0)
|
|
121
|
+
fail(`on("${pattern}") selects ${outside.join(", ")}, outside its uses.events`);
|
|
122
|
+
const events = expanded.names.filter((n) => stationOn(n, side) !== undefined);
|
|
123
|
+
if (events.length === 0)
|
|
124
|
+
fail(`on("${pattern}"): no event it selects is raised on the ${side} bus in this version`);
|
|
125
|
+
if (typeof fn !== "function" || typeof parsed === "string")
|
|
126
|
+
return;
|
|
127
|
+
own.push({
|
|
128
|
+
reg: cand,
|
|
129
|
+
index: own.length,
|
|
130
|
+
pattern,
|
|
131
|
+
events: new Set(events),
|
|
132
|
+
...(withMatcher && isMatcher(a) ? { matcher: Object.freeze({ ...a }) } : {}),
|
|
133
|
+
fn: asHandler(fn),
|
|
134
|
+
...(parsed.onCatch !== undefined ? { onCatch: parsed.onCatch } : {}),
|
|
135
|
+
observe: parsed.observe,
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
let returned;
|
|
139
|
+
try {
|
|
140
|
+
returned = cand.registration.register(on, cand.registration.options);
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
if (problem !== undefined)
|
|
144
|
+
throw modsInvalid(`${cand.name}: ${problem}`);
|
|
145
|
+
throw modsInvalid(`${cand.name}: register() threw: ${describe(err)}`);
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
sealed = true;
|
|
149
|
+
}
|
|
150
|
+
if (problem !== undefined)
|
|
151
|
+
throw modsInvalid(`${cand.name}: ${problem}`);
|
|
152
|
+
if (typeof returned === "object" && returned !== null && typeof Reflect.get(returned, "then") === "function") {
|
|
153
|
+
throw modsInvalid(`${cand.name}: register() returned a promise; register is synchronous (hang handlers with on() before it returns)`);
|
|
154
|
+
}
|
|
155
|
+
return own;
|
|
156
|
+
}
|
|
157
|
+
function isMatcher(v) {
|
|
158
|
+
return matcherViolation(v) === undefined;
|
|
159
|
+
}
|
|
160
|
+
function asHandler(fn) {
|
|
161
|
+
return (...args) => (typeof fn === "function" ? Reflect.apply(fn, undefined, args) : undefined);
|
|
162
|
+
}
|
|
163
|
+
function handlerOptions(opts) {
|
|
164
|
+
if (opts === undefined)
|
|
165
|
+
return { observe: false };
|
|
166
|
+
if (typeof opts !== "object" || opts === null)
|
|
167
|
+
return `options are { catch?, observe? }, not ${typeof opts}`;
|
|
168
|
+
for (const k of Object.keys(opts))
|
|
169
|
+
if (k !== "catch" && k !== "observe")
|
|
170
|
+
return `options are { catch?, observe? }; "${k}" is not one`;
|
|
171
|
+
const c = Reflect.get(opts, "catch");
|
|
172
|
+
const o = Reflect.get(opts, "observe");
|
|
173
|
+
if (c !== undefined && typeof c !== "function")
|
|
174
|
+
return "catch is a handler function";
|
|
175
|
+
if (o !== undefined && typeof o !== "boolean")
|
|
176
|
+
return "observe is true or false";
|
|
177
|
+
return { ...(c !== undefined ? { onCatch: asHandler(c) } : {}), observe: o === true };
|
|
178
|
+
}
|
|
179
|
+
const HA = "skipped; what is below it ran in its place";
|
|
180
|
+
const MA = "skipped; its last next() run's result stands";
|
|
181
|
+
function createBus(side, mounted, bottoms, report, records, describe, isProxy) {
|
|
182
|
+
const methods = [];
|
|
183
|
+
for (const name of Object.keys(bottoms)) {
|
|
184
|
+
if (!isModEventName(name) || bottoms[name] === undefined)
|
|
185
|
+
continue;
|
|
186
|
+
const st = stationOn(name, side);
|
|
187
|
+
if (st?.method === undefined)
|
|
188
|
+
continue;
|
|
189
|
+
const dot = name.indexOf(".");
|
|
190
|
+
methods.push({ event: name, ns: name.slice(0, dot), method: name.slice(dot + 1), pauses: st.method.pausesCallerBudget });
|
|
191
|
+
}
|
|
192
|
+
const bus = {
|
|
193
|
+
records,
|
|
194
|
+
mounted: () => Object.freeze(mounted.map((h) => Object.freeze({
|
|
195
|
+
plugin: h.reg.name,
|
|
196
|
+
seat: h.reg.seat,
|
|
197
|
+
pattern: h.pattern,
|
|
198
|
+
...(h.matcher !== undefined ? { matcher: h.matcher } : {}),
|
|
199
|
+
observe: h.observe,
|
|
200
|
+
caught: h.onCatch !== undefined,
|
|
201
|
+
}))),
|
|
202
|
+
hasHandlers: (event, participant) => mounted.some((h) => h.events.has(event) && admits(participant, h)),
|
|
203
|
+
dispatch: (event, e, options) => {
|
|
204
|
+
const st = stationOn(event, side);
|
|
205
|
+
const received = st === undefined ? { refusal: `${event} is not raised on the ${side} bus` } : receiveEvent(e);
|
|
206
|
+
if (st === undefined || "refusal" in received) {
|
|
207
|
+
const reason = `${event}: ${"refusal" in received ? received.refusal : "not raised"}`;
|
|
208
|
+
report(new Error(`engine: ${reason} — the dispatch was not run`));
|
|
209
|
+
return Promise.resolve(Object.freeze({ kind: "failed", registration: ENGINE_ORIGIN.plugin, cause: "violation", reason, skipped: Object.freeze([]) }));
|
|
210
|
+
}
|
|
211
|
+
return runDispatch(event, st, received.payload, options);
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
function participants(event, e, frames, participant) {
|
|
215
|
+
const inFrames = (fs, h) => fs.some((f) => f.plugin === h.reg.name && (f.kind === "dollar" || f.handler === h.index));
|
|
216
|
+
const caller = frames.slice(-1);
|
|
217
|
+
const above = frames.slice(0, -1);
|
|
218
|
+
const out = [];
|
|
219
|
+
for (const h of mounted) {
|
|
220
|
+
if (!h.events.has(event) || !admits(participant, h) || !matcherMatches(h.matcher, e))
|
|
221
|
+
continue;
|
|
222
|
+
if (inFrames(caller, h))
|
|
223
|
+
continue;
|
|
224
|
+
if (!inFrames(above, h))
|
|
225
|
+
out.push({ h, reentry: false });
|
|
226
|
+
else if (h.onCatch !== undefined && !h.observe)
|
|
227
|
+
out.push({ h, reentry: true });
|
|
228
|
+
}
|
|
229
|
+
return out;
|
|
230
|
+
}
|
|
231
|
+
async function callMethod(event, args, caller) {
|
|
232
|
+
const seat = bottoms[event];
|
|
233
|
+
if (seat === undefined)
|
|
234
|
+
throw new Error(`${caller.origin.plugin}: $.${event}: no implementation on the ${side} bus`);
|
|
235
|
+
const st = stationOn(event, side);
|
|
236
|
+
if (st === undefined)
|
|
237
|
+
throw new Error(`${caller.origin.plugin}: $.${event}: not raised on the ${side} bus`);
|
|
238
|
+
let e0 = args;
|
|
239
|
+
if (seat.enter !== undefined) {
|
|
240
|
+
const shaped = receivePayload(seat.enter(args), isProxy, engineObjectsOnce(args)());
|
|
241
|
+
if ("refusal" in shaped)
|
|
242
|
+
throw new TypeError(`${caller.origin.plugin}: $.${event}: ${shaped.refusal}`);
|
|
243
|
+
e0 = shaped.payload;
|
|
244
|
+
}
|
|
245
|
+
const outcome = await runDispatch(event, st, e0, {
|
|
246
|
+
bottom: async (e, ctx) => ({ value: await seat.run(e, ctx) }),
|
|
247
|
+
frames: caller.frames,
|
|
248
|
+
origin: caller.origin,
|
|
249
|
+
signal: caller.signal,
|
|
250
|
+
checkAnswer: methodAnswerViolation,
|
|
251
|
+
});
|
|
252
|
+
if (outcome.kind !== "aborted")
|
|
253
|
+
for (const s of outcome.skipped)
|
|
254
|
+
if (s.cause === "violation")
|
|
255
|
+
report(new Error(`${s.registration}: $.${event}: ${s.reason} — skipped`));
|
|
256
|
+
if (outcome.kind === "aborted")
|
|
257
|
+
throw new Error(`${caller.origin.plugin}: $.${event}: aborted`);
|
|
258
|
+
if (outcome.kind === "failed")
|
|
259
|
+
throw new Error(`${caller.origin.plugin}: $.${event}: ${outcome.reason}`);
|
|
260
|
+
const answer = outcome.answer;
|
|
261
|
+
const deny = typeof answer === "object" && answer !== null ? Reflect.get(answer, "deny") : undefined;
|
|
262
|
+
if (typeof deny === "string")
|
|
263
|
+
throw new Error(`${caller.origin.plugin}: $.${event}: ${deny}`);
|
|
264
|
+
return typeof answer === "object" && answer !== null ? Reflect.get(answer, "value") : undefined;
|
|
265
|
+
}
|
|
266
|
+
function dollarFor(reg, frames, budget, signal, engines) {
|
|
267
|
+
const origin = Object.freeze({ plugin: reg.name, tier: reg.tier });
|
|
268
|
+
const callerFrames = Object.freeze([...frames, Object.freeze({ kind: "dollar", plugin: reg.name })]);
|
|
269
|
+
const namespaces = new Map();
|
|
270
|
+
for (const m of methods) {
|
|
271
|
+
const ns = namespaces.get(m.ns) ?? {};
|
|
272
|
+
namespaces.set(m.ns, ns);
|
|
273
|
+
ns[m.method] = async (args) => {
|
|
274
|
+
if (!reg.callsBound.has(m.event))
|
|
275
|
+
throw new Error(`${reg.name}: $.${m.event}: not declared in uses.calls`);
|
|
276
|
+
const received = receivePayload(args === undefined ? {} : args, isProxy, engines());
|
|
277
|
+
if ("refusal" in received)
|
|
278
|
+
throw new TypeError(`${reg.name}: $.${m.event}: takes one object — ${received.refusal}`);
|
|
279
|
+
if (m.pauses)
|
|
280
|
+
budget.pause();
|
|
281
|
+
try {
|
|
282
|
+
return await callMethod(m.event, received.payload, { frames: callerFrames, origin, signal });
|
|
283
|
+
}
|
|
284
|
+
finally {
|
|
285
|
+
if (m.pauses)
|
|
286
|
+
budget.resume();
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
const out = {};
|
|
291
|
+
for (const [ns, fns] of namespaces)
|
|
292
|
+
out[ns] = Object.freeze(fns);
|
|
293
|
+
return Object.freeze({ ...out, plugin: Object.freeze({ name: reg.name }) });
|
|
294
|
+
}
|
|
295
|
+
function runDispatch(event, st, e0, options) {
|
|
296
|
+
const frames = options.frames ?? [];
|
|
297
|
+
const origin = options.origin ?? ENGINE_ORIGIN;
|
|
298
|
+
const all = participants(event, e0, frames, options.participant);
|
|
299
|
+
const observers = all.filter((p) => !p.reentry && p.h.observe).map((p) => p.h);
|
|
300
|
+
const chain = all.filter((p) => !p.h.observe).map((p) => p.h);
|
|
301
|
+
const reentered = new Set(all.filter((p) => p.reentry).map((p) => p.h));
|
|
302
|
+
const skipped = [];
|
|
303
|
+
const producers = new Map();
|
|
304
|
+
const live = new Set();
|
|
305
|
+
const dispatchAc = new AbortController();
|
|
306
|
+
const terminal = { kind: "terminal" };
|
|
307
|
+
let settled = false;
|
|
308
|
+
let graceTimer;
|
|
309
|
+
let resolveOut = () => { };
|
|
310
|
+
let rejectOut = () => { };
|
|
311
|
+
const out = new Promise((res, rej) => {
|
|
312
|
+
resolveOut = res;
|
|
313
|
+
rejectOut = rej;
|
|
314
|
+
});
|
|
315
|
+
const signal = options.signal;
|
|
316
|
+
const onAbort = () => {
|
|
317
|
+
if (settled)
|
|
318
|
+
return;
|
|
319
|
+
if (st.abort === "grace") {
|
|
320
|
+
graceTimer ??= setTimeout(() => finish({ kind: "aborted" }), POST_ABORT_GRACE_MS);
|
|
321
|
+
unrefTimer(graceTimer);
|
|
322
|
+
}
|
|
323
|
+
else
|
|
324
|
+
finish({ kind: "aborted" });
|
|
325
|
+
};
|
|
326
|
+
function finish(o) {
|
|
327
|
+
if (settled)
|
|
328
|
+
return;
|
|
329
|
+
settled = true;
|
|
330
|
+
signal?.removeEventListener("abort", onAbort);
|
|
331
|
+
if (graceTimer !== undefined)
|
|
332
|
+
clearTimeout(graceTimer);
|
|
333
|
+
const why = new Error(`the ${event} dispatch settled`);
|
|
334
|
+
if (!("kind" in o) || o.kind !== "answered")
|
|
335
|
+
dispatchAc.abort(why);
|
|
336
|
+
for (const ac of live)
|
|
337
|
+
ac.abort(why);
|
|
338
|
+
live.clear();
|
|
339
|
+
if ("reject" in o)
|
|
340
|
+
rejectOut(o.reject);
|
|
341
|
+
else
|
|
342
|
+
resolveOut(Object.freeze(o));
|
|
343
|
+
}
|
|
344
|
+
const pendingRuns = new Set();
|
|
345
|
+
const track = (run) => {
|
|
346
|
+
pendingRuns.add(run);
|
|
347
|
+
const drop = () => void pendingRuns.delete(run);
|
|
348
|
+
run.then(drop, drop);
|
|
349
|
+
};
|
|
350
|
+
const engines = engineObjectsOnce(e0);
|
|
351
|
+
const handOn = (passed) => {
|
|
352
|
+
if (passed === e0)
|
|
353
|
+
return { snap: e0 };
|
|
354
|
+
const handed = handedOn(st.pinned, e0, passed, engines(), isProxy);
|
|
355
|
+
return "violation" in handed ? handed : { snap: handed.payload };
|
|
356
|
+
};
|
|
357
|
+
const takeAnswer = (answer, s, e, h) => {
|
|
358
|
+
let taken = answer;
|
|
359
|
+
if (!s.answers.some((a) => Object.is(a, answer))) {
|
|
360
|
+
const received = receiveAnswer(answer, engines(), isProxy);
|
|
361
|
+
if ("refusal" in received)
|
|
362
|
+
return { violation: received.refusal };
|
|
363
|
+
taken = received.answer;
|
|
364
|
+
}
|
|
365
|
+
const below = s.pending > 0 ? [...s.answers, NEXT_IN_FLIGHT] : s.answers;
|
|
366
|
+
const why = answerViolation(taken, options.checkAnswer, e, answererOf(h), below);
|
|
367
|
+
return why !== undefined ? { violation: why } : { answer: taken };
|
|
368
|
+
};
|
|
369
|
+
const traceOf = (sink, index, plugin, tier, outcome, ms) => {
|
|
370
|
+
sink.push(Object.freeze({ index, plugin, tier, outcome, ms }));
|
|
371
|
+
};
|
|
372
|
+
function startBelow(state, selfTime, i, snap, nextFloors, myFrames) {
|
|
373
|
+
if (state.pending++ === 0)
|
|
374
|
+
selfTime.pause();
|
|
375
|
+
const below = [];
|
|
376
|
+
state.below = below;
|
|
377
|
+
const run = invoke(i + 1, snap, nextFloors, myFrames, below);
|
|
378
|
+
state.last = run;
|
|
379
|
+
const stopCounting = () => {
|
|
380
|
+
if (--state.pending === 0)
|
|
381
|
+
selfTime.resume();
|
|
382
|
+
};
|
|
383
|
+
run.then((v) => {
|
|
384
|
+
state.lastValue = { v };
|
|
385
|
+
state.answers.push(v);
|
|
386
|
+
stopCounting();
|
|
387
|
+
}, (err) => {
|
|
388
|
+
state.belowError = err;
|
|
389
|
+
stopCounting();
|
|
390
|
+
});
|
|
391
|
+
track(run);
|
|
392
|
+
return run;
|
|
393
|
+
}
|
|
394
|
+
async function invoke(i, e, floors, fr, sink) {
|
|
395
|
+
if (settled)
|
|
396
|
+
throw new Error(`the ${event} dispatch already settled`);
|
|
397
|
+
const h = chain[i];
|
|
398
|
+
if (h === undefined) {
|
|
399
|
+
const t0 = Date.now();
|
|
400
|
+
try {
|
|
401
|
+
const v = answerUpward(await options.bottom(e, Object.freeze({ frames: fr, signal: dispatchAc.signal, origin })));
|
|
402
|
+
traceOf(sink, i, "core", "core", "returned", Date.now() - t0);
|
|
403
|
+
return v;
|
|
404
|
+
}
|
|
405
|
+
catch (err) {
|
|
406
|
+
traceOf(sink, i, "core", "core", "rejected", Date.now() - t0);
|
|
407
|
+
throw err;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
if (bypassed(floors, h.reg.tier)) {
|
|
411
|
+
traceOf(sink, i, h.reg.name, h.reg.tier, "bypassed", 0);
|
|
412
|
+
return invoke(i + 1, e, floors, fr, sink);
|
|
413
|
+
}
|
|
414
|
+
return runHandler(h, i, e, floors, fr, sink);
|
|
415
|
+
}
|
|
416
|
+
function makeNext(base, call, to, caught) {
|
|
417
|
+
const next = (e) => call(e);
|
|
418
|
+
Object.defineProperties(next, {
|
|
419
|
+
to: { value: to, enumerable: true },
|
|
420
|
+
origin: { value: origin, enumerable: true },
|
|
421
|
+
signal: { value: base.signal, enumerable: true },
|
|
422
|
+
trace: { get: base.trace, enumerable: true },
|
|
423
|
+
budget: { get: () => base.budget.reading(), enumerable: true },
|
|
424
|
+
...(caught !== undefined ? { error: { value: caught.error, enumerable: true }, called: { value: caught.called, enumerable: true } } : {}),
|
|
425
|
+
});
|
|
426
|
+
const frozen = Object.freeze(next);
|
|
427
|
+
if (!hasNextShape(frozen))
|
|
428
|
+
throw new TypeError("next is malformed");
|
|
429
|
+
return frozen;
|
|
430
|
+
}
|
|
431
|
+
async function runHandler(h, i, e, floors, fr, sink) {
|
|
432
|
+
const name = h.reg.name;
|
|
433
|
+
const ac = new AbortController();
|
|
434
|
+
live.add(ac);
|
|
435
|
+
const budget = createSelfBudget(h.reg.budgetMs, () => ac.abort(new Error(`${name} ran past its ${h.reg.budgetMs}ms budget`)));
|
|
436
|
+
const myFrames = Object.freeze([...fr, Object.freeze({ kind: "handler", plugin: name, handler: h.index })]);
|
|
437
|
+
const state = {
|
|
438
|
+
pending: 0,
|
|
439
|
+
called: false,
|
|
440
|
+
below: [],
|
|
441
|
+
answers: [],
|
|
442
|
+
done: false,
|
|
443
|
+
};
|
|
444
|
+
const descend = (passed, nextFloors) => {
|
|
445
|
+
if (state.done || settled)
|
|
446
|
+
return Promise.reject(new Error(`${name}: next() after it settled`));
|
|
447
|
+
if (state.called) {
|
|
448
|
+
state.violated ??= "next() already called (a handler calls next once; its first run's answer stands)";
|
|
449
|
+
return Promise.reject(new Error(`${name}: next() already called`));
|
|
450
|
+
}
|
|
451
|
+
const handed = handOn(passed);
|
|
452
|
+
if ("violation" in handed) {
|
|
453
|
+
state.violated ??= handed.violation;
|
|
454
|
+
return Promise.reject(new Error(`${name}: ${state.violated}`));
|
|
455
|
+
}
|
|
456
|
+
state.called = true;
|
|
457
|
+
return startBelow(state, budget, i, handed.snap, nextFloors, myFrames);
|
|
458
|
+
};
|
|
459
|
+
const to = (passed, tier) => {
|
|
460
|
+
const why = nextToRefusal(h.reg.tier, tier);
|
|
461
|
+
if (why !== undefined)
|
|
462
|
+
return Promise.reject(new Error(`${name}: ${why}`));
|
|
463
|
+
return descend(passed, [...floors, { from: h.reg.tier, to: tier }]);
|
|
464
|
+
};
|
|
465
|
+
let result;
|
|
466
|
+
let failure;
|
|
467
|
+
let handlerP = Promise.resolve();
|
|
468
|
+
if (reentered.has(h)) {
|
|
469
|
+
failure = { cause: "reentry", reason: "not run: the dispatch re-entered a frame it is part of" };
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
const next = makeNext({ budget, signal: ac.signal, trace: () => Object.freeze([...state.below]) }, (x) => descend(x, floors), to);
|
|
473
|
+
const $ = dollarFor(h.reg, myFrames, budget, ac.signal, engines);
|
|
474
|
+
handlerP = invokeNow(() => h.fn($, e, next));
|
|
475
|
+
try {
|
|
476
|
+
const raced = await Promise.race([handlerP, budget.expired]);
|
|
477
|
+
if (raced === "expired" && budget.isExpired())
|
|
478
|
+
failure = { cause: "timeout", reason: `ran past its ${h.reg.budgetMs}ms budget` };
|
|
479
|
+
else {
|
|
480
|
+
const taken = takeAnswer(raced, state, e, h);
|
|
481
|
+
if ("violation" in taken)
|
|
482
|
+
failure = { cause: "violation", reason: state.violated ?? taken.violation };
|
|
483
|
+
else if (state.violated !== undefined)
|
|
484
|
+
failure = { cause: "violation", reason: state.violated };
|
|
485
|
+
else
|
|
486
|
+
result = taken.answer;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
catch (err) {
|
|
490
|
+
failure = state.violated !== undefined ? { cause: "violation", reason: state.violated } : { cause: "threw", error: err, reason: `threw ${describe(err)}` };
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
state.done = true;
|
|
494
|
+
if (failure?.cause !== "timeout")
|
|
495
|
+
live.delete(ac);
|
|
496
|
+
const ms = budget.usedMs();
|
|
497
|
+
budget.clear();
|
|
498
|
+
if (failure === undefined) {
|
|
499
|
+
const passed = state.lastValue !== undefined && Object.is(state.lastValue.v, result);
|
|
500
|
+
if (!passed)
|
|
501
|
+
producers.set(result, name);
|
|
502
|
+
traceOf(sink, i, name, h.reg.tier, passed ? "passed" : "returned", ms);
|
|
503
|
+
sink.push(...state.below);
|
|
504
|
+
return result;
|
|
505
|
+
}
|
|
506
|
+
if (settled)
|
|
507
|
+
throw failure.error ?? new Error(`${name}: ${failure.reason}`);
|
|
508
|
+
if (failure.error === terminal || (failure.cause === "threw" && state.belowError !== undefined && failure.error === state.belowError && h.onCatch === undefined)) {
|
|
509
|
+
traceOf(sink, i, name, h.reg.tier, "rejected", ms);
|
|
510
|
+
throw failure.error;
|
|
511
|
+
}
|
|
512
|
+
if (failure.cause === "timeout") {
|
|
513
|
+
watchRunaway(handlerP, () => report(new Error(`${name}: ${event}: still running ${RUNAWAY_AFTER_MS}ms after its budget ran out; it ignores its signal`)));
|
|
514
|
+
}
|
|
515
|
+
const caught = h.onCatch !== undefined ? await runCatch(h, i, e, floors, myFrames, state, failure) : undefined;
|
|
516
|
+
if (caught !== undefined && "answer" in caught) {
|
|
517
|
+
if (failure.cause !== "violation" && failure.cause !== "reentry")
|
|
518
|
+
report(new Error(`${name}: ${event}: ${failure.reason}; its .catch answered`));
|
|
519
|
+
producers.set(caught.answer, name);
|
|
520
|
+
traceOf(sink, i, name, h.reg.tier, "caught", ms);
|
|
521
|
+
return caught.answer;
|
|
522
|
+
}
|
|
523
|
+
if (failure.cause === "threw" && state.belowError !== undefined && failure.error === state.belowError) {
|
|
524
|
+
traceOf(sink, i, name, h.reg.tier, "rejected", ms);
|
|
525
|
+
throw failure.error;
|
|
526
|
+
}
|
|
527
|
+
const reason = caught !== undefined ? `${failure.reason}; ${caught.problem}` : failure.reason;
|
|
528
|
+
if (st.failure === "refuse") {
|
|
529
|
+
if (failure.cause !== "violation")
|
|
530
|
+
report(new Error(`${name}: ${event}: ${reason} — failed closed: the dispatch ends here`));
|
|
531
|
+
traceOf(sink, i, name, h.reg.tier, "rejected", ms);
|
|
532
|
+
finish({ kind: "failed", registration: name, cause: failure.cause, reason, skipped: Object.freeze([...skipped]) });
|
|
533
|
+
throw terminal;
|
|
534
|
+
}
|
|
535
|
+
skipped.push(Object.freeze({ registration: name, cause: failure.cause, reason }));
|
|
536
|
+
const effect = state.last !== undefined ? MA : HA;
|
|
537
|
+
if (failure.cause !== "violation")
|
|
538
|
+
report(new Error(`${name}: ${event}: ${reason} — ${effect}`));
|
|
539
|
+
if (state.last !== undefined) {
|
|
540
|
+
traceOf(sink, i, name, h.reg.tier, failure.cause === "timeout" ? "expired" : "kept", ms);
|
|
541
|
+
return state.last;
|
|
542
|
+
}
|
|
543
|
+
traceOf(sink, i, name, h.reg.tier, failure.cause === "timeout" ? "expired" : "skipped", ms);
|
|
544
|
+
return invoke(i + 1, e, floors, fr, sink);
|
|
545
|
+
}
|
|
546
|
+
async function runCatch(h, i, e, floors, myFrames, state, failure) {
|
|
547
|
+
const onCatch = h.onCatch;
|
|
548
|
+
if (onCatch === undefined)
|
|
549
|
+
return { problem: "no .catch" };
|
|
550
|
+
const ac = new AbortController();
|
|
551
|
+
live.add(ac);
|
|
552
|
+
const budget = createSelfBudget(CATCH_BUDGET_MS, () => ac.abort(new Error(`${h.reg.name}: its .catch ran past its ${CATCH_BUDGET_MS}ms budget`)));
|
|
553
|
+
let done = false;
|
|
554
|
+
let violated;
|
|
555
|
+
const replay = (passed, nextFloors) => {
|
|
556
|
+
if (done || settled)
|
|
557
|
+
return Promise.reject(new Error(`${h.reg.name}: next() after its .catch settled`));
|
|
558
|
+
if (state.last !== undefined) {
|
|
559
|
+
const running = state.last;
|
|
560
|
+
budget.pause();
|
|
561
|
+
const resume = () => budget.resume();
|
|
562
|
+
running.then(resume, resume);
|
|
563
|
+
return running;
|
|
564
|
+
}
|
|
565
|
+
const handed = handOn(passed);
|
|
566
|
+
if ("violation" in handed) {
|
|
567
|
+
violated ??= handed.violation;
|
|
568
|
+
return Promise.reject(new Error(`${h.reg.name}: ${violated}`));
|
|
569
|
+
}
|
|
570
|
+
return startBelow(state, budget, i, handed.snap, nextFloors, myFrames);
|
|
571
|
+
};
|
|
572
|
+
const message = failure.cause === "threw" ? describe(failure.error) : failure.cause === "violation" ? failure.reason : undefined;
|
|
573
|
+
const error = Object.freeze({ kind: failure.cause, ...(message !== undefined ? { message } : {}), budget: CATCH_BUDGET_MS });
|
|
574
|
+
const next = makeNext({ budget, signal: ac.signal, trace: () => Object.freeze([...state.below]) }, (x) => replay(x, floors), (x, tier) => {
|
|
575
|
+
const why = nextToRefusal(h.reg.tier, tier);
|
|
576
|
+
return why !== undefined ? Promise.reject(new Error(`${h.reg.name}: ${why}`)) : replay(x, [...floors, { from: h.reg.tier, to: tier }]);
|
|
577
|
+
}, { error, called: state.called });
|
|
578
|
+
try {
|
|
579
|
+
const raced = await Promise.race([invokeNow(() => onCatch(dollarFor(h.reg, myFrames, budget, ac.signal, engines), e, next)), budget.expired]);
|
|
580
|
+
if (raced === "expired" && budget.isExpired())
|
|
581
|
+
return { problem: `its .catch ran past its ${CATCH_BUDGET_MS}ms budget` };
|
|
582
|
+
if (violated !== undefined)
|
|
583
|
+
return { problem: `its .catch ${violated}` };
|
|
584
|
+
const taken = takeAnswer(raced, state, e, h);
|
|
585
|
+
return "violation" in taken ? { problem: `its .catch ${taken.violation}` } : { answer: taken.answer };
|
|
586
|
+
}
|
|
587
|
+
catch (err) {
|
|
588
|
+
return { problem: violated !== undefined ? `its .catch: ${violated}` : `its .catch threw ${describe(err)}` };
|
|
589
|
+
}
|
|
590
|
+
finally {
|
|
591
|
+
done = true;
|
|
592
|
+
if (!budget.isExpired())
|
|
593
|
+
live.delete(ac);
|
|
594
|
+
budget.clear();
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
async function runObserver(h, fr) {
|
|
598
|
+
const name = h.reg.name;
|
|
599
|
+
const ac = new AbortController();
|
|
600
|
+
live.add(ac);
|
|
601
|
+
const budget = createSelfBudget(h.reg.budgetMs, () => ac.abort(new Error(`${name} ran past its ${h.reg.budgetMs}ms budget`)));
|
|
602
|
+
const myFrames = Object.freeze([...fr, Object.freeze({ kind: "handler", plugin: name, handler: h.index })]);
|
|
603
|
+
const refuse = () => Promise.reject(new Error(`${name}: an observe handler is not in the chain; next() is unavailable`));
|
|
604
|
+
const next = makeNext({ budget, signal: ac.signal, trace: () => Object.freeze([]) }, refuse, refuse);
|
|
605
|
+
const verdict = (r) => {
|
|
606
|
+
if (r === undefined)
|
|
607
|
+
return;
|
|
608
|
+
report(new Error(`${name}: ${event}: an observe handler returned a verdict — not adopted; an observe handler answers undefined`), "observational-hook-verdict-ignored");
|
|
609
|
+
};
|
|
610
|
+
try {
|
|
611
|
+
const raced = await Promise.race([invokeNow(() => h.fn(dollarFor(h.reg, myFrames, budget, ac.signal, engines), detachedCopy(e0), next)), budget.expired]);
|
|
612
|
+
if (raced === "expired" && budget.isExpired())
|
|
613
|
+
throw new Error(`ran past its ${h.reg.budgetMs}ms budget`);
|
|
614
|
+
verdict(raced);
|
|
615
|
+
}
|
|
616
|
+
catch (err) {
|
|
617
|
+
if (settled)
|
|
618
|
+
return;
|
|
619
|
+
report(new Error(`${name}: ${event}: an observe handler failed (${describe(err)}) — skipped`));
|
|
620
|
+
const onCatch = h.onCatch;
|
|
621
|
+
if (onCatch !== undefined) {
|
|
622
|
+
const cause = budget.isExpired() ? "timeout" : "threw";
|
|
623
|
+
budget.clear();
|
|
624
|
+
const cac = new AbortController();
|
|
625
|
+
live.add(cac);
|
|
626
|
+
const catchBudget = createSelfBudget(CATCH_BUDGET_MS, () => cac.abort(new Error(`${name}: its .catch ran past its ${CATCH_BUDGET_MS}ms budget`)));
|
|
627
|
+
const cnext = makeNext({ budget: catchBudget, signal: cac.signal, trace: () => Object.freeze([]) }, refuse, refuse, {
|
|
628
|
+
error: Object.freeze({ kind: cause, ...(cause === "threw" ? { message: describe(err) } : {}), budget: CATCH_BUDGET_MS }),
|
|
629
|
+
called: false,
|
|
630
|
+
});
|
|
631
|
+
try {
|
|
632
|
+
const caught = await Promise.race([invokeNow(() => onCatch(dollarFor(h.reg, myFrames, catchBudget, cac.signal, engines), detachedCopy(e0), cnext)), catchBudget.expired]);
|
|
633
|
+
if (!(caught === "expired" && catchBudget.isExpired()))
|
|
634
|
+
verdict(caught);
|
|
635
|
+
}
|
|
636
|
+
catch {
|
|
637
|
+
}
|
|
638
|
+
finally {
|
|
639
|
+
if (!catchBudget.isExpired())
|
|
640
|
+
live.delete(cac);
|
|
641
|
+
catchBudget.clear();
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
finally {
|
|
646
|
+
if (!budget.isExpired())
|
|
647
|
+
live.delete(ac);
|
|
648
|
+
budget.clear();
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
if (signal?.aborted === true && st.abort !== "grace") {
|
|
652
|
+
finish({ kind: "aborted" });
|
|
653
|
+
return out;
|
|
654
|
+
}
|
|
655
|
+
const root = [];
|
|
656
|
+
void (async () => {
|
|
657
|
+
for (const o of observers) {
|
|
658
|
+
if (settled)
|
|
659
|
+
return;
|
|
660
|
+
await runObserver(o, frames);
|
|
661
|
+
}
|
|
662
|
+
if (settled)
|
|
663
|
+
return;
|
|
664
|
+
const answer = await invoke(0, e0, [], frames, root);
|
|
665
|
+
while (st.failure === "refuse" && pendingRuns.size > 0 && !settled)
|
|
666
|
+
await Promise.allSettled([...pendingRuns]);
|
|
667
|
+
finish({ kind: "answered", answer, ...(producers.has(answer) ? { answeredBy: producers.get(answer) } : {}), skipped: Object.freeze([...skipped]) });
|
|
668
|
+
})().catch((err) => {
|
|
669
|
+
if (err === terminal || settled)
|
|
670
|
+
return;
|
|
671
|
+
finish({ reject: err });
|
|
672
|
+
});
|
|
673
|
+
if (signal !== undefined) {
|
|
674
|
+
if (signal.aborted)
|
|
675
|
+
queueMicrotask(onAbort);
|
|
676
|
+
else
|
|
677
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
678
|
+
}
|
|
679
|
+
return out;
|
|
680
|
+
}
|
|
681
|
+
return bus;
|
|
682
|
+
}
|
|
683
|
+
function admits(participant, h) {
|
|
684
|
+
return participant === undefined || participant(Object.freeze({ plugin: h.reg.name, seat: h.reg.seat, observe: h.observe }));
|
|
685
|
+
}
|
|
686
|
+
function answererOf(h) {
|
|
687
|
+
return { plugin: h.reg.name, seat: h.reg.seat, tier: h.reg.tier };
|
|
688
|
+
}
|
|
689
|
+
function hasNextShape(f) {
|
|
690
|
+
return typeof f === "function" && "to" in f && "trace" in f && "budget" in f && "signal" in f && "origin" in f;
|
|
691
|
+
}
|
|
692
|
+
function invokeNow(f) {
|
|
693
|
+
try {
|
|
694
|
+
return Promise.resolve(f());
|
|
695
|
+
}
|
|
696
|
+
catch (err) {
|
|
697
|
+
return Promise.reject(err);
|
|
698
|
+
}
|
|
699
|
+
}
|