@spinabot/brigade 1.3.2 → 1.4.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 (225) hide show
  1. package/README.md +54 -10
  2. package/convex/config.d.ts +2 -2
  3. package/convex/extensions.d.ts +2 -2
  4. package/convex/logs.d.ts +2 -2
  5. package/convex/memory.d.ts +7 -7
  6. package/convex/messages.d.ts +4 -4
  7. package/convex/schema.d.ts +17 -17
  8. package/convex/subagents.d.ts +12 -12
  9. package/dist/agents/agent-loop.d.ts +1 -0
  10. package/dist/agents/agent-loop.d.ts.map +1 -1
  11. package/dist/agents/agent-loop.js +1 -1
  12. package/dist/agents/agent-loop.js.map +1 -1
  13. package/dist/agents/channels/access-control/format-allow-from.d.ts +50 -0
  14. package/dist/agents/channels/access-control/format-allow-from.d.ts.map +1 -0
  15. package/dist/agents/channels/access-control/format-allow-from.js +64 -0
  16. package/dist/agents/channels/access-control/format-allow-from.js.map +1 -0
  17. package/dist/agents/channels/access-control/index.d.ts +2 -1
  18. package/dist/agents/channels/access-control/index.d.ts.map +1 -1
  19. package/dist/agents/channels/access-control/index.js +2 -1
  20. package/dist/agents/channels/access-control/index.js.map +1 -1
  21. package/dist/agents/channels/access-control/store.d.ts +15 -0
  22. package/dist/agents/channels/access-control/store.d.ts.map +1 -1
  23. package/dist/agents/channels/access-control/store.js +44 -1
  24. package/dist/agents/channels/access-control/store.js.map +1 -1
  25. package/dist/agents/channels/bundled-channel-metas.d.ts +26 -0
  26. package/dist/agents/channels/bundled-channel-metas.d.ts.map +1 -0
  27. package/dist/agents/channels/bundled-channel-metas.js +44 -0
  28. package/dist/agents/channels/bundled-channel-metas.js.map +1 -0
  29. package/dist/agents/channels/channel-messaging-registry.d.ts +130 -0
  30. package/dist/agents/channels/channel-messaging-registry.d.ts.map +1 -0
  31. package/dist/agents/channels/channel-messaging-registry.js +211 -0
  32. package/dist/agents/channels/channel-messaging-registry.js.map +1 -0
  33. package/dist/agents/channels/channel-meta-registry.d.ts +60 -0
  34. package/dist/agents/channels/channel-meta-registry.d.ts.map +1 -0
  35. package/dist/agents/channels/channel-meta-registry.js +128 -0
  36. package/dist/agents/channels/channel-meta-registry.js.map +1 -0
  37. package/dist/agents/channels/channel-security-registry.d.ts +138 -0
  38. package/dist/agents/channels/channel-security-registry.d.ts.map +1 -0
  39. package/dist/agents/channels/channel-security-registry.js +265 -0
  40. package/dist/agents/channels/channel-security-registry.js.map +1 -0
  41. package/dist/agents/channels/exposure.d.ts +44 -0
  42. package/dist/agents/channels/exposure.d.ts.map +1 -0
  43. package/dist/agents/channels/exposure.js +48 -0
  44. package/dist/agents/channels/exposure.js.map +1 -0
  45. package/dist/agents/channels/general-callback.d.ts +25 -0
  46. package/dist/agents/channels/general-callback.d.ts.map +1 -0
  47. package/dist/agents/channels/general-callback.js +31 -0
  48. package/dist/agents/channels/general-callback.js.map +1 -0
  49. package/dist/agents/channels/inbound-pipeline.d.ts +9 -0
  50. package/dist/agents/channels/inbound-pipeline.d.ts.map +1 -1
  51. package/dist/agents/channels/inbound-pipeline.js +429 -39
  52. package/dist/agents/channels/inbound-pipeline.js.map +1 -1
  53. package/dist/agents/channels/markdown-capability.d.ts +44 -0
  54. package/dist/agents/channels/markdown-capability.d.ts.map +1 -0
  55. package/dist/agents/channels/markdown-capability.js +66 -0
  56. package/dist/agents/channels/markdown-capability.js.map +1 -0
  57. package/dist/agents/channels/sdk.d.ts +170 -10
  58. package/dist/agents/channels/sdk.d.ts.map +1 -1
  59. package/dist/agents/channels/sdk.js +138 -6
  60. package/dist/agents/channels/sdk.js.map +1 -1
  61. package/dist/agents/channels/telegram/account-config.d.ts +41 -0
  62. package/dist/agents/channels/telegram/account-config.d.ts.map +1 -1
  63. package/dist/agents/channels/telegram/account-config.js +79 -0
  64. package/dist/agents/channels/telegram/account-config.js.map +1 -1
  65. package/dist/agents/channels/telegram/adapter.d.ts +6 -0
  66. package/dist/agents/channels/telegram/adapter.d.ts.map +1 -1
  67. package/dist/agents/channels/telegram/adapter.js +178 -6
  68. package/dist/agents/channels/telegram/adapter.js.map +1 -1
  69. package/dist/agents/channels/telegram/allowed-updates.d.ts +14 -5
  70. package/dist/agents/channels/telegram/allowed-updates.d.ts.map +1 -1
  71. package/dist/agents/channels/telegram/allowed-updates.js +8 -4
  72. package/dist/agents/channels/telegram/allowed-updates.js.map +1 -1
  73. package/dist/agents/channels/telegram/connection.d.ts +108 -1
  74. package/dist/agents/channels/telegram/connection.d.ts.map +1 -1
  75. package/dist/agents/channels/telegram/connection.js +219 -3
  76. package/dist/agents/channels/telegram/connection.js.map +1 -1
  77. package/dist/agents/channels/telegram/draft-stream.d.ts +98 -0
  78. package/dist/agents/channels/telegram/draft-stream.d.ts.map +1 -0
  79. package/dist/agents/channels/telegram/draft-stream.js +222 -0
  80. package/dist/agents/channels/telegram/draft-stream.js.map +1 -0
  81. package/dist/agents/channels/telegram/inbound-extras.d.ts +10 -1
  82. package/dist/agents/channels/telegram/inbound-extras.d.ts.map +1 -1
  83. package/dist/agents/channels/telegram/inbound-extras.js +66 -0
  84. package/dist/agents/channels/telegram/inbound-extras.js.map +1 -1
  85. package/dist/agents/channels/telegram/inline-keyboard.d.ts +36 -0
  86. package/dist/agents/channels/telegram/inline-keyboard.d.ts.map +1 -0
  87. package/dist/agents/channels/telegram/inline-keyboard.js +62 -0
  88. package/dist/agents/channels/telegram/inline-keyboard.js.map +1 -0
  89. package/dist/agents/channels/telegram/plugin.d.ts.map +1 -1
  90. package/dist/agents/channels/telegram/plugin.js +7 -11
  91. package/dist/agents/channels/telegram/plugin.js.map +1 -1
  92. package/dist/agents/channels/telegram/reasoning-lane.d.ts +41 -0
  93. package/dist/agents/channels/telegram/reasoning-lane.d.ts.map +1 -0
  94. package/dist/agents/channels/telegram/reasoning-lane.js +67 -0
  95. package/dist/agents/channels/telegram/reasoning-lane.js.map +1 -0
  96. package/dist/agents/channels/telegram/socks-dispatcher.d.ts +32 -0
  97. package/dist/agents/channels/telegram/socks-dispatcher.d.ts.map +1 -0
  98. package/dist/agents/channels/telegram/socks-dispatcher.js +97 -0
  99. package/dist/agents/channels/telegram/socks-dispatcher.js.map +1 -0
  100. package/dist/agents/channels/types.adapters.d.ts +137 -4
  101. package/dist/agents/channels/types.adapters.d.ts.map +1 -1
  102. package/dist/agents/channels/types.adapters.js +2 -2
  103. package/dist/agents/channels/types.core.d.ts +26 -2
  104. package/dist/agents/channels/types.core.d.ts.map +1 -1
  105. package/dist/agents/channels/types.plugin.d.ts +25 -7
  106. package/dist/agents/channels/types.plugin.d.ts.map +1 -1
  107. package/dist/agents/channels/types.plugin.js +6 -5
  108. package/dist/agents/channels/types.plugin.js.map +1 -1
  109. package/dist/agents/channels/whatsapp/adapter.d.ts +8 -0
  110. package/dist/agents/channels/whatsapp/adapter.d.ts.map +1 -1
  111. package/dist/agents/channels/whatsapp/adapter.js +7 -4
  112. package/dist/agents/channels/whatsapp/adapter.js.map +1 -1
  113. package/dist/agents/channels/whatsapp/connection.d.ts +24 -2
  114. package/dist/agents/channels/whatsapp/connection.d.ts.map +1 -1
  115. package/dist/agents/channels/whatsapp/connection.js +26 -5
  116. package/dist/agents/channels/whatsapp/connection.js.map +1 -1
  117. package/dist/agents/channels/whatsapp/plugin.d.ts.map +1 -1
  118. package/dist/agents/channels/whatsapp/plugin.js +6 -10
  119. package/dist/agents/channels/whatsapp/plugin.js.map +1 -1
  120. package/dist/agents/extensions/activation-planner.d.ts +125 -0
  121. package/dist/agents/extensions/activation-planner.d.ts.map +1 -0
  122. package/dist/agents/extensions/activation-planner.js +221 -0
  123. package/dist/agents/extensions/activation-planner.js.map +1 -0
  124. package/dist/agents/extensions/diagnose.d.ts +84 -0
  125. package/dist/agents/extensions/diagnose.d.ts.map +1 -0
  126. package/dist/agents/extensions/diagnose.js +123 -0
  127. package/dist/agents/extensions/diagnose.js.map +1 -0
  128. package/dist/agents/extensions/discovery.d.ts +85 -7
  129. package/dist/agents/extensions/discovery.d.ts.map +1 -1
  130. package/dist/agents/extensions/discovery.js +200 -15
  131. package/dist/agents/extensions/discovery.js.map +1 -1
  132. package/dist/agents/extensions/index.d.ts +3 -2
  133. package/dist/agents/extensions/index.d.ts.map +1 -1
  134. package/dist/agents/extensions/index.js +3 -2
  135. package/dist/agents/extensions/index.js.map +1 -1
  136. package/dist/agents/extensions/install-scan.d.ts +63 -0
  137. package/dist/agents/extensions/install-scan.d.ts.map +1 -0
  138. package/dist/agents/extensions/install-scan.js +201 -0
  139. package/dist/agents/extensions/install-scan.js.map +1 -0
  140. package/dist/agents/extensions/install.d.ts +135 -0
  141. package/dist/agents/extensions/install.d.ts.map +1 -0
  142. package/dist/agents/extensions/install.js +414 -0
  143. package/dist/agents/extensions/install.js.map +1 -0
  144. package/dist/agents/extensions/loader.d.ts +13 -2
  145. package/dist/agents/extensions/loader.d.ts.map +1 -1
  146. package/dist/agents/extensions/loader.js +126 -13
  147. package/dist/agents/extensions/loader.js.map +1 -1
  148. package/dist/agents/extensions/registry.d.ts +109 -0
  149. package/dist/agents/extensions/registry.d.ts.map +1 -1
  150. package/dist/agents/extensions/registry.js +172 -0
  151. package/dist/agents/extensions/registry.js.map +1 -1
  152. package/dist/agents/extensions/sdk-alias.d.ts +45 -0
  153. package/dist/agents/extensions/sdk-alias.d.ts.map +1 -0
  154. package/dist/agents/extensions/sdk-alias.js +94 -0
  155. package/dist/agents/extensions/sdk-alias.js.map +1 -0
  156. package/dist/agents/extensions/types.d.ts +155 -1
  157. package/dist/agents/extensions/types.d.ts.map +1 -1
  158. package/dist/agents/extensions/types.js.map +1 -1
  159. package/dist/agents/tools/composio-tool.d.ts +9 -1
  160. package/dist/agents/tools/composio-tool.d.ts.map +1 -1
  161. package/dist/agents/tools/composio-tool.js +68 -4
  162. package/dist/agents/tools/composio-tool.js.map +1 -1
  163. package/dist/agents/tools/message-action-tool.d.ts +6 -1
  164. package/dist/agents/tools/message-action-tool.d.ts.map +1 -1
  165. package/dist/agents/tools/message-action-tool.js +52 -2
  166. package/dist/agents/tools/message-action-tool.js.map +1 -1
  167. package/dist/agents/tools/send-message-tool.d.ts +1 -0
  168. package/dist/agents/tools/send-message-tool.d.ts.map +1 -1
  169. package/dist/agents/tools/send-message-tool.js +56 -1
  170. package/dist/agents/tools/send-message-tool.js.map +1 -1
  171. package/dist/buildstamp.json +1 -1
  172. package/dist/channel-sdk.d.ts +28 -0
  173. package/dist/channel-sdk.d.ts.map +1 -0
  174. package/dist/channel-sdk.js +28 -0
  175. package/dist/channel-sdk.js.map +1 -0
  176. package/dist/cli/commands/channels.d.ts.map +1 -1
  177. package/dist/cli/commands/channels.js +8 -8
  178. package/dist/cli/commands/channels.js.map +1 -1
  179. package/dist/cli/commands/connect.d.ts +8 -11
  180. package/dist/cli/commands/connect.d.ts.map +1 -1
  181. package/dist/cli/commands/connect.js +157 -17
  182. package/dist/cli/commands/connect.js.map +1 -1
  183. package/dist/cli/commands/doctor.d.ts.map +1 -1
  184. package/dist/cli/commands/doctor.js +64 -0
  185. package/dist/cli/commands/doctor.js.map +1 -1
  186. package/dist/cli/commands/extensions.d.ts +46 -0
  187. package/dist/cli/commands/extensions.d.ts.map +1 -0
  188. package/dist/cli/commands/extensions.js +578 -0
  189. package/dist/cli/commands/extensions.js.map +1 -0
  190. package/dist/cli/commands/pairing.d.ts.map +1 -1
  191. package/dist/cli/commands/pairing.js +16 -2
  192. package/dist/cli/commands/pairing.js.map +1 -1
  193. package/dist/cli/commands/update.d.ts +17 -0
  194. package/dist/cli/commands/update.d.ts.map +1 -0
  195. package/dist/cli/commands/update.js +104 -0
  196. package/dist/cli/commands/update.js.map +1 -0
  197. package/dist/cli/program/build-program.d.ts.map +1 -1
  198. package/dist/cli/program/build-program.js +113 -0
  199. package/dist/cli/program/build-program.js.map +1 -1
  200. package/dist/config/paths.d.ts +1 -0
  201. package/dist/config/paths.d.ts.map +1 -1
  202. package/dist/config/paths.js +9 -0
  203. package/dist/config/paths.js.map +1 -1
  204. package/dist/core/server.d.ts.map +1 -1
  205. package/dist/core/server.js +134 -2
  206. package/dist/core/server.js.map +1 -1
  207. package/dist/protocol.d.ts +25 -0
  208. package/dist/protocol.d.ts.map +1 -1
  209. package/dist/protocol.js.map +1 -1
  210. package/dist/system-prompt/assembler.d.ts.map +1 -1
  211. package/dist/system-prompt/assembler.js +17 -0
  212. package/dist/system-prompt/assembler.js.map +1 -1
  213. package/dist/system-prompt/identity-defaults.d.ts +28 -0
  214. package/dist/system-prompt/identity-defaults.d.ts.map +1 -1
  215. package/dist/system-prompt/identity-defaults.js +47 -0
  216. package/dist/system-prompt/identity-defaults.js.map +1 -1
  217. package/dist/ui/editor.d.ts.map +1 -1
  218. package/dist/ui/editor.js +1 -0
  219. package/dist/ui/editor.js.map +1 -1
  220. package/dist/version.d.ts +4 -3
  221. package/dist/version.d.ts.map +1 -1
  222. package/dist/version.js +27 -5
  223. package/dist/version.js.map +1 -1
  224. package/package.json +21 -4
  225. package/scripts/build-done.mjs +11 -2
@@ -2,13 +2,20 @@
2
2
  * User-module discovery.
3
3
  *
4
4
  * Out-of-tree modules dropped into `~/.brigade/extensions/` are discovered and
5
- * dynamic-imported here, alongside the bundled ones. A candidate is either a
6
- * top-level `*.js`/`*.mjs` file or a folder containing `index.js`/`index.mjs`.
7
- * Each must `export default` a `BrigadeModule` (or an array of them); anything
8
- * else is skipped with a warning — a bad user module never aborts boot.
5
+ * imported here, alongside the bundled ones. A candidate is either a top-level
6
+ * `*.js`/`*.mjs`/`*.ts`/`*.mts` file or a folder containing
7
+ * `index.{js,mjs,ts,mts}`. Each must `export default` a `BrigadeModule` (or an
8
+ * array of them); anything else is skipped with a warning — a bad user module
9
+ * never aborts boot. `.d.ts` declaration files are NOT candidates.
9
10
  *
10
- * Authors import the stable `@brigade/extension-sdk` surface (defineModule + the
11
- * capability contracts), so a user module never reaches into Brigade internals.
11
+ * TypeScript-authored modules load directly: imports go through a Jiti instance
12
+ * that transpiles `.ts`/`.mts` on import, so authors don't need a build step.
13
+ *
14
+ * Authors import the stable `brigade/extension-sdk` / `brigade/channel-sdk`
15
+ * surface (defineModule + the capability contracts), so a user module never
16
+ * reaches into Brigade internals. Those specifiers are alias-resolved to
17
+ * Brigade's own built SDK entry points by the Jiti instance (see `sdk-alias.ts`),
18
+ * so the author does NOT install Brigade into the extensions folder.
12
19
  *
13
20
  * POSIX safety gates (non-Windows only): world-writable files are rejected
14
21
  * (mode & 0o002), suspicious ownership (uid != current uid AND != root) is
@@ -16,18 +23,32 @@
16
23
  * rejected. Each rejection logs WHY and skips the candidate; the loader
17
24
  * continues with the rest.
18
25
  */
19
- import { existsSync, readdirSync, realpathSync, statSync } from "node:fs";
26
+ import { existsSync, readFileSync, readdirSync, realpathSync, statSync } from "node:fs";
20
27
  import path from "node:path";
21
- import { pathToFileURL } from "node:url";
22
28
  import { createSubsystemLogger } from "../../logging/subsystem-logger.js";
29
+ import { createExtensionSdkJiti } from "./sdk-alias.js";
23
30
  const log = createSubsystemLogger("extensions/discovery");
24
31
  // A user module whose top-level module init hangs (e.g. a stray top-level
25
32
  // `await`) must not wedge a turn or boot. Cap each import; a slow one is
26
33
  // logged + skipped (the import keeps running detached but we move on).
27
34
  const IMPORT_TIMEOUT_MS = 5_000;
28
- function importWithTimeout(href) {
35
+ // Single Jiti instance shared across every candidate (per process). It carries
36
+ // the SDK alias (`brigade/extension-sdk` / `brigade/channel-sdk` → Brigade's own
37
+ // built entries) and the TypeScript transpile config. Created lazily so the cost
38
+ // is only paid when at least one user module is actually imported.
39
+ let sharedJiti = null;
40
+ function getExtensionJiti() {
41
+ sharedJiti ??= createExtensionSdkJiti(import.meta.url);
42
+ return sharedJiti;
43
+ }
44
+ /**
45
+ * Import a candidate through the shared Jiti instance (applies the SDK alias +
46
+ * TS transpile), racing against `IMPORT_TIMEOUT_MS`. Jiti takes an absolute file
47
+ * path (not a `file://` URL), and resolves `.ts`/`.mts`/`.js` itself.
48
+ */
49
+ function importWithTimeout(absPath) {
29
50
  return Promise.race([
30
- import(href),
51
+ getExtensionJiti().import(absPath),
31
52
  new Promise((_, reject) => {
32
53
  const t = setTimeout(() => reject(new Error(`import timed out after ${IMPORT_TIMEOUT_MS}ms`)), IMPORT_TIMEOUT_MS);
33
54
  t.unref?.();
@@ -45,9 +66,27 @@ function isModule(value) {
45
66
  function isManifest(value) {
46
67
  return !!value && typeof value === "object" && typeof value.id === "string";
47
68
  }
48
- /** Resolve the import entry for a directory candidate (index.js / index.mjs). */
69
+ // Accepted top-level / index entry extensions. `.d.ts` is excluded explicitly
70
+ // in `isCandidateFile` — it is a declaration file, never an importable module.
71
+ const ENTRY_EXTENSIONS = [".js", ".mjs", ".ts", ".mts"];
72
+ // Directory index basenames, in PRECEDENCE order. When a folder ships more than
73
+ // one (e.g. both a precompiled `index.js` and a source `index.ts`), the FIRST
74
+ // match here wins — compiled (`.js`/`.mjs`) is preferred over source
75
+ // (`.ts`/`.mts`) so a built artifact takes precedence over its own source, and
76
+ // the runtime stays deterministic regardless of readdir order.
77
+ const DIR_INDEX_BASENAMES = ["index.js", "index.mjs", "index.ts", "index.mts"];
78
+ /** Is `name` an importable top-level entry file? Accepts the entry extensions
79
+ * but rejects `.d.ts` declaration files. */
80
+ function isCandidateFile(name) {
81
+ if (name.endsWith(".d.ts"))
82
+ return false;
83
+ return ENTRY_EXTENSIONS.some((ext) => name.endsWith(ext));
84
+ }
85
+ /** Resolve the import entry for a directory candidate
86
+ * (index.{js,mjs,ts,mts}). Picks the first present per DIR_INDEX_BASENAMES
87
+ * precedence (compiled before source). */
49
88
  function dirEntry(dir) {
50
- for (const name of ["index.js", "index.mjs"]) {
89
+ for (const name of DIR_INDEX_BASENAMES) {
51
90
  const candidate = path.join(dir, name);
52
91
  try {
53
92
  if (statSync(candidate).isFile())
@@ -134,7 +173,7 @@ function candidateEntries(extensionsDir) {
134
173
  catch {
135
174
  continue;
136
175
  }
137
- if (st.isFile() && (name.endsWith(".js") || name.endsWith(".mjs"))) {
176
+ if (st.isFile() && isCandidateFile(name)) {
138
177
  entries.push(full);
139
178
  }
140
179
  else if (st.isDirectory()) {
@@ -145,6 +184,122 @@ function candidateEntries(extensionsDir) {
145
184
  }
146
185
  return entries;
147
186
  }
187
+ // ── Sidecar manifest (plugin SDK Step 5: manifest-driven lazy activation) ──
188
+ //
189
+ // A user module may ship a `brigade.extension.json` next to its entry so the
190
+ // discovery planner can read activation metadata WITHOUT importing the module
191
+ // body (the whole point of lazy activation — a non-triggered module is never
192
+ // imported, so its top-level never runs). The sidecar lives:
193
+ // - for a folder module: `<dir>/brigade.extension.json` (next to its index);
194
+ // - for a file module: `<basename>.brigade.extension.json` next to the file,
195
+ // with a fall back to a shared `brigade.extension.json` in the same dir.
196
+ // When absent, the loader falls back to importing the module to read its
197
+ // `manifest` field (today's behavior). A malformed / unreadable sidecar is
198
+ // ignored (logged) and treated as absent — it never aborts discovery.
199
+ const SIDECAR_BASENAME = "brigade.extension.json";
200
+ /**
201
+ * Read the sidecar manifest for a candidate entry, WITHOUT importing the module.
202
+ * `source` is the resolved entry path (a file, or a dir's `index.*`). Returns the
203
+ * parsed `BrigadeModuleManifest` when a readable, well-formed sidecar exists;
204
+ * `undefined` otherwise (no sidecar, unreadable, malformed, or wrong shape).
205
+ */
206
+ export function readSidecarManifest(source) {
207
+ const dir = path.dirname(source);
208
+ const base = path.basename(source);
209
+ // Candidate sidecar locations, in precedence order: a file-specific
210
+ // `<name>.brigade.extension.json`, then the dir-shared `brigade.extension.json`.
211
+ const stem = base.replace(/\.(js|mjs|ts|mts)$/i, "");
212
+ const candidates = [
213
+ path.join(dir, `${stem}.${SIDECAR_BASENAME}`),
214
+ path.join(dir, SIDECAR_BASENAME),
215
+ ];
216
+ for (const sidecar of candidates) {
217
+ let raw;
218
+ try {
219
+ if (!statSync(sidecar).isFile())
220
+ continue;
221
+ raw = readFileSync(sidecar, "utf8");
222
+ }
223
+ catch {
224
+ continue; // not present / unreadable — try the next location
225
+ }
226
+ try {
227
+ const parsed = JSON.parse(raw);
228
+ if (isManifest(parsed))
229
+ return parsed;
230
+ log.warn("ignored sidecar manifest — not a valid BrigadeModuleManifest (needs string id)", {
231
+ sidecar,
232
+ });
233
+ }
234
+ catch (err) {
235
+ log.warn("ignored sidecar manifest — JSON parse failed", {
236
+ sidecar,
237
+ error: err instanceof Error ? err.message : String(err),
238
+ });
239
+ }
240
+ // A present-but-bad sidecar at this location stops the search — we don't
241
+ // silently fall through to a dir-shared one when a file-specific sidecar
242
+ // exists but is malformed (that would mask the operator's typo).
243
+ return undefined;
244
+ }
245
+ return undefined;
246
+ }
247
+ /**
248
+ * List discovery candidates under `extensionsDir` with each one's POSIX safety
249
+ * verdict + its sidecar manifest (read WITHOUT importing the module body). This
250
+ * is the lazy-activation entry point: the loader plans activation from the
251
+ * sidecar manifest and only imports the candidates that survive the plan. Never
252
+ * imports anything; never throws (an unreadable sidecar is treated as absent).
253
+ */
254
+ export function listDiscoveryCandidates(extensionsDir) {
255
+ const out = [];
256
+ for (const source of candidateEntries(extensionsDir)) {
257
+ const safetyReason = checkPosixSafety(source, extensionsDir);
258
+ const manifest = safetyReason ? undefined : readSidecarManifest(source);
259
+ out.push({ source, safetyReason, manifest });
260
+ }
261
+ return out;
262
+ }
263
+ /**
264
+ * Import a single candidate the same way `discoverUserModules` does — through the
265
+ * shared SDK-alias + TypeScript Jiti instance, time-boxed — and return the
266
+ * discovered module(s) plus the resolved manifest. Used by the loader's lazy
267
+ * path AFTER the activation planner decides (from a sidecar) that the module
268
+ * should load, OR when the candidate shipped no sidecar so the body must be read
269
+ * to recover its `manifest` field. The POSIX safety gate is the caller's
270
+ * responsibility (mirrors `importCandidateForDiagnosis`). Returns `[]` on
271
+ * import failure (logged), so a bad module never aborts the load.
272
+ *
273
+ * `sidecarManifest` (when provided) takes precedence over a body-carried manifest
274
+ * — the operator's declarative sidecar is authoritative.
275
+ */
276
+ export async function importDiscoveredModules(source, sidecarManifest) {
277
+ const out = [];
278
+ try {
279
+ const imported = (await importWithTimeout(source));
280
+ const exported = imported.default ?? imported.module;
281
+ const candidates = Array.isArray(exported) ? exported : [exported];
282
+ const topLevelManifest = isManifest(imported.manifest) ? imported.manifest : undefined;
283
+ for (const c of candidates) {
284
+ if (isModule(c)) {
285
+ const manifest = sidecarManifest ??
286
+ topLevelManifest ??
287
+ (isManifest(c.manifest) ? c.manifest : undefined);
288
+ out.push({ module: c, origin: "user", source, manifest });
289
+ }
290
+ else {
291
+ log.warn("ignored user extension — no default BrigadeModule export", { source });
292
+ }
293
+ }
294
+ }
295
+ catch (err) {
296
+ log.warn("failed to import user extension — skipping", {
297
+ source,
298
+ error: err instanceof Error ? err.message : String(err),
299
+ });
300
+ }
301
+ return out;
302
+ }
148
303
  // Process-lifetime cache keyed by dir. The per-turn agent path and the gateway
149
304
  // both call discovery; without this they'd readdir+stat (and re-run the import
150
305
  // resolution) on every turn. Node already caches the dynamic imports themselves;
@@ -186,9 +341,39 @@ export function listExtensionSources(extensionsDir) {
186
341
  export function extensionsRootExists(extensionsDir) {
187
342
  return existsSync(extensionsDir);
188
343
  }
189
- /** Drop the discovery cache so the next `discoverUserModules` re-scans (reload). */
344
+ /** Drop the discovery cache so the next `discoverUserModules` re-scans (reload).
345
+ * Also drops the shared Jiti instance so a reloaded module is re-transpiled
346
+ * fresh rather than served from Jiti's own module cache. */
190
347
  export function clearDiscoveryCache() {
191
348
  discoveryCache.clear();
349
+ sharedJiti = null;
350
+ }
351
+ /**
352
+ * Import a single candidate the same way `discoverUserModules` does — through
353
+ * the shared SDK-alias + TypeScript Jiti instance, time-boxed — and report what
354
+ * came back, without recording anything into a registry. This is the engine
355
+ * behind `brigade extensions doctor`'s "did my plugin import + export a module?"
356
+ * diagnosis. Callers run `checkPosixSafety` FIRST; this only runs for a
357
+ * candidate that passed the safety gate.
358
+ */
359
+ export async function importCandidateForDiagnosis(source) {
360
+ try {
361
+ const imported = (await importWithTimeout(source));
362
+ const exported = imported.default ?? imported.module;
363
+ const candidates = Array.isArray(exported) ? exported : [exported];
364
+ const firstModule = candidates.find((c) => isModule(c));
365
+ if (firstModule) {
366
+ return { imported: true, hasValidModule: true, moduleId: firstModule.id };
367
+ }
368
+ return { imported: true, hasValidModule: false };
369
+ }
370
+ catch (err) {
371
+ return {
372
+ imported: false,
373
+ hasValidModule: false,
374
+ error: err instanceof Error ? err.message : String(err),
375
+ };
376
+ }
192
377
  }
193
378
  /**
194
379
  * Discover + import user modules from `extensionsDir`. Returns the loaded
@@ -217,7 +402,7 @@ export async function discoverUserModules(extensionsDir) {
217
402
  continue;
218
403
  }
219
404
  try {
220
- const imported = (await importWithTimeout(pathToFileURL(source).href));
405
+ const imported = (await importWithTimeout(source));
221
406
  const exported = imported.default ?? imported.module;
222
407
  const candidates = Array.isArray(exported) ? exported : [exported];
223
408
  // A module may carry `manifest` either as a top-level named export OR
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/agents/extensions/discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/agents/extensions/discovery.ts"],"names":[],"mappings":"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"}
@@ -8,8 +8,9 @@
8
8
  */
9
9
  export { defineModule } from "./types.js";
10
10
  export type { BrigadeExtensionContext, BrigadeModule, ChannelAdapter, ChannelCommand, ChannelCommandContext, ChannelStartContext, GatewayCaller, GatewayMethodHandler, HttpRoute, HttpRouteHandler, InboundMessage, Integration, MediaGenProvider, Service, ServiceStartContext, SpeechProvider, TranscriptionProvider, } from "./types.js";
11
- export { BrigadeExtensionRegistry, type RegistryContextMeta } from "./registry.js";
12
- export { clearDiscoveryCache, discoverUserModules, type DiscoveredModule } from "./discovery.js";
11
+ export { BrigadeExtensionRegistry, diffCapabilityIds, type PluginCapabilityIds, type PluginRecord, type PluginRecordStatus, type RegistryContextMeta, } from "./registry.js";
12
+ export { clearDiscoveryCache, discoverUserModules, type DiscoveredModule, type DiscoveryCandidate, importDiscoveredModules, listDiscoveryCandidates, readSidecarManifest, } from "./discovery.js";
13
+ export { type ActivationDecision, type ActivationSnapshot, BUILTIN_CHANNEL_COMMAND_NAMES, buildActivationSnapshot, planActivation, } from "./activation-planner.js";
13
14
  export { loadModules, type LoadModulesArgs } from "./loader.js";
14
15
  export { BUNDLED_MODULES } from "./modules/index.js";
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agents/extensions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EACX,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,OAAO,EACP,mBAAmB,EACnB,cAAc,EACd,qBAAqB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,wBAAwB,EAAE,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agents/extensions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EACX,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,OAAO,EACP,mBAAmB,EACnB,cAAc,EACd,qBAAqB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,wBAAwB,EACxB,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,6BAA6B,EAC7B,uBAAuB,EACvB,cAAc,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
@@ -7,8 +7,9 @@
7
7
  * memory note `project_brigade_extensibility_plan`.
8
8
  */
9
9
  export { defineModule } from "./types.js";
10
- export { BrigadeExtensionRegistry } from "./registry.js";
11
- export { clearDiscoveryCache, discoverUserModules } from "./discovery.js";
10
+ export { BrigadeExtensionRegistry, diffCapabilityIds, } from "./registry.js";
11
+ export { clearDiscoveryCache, discoverUserModules, importDiscoveredModules, listDiscoveryCandidates, readSidecarManifest, } from "./discovery.js";
12
+ export { BUILTIN_CHANNEL_COMMAND_NAMES, buildActivationSnapshot, planActivation, } from "./activation-planner.js";
12
13
  export { loadModules } from "./loader.js";
13
14
  export { BUNDLED_MODULES } from "./modules/index.js";
14
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agents/extensions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAoB1C,OAAO,EAAE,wBAAwB,EAA4B,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAyB,MAAM,gBAAgB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAwB,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agents/extensions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAoB1C,OAAO,EACN,wBAAwB,EACxB,iBAAiB,GAKjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,mBAAmB,EACnB,mBAAmB,EAGnB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAGN,6BAA6B,EAC7B,uBAAuB,EACvB,cAAc,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAwB,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Install-time security scan — a static, read-only pattern sweep over an
3
+ * installed extension's source so the operator sees what a freshly-added
4
+ * module CAN reach BEFORE it ever runs.
5
+ *
6
+ * This is a transparency surface, NOT a sandbox. Every construct it flags is
7
+ * dual-use: a channel adapter legitimately opens network sockets, a tool
8
+ * legitimately spawns a subprocess, a memory backend legitimately writes files.
9
+ * So the scan SURFACES findings as a warning the operator acknowledges — it
10
+ * never hard-blocks an install. The point is informed consent: "this plugin
11
+ * runs shell commands and reads your environment — proceed?".
12
+ *
13
+ * The scan is deliberately simple (line-regex over source text, no AST / no
14
+ * execution): it must run fast on an untrusted tree without importing or
15
+ * evaluating any of it. False positives are acceptable; the operator reads the
16
+ * snippet and decides. It walks only the source-text files of the module
17
+ * (skipping node_modules, lockfiles, binaries, and oversized files) so the
18
+ * report stays focused on the author's own code.
19
+ */
20
+ /** How alarming a finding is. `high` = direct code-exec or shell reach. */
21
+ export type ScanSeverity = "high" | "medium" | "low";
22
+ /** One matched risky construct in the installed source. */
23
+ export interface ScanFinding {
24
+ /** Stable rule id (e.g. `dynamic-eval`). */
25
+ rule: string;
26
+ severity: ScanSeverity;
27
+ /** One plain-language line: what this construct can do. */
28
+ note: string;
29
+ /** Source file the match was found in (relative to the scanned root). */
30
+ file: string;
31
+ /** 1-based line number of the match. */
32
+ line: number;
33
+ /** The matched line, trimmed + length-capped, for the operator to eyeball. */
34
+ snippet: string;
35
+ }
36
+ /** Aggregate result of a scan pass. */
37
+ export interface ScanReport {
38
+ /** Every finding, in file + line order. */
39
+ findings: ScanFinding[];
40
+ /** Count of source files actually scanned (after skip rules). */
41
+ filesScanned: number;
42
+ /** Tallies by severity, for the one-line summary. */
43
+ counts: {
44
+ high: number;
45
+ medium: number;
46
+ low: number;
47
+ };
48
+ }
49
+ /**
50
+ * Scan a single block of source TEXT (already read) for risky constructs. Split
51
+ * out so tests can feed sample source directly without touching disk. `fileLabel`
52
+ * is what each finding records as its `file`.
53
+ */
54
+ export declare function scanSourceText(source: string, fileLabel: string): ScanFinding[];
55
+ /**
56
+ * Statically scan an installed module directory for dual-use constructs. Reads
57
+ * source files only (no import / no execution). Never throws — an unreadable
58
+ * file is skipped. Findings are sorted by file then line for a stable report.
59
+ */
60
+ export declare function scanInstalledModule(moduleDir: string): ScanReport;
61
+ /** One-line human summary of a scan report (e.g. "2 high, 1 medium"). */
62
+ export declare function summarizeScan(report: ScanReport): string;
63
+ //# sourceMappingURL=install-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-scan.d.ts","sourceRoot":"","sources":["../../../src/agents/extensions/install-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,2EAA2E;AAC3E,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAErD,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC3B,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,CAAC;IACvB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,uCAAuC;AACvC,MAAM,WAAW,UAAU;IAC1B,2CAA2C;IAC3C,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD;AA0HD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE,CAwB/E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAmBjE;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAQxD"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Install-time security scan — a static, read-only pattern sweep over an
3
+ * installed extension's source so the operator sees what a freshly-added
4
+ * module CAN reach BEFORE it ever runs.
5
+ *
6
+ * This is a transparency surface, NOT a sandbox. Every construct it flags is
7
+ * dual-use: a channel adapter legitimately opens network sockets, a tool
8
+ * legitimately spawns a subprocess, a memory backend legitimately writes files.
9
+ * So the scan SURFACES findings as a warning the operator acknowledges — it
10
+ * never hard-blocks an install. The point is informed consent: "this plugin
11
+ * runs shell commands and reads your environment — proceed?".
12
+ *
13
+ * The scan is deliberately simple (line-regex over source text, no AST / no
14
+ * execution): it must run fast on an untrusted tree without importing or
15
+ * evaluating any of it. False positives are acceptable; the operator reads the
16
+ * snippet and decides. It walks only the source-text files of the module
17
+ * (skipping node_modules, lockfiles, binaries, and oversized files) so the
18
+ * report stays focused on the author's own code.
19
+ */
20
+ import { readFileSync, readdirSync, statSync } from "node:fs";
21
+ import path from "node:path";
22
+ // The rule set. Each entry is intentionally broad — a hit means "this construct
23
+ // is present", which the operator interprets. Ordered high → low so the most
24
+ // important rules read first in the source.
25
+ const RULES = [
26
+ {
27
+ rule: "dynamic-eval",
28
+ severity: "high",
29
+ note: "evaluates code from a string at runtime (eval)",
30
+ pattern: /\beval\s*\(/,
31
+ },
32
+ {
33
+ rule: "function-constructor",
34
+ severity: "high",
35
+ note: "builds and runs code via the Function constructor",
36
+ pattern: /\bnew\s+Function\s*\(/,
37
+ },
38
+ {
39
+ rule: "child-process",
40
+ severity: "high",
41
+ note: "runs other programs / shell commands (child_process)",
42
+ pattern: /\bchild_process\b|\bnode:child_process\b/,
43
+ },
44
+ {
45
+ rule: "process-spawn",
46
+ severity: "high",
47
+ note: "spawns or executes a subprocess (spawn / exec / execSync / fork)",
48
+ pattern: /\b(?:exec|execSync|execFile|execFileSync|spawn|spawnSync|fork)\s*\(/,
49
+ },
50
+ {
51
+ rule: "network-client",
52
+ severity: "medium",
53
+ note: "opens outbound network connections (net / tls / dgram sockets)",
54
+ pattern: /\b(?:node:)?(?:net|tls|dgram)\b|\.(?:createConnection|connect)\s*\(/,
55
+ },
56
+ {
57
+ rule: "http-client",
58
+ severity: "medium",
59
+ note: "makes HTTP(S) requests (fetch / http / https / axios / got)",
60
+ pattern: /\b(?:node:)?https?\b|\bfetch\s*\(|\baxios\b|\bgot\s*\(|\bundici\b|\bXMLHttpRequest\b/,
61
+ },
62
+ {
63
+ rule: "filesystem-write",
64
+ severity: "medium",
65
+ note: "writes or deletes files on disk (fs write / unlink / rm)",
66
+ pattern: /\b(?:writeFile|writeFileSync|appendFile|appendFileSync|createWriteStream|unlink|unlinkSync|rm|rmSync|rmdir|rmdirSync|mkdir|mkdirSync)\s*\(/,
67
+ },
68
+ {
69
+ rule: "env-enumeration",
70
+ severity: "low",
71
+ note: "reads the full process environment (process.env enumeration)",
72
+ pattern: /process\.env\b\s*(?:\)|,|\]|\}|;|$)|Object\.(?:keys|entries|values|assign)\s*\(\s*process\.env\b|\{\s*\.\.\.\s*process\.env\b/,
73
+ },
74
+ ];
75
+ // Files whose CONTENT we scan — author source, not data/binaries/deps.
76
+ const SCANNED_EXTENSIONS = new Set([".js", ".mjs", ".cjs", ".ts", ".mts", ".cts", ".jsx", ".tsx"]);
77
+ // Directories we never descend into: vendored deps + VCS metadata. A plugin's
78
+ // own code is what the operator is consenting to; its dependencies are out of
79
+ // scope for this lightweight surface (and would drown the report).
80
+ const SKIP_DIRS = new Set(["node_modules", ".git", ".hg", ".svn", "dist", "build", ".cache"]);
81
+ // Hard caps so a pathological tree can't wedge the scan.
82
+ const MAX_FILE_BYTES = 512 * 1024; // skip files larger than 512 KiB
83
+ const MAX_FILES = 2_000; // stop after this many source files
84
+ const SNIPPET_MAX = 160; // trim each surfaced snippet to this many chars
85
+ /** Recursively collect scannable source files under `root` (bounded). */
86
+ function collectSourceFiles(root) {
87
+ const out = [];
88
+ const stack = [root];
89
+ while (stack.length > 0 && out.length < MAX_FILES) {
90
+ const dir = stack.pop();
91
+ let names;
92
+ try {
93
+ names = readdirSync(dir);
94
+ }
95
+ catch {
96
+ continue;
97
+ }
98
+ for (const name of names) {
99
+ if (out.length >= MAX_FILES)
100
+ break;
101
+ if (SKIP_DIRS.has(name))
102
+ continue;
103
+ const full = path.join(dir, name);
104
+ let st;
105
+ try {
106
+ st = statSync(full);
107
+ }
108
+ catch {
109
+ continue;
110
+ }
111
+ if (st.isDirectory()) {
112
+ stack.push(full);
113
+ }
114
+ else if (st.isFile()) {
115
+ const ext = path.extname(name).toLowerCase();
116
+ if (SCANNED_EXTENSIONS.has(ext) && st.size <= MAX_FILE_BYTES) {
117
+ out.push(full);
118
+ }
119
+ }
120
+ }
121
+ }
122
+ return out;
123
+ }
124
+ /** Trim + length-cap a source line for safe display. */
125
+ function makeSnippet(rawLine) {
126
+ const trimmed = rawLine.trim();
127
+ return trimmed.length > SNIPPET_MAX ? `${trimmed.slice(0, SNIPPET_MAX)}…` : trimmed;
128
+ }
129
+ /**
130
+ * Scan a single block of source TEXT (already read) for risky constructs. Split
131
+ * out so tests can feed sample source directly without touching disk. `fileLabel`
132
+ * is what each finding records as its `file`.
133
+ */
134
+ export function scanSourceText(source, fileLabel) {
135
+ const findings = [];
136
+ const lines = source.split(/\r?\n/);
137
+ for (let i = 0; i < lines.length; i++) {
138
+ const line = lines[i] ?? "";
139
+ // Cheap skip of obvious whole-line comments — cuts the most common false
140
+ // positives (a rule name mentioned in a doc comment). This is best-effort;
141
+ // the operator still reviews each snippet.
142
+ const lead = line.trimStart();
143
+ if (lead.startsWith("//") || lead.startsWith("*"))
144
+ continue;
145
+ for (const r of RULES) {
146
+ if (r.pattern.test(line)) {
147
+ findings.push({
148
+ rule: r.rule,
149
+ severity: r.severity,
150
+ note: r.note,
151
+ file: fileLabel,
152
+ line: i + 1,
153
+ snippet: makeSnippet(line),
154
+ });
155
+ }
156
+ }
157
+ }
158
+ return findings;
159
+ }
160
+ /**
161
+ * Statically scan an installed module directory for dual-use constructs. Reads
162
+ * source files only (no import / no execution). Never throws — an unreadable
163
+ * file is skipped. Findings are sorted by file then line for a stable report.
164
+ */
165
+ export function scanInstalledModule(moduleDir) {
166
+ const files = collectSourceFiles(moduleDir);
167
+ const findings = [];
168
+ let filesScanned = 0;
169
+ for (const file of files) {
170
+ let text;
171
+ try {
172
+ text = readFileSync(file, "utf8");
173
+ }
174
+ catch {
175
+ continue;
176
+ }
177
+ filesScanned++;
178
+ const rel = path.relative(moduleDir, file) || path.basename(file);
179
+ findings.push(...scanSourceText(text, rel.replace(/\\/g, "/")));
180
+ }
181
+ findings.sort((a, b) => (a.file === b.file ? a.line - b.line : a.file.localeCompare(b.file)));
182
+ const counts = { high: 0, medium: 0, low: 0 };
183
+ for (const f of findings)
184
+ counts[f.severity]++;
185
+ return { findings, filesScanned, counts };
186
+ }
187
+ /** One-line human summary of a scan report (e.g. "2 high, 1 medium"). */
188
+ export function summarizeScan(report) {
189
+ const { high, medium, low } = report.counts;
190
+ if (high + medium + low === 0)
191
+ return "no risky constructs found";
192
+ const parts = [];
193
+ if (high)
194
+ parts.push(`${high} high`);
195
+ if (medium)
196
+ parts.push(`${medium} medium`);
197
+ if (low)
198
+ parts.push(`${low} low`);
199
+ return parts.join(", ");
200
+ }
201
+ //# sourceMappingURL=install-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-scan.js","sourceRoot":"","sources":["../../../src/agents/extensions/install-scan.ts"],"names":[],"mappings":"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"}