@namzu/sdk 32.0.0 → 33.0.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 +127 -0
- package/dist/authorization/gate.d.ts +1 -1
- package/dist/authorization/gate.js +1 -1
- package/dist/connector/index.d.ts +1 -1
- package/dist/connector/index.d.ts.map +1 -1
- package/dist/connector/index.js +1 -1
- package/dist/connector/index.js.map +1 -1
- package/dist/connector/mcp/adapter.d.ts.map +1 -1
- package/dist/connector/mcp/adapter.js +71 -16
- package/dist/connector/mcp/adapter.js.map +1 -1
- package/dist/connector/mcp/client.d.ts.map +1 -1
- package/dist/connector/mcp/client.js +3 -2
- package/dist/connector/mcp/client.js.map +1 -1
- package/dist/connector/mcp/http-redirect.d.ts +17 -0
- package/dist/connector/mcp/http-redirect.d.ts.map +1 -0
- package/dist/connector/mcp/http-redirect.js +31 -0
- package/dist/connector/mcp/http-redirect.js.map +1 -0
- package/dist/connector/mcp/http-sse.d.ts.map +1 -1
- package/dist/connector/mcp/http-sse.js +5 -0
- package/dist/connector/mcp/http-sse.js.map +1 -1
- package/dist/connector/mcp/image-admission.d.ts +16 -0
- package/dist/connector/mcp/image-admission.d.ts.map +1 -0
- package/dist/connector/mcp/image-admission.js +288 -0
- package/dist/connector/mcp/image-admission.js.map +1 -0
- package/dist/connector/mcp/stdio.d.ts +13 -0
- package/dist/connector/mcp/stdio.d.ts.map +1 -1
- package/dist/connector/mcp/stdio.js +66 -23
- package/dist/connector/mcp/stdio.js.map +1 -1
- package/dist/connector/mcp/streamable-http.d.ts.map +1 -1
- package/dist/connector/mcp/streamable-http.js +3 -0
- package/dist/connector/mcp/streamable-http.js.map +1 -1
- package/dist/constants/tools/index.js +1 -1
- package/dist/constants/tools/index.js.map +1 -1
- package/dist/execution/base.d.ts +13 -0
- package/dist/execution/base.d.ts.map +1 -1
- package/dist/execution/base.js +103 -8
- package/dist/execution/base.js.map +1 -1
- package/dist/execution/errors.d.ts +12 -0
- package/dist/execution/errors.d.ts.map +1 -0
- package/dist/execution/errors.js +21 -0
- package/dist/execution/errors.js.map +1 -0
- package/dist/execution/factory.d.ts.map +1 -1
- package/dist/execution/factory.js +1 -0
- package/dist/execution/factory.js.map +1 -1
- package/dist/execution/hybrid.d.ts +5 -0
- package/dist/execution/hybrid.d.ts.map +1 -1
- package/dist/execution/hybrid.js +36 -16
- package/dist/execution/hybrid.js.map +1 -1
- package/dist/execution/index.d.ts +1 -0
- package/dist/execution/index.d.ts.map +1 -1
- package/dist/execution/index.js +1 -0
- package/dist/execution/index.js.map +1 -1
- package/dist/execution/local.d.ts +13 -0
- package/dist/execution/local.d.ts.map +1 -1
- package/dist/execution/local.js +145 -19
- package/dist/execution/local.js.map +1 -1
- package/dist/execution/output.d.ts +27 -0
- package/dist/execution/output.d.ts.map +1 -0
- package/dist/execution/output.js +105 -0
- package/dist/execution/output.js.map +1 -0
- package/dist/execution/remote.d.ts +26 -2
- package/dist/execution/remote.d.ts.map +1 -1
- package/dist/execution/remote.js +86 -15
- package/dist/execution/remote.js.map +1 -1
- package/dist/plugin/lifecycle.d.ts.map +1 -1
- package/dist/plugin/lifecycle.js +9 -3
- package/dist/plugin/lifecycle.js.map +1 -1
- package/dist/process/kill-tree.d.ts +11 -13
- package/dist/process/kill-tree.d.ts.map +1 -1
- package/dist/process/kill-tree.js +11 -13
- package/dist/process/kill-tree.js.map +1 -1
- package/dist/provider/fallback.d.ts.map +1 -1
- package/dist/provider/fallback.js +31 -0
- package/dist/provider/fallback.js.map +1 -1
- package/dist/provider/idle-timeout.d.ts.map +1 -1
- package/dist/provider/idle-timeout.js +5 -0
- package/dist/provider/idle-timeout.js.map +1 -1
- package/dist/provider/retry.d.ts.map +1 -1
- package/dist/provider/retry.js +5 -0
- package/dist/provider/retry.js.map +1 -1
- package/dist/public-runtime.d.ts +2 -2
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +2 -2
- package/dist/public-runtime.js.map +1 -1
- package/dist/registry/tool/execute.d.ts +7 -1
- package/dist/registry/tool/execute.d.ts.map +1 -1
- package/dist/registry/tool/execute.js +201 -54
- package/dist/registry/tool/execute.js.map +1 -1
- package/dist/run/command-gate.d.ts.map +1 -1
- package/dist/run/command-gate.js +11 -0
- package/dist/run/command-gate.js.map +1 -1
- package/dist/run/workspace-fingerprint.d.ts +4 -4
- package/dist/run/workspace-fingerprint.d.ts.map +1 -1
- package/dist/run/workspace-fingerprint.js +6 -4
- package/dist/run/workspace-fingerprint.js.map +1 -1
- package/dist/runtime/bidi/index.d.ts +1 -1
- package/dist/runtime/bidi/index.d.ts.map +1 -1
- package/dist/runtime/bidi/index.js +1 -1
- package/dist/runtime/bidi/index.js.map +1 -1
- package/dist/runtime/bidi/session.d.ts +19 -0
- package/dist/runtime/bidi/session.d.ts.map +1 -1
- package/dist/runtime/bidi/session.js +150 -26
- package/dist/runtime/bidi/session.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +43 -1
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +626 -161
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +46 -4
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/tool-review.js +84 -22
- package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
- package/dist/runtime/query/request-rich-content.d.ts.map +1 -1
- package/dist/runtime/query/request-rich-content.js +33 -13
- package/dist/runtime/query/request-rich-content.js.map +1 -1
- package/dist/runtime/query/resume-pending.d.ts +5 -1
- package/dist/runtime/query/resume-pending.d.ts.map +1 -1
- package/dist/runtime/query/resume-pending.js +66 -1
- package/dist/runtime/query/resume-pending.js.map +1 -1
- package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
- package/dist/runtime/query/tool-output-budget.js +45 -16
- package/dist/runtime/query/tool-output-budget.js.map +1 -1
- package/dist/runtime/query/tooling.d.ts +6 -0
- package/dist/runtime/query/tooling.d.ts.map +1 -1
- package/dist/runtime/query/tooling.js +4 -0
- package/dist/runtime/query/tooling.js.map +1 -1
- package/dist/sandbox/provider/local.d.ts.map +1 -1
- package/dist/sandbox/provider/local.js +193 -41
- package/dist/sandbox/provider/local.js.map +1 -1
- package/dist/scheduler/delegating.d.ts +2 -1
- package/dist/scheduler/delegating.d.ts.map +1 -1
- package/dist/scheduler/delegating.js +6 -5
- package/dist/scheduler/delegating.js.map +1 -1
- package/dist/scheduler/local.d.ts +2 -1
- package/dist/scheduler/local.d.ts.map +1 -1
- package/dist/scheduler/local.js +2 -2
- package/dist/scheduler/local.js.map +1 -1
- package/dist/session/workspace/driver.d.ts +12 -4
- package/dist/session/workspace/driver.d.ts.map +1 -1
- package/dist/session/workspace/git-worktree.d.ts +17 -3
- package/dist/session/workspace/git-worktree.d.ts.map +1 -1
- package/dist/session/workspace/git-worktree.js +153 -34
- package/dist/session/workspace/git-worktree.js.map +1 -1
- package/dist/skills/registry.d.ts +15 -0
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +33 -0
- package/dist/skills/registry.js.map +1 -1
- package/dist/tools/builtins/computer-use.d.ts.map +1 -1
- package/dist/tools/builtins/computer-use.js +39 -2
- package/dist/tools/builtins/computer-use.js.map +1 -1
- package/dist/tools/builtins/run-code.d.ts.map +1 -1
- package/dist/tools/builtins/run-code.js +9 -11
- package/dist/tools/builtins/run-code.js.map +1 -1
- package/dist/tools/builtins/skill.d.ts +2 -1
- package/dist/tools/builtins/skill.d.ts.map +1 -1
- package/dist/tools/builtins/skill.js +250 -6
- package/dist/tools/builtins/skill.js.map +1 -1
- package/dist/tools/coordinator/agent.d.ts.map +1 -1
- package/dist/tools/coordinator/agent.js +100 -30
- package/dist/tools/coordinator/agent.js.map +1 -1
- package/dist/types/agent/manager.d.ts +1 -1
- package/dist/types/agent/manager.d.ts.map +1 -1
- package/dist/types/agent/scheduler.d.ts +10 -1
- package/dist/types/agent/scheduler.d.ts.map +1 -1
- package/dist/types/authorization/index.d.ts +12 -12
- package/dist/types/bidi/index.d.ts +19 -2
- package/dist/types/bidi/index.d.ts.map +1 -1
- package/dist/types/computer-use/index.d.ts +18 -0
- package/dist/types/computer-use/index.d.ts.map +1 -1
- package/dist/types/connector/execution-context.d.ts +3 -1
- package/dist/types/connector/execution-context.d.ts.map +1 -1
- package/dist/types/execution/index.d.ts +43 -1
- package/dist/types/execution/index.d.ts.map +1 -1
- package/dist/types/hitl/index.d.ts +11 -0
- package/dist/types/hitl/index.d.ts.map +1 -1
- package/dist/types/hitl/index.js.map +1 -1
- package/dist/types/message/index.d.ts +1 -1
- package/dist/types/message/index.d.ts.map +1 -1
- package/dist/types/message/index.js +2 -1
- package/dist/types/message/index.js.map +1 -1
- package/dist/types/plugin/index.d.ts +14 -1
- package/dist/types/plugin/index.d.ts.map +1 -1
- package/dist/types/plugin/index.js +1 -0
- package/dist/types/plugin/index.js.map +1 -1
- package/dist/types/provider/interface.d.ts +14 -0
- package/dist/types/provider/interface.d.ts.map +1 -1
- package/dist/types/sandbox/index.d.ts +15 -10
- package/dist/types/sandbox/index.d.ts.map +1 -1
- package/dist/types/sandbox/index.js.map +1 -1
- package/dist/types/tool/index.d.ts +77 -6
- package/dist/types/tool/index.d.ts.map +1 -1
- package/dist/types/tool/index.js.map +1 -1
- package/dist/types/workspace/ref.d.ts +5 -0
- package/dist/types/workspace/ref.d.ts.map +1 -1
- package/dist/utils/abort.d.ts +8 -0
- package/dist/utils/abort.d.ts.map +1 -1
- package/dist/utils/abort.js +16 -0
- package/dist/utils/abort.js.map +1 -1
- package/package.json +4 -4
- package/src/authorization/gate.ts +1 -1
- package/src/connector/index.ts +2 -0
- package/src/connector/mcp/adapter.ts +82 -21
- package/src/connector/mcp/client.ts +2 -1
- package/src/connector/mcp/http-redirect.ts +32 -0
- package/src/connector/mcp/http-sse.ts +5 -0
- package/src/connector/mcp/image-admission.ts +272 -0
- package/src/connector/mcp/stdio.ts +63 -21
- package/src/connector/mcp/streamable-http.ts +3 -0
- package/src/constants/tools/index.ts +1 -1
- package/src/execution/base.ts +124 -7
- package/src/execution/errors.ts +24 -0
- package/src/execution/factory.ts +1 -0
- package/src/execution/hybrid.ts +47 -16
- package/src/execution/index.ts +1 -0
- package/src/execution/local.ts +164 -19
- package/src/execution/output.ts +104 -0
- package/src/execution/remote.ts +122 -17
- package/src/plugin/lifecycle.ts +9 -3
- package/src/process/kill-tree.ts +11 -13
- package/src/provider/fallback.ts +39 -0
- package/src/provider/idle-timeout.ts +8 -0
- package/src/provider/retry.ts +8 -0
- package/src/public-runtime.ts +7 -1
- package/src/registry/tool/execute.ts +230 -64
- package/src/run/command-gate.ts +12 -0
- package/src/run/workspace-fingerprint.ts +5 -4
- package/src/runtime/bidi/index.ts +1 -1
- package/src/runtime/bidi/session.ts +177 -28
- package/src/runtime/query/executor.ts +769 -163
- package/src/runtime/query/index.ts +53 -6
- package/src/runtime/query/iteration/phases/tool-review.ts +87 -23
- package/src/runtime/query/request-rich-content.ts +39 -14
- package/src/runtime/query/resume-pending.ts +83 -1
- package/src/runtime/query/tool-output-budget.ts +52 -17
- package/src/runtime/query/tooling.ts +10 -0
- package/src/sandbox/provider/local.ts +213 -45
- package/src/scheduler/delegating.ts +6 -5
- package/src/scheduler/local.ts +3 -2
- package/src/session/workspace/driver.ts +12 -4
- package/src/session/workspace/git-worktree.ts +173 -34
- package/src/skills/registry.ts +47 -0
- package/src/tools/builtins/computer-use.ts +45 -2
- package/src/tools/builtins/run-code.ts +9 -11
- package/src/tools/builtins/skill.ts +325 -7
- package/src/tools/coordinator/agent.ts +108 -33
- package/src/types/agent/manager.ts +1 -1
- package/src/types/agent/scheduler.ts +10 -1
- package/src/types/bidi/index.ts +19 -2
- package/src/types/computer-use/index.ts +19 -0
- package/src/types/connector/execution-context.ts +3 -0
- package/src/types/execution/index.ts +46 -1
- package/src/types/hitl/index.ts +11 -0
- package/src/types/message/index.ts +3 -2
- package/src/types/plugin/index.ts +15 -0
- package/src/types/provider/interface.ts +18 -0
- package/src/types/sandbox/index.ts +15 -10
- package/src/types/tool/index.ts +85 -6
- package/src/types/workspace/ref.ts +5 -0
- package/src/utils/abort.ts +18 -0
|
@@ -41,10 +41,10 @@
|
|
|
41
41
|
* told to edit something it had already edited.
|
|
42
42
|
*
|
|
43
43
|
* So: a non-zero exit from any git invocation, a repository with no commits,
|
|
44
|
-
* a timeout, or output past the size
|
|
45
|
-
* partial hash. A truncated diff that
|
|
46
|
-
* outcome available here, because two
|
|
47
|
-
* same point collide.
|
|
44
|
+
* a timeout, an executor-reported truncated stream, or output past the size
|
|
45
|
+
* cap all produce `null` rather than a partial hash. A truncated diff that
|
|
46
|
+
* hashed successfully would be the worst outcome available here, because two
|
|
47
|
+
* different workspaces truncated at the same point collide.
|
|
48
48
|
*/
|
|
49
49
|
import { createHash } from 'node:crypto';
|
|
50
50
|
import { lstat, readFile, readlink } from 'node:fs/promises';
|
|
@@ -108,6 +108,8 @@ export async function fingerprintWorkspace(options) {
|
|
|
108
108
|
// this function: it has no basis for a comparison.
|
|
109
109
|
if (result.exitCode !== 0)
|
|
110
110
|
return null;
|
|
111
|
+
if (result.stdoutTruncated === true || result.stderrTruncated === true)
|
|
112
|
+
return null;
|
|
111
113
|
if (Buffer.byteLength(result.stdout, 'utf8') > maxBytes)
|
|
112
114
|
return null;
|
|
113
115
|
return result.stdout;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-fingerprint.js","sourceRoot":"","sources":["../../src/run/workspace-fingerprint.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workspace-fingerprint.js","sourceRoot":"","sources":["../../src/run/workspace-fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAgChC,MAAM,OAAO,GAAkB,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;AAE5D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;AAEpD,2CAA2C;AAC3C,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAA;AAe5C,8EAA8E;AAC9E,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,GAAW,EAAE,EAAiB;IACxE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC1B,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACjC,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC5B,qEAAqE;YACrE,mEAAmE;YACnE,qEAAqE;YACrE,+BAA+B;YAC/B,OAAO,KAAK,GAAG,KAAK,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAA;QAC7C,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAAE,OAAO,KAAK,GAAG,EAAE,CAAA;QACtC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACnC,OAAO,KAAK,GAAG,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;IACtE,CAAC;IAAC,MAAM,CAAC;QACR,uEAAuE;QACvE,4CAA4C;QAC5C,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,OAAoC;IAEpC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,sBAAsB,CAAA;IAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,qBAAqB,CAAA;IAC1D,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,OAAO,CAAA;IAEhC,MAAM,GAAG,GAAG,KAAK,EAAE,IAAc,EAA0B,EAAE;QAC5D,IAAI,MAAqB,CAAA;QACzB,IAAI,CAAC;YACJ,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAA;QACrD,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,CAAA;QACZ,CAAC;QACD,iEAAiE;QACjE,qEAAqE;QACrE,mDAAmD;QACnD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACtC,IAAI,MAAM,CAAC,eAAe,KAAK,IAAI,IAAI,MAAM,CAAC,eAAe,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QACnF,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,QAAQ;YAAE,OAAO,IAAI,CAAA;QACpE,OAAO,MAAM,CAAC,MAAM,CAAA;IACrB,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAA;IACnD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAEhC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;IACpD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAE9B,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC,CAAA;IACjF,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAEnC,MAAM,KAAK,GAAG,CAAC,UAAU,MAAM,EAAE,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAA;IAClD,yEAAyE;IACzE,qEAAqE;IACrE,yBAAyB;IACzB,EAAE;IACF,qEAAqE;IACrE,0EAA0E;IAC1E,eAAe;IACf,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAChE,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QAChD,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAClB,CAAC;IAED,uEAAuE;IACvE,wEAAwE;IACxE,iEAAiE;IACjE,2EAA2E;IAC3E,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IACnF,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { createMockBidiProvider } from './mock.js';
|
|
2
2
|
export type { MockBidiScript, MockBidiSession } from './mock.js';
|
|
3
|
-
export { startBidiRun } from './session.js';
|
|
3
|
+
export { BidiSessionCloseTimeoutError, startBidiRun } from './session.js';
|
|
4
4
|
export type { BidiRun, BidiRunParams } from './session.js';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/bidi/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAClD,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/bidi/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAClD,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,EAAE,4BAA4B,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACzE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/bidi/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/bidi/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAElD,OAAO,EAAE,4BAA4B,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -2,6 +2,10 @@ import type { BidiConnectParams, BidiProvider, BidiRunEvent, BidiSession } from
|
|
|
2
2
|
import type { RunId } from '../../types/ids/index.js';
|
|
3
3
|
import type { ToolRegistryContract } from '../../types/tool/index.js';
|
|
4
4
|
import { type Logger } from '../../utils/logger.js';
|
|
5
|
+
export declare class BidiSessionCloseTimeoutError extends Error {
|
|
6
|
+
readonly timeoutMs: number;
|
|
7
|
+
constructor(timeoutMs: number);
|
|
8
|
+
}
|
|
5
9
|
/**
|
|
6
10
|
* Run tools for a duplex session.
|
|
7
11
|
*
|
|
@@ -27,7 +31,17 @@ export interface BidiRunParams {
|
|
|
27
31
|
readonly connect: BidiConnectParams;
|
|
28
32
|
readonly workingDirectory: string;
|
|
29
33
|
readonly env?: Record<string, string>;
|
|
34
|
+
/**
|
|
35
|
+
* Owns the complete run lifetime, not only connection establishment.
|
|
36
|
+
* Aborting it closes the provider session, ends local events and revokes
|
|
37
|
+
* every tool context without mutating the caller-owned controller.
|
|
38
|
+
*/
|
|
30
39
|
readonly signal?: AbortSignal;
|
|
40
|
+
/**
|
|
41
|
+
* How long `close()` waits for provider cleanup after fencing locally.
|
|
42
|
+
* Defaults to five seconds. `0` preserves an unbounded provider-close wait.
|
|
43
|
+
*/
|
|
44
|
+
readonly closeTimeoutMs?: number;
|
|
31
45
|
readonly log?: Logger;
|
|
32
46
|
/** Overrides the generated id, so a host can correlate its own. */
|
|
33
47
|
readonly runId?: RunId;
|
|
@@ -38,6 +52,11 @@ export interface BidiRun {
|
|
|
38
52
|
events(): AsyncIterable<BidiRunEvent>;
|
|
39
53
|
/** Push input from the human. */
|
|
40
54
|
send(input: Parameters<BidiSession['send']>[0]): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Fence the local run immediately, abort tool contexts and close the
|
|
57
|
+
* provider once. It does not wait for tool code that ignores cancellation;
|
|
58
|
+
* provider cleanup is observed for `BidiRunParams.closeTimeoutMs`.
|
|
59
|
+
*/
|
|
41
60
|
close(): Promise<void>;
|
|
42
61
|
}
|
|
43
62
|
export declare function startBidiRun(params: BidiRunParams): Promise<BidiRun>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/runtime/bidi/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,KAAK,EAAe,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAIlF,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/runtime/bidi/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,KAAK,EAAe,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAIlF,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,uBAAuB,CAAA;AAKlE,qBAAa,4BAA6B,SAAQ,KAAK;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM;CAMtC;AAgBD;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAA;IACpC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CACtB;AAED,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,qEAAqE;IACrE,MAAM,IAAI,aAAa,CAAC,YAAY,CAAC,CAAA;IACrC,iCAAiC;IACjC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9D;;;;OAIG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAsQ1E"}
|
|
@@ -3,30 +3,136 @@ import { toErrorMessage } from '../../utils/error.js';
|
|
|
3
3
|
import { generateRunId } from '../../utils/id.js';
|
|
4
4
|
import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js';
|
|
5
5
|
import { resolveLogger } from '../../utils/logger.js';
|
|
6
|
+
const DEFAULT_CLOSE_TIMEOUT_MS = 5_000;
|
|
7
|
+
const MAX_TIMER_DELAY_MS = 2_147_483_647;
|
|
8
|
+
export class BidiSessionCloseTimeoutError extends Error {
|
|
9
|
+
timeoutMs;
|
|
10
|
+
constructor(timeoutMs) {
|
|
11
|
+
super(`Duplex provider session close did not settle within ${timeoutMs}ms. The local run is fenced and its tool authority was revoked, but provider cleanup is still unconfirmed.`);
|
|
12
|
+
this.timeoutMs = timeoutMs;
|
|
13
|
+
this.name = 'BidiSessionCloseTimeoutError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async function waitForProviderClose(pending, timeoutMs) {
|
|
17
|
+
if (timeoutMs === 0)
|
|
18
|
+
return await pending;
|
|
19
|
+
let timer;
|
|
20
|
+
const timeout = new Promise((_, reject) => {
|
|
21
|
+
timer = setTimeout(() => reject(new BidiSessionCloseTimeoutError(timeoutMs)), timeoutMs);
|
|
22
|
+
timer.unref?.();
|
|
23
|
+
});
|
|
24
|
+
try {
|
|
25
|
+
await Promise.race([pending, timeout]);
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
if (timer)
|
|
29
|
+
clearTimeout(timer);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
6
32
|
export async function startBidiRun(params) {
|
|
33
|
+
params.signal?.throwIfAborted();
|
|
34
|
+
const closeTimeoutMs = params.closeTimeoutMs ?? DEFAULT_CLOSE_TIMEOUT_MS;
|
|
35
|
+
if (!Number.isInteger(closeTimeoutMs) ||
|
|
36
|
+
closeTimeoutMs < 0 ||
|
|
37
|
+
closeTimeoutMs > MAX_TIMER_DELAY_MS) {
|
|
38
|
+
throw new RangeError(`BidiRunParams.closeTimeoutMs must be an integer from 0 through ${MAX_TIMER_DELAY_MS}`);
|
|
39
|
+
}
|
|
7
40
|
const runId = params.runId ?? generateRunId();
|
|
8
41
|
const log = resolveLogger(params.log).child({
|
|
9
42
|
[SCOPE_ATTRIBUTE]: 'runtime/bidi/session',
|
|
10
43
|
[NAMZU.RUN_ID]: runId,
|
|
11
44
|
});
|
|
12
|
-
const
|
|
45
|
+
const lifetime = new AbortController();
|
|
46
|
+
const queue = [];
|
|
47
|
+
let wake;
|
|
48
|
+
let closed = false;
|
|
49
|
+
let session;
|
|
50
|
+
let transportCloseRequested = false;
|
|
51
|
+
let transportClosePromise;
|
|
52
|
+
const requestTransportClose = () => {
|
|
53
|
+
transportCloseRequested = true;
|
|
54
|
+
if (!session)
|
|
55
|
+
return Promise.resolve();
|
|
56
|
+
if (!transportClosePromise) {
|
|
57
|
+
const ownedSession = session;
|
|
58
|
+
transportClosePromise = Promise.resolve().then(async () => await ownedSession.close());
|
|
59
|
+
}
|
|
60
|
+
return transportClosePromise;
|
|
61
|
+
};
|
|
62
|
+
const beginClose = (reason, closeTransport) => {
|
|
63
|
+
if (!closed) {
|
|
64
|
+
closed = true;
|
|
65
|
+
lifetime.abort(reason);
|
|
66
|
+
wake?.();
|
|
67
|
+
}
|
|
68
|
+
if (closeTransport) {
|
|
69
|
+
void requestTransportClose().catch((error) => {
|
|
70
|
+
log.warn('Duplex provider session close failed', {
|
|
71
|
+
'exception.message': toErrorMessage(error),
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
const onCallerAbort = () => beginClose(params.signal?.reason, true);
|
|
77
|
+
params.signal?.addEventListener('abort', onCallerAbort, { once: true });
|
|
78
|
+
lifetime.signal.addEventListener('abort', () => params.signal?.removeEventListener('abort', onCallerAbort), { once: true });
|
|
79
|
+
const connecting = Promise.resolve()
|
|
80
|
+
.then(async () => await params.provider.connect({
|
|
13
81
|
...params.connect,
|
|
14
|
-
|
|
82
|
+
signal: lifetime.signal,
|
|
83
|
+
}))
|
|
84
|
+
.then((connected) => {
|
|
85
|
+
session = connected;
|
|
86
|
+
if (transportCloseRequested) {
|
|
87
|
+
void requestTransportClose().catch((error) => {
|
|
88
|
+
log.warn('Late duplex provider session close failed', {
|
|
89
|
+
'exception.message': toErrorMessage(error),
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return connected;
|
|
15
94
|
});
|
|
95
|
+
let removeConnectAbort;
|
|
96
|
+
const connectionAbort = new Promise((_, reject) => {
|
|
97
|
+
const rejectFromLifetime = () => reject(lifetime.signal.reason);
|
|
98
|
+
removeConnectAbort = () => lifetime.signal.removeEventListener('abort', rejectFromLifetime);
|
|
99
|
+
if (lifetime.signal.aborted)
|
|
100
|
+
rejectFromLifetime();
|
|
101
|
+
else
|
|
102
|
+
lifetime.signal.addEventListener('abort', rejectFromLifetime, { once: true });
|
|
103
|
+
});
|
|
104
|
+
let activeSession;
|
|
105
|
+
try {
|
|
106
|
+
activeSession = await Promise.race([connecting, connectionAbort]);
|
|
107
|
+
lifetime.signal.throwIfAborted();
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
removeConnectAbort?.();
|
|
111
|
+
params.signal?.removeEventListener('abort', onCallerAbort);
|
|
112
|
+
if (lifetime.signal.aborted) {
|
|
113
|
+
void connecting.catch(() => undefined);
|
|
114
|
+
throw lifetime.signal.reason;
|
|
115
|
+
}
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
removeConnectAbort?.();
|
|
16
119
|
// One generation of work. Bumped by every interruption, so a tool that
|
|
17
120
|
// started under an older generation knows its answer is stale without
|
|
18
121
|
// needing a handle on the call that cancelled it.
|
|
19
122
|
let generation = 0;
|
|
20
|
-
const
|
|
21
|
-
const queue = [];
|
|
22
|
-
let wake;
|
|
123
|
+
const executionIds = new Set();
|
|
23
124
|
const emit = (event) => {
|
|
125
|
+
if (closed)
|
|
126
|
+
return false;
|
|
24
127
|
queue.push(event);
|
|
25
128
|
wake?.();
|
|
129
|
+
return true;
|
|
26
130
|
};
|
|
27
131
|
const executeCall = async (call) => {
|
|
28
132
|
const startedUnder = generation;
|
|
29
|
-
emit({ type: 'tool_started', runId, toolUseId: call.id, toolName: call.name })
|
|
133
|
+
if (!emit({ type: 'tool_started', runId, toolUseId: call.id, toolName: call.name })) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
30
136
|
let output;
|
|
31
137
|
let isError = false;
|
|
32
138
|
try {
|
|
@@ -40,7 +146,7 @@ export async function startBidiRun(params) {
|
|
|
40
146
|
const context = {
|
|
41
147
|
runId,
|
|
42
148
|
workingDirectory: params.workingDirectory,
|
|
43
|
-
abortSignal:
|
|
149
|
+
abortSignal: lifetime.signal,
|
|
44
150
|
env: params.env ?? {},
|
|
45
151
|
log: (level, message) => log[level](message),
|
|
46
152
|
toolUseId: call.id,
|
|
@@ -53,12 +159,21 @@ export async function startBidiRun(params) {
|
|
|
53
159
|
output = toErrorMessage(err);
|
|
54
160
|
isError = true;
|
|
55
161
|
}
|
|
162
|
+
if (closed)
|
|
163
|
+
return;
|
|
56
164
|
if (startedUnder !== generation) {
|
|
57
165
|
// The human spoke over the model while this ran. Delivering the
|
|
58
166
|
// answer now would put it in a conversation that has moved on.
|
|
59
167
|
emit({ type: 'tool_abandoned', runId, toolUseId: call.id, toolName: call.name });
|
|
60
168
|
return;
|
|
61
169
|
}
|
|
170
|
+
// Entering the provider send is the publication commit point. A later
|
|
171
|
+
// conversational interruption cannot recall a write already handed to
|
|
172
|
+
// the provider, but closing the run still closes the whole session and
|
|
173
|
+
// fences the local terminal event.
|
|
174
|
+
await activeSession.sendToolResult(call.id, output, isError);
|
|
175
|
+
if (closed)
|
|
176
|
+
return;
|
|
62
177
|
emit({
|
|
63
178
|
type: 'tool_completed',
|
|
64
179
|
runId,
|
|
@@ -67,12 +182,12 @@ export async function startBidiRun(params) {
|
|
|
67
182
|
output,
|
|
68
183
|
isError,
|
|
69
184
|
});
|
|
70
|
-
await session.sendToolResult(call.id, output, isError);
|
|
71
185
|
};
|
|
72
|
-
let closed = false;
|
|
73
186
|
const pump = (async () => {
|
|
74
187
|
try {
|
|
75
|
-
for await (const event of
|
|
188
|
+
for await (const event of activeSession.events()) {
|
|
189
|
+
if (closed)
|
|
190
|
+
break;
|
|
76
191
|
switch (event.type) {
|
|
77
192
|
case 'text':
|
|
78
193
|
emit({ type: 'text', runId, text: event.text });
|
|
@@ -81,13 +196,18 @@ export async function startBidiRun(params) {
|
|
|
81
196
|
emit({ type: 'audio', runId, data: event.data, mediaType: event.mediaType });
|
|
82
197
|
break;
|
|
83
198
|
case 'tool_call': {
|
|
199
|
+
if (executionIds.has(event.id)) {
|
|
200
|
+
const error = new Error(`Duplex provider repeated tool-call id "${event.id}". Re-executing it could repeat a side effect, so the session was closed.`);
|
|
201
|
+
emit({ type: 'error', runId, message: error.message });
|
|
202
|
+
beginClose(error, true);
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
executionIds.add(event.id);
|
|
84
206
|
// Started, not awaited: awaiting here would stall the very
|
|
85
207
|
// stream an interruption arrives on.
|
|
86
|
-
|
|
208
|
+
void executeCall(event).catch((err) => {
|
|
87
209
|
emit({ type: 'error', runId, message: toErrorMessage(err) });
|
|
88
210
|
});
|
|
89
|
-
inflight.add(running);
|
|
90
|
-
void running.finally(() => inflight.delete(running));
|
|
91
211
|
break;
|
|
92
212
|
}
|
|
93
213
|
case 'turn_complete':
|
|
@@ -106,7 +226,7 @@ export async function startBidiRun(params) {
|
|
|
106
226
|
runId,
|
|
107
227
|
...(event.reason !== undefined ? { reason: event.reason } : {}),
|
|
108
228
|
});
|
|
109
|
-
closed
|
|
229
|
+
beginClose(new Error(event.reason ?? 'the duplex provider session closed'), false);
|
|
110
230
|
break;
|
|
111
231
|
default: {
|
|
112
232
|
const _exhaustive = event;
|
|
@@ -118,14 +238,17 @@ export async function startBidiRun(params) {
|
|
|
118
238
|
}
|
|
119
239
|
}
|
|
120
240
|
catch (err) {
|
|
121
|
-
|
|
241
|
+
if (!closed) {
|
|
242
|
+
emit({ type: 'error', runId, message: toErrorMessage(err) });
|
|
243
|
+
beginClose(err, true);
|
|
244
|
+
}
|
|
122
245
|
}
|
|
123
246
|
finally {
|
|
124
|
-
closed
|
|
125
|
-
|
|
126
|
-
wake?.();
|
|
247
|
+
if (!closed)
|
|
248
|
+
beginClose(new Error('the duplex provider event stream ended'), true);
|
|
127
249
|
}
|
|
128
250
|
})();
|
|
251
|
+
void pump.catch(() => undefined);
|
|
129
252
|
async function* events() {
|
|
130
253
|
while (true) {
|
|
131
254
|
while (queue.length > 0) {
|
|
@@ -144,15 +267,16 @@ export async function startBidiRun(params) {
|
|
|
144
267
|
return {
|
|
145
268
|
runId,
|
|
146
269
|
events,
|
|
147
|
-
send: (input) =>
|
|
270
|
+
send: async (input) => {
|
|
271
|
+
lifetime.signal.throwIfAborted();
|
|
272
|
+
// As with tool results, entering the provider send is the atomic
|
|
273
|
+
// publication boundary. A caller must not retry merely because the
|
|
274
|
+
// lifetime changed after the provider accepted the input.
|
|
275
|
+
await activeSession.send(input);
|
|
276
|
+
},
|
|
148
277
|
close: async () => {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
wake?.();
|
|
152
|
-
// Tools still running are awaited, so a close cannot leave one
|
|
153
|
-
// writing into a session nobody is reading.
|
|
154
|
-
await Promise.allSettled([...inflight]);
|
|
155
|
-
await pump.catch(() => undefined);
|
|
278
|
+
beginClose(new Error('the duplex run was closed by its host'), true);
|
|
279
|
+
await waitForProviderClose(requestTransportClose(), closeTimeoutMs);
|
|
156
280
|
},
|
|
157
281
|
};
|
|
158
282
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/runtime/bidi/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oCAAoC,CAAA;AAS1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAe,aAAa,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/runtime/bidi/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Span } from '@opentelemetry/api';
|
|
2
|
+
import type { AuthorizationGate } from '../../authorization/gate.js';
|
|
2
3
|
import type { WorkingStateManager } from '../../compaction/manager.js';
|
|
3
4
|
import type { PluginLifecycleManager } from '../../plugin/lifecycle.js';
|
|
4
5
|
import type { ProbeEnforcement } from '../../probe/registry.js';
|
|
@@ -8,6 +9,7 @@ import type { InvocationState } from '../../types/invocation/index.js';
|
|
|
8
9
|
import { type Message, type ToolResultContent } from '../../types/message/index.js';
|
|
9
10
|
import type { PermissionMode } from '../../types/permission/index.js';
|
|
10
11
|
import type { ChatCompletionResponse } from '../../types/provider/index.js';
|
|
12
|
+
import type { AuditEventInput } from '../../types/run/audit.js';
|
|
11
13
|
import type { RunEvent } from '../../types/run/index.js';
|
|
12
14
|
import type { Sandbox } from '../../types/sandbox/index.js';
|
|
13
15
|
import type { RequestToolPause, SkillRegistryRef, ToolContext, ToolRegistryContract } from '../../types/tool/index.js';
|
|
@@ -17,6 +19,20 @@ import type { Logger } from '../../utils/logger.js';
|
|
|
17
19
|
import { type BackgroundJobRegistry } from '../jobs/registry.js';
|
|
18
20
|
import type { ToolResultObservation } from './project-instructions.js';
|
|
19
21
|
export type EmitEvent = (event: RunEvent) => Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Executor-owned, single-use preparation of one provider tool-call batch.
|
|
24
|
+
*
|
|
25
|
+
* Consumers may inspect `reviewCalls`; only the creating executor can consume
|
|
26
|
+
* the opaque call preparations. This keeps schema transforms, plugin rewrites,
|
|
27
|
+
* authorization and execution on one value instead of reparsing between them.
|
|
28
|
+
*/
|
|
29
|
+
export interface PreparedToolBatch {
|
|
30
|
+
readonly reviewCalls: readonly {
|
|
31
|
+
readonly id: string;
|
|
32
|
+
readonly name: string;
|
|
33
|
+
readonly input: unknown;
|
|
34
|
+
}[];
|
|
35
|
+
}
|
|
20
36
|
/**
|
|
21
37
|
* Default per-tool deadline. Long enough for a real build or test run,
|
|
22
38
|
* short enough that a wedged tool does not hold a turn open indefinitely.
|
|
@@ -165,6 +181,17 @@ export interface ToolExecutorConfig {
|
|
|
165
181
|
* reaches it. See {@link RepairToolCall}.
|
|
166
182
|
*/
|
|
167
183
|
repairToolCall?: RepairToolCall;
|
|
184
|
+
/**
|
|
185
|
+
* Operator policy applied to calls dispatched by another tool.
|
|
186
|
+
*
|
|
187
|
+
* Model-issued calls are reviewed by the iteration orchestrator. Nested
|
|
188
|
+
* calls cannot open a second durable review while their parent is already
|
|
189
|
+
* executing, so only an explicit `allow` may proceed; `deny` and `review`
|
|
190
|
+
* both fail closed before the registry is touched.
|
|
191
|
+
*/
|
|
192
|
+
authorizationGate?: AuthorizationGate;
|
|
193
|
+
/** Durable refusal sink paired with {@link authorizationGate}. */
|
|
194
|
+
recordAudit?: (input: AuditEventInput) => Promise<unknown>;
|
|
168
195
|
}
|
|
169
196
|
/** What one tool call produced, before it becomes a message. */
|
|
170
197
|
export interface ToolCallOutcome {
|
|
@@ -221,6 +248,7 @@ export declare class ToolExecutor {
|
|
|
221
248
|
private workingStateManager?;
|
|
222
249
|
private probes;
|
|
223
250
|
private parentSpan?;
|
|
251
|
+
private readonly preparedBatches;
|
|
224
252
|
/** Set per turn by the orchestrator; see {@link setStepAllowedTools}. */
|
|
225
253
|
private stepAllowedTools?;
|
|
226
254
|
private readonly readPaths;
|
|
@@ -321,7 +349,18 @@ export declare class ToolExecutor {
|
|
|
321
349
|
*/
|
|
322
350
|
private effectiveAllowedTools;
|
|
323
351
|
private resolvePermissionMode;
|
|
324
|
-
|
|
352
|
+
/** Evaluate the run's operator policy against one already-prepared value. */
|
|
353
|
+
evaluatePreparedAuthorization(toolName: string, input: unknown): import("../../public-types.js").GateEvaluationResult | undefined;
|
|
354
|
+
/**
|
|
355
|
+
* Resolve repairs and pre-tool hooks, then decode each call exactly once.
|
|
356
|
+
* The returned projection is what policy and a human review; execution later
|
|
357
|
+
* consumes the registry-owned preparations rather than parsing again.
|
|
358
|
+
*/
|
|
359
|
+
prepareBatchForReview(response: ChatCompletionResponse): Promise<PreparedToolBatch>;
|
|
360
|
+
/** Re-prepare only calls whose raw input a reviewer actually changed. */
|
|
361
|
+
reprepareBatchForReview(response: ChatCompletionResponse, previous: PreparedToolBatch, changedCallIds: ReadonlySet<string>): Promise<PreparedToolBatch>;
|
|
362
|
+
private publishPreparedBatch;
|
|
363
|
+
executeBatch(response: ChatCompletionResponse, denials?: ToolCallDenials, prior?: PriorToolResults, preparedBatch?: PreparedToolBatch): Promise<ToolExecutionBatch>;
|
|
325
364
|
private runBatch;
|
|
326
365
|
/**
|
|
327
366
|
* Run a tool on behalf of another tool, and put it on the record.
|
|
@@ -362,6 +401,8 @@ export declare class ToolExecutor {
|
|
|
362
401
|
*/
|
|
363
402
|
private executeWithDeadline;
|
|
364
403
|
private runPreToolHook;
|
|
404
|
+
private prepareNestedCall;
|
|
405
|
+
private prepareDirectCall;
|
|
365
406
|
private interpretPreToolResults;
|
|
366
407
|
/**
|
|
367
408
|
* Turn the call the model issued into a name and a parsed input, giving
|
|
@@ -416,6 +457,7 @@ export declare class ToolExecutor {
|
|
|
416
457
|
*/
|
|
417
458
|
private recordDenial;
|
|
418
459
|
private recordSyntheticHookOutcome;
|
|
460
|
+
private recordSyntheticPreparation;
|
|
419
461
|
/**
|
|
420
462
|
* Bound the rich channel, or leave it alone when no cap is configured.
|
|
421
463
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/runtime/query/executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/runtime/query/executor.ts"],"names":[],"mappings":"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"}
|