@allin-ai/agent-client 0.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.
Files changed (164) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +53 -0
  3. package/bin/allinai-agent +4 -0
  4. package/dist/capabilities/context.d.ts +16 -0
  5. package/dist/capabilities/context.d.ts.map +1 -0
  6. package/dist/capabilities/context.js +98 -0
  7. package/dist/capabilities/context.js.map +1 -0
  8. package/dist/capabilities/input.d.ts +7 -0
  9. package/dist/capabilities/input.d.ts.map +1 -0
  10. package/dist/capabilities/input.js +224 -0
  11. package/dist/capabilities/input.js.map +1 -0
  12. package/dist/capabilities/manifest.d.ts +15 -0
  13. package/dist/capabilities/manifest.d.ts.map +1 -0
  14. package/dist/capabilities/manifest.js +292 -0
  15. package/dist/capabilities/manifest.js.map +1 -0
  16. package/dist/capabilities/policy.d.ts +17 -0
  17. package/dist/capabilities/policy.d.ts.map +1 -0
  18. package/dist/capabilities/policy.js +57 -0
  19. package/dist/capabilities/policy.js.map +1 -0
  20. package/dist/capabilities/shell-host.d.ts +32 -0
  21. package/dist/capabilities/shell-host.d.ts.map +1 -0
  22. package/dist/capabilities/shell-host.js +378 -0
  23. package/dist/capabilities/shell-host.js.map +1 -0
  24. package/dist/capabilities/shell-wire.d.ts +13 -0
  25. package/dist/capabilities/shell-wire.d.ts.map +1 -0
  26. package/dist/capabilities/shell-wire.js +60 -0
  27. package/dist/capabilities/shell-wire.js.map +1 -0
  28. package/dist/capabilities/types.d.ts +46 -0
  29. package/dist/capabilities/types.d.ts.map +1 -0
  30. package/dist/capabilities/types.js +7 -0
  31. package/dist/capabilities/types.js.map +1 -0
  32. package/dist/cli/commands.d.ts +83 -0
  33. package/dist/cli/commands.d.ts.map +1 -0
  34. package/dist/cli/commands.js +638 -0
  35. package/dist/cli/commands.js.map +1 -0
  36. package/dist/cli/main.d.ts +2 -0
  37. package/dist/cli/main.d.ts.map +1 -0
  38. package/dist/cli/main.js +7 -0
  39. package/dist/cli/main.js.map +1 -0
  40. package/dist/client/state-store.d.ts +80 -0
  41. package/dist/client/state-store.d.ts.map +1 -0
  42. package/dist/client/state-store.js +422 -0
  43. package/dist/client/state-store.js.map +1 -0
  44. package/dist/client/supervisor.d.ts +118 -0
  45. package/dist/client/supervisor.d.ts.map +1 -0
  46. package/dist/client/supervisor.js +627 -0
  47. package/dist/client/supervisor.js.map +1 -0
  48. package/dist/client/transport.d.ts +30 -0
  49. package/dist/client/transport.d.ts.map +1 -0
  50. package/dist/client/transport.js +2 -0
  51. package/dist/client/transport.js.map +1 -0
  52. package/dist/client/types.d.ts +65 -0
  53. package/dist/client/types.d.ts.map +1 -0
  54. package/dist/client/types.js +13 -0
  55. package/dist/client/types.js.map +1 -0
  56. package/dist/client/wire.d.ts +32 -0
  57. package/dist/client/wire.d.ts.map +1 -0
  58. package/dist/client/wire.js +302 -0
  59. package/dist/client/wire.js.map +1 -0
  60. package/dist/client/ws-transport.d.ts +54 -0
  61. package/dist/client/ws-transport.d.ts.map +1 -0
  62. package/dist/client/ws-transport.js +229 -0
  63. package/dist/client/ws-transport.js.map +1 -0
  64. package/dist/config.d.ts +38 -0
  65. package/dist/config.d.ts.map +1 -0
  66. package/dist/config.js +125 -0
  67. package/dist/config.js.map +1 -0
  68. package/dist/control.d.ts +59 -0
  69. package/dist/control.d.ts.map +1 -0
  70. package/dist/control.js +217 -0
  71. package/dist/control.js.map +1 -0
  72. package/dist/credentials.d.ts +44 -0
  73. package/dist/credentials.d.ts.map +1 -0
  74. package/dist/credentials.js +229 -0
  75. package/dist/credentials.js.map +1 -0
  76. package/dist/hub.d.ts +83 -0
  77. package/dist/hub.d.ts.map +1 -0
  78. package/dist/hub.js +412 -0
  79. package/dist/hub.js.map +1 -0
  80. package/dist/index.d.ts +20 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +18 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/logger.d.ts +47 -0
  85. package/dist/logger.d.ts.map +1 -0
  86. package/dist/logger.js +175 -0
  87. package/dist/logger.js.map +1 -0
  88. package/dist/paths.d.ts +29 -0
  89. package/dist/paths.d.ts.map +1 -0
  90. package/dist/paths.js +50 -0
  91. package/dist/paths.js.map +1 -0
  92. package/dist/plugins/git.d.ts +30 -0
  93. package/dist/plugins/git.d.ts.map +1 -0
  94. package/dist/plugins/git.js +80 -0
  95. package/dist/plugins/git.js.map +1 -0
  96. package/dist/plugins/manager.d.ts +41 -0
  97. package/dist/plugins/manager.d.ts.map +1 -0
  98. package/dist/plugins/manager.js +328 -0
  99. package/dist/plugins/manager.js.map +1 -0
  100. package/dist/plugins/manifest.d.ts +9 -0
  101. package/dist/plugins/manifest.d.ts.map +1 -0
  102. package/dist/plugins/manifest.js +63 -0
  103. package/dist/plugins/manifest.js.map +1 -0
  104. package/dist/plugins/types.d.ts +39 -0
  105. package/dist/plugins/types.d.ts.map +1 -0
  106. package/dist/plugins/types.js +2 -0
  107. package/dist/plugins/types.js.map +1 -0
  108. package/dist/runtime/claude.d.ts +30 -0
  109. package/dist/runtime/claude.d.ts.map +1 -0
  110. package/dist/runtime/claude.js +163 -0
  111. package/dist/runtime/claude.js.map +1 -0
  112. package/dist/runtime/codex.d.ts +44 -0
  113. package/dist/runtime/codex.d.ts.map +1 -0
  114. package/dist/runtime/codex.js +192 -0
  115. package/dist/runtime/codex.js.map +1 -0
  116. package/dist/runtime/events.d.ts +7 -0
  117. package/dist/runtime/events.d.ts.map +1 -0
  118. package/dist/runtime/events.js +37 -0
  119. package/dist/runtime/events.js.map +1 -0
  120. package/dist/runtime/index.d.ts +10 -0
  121. package/dist/runtime/index.d.ts.map +1 -0
  122. package/dist/runtime/index.js +10 -0
  123. package/dist/runtime/index.js.map +1 -0
  124. package/dist/runtime/pi.d.ts +34 -0
  125. package/dist/runtime/pi.d.ts.map +1 -0
  126. package/dist/runtime/pi.js +211 -0
  127. package/dist/runtime/pi.js.map +1 -0
  128. package/dist/runtime/registry.d.ts +16 -0
  129. package/dist/runtime/registry.d.ts.map +1 -0
  130. package/dist/runtime/registry.js +22 -0
  131. package/dist/runtime/registry.js.map +1 -0
  132. package/dist/runtime/runner-child.d.ts +2 -0
  133. package/dist/runtime/runner-child.d.ts.map +1 -0
  134. package/dist/runtime/runner-child.js +41 -0
  135. package/dist/runtime/runner-child.js.map +1 -0
  136. package/dist/runtime/runner-manager.d.ts +77 -0
  137. package/dist/runtime/runner-manager.d.ts.map +1 -0
  138. package/dist/runtime/runner-manager.js +295 -0
  139. package/dist/runtime/runner-manager.js.map +1 -0
  140. package/dist/runtime/runner-wire.d.ts +23 -0
  141. package/dist/runtime/runner-wire.d.ts.map +1 -0
  142. package/dist/runtime/runner-wire.js +93 -0
  143. package/dist/runtime/runner-wire.js.map +1 -0
  144. package/dist/runtime/types.d.ts +43 -0
  145. package/dist/runtime/types.d.ts.map +1 -0
  146. package/dist/runtime/types.js +3 -0
  147. package/dist/runtime/types.js.map +1 -0
  148. package/dist/runtime/zcode.d.ts +14 -0
  149. package/dist/runtime/zcode.d.ts.map +1 -0
  150. package/dist/runtime/zcode.js +21 -0
  151. package/dist/runtime/zcode.js.map +1 -0
  152. package/dist/service/launchd.d.ts +34 -0
  153. package/dist/service/launchd.d.ts.map +1 -0
  154. package/dist/service/launchd.js +86 -0
  155. package/dist/service/launchd.js.map +1 -0
  156. package/dist/service/systemd.d.ts +16 -0
  157. package/dist/service/systemd.d.ts.map +1 -0
  158. package/dist/service/systemd.js +89 -0
  159. package/dist/service/systemd.js.map +1 -0
  160. package/dist/wire.d.ts +24 -0
  161. package/dist/wire.d.ts.map +1 -0
  162. package/dist/wire.js +7 -0
  163. package/dist/wire.js.map +1 -0
  164. package/package.json +140 -0
@@ -0,0 +1,292 @@
1
+ import { realpath, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { CAPABILITY_CONTEXT_KEYS, CAPABILITY_PERMISSIONS, } from "./types.js";
4
+ export const MAX_CAPABILITY_TIMEOUT_SECONDS = 900;
5
+ const CAPABILITY_ID = /^[a-z0-9][a-z0-9._-]{0,127}$/;
6
+ const MAX_SCHEMA_DEPTH = 12;
7
+ const MAX_SCHEMA_PROPERTIES = 128;
8
+ const MAX_SCHEMA_COLLECTION_ITEMS = 1_024;
9
+ function isPlainObject(value) {
10
+ if (!value || typeof value !== "object" || Array.isArray(value))
11
+ return false;
12
+ const prototype = Object.getPrototypeOf(value);
13
+ return prototype === Object.prototype || prototype === null;
14
+ }
15
+ function isNonNegativeInteger(value) {
16
+ return Number.isSafeInteger(value) && value >= 0;
17
+ }
18
+ function isFiniteNumber(value) {
19
+ return typeof value === "number" && Number.isFinite(value);
20
+ }
21
+ function hasOnlyKeys(value, allowed) {
22
+ return Object.keys(value).every((key) => allowed.includes(key));
23
+ }
24
+ function parseDescription(value) {
25
+ if (value.description === undefined)
26
+ return undefined;
27
+ if (typeof value.description !== "string" ||
28
+ value.description.length > 4_096) {
29
+ return null;
30
+ }
31
+ return value.description;
32
+ }
33
+ function parseBoundedInteger(value, key, maximum = MAX_SCHEMA_COLLECTION_ITEMS) {
34
+ const raw = value[key];
35
+ if (raw === undefined)
36
+ return undefined;
37
+ return isNonNegativeInteger(raw) && raw <= maximum ? raw : null;
38
+ }
39
+ function parseJsonSchema(value, depth = 0) {
40
+ if (depth > MAX_SCHEMA_DEPTH ||
41
+ !isPlainObject(value) ||
42
+ typeof value.type !== "string") {
43
+ return null;
44
+ }
45
+ const description = parseDescription(value);
46
+ if (description === null)
47
+ return null;
48
+ const withDescription = description === undefined ? {} : { description };
49
+ if (value.type === "object") {
50
+ if (!hasOnlyKeys(value, [
51
+ "type",
52
+ "description",
53
+ "properties",
54
+ "required",
55
+ "additionalProperties",
56
+ "minProperties",
57
+ "maxProperties",
58
+ ])) {
59
+ return null;
60
+ }
61
+ let properties;
62
+ if (value.properties !== undefined) {
63
+ if (!isPlainObject(value.properties))
64
+ return null;
65
+ const entries = Object.entries(value.properties);
66
+ if (entries.length > MAX_SCHEMA_PROPERTIES)
67
+ return null;
68
+ properties = {};
69
+ for (const [key, child] of entries) {
70
+ if (!key || key.length > 128)
71
+ return null;
72
+ const parsed = parseJsonSchema(child, depth + 1);
73
+ if (!parsed)
74
+ return null;
75
+ properties[key] = parsed;
76
+ }
77
+ }
78
+ let required;
79
+ if (value.required !== undefined) {
80
+ if (!Array.isArray(value.required) ||
81
+ value.required.length > MAX_SCHEMA_PROPERTIES ||
82
+ value.required.some((key) => typeof key !== "string" || !properties?.[key]) ||
83
+ new Set(value.required).size !== value.required.length) {
84
+ return null;
85
+ }
86
+ required = [...value.required];
87
+ }
88
+ if (value.additionalProperties !== undefined &&
89
+ typeof value.additionalProperties !== "boolean") {
90
+ return null;
91
+ }
92
+ const minProperties = parseBoundedInteger(value, "minProperties", MAX_SCHEMA_PROPERTIES);
93
+ const maxProperties = parseBoundedInteger(value, "maxProperties", MAX_SCHEMA_PROPERTIES);
94
+ if (minProperties === null ||
95
+ maxProperties === null ||
96
+ (minProperties !== undefined &&
97
+ maxProperties !== undefined &&
98
+ minProperties > maxProperties)) {
99
+ return null;
100
+ }
101
+ return {
102
+ ...withDescription,
103
+ type: "object",
104
+ ...(properties ? { properties } : {}),
105
+ ...(required ? { required } : {}),
106
+ ...(value.additionalProperties !== undefined
107
+ ? { additionalProperties: value.additionalProperties }
108
+ : {}),
109
+ ...(minProperties === undefined ? {} : { minProperties }),
110
+ ...(maxProperties === undefined ? {} : { maxProperties }),
111
+ };
112
+ }
113
+ if (value.type === "array") {
114
+ if (!hasOnlyKeys(value, [
115
+ "type",
116
+ "description",
117
+ "items",
118
+ "minItems",
119
+ "maxItems",
120
+ ])) {
121
+ return null;
122
+ }
123
+ const items = parseJsonSchema(value.items, depth + 1);
124
+ const minItems = parseBoundedInteger(value, "minItems");
125
+ const maxItems = parseBoundedInteger(value, "maxItems");
126
+ if (!items ||
127
+ minItems === null ||
128
+ maxItems === null ||
129
+ (minItems !== undefined && maxItems !== undefined && minItems > maxItems)) {
130
+ return null;
131
+ }
132
+ return {
133
+ ...withDescription,
134
+ type: "array",
135
+ items,
136
+ ...(minItems === undefined ? {} : { minItems }),
137
+ ...(maxItems === undefined ? {} : { maxItems }),
138
+ };
139
+ }
140
+ if (value.type === "string") {
141
+ if (!hasOnlyKeys(value, [
142
+ "type",
143
+ "description",
144
+ "minLength",
145
+ "maxLength",
146
+ ])) {
147
+ return null;
148
+ }
149
+ const minLength = parseBoundedInteger(value, "minLength");
150
+ const maxLength = parseBoundedInteger(value, "maxLength");
151
+ if (minLength === null ||
152
+ maxLength === null ||
153
+ (minLength !== undefined &&
154
+ maxLength !== undefined &&
155
+ minLength > maxLength)) {
156
+ return null;
157
+ }
158
+ return {
159
+ ...withDescription,
160
+ type: "string",
161
+ ...(minLength === undefined ? {} : { minLength }),
162
+ ...(maxLength === undefined ? {} : { maxLength }),
163
+ };
164
+ }
165
+ if (value.type === "number" || value.type === "integer") {
166
+ if (!hasOnlyKeys(value, ["type", "description", "minimum", "maximum"])) {
167
+ return null;
168
+ }
169
+ if ((value.minimum !== undefined && !isFiniteNumber(value.minimum)) ||
170
+ (value.maximum !== undefined && !isFiniteNumber(value.maximum)) ||
171
+ (typeof value.minimum === "number" &&
172
+ typeof value.maximum === "number" &&
173
+ value.minimum > value.maximum)) {
174
+ return null;
175
+ }
176
+ return {
177
+ ...withDescription,
178
+ type: value.type,
179
+ ...(value.minimum === undefined ? {} : { minimum: value.minimum }),
180
+ ...(value.maximum === undefined ? {} : { maximum: value.maximum }),
181
+ };
182
+ }
183
+ if (value.type === "boolean" || value.type === "null") {
184
+ if (!hasOnlyKeys(value, ["type", "description"]))
185
+ return null;
186
+ return { ...withDescription, type: value.type };
187
+ }
188
+ return null;
189
+ }
190
+ function parseEnum(value, allowed) {
191
+ if (!Array.isArray(value) || new Set(value).size !== value.length)
192
+ return null;
193
+ const values = [];
194
+ for (const item of value) {
195
+ if (typeof item !== "string" || !allowed.includes(item))
196
+ return null;
197
+ values.push(item);
198
+ }
199
+ return values;
200
+ }
201
+ export function isValidCapabilityId(value) {
202
+ return typeof value === "string" && CAPABILITY_ID.test(value);
203
+ }
204
+ export function isSafeCapabilityEntry(value) {
205
+ if (typeof value !== "string" ||
206
+ value.length === 0 ||
207
+ value.length > 512 ||
208
+ value !== value.trim() ||
209
+ value.includes("\0") ||
210
+ value.includes("\\") ||
211
+ path.posix.isAbsolute(value) ||
212
+ path.win32.isAbsolute(value)) {
213
+ return false;
214
+ }
215
+ const segments = value.split("/");
216
+ return (!segments.some((segment) => segment === "" || segment === "." || segment === "..") && path.posix.normalize(value) === value);
217
+ }
218
+ /**
219
+ * Parse the intentionally small JSON Schema subset accepted for direct shell
220
+ * inputs. A root object is required, so a Hub request is always structured.
221
+ */
222
+ export function parseShellCapability(value) {
223
+ if (!isPlainObject(value))
224
+ return null;
225
+ if (!hasOnlyKeys(value, [
226
+ "id",
227
+ "entry",
228
+ "inputSchema",
229
+ "contextKeys",
230
+ "permissions",
231
+ "timeoutSeconds",
232
+ ]) ||
233
+ !isValidCapabilityId(value.id) ||
234
+ !isSafeCapabilityEntry(value.entry) ||
235
+ !Number.isInteger(value.timeoutSeconds) ||
236
+ value.timeoutSeconds < 1 ||
237
+ value.timeoutSeconds > MAX_CAPABILITY_TIMEOUT_SECONDS) {
238
+ return null;
239
+ }
240
+ const inputSchema = parseJsonSchema(value.inputSchema);
241
+ const contextKeys = parseEnum(value.contextKeys, CAPABILITY_CONTEXT_KEYS);
242
+ const permissions = parseEnum(value.permissions, CAPABILITY_PERMISSIONS);
243
+ if (!inputSchema ||
244
+ inputSchema.type !== "object" ||
245
+ !contextKeys ||
246
+ !permissions) {
247
+ return null;
248
+ }
249
+ return {
250
+ id: value.id,
251
+ entry: value.entry,
252
+ inputSchema,
253
+ contextKeys: contextKeys,
254
+ permissions: permissions,
255
+ timeoutSeconds: value.timeoutSeconds,
256
+ };
257
+ }
258
+ function resolvesInside(root, candidate) {
259
+ const relative = path.relative(root, candidate);
260
+ return (relative !== "" &&
261
+ !relative.startsWith(`..${path.sep}`) &&
262
+ relative !== ".." &&
263
+ !path.isAbsolute(relative));
264
+ }
265
+ /**
266
+ * Installer-time realpath validation closes the remaining symlink escape
267
+ * avenue that syntactic manifest parsing cannot see.
268
+ */
269
+ export async function validateCapabilityEntries(pluginRoot, capabilities) {
270
+ const root = await realpath(pluginRoot);
271
+ for (const capability of capabilities) {
272
+ const candidate = path.resolve(root, capability.entry);
273
+ if (!resolvesInside(root, candidate)) {
274
+ throw new Error(`Capability ${capability.id} entry is outside the plugin root`);
275
+ }
276
+ let resolved;
277
+ try {
278
+ resolved = await realpath(candidate);
279
+ }
280
+ catch (error) {
281
+ throw new Error(`Capability ${capability.id} entry could not be resolved: ${error instanceof Error ? error.message : String(error)}`);
282
+ }
283
+ if (!resolvesInside(root, resolved)) {
284
+ throw new Error(`Capability ${capability.id} entry resolves outside the plugin root`);
285
+ }
286
+ const details = await stat(resolved);
287
+ if (!details.isFile()) {
288
+ throw new Error(`Capability ${capability.id} entry must resolve to a file`);
289
+ }
290
+ }
291
+ }
292
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/capabilities/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { InstalledPlugin } from "../plugins/types.js";
2
+ import type { CapabilityPermission, PolicyDecision, ShellCapability } from "./types.js";
3
+ export type CapabilityLocalPolicy = {
4
+ /** Explicitly false is a durable local kill-switch for all capabilities. */
5
+ clientEnabled: boolean;
6
+ autoPermissions: readonly CapabilityPermission[];
7
+ allowedGitOrigins: readonly string[];
8
+ deniedPluginIds: readonly string[];
9
+ allowedWorkspaceRoots: readonly string[];
10
+ };
11
+ /**
12
+ * Policy order is deliberately fixed: coarse local safety constraints are
13
+ * never weakened by a later auto-permission setting. Unknown configuration
14
+ * and empty allowlists therefore fail closed.
15
+ */
16
+ export declare function decideCapability(policy: CapabilityLocalPolicy, plugin: InstalledPlugin, capability: ShellCapability, workspace: string): PolicyDecision;
17
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/capabilities/policy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EACV,oBAAoB,EACpB,cAAc,EACd,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,qBAAqB,GAAG;IAClC,4EAA4E;IAC5E,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACjD,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C,CAAC;AA0BF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,eAAe,EAC3B,SAAS,EAAE,MAAM,GAChB,cAAc,CA8BhB"}
@@ -0,0 +1,57 @@
1
+ import path from "node:path";
2
+ import { isAllowedGitOrigin } from "../plugins/git.js";
3
+ function isWorkspaceAllowed(workspace, roots) {
4
+ if (!path.isAbsolute(workspace) || roots.length === 0)
5
+ return false;
6
+ const resolvedWorkspace = path.resolve(workspace);
7
+ return roots.some((root) => {
8
+ if (typeof root !== "string" || !path.isAbsolute(root))
9
+ return false;
10
+ const relative = path.relative(path.resolve(root), resolvedWorkspace);
11
+ return (relative === "" ||
12
+ (!relative.startsWith(`..${path.sep}`) &&
13
+ relative !== ".." &&
14
+ !path.isAbsolute(relative)));
15
+ });
16
+ }
17
+ function permissionApprovalReason(permission) {
18
+ return permission === "network"
19
+ ? "network requires local approval"
20
+ : "workspace:write requires local approval";
21
+ }
22
+ /**
23
+ * Policy order is deliberately fixed: coarse local safety constraints are
24
+ * never weakened by a later auto-permission setting. Unknown configuration
25
+ * and empty allowlists therefore fail closed.
26
+ */
27
+ export function decideCapability(policy, plugin, capability, workspace) {
28
+ if (!policy.clientEnabled)
29
+ return { mode: "deny", reason: "client is disabled" };
30
+ if (plugin.status !== "active" || !plugin.enabled) {
31
+ return { mode: "deny", reason: "plugin is not active" };
32
+ }
33
+ if (policy.deniedPluginIds.includes(plugin.id)) {
34
+ return { mode: "deny", reason: "plugin is denied by local policy" };
35
+ }
36
+ if (!isAllowedGitOrigin(plugin.gitUrl, policy.allowedGitOrigins)) {
37
+ return { mode: "deny", reason: "plugin Git origin is not allowed" };
38
+ }
39
+ if (!isWorkspaceAllowed(workspace, policy.allowedWorkspaceRoots)) {
40
+ return { mode: "deny", reason: "workspace is not allowed" };
41
+ }
42
+ const automatic = new Set(policy.autoPermissions);
43
+ // Network always asks unless this exact permission appears in local policy.
44
+ if (capability.permissions.includes("network") && !automatic.has("network")) {
45
+ return { mode: "approval", reason: permissionApprovalReason("network") };
46
+ }
47
+ for (const permission of capability.permissions) {
48
+ if (!automatic.has(permission)) {
49
+ return { mode: "approval", reason: permissionApprovalReason(permission) };
50
+ }
51
+ }
52
+ return {
53
+ mode: "auto",
54
+ reason: "all capability permissions are locally allowed",
55
+ };
56
+ }
57
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/capabilities/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type ChildProcess, type SpawnOptions } from "node:child_process";
2
+ import { type CapabilityEvent } from "./shell-wire.js";
3
+ import type { ShellCapability } from "./types.js";
4
+ export type CapabilitySpawn = (entry: string, args: readonly string[], options: SpawnOptions) => ChildProcess;
5
+ export type ShellCapabilityHostOptions = {
6
+ /** The immutable active revision selected by the local plugin manager. */
7
+ pluginRoot: string;
8
+ spawn?: CapabilitySpawn;
9
+ /** Explicit local values only; process.env is never inherited. */
10
+ environment?: Readonly<Record<string, string>>;
11
+ maxLineBytes?: number;
12
+ maxOutputBytes?: number;
13
+ killGraceMs?: number;
14
+ };
15
+ /**
16
+ * The only process boundary available to a direct Shell Capability. The Hub
17
+ * supplies data, never a command: the installed manifest determines the
18
+ * executable and a fixed JSON document is the process's sole stdin input.
19
+ */
20
+ export declare class ShellCapabilityHost {
21
+ private readonly options;
22
+ private readonly spawn;
23
+ private readonly maxLineBytes;
24
+ private readonly maxOutputBytes;
25
+ private readonly killGraceMs;
26
+ constructor(options: ShellCapabilityHostOptions);
27
+ invoke(capability: ShellCapability, input: unknown, context: Record<string, unknown>, signal: AbortSignal): AsyncIterable<CapabilityEvent>;
28
+ private resolveEntrypoint;
29
+ private run;
30
+ private streamChild;
31
+ }
32
+ //# sourceMappingURL=shell-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-host.d.ts","sourceRoot":"","sources":["../../src/capabilities/shell-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,eAAe,GAAG,CAC5B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,YAAY,KAClB,YAAY,CAAC;AAElB,MAAM,MAAM,0BAA0B,GAAG;IACvC,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,kEAAkE;IAClE,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AA2EF;;;;GAIG;AACH,qBAAa,mBAAmB;IAMlB,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAER,OAAO,EAAE,0BAA0B;IAgBzD,MAAM,CACX,UAAU,EAAE,eAAe,EAC3B,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,EAAE,WAAW,GAClB,aAAa,CAAC,eAAe,CAAC;YAiBnB,iBAAiB;YAiCjB,GAAG;YAuFH,WAAW;CAiK1B"}