@namzu/sdk 5.0.0 → 5.2.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 +463 -0
- package/README.md +2 -2
- package/dist/agents/__tests__/run-agent-forwarding.test.d.ts +2 -0
- package/dist/agents/__tests__/run-agent-forwarding.test.d.ts.map +1 -0
- package/dist/agents/__tests__/run-agent-forwarding.test.js +76 -0
- package/dist/agents/__tests__/run-agent-forwarding.test.js.map +1 -0
- package/dist/agents/__tests__/run-completed-stop-reason.test.d.ts +2 -0
- package/dist/agents/__tests__/run-completed-stop-reason.test.d.ts.map +1 -0
- package/dist/agents/__tests__/run-completed-stop-reason.test.js +50 -0
- package/dist/agents/__tests__/run-completed-stop-reason.test.js.map +1 -0
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +4 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/runAgent.d.ts +34 -0
- package/dist/agents/runAgent.d.ts.map +1 -1
- package/dist/agents/runAgent.js +5 -3
- package/dist/agents/runAgent.js.map +1 -1
- package/dist/config/runtime.d.ts +30 -30
- package/dist/constants/tools/__tests__/dangerous-patterns.test.d.ts +2 -0
- package/dist/constants/tools/__tests__/dangerous-patterns.test.d.ts.map +1 -0
- package/dist/constants/tools/__tests__/dangerous-patterns.test.js +54 -0
- package/dist/constants/tools/__tests__/dangerous-patterns.test.js.map +1 -0
- package/dist/constants/tools/index.d.ts.map +1 -1
- package/dist/constants/tools/index.js +28 -1
- package/dist/constants/tools/index.js.map +1 -1
- package/dist/contracts/a2a.d.ts +44 -44
- package/dist/directory/__tests__/derive.test.d.ts +2 -0
- package/dist/directory/__tests__/derive.test.d.ts.map +1 -0
- package/dist/directory/__tests__/derive.test.js +111 -0
- package/dist/directory/__tests__/derive.test.js.map +1 -0
- package/dist/directory/__tests__/load-diagnostics.test.d.ts +2 -0
- package/dist/directory/__tests__/load-diagnostics.test.d.ts.map +1 -0
- package/dist/directory/__tests__/load-diagnostics.test.js +106 -0
- package/dist/directory/__tests__/load-diagnostics.test.js.map +1 -0
- package/dist/directory/__tests__/load-directory.test.d.ts +2 -0
- package/dist/directory/__tests__/load-directory.test.d.ts.map +1 -0
- package/dist/directory/__tests__/load-directory.test.js +196 -0
- package/dist/directory/__tests__/load-directory.test.js.map +1 -0
- package/dist/directory/__tests__/subagents.test.d.ts +2 -0
- package/dist/directory/__tests__/subagents.test.d.ts.map +1 -0
- package/dist/directory/__tests__/subagents.test.js +117 -0
- package/dist/directory/__tests__/subagents.test.js.map +1 -0
- package/dist/directory/__tests__/supervisor-budget.test.d.ts +2 -0
- package/dist/directory/__tests__/supervisor-budget.test.d.ts.map +1 -0
- package/dist/directory/__tests__/supervisor-budget.test.js +97 -0
- package/dist/directory/__tests__/supervisor-budget.test.js.map +1 -0
- package/dist/directory/derive-supervisor.d.ts +58 -0
- package/dist/directory/derive-supervisor.d.ts.map +1 -0
- package/dist/directory/derive-supervisor.js +88 -0
- package/dist/directory/derive-supervisor.js.map +1 -0
- package/dist/directory/derive.d.ts +12 -0
- package/dist/directory/derive.d.ts.map +1 -0
- package/dist/directory/derive.js +58 -0
- package/dist/directory/derive.js.map +1 -0
- package/dist/directory/index.d.ts +7 -0
- package/dist/directory/index.d.ts.map +1 -0
- package/dist/directory/index.js +5 -0
- package/dist/directory/index.js.map +1 -0
- package/dist/directory/load.d.ts +14 -0
- package/dist/directory/load.d.ts.map +1 -0
- package/dist/directory/load.js +488 -0
- package/dist/directory/load.js.map +1 -0
- package/dist/directory/scan.d.ts +36 -0
- package/dist/directory/scan.d.ts.map +1 -0
- package/dist/directory/scan.js +136 -0
- package/dist/directory/scan.js.map +1 -0
- package/dist/directory/types.d.ts +215 -0
- package/dist/directory/types.d.ts.map +1 -0
- package/dist/directory/types.js +8 -0
- package/dist/directory/types.js.map +1 -0
- package/dist/plugin/__tests__/path-containment.test.d.ts +2 -0
- package/dist/plugin/__tests__/path-containment.test.d.ts.map +1 -0
- package/dist/plugin/__tests__/path-containment.test.js +91 -0
- package/dist/plugin/__tests__/path-containment.test.js.map +1 -0
- package/dist/plugin/lifecycle.d.ts.map +1 -1
- package/dist/plugin/lifecycle.js +3 -3
- package/dist/plugin/lifecycle.js.map +1 -1
- package/dist/plugin/loader.d.ts.map +1 -1
- package/dist/plugin/loader.js +12 -2
- package/dist/plugin/loader.js.map +1 -1
- package/dist/provider/__tests__/model-version.test.d.ts +2 -0
- package/dist/provider/__tests__/model-version.test.d.ts.map +1 -0
- package/dist/provider/__tests__/model-version.test.js +80 -0
- package/dist/provider/__tests__/model-version.test.js.map +1 -0
- package/dist/provider/__tests__/strict-schema.test.d.ts +2 -0
- package/dist/provider/__tests__/strict-schema.test.d.ts.map +1 -0
- package/dist/provider/__tests__/strict-schema.test.js +109 -0
- package/dist/provider/__tests__/strict-schema.test.js.map +1 -0
- package/dist/provider/__tests__/typed-error-classification.test.d.ts +2 -0
- package/dist/provider/__tests__/typed-error-classification.test.d.ts.map +1 -0
- package/dist/provider/__tests__/typed-error-classification.test.js +123 -0
- package/dist/provider/__tests__/typed-error-classification.test.js.map +1 -0
- package/dist/provider/model-version.d.ts +60 -0
- package/dist/provider/model-version.d.ts.map +1 -0
- package/dist/provider/model-version.js +64 -0
- package/dist/provider/model-version.js.map +1 -0
- package/dist/provider/retry.d.ts.map +1 -1
- package/dist/provider/retry.js +23 -7
- package/dist/provider/retry.js.map +1 -1
- package/dist/provider/strict-schema.d.ts +49 -0
- package/dist/provider/strict-schema.d.ts.map +1 -0
- package/dist/provider/strict-schema.js +112 -0
- package/dist/provider/strict-schema.js.map +1 -0
- package/dist/public-runtime.d.ts +6 -1
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +21 -1
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-tools.d.ts +1 -0
- package/dist/public-tools.d.ts.map +1 -1
- package/dist/public-tools.js +4 -0
- package/dist/public-tools.js.map +1 -1
- package/dist/public-types.d.ts +2 -0
- package/dist/public-types.d.ts.map +1 -1
- package/dist/registry/tool/__tests__/strict-registration.test.d.ts +2 -0
- package/dist/registry/tool/__tests__/strict-registration.test.d.ts.map +1 -0
- package/dist/registry/tool/__tests__/strict-registration.test.js +82 -0
- package/dist/registry/tool/__tests__/strict-registration.test.js.map +1 -0
- package/dist/registry/tool/execute.d.ts.map +1 -1
- package/dist/registry/tool/execute.js +16 -0
- package/dist/registry/tool/execute.js.map +1 -1
- package/dist/runtime/query/__tests__/stream-recovery.test.js +5 -0
- package/dist/runtime/query/__tests__/stream-recovery.test.js.map +1 -1
- package/dist/runtime/query/result.d.ts.map +1 -1
- package/dist/runtime/query/result.js +5 -0
- package/dist/runtime/query/result.js.map +1 -1
- package/dist/tools/builtins/__tests__/edit-insert-reachable.test.js +7 -1
- package/dist/tools/builtins/__tests__/edit-insert-reachable.test.js.map +1 -1
- package/dist/tools/builtins/__tests__/edit.test.js +1 -1
- package/dist/tools/builtins/__tests__/edit.test.js.map +1 -1
- package/dist/tools/builtins/edit.d.ts.map +1 -1
- package/dist/tools/builtins/edit.js +20 -2
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/types/plugin/index.d.ts +4 -4
- package/dist/types/provider/errors.d.ts +0 -17
- package/dist/types/provider/errors.d.ts.map +1 -1
- package/dist/types/provider/errors.js +60 -0
- package/dist/types/provider/errors.js.map +1 -1
- package/dist/types/run/events.d.ts +17 -2
- package/dist/types/run/events.d.ts.map +1 -1
- package/dist/types/run/events.js.map +1 -1
- package/dist/types/verification/index.d.ts +6 -6
- package/package.json +1 -1
- package/src/agents/__tests__/run-agent-forwarding.test.ts +85 -0
- package/src/agents/__tests__/run-completed-stop-reason.test.ts +59 -0
- package/src/agents/index.ts +8 -0
- package/src/agents/runAgent.ts +30 -4
- package/src/constants/tools/__tests__/dangerous-patterns.test.ts +62 -0
- package/src/constants/tools/index.ts +28 -1
- package/src/directory/__tests__/derive.test.ts +135 -0
- package/src/directory/__tests__/load-diagnostics.test.ts +126 -0
- package/src/directory/__tests__/load-directory.test.ts +243 -0
- package/src/directory/__tests__/subagents.test.ts +155 -0
- package/src/directory/__tests__/supervisor-budget.test.ts +117 -0
- package/src/directory/derive-supervisor.ts +149 -0
- package/src/directory/derive.ts +70 -0
- package/src/directory/index.ts +27 -0
- package/src/directory/load.ts +556 -0
- package/src/directory/scan.ts +163 -0
- package/src/directory/types.ts +254 -0
- package/src/plugin/__tests__/path-containment.test.ts +107 -0
- package/src/plugin/lifecycle.ts +3 -3
- package/src/plugin/loader.ts +12 -2
- package/src/provider/__tests__/model-version.test.ts +93 -0
- package/src/provider/__tests__/strict-schema.test.ts +133 -0
- package/src/provider/__tests__/typed-error-classification.test.ts +143 -0
- package/src/provider/model-version.ts +98 -0
- package/src/provider/retry.ts +23 -7
- package/src/provider/strict-schema.ts +125 -0
- package/src/public-runtime.ts +31 -0
- package/src/public-tools.ts +4 -0
- package/src/public-types.ts +8 -0
- package/src/registry/tool/__tests__/strict-registration.test.ts +115 -0
- package/src/registry/tool/execute.ts +16 -0
- package/src/runtime/query/__tests__/stream-recovery.test.ts +5 -0
- package/src/runtime/query/result.ts +5 -0
- package/src/tools/builtins/__tests__/edit-insert-reachable.test.ts +8 -2
- package/src/tools/builtins/__tests__/edit.test.ts +1 -1
- package/src/tools/builtins/edit.ts +20 -2
- package/src/types/provider/errors.ts +71 -0
- package/src/types/run/events.ts +15 -2
package/dist/agents/index.js
CHANGED
|
@@ -6,4 +6,8 @@ export { SupervisorAgent } from './SupervisorAgent.js';
|
|
|
6
6
|
export { defineAgent } from './defineAgent.js';
|
|
7
7
|
export { InvocationLock, ConcurrentInvocationError } from './lock.js';
|
|
8
8
|
export { runAgent } from './runAgent.js';
|
|
9
|
+
// The budgets the front door applies when a caller names none. Exported so a
|
|
10
|
+
// deriver that builds a config by hand lands on the SAME numbers rather than
|
|
11
|
+
// inventing its own or, as `@namzu/project` did, supplying none at all.
|
|
12
|
+
export { DEFAULT_MAX_ITERATIONS, DEFAULT_TIMEOUT_MS, DEFAULT_TOKEN_BUDGET, } from './runAgent.js';
|
|
9
13
|
//# sourceMappingURL=index.js.map
|
package/dist/agents/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAA;AAErE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAA;AAErE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,6EAA6E;AAC7E,6EAA6E;AAC7E,wEAAwE;AACxE,OAAO,EACN,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,GACpB,MAAM,eAAe,CAAA"}
|
|
@@ -2,7 +2,9 @@ import type { ProjectId, SessionId, TenantId, ThreadId } from '../types/ids/inde
|
|
|
2
2
|
import type { Message } from '../types/message/index.js';
|
|
3
3
|
import type { LLMProvider } from '../types/provider/index.js';
|
|
4
4
|
import type { Run, RunEventListener } from '../types/run/index.js';
|
|
5
|
+
import type { Skill } from '../types/skills/index.js';
|
|
5
6
|
import type { ToolRegistryContract } from '../types/tool/index.js';
|
|
7
|
+
import type { VerificationGateConfig } from '../types/verification/index.js';
|
|
6
8
|
/**
|
|
7
9
|
* The session a run belongs to.
|
|
8
10
|
*
|
|
@@ -36,6 +38,26 @@ export interface RunAgentOptions extends AgentIdentity {
|
|
|
36
38
|
*/
|
|
37
39
|
model: string;
|
|
38
40
|
tools?: ToolRegistryContract;
|
|
41
|
+
/**
|
|
42
|
+
* Skills to put in front of the model.
|
|
43
|
+
*
|
|
44
|
+
* The kernel has taken these since it had a prompt builder; this door did
|
|
45
|
+
* not forward them, so a caller who assembled skills — `@namzu/project`
|
|
46
|
+
* reads a whole `skills/` directory — handed them over and got a run that
|
|
47
|
+
* had never heard of them. Silent, because the `drainQuery` call below was
|
|
48
|
+
* cast, and a cast seam reports nothing when a field goes missing.
|
|
49
|
+
*/
|
|
50
|
+
skills?: Skill[];
|
|
51
|
+
/**
|
|
52
|
+
* Operator policy for tool calls: which ones need review before they run.
|
|
53
|
+
*
|
|
54
|
+
* Absent means every tool runs unreviewed, which is the right default for a
|
|
55
|
+
* library front door and the wrong one for a host that hands this an agent
|
|
56
|
+
* directory it did not write. The kernel builds a `VerificationGate` from
|
|
57
|
+
* this and consults it on every call; without it there is nothing to
|
|
58
|
+
* consult, so a front-door run is strictly less mediated than a kernel one.
|
|
59
|
+
*/
|
|
60
|
+
verificationGate?: VerificationGateConfig;
|
|
39
61
|
/** Defaults to the current working directory. */
|
|
40
62
|
workingDirectory?: string;
|
|
41
63
|
maxIterations?: number;
|
|
@@ -59,6 +81,18 @@ export interface RunAgentResult {
|
|
|
59
81
|
*/
|
|
60
82
|
readonly identity: Required<AgentIdentity>;
|
|
61
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Defaults chosen to be safe rather than generous.
|
|
86
|
+
*
|
|
87
|
+
* A front door exists so a first run works without a decision, and the cost of
|
|
88
|
+
* that convenience is that nobody reads these numbers before their first
|
|
89
|
+
* runaway loop. So: a budget that ends a stuck run in seconds rather than
|
|
90
|
+
* dollars, and an iteration cap that stops a tool-calling loop well before a
|
|
91
|
+
* context window does. Every one is overridable and named on the option.
|
|
92
|
+
*/
|
|
93
|
+
export declare const DEFAULT_MAX_ITERATIONS = 16;
|
|
94
|
+
export declare const DEFAULT_TOKEN_BUDGET = 200000;
|
|
95
|
+
export declare const DEFAULT_TIMEOUT_MS = 300000;
|
|
62
96
|
/**
|
|
63
97
|
* Run an agent, without assembling a kernel by hand.
|
|
64
98
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runAgent.d.ts","sourceRoot":"","sources":["../../src/agents/runAgent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"runAgent.d.ts","sourceRoot":"","sources":["../../src/agents/runAgent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAQ5E;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACnB;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACrD,gEAAgE;IAChE,QAAQ,EAAE,WAAW,CAAA;IAErB,kEAAkE;IAClE,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,CAAA;IAE1B,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;;;;;;OAQG;IACH,KAAK,EAAE,MAAM,CAAA;IAEb,KAAK,CAAC,EAAE,oBAAoB,CAAA;IAE5B;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,KAAK,EAAE,CAAA;IAEhB;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,sBAAsB,CAAA;IAEzC,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAEnC,qEAAqE;IACrE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;IAEjB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAA;CAC1C;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,KAAK,CAAA;AACxC,eAAO,MAAM,oBAAoB,SAAU,CAAA;AAC3C,eAAO,MAAM,kBAAkB,SAAU,CAAA;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CA2ChF"}
|
package/dist/agents/runAgent.js
CHANGED
|
@@ -10,9 +10,9 @@ import { generateProjectId, generateSessionId, generateTenantId, generateThreadI
|
|
|
10
10
|
* dollars, and an iteration cap that stops a tool-calling loop well before a
|
|
11
11
|
* context window does. Every one is overridable and named on the option.
|
|
12
12
|
*/
|
|
13
|
-
const DEFAULT_MAX_ITERATIONS = 16;
|
|
14
|
-
const DEFAULT_TOKEN_BUDGET = 200_000;
|
|
15
|
-
const DEFAULT_TIMEOUT_MS = 300_000;
|
|
13
|
+
export const DEFAULT_MAX_ITERATIONS = 16;
|
|
14
|
+
export const DEFAULT_TOKEN_BUDGET = 200_000;
|
|
15
|
+
export const DEFAULT_TIMEOUT_MS = 300_000;
|
|
16
16
|
/**
|
|
17
17
|
* Run an agent, without assembling a kernel by hand.
|
|
18
18
|
*
|
|
@@ -85,6 +85,8 @@ export async function runAgent(options) {
|
|
|
85
85
|
agentName: options.name ?? 'Agent',
|
|
86
86
|
...(options.instructions ? { systemPrompt: options.instructions } : {}),
|
|
87
87
|
...(options.signal ? { signal: options.signal } : {}),
|
|
88
|
+
...(options.skills ? { skills: options.skills } : {}),
|
|
89
|
+
...(options.verificationGate ? { verificationGate: options.verificationGate } : {}),
|
|
88
90
|
...identity,
|
|
89
91
|
}, options.listener);
|
|
90
92
|
return { output: run.result, run, identity };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runAgent.js","sourceRoot":"","sources":["../../src/agents/runAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"runAgent.js","sourceRoot":"","sources":["../../src/agents/runAgent.ts"],"names":[],"mappings":"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"}
|
package/dist/config/runtime.d.ts
CHANGED
|
@@ -409,6 +409,7 @@ export declare const RuntimeConfigSchema: z.ZodObject<{
|
|
|
409
409
|
}>>;
|
|
410
410
|
}, "strip", z.ZodTypeAny, {
|
|
411
411
|
timeoutMs: number;
|
|
412
|
+
model: string;
|
|
412
413
|
compaction: {
|
|
413
414
|
strategy: "disabled" | "structured" | "sliding-window";
|
|
414
415
|
triggerThreshold: number;
|
|
@@ -431,11 +432,24 @@ export declare const RuntimeConfigSchema: z.ZodObject<{
|
|
|
431
432
|
contextWindowTokens?: number | undefined;
|
|
432
433
|
preserveToolResultsFrom?: string[] | undefined;
|
|
433
434
|
};
|
|
434
|
-
model: string;
|
|
435
435
|
temperature: number;
|
|
436
436
|
tokenBudget: number;
|
|
437
437
|
maxResponseTokens: number;
|
|
438
438
|
maxIterations: number;
|
|
439
|
+
sandbox?: {
|
|
440
|
+
enabled: boolean;
|
|
441
|
+
provider: "local";
|
|
442
|
+
timeoutMs: number;
|
|
443
|
+
memoryLimitMb: number;
|
|
444
|
+
maxProcesses: number;
|
|
445
|
+
requireIsolation: ("filesystem" | "network" | "process")[];
|
|
446
|
+
} | undefined;
|
|
447
|
+
plugins?: {
|
|
448
|
+
enabled: boolean;
|
|
449
|
+
autoDiscovery: boolean;
|
|
450
|
+
allowedScopes: ("user" | "project")[];
|
|
451
|
+
hookTimeoutMs: number;
|
|
452
|
+
} | undefined;
|
|
439
453
|
taskRouter?: {
|
|
440
454
|
default?: string | null | undefined;
|
|
441
455
|
compaction?: string | null | undefined;
|
|
@@ -453,22 +467,23 @@ export declare const RuntimeConfigSchema: z.ZodObject<{
|
|
|
453
467
|
breakerFailureThreshold: number;
|
|
454
468
|
breakerResetTimeoutMs: number;
|
|
455
469
|
} | undefined;
|
|
456
|
-
plugins?: {
|
|
457
|
-
enabled: boolean;
|
|
458
|
-
autoDiscovery: boolean;
|
|
459
|
-
allowedScopes: ("user" | "project")[];
|
|
460
|
-
hookTimeoutMs: number;
|
|
461
|
-
} | undefined;
|
|
462
|
-
sandbox?: {
|
|
463
|
-
enabled: boolean;
|
|
464
|
-
provider: "local";
|
|
465
|
-
timeoutMs: number;
|
|
466
|
-
memoryLimitMb: number;
|
|
467
|
-
maxProcesses: number;
|
|
468
|
-
requireIsolation: ("filesystem" | "network" | "process")[];
|
|
469
|
-
} | undefined;
|
|
470
470
|
}, {
|
|
471
471
|
timeoutMs?: number | undefined;
|
|
472
|
+
sandbox?: {
|
|
473
|
+
enabled?: boolean | undefined;
|
|
474
|
+
provider?: "local" | undefined;
|
|
475
|
+
timeoutMs?: number | undefined;
|
|
476
|
+
memoryLimitMb?: number | undefined;
|
|
477
|
+
maxProcesses?: number | undefined;
|
|
478
|
+
requireIsolation?: ("filesystem" | "network" | "process")[] | undefined;
|
|
479
|
+
} | undefined;
|
|
480
|
+
plugins?: {
|
|
481
|
+
enabled?: boolean | undefined;
|
|
482
|
+
autoDiscovery?: boolean | undefined;
|
|
483
|
+
allowedScopes?: ("user" | "project")[] | undefined;
|
|
484
|
+
hookTimeoutMs?: number | undefined;
|
|
485
|
+
} | undefined;
|
|
486
|
+
model?: string | undefined;
|
|
472
487
|
compaction?: {
|
|
473
488
|
strategy?: "disabled" | "structured" | "sliding-window" | undefined;
|
|
474
489
|
contextWindowTokens?: number | undefined;
|
|
@@ -491,7 +506,6 @@ export declare const RuntimeConfigSchema: z.ZodObject<{
|
|
|
491
506
|
maxCharsPerRequirement?: number | undefined;
|
|
492
507
|
maxCharsPerTask?: number | undefined;
|
|
493
508
|
} | undefined;
|
|
494
|
-
model?: string | undefined;
|
|
495
509
|
temperature?: number | undefined;
|
|
496
510
|
tokenBudget?: number | undefined;
|
|
497
511
|
maxResponseTokens?: number | undefined;
|
|
@@ -513,20 +527,6 @@ export declare const RuntimeConfigSchema: z.ZodObject<{
|
|
|
513
527
|
breakerFailureThreshold?: number | undefined;
|
|
514
528
|
breakerResetTimeoutMs?: number | undefined;
|
|
515
529
|
} | undefined;
|
|
516
|
-
plugins?: {
|
|
517
|
-
enabled?: boolean | undefined;
|
|
518
|
-
autoDiscovery?: boolean | undefined;
|
|
519
|
-
allowedScopes?: ("user" | "project")[] | undefined;
|
|
520
|
-
hookTimeoutMs?: number | undefined;
|
|
521
|
-
} | undefined;
|
|
522
|
-
sandbox?: {
|
|
523
|
-
enabled?: boolean | undefined;
|
|
524
|
-
provider?: "local" | undefined;
|
|
525
|
-
timeoutMs?: number | undefined;
|
|
526
|
-
memoryLimitMb?: number | undefined;
|
|
527
|
-
maxProcesses?: number | undefined;
|
|
528
|
-
requireIsolation?: ("filesystem" | "network" | "process")[] | undefined;
|
|
529
|
-
} | undefined;
|
|
530
530
|
}>;
|
|
531
531
|
export type RuntimeConfig = z.infer<typeof RuntimeConfigSchema>;
|
|
532
532
|
export declare const RUNTIME_DEFAULTS: Readonly<RuntimeConfig>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dangerous-patterns.test.d.ts","sourceRoot":"","sources":["../../../../src/constants/tools/__tests__/dangerous-patterns.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { DANGEROUS_PATTERNS } from '../index.js';
|
|
3
|
+
/**
|
|
4
|
+
* `DANGEROUS_PATTERNS` is what `deny_dangerous_patterns` consults, and
|
|
5
|
+
* `namzu run`'s own docstring promises that in a non-interactive run "the
|
|
6
|
+
* safety gate still hard-denies catastrophic commands".
|
|
7
|
+
*
|
|
8
|
+
* The fork-bomb entry could not deny one. It was written `/:(){ :\|:& };:/`,
|
|
9
|
+
* and in a regular expression `()` is an empty capture group rather than two
|
|
10
|
+
* literal parentheses — so the pattern described `:{ :|:& };:`, a string that
|
|
11
|
+
* is not valid shell and that nobody types. The list looked complete in review
|
|
12
|
+
* and had a hole in it that only running the regex reveals.
|
|
13
|
+
*
|
|
14
|
+
* No test named a fork bomb before this one, which is how it survived.
|
|
15
|
+
*/
|
|
16
|
+
function denies(command) {
|
|
17
|
+
return DANGEROUS_PATTERNS.some((p) => p.test(command));
|
|
18
|
+
}
|
|
19
|
+
describe('the dangerous-command list denies fork bombs', () => {
|
|
20
|
+
// Spelling varies with whitespace and with the function's name; the bomb
|
|
21
|
+
// does not care, so neither may the pattern.
|
|
22
|
+
it.each([
|
|
23
|
+
':(){ :|:& };:',
|
|
24
|
+
':(){:|:&};:',
|
|
25
|
+
':() { :|:& }; :',
|
|
26
|
+
':(){ : | : & }; :',
|
|
27
|
+
'bomb(){ bomb|bomb& }; bomb',
|
|
28
|
+
'f(){ f|f& };f',
|
|
29
|
+
])('denies %j', (command) => {
|
|
30
|
+
expect(denies(command)).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe('it does not deny ordinary shell', () => {
|
|
34
|
+
// A function containing a pipe and a background job is not a fork bomb.
|
|
35
|
+
// The signature is SELF-reference — the same name on both sides — and a
|
|
36
|
+
// pattern that fired on the general shape would make the gate useless by
|
|
37
|
+
// crying wolf.
|
|
38
|
+
it.each([
|
|
39
|
+
'build(){ make | tee log & }',
|
|
40
|
+
'watch(){ tail -f log | grep ERROR & }; watch',
|
|
41
|
+
'f(){ g|h& };f',
|
|
42
|
+
'run(){ a|b& }; run',
|
|
43
|
+
'git log | head -20',
|
|
44
|
+
'npm test',
|
|
45
|
+
])('allows %j', (command) => {
|
|
46
|
+
expect(denies(command)).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('the rest of the list still fires', () => {
|
|
50
|
+
it.each(['rm -rf /', 'mkfs.ext4 /dev/sda', 'dd if=/dev/zero of=/dev/sda', 'sudo rm x'])('denies %j', (command) => {
|
|
51
|
+
expect(denies(command)).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=dangerous-patterns.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dangerous-patterns.test.js","sourceRoot":"","sources":["../../../../src/constants/tools/__tests__/dangerous-patterns.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEhD;;;;;;;;;;;;GAYG;AAEH,SAAS,MAAM,CAAC,OAAe;IAC9B,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;AACvD,CAAC;AAED,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC7D,yEAAyE;IACzE,6CAA6C;IAC7C,EAAE,CAAC,IAAI,CAAC;QACP,eAAe;QACf,aAAa;QACb,iBAAiB;QACjB,mBAAmB;QACnB,4BAA4B;QAC5B,eAAe;KACf,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE;QAC3B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAChD,wEAAwE;IACxE,wEAAwE;IACxE,yEAAyE;IACzE,eAAe;IACf,EAAE,CAAC,IAAI,CAAC;QACP,6BAA6B;QAC7B,8CAA8C;QAC9C,eAAe;QACf,oBAAoB;QACpB,oBAAoB;QACpB,UAAU;KACV,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE;QAC3B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,WAAW,CAAC,CAAC,CACtF,WAAW,EACX,CAAC,OAAO,EAAE,EAAE;QACX,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC,CACD,CAAA;AACF,CAAC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/tools/index.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/tools/index.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,kBAAkB,UA4C9B,CAAA;AAED,eAAO,MAAM,gBAAgB,aAA6C,CAAA;AAE1E;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gBAAgB,CAAA;AAEjD;;;;;;GAMG;AACH,eAAO,MAAM,iCAAiC,IAAI,CAAA;AAElD,2EAA2E;AAC3E,eAAO,MAAM,0BAA0B,oKAC2H,CAAA"}
|
|
@@ -17,7 +17,34 @@ export const DANGEROUS_PATTERNS = [
|
|
|
17
17
|
/rm\s+-rf\s+\//,
|
|
18
18
|
/mkfs/,
|
|
19
19
|
/dd\s+if=/,
|
|
20
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Fork bomb.
|
|
22
|
+
*
|
|
23
|
+
* The previous entry was `/:(){ :\|:& };:/`, which could not match one. In
|
|
24
|
+
* a regular expression `()` is an empty capture group, not two literal
|
|
25
|
+
* parentheses, so that pattern described the string `:{ :|:& };:` — which
|
|
26
|
+
* is not valid shell and which nobody would ever type. Probed: it returned
|
|
27
|
+
* false for `:(){ :|:& };:` and every spelling of it, while `run.ts`'s own
|
|
28
|
+
* docstring promised "the safety gate still hard-denies catastrophic
|
|
29
|
+
* commands".
|
|
30
|
+
*
|
|
31
|
+
* Matched on SELF-REFERENCE rather than on one literal spelling: a fork
|
|
32
|
+
* bomb is a function whose own name appears on both sides of a pipe, is
|
|
33
|
+
* backgrounded, and is then invoked. That is what separates it from a
|
|
34
|
+
* function that merely contains a pipe — `watch(){ tail -f log | grep E & }`
|
|
35
|
+
* does not match, and `bomb(){ bomb|bomb& }; bomb` does.
|
|
36
|
+
*
|
|
37
|
+
* EVERY run is bounded, not just the name. The first version bounded the
|
|
38
|
+
* name and left the gaps as `\s*`, and static analysis caught what a hand
|
|
39
|
+
* probe did not: a chain of unbounded runs backtracks polynomially, and
|
|
40
|
+
* this list is matched against SERIALIZED TOOL INPUT — model output, which
|
|
41
|
+
* a prompt injection can shape. A denial of service in the check that
|
|
42
|
+
* exists to prevent one is the wrong way round.
|
|
43
|
+
*
|
|
44
|
+
* `[ \t]` rather than `\s`, because a shell function definition of this
|
|
45
|
+
* shape lives on one line, and the bound is generous for real spacing.
|
|
46
|
+
*/
|
|
47
|
+
/([\w.]{1,32}|:)[ \t]{0,8}\([ \t]{0,8}\)[ \t]{0,8}\{[ \t]{0,8}\1[ \t]{0,8}\|[ \t]{0,8}\1[ \t]{0,8}&[ \t]{0,8};?[ \t]{0,8}\}[ \t]{0,8};?[ \t]{0,8}\1/,
|
|
21
48
|
// Privilege escalation + world-writable chmod on /.
|
|
22
49
|
/\bsudo\b/,
|
|
23
50
|
/\bsu\s+-/,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/tools/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,8DAA8D;AAC9D,gEAAgE;AAChE,gEAAgE;AAChE,4DAA4D;AAC5D,kEAAkE;AAClE,iEAAiE;AACjE,EAAE;AACF,gEAAgE;AAChE,kEAAkE;AAClE,oEAAoE;AACpE,kEAAkE;AAClE,iEAAiE;AACjE,6CAA6C;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,gDAAgD;IAChD,eAAe;IACf,MAAM;IACN,UAAU;IACV,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/tools/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,8DAA8D;AAC9D,gEAAgE;AAChE,gEAAgE;AAChE,4DAA4D;AAC5D,kEAAkE;AAClE,iEAAiE;AACjE,EAAE;AACF,gEAAgE;AAChE,kEAAkE;AAClE,oEAAoE;AACpE,kEAAkE;AAClE,iEAAiE;AACjE,6CAA6C;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,gDAAgD;IAChD,eAAe;IACf,MAAM;IACN,UAAU;IACV;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,oJAAoJ;IACpJ,oDAAoD;IACpD,UAAU;IACV,UAAU;IACV,4BAA4B;IAC5B,wDAAwD;IACxD,qCAAqC;IACrC,qCAAqC;IACrC,+BAA+B;IAC/B,cAAc;IACd,+BAA+B;IAC/B,iBAAiB;CACjB,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AAE1E;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAAA;AAEjD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,CAAA;AAElD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,0BAA0B,GACtC,iKAAiK,CAAA"}
|