@arvo-tools/agentic 1.1.1 → 1.2.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/SimplePermissionManager/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsC,KAAK,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC3F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EACV,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,uBACX,YAAW,kBAAkB,CAAC,qBAAqB,CAAC,OAAO,wBAAwB,EAAE,OAAO,CAAC,CAAC;IAE9F,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAA4B;IACpD,MAAM,CAAC,QAAQ,CAAC,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sCAA6C;IAC/E,SAAgB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sCAA6C;IACrE,SAAgB,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACtD,OAAO,CAAC,WAAW,CAA8C;gBAErD,MAAM,EAAE;QAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;KAAE;IAI7D,OAAO,CAAC,MAAM;IAIR,GAAG,CACP,MAAM,EAAE,wBAAwB,EAEhC,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,EACjC,MAAM,EAAE;QAAE,QAAQ,EAAE,YAAY,CAAA;KAAE,GACjC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAiC7B,GAAG,CACP,MAAM,EAAE,wBAAwB,EAChC,KAAK,EAAE;QAAE,IAAI,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAAC,MAAM,EAAE,MAAM,EAAE,CAAA;SAAE,CAAA;KAAE,EACxD,MAAM,EAAE;QAAE,QAAQ,EAAE,YAAY,CAAA;KAAE,GACjC,OAAO,CAAC,IAAI,CAAC;IAoCV,cAAc,CAClB,MAAM,EAAE,wBAAwB,EAEhC,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,EACjC,MAAM,EAAE;QAAE,QAAQ,EAAE,YAAY,CAAA;KAAE,GACjC,OAAO,CAAC;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CAgCH"}
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __values = (this && this.__values) || function(o) {
39
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
40
+ if (m) return m.call(o);
41
+ if (o && typeof o.length === "number") return {
42
+ next: function () {
43
+ if (o && i >= o.length) o = void 0;
44
+ return { value: o && o[i++], done: !o };
45
+ }
46
+ };
47
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.SimplePermissionManager = void 0;
51
+ var openinference_semantic_conventions_1 = require("@arizeai/openinference-semantic-conventions");
52
+ var arvo_core_1 = require("arvo-core");
53
+ var contract_1 = require("./contract");
54
+ /**
55
+ * Simple in-memory permission manager for development and testing.
56
+ *
57
+ * Stores permissions in a Map keyed by `${source.name}:${source.subject}`,
58
+ * providing workflow-scoped authorization that persists only for the lifetime
59
+ * of the process.
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const agent = createArvoAgent({
64
+ * permissionManager: new SimplePermissionManager(),
65
+ * handler: {
66
+ * '1.0.0': {
67
+ * permissionPolicy: async ({ services }) => [
68
+ * services.deleteUser.name
69
+ * ],
70
+ * // ... other config
71
+ * }
72
+ * }
73
+ * });
74
+ * ```
75
+ */
76
+ var SimplePermissionManager = /** @class */ (function () {
77
+ function SimplePermissionManager(config) {
78
+ this.contract = contract_1.simplePermissionContract.version('1.0.0');
79
+ this.permissions = new Map();
80
+ this.domains = config.domains;
81
+ }
82
+ SimplePermissionManager.prototype.getKey = function (source) {
83
+ return "".concat(source.name, ":").concat(source.subject);
84
+ };
85
+ SimplePermissionManager.prototype.get = function (source,
86
+ // biome-ignore lint/suspicious/noExplicitAny: Needs to be general
87
+ tools, config) {
88
+ return __awaiter(this, void 0, void 0, function () {
89
+ var _a;
90
+ var _this = this;
91
+ return __generator(this, function (_b) {
92
+ switch (_b.label) {
93
+ case 0: return [4 /*yield*/, arvo_core_1.ArvoOpenTelemetry.getInstance().startActiveSpan({
94
+ name: 'Permission.Check',
95
+ disableSpanManagement: true,
96
+ context: {
97
+ inheritFrom: 'TRACE_HEADERS',
98
+ traceHeaders: config.otelInfo.headers,
99
+ },
100
+ spanOptions: {
101
+ attributes: (_a = {},
102
+ _a[openinference_semantic_conventions_1.SemanticConventions.OPENINFERENCE_SPAN_KIND] = openinference_semantic_conventions_1.OpenInferenceSpanKind.GUARDRAIL,
103
+ _a),
104
+ },
105
+ fn: function (span) { return __awaiter(_this, void 0, void 0, function () {
106
+ var key, granted_1, result;
107
+ var _a;
108
+ return __generator(this, function (_b) {
109
+ try {
110
+ key = this.getKey(source);
111
+ granted_1 = (_a = this.permissions.get(key)) !== null && _a !== void 0 ? _a : {};
112
+ result = Object.fromEntries(tools.map(function (tool) { var _a; return [tool.name, (_a = granted_1[tool.name]) !== null && _a !== void 0 ? _a : false]; }));
113
+ span.setAttribute('tool.permission.map', JSON.stringify(result));
114
+ return [2 /*return*/, result];
115
+ }
116
+ catch (error) {
117
+ (0, arvo_core_1.exceptionToSpan)(error, span);
118
+ throw error;
119
+ }
120
+ finally {
121
+ span.end();
122
+ }
123
+ return [2 /*return*/];
124
+ });
125
+ }); },
126
+ })];
127
+ case 1: return [2 /*return*/, _b.sent()];
128
+ }
129
+ });
130
+ });
131
+ };
132
+ SimplePermissionManager.prototype.set = function (source, event, config) {
133
+ return __awaiter(this, void 0, void 0, function () {
134
+ var _a;
135
+ var _this = this;
136
+ return __generator(this, function (_b) {
137
+ switch (_b.label) {
138
+ case 0: return [4 /*yield*/, arvo_core_1.ArvoOpenTelemetry.getInstance().startActiveSpan({
139
+ name: 'Permission.Update',
140
+ disableSpanManagement: true,
141
+ context: {
142
+ inheritFrom: 'TRACE_HEADERS',
143
+ traceHeaders: config.otelInfo.headers,
144
+ },
145
+ spanOptions: {
146
+ attributes: (_a = {},
147
+ _a[openinference_semantic_conventions_1.SemanticConventions.OPENINFERENCE_SPAN_KIND] = openinference_semantic_conventions_1.OpenInferenceSpanKind.GUARDRAIL,
148
+ _a),
149
+ },
150
+ fn: function (span) { return __awaiter(_this, void 0, void 0, function () {
151
+ var key, granted, _a, _b, toolName, _c, _d, toolName;
152
+ var e_1, _e, e_2, _f;
153
+ var _g;
154
+ return __generator(this, function (_h) {
155
+ try {
156
+ key = this.getKey(source);
157
+ granted = (_g = this.permissions.get(key)) !== null && _g !== void 0 ? _g : {};
158
+ try {
159
+ for (_a = __values(event.data.granted), _b = _a.next(); !_b.done; _b = _a.next()) {
160
+ toolName = _b.value;
161
+ granted[toolName] = true;
162
+ }
163
+ }
164
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
165
+ finally {
166
+ try {
167
+ if (_b && !_b.done && (_e = _a.return)) _e.call(_a);
168
+ }
169
+ finally { if (e_1) throw e_1.error; }
170
+ }
171
+ try {
172
+ for (_c = __values(event.data.denied), _d = _c.next(); !_d.done; _d = _c.next()) {
173
+ toolName = _d.value;
174
+ granted[toolName] = false;
175
+ }
176
+ }
177
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
178
+ finally {
179
+ try {
180
+ if (_d && !_d.done && (_f = _c.return)) _f.call(_c);
181
+ }
182
+ finally { if (e_2) throw e_2.error; }
183
+ }
184
+ this.permissions.set(key, granted);
185
+ span.setAttribute('tool.permission.map', JSON.stringify(granted));
186
+ }
187
+ catch (error) {
188
+ (0, arvo_core_1.exceptionToSpan)(error, span);
189
+ throw error;
190
+ }
191
+ finally {
192
+ span.end();
193
+ }
194
+ return [2 /*return*/];
195
+ });
196
+ }); },
197
+ })];
198
+ case 1: return [2 /*return*/, _b.sent()];
199
+ }
200
+ });
201
+ });
202
+ };
203
+ SimplePermissionManager.prototype.requestBuilder = function (source,
204
+ // biome-ignore lint/suspicious/noExplicitAny: Needs to be general
205
+ tools, config) {
206
+ return __awaiter(this, void 0, void 0, function () {
207
+ var _a;
208
+ var _this = this;
209
+ return __generator(this, function (_b) {
210
+ switch (_b.label) {
211
+ case 0: return [4 /*yield*/, arvo_core_1.ArvoOpenTelemetry.getInstance().startActiveSpan({
212
+ name: 'Permission.Request',
213
+ disableSpanManagement: true,
214
+ context: {
215
+ inheritFrom: 'TRACE_HEADERS',
216
+ traceHeaders: config.otelInfo.headers,
217
+ },
218
+ spanOptions: {
219
+ attributes: (_a = {},
220
+ _a[openinference_semantic_conventions_1.SemanticConventions.OPENINFERENCE_SPAN_KIND] = openinference_semantic_conventions_1.OpenInferenceSpanKind.GUARDRAIL,
221
+ _a),
222
+ },
223
+ fn: function (span) { return __awaiter(_this, void 0, void 0, function () {
224
+ var request;
225
+ return __generator(this, function (_a) {
226
+ try {
227
+ request = {
228
+ agentId: source.name,
229
+ reason: "Agent ".concat(source.name, " is requesting permission to execute following tools"),
230
+ requestedTools: tools.map(function (t) { return t.name; }),
231
+ };
232
+ span.setAttribute('tool.permission.request', JSON.stringify(request));
233
+ return [2 /*return*/, request];
234
+ }
235
+ catch (error) {
236
+ (0, arvo_core_1.exceptionToSpan)(error, span);
237
+ throw error;
238
+ }
239
+ finally {
240
+ span.end();
241
+ }
242
+ return [2 /*return*/];
243
+ });
244
+ }); },
245
+ })];
246
+ case 1: return [2 /*return*/, _b.sent()];
247
+ }
248
+ });
249
+ });
250
+ };
251
+ SimplePermissionManager.CONTRACT = contract_1.simplePermissionContract;
252
+ SimplePermissionManager.VERSIONED_CONTRACT = contract_1.simplePermissionContract.version('1.0.0');
253
+ return SimplePermissionManager;
254
+ }());
255
+ exports.SimplePermissionManager = SimplePermissionManager;
256
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/SimplePermissionManager/index.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -13,5 +13,6 @@ export { openaiLLMIntegration } from './Integrations/openai';
13
13
  export { DEFAULT_TOOL_LIMIT_PROMPT } from './Integrations/prompts';
14
14
  export type { AgentLLMIntegration, AgentLLMIntegrationOutput, AgentLLMIntegrationParam, } from './Integrations/types';
15
15
  export type { IMCPClient } from './interfaces.mcp';
16
+ export { SimplePermissionManager } from './SimplePermissionManager';
16
17
  export type { NonEmptyArray, OtelInfoType, PromiseAble } from './types';
17
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,EAClB,sBAAsB,EACtB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EACzB,kCAAkC,EAClC,kCAAkC,EAClC,+BAA+B,EAC/B,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,YAAY,EACV,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,EAClB,sBAAsB,EACtB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EACzB,kCAAkC,EAClC,kCAAkC,EAClC,+BAA+B,EAC/B,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,YAAY,EACV,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_TOOL_LIMIT_PROMPT = exports.openaiLLMIntegration = exports.MCPClient = exports.anthropicLLMIntegration = exports.createAgentTool = exports.tryParseJson = exports.setOpenInferenceUsageOutputAttr = exports.setOpenInferenceToolCallOutputAttr = exports.setOpenInferenceResponseOutputAttr = exports.setOpenInferenceInputAttr = exports.AgentStreamEventSchema = exports.AgentToolResultContentSchema = exports.AgentToolCallContentSchema = exports.AgentTextContentSchema = exports.AgentMessageSchema = exports.AgentMessageContentSchema = exports.AgentMediaContentSchema = exports.AgentDefaults = exports.createArvoAgent = void 0;
3
+ exports.SimplePermissionManager = exports.DEFAULT_TOOL_LIMIT_PROMPT = exports.openaiLLMIntegration = exports.MCPClient = exports.anthropicLLMIntegration = exports.createAgentTool = exports.tryParseJson = exports.setOpenInferenceUsageOutputAttr = exports.setOpenInferenceToolCallOutputAttr = exports.setOpenInferenceResponseOutputAttr = exports.setOpenInferenceInputAttr = exports.AgentStreamEventSchema = exports.AgentToolResultContentSchema = exports.AgentToolCallContentSchema = exports.AgentTextContentSchema = exports.AgentMessageSchema = exports.AgentMessageContentSchema = exports.AgentMediaContentSchema = exports.AgentDefaults = exports.createArvoAgent = void 0;
4
4
  var Agent_1 = require("./Agent");
5
5
  Object.defineProperty(exports, "createArvoAgent", { enumerable: true, get: function () { return Agent_1.createArvoAgent; } });
6
6
  var AgentDefaults_1 = require("./Agent/AgentDefaults");
@@ -30,4 +30,6 @@ var openai_1 = require("./Integrations/openai");
30
30
  Object.defineProperty(exports, "openaiLLMIntegration", { enumerable: true, get: function () { return openai_1.openaiLLMIntegration; } });
31
31
  var prompts_1 = require("./Integrations/prompts");
32
32
  Object.defineProperty(exports, "DEFAULT_TOOL_LIMIT_PROMPT", { enumerable: true, get: function () { return prompts_1.DEFAULT_TOOL_LIMIT_PROMPT; } });
33
+ var SimplePermissionManager_1 = require("./SimplePermissionManager");
34
+ Object.defineProperty(exports, "SimplePermissionManager", { enumerable: true, get: function () { return SimplePermissionManager_1.SimplePermissionManager; } });
33
35
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iCAAsD;AAAjC,wGAAA,eAAe,OAAA;AACpC,uDAAsD;AAA7C,8GAAA,aAAa,OAAA;AACtB,yCAOwB;AANtB,iHAAA,uBAAuB,OAAA;AACvB,mHAAA,yBAAyB,OAAA;AACzB,4GAAA,kBAAkB,OAAA;AAClB,gHAAA,sBAAsB,OAAA;AACtB,oHAAA,0BAA0B,OAAA;AAC1B,sHAAA,4BAA4B,OAAA;AAE9B,gDAA+D;AAAtD,gHAAA,sBAAsB,OAAA;AAkB/B,uCAMuB;AALrB,kHAAA,yBAAyB,OAAA;AACzB,2HAAA,kCAAkC,OAAA;AAClC,2HAAA,kCAAkC,OAAA;AAClC,wHAAA,+BAA+B,OAAA;AAC/B,qGAAA,YAAY,OAAA;AAEd,yCAA8C;AAArC,4GAAA,eAAe,OAAA;AAExB,sDAAmE;AAA1D,oHAAA,uBAAuB,OAAA;AAChC,sDAAqD;AAA5C,sGAAA,SAAS,OAAA;AAClB,gDAA6D;AAApD,8GAAA,oBAAoB,OAAA;AAC7B,kDAAmE;AAA1D,oHAAA,yBAAyB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iCAAsD;AAAjC,wGAAA,eAAe,OAAA;AACpC,uDAAsD;AAA7C,8GAAA,aAAa,OAAA;AACtB,yCAOwB;AANtB,iHAAA,uBAAuB,OAAA;AACvB,mHAAA,yBAAyB,OAAA;AACzB,4GAAA,kBAAkB,OAAA;AAClB,gHAAA,sBAAsB,OAAA;AACtB,oHAAA,0BAA0B,OAAA;AAC1B,sHAAA,4BAA4B,OAAA;AAE9B,gDAA+D;AAAtD,gHAAA,sBAAsB,OAAA;AAkB/B,uCAMuB;AALrB,kHAAA,yBAAyB,OAAA;AACzB,2HAAA,kCAAkC,OAAA;AAClC,2HAAA,kCAAkC,OAAA;AAClC,wHAAA,+BAA+B,OAAA;AAC/B,qGAAA,YAAY,OAAA;AAEd,yCAA8C;AAArC,4GAAA,eAAe,OAAA;AAExB,sDAAmE;AAA1D,oHAAA,uBAAuB,OAAA;AAChC,sDAAqD;AAA5C,sGAAA,SAAS,OAAA;AAClB,gDAA6D;AAApD,8GAAA,oBAAoB,OAAA;AAC7B,kDAAmE;AAA1D,oHAAA,yBAAyB,OAAA;AAOlC,qEAAoE;AAA3D,kIAAA,uBAAuB,OAAA"}
@@ -0,0 +1,191 @@
1
+ import type { InferVersionedArvoContract, SimpleArvoContract, VersionedArvoContract } from 'arvo-core';
2
+ import type { SimpleArvoContractEmitType } from 'arvo-core/dist/ArvoContract/SimpleArvoContract/types';
3
+ import type { AgentToolDefinition } from './Agent/types';
4
+ import type { AgentInternalTool } from './AgentTool/types';
5
+ import type { NonEmptyArray, OtelInfoType, PromiseAble } from './types';
6
+ /**
7
+ * Contextual information identifying the agent and workflow requesting permission.
8
+ *
9
+ * Enables scoped authorization decisions where the same tool might be permitted
10
+ * for one agent/workflow/tenant combination but denied for another.
11
+ */
12
+ export type PermissionManagerContext = {
13
+ /**
14
+ * The agent's identifier from the ArvoResumable handler source.
15
+ * Used to scope permissions by agent type (e.g., 'support.agent', 'billing.agent').
16
+ */
17
+ name: string;
18
+ /**
19
+ * The workflow execution identifier from the originating event's subject field.
20
+ * Enables workflow-specific permissions where authorization applies only to
21
+ * a particular execution context rather than globally.
22
+ */
23
+ subject: string;
24
+ /**
25
+ * Access control context inherited from the triggering event.
26
+ * Typically contains tenant, user, or role information informing permission
27
+ * decisions (e.g., 'tenant:acme:admin', 'user:123:readonly').
28
+ */
29
+ accesscontrol: string | null;
30
+ };
31
+ /**
32
+ * Deterministic authorization layer for agent tool execution control.
33
+ *
34
+ * Provides policy-driven tool access control operating independently of LLM reasoning,
35
+ * ensuring security-critical decisions cannot be bypassed through prompt injection,
36
+ * jailbreaking, or other adversarial manipulation of the language model.
37
+ *
38
+ * @remarks
39
+ * **Authorization Flow:**
40
+ *
41
+ * When an agent requests tools requiring permission:
42
+ * 1. Agent calls `get()` to check current authorizations
43
+ * 2. Blocked tools trigger `requestBuilder()` to create permission request payload
44
+ * 3. Agent emits permission request event and suspends execution
45
+ * 4. External authorizer (human, policy engine, IAM) processes request
46
+ * 5. Authorization response arrives, agent calls `set()` to update permissions
47
+ * 6. Agent resumes, LLM retries tool calls with updated authorizations
48
+ *
49
+ * **Implementation Considerations:**
50
+ *
51
+ * Permission managers should be fast on the read path (hot path during tool execution)
52
+ * and can be slower on the write path (triggered only when authorization changes).
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * const permissionContract = createSimpleArvoContract({
57
+ * uri: '#/permissions/tool-access',
58
+ * type: 'permission.tool.access',
59
+ * domain: 'human.interaction',
60
+ * versions: {
61
+ * '1.0.0': {
62
+ * accepts: z.object({
63
+ * agentId: z.string(),
64
+ * requestedTools: z.array(z.string()),
65
+ * reason: z.string(),
66
+ * workflowContext: z.string(),
67
+ * }),
68
+ * emits: z.object({
69
+ * granted: z.array(z.string()),
70
+ * denied: z.array(z.string()),
71
+ * expiresAt: z.string().datetime().optional(),
72
+ * }),
73
+ * },
74
+ * },
75
+ * });
76
+ *
77
+ * class ToolPermissionManager implements IPermissionManager<typeof permissionContract> {
78
+ * public readonly contract = permissionContract.version('1.0.0');
79
+ * // public readonly domains = ['human.interaction'];
80
+ * public readonly domains = [ArvoDomain.FROM_EVENT_CONTRACT];
81
+ * // Both domains are the same
82
+ *
83
+ * private permissions = new Map<string, Set<string>>();
84
+ *
85
+ * private getKey(source: PermissionManagerContext): string {
86
+ * return `${source.name}:${source.subject}`;
87
+ * }
88
+ *
89
+ * async get(source, tools) {
90
+ * const key = this.getKey(source);
91
+ * const granted = this.permissions.get(key) ?? new Set();
92
+ * return Object.fromEntries(
93
+ * tools.map(tool => [tool.name, granted.has(tool.name)])
94
+ * );
95
+ * }
96
+ *
97
+ * async set(source, event) {
98
+ * const key = this.getKey(source);
99
+ * const granted = this.permissions.get(key) ?? new Set();
100
+ * for (const tool of event.data.granted) {
101
+ * granted.add(tool);
102
+ * }
103
+ * this.permissions.set(key, granted);
104
+ * }
105
+ *
106
+ * async requestBuilder(source, tools) {
107
+ * return {
108
+ * agentId: source.name,
109
+ * requestedTools: tools.map(t => t.name),
110
+ * reason: `Agent requires permission: ${tools.map(t => t.name).join(', ')}`,
111
+ * workflowContext: source.subject,
112
+ * };
113
+ * }
114
+ * }
115
+ *
116
+ * const agent = createArvoAgent({
117
+ * permissionManager: new ToolPermissionManager(),
118
+ * handler: {
119
+ * '1.0.0': {
120
+ * permissionPolicy: async ({ services }) => [
121
+ * services.deleteUser.name,
122
+ * services.processRefund.name
123
+ * ],
124
+ * // ... context and output builders
125
+ * }
126
+ * }
127
+ * });
128
+ * ```
129
+ */
130
+ export interface IPermissionManager<T extends VersionedArvoContract<SimpleArvoContract<any, any, any>, any> = VersionedArvoContract<SimpleArvoContract<any, any, any>, any>> {
131
+ /**
132
+ * Versioned contract defining permission request/response event schemas.
133
+ *
134
+ * Follows standard Arvo contract patterns enabling versioning, validation,
135
+ * and routing like any service contract in the event fabric.
136
+ */
137
+ contract: T;
138
+ /**
139
+ * Event delivery channel routing hints for permission requests.
140
+ *
141
+ * When specified, permission request events are routed to these domains
142
+ * (e.g., `['human.interaction']` for human approval workflows).
143
+ * `null` routes to the default system broker.
144
+ */
145
+ domains: NonEmptyArray<string> | null;
146
+ /**
147
+ * Updates internal permission state with authorization response.
148
+ *
149
+ * Called when the agent receives a permission response event. Extract
150
+ * granted/denied permissions from the event and update internal storage
151
+ * scoped to the provided context.
152
+ *
153
+ * @param source - Context identifying the agent and workflow for scoped storage
154
+ * @param event - Authorization response matching contract's success emission schema
155
+ */
156
+ set(source: PermissionManagerContext, event: InferVersionedArvoContract<T>['emits'][SimpleArvoContractEmitType<T['metadata']['rootType']>], config: {
157
+ otelInfo: OtelInfoType;
158
+ }): PromiseAble<void>;
159
+ /**
160
+ * Checks current authorization status for requested tools.
161
+ *
162
+ * Called in the hot path before tool execution. Should be optimized for
163
+ * performance for production.
164
+ *
165
+ * @param source - Context identifying the agent and workflow for permission lookup
166
+ * @param tools - Tool definitions to check (uses agent-oriented names from `tool.name`)
167
+ *
168
+ * @returns Map of tool names to authorization status where `true` permits execution
169
+ * and `false` blocks execution requiring authorization
170
+ */
171
+ get(source: PermissionManagerContext, tools: AgentToolDefinition<VersionedArvoContract<any, any> | AgentInternalTool | null>[], config: {
172
+ otelInfo: OtelInfoType;
173
+ }): PromiseAble<Record<string, boolean>>;
174
+ /**
175
+ * Constructs permission request event payload for blocked tools.
176
+ *
177
+ * Called when tools fail authorization checks. Build a payload conforming to
178
+ * the contract's `accepts` schema, providing sufficient context for external
179
+ * authorizers (humans, policy engines, IAM services) to make informed decisions.
180
+ *
181
+ * @param source - Context identifying the agent and workflow for the request
182
+ * @param tools - Tool definitions requiring permission (failed `get()` check)
183
+ *
184
+ * @returns Event payload matching contract's accepts schema. Use agent-oriented
185
+ * tool names from `tools[i].name` for consistency with permission checks.
186
+ */
187
+ requestBuilder(source: PermissionManagerContext, tools: AgentToolDefinition<VersionedArvoContract<any, any> | AgentInternalTool | null>[], config: {
188
+ otelInfo: OtelInfoType;
189
+ }): PromiseAble<InferVersionedArvoContract<T>['accepts']['data']>;
190
+ }
191
+ //# sourceMappingURL=interfaces.permission.manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.permission.manager.d.ts","sourceRoot":"","sources":["../src/interfaces.permission.manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sDAAsD,CAAC;AACvG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAExE;;;;;GAKG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkGG;AACH,MAAM,WAAW,kBAAkB,CAEjC,CAAC,SAAS,qBAAqB,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,qBAAqB,CAE7F,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAEjC,GAAG,CACJ;IAED;;;;;OAKG;IACH,QAAQ,EAAE,CAAC,CAAC;IAEZ;;;;;;OAMG;IACH,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAEtC;;;;;;;;;OASG;IACH,GAAG,CACD,MAAM,EAAE,wBAAwB,EAChC,KAAK,EAAE,0BAA0B,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,0BAA0B,CACtE,CAAC,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAC1B,CAAC,EACF,MAAM,EAAE;QAAE,QAAQ,EAAE,YAAY,CAAA;KAAE,GACjC,WAAW,CAAC,IAAI,CAAC,CAAC;IAErB;;;;;;;;;;;OAWG;IACH,GAAG,CACD,MAAM,EAAE,wBAAwB,EAChC,KAAK,EAAE,mBAAmB,CAExB,qBAAqB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,iBAAiB,GAAG,IAAI,CAC3D,EAAE,EACH,MAAM,EAAE;QAAE,QAAQ,EAAE,YAAY,CAAA;KAAE,GACjC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAExC;;;;;;;;;;;;OAYG;IACH,cAAc,CACZ,MAAM,EAAE,wBAAwB,EAChC,KAAK,EAAE,mBAAmB,CAExB,qBAAqB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,iBAAiB,GAAG,IAAI,CAC3D,EAAE,EACH,MAAM,EAAE;QAAE,QAAQ,EAAE,YAAY,CAAA;KAAE,GACjC,WAAW,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;CAClE"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=interfaces.permission.manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.permission.manager.js","sourceRoot":"","sources":["../src/interfaces.permission.manager.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arvo-tools/agentic",
3
- "version": "1.1.1",
3
+ "version": "1.2.1",
4
4
  "description": "Agentic toolset for building applications using arvo-core and arvo-event-handler",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",