@namzu/sdk 32.0.0 → 33.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +157 -0
- package/dist/authorization/gate.d.ts +1 -1
- package/dist/authorization/gate.js +1 -1
- package/dist/bridge/a2a/mapper.d.ts.map +1 -1
- package/dist/bridge/a2a/mapper.js +13 -0
- package/dist/bridge/a2a/mapper.js.map +1 -1
- package/dist/bridge/sse/mapper.d.ts.map +1 -1
- package/dist/bridge/sse/mapper.js +3 -0
- package/dist/bridge/sse/mapper.js.map +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/capabilities.d.ts +2 -0
- package/dist/provider/capabilities.d.ts.map +1 -1
- package/dist/provider/capabilities.js +6 -0
- package/dist/provider/capabilities.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 +3 -1
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +48 -4
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/index.d.ts +10 -0
- package/dist/runtime/query/iteration/index.d.ts.map +1 -1
- package/dist/runtime/query/iteration/index.js +67 -0
- package/dist/runtime/query/iteration/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/context.d.ts +5 -0
- package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/context.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/result.d.ts.map +1 -1
- package/dist/runtime/query/result.js +25 -22
- package/dist/runtime/query/result.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 +76 -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/errors/catalog.d.ts.map +1 -1
- package/dist/types/errors/catalog.js +13 -6
- package/dist/types/errors/catalog.js.map +1 -1
- package/dist/types/errors/index.d.ts.map +1 -1
- package/dist/types/errors/index.js +21 -8
- package/dist/types/errors/index.js.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/config.d.ts +9 -0
- package/dist/types/provider/config.d.ts.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/run/events.d.ts +17 -0
- package/dist/types/run/events.d.ts.map +1 -1
- package/dist/types/run/events.js.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/tool/presentation.d.ts +6 -2
- package/dist/types/tool/presentation.d.ts.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/bridge/a2a/mapper.ts +23 -4
- package/src/bridge/sse/mapper.ts +3 -0
- 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/capabilities.ts +10 -0
- 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 +58 -7
- package/src/runtime/query/iteration/index.ts +72 -0
- package/src/runtime/query/iteration/phases/context.ts +5 -0
- 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/result.ts +25 -23
- 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 +86 -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/errors/catalog.ts +14 -6
- package/src/types/errors/index.ts +22 -8
- 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/config.ts +9 -0
- package/src/types/provider/interface.ts +18 -0
- package/src/types/run/events.ts +17 -3
- package/src/types/sandbox/index.ts +15 -10
- package/src/types/tool/index.ts +85 -6
- package/src/types/tool/presentation.ts +10 -3
- package/src/types/workspace/ref.ts +5 -0
- package/src/utils/abort.ts +18 -0
package/dist/execution/hybrid.js
CHANGED
|
@@ -9,6 +9,7 @@ export class HybridExecutionContext extends BaseExecutionContext {
|
|
|
9
9
|
remoteTargets;
|
|
10
10
|
routingStrategy;
|
|
11
11
|
roundRobinIndex = 0;
|
|
12
|
+
admissionsOpen = true;
|
|
12
13
|
constructor(options) {
|
|
13
14
|
super(options.log);
|
|
14
15
|
this.id = options.id;
|
|
@@ -21,6 +22,7 @@ export class HybridExecutionContext extends BaseExecutionContext {
|
|
|
21
22
|
envVars: options.local.envVars,
|
|
22
23
|
capabilities: options.local.capabilities,
|
|
23
24
|
shell: options.local.shell,
|
|
25
|
+
maxOutputBytes: options.local.maxOutputBytes,
|
|
24
26
|
log: options.log,
|
|
25
27
|
});
|
|
26
28
|
this.localCtx.on((event) => this.emit(event));
|
|
@@ -48,13 +50,24 @@ export class HybridExecutionContext extends BaseExecutionContext {
|
|
|
48
50
|
'namzu.execution.routing_strategy': this.routingStrategy,
|
|
49
51
|
});
|
|
50
52
|
}
|
|
53
|
+
onInitializationStarted() {
|
|
54
|
+
this.admissionsOpen = false;
|
|
55
|
+
}
|
|
56
|
+
onInitializationCommitted() {
|
|
57
|
+
this.admissionsOpen = true;
|
|
58
|
+
}
|
|
59
|
+
onTeardownRequested() {
|
|
60
|
+
this.admissionsOpen = false;
|
|
61
|
+
}
|
|
51
62
|
async doTeardown() {
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
63
|
+
const contexts = [this.localCtx, ...this.remoteCtxs.values()];
|
|
64
|
+
const results = await Promise.allSettled(contexts.map((context) => context.teardown()));
|
|
65
|
+
const failures = results.flatMap((result) => result.status === 'rejected' ? [result.reason] : []);
|
|
66
|
+
if (failures.length === 1)
|
|
67
|
+
throw failures[0];
|
|
68
|
+
if (failures.length > 1) {
|
|
69
|
+
throw new AggregateError(failures, 'Multiple hybrid execution contexts failed to tear down');
|
|
55
70
|
}
|
|
56
|
-
await Promise.allSettled(teardownPromises);
|
|
57
|
-
await this.localCtx.teardown();
|
|
58
71
|
}
|
|
59
72
|
getLocal() {
|
|
60
73
|
return this.localCtx;
|
|
@@ -80,21 +93,25 @@ export class HybridExecutionContext extends BaseExecutionContext {
|
|
|
80
93
|
await Promise.all(promises);
|
|
81
94
|
}
|
|
82
95
|
async disconnectAllRemotes() {
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
96
|
+
const results = await Promise.allSettled(Array.from(this.remoteCtxs.values(), (remote) => remote.disconnect()));
|
|
97
|
+
const failures = results.flatMap((result) => result.status === 'rejected' ? [result.reason] : []);
|
|
98
|
+
if (failures.length === 1)
|
|
99
|
+
throw failures[0];
|
|
100
|
+
if (failures.length > 1) {
|
|
101
|
+
throw new AggregateError(failures, 'Multiple remote execution contexts failed to disconnect');
|
|
86
102
|
}
|
|
87
|
-
await Promise.allSettled(promises);
|
|
88
103
|
}
|
|
89
104
|
async executeCommand(command, args = [], options) {
|
|
105
|
+
if (!this.admissionsOpen) {
|
|
106
|
+
throw new Error(`Hybrid execution context "${this.id}" is initializing, tearing down, or torn down. Wait for initialization to commit before executing another command.`);
|
|
107
|
+
}
|
|
90
108
|
switch (this.routingStrategy) {
|
|
91
109
|
case 'local-first':
|
|
92
110
|
return this.localCtx.executeCommand(command, args, options);
|
|
93
111
|
case 'remote-first': {
|
|
94
112
|
const connectedRemote = this.getFirstConnectedRemote();
|
|
95
113
|
if (connectedRemote) {
|
|
96
|
-
|
|
97
|
-
return connectedRemote.executeRemote(fullCommand, options);
|
|
114
|
+
return connectedRemote.executeCommand(command, args, options);
|
|
98
115
|
}
|
|
99
116
|
return this.localCtx.executeCommand(command, args, options);
|
|
100
117
|
}
|
|
@@ -112,8 +129,7 @@ export class HybridExecutionContext extends BaseExecutionContext {
|
|
|
112
129
|
if (target === this.localCtx) {
|
|
113
130
|
return this.localCtx.executeCommand(command, args, options);
|
|
114
131
|
}
|
|
115
|
-
|
|
116
|
-
return target.executeRemote(fullCommand, options);
|
|
132
|
+
return target.executeCommand(command, args, options);
|
|
117
133
|
}
|
|
118
134
|
default: {
|
|
119
135
|
const _exhaustive = this.routingStrategy;
|
|
@@ -122,13 +138,17 @@ export class HybridExecutionContext extends BaseExecutionContext {
|
|
|
122
138
|
}
|
|
123
139
|
}
|
|
124
140
|
toConfig() {
|
|
141
|
+
const local = this.localCtx.toConfig();
|
|
125
142
|
return {
|
|
126
143
|
id: this.id,
|
|
127
144
|
environment: 'hybrid',
|
|
128
145
|
local: {
|
|
129
|
-
cwd:
|
|
130
|
-
fsAccess:
|
|
131
|
-
envVars:
|
|
146
|
+
cwd: local.cwd,
|
|
147
|
+
fsAccess: local.fsAccess,
|
|
148
|
+
envVars: local.envVars,
|
|
149
|
+
capabilities: local.capabilities,
|
|
150
|
+
shell: local.shell,
|
|
151
|
+
maxOutputBytes: local.maxOutputBytes,
|
|
132
152
|
},
|
|
133
153
|
remotes: this.remoteTargets.map((t) => ({ ...t })),
|
|
134
154
|
routingStrategy: this.routingStrategy,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid.js","sourceRoot":"","sources":["../../src/execution/hybrid.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"hybrid.js","sourceRoot":"","sources":["../../src/execution/hybrid.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* A sixth backend goes in this directory and is named in this file.
|
|
18
18
|
*/
|
|
19
19
|
export { BaseExecutionContext } from './base.js';
|
|
20
|
+
export { CommandCancellationUnsupportedError, RemoteExecutionBusyError } from './errors.js';
|
|
20
21
|
export { ExecutionContextFactory } from './factory.js';
|
|
21
22
|
export { HybridExecutionContext } from './hybrid.js';
|
|
22
23
|
export type { HybridExecutionContextOptions } from './hybrid.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,YAAY,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,YAAY,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,YAAY,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,mCAAmC,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,YAAY,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,YAAY,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,YAAY,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAA"}
|
package/dist/execution/index.js
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* A sixth backend goes in this directory and is named in this file.
|
|
18
18
|
*/
|
|
19
19
|
export { BaseExecutionContext } from './base.js';
|
|
20
|
+
export { CommandCancellationUnsupportedError, RemoteExecutionBusyError } from './errors.js';
|
|
20
21
|
export { ExecutionContextFactory } from './factory.js';
|
|
21
22
|
export { HybridExecutionContext } from './hybrid.js';
|
|
22
23
|
export { LocalExecutionContext } from './local.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAElD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,mCAAmC,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAElD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -9,6 +9,8 @@ export interface LocalExecutionContextOptions {
|
|
|
9
9
|
envVars?: Record<string, string>;
|
|
10
10
|
capabilities?: ExecutionCapability[];
|
|
11
11
|
shell?: string;
|
|
12
|
+
/** Retained bytes per stdout/stderr stream. Defaults to 4 MiB; maximum 64 MiB. */
|
|
13
|
+
maxOutputBytes?: number;
|
|
12
14
|
log?: Logger;
|
|
13
15
|
}
|
|
14
16
|
export declare class LocalExecutionContext extends BaseExecutionContext implements CommandExecutor {
|
|
@@ -19,8 +21,19 @@ export declare class LocalExecutionContext extends BaseExecutionContext implemen
|
|
|
19
21
|
private envVars;
|
|
20
22
|
private capabilities;
|
|
21
23
|
private shell;
|
|
24
|
+
private maxOutputBytes;
|
|
25
|
+
/**
|
|
26
|
+
* Constructor-created contexts are intentionally executable before
|
|
27
|
+
* `initialize()`: `createCommandGate()` has always used that public path.
|
|
28
|
+
* Teardown closes admission synchronously; an explicit initialize reopens it.
|
|
29
|
+
*/
|
|
30
|
+
private acceptsCommands;
|
|
31
|
+
private readonly activeCommands;
|
|
22
32
|
constructor(options: LocalExecutionContextOptions);
|
|
23
33
|
protected doInitialize(): Promise<void>;
|
|
34
|
+
protected onInitializationStarted(): void;
|
|
35
|
+
protected onInitializationCommitted(): void;
|
|
36
|
+
protected onTeardownRequested(): void;
|
|
24
37
|
protected doTeardown(): Promise<void>;
|
|
25
38
|
getCwd(): string;
|
|
26
39
|
setCwd(newCwd: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/execution/local.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/execution/local.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAA;AAC9E,OAAO,KAAK,EACX,eAAe,EACf,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAehD,MAAM,WAAW,4BAA4B;IAC5C,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAA;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,GAAG,CAAC,EAAE,MAAM,CAAA;CACZ;AAED,qBAAa,qBAAsB,SAAQ,oBAAqB,YAAW,eAAe;IACzF,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAU;IAEpD,OAAO,CAAC,GAAG,CAAQ;IACnB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,cAAc,CAAQ;IAC9B;;;;OAIG;IACH,OAAO,CAAC,eAAe,CAAO;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgC;gBAEnD,OAAO,EAAE,4BAA4B;cAqBjC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;cAO1B,uBAAuB,IAAI,IAAI;cAI/B,yBAAyB,IAAI,IAAI;cAIjC,mBAAmB,IAAI,IAAI;cAI9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3C,MAAM,IAAI,MAAM;IAIhB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ5B,WAAW,IAAI,OAAO;IAItB,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAIzC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI1C,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIpC,eAAe,IAAI,mBAAmB,EAAE;IAIxC,aAAa,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO;IAI1C,cAAc,CACnB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC;IAwJzB,QAAQ,IAAI,2BAA2B;CAYvC"}
|
package/dist/execution/local.js
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { resolve } from 'node:path';
|
|
4
|
+
import { killTree } from '../process/kill-tree.js';
|
|
5
|
+
import { subscribeToAbort } from '../utils/abort.js';
|
|
4
6
|
import { BaseExecutionContext } from './base.js';
|
|
7
|
+
import { BoundedTailCapture } from './output.js';
|
|
8
|
+
const LOCAL_COMMAND_DEFAULT_TIMEOUT_MS = 30_000;
|
|
9
|
+
const LOCAL_COMMAND_KILL_GRACE_MS = 3_000;
|
|
10
|
+
const LOCAL_COMMAND_DEFAULT_MAX_OUTPUT_BYTES = 4 * 1024 * 1024;
|
|
11
|
+
const LOCAL_COMMAND_HARD_MAX_OUTPUT_BYTES = 64 * 1024 * 1024;
|
|
5
12
|
export class LocalExecutionContext extends BaseExecutionContext {
|
|
6
13
|
id;
|
|
7
14
|
environment = 'local';
|
|
@@ -10,6 +17,14 @@ export class LocalExecutionContext extends BaseExecutionContext {
|
|
|
10
17
|
envVars;
|
|
11
18
|
capabilities;
|
|
12
19
|
shell;
|
|
20
|
+
maxOutputBytes;
|
|
21
|
+
/**
|
|
22
|
+
* Constructor-created contexts are intentionally executable before
|
|
23
|
+
* `initialize()`: `createCommandGate()` has always used that public path.
|
|
24
|
+
* Teardown closes admission synchronously; an explicit initialize reopens it.
|
|
25
|
+
*/
|
|
26
|
+
acceptsCommands = true;
|
|
27
|
+
activeCommands = new Set();
|
|
13
28
|
constructor(options) {
|
|
14
29
|
super(options.log);
|
|
15
30
|
this.id = options.id;
|
|
@@ -18,6 +33,13 @@ export class LocalExecutionContext extends BaseExecutionContext {
|
|
|
18
33
|
this.envVars = options.envVars ?? {};
|
|
19
34
|
this.capabilities = options.capabilities ?? ['filesystem', 'process', 'shell'];
|
|
20
35
|
this.shell = options.shell;
|
|
36
|
+
const maxOutputBytes = options.maxOutputBytes ?? LOCAL_COMMAND_DEFAULT_MAX_OUTPUT_BYTES;
|
|
37
|
+
if (!Number.isSafeInteger(maxOutputBytes) ||
|
|
38
|
+
maxOutputBytes <= 0 ||
|
|
39
|
+
maxOutputBytes > LOCAL_COMMAND_HARD_MAX_OUTPUT_BYTES) {
|
|
40
|
+
throw new RangeError(`The value of "maxOutputBytes" is out of range. It must be a positive safe integer no greater than ${LOCAL_COMMAND_HARD_MAX_OUTPUT_BYTES}. Received ${maxOutputBytes}`);
|
|
41
|
+
}
|
|
42
|
+
this.maxOutputBytes = maxOutputBytes;
|
|
21
43
|
}
|
|
22
44
|
async doInitialize() {
|
|
23
45
|
if (!existsSync(this.cwd)) {
|
|
@@ -25,7 +47,21 @@ export class LocalExecutionContext extends BaseExecutionContext {
|
|
|
25
47
|
}
|
|
26
48
|
this.log.info('Local context initialized', { 'namzu.execution.cwd': this.cwd });
|
|
27
49
|
}
|
|
28
|
-
|
|
50
|
+
onInitializationStarted() {
|
|
51
|
+
this.acceptsCommands = false;
|
|
52
|
+
}
|
|
53
|
+
onInitializationCommitted() {
|
|
54
|
+
this.acceptsCommands = true;
|
|
55
|
+
}
|
|
56
|
+
onTeardownRequested() {
|
|
57
|
+
this.acceptsCommands = false;
|
|
58
|
+
}
|
|
59
|
+
async doTeardown() {
|
|
60
|
+
const admitted = [...this.activeCommands];
|
|
61
|
+
for (const operation of admitted)
|
|
62
|
+
operation.cancel('teardown');
|
|
63
|
+
await Promise.all(admitted.map((operation) => operation.closed));
|
|
64
|
+
}
|
|
29
65
|
getCwd() {
|
|
30
66
|
return this.cwd;
|
|
31
67
|
}
|
|
@@ -55,56 +91,145 @@ export class LocalExecutionContext extends BaseExecutionContext {
|
|
|
55
91
|
return this.capabilities.includes(cap);
|
|
56
92
|
}
|
|
57
93
|
async executeCommand(command, args = [], options) {
|
|
94
|
+
if (!this.acceptsCommands) {
|
|
95
|
+
throw new Error(`Local execution context "${this.id}" is tearing down or torn down. Call initialize() before executing another command.`);
|
|
96
|
+
}
|
|
58
97
|
if (!this.hasCapability('process') && !this.hasCapability('shell')) {
|
|
59
98
|
return {
|
|
60
99
|
exitCode: 1,
|
|
61
100
|
stdout: '',
|
|
62
101
|
stderr: 'Command execution not available: context lacks process/shell capability',
|
|
102
|
+
stdoutTruncated: false,
|
|
103
|
+
stderrTruncated: false,
|
|
63
104
|
durationMs: 0,
|
|
64
105
|
};
|
|
65
106
|
}
|
|
66
107
|
const cwd = options?.cwd ? resolve(this.cwd, options.cwd) : this.cwd;
|
|
67
108
|
const env = { ...process.env, ...this.envVars, ...options?.env };
|
|
68
|
-
const timeoutMs = options?.timeoutMs ??
|
|
109
|
+
const timeoutMs = options?.timeoutMs ?? LOCAL_COMMAND_DEFAULT_TIMEOUT_MS;
|
|
110
|
+
if (!Number.isInteger(timeoutMs) || timeoutMs < 0) {
|
|
111
|
+
throw new RangeError(`The value of "timeoutMs" is out of range. It must be an unsigned integer. Received ${timeoutMs}`);
|
|
112
|
+
}
|
|
69
113
|
// node's spawn() only keeps argv separation when it execs the binary directly;
|
|
70
114
|
// with shell enabled it re-joins command+args into one unescaped string and hands
|
|
71
115
|
// it to sh/cmd.exe, so any caller-supplied arg becomes shell syntax rather than a
|
|
72
116
|
// literal value. Since `command`/`args` here are whatever a tool call passed in,
|
|
73
117
|
// shell interpretation must be an explicit opt-in, never the silent default.
|
|
74
118
|
const shell = options?.shell ?? this.shell ?? false;
|
|
75
|
-
|
|
119
|
+
const callerSignal = options?.signal;
|
|
120
|
+
if (callerSignal?.aborted) {
|
|
121
|
+
return {
|
|
122
|
+
exitCode: null,
|
|
123
|
+
stdout: '',
|
|
124
|
+
stderr: '',
|
|
125
|
+
stdoutTruncated: false,
|
|
126
|
+
stderrTruncated: false,
|
|
127
|
+
durationMs: 0,
|
|
128
|
+
termination: { origin: 'caller', admitted: false },
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
let operation;
|
|
132
|
+
const result = new Promise((resolvePromise) => {
|
|
76
133
|
const start = performance.now();
|
|
77
134
|
const proc = spawn(command, args, {
|
|
78
135
|
cwd,
|
|
79
136
|
env,
|
|
80
137
|
shell,
|
|
81
|
-
|
|
138
|
+
// POSIX process-group ownership is the strongest boundary available
|
|
139
|
+
// to this host execution context. Windows uses taskkill /T in
|
|
140
|
+
// `killTree`; neither path relies on Node's direct-child timeout.
|
|
141
|
+
detached: process.platform !== 'win32',
|
|
82
142
|
});
|
|
83
|
-
|
|
84
|
-
|
|
143
|
+
const stdout = new BoundedTailCapture(this.maxOutputBytes);
|
|
144
|
+
const stderr = new BoundedTailCapture(this.maxOutputBytes);
|
|
145
|
+
let spawnError;
|
|
146
|
+
let cancellation;
|
|
147
|
+
let escalation;
|
|
148
|
+
let deadline;
|
|
149
|
+
let disposeCallerAbort;
|
|
150
|
+
let settled = false;
|
|
151
|
+
const terminate = (signal) => {
|
|
152
|
+
killTree(proc, signal);
|
|
153
|
+
};
|
|
154
|
+
const cancel = (origin) => {
|
|
155
|
+
if (settled || cancellation !== undefined)
|
|
156
|
+
return;
|
|
157
|
+
cancellation = origin;
|
|
158
|
+
terminate('SIGTERM');
|
|
159
|
+
escalation = setTimeout(() => {
|
|
160
|
+
escalation = undefined;
|
|
161
|
+
terminate('SIGKILL');
|
|
162
|
+
}, LOCAL_COMMAND_KILL_GRACE_MS);
|
|
163
|
+
escalation.unref?.();
|
|
164
|
+
};
|
|
165
|
+
let resolveClosed;
|
|
166
|
+
const closed = new Promise((resolveClose) => {
|
|
167
|
+
resolveClosed = resolveClose;
|
|
168
|
+
});
|
|
169
|
+
operation = { cancel, closed };
|
|
170
|
+
this.activeCommands.add(operation);
|
|
171
|
+
if (timeoutMs > 0) {
|
|
172
|
+
deadline = setTimeout(() => cancel('deadline'), timeoutMs);
|
|
173
|
+
deadline.unref?.();
|
|
174
|
+
}
|
|
85
175
|
proc.stdout?.on('data', (data) => {
|
|
86
|
-
stdout
|
|
176
|
+
stdout.push(data);
|
|
87
177
|
});
|
|
88
178
|
proc.stderr?.on('data', (data) => {
|
|
89
|
-
stderr
|
|
179
|
+
stderr.push(data);
|
|
90
180
|
});
|
|
91
|
-
proc.
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
durationMs: Math.round(performance.now() - start),
|
|
97
|
-
});
|
|
181
|
+
proc.once('error', (err) => {
|
|
182
|
+
// `close` follows `error` and is the point at which inherited stdio
|
|
183
|
+
// has drained. Releasing ownership here would strand a descendant
|
|
184
|
+
// which still holds those descriptors.
|
|
185
|
+
spawnError = err;
|
|
98
186
|
});
|
|
99
|
-
proc.
|
|
187
|
+
proc.once('close', (code, signal) => {
|
|
188
|
+
if (settled)
|
|
189
|
+
return;
|
|
190
|
+
settled = true;
|
|
191
|
+
disposeCallerAbort?.();
|
|
192
|
+
if (deadline !== undefined)
|
|
193
|
+
clearTimeout(deadline);
|
|
194
|
+
if (escalation !== undefined) {
|
|
195
|
+
clearTimeout(escalation);
|
|
196
|
+
escalation = undefined;
|
|
197
|
+
// Do not retain a numeric process-group id for a later timer after
|
|
198
|
+
// close: the host can reuse it. Force the cancellation boundary now.
|
|
199
|
+
terminate('SIGKILL');
|
|
200
|
+
}
|
|
201
|
+
this.activeCommands.delete(operation);
|
|
202
|
+
resolveClosed?.();
|
|
203
|
+
if (spawnError !== undefined) {
|
|
204
|
+
if (stderr.retainedBytes > 0)
|
|
205
|
+
stderr.push(Buffer.from('\n'));
|
|
206
|
+
stderr.push(Buffer.from(spawnError.message));
|
|
207
|
+
}
|
|
100
208
|
resolvePromise({
|
|
101
|
-
exitCode: 1,
|
|
102
|
-
stdout,
|
|
103
|
-
stderr:
|
|
209
|
+
exitCode: spawnError === undefined ? code : 1,
|
|
210
|
+
stdout: stdout.text,
|
|
211
|
+
stderr: stderr.text,
|
|
212
|
+
stdoutTruncated: stdout.truncated,
|
|
213
|
+
stderrTruncated: stderr.truncated,
|
|
104
214
|
durationMs: Math.round(performance.now() - start),
|
|
215
|
+
...(cancellation === undefined
|
|
216
|
+
? {}
|
|
217
|
+
: {
|
|
218
|
+
termination: {
|
|
219
|
+
origin: cancellation === 'deadline' ? 'timeout' : cancellation,
|
|
220
|
+
admitted: true,
|
|
221
|
+
...(signal === null ? {} : { signal }),
|
|
222
|
+
},
|
|
223
|
+
}),
|
|
105
224
|
});
|
|
106
225
|
});
|
|
226
|
+
if (callerSignal !== undefined) {
|
|
227
|
+
disposeCallerAbort = subscribeToAbort(callerSignal, () => cancel('caller'));
|
|
228
|
+
if (callerSignal.aborted)
|
|
229
|
+
cancel('caller');
|
|
230
|
+
}
|
|
107
231
|
});
|
|
232
|
+
return result;
|
|
108
233
|
}
|
|
109
234
|
toConfig() {
|
|
110
235
|
return {
|
|
@@ -115,6 +240,7 @@ export class LocalExecutionContext extends BaseExecutionContext {
|
|
|
115
240
|
envVars: this.envVars,
|
|
116
241
|
capabilities: this.capabilities,
|
|
117
242
|
shell: this.shell,
|
|
243
|
+
maxOutputBytes: this.maxOutputBytes,
|
|
118
244
|
};
|
|
119
245
|
}
|
|
120
246
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/execution/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/execution/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retain the newest bytes of one command-output stream under a hard bound.
|
|
3
|
+
*
|
|
4
|
+
* Bytes stay undecoded until the command closes, so a UTF-8 code point split
|
|
5
|
+
* across ordinary stream chunks is not corrupted. The backing store grows
|
|
6
|
+
* geometrically up to the configured cap and becomes a ring only when output
|
|
7
|
+
* crosses it; no incoming chunk is retained by reference.
|
|
8
|
+
*/
|
|
9
|
+
export declare class BoundedTailCapture {
|
|
10
|
+
private readonly capBytes;
|
|
11
|
+
private storage;
|
|
12
|
+
private start;
|
|
13
|
+
private length;
|
|
14
|
+
private lostBytes;
|
|
15
|
+
constructor(capBytes: number);
|
|
16
|
+
push(chunk: Buffer): void;
|
|
17
|
+
/** Ordered copy of the retained raw bytes. */
|
|
18
|
+
get bytes(): Buffer;
|
|
19
|
+
get text(): string;
|
|
20
|
+
get truncated(): boolean;
|
|
21
|
+
/** Diagnostic invariant used by the internal killing observers. */
|
|
22
|
+
get retainedBytes(): number;
|
|
23
|
+
/** Diagnostic invariant used by the internal killing observers. */
|
|
24
|
+
get allocatedBytes(): number;
|
|
25
|
+
private ensureCapacity;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/execution/output.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,qBAAa,kBAAkB;IAMlB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IALrC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,KAAK,CAAI;IACjB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,SAAS,CAAQ;gBAEI,QAAQ,EAAE,MAAM;IAM7C,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IA8BzB,8CAA8C;IAC9C,IAAI,KAAK,IAAI,MAAM,CAOlB;IAED,IAAI,IAAI,IAAI,MAAM,CAcjB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,mEAAmE;IACnE,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,mEAAmE;IACnE,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,OAAO,CAAC,cAAc;CAatB"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retain the newest bytes of one command-output stream under a hard bound.
|
|
3
|
+
*
|
|
4
|
+
* Bytes stay undecoded until the command closes, so a UTF-8 code point split
|
|
5
|
+
* across ordinary stream chunks is not corrupted. The backing store grows
|
|
6
|
+
* geometrically up to the configured cap and becomes a ring only when output
|
|
7
|
+
* crosses it; no incoming chunk is retained by reference.
|
|
8
|
+
*/
|
|
9
|
+
export class BoundedTailCapture {
|
|
10
|
+
capBytes;
|
|
11
|
+
storage = Buffer.alloc(0);
|
|
12
|
+
start = 0;
|
|
13
|
+
length = 0;
|
|
14
|
+
lostBytes = false;
|
|
15
|
+
constructor(capBytes) {
|
|
16
|
+
this.capBytes = capBytes;
|
|
17
|
+
if (!Number.isSafeInteger(capBytes) || capBytes <= 0) {
|
|
18
|
+
throw new RangeError('BoundedTailCapture capBytes must be a positive safe integer');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
push(chunk) {
|
|
22
|
+
if (chunk.length === 0)
|
|
23
|
+
return;
|
|
24
|
+
if (chunk.length >= this.capBytes) {
|
|
25
|
+
if (chunk.length > this.capBytes || this.length > 0)
|
|
26
|
+
this.lostBytes = true;
|
|
27
|
+
this.ensureCapacity(this.capBytes);
|
|
28
|
+
chunk.copy(this.storage, 0, chunk.length - this.capBytes);
|
|
29
|
+
this.start = 0;
|
|
30
|
+
this.length = this.capBytes;
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const combinedLength = this.length + chunk.length;
|
|
34
|
+
if (combinedLength <= this.capBytes) {
|
|
35
|
+
this.ensureCapacity(combinedLength);
|
|
36
|
+
chunk.copy(this.storage, this.length);
|
|
37
|
+
this.length = combinedLength;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.lostBytes = true;
|
|
41
|
+
this.ensureCapacity(this.capBytes);
|
|
42
|
+
const end = (this.start + this.length) % this.capBytes;
|
|
43
|
+
const first = Math.min(chunk.length, this.capBytes - end);
|
|
44
|
+
chunk.copy(this.storage, end, 0, first);
|
|
45
|
+
if (first < chunk.length)
|
|
46
|
+
chunk.copy(this.storage, 0, first);
|
|
47
|
+
this.start = (this.start + combinedLength - this.capBytes) % this.capBytes;
|
|
48
|
+
this.length = this.capBytes;
|
|
49
|
+
}
|
|
50
|
+
/** Ordered copy of the retained raw bytes. */
|
|
51
|
+
get bytes() {
|
|
52
|
+
const ordered = Buffer.allocUnsafe(this.length);
|
|
53
|
+
if (this.length === 0)
|
|
54
|
+
return ordered;
|
|
55
|
+
const first = Math.min(this.length, this.storage.length - this.start);
|
|
56
|
+
this.storage.copy(ordered, 0, this.start, this.start + first);
|
|
57
|
+
if (first < this.length)
|
|
58
|
+
this.storage.copy(ordered, first, 0, this.length - first);
|
|
59
|
+
return ordered;
|
|
60
|
+
}
|
|
61
|
+
get text() {
|
|
62
|
+
const ordered = this.bytes;
|
|
63
|
+
let offset = 0;
|
|
64
|
+
// Tail eviction can leave continuation bytes from a valid UTF-8 code
|
|
65
|
+
// point at the new left edge. They are an artifact of the cut, not an
|
|
66
|
+
// authored replacement character, so discard only that partial prefix.
|
|
67
|
+
if (this.lostBytes) {
|
|
68
|
+
while (offset < ordered.length) {
|
|
69
|
+
const firstByte = ordered[offset];
|
|
70
|
+
if (firstByte === undefined || (firstByte & 0xc0) !== 0x80)
|
|
71
|
+
break;
|
|
72
|
+
offset++;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return ordered.toString('utf8', offset);
|
|
76
|
+
}
|
|
77
|
+
get truncated() {
|
|
78
|
+
return this.lostBytes;
|
|
79
|
+
}
|
|
80
|
+
/** Diagnostic invariant used by the internal killing observers. */
|
|
81
|
+
get retainedBytes() {
|
|
82
|
+
return this.length;
|
|
83
|
+
}
|
|
84
|
+
/** Diagnostic invariant used by the internal killing observers. */
|
|
85
|
+
get allocatedBytes() {
|
|
86
|
+
return this.storage.length;
|
|
87
|
+
}
|
|
88
|
+
ensureCapacity(required) {
|
|
89
|
+
if (this.storage.length >= required)
|
|
90
|
+
return;
|
|
91
|
+
let capacity = Math.max(1, this.storage.length);
|
|
92
|
+
while (capacity < required)
|
|
93
|
+
capacity = Math.min(this.capBytes, capacity * 2);
|
|
94
|
+
const grown = Buffer.allocUnsafe(capacity);
|
|
95
|
+
if (this.length > 0) {
|
|
96
|
+
const first = Math.min(this.length, this.storage.length - this.start);
|
|
97
|
+
this.storage.copy(grown, 0, this.start, this.start + first);
|
|
98
|
+
if (first < this.length)
|
|
99
|
+
this.storage.copy(grown, first, 0, this.length - first);
|
|
100
|
+
}
|
|
101
|
+
this.storage = grown;
|
|
102
|
+
this.start = 0;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/execution/output.ts"],"names":[],"mappings":"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"}
|