@armoriq/sdk-dev 0.6.5 → 0.6.7
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/dist/cli/commands/policy.d.ts +39 -0
- package/dist/cli/commands/policy.d.ts.map +1 -0
- package/dist/cli/commands/policy.js +315 -0
- package/dist/cli/commands/policy.js.map +1 -0
- package/dist/cli/index.d.ts +8 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +93 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/client.d.ts +15 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +31 -8
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/integrations/google_adk.d.ts +22 -4
- package/dist/integrations/google_adk.d.ts.map +1 -1
- package/dist/integrations/google_adk.js +60 -1
- package/dist/integrations/google_adk.js.map +1 -1
- package/dist/integrations/langchain.d.ts +22 -6
- package/dist/integrations/langchain.d.ts.map +1 -1
- package/dist/integrations/langchain.js +47 -7
- package/dist/integrations/langchain.js.map +1 -1
- package/dist/integrations/strands.d.ts +36 -4
- package/dist/integrations/strands.d.ts.map +1 -1
- package/dist/integrations/strands.js +108 -28
- package/dist/integrations/strands.js.map +1 -1
- package/dist/session.d.ts +24 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +92 -14
- package/dist/session.js.map +1 -1
- package/package.json +21 -2
|
@@ -67,6 +67,7 @@ export declare class ArmorIQLangChainEnforcer {
|
|
|
67
67
|
private goal?;
|
|
68
68
|
private onEvent?;
|
|
69
69
|
private parser;
|
|
70
|
+
private toolCallNames;
|
|
70
71
|
session?: ArmorIQSession;
|
|
71
72
|
planStarted: boolean;
|
|
72
73
|
constructor(args: {
|
|
@@ -80,10 +81,18 @@ export declare class ArmorIQLangChainEnforcer {
|
|
|
80
81
|
private emit;
|
|
81
82
|
private ensureSession;
|
|
82
83
|
private capturePlan;
|
|
83
|
-
captureFromLlm(toolCalls: Array<
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
captureFromLlm(toolCalls: Array<LlmToolCall>): Promise<void>;
|
|
85
|
+
/** Remember tool_call id -> tool name from the model's own tool calls. That id
|
|
86
|
+
* comes back as handleToolStart's toolCallId and is the only place the real
|
|
87
|
+
* tool name is available: LangChain's Serialized payload carries the tool
|
|
88
|
+
* CLASS name, not the tool name. */
|
|
89
|
+
private noteToolCallIds;
|
|
90
|
+
/** The name the plan was minted with wins, so enforcement and the plan can
|
|
91
|
+
* never disagree. runName is what the tool()/DynamicTool helpers set. */
|
|
92
|
+
resolveToolName(toolCallId?: string, runName?: string): string | undefined;
|
|
93
|
+
/** A tool we cannot name cannot be enforced: a policy keyed on the real name
|
|
94
|
+
* would silently never match. Refuse it instead of guessing. */
|
|
95
|
+
refuseUnnamedTool(serializedHint: string): never;
|
|
87
96
|
/** Allow -> return; block/hold-denied -> throw (LangChain stops the tool). */
|
|
88
97
|
enforceTool(toolName: string, args: Record<string, any>): Promise<void>;
|
|
89
98
|
/** Report an executed tool to ArmorIQ so the plan lifecycle closes (advances to
|
|
@@ -92,9 +101,16 @@ export declare class ArmorIQLangChainEnforcer {
|
|
|
92
101
|
* are logged, never allowed to break the run (mirrors the strands AfterToolCall). */
|
|
93
102
|
reportExecution(toolName: string, args: Record<string, any>, result: unknown, error?: string): Promise<void>;
|
|
94
103
|
}
|
|
95
|
-
export
|
|
104
|
+
export interface LlmToolCall {
|
|
96
105
|
name: string;
|
|
97
106
|
args: any;
|
|
98
|
-
|
|
107
|
+
/** LangChain's tool_call id — comes back as handleToolStart's toolCallId. */
|
|
108
|
+
id?: string;
|
|
109
|
+
}
|
|
110
|
+
export declare function toolCallsFromLLMResult(output: any): LlmToolCall[];
|
|
111
|
+
/** Best-effort name from LangChain's Serialized payload. `id` is deliberately
|
|
112
|
+
* ignored: its last element is the tool CLASS name, which looks like a tool
|
|
113
|
+
* name but never is one. */
|
|
114
|
+
export declare function nameFromSerialized(tool: any): string | undefined;
|
|
99
115
|
export declare function coerceArgs(input: any): Record<string, any>;
|
|
100
116
|
//# sourceMappingURL=langchain.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"langchain.d.ts","sourceRoot":"","sources":["../../src/integrations/langchain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;AAE3E,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,OAAO,CAAC,YAAY,CAAC,CAAiB;IACtC,OAAO,CAAC,UAAU,CAAC,CAAsB;gBAE7B,IAAI,EAAE,uBAAuB;IAYnC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAKzC,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC;IAe/C,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIvC;4DACwD;IAClD,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAC1C,OAAO,CAAC,GAAG,CAAC;CAYhB;AAED;iEACiE;AACjE,qBAAa,wBAAwB;IACnC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAS;IACtB,OAAO,CAAC,OAAO,CAAC,CAAU;IAC1B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,WAAW,UAAS;gBAER,IAAI,EAAE;QAChB,OAAO,EAAE,gBAAgB,CAAC;QAC1B,KAAK,EAAE,gBAAgB,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,cAAc,CAAC;KACxB;IASD,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,aAAa;YAYP,WAAW;
|
|
1
|
+
{"version":3,"file":"langchain.d.ts","sourceRoot":"","sources":["../../src/integrations/langchain.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
30
|
exports.ArmorIQLangChainEnforcer = exports.ArmorIQLangChain = void 0;
|
|
31
31
|
exports.toolCallsFromLLMResult = toolCallsFromLLMResult;
|
|
32
|
+
exports.nameFromSerialized = nameFromSerialized;
|
|
32
33
|
exports.coerceArgs = coerceArgs;
|
|
33
34
|
const exceptions_1 = require("../exceptions");
|
|
34
35
|
class ArmorIQLangChain {
|
|
@@ -100,6 +101,7 @@ class ArmorIQLangChainEnforcer {
|
|
|
100
101
|
goal;
|
|
101
102
|
onEvent;
|
|
102
103
|
parser;
|
|
104
|
+
toolCallNames = new Map();
|
|
103
105
|
session;
|
|
104
106
|
planStarted = false;
|
|
105
107
|
constructor(args) {
|
|
@@ -134,10 +136,11 @@ class ArmorIQLangChainEnforcer {
|
|
|
134
136
|
async capturePlan(toolCalls) {
|
|
135
137
|
if (!toolCalls.length)
|
|
136
138
|
return;
|
|
137
|
-
await this.ensureSession().startPlan(toolCalls, this.goal);
|
|
139
|
+
await this.ensureSession().startPlan(toolCalls.map((c) => ({ name: c.name, args: c.args })), this.goal);
|
|
138
140
|
this.planStarted = true;
|
|
139
141
|
}
|
|
140
142
|
async captureFromLlm(toolCalls) {
|
|
143
|
+
this.noteToolCallIds(toolCalls);
|
|
141
144
|
try {
|
|
142
145
|
await this.capturePlan(toolCalls);
|
|
143
146
|
}
|
|
@@ -145,6 +148,33 @@ class ArmorIQLangChainEnforcer {
|
|
|
145
148
|
console.warn(`[armoriq] langchain plan capture (handleLLMEnd) failed: ${exc.message}`);
|
|
146
149
|
}
|
|
147
150
|
}
|
|
151
|
+
/** Remember tool_call id -> tool name from the model's own tool calls. That id
|
|
152
|
+
* comes back as handleToolStart's toolCallId and is the only place the real
|
|
153
|
+
* tool name is available: LangChain's Serialized payload carries the tool
|
|
154
|
+
* CLASS name, not the tool name. */
|
|
155
|
+
noteToolCallIds(toolCalls) {
|
|
156
|
+
for (const c of toolCalls) {
|
|
157
|
+
if (c.id && c.name)
|
|
158
|
+
this.toolCallNames.set(c.id, c.name);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/** The name the plan was minted with wins, so enforcement and the plan can
|
|
162
|
+
* never disagree. runName is what the tool()/DynamicTool helpers set. */
|
|
163
|
+
resolveToolName(toolCallId, runName) {
|
|
164
|
+
if (toolCallId) {
|
|
165
|
+
const fromPlan = this.toolCallNames.get(toolCallId);
|
|
166
|
+
if (fromPlan)
|
|
167
|
+
return fromPlan;
|
|
168
|
+
}
|
|
169
|
+
return runName || undefined;
|
|
170
|
+
}
|
|
171
|
+
/** A tool we cannot name cannot be enforced: a policy keyed on the real name
|
|
172
|
+
* would silently never match. Refuse it instead of guessing. */
|
|
173
|
+
refuseUnnamedTool(serializedHint) {
|
|
174
|
+
const reason = `unresolvable LangChain tool name (serialized as "${serializedHint}")`;
|
|
175
|
+
this.emit('error', { tool: serializedHint, error: reason });
|
|
176
|
+
throw new exceptions_1.PolicyBlockedException(`ArmorIQ enforcement error (fail-closed): ${reason}`);
|
|
177
|
+
}
|
|
148
178
|
/** Allow -> return; block/hold-denied -> throw (LangChain stops the tool). */
|
|
149
179
|
async enforceTool(toolName, args) {
|
|
150
180
|
args = args || {};
|
|
@@ -221,12 +251,23 @@ function toolCallsFromLLMResult(output) {
|
|
|
221
251
|
for (const tc of (msg?.tool_calls ?? [])) {
|
|
222
252
|
const name = tc?.name;
|
|
223
253
|
if (name)
|
|
224
|
-
calls.push({ name, args: tc.args ?? {} });
|
|
254
|
+
calls.push({ name, args: tc.args ?? {}, id: tc.id });
|
|
225
255
|
}
|
|
226
256
|
}
|
|
227
257
|
}
|
|
228
258
|
return calls;
|
|
229
259
|
}
|
|
260
|
+
/** Best-effort name from LangChain's Serialized payload. `id` is deliberately
|
|
261
|
+
* ignored: its last element is the tool CLASS name, which looks like a tool
|
|
262
|
+
* name but never is one. */
|
|
263
|
+
function nameFromSerialized(tool) {
|
|
264
|
+
return tool?.name || tool?.kwargs?.name || undefined;
|
|
265
|
+
}
|
|
266
|
+
function serializedHint(tool) {
|
|
267
|
+
if (Array.isArray(tool?.id))
|
|
268
|
+
return tool.id[tool.id.length - 1] ?? 'unknown';
|
|
269
|
+
return String(tool?.id ?? 'unknown');
|
|
270
|
+
}
|
|
230
271
|
function coerceArgs(input) {
|
|
231
272
|
if (input && typeof input === 'object')
|
|
232
273
|
return input;
|
|
@@ -263,11 +304,10 @@ function buildCallback(enforcer) {
|
|
|
263
304
|
if (calls.length)
|
|
264
305
|
await enforcer.captureFromLlm(calls);
|
|
265
306
|
}
|
|
266
|
-
async handleToolStart(tool, input, runId, _parentRunId, _tags, _metadata, runName) {
|
|
267
|
-
const toolName = runName
|
|
268
|
-
tool
|
|
269
|
-
|
|
270
|
-
'';
|
|
307
|
+
async handleToolStart(tool, input, runId, _parentRunId, _tags, _metadata, runName, toolCallId) {
|
|
308
|
+
const toolName = enforcer.resolveToolName(toolCallId, runName) ??
|
|
309
|
+
nameFromSerialized(tool) ??
|
|
310
|
+
enforcer.refuseUnnamedTool(serializedHint(tool));
|
|
271
311
|
const args = coerceArgs(input);
|
|
272
312
|
await enforcer.enforceTool(toolName, args); // throws to block/hold-deny
|
|
273
313
|
// Only reached when allowed -> the tool will run; remember it so
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"langchain.js","sourceRoot":"","sources":["../../src/integrations/langchain.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;;;
|
|
1
|
+
{"version":3,"file":"langchain.js","sourceRoot":"","sources":["../../src/integrations/langchain.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* run — not the agent's whole tool set — so a read-only
|
|
11
11
|
* turn is not flagged 'held' at issuance).
|
|
12
12
|
* BeforeToolCallEvent → enforce per-user policy before each tool runs;
|
|
13
|
-
* block/hold by setting event.
|
|
13
|
+
* block/hold by setting event.cancel.
|
|
14
14
|
* AfterToolCallEvent → report each executed tool to ArmorIQ so the plan
|
|
15
15
|
* lifecycle closes (advances to 'completed' once all
|
|
16
16
|
* declared steps have run) instead of sitting 'active'
|
|
@@ -32,6 +32,19 @@ import { ArmorIQClient, ArmorIQUserScope } from '../client';
|
|
|
32
32
|
import { SessionOptions } from '../session';
|
|
33
33
|
import { ToolNameParser } from '../plan_builder';
|
|
34
34
|
export type OnEvent = (kind: string, payload: Record<string, any>) => void;
|
|
35
|
+
/**
|
|
36
|
+
* The strands hook registry dispatches on the event CONSTRUCTOR
|
|
37
|
+
* (`callbacks.get(event.constructor)`), so we must register with the very same
|
|
38
|
+
* classes the running agent constructs — a string name never fires. Strands
|
|
39
|
+
* stays an optional peer here: the classes are resolved lazily at wire-up time,
|
|
40
|
+
* or injected by the host via `eventClasses` (useful when the host pins its own
|
|
41
|
+
* copy of the package, or bundles one).
|
|
42
|
+
*/
|
|
43
|
+
export interface StrandsEventClasses {
|
|
44
|
+
AfterModelCallEvent: new (...args: any[]) => any;
|
|
45
|
+
BeforeToolCallEvent: new (...args: any[]) => any;
|
|
46
|
+
AfterToolCallEvent: new (...args: any[]) => any;
|
|
47
|
+
}
|
|
35
48
|
export interface ArmorIQStrandsOptions {
|
|
36
49
|
client: ArmorIQClient;
|
|
37
50
|
mode?: SessionOptions['mode'];
|
|
@@ -40,6 +53,8 @@ export interface ArmorIQStrandsOptions {
|
|
|
40
53
|
toolNameParser?: ToolNameParser;
|
|
41
54
|
approvalWaitSeconds?: number;
|
|
42
55
|
approvalPollInterval?: number;
|
|
56
|
+
/** Strands event classes, when the host would rather hand us its own copy. */
|
|
57
|
+
eventClasses?: StrandsEventClasses;
|
|
43
58
|
}
|
|
44
59
|
export declare class ArmorIQStrands {
|
|
45
60
|
readonly client: ArmorIQClient;
|
|
@@ -48,6 +63,7 @@ export declare class ArmorIQStrands {
|
|
|
48
63
|
readonly defaultMcpName?: string;
|
|
49
64
|
readonly approvalWaitSeconds: number;
|
|
50
65
|
readonly approvalPollInterval: number;
|
|
66
|
+
readonly eventClasses?: StrandsEventClasses;
|
|
51
67
|
private customParser?;
|
|
52
68
|
private _bootstrap?;
|
|
53
69
|
constructor(opts: ArmorIQStrandsOptions);
|
|
@@ -60,6 +76,8 @@ export declare class ArmorIQStrands {
|
|
|
60
76
|
}): Promise<ArmorIQStrandsPlugin>;
|
|
61
77
|
}
|
|
62
78
|
export declare class ArmorIQStrandsPlugin {
|
|
79
|
+
/** Stable Plugin id — the strands PluginRegistry keys on it. */
|
|
80
|
+
readonly name = "armoriq-enforcement";
|
|
63
81
|
private factory;
|
|
64
82
|
private scope;
|
|
65
83
|
private userEmail;
|
|
@@ -68,6 +86,8 @@ export declare class ArmorIQStrandsPlugin {
|
|
|
68
86
|
private parser;
|
|
69
87
|
private session?;
|
|
70
88
|
private planStarted;
|
|
89
|
+
private eventClasses?;
|
|
90
|
+
private cancelledToolUseIds;
|
|
71
91
|
constructor(args: {
|
|
72
92
|
factory: ArmorIQStrands;
|
|
73
93
|
scope: ArmorIQUserScope;
|
|
@@ -75,9 +95,10 @@ export declare class ArmorIQStrandsPlugin {
|
|
|
75
95
|
goal?: string;
|
|
76
96
|
onEvent?: OnEvent;
|
|
77
97
|
parser: ToolNameParser;
|
|
98
|
+
eventClasses?: StrandsEventClasses;
|
|
78
99
|
});
|
|
79
100
|
/** Strands Plugin entrypoint: register our hooks on the agent. */
|
|
80
|
-
initAgent(agent: any): void
|
|
101
|
+
initAgent(agent: any): Promise<void>;
|
|
81
102
|
/** Wire the AfterModelCall + BeforeToolCall hooks onto a Strands agent. */
|
|
82
103
|
register(agent: any): void;
|
|
83
104
|
private emit;
|
|
@@ -89,6 +110,14 @@ export declare class ArmorIQStrandsPlugin {
|
|
|
89
110
|
args: any;
|
|
90
111
|
}>;
|
|
91
112
|
private onAfterModelCall;
|
|
113
|
+
/**
|
|
114
|
+
* Key a tool call so beforeToolCall can tell onAfterToolCall "this one never
|
|
115
|
+
* ran". Strands always supplies the model-issued toolUseId; the tool name is
|
|
116
|
+
* a fallback for duck-typed hosts that don't.
|
|
117
|
+
*/
|
|
118
|
+
private static cancelKey;
|
|
119
|
+
/** Cancel the tool and remember that we did, so we never audit it as run. */
|
|
120
|
+
private cancelTool;
|
|
92
121
|
private beforeToolCall;
|
|
93
122
|
/**
|
|
94
123
|
* Report a tool execution to ArmorIQ once it has actually run, so the plan
|
|
@@ -96,8 +125,11 @@ export declare class ArmorIQStrandsPlugin {
|
|
|
96
125
|
* plan to 'completed' when all declared steps have run, instead of leaving it
|
|
97
126
|
* stuck 'active' (shown as a perpetual "Running"). Tools we cancelled for
|
|
98
127
|
* enforcement (block / rejected / timeout / error) never ran, so they are
|
|
99
|
-
* skipped — a blocked tool must not be logged as executed.
|
|
100
|
-
*
|
|
128
|
+
* skipped — a blocked tool must not be logged as executed. The cancelled
|
|
129
|
+
* tool's after-event looks like any failed execution (strands hands us an
|
|
130
|
+
* error-status result and no cancel marker), so the skip is driven by what
|
|
131
|
+
* beforeToolCall recorded. Best-effort: audit failures are logged, never
|
|
132
|
+
* allowed to break the run.
|
|
101
133
|
*/
|
|
102
134
|
private onAfterToolCall;
|
|
103
135
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strands.d.ts","sourceRoot":"","sources":["../../src/integrations/strands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAkB,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"strands.d.ts","sourceRoot":"","sources":["../../src/integrations/strands.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* run — not the agent's whole tool set — so a read-only
|
|
12
12
|
* turn is not flagged 'held' at issuance).
|
|
13
13
|
* BeforeToolCallEvent → enforce per-user policy before each tool runs;
|
|
14
|
-
* block/hold by setting event.
|
|
14
|
+
* block/hold by setting event.cancel.
|
|
15
15
|
* AfterToolCallEvent → report each executed tool to ArmorIQ so the plan
|
|
16
16
|
* lifecycle closes (advances to 'completed' once all
|
|
17
17
|
* declared steps have run) instead of sitting 'active'
|
|
@@ -31,6 +31,55 @@
|
|
|
31
31
|
*/
|
|
32
32
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
33
|
exports.ArmorIQStrandsPlugin = exports.ArmorIQStrands = void 0;
|
|
34
|
+
const STRANDS_PACKAGE = '@strands-agents/sdk';
|
|
35
|
+
const EVENT_NAMES = [
|
|
36
|
+
'AfterModelCallEvent',
|
|
37
|
+
'BeforeToolCallEvent',
|
|
38
|
+
'AfterToolCallEvent',
|
|
39
|
+
];
|
|
40
|
+
function pickEventClasses(mod) {
|
|
41
|
+
// Reach through an interop default when the namespace itself has no classes.
|
|
42
|
+
const src = mod && typeof mod.BeforeToolCallEvent !== 'function' && mod.default ? mod.default : mod;
|
|
43
|
+
if (!src)
|
|
44
|
+
return undefined;
|
|
45
|
+
for (const name of EVENT_NAMES) {
|
|
46
|
+
if (typeof src[name] !== 'function')
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
AfterModelCallEvent: src.AfterModelCallEvent,
|
|
51
|
+
BeforeToolCallEvent: src.BeforeToolCallEvent,
|
|
52
|
+
AfterToolCallEvent: src.AfterToolCallEvent,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** Load the event classes without a static import, so strands stays optional. */
|
|
56
|
+
function requireStrandsEventClasses() {
|
|
57
|
+
try {
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
59
|
+
return pickEventClasses(require(STRANDS_PACKAGE));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return undefined; // not installed, or an ESM-only package on an older Node
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async function loadStrandsEventClasses() {
|
|
66
|
+
const required = requireStrandsEventClasses();
|
|
67
|
+
if (required)
|
|
68
|
+
return required;
|
|
69
|
+
try {
|
|
70
|
+
// Indirect so the emitted CJS keeps a real dynamic import (Node <22.12
|
|
71
|
+
// cannot require() this ESM-only package).
|
|
72
|
+
const dynamicImport = new Function('m', 'return import(m)');
|
|
73
|
+
return pickEventClasses(await dynamicImport(STRANDS_PACKAGE));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const MISSING_STRANDS = `ArmorIQStrands: could not load the strands hook events from '${STRANDS_PACKAGE}'. ` +
|
|
80
|
+
`Install it (npm i ${STRANDS_PACKAGE}), attach the plugin via ` +
|
|
81
|
+
'Agent({ plugins: [p] }) so it can load them asynchronously, or pass ' +
|
|
82
|
+
'eventClasses: { AfterModelCallEvent, BeforeToolCallEvent, AfterToolCallEvent }.';
|
|
34
83
|
class ArmorIQStrands {
|
|
35
84
|
client;
|
|
36
85
|
mode;
|
|
@@ -38,6 +87,7 @@ class ArmorIQStrands {
|
|
|
38
87
|
defaultMcpName;
|
|
39
88
|
approvalWaitSeconds;
|
|
40
89
|
approvalPollInterval;
|
|
90
|
+
eventClasses;
|
|
41
91
|
customParser;
|
|
42
92
|
_bootstrap;
|
|
43
93
|
constructor(opts) {
|
|
@@ -46,6 +96,7 @@ class ArmorIQStrands {
|
|
|
46
96
|
this.validitySeconds = opts.validitySeconds ?? 3600;
|
|
47
97
|
this.defaultMcpName = opts.defaultMcpName;
|
|
48
98
|
this.customParser = opts.toolNameParser;
|
|
99
|
+
this.eventClasses = opts.eventClasses;
|
|
49
100
|
this.approvalWaitSeconds =
|
|
50
101
|
opts.approvalWaitSeconds ??
|
|
51
102
|
Number(process.env.ARMORIQ_APPROVAL_WAIT_SECONDS ?? '300');
|
|
@@ -84,11 +135,14 @@ class ArmorIQStrands {
|
|
|
84
135
|
goal: opts?.goal,
|
|
85
136
|
onEvent: opts?.onEvent,
|
|
86
137
|
parser: await this.toolNameParser(),
|
|
138
|
+
eventClasses: this.eventClasses,
|
|
87
139
|
});
|
|
88
140
|
}
|
|
89
141
|
}
|
|
90
142
|
exports.ArmorIQStrands = ArmorIQStrands;
|
|
91
143
|
class ArmorIQStrandsPlugin {
|
|
144
|
+
/** Stable Plugin id — the strands PluginRegistry keys on it. */
|
|
145
|
+
name = 'armoriq-enforcement';
|
|
92
146
|
factory;
|
|
93
147
|
scope;
|
|
94
148
|
userEmail;
|
|
@@ -97,6 +151,11 @@ class ArmorIQStrandsPlugin {
|
|
|
97
151
|
parser;
|
|
98
152
|
session;
|
|
99
153
|
planStarted = false;
|
|
154
|
+
eventClasses;
|
|
155
|
+
// toolUseIds we cancelled in beforeToolCall. AfterToolCallEvent still fires
|
|
156
|
+
// for a cancelled tool and carries nothing that distinguishes it, so this is
|
|
157
|
+
// the only way to know the tool never actually ran.
|
|
158
|
+
cancelledToolUseIds = new Set();
|
|
100
159
|
constructor(args) {
|
|
101
160
|
this.factory = args.factory;
|
|
102
161
|
this.scope = args.scope;
|
|
@@ -104,9 +163,12 @@ class ArmorIQStrandsPlugin {
|
|
|
104
163
|
this.goal = args.goal;
|
|
105
164
|
this.onEvent = args.onEvent;
|
|
106
165
|
this.parser = args.parser;
|
|
166
|
+
this.eventClasses = args.eventClasses ?? args.factory?.eventClasses;
|
|
107
167
|
}
|
|
108
168
|
/** Strands Plugin entrypoint: register our hooks on the agent. */
|
|
109
|
-
initAgent(agent) {
|
|
169
|
+
async initAgent(agent) {
|
|
170
|
+
if (!this.eventClasses)
|
|
171
|
+
this.eventClasses = await loadStrandsEventClasses();
|
|
110
172
|
this.register(agent);
|
|
111
173
|
}
|
|
112
174
|
/** Wire the AfterModelCall + BeforeToolCall hooks onto a Strands agent. */
|
|
@@ -115,9 +177,13 @@ class ArmorIQStrandsPlugin {
|
|
|
115
177
|
if (!add) {
|
|
116
178
|
throw new Error('ArmorIQStrands: agent has no addHook/hooks.addCallback');
|
|
117
179
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
180
|
+
const events = this.eventClasses ?? requireStrandsEventClasses();
|
|
181
|
+
if (!events)
|
|
182
|
+
throw new Error(MISSING_STRANDS);
|
|
183
|
+
this.eventClasses = events;
|
|
184
|
+
add(events.AfterModelCallEvent, (e) => this.onAfterModelCall(e));
|
|
185
|
+
add(events.BeforeToolCallEvent, (e) => this.beforeToolCall(e));
|
|
186
|
+
add(events.AfterToolCallEvent, (e) => this.onAfterToolCall(e));
|
|
121
187
|
}
|
|
122
188
|
emit(kind, payload) {
|
|
123
189
|
if (!this.onEvent)
|
|
@@ -151,9 +217,10 @@ class ArmorIQStrandsPlugin {
|
|
|
151
217
|
const content = message?.content ?? [];
|
|
152
218
|
const calls = [];
|
|
153
219
|
for (const item of content) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
220
|
+
// A live ToolUseBlock carries name/input directly; the serialized (wire)
|
|
221
|
+
// form nests them under `toolUse`.
|
|
222
|
+
const tu = item?.toolUse ??
|
|
223
|
+
(item?.type === 'toolUseBlock' || item?.toolUseId ? item : undefined);
|
|
157
224
|
const name = tu?.name;
|
|
158
225
|
const args = tu?.input ?? {};
|
|
159
226
|
if (name)
|
|
@@ -163,16 +230,31 @@ class ArmorIQStrandsPlugin {
|
|
|
163
230
|
}
|
|
164
231
|
async onAfterModelCall(event) {
|
|
165
232
|
try {
|
|
166
|
-
const
|
|
167
|
-
if (!
|
|
233
|
+
const stopData = event?.stopData;
|
|
234
|
+
if (!stopData)
|
|
168
235
|
return; // model errored; nothing to capture this turn
|
|
169
|
-
const toolCalls = ArmorIQStrandsPlugin.toolCallsFromMessage(
|
|
236
|
+
const toolCalls = ArmorIQStrandsPlugin.toolCallsFromMessage(stopData?.message);
|
|
170
237
|
await this.capturePlan(toolCalls);
|
|
171
238
|
}
|
|
172
239
|
catch (exc) {
|
|
173
240
|
console.warn(`[armoriq] strands plan capture (after model) failed: ${exc.message}`);
|
|
174
241
|
}
|
|
175
242
|
}
|
|
243
|
+
/**
|
|
244
|
+
* Key a tool call so beforeToolCall can tell onAfterToolCall "this one never
|
|
245
|
+
* ran". Strands always supplies the model-issued toolUseId; the tool name is
|
|
246
|
+
* a fallback for duck-typed hosts that don't.
|
|
247
|
+
*/
|
|
248
|
+
static cancelKey(toolUse) {
|
|
249
|
+
return toolUse?.toolUseId ?? toolUse?.name ?? '';
|
|
250
|
+
}
|
|
251
|
+
/** Cancel the tool and remember that we did, so we never audit it as run. */
|
|
252
|
+
cancelTool(event, toolUse, message) {
|
|
253
|
+
event.cancel = message;
|
|
254
|
+
const key = ArmorIQStrandsPlugin.cancelKey(toolUse);
|
|
255
|
+
if (key)
|
|
256
|
+
this.cancelledToolUseIds.add(key);
|
|
257
|
+
}
|
|
176
258
|
async beforeToolCall(event) {
|
|
177
259
|
const toolUse = event?.toolUse ?? event?.tool_use ?? {};
|
|
178
260
|
const toolName = toolUse.name ?? '';
|
|
@@ -207,25 +289,19 @@ class ArmorIQStrandsPlugin {
|
|
|
207
289
|
delegationId: decision.delegationId,
|
|
208
290
|
reason: decision.reason,
|
|
209
291
|
});
|
|
210
|
-
|
|
211
|
-
event.cancel = cancel;
|
|
212
|
-
event.cancel_tool = cancel;
|
|
292
|
+
this.cancelTool(event, toolUse, `ArmorIQ hold ${outcome}: ${decision.reason ?? 'approval required'}`);
|
|
213
293
|
return;
|
|
214
294
|
}
|
|
215
295
|
// block (or any other non-allow decision)
|
|
216
296
|
const reason = decision.reason ?? 'blocked by policy';
|
|
217
297
|
this.emit('block', { tool: toolName, reason });
|
|
218
|
-
|
|
219
|
-
event.cancel = cancel;
|
|
220
|
-
event.cancel_tool = cancel;
|
|
298
|
+
this.cancelTool(event, toolUse, `ArmorIQ ${decision.action}: ${reason}`);
|
|
221
299
|
}
|
|
222
300
|
catch (exc) {
|
|
223
301
|
// Fail closed: never let a tool run if enforcement errored — and surface it.
|
|
224
302
|
const msg = exc.message ?? String(exc);
|
|
225
303
|
this.emit('error', { tool: toolName, error: msg });
|
|
226
|
-
|
|
227
|
-
event.cancel = cancel;
|
|
228
|
-
event.cancel_tool = cancel;
|
|
304
|
+
this.cancelTool(event, toolUse, `ArmorIQ enforcement error (fail-closed): ${msg}`);
|
|
229
305
|
}
|
|
230
306
|
}
|
|
231
307
|
/**
|
|
@@ -234,23 +310,27 @@ class ArmorIQStrandsPlugin {
|
|
|
234
310
|
* plan to 'completed' when all declared steps have run, instead of leaving it
|
|
235
311
|
* stuck 'active' (shown as a perpetual "Running"). Tools we cancelled for
|
|
236
312
|
* enforcement (block / rejected / timeout / error) never ran, so they are
|
|
237
|
-
* skipped — a blocked tool must not be logged as executed.
|
|
238
|
-
*
|
|
313
|
+
* skipped — a blocked tool must not be logged as executed. The cancelled
|
|
314
|
+
* tool's after-event looks like any failed execution (strands hands us an
|
|
315
|
+
* error-status result and no cancel marker), so the skip is driven by what
|
|
316
|
+
* beforeToolCall recorded. Best-effort: audit failures are logged, never
|
|
317
|
+
* allowed to break the run.
|
|
239
318
|
*/
|
|
240
319
|
async onAfterToolCall(event) {
|
|
241
|
-
const
|
|
242
|
-
|
|
243
|
-
|
|
320
|
+
const toolUse = event?.toolUse ?? event?.tool_use ?? {};
|
|
321
|
+
// Consume the mark so a later legitimate call to the same tool is reported.
|
|
322
|
+
const key = ArmorIQStrandsPlugin.cancelKey(toolUse);
|
|
323
|
+
if (key && this.cancelledToolUseIds.delete(key))
|
|
324
|
+
return; // we cancelled it; it never ran
|
|
244
325
|
if (!this.session || !this.planStarted)
|
|
245
326
|
return;
|
|
246
|
-
const toolUse = event?.toolUse ?? event?.tool_use ?? {};
|
|
247
327
|
const toolName = toolUse.name ?? '';
|
|
248
328
|
if (!toolName)
|
|
249
329
|
return;
|
|
250
330
|
const args = toolUse.input ?? {};
|
|
251
|
-
const exc = event?.
|
|
331
|
+
const exc = event?.error;
|
|
252
332
|
const status = exc ? 'error' : 'success';
|
|
253
|
-
const errMsg = exc ? (exc
|
|
333
|
+
const errMsg = exc ? (exc.message ?? String(exc)) : undefined;
|
|
254
334
|
const result = exc ? errMsg : event?.result;
|
|
255
335
|
try {
|
|
256
336
|
await this.session.report(toolName, args, result, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strands.js","sourceRoot":"","sources":["../../src/integrations/strands.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;;;
|
|
1
|
+
{"version":3,"file":"strands.js","sourceRoot":"","sources":["../../src/integrations/strands.ts"],"names":[],"mappings":"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"}
|