@agent-assembly/sdk 0.0.1-alpha.3

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 (256) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +182 -0
  3. package/dist/cjs/adapters/adapter-registry.js +2 -0
  4. package/dist/cjs/adapters/adapter.js +2 -0
  5. package/dist/cjs/adapters/index.js +2 -0
  6. package/dist/cjs/adapters/langchain/assembly-callback-handler.js +93 -0
  7. package/dist/cjs/adapters/langchain/index.js +8 -0
  8. package/dist/cjs/adapters/langchain/wrap-tool-with-assembly.js +55 -0
  9. package/dist/cjs/audit/encode.js +176 -0
  10. package/dist/cjs/audit/index.js +8 -0
  11. package/dist/cjs/core/gateway-resolver.js +254 -0
  12. package/dist/cjs/core/index.js +9 -0
  13. package/dist/cjs/core/init-assembly.js +224 -0
  14. package/dist/cjs/errors/configuration-error.js +17 -0
  15. package/dist/cjs/errors/gateway-error.js +17 -0
  16. package/dist/cjs/errors/index.js +11 -0
  17. package/dist/cjs/errors/op-terminated-error.js +20 -0
  18. package/dist/cjs/errors/policy-violation-error.js +10 -0
  19. package/dist/cjs/gateway/client.js +15 -0
  20. package/dist/cjs/gateway/index.js +5 -0
  21. package/dist/cjs/hooks/adapter-registry.js +7 -0
  22. package/dist/cjs/hooks/ai-sdk-detection.js +14 -0
  23. package/dist/cjs/hooks/ai-sdk.js +164 -0
  24. package/dist/cjs/hooks/langchain.js +9 -0
  25. package/dist/cjs/hooks/langgraph-detection.js +14 -0
  26. package/dist/cjs/hooks/langgraph.js +107 -0
  27. package/dist/cjs/hooks/mastra-detection.js +14 -0
  28. package/dist/cjs/hooks/mastra.js +120 -0
  29. package/dist/cjs/hooks/openai-agents-detection.js +14 -0
  30. package/dist/cjs/hooks/openai-agents.js +189 -0
  31. package/dist/cjs/index.js +25 -0
  32. package/dist/cjs/lineage/agent-context-store.js +20 -0
  33. package/dist/cjs/lineage/index.js +7 -0
  34. package/dist/cjs/native/client.js +160 -0
  35. package/dist/cjs/op-control.js +150 -0
  36. package/dist/cjs/package.json +3 -0
  37. package/dist/cjs/proto/generated/common.js +365 -0
  38. package/dist/cjs/proto/generated/policy.js +1418 -0
  39. package/dist/cjs/runtime.js +144 -0
  40. package/dist/cjs/types/assembly-config.js +2 -0
  41. package/dist/cjs/types/assembly-context.js +2 -0
  42. package/dist/cjs/types/assembly-mode.js +2 -0
  43. package/dist/cjs/types/audit.js +5 -0
  44. package/dist/cjs/types/enforcement-mode.js +9 -0
  45. package/dist/cjs/types/gateway-governance.js +2 -0
  46. package/dist/cjs/types/index.js +5 -0
  47. package/dist/cjs/types/langchain-adapter.js +2 -0
  48. package/dist/cjs/types/openai-agents-adapter.js +2 -0
  49. package/dist/cjs/types/policy.js +2 -0
  50. package/dist/cjs/types/tool-map.js +2 -0
  51. package/dist/cjs/types/vercel-ai-adapter.js +2 -0
  52. package/dist/cjs/wrappers/index.js +5 -0
  53. package/dist/cjs/wrappers/with-assembly.js +82 -0
  54. package/dist/esm/adapters/adapter-registry.js +2 -0
  55. package/dist/esm/adapters/adapter-registry.js.map +1 -0
  56. package/dist/esm/adapters/adapter.js +2 -0
  57. package/dist/esm/adapters/adapter.js.map +1 -0
  58. package/dist/esm/adapters/index.js +2 -0
  59. package/dist/esm/adapters/index.js.map +1 -0
  60. package/dist/esm/adapters/langchain/assembly-callback-handler.js +90 -0
  61. package/dist/esm/adapters/langchain/assembly-callback-handler.js.map +1 -0
  62. package/dist/esm/adapters/langchain/index.js +3 -0
  63. package/dist/esm/adapters/langchain/index.js.map +1 -0
  64. package/dist/esm/adapters/langchain/wrap-tool-with-assembly.js +52 -0
  65. package/dist/esm/adapters/langchain/wrap-tool-with-assembly.js.map +1 -0
  66. package/dist/esm/audit/encode.js +171 -0
  67. package/dist/esm/audit/encode.js.map +1 -0
  68. package/dist/esm/audit/index.js +2 -0
  69. package/dist/esm/audit/index.js.map +1 -0
  70. package/dist/esm/core/gateway-resolver.js +213 -0
  71. package/dist/esm/core/gateway-resolver.js.map +1 -0
  72. package/dist/esm/core/index.js +2 -0
  73. package/dist/esm/core/index.js.map +1 -0
  74. package/dist/esm/core/init-assembly.js +218 -0
  75. package/dist/esm/core/init-assembly.js.map +1 -0
  76. package/dist/esm/errors/configuration-error.js +14 -0
  77. package/dist/esm/errors/configuration-error.js.map +1 -0
  78. package/dist/esm/errors/gateway-error.js +14 -0
  79. package/dist/esm/errors/gateway-error.js.map +1 -0
  80. package/dist/esm/errors/index.js +5 -0
  81. package/dist/esm/errors/index.js.map +1 -0
  82. package/dist/esm/errors/op-terminated-error.js +17 -0
  83. package/dist/esm/errors/op-terminated-error.js.map +1 -0
  84. package/dist/esm/errors/policy-violation-error.js +7 -0
  85. package/dist/esm/errors/policy-violation-error.js.map +1 -0
  86. package/dist/esm/gateway/client.js +13 -0
  87. package/dist/esm/gateway/client.js.map +1 -0
  88. package/dist/esm/gateway/index.js +2 -0
  89. package/dist/esm/gateway/index.js.map +1 -0
  90. package/dist/esm/hooks/adapter-registry.js +5 -0
  91. package/dist/esm/hooks/adapter-registry.js.map +1 -0
  92. package/dist/esm/hooks/ai-sdk-detection.js +12 -0
  93. package/dist/esm/hooks/ai-sdk-detection.js.map +1 -0
  94. package/dist/esm/hooks/ai-sdk.js +123 -0
  95. package/dist/esm/hooks/ai-sdk.js.map +1 -0
  96. package/dist/esm/hooks/langchain.js +7 -0
  97. package/dist/esm/hooks/langchain.js.map +1 -0
  98. package/dist/esm/hooks/langgraph-detection.js +12 -0
  99. package/dist/esm/hooks/langgraph-detection.js.map +1 -0
  100. package/dist/esm/hooks/langgraph.js +69 -0
  101. package/dist/esm/hooks/langgraph.js.map +1 -0
  102. package/dist/esm/hooks/mastra-detection.js +12 -0
  103. package/dist/esm/hooks/mastra-detection.js.map +1 -0
  104. package/dist/esm/hooks/mastra.js +83 -0
  105. package/dist/esm/hooks/mastra.js.map +1 -0
  106. package/dist/esm/hooks/openai-agents-detection.js +12 -0
  107. package/dist/esm/hooks/openai-agents-detection.js.map +1 -0
  108. package/dist/esm/hooks/openai-agents.js +145 -0
  109. package/dist/esm/hooks/openai-agents.js.map +1 -0
  110. package/dist/esm/index.js +12 -0
  111. package/dist/esm/index.js.map +1 -0
  112. package/dist/esm/lineage/agent-context-store.js +16 -0
  113. package/dist/esm/lineage/agent-context-store.js.map +1 -0
  114. package/dist/esm/lineage/index.js +2 -0
  115. package/dist/esm/lineage/index.js.map +1 -0
  116. package/dist/esm/native/client.js +150 -0
  117. package/dist/esm/native/client.js.map +1 -0
  118. package/dist/esm/op-control.js +147 -0
  119. package/dist/esm/op-control.js.map +1 -0
  120. package/dist/esm/proto/generated/common.js +357 -0
  121. package/dist/esm/proto/generated/common.js.map +1 -0
  122. package/dist/esm/proto/generated/policy.js +1414 -0
  123. package/dist/esm/proto/generated/policy.js.map +1 -0
  124. package/dist/esm/runtime.js +138 -0
  125. package/dist/esm/runtime.js.map +1 -0
  126. package/dist/esm/types/assembly-config.js +2 -0
  127. package/dist/esm/types/assembly-config.js.map +1 -0
  128. package/dist/esm/types/assembly-context.js +2 -0
  129. package/dist/esm/types/assembly-context.js.map +1 -0
  130. package/dist/esm/types/assembly-mode.js +2 -0
  131. package/dist/esm/types/assembly-mode.js.map +1 -0
  132. package/dist/esm/types/audit.js +5 -0
  133. package/dist/esm/types/audit.js.map +1 -0
  134. package/dist/esm/types/enforcement-mode.js +7 -0
  135. package/dist/esm/types/enforcement-mode.js.map +1 -0
  136. package/dist/esm/types/gateway-governance.js +2 -0
  137. package/dist/esm/types/gateway-governance.js.map +1 -0
  138. package/dist/esm/types/index.js +2 -0
  139. package/dist/esm/types/index.js.map +1 -0
  140. package/dist/esm/types/langchain-adapter.js +2 -0
  141. package/dist/esm/types/langchain-adapter.js.map +1 -0
  142. package/dist/esm/types/openai-agents-adapter.js +2 -0
  143. package/dist/esm/types/openai-agents-adapter.js.map +1 -0
  144. package/dist/esm/types/policy.js +2 -0
  145. package/dist/esm/types/policy.js.map +1 -0
  146. package/dist/esm/types/tool-map.js +2 -0
  147. package/dist/esm/types/tool-map.js.map +1 -0
  148. package/dist/esm/types/vercel-ai-adapter.js +2 -0
  149. package/dist/esm/types/vercel-ai-adapter.js.map +1 -0
  150. package/dist/esm/wrappers/index.js +2 -0
  151. package/dist/esm/wrappers/index.js.map +1 -0
  152. package/dist/esm/wrappers/with-assembly.js +80 -0
  153. package/dist/esm/wrappers/with-assembly.js.map +1 -0
  154. package/dist/types/adapters/adapter-registry.d.ts +7 -0
  155. package/dist/types/adapters/adapter-registry.d.ts.map +1 -0
  156. package/dist/types/adapters/adapter.d.ts +6 -0
  157. package/dist/types/adapters/adapter.d.ts.map +1 -0
  158. package/dist/types/adapters/index.d.ts +3 -0
  159. package/dist/types/adapters/index.d.ts.map +1 -0
  160. package/dist/types/adapters/langchain/assembly-callback-handler.d.ts +21 -0
  161. package/dist/types/adapters/langchain/assembly-callback-handler.d.ts.map +1 -0
  162. package/dist/types/adapters/langchain/index.d.ts +4 -0
  163. package/dist/types/adapters/langchain/index.d.ts.map +1 -0
  164. package/dist/types/adapters/langchain/wrap-tool-with-assembly.d.ts +9 -0
  165. package/dist/types/adapters/langchain/wrap-tool-with-assembly.d.ts.map +1 -0
  166. package/dist/types/audit/encode.d.ts +77 -0
  167. package/dist/types/audit/encode.d.ts.map +1 -0
  168. package/dist/types/audit/index.d.ts +3 -0
  169. package/dist/types/audit/index.d.ts.map +1 -0
  170. package/dist/types/core/gateway-resolver.d.ts +92 -0
  171. package/dist/types/core/gateway-resolver.d.ts.map +1 -0
  172. package/dist/types/core/index.d.ts +2 -0
  173. package/dist/types/core/index.d.ts.map +1 -0
  174. package/dist/types/core/init-assembly.d.ts +10 -0
  175. package/dist/types/core/init-assembly.d.ts.map +1 -0
  176. package/dist/types/errors/configuration-error.d.ts +11 -0
  177. package/dist/types/errors/configuration-error.d.ts.map +1 -0
  178. package/dist/types/errors/gateway-error.d.ts +11 -0
  179. package/dist/types/errors/gateway-error.d.ts.map +1 -0
  180. package/dist/types/errors/index.d.ts +5 -0
  181. package/dist/types/errors/index.d.ts.map +1 -0
  182. package/dist/types/errors/op-terminated-error.d.ts +13 -0
  183. package/dist/types/errors/op-terminated-error.d.ts.map +1 -0
  184. package/dist/types/errors/policy-violation-error.d.ts +4 -0
  185. package/dist/types/errors/policy-violation-error.d.ts.map +1 -0
  186. package/dist/types/gateway/client.d.ts +14 -0
  187. package/dist/types/gateway/client.d.ts.map +1 -0
  188. package/dist/types/gateway/index.d.ts +3 -0
  189. package/dist/types/gateway/index.d.ts.map +1 -0
  190. package/dist/types/hooks/adapter-registry.d.ts +3 -0
  191. package/dist/types/hooks/adapter-registry.d.ts.map +1 -0
  192. package/dist/types/hooks/ai-sdk-detection.d.ts +2 -0
  193. package/dist/types/hooks/ai-sdk-detection.d.ts.map +1 -0
  194. package/dist/types/hooks/ai-sdk.d.ts +36 -0
  195. package/dist/types/hooks/ai-sdk.d.ts.map +1 -0
  196. package/dist/types/hooks/langchain.d.ts +3 -0
  197. package/dist/types/hooks/langchain.d.ts.map +1 -0
  198. package/dist/types/hooks/langgraph-detection.d.ts +2 -0
  199. package/dist/types/hooks/langgraph-detection.d.ts.map +1 -0
  200. package/dist/types/hooks/langgraph.d.ts +26 -0
  201. package/dist/types/hooks/langgraph.d.ts.map +1 -0
  202. package/dist/types/hooks/mastra-detection.d.ts +2 -0
  203. package/dist/types/hooks/mastra-detection.d.ts.map +1 -0
  204. package/dist/types/hooks/mastra.d.ts +29 -0
  205. package/dist/types/hooks/mastra.d.ts.map +1 -0
  206. package/dist/types/hooks/openai-agents-detection.d.ts +2 -0
  207. package/dist/types/hooks/openai-agents-detection.d.ts.map +1 -0
  208. package/dist/types/hooks/openai-agents.d.ts +42 -0
  209. package/dist/types/hooks/openai-agents.d.ts.map +1 -0
  210. package/dist/types/index.d.ts +10 -0
  211. package/dist/types/index.d.ts.map +1 -0
  212. package/dist/types/lineage/agent-context-store.d.ts +12 -0
  213. package/dist/types/lineage/agent-context-store.d.ts.map +1 -0
  214. package/dist/types/lineage/index.d.ts +2 -0
  215. package/dist/types/lineage/index.d.ts.map +1 -0
  216. package/dist/types/native/client.d.ts +26 -0
  217. package/dist/types/native/client.d.ts.map +1 -0
  218. package/dist/types/op-control.d.ts +85 -0
  219. package/dist/types/op-control.d.ts.map +1 -0
  220. package/dist/types/proto/generated/common.d.ts +90 -0
  221. package/dist/types/proto/generated/common.d.ts.map +1 -0
  222. package/dist/types/proto/generated/policy.d.ts +298 -0
  223. package/dist/types/proto/generated/policy.d.ts.map +1 -0
  224. package/dist/types/runtime.d.ts +59 -0
  225. package/dist/types/runtime.d.ts.map +1 -0
  226. package/dist/types/types/assembly-config.d.ts +47 -0
  227. package/dist/types/types/assembly-config.d.ts.map +1 -0
  228. package/dist/types/types/assembly-context.d.ts +12 -0
  229. package/dist/types/types/assembly-context.d.ts.map +1 -0
  230. package/dist/types/types/assembly-mode.d.ts +2 -0
  231. package/dist/types/types/assembly-mode.d.ts.map +1 -0
  232. package/dist/types/types/audit.d.ts +76 -0
  233. package/dist/types/types/audit.d.ts.map +1 -0
  234. package/dist/types/types/enforcement-mode.d.ts +20 -0
  235. package/dist/types/types/enforcement-mode.d.ts.map +1 -0
  236. package/dist/types/types/gateway-governance.d.ts +31 -0
  237. package/dist/types/types/gateway-governance.d.ts.map +1 -0
  238. package/dist/types/types/index.d.ts +12 -0
  239. package/dist/types/types/index.d.ts.map +1 -0
  240. package/dist/types/types/langchain-adapter.d.ts +25 -0
  241. package/dist/types/types/langchain-adapter.d.ts.map +1 -0
  242. package/dist/types/types/openai-agents-adapter.d.ts +17 -0
  243. package/dist/types/types/openai-agents-adapter.d.ts.map +1 -0
  244. package/dist/types/types/policy.d.ts +10 -0
  245. package/dist/types/types/policy.d.ts.map +1 -0
  246. package/dist/types/types/tool-map.d.ts +2 -0
  247. package/dist/types/types/tool-map.d.ts.map +1 -0
  248. package/dist/types/types/vercel-ai-adapter.d.ts +12 -0
  249. package/dist/types/types/vercel-ai-adapter.d.ts.map +1 -0
  250. package/dist/types/wrappers/index.d.ts +3 -0
  251. package/dist/types/wrappers/index.d.ts.map +1 -0
  252. package/dist/types/wrappers/with-assembly.d.ts +9 -0
  253. package/dist/types/wrappers/with-assembly.d.ts.map +1 -0
  254. package/native/aa-ffi-node/index.cjs +20 -0
  255. package/native/aa-ffi-node/index.d.ts +23 -0
  256. package/package.json +95 -0
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ /**
3
+ * Runtime auto-detection and lifecycle management for the `aasm` sidecar
4
+ * (F115 / AAASM-1205).
5
+ *
6
+ * The `initAssembly()` exported here is intentionally NOT re-exported from
7
+ * `@agent-assembly/sdk` at the top level: the existing gateway-based
8
+ * `initAssembly(config)` keeps its meaning. Opt in to the runtime-managed
9
+ * flow with `import { initAssembly } from "@agent-assembly/sdk/runtime"`.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.INSTALL_HINT = exports.RUNTIME_SUBPACKAGE = exports.RUNTIME_LOG_FILENAME = exports.DOCKER_BASE_BIN = exports.USER_LOCAL_BIN = exports.DEFAULT_RUNTIME_HOST = exports.DEFAULT_PORT = exports.BINARY_NAME = void 0;
13
+ exports.findAasmBinary = findAasmBinary;
14
+ exports.isRunning = isRunning;
15
+ exports.startRuntime = startRuntime;
16
+ exports.initAssembly = initAssembly;
17
+ const node_child_process_1 = require("node:child_process");
18
+ const node_fs_1 = require("node:fs");
19
+ const node_module_1 = require("node:module");
20
+ const node_net_1 = require("node:net");
21
+ const node_os_1 = require("node:os");
22
+ const node_path_1 = require("node:path");
23
+ const node_process_1 = require("node:process");
24
+ exports.BINARY_NAME = "aasm";
25
+ exports.DEFAULT_PORT = 7878;
26
+ exports.DEFAULT_RUNTIME_HOST = "127.0.0.1";
27
+ exports.USER_LOCAL_BIN = (0, node_path_1.join)((0, node_os_1.homedir)(), ".local", "bin");
28
+ exports.DOCKER_BASE_BIN = "/usr/local/bin";
29
+ exports.RUNTIME_LOG_FILENAME = ".aasm-runtime.log";
30
+ /** npm sub-package name for the bundled platform binary (esbuild pattern). */
31
+ exports.RUNTIME_SUBPACKAGE = `runtime-${(0, node_os_1.platform)()}-${(0, node_os_1.arch)()}`;
32
+ exports.INSTALL_HINT = [
33
+ "agent-assembly runtime not found.",
34
+ " Install with: pnpm add agent-assembly",
35
+ " Or manually: brew install agent-assembly/tap/aasm",
36
+ " curl -fsSL https://get.agent-assembly.io | sh",
37
+ ].join("\n");
38
+ /**
39
+ * Path to the platform-specific `aasm` binary bundled as an optional npm
40
+ * dependency, or `null` when the consumer hasn't installed that platform's
41
+ * `@agent-assembly/runtime-{platform}-{arch}` sub-package.
42
+ *
43
+ * Uses `createRequire(<cwd>/package.json)` — the same pattern used by
44
+ * `src/native/client.ts` and the framework-detection modules — so this
45
+ * module compiles cleanly under both the ESM and CJS build targets
46
+ * (`import.meta.url` is ESM-only and breaks `tsconfig.cjs.json`).
47
+ */
48
+ function bundledRuntimeBinaryPath() {
49
+ try {
50
+ const requireFromCwd = (0, node_module_1.createRequire)(`${(0, node_process_1.cwd)()}/package.json`);
51
+ const pkgJson = requireFromCwd.resolve(`@agent-assembly/${exports.RUNTIME_SUBPACKAGE}/package.json`);
52
+ return (0, node_path_1.join)((0, node_path_1.dirname)(pkgJson), "bin", exports.BINARY_NAME);
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ /**
59
+ * Locate the `aasm` binary across the 4 supported install paths.
60
+ *
61
+ * Search order: `$PATH` (Homebrew, cargo install) → `~/.local/bin/aasm`
62
+ * (curl installer) → `node_modules/@agent-assembly/runtime-{platform}-{arch}/bin/aasm`
63
+ * (npm optionalDependency) → `/usr/local/bin/aasm` (Docker base image).
64
+ * Returns the first existing match, or `null` when none exist.
65
+ */
66
+ function findAasmBinary() {
67
+ for (const dir of (node_process_1.env.PATH ?? "").split(node_path_1.delimiter)) {
68
+ if (!dir)
69
+ continue;
70
+ const candidate = (0, node_path_1.join)(dir, exports.BINARY_NAME);
71
+ if ((0, node_fs_1.existsSync)(candidate))
72
+ return candidate;
73
+ }
74
+ const userLocal = (0, node_path_1.join)(exports.USER_LOCAL_BIN, exports.BINARY_NAME);
75
+ if ((0, node_fs_1.existsSync)(userLocal))
76
+ return userLocal;
77
+ const bundled = bundledRuntimeBinaryPath();
78
+ if (bundled !== null && (0, node_fs_1.existsSync)(bundled))
79
+ return bundled;
80
+ const docker = (0, node_path_1.join)(exports.DOCKER_BASE_BIN, exports.BINARY_NAME);
81
+ if ((0, node_fs_1.existsSync)(docker))
82
+ return docker;
83
+ return null;
84
+ }
85
+ /**
86
+ * Resolve to `true` iff a local TCP listener accepts a connect on
87
+ * `host:port` within 100 ms. Any socket error (refused, timeout,
88
+ * unreachable) resolves to `false` and is treated as no sidecar.
89
+ */
90
+ function isRunning(port = exports.DEFAULT_PORT, host = exports.DEFAULT_RUNTIME_HOST) {
91
+ return new Promise((resolveResult) => {
92
+ const socket = (0, node_net_1.createConnection)({ port, host, timeout: 100 });
93
+ const settle = (value) => {
94
+ socket.removeAllListeners();
95
+ socket.destroy();
96
+ resolveResult(value);
97
+ };
98
+ socket.once("connect", () => settle(true));
99
+ socket.once("timeout", () => settle(false));
100
+ socket.once("error", () => settle(false));
101
+ });
102
+ }
103
+ /**
104
+ * Spawn `aasm serve --port <port>` as a detached background subprocess.
105
+ *
106
+ * Stdout/stderr are appended to `<logDir>/.aasm-runtime.log` (default
107
+ * `process.cwd()`) so the sidecar outlives the parent. `detached: true`
108
+ * + `child.unref()` releases the event loop so the Node process can
109
+ * exit independently of the sidecar.
110
+ */
111
+ function startRuntime(binaryPath, port = exports.DEFAULT_PORT, logDir = (0, node_process_1.cwd)()) {
112
+ const logPath = (0, node_path_1.join)(logDir, exports.RUNTIME_LOG_FILENAME);
113
+ const fd = (0, node_fs_1.openSync)(logPath, "a");
114
+ const child = (0, node_child_process_1.spawn)(binaryPath, ["serve", "--port", String(port)], {
115
+ detached: true,
116
+ stdio: ["ignore", fd, fd],
117
+ });
118
+ child.unref();
119
+ return child;
120
+ }
121
+ /**
122
+ * Ensure the local `aasm` sidecar is running, starting it if necessary.
123
+ *
124
+ * Lifecycle per F115 / AAASM-1205:
125
+ * 1. Probe `host:port` via {@link isRunning}; return early if already up.
126
+ * 2. Resolve the binary via {@link findAasmBinary}.
127
+ * 3. Spawn the sidecar via {@link startRuntime}.
128
+ *
129
+ * `agentId` is accepted to keep the ticket-specified signature stable;
130
+ * actual register-and-connect is performed by the existing gateway-aware
131
+ * `@agent-assembly/sdk` `initAssembly` once the sidecar is reachable.
132
+ *
133
+ * Throws `Error` with {@link INSTALL_HINT} when no binary is found.
134
+ */
135
+ async function initAssembly(agentId, port = exports.DEFAULT_PORT) {
136
+ void agentId; // not consumed at the lifecycle layer; see jsdoc
137
+ if (await isRunning(port))
138
+ return;
139
+ const binary = findAasmBinary();
140
+ if (binary === null) {
141
+ throw new Error(exports.INSTALL_HINT);
142
+ }
143
+ startRuntime(binary, port);
144
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // Mirrors the wire-protocol shape of `assembly.audit.v1.AuditEvent` +
3
+ // `assembly.audit.v1.CallStackNode` as of agent-assembly commit
4
+ // `ed4aa11a8c1d1ce1e6f96b08cf2179fd772099b2` (AAASM-1419 / PR #467).
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ENFORCEMENT_MODES = void 0;
4
+ /**
5
+ * Runtime-checkable list of valid {@link EnforcementMode} values, used by
6
+ * `initAssembly` to reject unknown strings from callers who bypass the
7
+ * TypeScript type system (plain JS, JSON config, dynamic input).
8
+ */
9
+ exports.ENFORCEMENT_MODES = ["enforce", "observe", "disabled"];
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ENFORCEMENT_MODES = void 0;
4
+ var enforcement_mode_js_1 = require("./enforcement-mode.js");
5
+ Object.defineProperty(exports, "ENFORCEMENT_MODES", { enumerable: true, get: function () { return enforcement_mode_js_1.ENFORCEMENT_MODES; } });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withAssembly = void 0;
4
+ var with_assembly_js_1 = require("./with-assembly.js");
5
+ Object.defineProperty(exports, "withAssembly", { enumerable: true, get: function () { return with_assembly_js_1.withAssembly; } });
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withAssembly = withAssembly;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const policy_violation_error_js_1 = require("../errors/policy-violation-error.js");
6
+ const DEFAULT_APPROVAL_TIMEOUT_MS = 30_000;
7
+ async function waitForApprovalWithTimeout(gateway, toolName, runId, timeoutMs) {
8
+ let timeoutId;
9
+ const timeoutPromise = new Promise((resolve) => {
10
+ timeoutId = setTimeout(() => {
11
+ resolve({ denied: true, reason: `Approval timeout after ${timeoutMs}ms` });
12
+ }, timeoutMs);
13
+ });
14
+ try {
15
+ const approvalPromise = gateway.waitForApproval(toolName, runId, timeoutMs);
16
+ return await Promise.race([approvalPromise, timeoutPromise]);
17
+ }
18
+ finally {
19
+ if (timeoutId) {
20
+ clearTimeout(timeoutId);
21
+ }
22
+ }
23
+ }
24
+ function hasExecute(tool) {
25
+ return typeof tool.execute === "function";
26
+ }
27
+ function hasInvoke(tool) {
28
+ return typeof tool.invoke === "function";
29
+ }
30
+ function wrapSingleTool(name, tool, gateway, options) {
31
+ const approvalTimeoutMs = options.approvalTimeoutMs ?? DEFAULT_APPROVAL_TIMEOUT_MS;
32
+ if (hasExecute(tool)) {
33
+ const originalExecute = tool.execute;
34
+ tool.execute = async (...args) => {
35
+ const runId = `run_${(0, node_crypto_1.randomUUID)()}`;
36
+ const decision = await gateway.check({
37
+ action: "tool_call",
38
+ toolName: name,
39
+ args,
40
+ runId
41
+ });
42
+ if (decision.denied) {
43
+ throw new policy_violation_error_js_1.PolicyViolationError(`Tool '${name}' blocked: ${decision.reason ?? "Denied"}`);
44
+ }
45
+ if (decision.pending) {
46
+ const finalDecision = await waitForApprovalWithTimeout(gateway, name, runId, approvalTimeoutMs);
47
+ if (finalDecision.denied) {
48
+ throw new policy_violation_error_js_1.PolicyViolationError(`Approval rejected for '${name}': ${finalDecision.reason ?? "Rejected"}`);
49
+ }
50
+ }
51
+ return originalExecute(...args);
52
+ };
53
+ }
54
+ else if (hasInvoke(tool)) {
55
+ const originalInvoke = tool.invoke;
56
+ tool.invoke = async (...args) => {
57
+ const runId = `run_${(0, node_crypto_1.randomUUID)()}`;
58
+ const decision = await gateway.check({
59
+ action: "tool_call",
60
+ toolName: name,
61
+ args,
62
+ runId
63
+ });
64
+ if (decision.denied) {
65
+ throw new policy_violation_error_js_1.PolicyViolationError(`Tool '${name}' blocked: ${decision.reason ?? "Denied"}`);
66
+ }
67
+ if (decision.pending) {
68
+ const finalDecision = await waitForApprovalWithTimeout(gateway, name, runId, approvalTimeoutMs);
69
+ if (finalDecision.denied) {
70
+ throw new policy_violation_error_js_1.PolicyViolationError(`Approval rejected for '${name}': ${finalDecision.reason ?? "Rejected"}`);
71
+ }
72
+ }
73
+ return originalInvoke(...args);
74
+ };
75
+ }
76
+ }
77
+ function withAssembly(tools, options) {
78
+ for (const [name, tool] of Object.entries(tools)) {
79
+ wrapSingleTool(name, tool, options.gatewayClient, options);
80
+ }
81
+ return tools;
82
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-registry.js","sourceRoot":"","sources":["../../../src/adapters/adapter-registry.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,90 @@
1
+ import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
2
+ const BLOCKED_OUTPUT = "[BLOCKED] This action was flagged as a policy violation.";
3
+ function getSerializedName(value) {
4
+ if (!value || typeof value !== "object") {
5
+ return undefined;
6
+ }
7
+ const candidate = value.name;
8
+ return typeof candidate === "string" ? candidate : undefined;
9
+ }
10
+ export class AssemblyCallbackHandler extends BaseCallbackHandler {
11
+ gateway;
12
+ now;
13
+ pendingDenialMaxAgeMs;
14
+ name = "assembly_handler";
15
+ pendingDenials = new Map();
16
+ constructor(gateway, now = () => Date.now(), pendingDenialMaxAgeMs = 5 * 60 * 1000) {
17
+ super();
18
+ this.gateway = gateway;
19
+ this.now = now;
20
+ this.pendingDenialMaxAgeMs = pendingDenialMaxAgeMs;
21
+ }
22
+ async handleToolStart(tool, input, runId) {
23
+ this.cleanupExpiredPendingDenials();
24
+ const toolName = tool.name ?? getSerializedName(tool) ?? "unknown_tool";
25
+ const decision = await this.gateway.check({
26
+ action: "tool_call",
27
+ toolName,
28
+ args: input,
29
+ runId
30
+ });
31
+ await this.gateway.record({
32
+ action: "tool_start_check",
33
+ runId,
34
+ ...(decision.reason ? { reason: decision.reason } : {})
35
+ });
36
+ if (decision.denied) {
37
+ this.pendingDenials.set(runId, {
38
+ reason: decision.reason ?? "Tool denied by policy.",
39
+ at: this.now()
40
+ });
41
+ }
42
+ }
43
+ async handleToolEnd(output, runId) {
44
+ this.cleanupExpiredPendingDenials();
45
+ const pending = this.pendingDenials.get(runId);
46
+ if (pending) {
47
+ this.pendingDenials.delete(runId);
48
+ await this.gateway.record({
49
+ action: "policy_post_block",
50
+ runId,
51
+ reason: pending.reason
52
+ });
53
+ return BLOCKED_OUTPUT;
54
+ }
55
+ await this.gateway.recordResult({ runId, output });
56
+ return output;
57
+ }
58
+ async handleLLMStart(llm, prompts, runId) {
59
+ this.cleanupExpiredPendingDenials();
60
+ const modelName = llm.name ?? getSerializedName(llm);
61
+ await this.gateway.scanPrompts({
62
+ prompts,
63
+ runId,
64
+ ...(modelName ? { modelName } : {})
65
+ });
66
+ }
67
+ async handleLLMEnd(output, runId) {
68
+ this.cleanupExpiredPendingDenials();
69
+ await this.gateway.record({
70
+ action: "llm_response",
71
+ runId,
72
+ output
73
+ });
74
+ }
75
+ cleanupExpiredPendingDenials(now = this.now()) {
76
+ let removed = 0;
77
+ for (const [runId, denial] of this.pendingDenials.entries()) {
78
+ if (now - denial.at >= this.pendingDenialMaxAgeMs) {
79
+ this.pendingDenials.delete(runId);
80
+ removed += 1;
81
+ }
82
+ }
83
+ return removed;
84
+ }
85
+ // Exposed for deterministic unit testing around cleanup behavior.
86
+ getPendingDenialCount() {
87
+ return this.pendingDenials.size;
88
+ }
89
+ }
90
+ //# sourceMappingURL=assembly-callback-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assembly-callback-handler.js","sourceRoot":"","sources":["../../../../src/adapters/langchain/assembly-callback-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { AssemblyCallbackHandler } from "./assembly-callback-handler.js";
2
+ export { getRunId, wrapToolWithAssembly } from "./wrap-tool-with-assembly.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapters/langchain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { PolicyViolationError } from "../../errors/policy-violation-error.js";
3
+ const DEFAULT_APPROVAL_TIMEOUT_MS = 30_000;
4
+ function createRunId() {
5
+ return `run_${randomUUID()}`;
6
+ }
7
+ async function waitForApprovalWithTimeout(gateway, toolName, runId, timeoutMs) {
8
+ let timeoutId;
9
+ const timeoutPromise = new Promise((resolve) => {
10
+ timeoutId = setTimeout(() => {
11
+ resolve({ denied: true, reason: `Approval timeout after ${timeoutMs}ms` });
12
+ }, timeoutMs);
13
+ });
14
+ try {
15
+ const approvalPromise = gateway.waitForApproval(toolName, runId, timeoutMs);
16
+ return await Promise.race([approvalPromise, timeoutPromise]);
17
+ }
18
+ finally {
19
+ if (timeoutId) {
20
+ clearTimeout(timeoutId);
21
+ }
22
+ }
23
+ }
24
+ export function wrapToolWithAssembly(tool, gateway, options = {}) {
25
+ const originalInvoke = tool.invoke.bind(tool);
26
+ const generateRunId = options.generateRunId ?? createRunId;
27
+ const approvalTimeoutMs = options.approvalTimeoutMs ?? DEFAULT_APPROVAL_TIMEOUT_MS;
28
+ tool.invoke = async (input, config) => {
29
+ const runId = getRunId(config, generateRunId);
30
+ const decision = await gateway.check({
31
+ action: "tool_call",
32
+ toolName: tool.name,
33
+ args: input,
34
+ runId
35
+ });
36
+ if (decision.denied) {
37
+ throw new PolicyViolationError(`Tool '${tool.name}' blocked: ${decision.reason ?? "Denied"}`);
38
+ }
39
+ if (decision.pending) {
40
+ const finalDecision = await waitForApprovalWithTimeout(gateway, tool.name, runId, approvalTimeoutMs);
41
+ if (finalDecision.denied) {
42
+ throw new PolicyViolationError(`Approval rejected for '${tool.name}': ${finalDecision.reason ?? "Rejected"}`);
43
+ }
44
+ }
45
+ return originalInvoke(input, config ? { ...config, runId } : { runId });
46
+ };
47
+ return tool;
48
+ }
49
+ export function getRunId(config, generateRunId) {
50
+ return config?.runId ?? generateRunId();
51
+ }
52
+ //# sourceMappingURL=wrap-tool-with-assembly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-tool-with-assembly.js","sourceRoot":"","sources":["../../../../src/adapters/langchain/wrap-tool-with-assembly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAS9E,MAAM,2BAA2B,GAAG,MAAM,CAAC;AAE3C,SAAS,WAAW;IAClB,OAAO,OAAO,UAAU,EAAE,EAAE,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,OAAsB,EACtB,QAAgB,EAChB,KAAa,EACb,SAAiB;IAEjB,IAAI,SAAoD,CAAC;IAEzD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAmC,CAAC,OAAO,EAAE,EAAE;QAC/E,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,0BAA0B,SAAS,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC5E,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC;IAC/D,CAAC;YAAS,CAAC;QACT,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAW,EACX,OAAsB,EACtB,UAAuC,EAAE;IAEzC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,WAAW,CAAC;IAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,2BAA2B,CAAC;IAEnF,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,KAAc,EAAE,MAA2B,EAAE,EAAE;QAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;YACnC,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,IAAI,EAAE,KAAK;YACX,KAAK;SACN,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,oBAAoB,CAAC,SAAS,IAAI,CAAC,IAAI,cAAc,QAAQ,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;QAChG,CAAC;QAED,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,aAAa,GAAG,MAAM,0BAA0B,CACpD,OAAO,EACP,IAAI,CAAC,IAAI,EACT,KAAK,EACL,iBAAiB,CAClB,CAAC;YACF,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;gBACzB,MAAM,IAAI,oBAAoB,CAC5B,0BAA0B,IAAI,CAAC,IAAI,MAAM,aAAa,CAAC,MAAM,IAAI,UAAU,EAAE,CAC9E,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAsC,EAAE,aAA2B;IAC1F,OAAO,MAAM,EAAE,KAAK,IAAI,aAAa,EAAE,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,171 @@
1
+ // JSON wire-format bridge for the `AuditEvent` / `CallStackNode` interfaces
2
+ // declared in `../types/audit.ts`. Mirrors the gateway's snake_case JSON
3
+ // convention (consistent with the existing `sendEvent(handle, eventJSON)`
4
+ // path used by `native/aa-ffi-node`) — see AAASM-1450 for context.
5
+ /**
6
+ * Translate a {@link CallStackNode} into its wire JSON object form.
7
+ *
8
+ * Recurses through `children`. Optional fields (`latencyMs`,
9
+ * `children`) are dropped when undefined or — for `children` — empty,
10
+ * so the resulting object is the minimal payload the gateway accepts.
11
+ */
12
+ export function encodeCallStackNode(node) {
13
+ const wire = {
14
+ id: node.id,
15
+ kind: node.kind,
16
+ label: node.label,
17
+ };
18
+ if (node.latencyMs !== undefined) {
19
+ wire.latency_ms = node.latencyMs;
20
+ }
21
+ if (node.children !== undefined && node.children.length > 0) {
22
+ wire.children = node.children.map(encodeCallStackNode);
23
+ }
24
+ return wire;
25
+ }
26
+ /**
27
+ * Serialize an {@link AuditEvent} to its JSON wire string.
28
+ *
29
+ * Translates the camelCase interface field names into the gateway's
30
+ * snake_case keys (`eventId` → `event_id`, `callStack` → `call_stack`,
31
+ * etc.), recursively encoding the call-stack tree via
32
+ * {@link encodeCallStackNode}. Optional fields whose value is
33
+ * `undefined`, an empty string, or an empty array are omitted so a
34
+ * legacy decoder that has never seen those fields reads the payload
35
+ * unchanged.
36
+ */
37
+ export function encodeAuditEvent(event) {
38
+ const wire = {
39
+ event_id: event.eventId,
40
+ agent_id: event.agentId,
41
+ action_type: event.actionType,
42
+ decision: event.decision,
43
+ };
44
+ if (event.traceId !== undefined && event.traceId !== "") {
45
+ wire.trace_id = event.traceId;
46
+ }
47
+ if (event.spanId !== undefined && event.spanId !== "") {
48
+ wire.span_id = event.spanId;
49
+ }
50
+ if (event.parentSpanId !== undefined && event.parentSpanId !== "") {
51
+ wire.parent_span_id = event.parentSpanId;
52
+ }
53
+ if (event.labels !== undefined && Object.keys(event.labels).length > 0) {
54
+ wire.labels = event.labels;
55
+ }
56
+ if (event.callStack !== undefined && event.callStack.length > 0) {
57
+ wire.call_stack = event.callStack.map(encodeCallStackNode);
58
+ }
59
+ return JSON.stringify(wire);
60
+ }
61
+ function asRecord(value) {
62
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
63
+ throw new TypeError("expected JSON object on the wire");
64
+ }
65
+ return value;
66
+ }
67
+ /**
68
+ * Translate a wire JSON object back into a {@link CallStackNode}.
69
+ *
70
+ * Symmetric inverse of {@link encodeCallStackNode}: walks `children`
71
+ * recursively, restores `latencyMs` from `latency_ms`, and treats a
72
+ * missing or empty `children` field as `undefined` on the interface
73
+ * side (matches AAASM-1436's default).
74
+ */
75
+ export function decodeCallStackNode(payload) {
76
+ const wire = asRecord(payload);
77
+ const id = wire.id;
78
+ const kindRaw = wire.kind;
79
+ const label = wire.label;
80
+ if (typeof id !== "string") {
81
+ throw new TypeError("CallStackNode.id missing or not a string");
82
+ }
83
+ if (typeof kindRaw !== "string") {
84
+ throw new TypeError("CallStackNode.kind missing or not a string");
85
+ }
86
+ if (typeof label !== "string") {
87
+ throw new TypeError("CallStackNode.label missing or not a string");
88
+ }
89
+ const node = {
90
+ id,
91
+ kind: kindRaw,
92
+ label,
93
+ };
94
+ if (typeof wire.latency_ms === "number") {
95
+ node.latencyMs = wire.latency_ms;
96
+ }
97
+ if (Array.isArray(wire.children) && wire.children.length > 0) {
98
+ node.children = wire.children.map(decodeCallStackNode);
99
+ }
100
+ return node;
101
+ }
102
+ function asNonEmptyString(value) {
103
+ return typeof value === "string" && value.length > 0 ? value : undefined;
104
+ }
105
+ function asStringMap(value) {
106
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
107
+ return undefined;
108
+ }
109
+ const entries = Object.entries(value).filter((entry) => typeof entry[1] === "string");
110
+ return entries.length > 0 ? Object.fromEntries(entries) : undefined;
111
+ }
112
+ /**
113
+ * Deserialize a JSON wire payload into a typed {@link AuditEvent}.
114
+ *
115
+ * Accepts either the raw JSON string (the gateway's standard
116
+ * transport) or an already-parsed object (handy for tests and for
117
+ * callers that received a JSON object via another path). Symmetric
118
+ * inverse of {@link encodeAuditEvent}: snake_case keys map back to
119
+ * camelCase fields, and missing / empty optionals decode to
120
+ * `undefined` so an `AuditEvent` produced from a legacy payload (no
121
+ * `call_stack`, empty `trace_id`, …) matches what AAASM-1436's
122
+ * existing consumer-side tests expect.
123
+ */
124
+ export function decodeAuditEvent(payload) {
125
+ const wire = typeof payload === "string"
126
+ ? asRecord(JSON.parse(payload))
127
+ : asRecord(payload);
128
+ const eventId = wire.event_id;
129
+ const agentId = wire.agent_id;
130
+ const actionType = wire.action_type;
131
+ const decision = wire.decision;
132
+ if (typeof eventId !== "string") {
133
+ throw new TypeError("AuditEvent.event_id missing or not a string");
134
+ }
135
+ if (typeof agentId !== "string") {
136
+ throw new TypeError("AuditEvent.agent_id missing or not a string");
137
+ }
138
+ if (typeof actionType !== "string") {
139
+ throw new TypeError("AuditEvent.action_type missing or not a string");
140
+ }
141
+ if (typeof decision !== "string") {
142
+ throw new TypeError("AuditEvent.decision missing or not a string");
143
+ }
144
+ const event = {
145
+ eventId,
146
+ agentId,
147
+ actionType,
148
+ decision,
149
+ };
150
+ const traceId = asNonEmptyString(wire.trace_id);
151
+ if (traceId !== undefined) {
152
+ event.traceId = traceId;
153
+ }
154
+ const spanId = asNonEmptyString(wire.span_id);
155
+ if (spanId !== undefined) {
156
+ event.spanId = spanId;
157
+ }
158
+ const parentSpanId = asNonEmptyString(wire.parent_span_id);
159
+ if (parentSpanId !== undefined) {
160
+ event.parentSpanId = parentSpanId;
161
+ }
162
+ const labels = asStringMap(wire.labels);
163
+ if (labels !== undefined) {
164
+ event.labels = labels;
165
+ }
166
+ if (Array.isArray(wire.call_stack) && wire.call_stack.length > 0) {
167
+ event.callStack = wire.call_stack.map(decodeCallStackNode);
168
+ }
169
+ return event;
170
+ }
171
+ //# sourceMappingURL=encode.js.map