@namzu/cli 23.0.0 → 25.0.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 (243) hide show
  1. package/CHANGELOG.md +845 -0
  2. package/README.md +13 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +18 -10
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/drain.d.ts +0 -23
  7. package/dist/commands/drain.d.ts.map +1 -1
  8. package/dist/commands/drain.js +23 -9
  9. package/dist/commands/drain.js.map +1 -1
  10. package/dist/commands/resident-flags.d.ts +24 -0
  11. package/dist/commands/resident-flags.d.ts.map +1 -0
  12. package/dist/commands/resident-flags.js +191 -0
  13. package/dist/commands/resident-flags.js.map +1 -0
  14. package/dist/commands/resident-learning.d.ts +6 -0
  15. package/dist/commands/resident-learning.d.ts.map +1 -0
  16. package/dist/commands/resident-learning.js +293 -0
  17. package/dist/commands/resident-learning.js.map +1 -0
  18. package/dist/commands/resident.d.ts +20 -0
  19. package/dist/commands/resident.d.ts.map +1 -0
  20. package/dist/commands/resident.js +418 -0
  21. package/dist/commands/resident.js.map +1 -0
  22. package/dist/commands/run-flags.d.ts +2 -2
  23. package/dist/commands/run-flags.d.ts.map +1 -1
  24. package/dist/commands/run-flags.js +6 -6
  25. package/dist/commands/run-flags.js.map +1 -1
  26. package/dist/commands/run-stream.d.ts.map +1 -1
  27. package/dist/commands/run-stream.js +9 -10
  28. package/dist/commands/run-stream.js.map +1 -1
  29. package/dist/commands/run.d.ts.map +1 -1
  30. package/dist/commands/run.js +3 -2
  31. package/dist/commands/run.js.map +1 -1
  32. package/dist/commands/upgrade.d.ts +1 -0
  33. package/dist/commands/upgrade.d.ts.map +1 -1
  34. package/dist/commands/upgrade.js +6 -3
  35. package/dist/commands/upgrade.js.map +1 -1
  36. package/dist/config/load.d.ts.map +1 -1
  37. package/dist/config/load.js +27 -4
  38. package/dist/config/load.js.map +1 -1
  39. package/dist/config/run-limits.d.ts +11 -0
  40. package/dist/config/run-limits.d.ts.map +1 -0
  41. package/dist/config/run-limits.js +64 -0
  42. package/dist/config/run-limits.js.map +1 -0
  43. package/dist/config/schema.d.ts +12 -4
  44. package/dist/config/schema.d.ts.map +1 -1
  45. package/dist/config/schema.js.map +1 -1
  46. package/dist/context/runtime-message.d.ts.map +1 -1
  47. package/dist/context/runtime-message.js +2 -0
  48. package/dist/context/runtime-message.js.map +1 -1
  49. package/dist/integrations/npm-invocation.d.ts +10 -0
  50. package/dist/integrations/npm-invocation.d.ts.map +1 -0
  51. package/dist/integrations/npm-invocation.js +23 -0
  52. package/dist/integrations/npm-invocation.js.map +1 -0
  53. package/dist/integrations/plugins/runtime.d.ts +19 -1
  54. package/dist/integrations/plugins/runtime.d.ts.map +1 -1
  55. package/dist/integrations/plugins/runtime.js +89 -1
  56. package/dist/integrations/plugins/runtime.js.map +1 -1
  57. package/dist/integrations/plugins/settings.d.ts +15 -0
  58. package/dist/integrations/plugins/settings.d.ts.map +1 -0
  59. package/dist/integrations/plugins/settings.js +106 -0
  60. package/dist/integrations/plugins/settings.js.map +1 -0
  61. package/dist/integrations/providers/credential-store.d.ts +8 -7
  62. package/dist/integrations/providers/credential-store.d.ts.map +1 -1
  63. package/dist/integrations/providers/credential-store.js +44 -17
  64. package/dist/integrations/providers/credential-store.js.map +1 -1
  65. package/dist/integrations/providers/discover.d.ts.map +1 -1
  66. package/dist/integrations/providers/discover.js +7 -2
  67. package/dist/integrations/providers/discover.js.map +1 -1
  68. package/dist/integrations/providers/harness-credentials.d.ts +2 -2
  69. package/dist/integrations/providers/harness-credentials.d.ts.map +1 -1
  70. package/dist/integrations/providers/harness-credentials.js +13 -8
  71. package/dist/integrations/providers/harness-credentials.js.map +1 -1
  72. package/dist/integrations/providers/setup.d.ts.map +1 -1
  73. package/dist/integrations/providers/setup.js +52 -5
  74. package/dist/integrations/providers/setup.js.map +1 -1
  75. package/dist/integrations/resident/foreground.d.ts +19 -0
  76. package/dist/integrations/resident/foreground.d.ts.map +1 -0
  77. package/dist/integrations/resident/foreground.js +95 -0
  78. package/dist/integrations/resident/foreground.js.map +1 -0
  79. package/dist/integrations/resident/inspection.d.ts +10 -0
  80. package/dist/integrations/resident/inspection.d.ts.map +1 -0
  81. package/dist/integrations/resident/inspection.js +263 -0
  82. package/dist/integrations/resident/inspection.js.map +1 -0
  83. package/dist/integrations/resident/learning-sources.d.ts +4 -0
  84. package/dist/integrations/resident/learning-sources.d.ts.map +1 -0
  85. package/dist/integrations/resident/learning-sources.js +79 -0
  86. package/dist/integrations/resident/learning-sources.js.map +1 -0
  87. package/dist/integrations/resident/learning-storage.d.ts +5 -0
  88. package/dist/integrations/resident/learning-storage.d.ts.map +1 -0
  89. package/dist/integrations/resident/learning-storage.js +51 -0
  90. package/dist/integrations/resident/learning-storage.js.map +1 -0
  91. package/dist/integrations/resident/lifecycle-errors.d.ts +9 -0
  92. package/dist/integrations/resident/lifecycle-errors.d.ts.map +1 -0
  93. package/dist/integrations/resident/lifecycle-errors.js +15 -0
  94. package/dist/integrations/resident/lifecycle-errors.js.map +1 -0
  95. package/dist/integrations/resident/owned-runner.d.ts +17 -0
  96. package/dist/integrations/resident/owned-runner.d.ts.map +1 -0
  97. package/dist/integrations/resident/owned-runner.js +91 -0
  98. package/dist/integrations/resident/owned-runner.js.map +1 -0
  99. package/dist/integrations/resident/runner-control.d.ts +47 -0
  100. package/dist/integrations/resident/runner-control.d.ts.map +1 -0
  101. package/dist/integrations/resident/runner-control.js +238 -0
  102. package/dist/integrations/resident/runner-control.js.map +1 -0
  103. package/dist/integrations/resident/runner-launch.d.ts +52 -0
  104. package/dist/integrations/resident/runner-launch.d.ts.map +1 -0
  105. package/dist/integrations/resident/runner-launch.js +142 -0
  106. package/dist/integrations/resident/runner-launch.js.map +1 -0
  107. package/dist/integrations/resident/runner-store.d.ts +44 -0
  108. package/dist/integrations/resident/runner-store.d.ts.map +1 -0
  109. package/dist/integrations/resident/runner-store.js +281 -0
  110. package/dist/integrations/resident/runner-store.js.map +1 -0
  111. package/dist/integrations/resident/runner-worker.d.ts +2 -0
  112. package/dist/integrations/resident/runner-worker.d.ts.map +1 -0
  113. package/dist/integrations/resident/runner-worker.js +146 -0
  114. package/dist/integrations/resident/runner-worker.js.map +1 -0
  115. package/dist/integrations/resident/session-step.d.ts +29 -0
  116. package/dist/integrations/resident/session-step.d.ts.map +1 -0
  117. package/dist/integrations/resident/session-step.js +462 -0
  118. package/dist/integrations/resident/session-step.js.map +1 -0
  119. package/dist/integrations/resident/storage.d.ts +17 -0
  120. package/dist/integrations/resident/storage.d.ts.map +1 -0
  121. package/dist/integrations/resident/storage.js +140 -0
  122. package/dist/integrations/resident/storage.js.map +1 -0
  123. package/dist/integrations/resident/tool-evidence.d.ts +6 -0
  124. package/dist/integrations/resident/tool-evidence.d.ts.map +1 -0
  125. package/dist/integrations/resident/tool-evidence.js +117 -0
  126. package/dist/integrations/resident/tool-evidence.js.map +1 -0
  127. package/dist/integrations/resident/verification.d.ts +11 -0
  128. package/dist/integrations/resident/verification.d.ts.map +1 -0
  129. package/dist/integrations/resident/verification.js +109 -0
  130. package/dist/integrations/resident/verification.js.map +1 -0
  131. package/dist/integrations/sessions/compaction-evidence.d.ts +5 -0
  132. package/dist/integrations/sessions/compaction-evidence.d.ts.map +1 -0
  133. package/dist/integrations/sessions/compaction-evidence.js +59 -0
  134. package/dist/integrations/sessions/compaction-evidence.js.map +1 -0
  135. package/dist/integrations/sessions/context-inventory.js +1 -1
  136. package/dist/integrations/sessions/context-inventory.js.map +1 -1
  137. package/dist/integrations/sessions/conversation-search.d.ts +56 -8
  138. package/dist/integrations/sessions/conversation-search.d.ts.map +1 -1
  139. package/dist/integrations/sessions/conversation-search.js +600 -63
  140. package/dist/integrations/sessions/conversation-search.js.map +1 -1
  141. package/dist/integrations/sessions/database.d.ts +5 -0
  142. package/dist/integrations/sessions/database.d.ts.map +1 -0
  143. package/dist/integrations/sessions/database.js +34 -0
  144. package/dist/integrations/sessions/database.js.map +1 -0
  145. package/dist/integrations/sessions/evidence-page-validation.d.ts +8 -0
  146. package/dist/integrations/sessions/evidence-page-validation.d.ts.map +1 -0
  147. package/dist/integrations/sessions/evidence-page-validation.js +74 -0
  148. package/dist/integrations/sessions/evidence-page-validation.js.map +1 -0
  149. package/dist/integrations/sessions/evidence-recall.d.ts +5 -0
  150. package/dist/integrations/sessions/evidence-recall.d.ts.map +1 -0
  151. package/dist/integrations/sessions/evidence-recall.js +173 -0
  152. package/dist/integrations/sessions/evidence-recall.js.map +1 -0
  153. package/dist/integrations/sessions/paths.d.ts +7 -0
  154. package/dist/integrations/sessions/paths.d.ts.map +1 -0
  155. package/dist/integrations/sessions/paths.js +14 -0
  156. package/dist/integrations/sessions/paths.js.map +1 -0
  157. package/dist/integrations/sessions/run-discovery.d.ts +24 -0
  158. package/dist/integrations/sessions/run-discovery.d.ts.map +1 -0
  159. package/dist/integrations/sessions/run-discovery.js +142 -0
  160. package/dist/integrations/sessions/run-discovery.js.map +1 -0
  161. package/dist/integrations/sessions/store.d.ts +8 -18
  162. package/dist/integrations/sessions/store.d.ts.map +1 -1
  163. package/dist/integrations/sessions/store.js +14 -39
  164. package/dist/integrations/sessions/store.js.map +1 -1
  165. package/dist/integrations/sessions/transcript-export.d.ts +0 -1
  166. package/dist/integrations/sessions/transcript-export.d.ts.map +1 -1
  167. package/dist/integrations/sessions/transcript-export.js +3 -2
  168. package/dist/integrations/sessions/transcript-export.js.map +1 -1
  169. package/dist/integrations/sessions/turn-evidence.d.ts +0 -9
  170. package/dist/integrations/sessions/turn-evidence.d.ts.map +1 -1
  171. package/dist/integrations/sessions/turn-evidence.js +5 -2
  172. package/dist/integrations/sessions/turn-evidence.js.map +1 -1
  173. package/dist/integrations/state/private-directory.d.ts +4 -2
  174. package/dist/integrations/state/private-directory.d.ts.map +1 -1
  175. package/dist/integrations/state/private-directory.js +6 -4
  176. package/dist/integrations/state/private-directory.js.map +1 -1
  177. package/dist/integrations/state/report.d.ts.map +1 -1
  178. package/dist/integrations/state/report.js +78 -21
  179. package/dist/integrations/state/report.js.map +1 -1
  180. package/dist/integrations/subagents/parent.d.ts +3 -2
  181. package/dist/integrations/subagents/parent.d.ts.map +1 -1
  182. package/dist/integrations/subagents/parent.js +11 -6
  183. package/dist/integrations/subagents/parent.js.map +1 -1
  184. package/dist/integrations/subagents/policy.d.ts +2 -5
  185. package/dist/integrations/subagents/policy.d.ts.map +1 -1
  186. package/dist/integrations/subagents/policy.js +2 -5
  187. package/dist/integrations/subagents/policy.js.map +1 -1
  188. package/dist/integrations/subagents/runtime.d.ts +7 -0
  189. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  190. package/dist/integrations/subagents/runtime.js +9 -7
  191. package/dist/integrations/subagents/runtime.js.map +1 -1
  192. package/dist/permissions/rules.d.ts +2 -8
  193. package/dist/permissions/rules.d.ts.map +1 -1
  194. package/dist/permissions/rules.js +19 -10
  195. package/dist/permissions/rules.js.map +1 -1
  196. package/dist/tui/App.d.ts +0 -12
  197. package/dist/tui/App.d.ts.map +1 -1
  198. package/dist/tui/App.js +235 -15
  199. package/dist/tui/App.js.map +1 -1
  200. package/dist/tui/ChoicePicker.d.ts +2 -1
  201. package/dist/tui/ChoicePicker.d.ts.map +1 -1
  202. package/dist/tui/ChoicePicker.js +10 -8
  203. package/dist/tui/ChoicePicker.js.map +1 -1
  204. package/dist/tui/ToolOutputViewer.js +1 -1
  205. package/dist/tui/ToolOutputViewer.js.map +1 -1
  206. package/dist/tui/agent.d.ts +29 -3
  207. package/dist/tui/agent.d.ts.map +1 -1
  208. package/dist/tui/agent.js +233 -46
  209. package/dist/tui/agent.js.map +1 -1
  210. package/dist/tui/conversation-evidence-view.d.ts +6 -0
  211. package/dist/tui/conversation-evidence-view.d.ts.map +1 -0
  212. package/dist/tui/conversation-evidence-view.js +96 -0
  213. package/dist/tui/conversation-evidence-view.js.map +1 -0
  214. package/dist/tui/conversation-history.d.ts +3 -1
  215. package/dist/tui/conversation-history.d.ts.map +1 -1
  216. package/dist/tui/conversation-history.js +16 -1
  217. package/dist/tui/conversation-history.js.map +1 -1
  218. package/dist/tui/exit-summary.d.ts +1 -1
  219. package/dist/tui/exit-summary.d.ts.map +1 -1
  220. package/dist/tui/exit-summary.js +17 -5
  221. package/dist/tui/exit-summary.js.map +1 -1
  222. package/dist/tui/markdownParser.d.ts.map +1 -1
  223. package/dist/tui/markdownParser.js +2 -1
  224. package/dist/tui/markdownParser.js.map +1 -1
  225. package/dist/tui/plugin-view.d.ts +9 -0
  226. package/dist/tui/plugin-view.d.ts.map +1 -0
  227. package/dist/tui/plugin-view.js +59 -0
  228. package/dist/tui/plugin-view.js.map +1 -0
  229. package/dist/tui/run-interruption.d.ts +2 -2
  230. package/dist/tui/run-interruption.d.ts.map +1 -1
  231. package/dist/tui/run-interruption.js +5 -1
  232. package/dist/tui/run-interruption.js.map +1 -1
  233. package/dist/tui/run-limits-settings.d.ts +39 -0
  234. package/dist/tui/run-limits-settings.d.ts.map +1 -0
  235. package/dist/tui/run-limits-settings.js +88 -0
  236. package/dist/tui/run-limits-settings.js.map +1 -0
  237. package/dist/tui/slashCommands.d.ts +6 -1
  238. package/dist/tui/slashCommands.d.ts.map +1 -1
  239. package/dist/tui/slashCommands.js +40 -9
  240. package/dist/tui/slashCommands.js.map +1 -1
  241. package/dist/tui/types.d.ts +4 -2
  242. package/dist/tui/types.d.ts.map +1 -1
  243. package/package.json +6 -6
@@ -48,10 +48,12 @@ export type HookEntry = ShellHookEntry;
48
48
  export type HooksConfig = ShellHooksConfig;
49
49
  /** See `NamzuCliConfig.limits`. */
50
50
  export interface RunLimitsConfig {
51
- /** Model calls one run may make. Default 50. */
51
+ /** Main-loop iterations one run may make. Omitted or 0 means unlimited. */
52
52
  readonly maxIterations?: number;
53
- /** Aggregate prompt and completion tokens for the run and descendants. Omitted means unlimited. */
53
+ /** Aggregate prompt and completion tokens for the run and descendants. Omitted or 0 means unlimited. */
54
54
  readonly tokenBudget?: number;
55
+ /** Total run duration in milliseconds. Omitted or 0 means unlimited. */
56
+ readonly timeoutMs?: number;
55
57
  /**
56
58
  * Milliseconds a headless run may spend waiting out provider pauses — a
57
59
  * rate limit, an outage — resuming from its checkpoint after each, before
@@ -61,6 +63,12 @@ export interface RunLimitsConfig {
61
63
  }
62
64
  /** See `NamzuCliConfig.compaction`. */
63
65
  export interface CompactionCliConfig {
66
+ /** Bounded historical evidence recall in recorded conversations. Default true; false disables it. */
67
+ readonly recallEvidence?: boolean;
68
+ /** Resolve follow-up search references with a metered model call when recall is enabled. Default true. */
69
+ readonly resolveEvidenceQueries?: boolean;
70
+ /** Retained overflow preview in recorded conversations; default 4,000 chars. 0 keeps the ordinary 40,000-char budget. */
71
+ readonly retainedToolPreviewChars?: number;
64
72
  /** Mask exact repeated read-only observations in model requests; enabled unless false. */
65
73
  readonly deduplicateObservations?: boolean;
66
74
  /**
@@ -170,8 +178,8 @@ export interface NamzuCliConfig {
170
178
  /**
171
179
  * How far one run may go before the kernel stops it. Headless `run` and
172
180
  * `run-stream` read these; `--max-iterations` and `--token-budget` override
173
- * them for one run. Absent means the defaults a chat turn gets: 50 model
174
- * calls and no cumulative token limit. Explicit token budgets cover descendants.
181
+ * them for one run. Absent means unlimited tokens, iterations and run duration.
182
+ * Explicit token budgets cover descendants.
175
183
  */
176
184
  readonly limits?: RunLimitsConfig;
177
185
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAsUH,MAAM,CAAC,MAAM,cAAc,GAAmB,MAAM,CAAC,MAAM,CAAC;IAC3D,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,KAAK;CACZ,CAAC,CAAA"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA8UH,MAAM,CAAC,MAAM,cAAc,GAAmB,MAAM,CAAC,MAAM,CAAC;IAC3D,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,KAAK;CACZ,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-message.d.ts","sourceRoot":"","sources":["../../src/context/runtime-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAE3D,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,yBAAyB,GAAG,MAAM,CAiB3E"}
1
+ {"version":3,"file":"runtime-message.d.ts","sourceRoot":"","sources":["../../src/context/runtime-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAE3D,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,yBAAyB,GAAG,MAAM,CAmB3E"}
@@ -1,6 +1,8 @@
1
1
  /** Human label for provider-user-role context authored by the runtime. */
2
2
  export function runtimeContextLabel(kind) {
3
3
  switch (kind) {
4
+ case 'step-context':
5
+ return 'Step context';
4
6
  case 'advisory':
5
7
  return 'Advisor context';
6
8
  case 'answer-review':
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-message.js","sourceRoot":"","sources":["../../src/context/runtime-message.ts"],"names":[],"mappings":"AAEA,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CAAC,IAA+B;IAClE,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,UAAU;YACd,OAAO,iBAAiB,CAAA;QACzB,KAAK,eAAe;YACnB,OAAO,wBAAwB,CAAA;QAChC,KAAK,mBAAmB;YACvB,OAAO,wBAAwB,CAAA;QAChC,KAAK,oBAAoB;YACxB,OAAO,4BAA4B,CAAA;QACpC,KAAK,UAAU;YACd,OAAO,kBAAkB,CAAA;QAC1B,KAAK,mBAAmB;YACvB,OAAO,yBAAyB,CAAA;QACjC,KAAK,iBAAiB;YACrB,OAAO,yBAAyB,CAAA;IAClC,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"runtime-message.js","sourceRoot":"","sources":["../../src/context/runtime-message.ts"],"names":[],"mappings":"AAEA,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CAAC,IAA+B;IAClE,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,cAAc;YAClB,OAAO,cAAc,CAAA;QACtB,KAAK,UAAU;YACd,OAAO,iBAAiB,CAAA;QACzB,KAAK,eAAe;YACnB,OAAO,wBAAwB,CAAA;QAChC,KAAK,mBAAmB;YACvB,OAAO,wBAAwB,CAAA;QAChC,KAAK,oBAAoB;YACxB,OAAO,4BAA4B,CAAA;QACpC,KAAK,UAAU;YACd,OAAO,kBAAkB,CAAA;QAC1B,KAAK,mBAAmB;YACvB,OAAO,yBAAyB,CAAA;QACjC,KAAK,iBAAiB;YACrB,OAAO,yBAAyB,CAAA;IAClC,CAAC;AACF,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Native Windows cannot execute npm.cmd with shell:false. Use the npm CLI
3
+ * bundled with the Node runtime running Namzu, keeping every argument literal.
4
+ * Custom PATH wrappers are not interpreted or silently selected in its place.
5
+ */
6
+ export declare function resolveNpmInvocation(executable: string, args: readonly string[], platform?: NodeJS.Platform, nodeExecutable?: string): {
7
+ readonly executable: string;
8
+ readonly args: readonly string[];
9
+ };
10
+ //# sourceMappingURL=npm-invocation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-invocation.d.ts","sourceRoot":"","sources":["../../src/integrations/npm-invocation.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,oBAAoB,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,cAAc,GAAE,MAAyB,GACvC;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAenE"}
@@ -0,0 +1,23 @@
1
+ import { statSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ /**
4
+ * Native Windows cannot execute npm.cmd with shell:false. Use the npm CLI
5
+ * bundled with the Node runtime running Namzu, keeping every argument literal.
6
+ * Custom PATH wrappers are not interpreted or silently selected in its place.
7
+ */
8
+ export function resolveNpmInvocation(executable, args, platform = process.platform, nodeExecutable = process.execPath) {
9
+ if (platform !== 'win32' || (executable !== 'npm' && executable !== 'npm.cmd')) {
10
+ return { executable, args };
11
+ }
12
+ const npmCli = join(dirname(nodeExecutable), 'node_modules', 'npm', 'bin', 'npm-cli.js');
13
+ try {
14
+ if (statSync(npmCli).isFile()) {
15
+ return { executable: nodeExecutable, args: [npmCli, ...args] };
16
+ }
17
+ }
18
+ catch {
19
+ // Give the same actionable refusal for absent or unreadable bundles.
20
+ }
21
+ throw new Error(`npm's JavaScript entry point is unavailable at ${npmCli}. Namzu uses the npm bundled with its Node runtime on Windows. Repair that Node installation or run npm manually; custom PATH wrappers are not used.`);
22
+ }
23
+ //# sourceMappingURL=npm-invocation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-invocation.js","sourceRoot":"","sources":["../../src/integrations/npm-invocation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEzC;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CACnC,UAAkB,EAClB,IAAuB,EACvB,WAA4B,OAAO,CAAC,QAAQ,EAC5C,iBAAyB,OAAO,CAAC,QAAQ;IAEzC,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,SAAS,CAAC,EAAE,CAAC;QAChF,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;IAC5B,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CAAA;IACxF,IAAI,CAAC;QACJ,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/B,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;QAC/D,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,qEAAqE;IACtE,CAAC;IACD,MAAM,IAAI,KAAK,CACd,kDAAkD,MAAM,sJAAsJ,CAC9M,CAAA;AACF,CAAC"}
@@ -1,11 +1,29 @@
1
1
  import { PluginLifecycleManager, SkillRegistry, type ToolRegistry } from '@namzu/sdk';
2
- import type { HooksConfig, PluginConfig } from '../../config/schema.js';
2
+ import type { HooksConfig, PluginConfig, PluginScope } from '../../config/schema.js';
3
3
  export interface CliPluginRuntime {
4
4
  readonly manager: PluginLifecycleManager;
5
5
  readonly skills: SkillRegistry;
6
6
  readonly pluginCount: number;
7
+ list(): readonly CliPluginInfo[];
8
+ setEnabled(name: string, enabled: boolean): Promise<void>;
9
+ rememberState(name: string): Promise<void>;
7
10
  close(): Promise<void>;
8
11
  }
12
+ /** Public operator metadata only; never expose MCP environment or hook bodies. */
13
+ export interface CliPluginInfo {
14
+ readonly name: string;
15
+ readonly version: string;
16
+ readonly description: string;
17
+ readonly scope: PluginScope;
18
+ readonly rootDir: string;
19
+ readonly status: string;
20
+ readonly startupEnabled?: boolean;
21
+ readonly startupError?: string;
22
+ readonly tools: readonly string[];
23
+ readonly skills: readonly string[];
24
+ readonly hookModules: readonly string[];
25
+ readonly mcpServers: readonly string[];
26
+ }
9
27
  /**
10
28
  * Build the executable extension runtime owned by one agent session.
11
29
  *
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/integrations/plugins/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,sBAAsB,EAEtB,aAAa,EAEb,KAAK,YAAY,EAGjB,MAAM,YAAY,CAAA;AAEnB,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAe,MAAM,wBAAwB,CAAA;AAIpF,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAA;IACxC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAMD;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC3C,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,MAAM;AACX;;;;GAIG;AACH,KAAK,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CA0FvC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/integrations/plugins/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,sBAAsB,EAEtB,aAAa,EAEb,KAAK,YAAY,EAGjB,MAAM,YAAY,CAAA;AAEnB,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAKpF,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAA;IACxC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,IAAI,IAAI,SAAS,aAAa,EAAE,CAAA;IAChC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAED,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;CACtC;AAMD;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC3C,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,MAAM;AACX;;;;GAIG;AACH,KAAK,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAyKvC"}
@@ -1,6 +1,7 @@
1
1
  import { PluginLifecycleManager, PluginRegistry, SkillRegistry, SkillTool, attachShellHooks, discoverAllPluginDirs, } from '@namzu/sdk';
2
2
  import { cliLogger } from '../../logging.js';
3
3
  import { resolveNamzuHome } from '../state/home.js';
4
+ import { PluginSettingsStore } from './settings.js';
4
5
  function message(error) {
5
6
  return error instanceof Error ? error.message : String(error);
6
7
  }
@@ -24,6 +25,7 @@ hooks) {
24
25
  return undefined;
25
26
  const log = cliLogger();
26
27
  const userRoot = resolveNamzuHome();
28
+ const settings = new PluginSettingsStore(userRoot);
27
29
  const plugins = new PluginRegistry();
28
30
  const skills = new SkillRegistry(log);
29
31
  const manager = new PluginLifecycleManager({
@@ -54,7 +56,9 @@ hooks) {
54
56
  for (const dir of dirs) {
55
57
  const plugin = await manager.install(dir, scope);
56
58
  installed.push(plugin);
57
- await manager.enable(plugin.id);
59
+ const enabled = settings.read({ rootDir: plugin.rootDir, name: plugin.manifest.name });
60
+ if (enabled)
61
+ await manager.enable(plugin.id);
58
62
  }
59
63
  }
60
64
  if (skills.size > 0 && !tools.has(SkillTool.name)) {
@@ -82,14 +86,98 @@ hooks) {
82
86
  });
83
87
  }
84
88
  let closePromise;
89
+ let closed = false;
90
+ let mutation;
91
+ const syncSkillTool = () => {
92
+ if (skills.size > 0 && !tools.has(SkillTool.name)) {
93
+ tools.register(SkillTool);
94
+ ownsSkillTool = true;
95
+ }
96
+ else if (skills.size === 0 && ownsSkillTool) {
97
+ tools.unregister(SkillTool.name);
98
+ ownsSkillTool = false;
99
+ }
100
+ };
85
101
  return {
86
102
  manager,
87
103
  skills,
88
104
  pluginCount: installed.length,
105
+ list: () => plugins
106
+ .getAll()
107
+ .map((plugin) => {
108
+ const prefix = `${plugin.manifest.name}__`;
109
+ let startupEnabled;
110
+ let startupError;
111
+ try {
112
+ startupEnabled = settings.read({ rootDir: plugin.rootDir, name: plugin.manifest.name });
113
+ }
114
+ catch (error) {
115
+ startupError = message(error);
116
+ }
117
+ return {
118
+ name: plugin.manifest.name,
119
+ version: plugin.manifest.version,
120
+ description: plugin.manifest.description,
121
+ scope: plugin.scope,
122
+ rootDir: plugin.rootDir,
123
+ status: plugin.status === 'installed' ? 'disabled' : plugin.status,
124
+ ...(startupEnabled !== undefined ? { startupEnabled } : {}),
125
+ ...(startupError ? { startupError } : {}),
126
+ tools: tools
127
+ .listNames()
128
+ .filter((name) => name.startsWith(prefix))
129
+ .sort(),
130
+ skills: skills
131
+ .list()
132
+ .map((skill) => skill.metadata.name)
133
+ .filter((name) => name.startsWith(prefix))
134
+ .sort(),
135
+ hookModules: [...(plugin.manifest.hooks ?? [])],
136
+ mcpServers: (plugin.manifest.mcpServers ?? []).map((server) => server.name),
137
+ };
138
+ })
139
+ .sort((a, b) => a.name.localeCompare(b.name)),
140
+ async setEnabled(name, enabled) {
141
+ if (closed)
142
+ throw new Error('Plugin runtime is closed.');
143
+ if (mutation)
144
+ throw new Error('Another plugin change is in progress.');
145
+ const plugin = plugins.findByName(name);
146
+ if (!plugin)
147
+ throw new Error(`Plugin "${name}" is not loaded in this session.`);
148
+ if ((enabled && plugin.status === 'enabled') ||
149
+ (!enabled && (plugin.status === 'disabled' || plugin.status === 'installed')))
150
+ return;
151
+ mutation = enabled ? manager.enable(plugin.id) : manager.disable(plugin.id);
152
+ try {
153
+ await mutation;
154
+ }
155
+ finally {
156
+ syncSkillTool();
157
+ mutation = undefined;
158
+ }
159
+ },
160
+ async rememberState(name) {
161
+ if (closed)
162
+ throw new Error('Plugin runtime is closed.');
163
+ if (mutation)
164
+ throw new Error('Another plugin change is in progress.');
165
+ const plugin = plugins.findByName(name);
166
+ if (!plugin)
167
+ throw new Error(`Plugin "${name}" is not loaded in this session.`);
168
+ if (!['enabled', 'disabled', 'installed'].includes(plugin.status)) {
169
+ throw new Error('Resolve the plugin error before remembering its state.');
170
+ }
171
+ const enabled = plugin.status === 'enabled';
172
+ settings.write({ rootDir: plugin.rootDir, name }, enabled);
173
+ },
89
174
  close() {
90
175
  if (closePromise)
91
176
  return closePromise;
177
+ closed = true;
92
178
  closePromise = (async () => {
179
+ if (mutation)
180
+ await mutation.catch(() => { });
93
181
  const errors = [];
94
182
  if (ownsSkillTool) {
95
183
  tools.unregister(SkillTool.name);
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/integrations/plugins/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/integrations/plugins/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ interface PluginLocation {
2
+ readonly rootDir: string;
3
+ readonly name: string;
4
+ }
5
+ /** One atomic setting per admitted physical plugin, independent of other projects. */
6
+ export declare class PluginSettingsStore {
7
+ private readonly home;
8
+ readonly directory: string;
9
+ constructor(home: string);
10
+ private path;
11
+ read(plugin: PluginLocation): boolean;
12
+ write(plugin: PluginLocation, enabled: boolean): void;
13
+ }
14
+ export {};
15
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/integrations/plugins/settings.ts"],"names":[],"mappings":"AAkBA,UAAU,cAAc;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACrB;AAID,sFAAsF;AACtF,qBAAa,mBAAmB;IAGnB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;gBAEG,IAAI,EAAE,MAAM;IAIzC,OAAO,CAAC,IAAI;IASZ,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO;IAiDrC,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;CA6BrD"}
@@ -0,0 +1,106 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { constants, closeSync, fstatSync, fsyncSync, lstatSync, openSync, readSync, renameSync, unlinkSync, writeFileSync, } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { restrictToOwner } from '../providers/credential-store.js';
5
+ import { ensurePrivateStateDirectory } from '../state/private-directory.js';
6
+ const MAX_RECORD_BYTES = 64 * 1024;
7
+ /** One atomic setting per admitted physical plugin, independent of other projects. */
8
+ export class PluginSettingsStore {
9
+ home;
10
+ directory;
11
+ constructor(home) {
12
+ this.home = home;
13
+ this.directory = join(home, 'plugin-settings');
14
+ }
15
+ path(plugin) {
16
+ // The lifecycle manager supplies a canonical root. Names alone would make
17
+ // disabling a project plugin disable unrelated plugins in other projects.
18
+ const key = createHash('sha256')
19
+ .update(JSON.stringify([plugin.rootDir, plugin.name]))
20
+ .digest('hex');
21
+ return join(this.directory, `${key}.json`);
22
+ }
23
+ read(plugin) {
24
+ const path = this.path(plugin);
25
+ try {
26
+ try {
27
+ const directory = lstatSync(this.directory);
28
+ if (!directory.isDirectory() || directory.isSymbolicLink()) {
29
+ throw new Error('settings directory must be a real directory');
30
+ }
31
+ const entry = lstatSync(path);
32
+ if (!entry.isFile() || entry.isSymbolicLink()) {
33
+ throw new Error('setting must be a regular file');
34
+ }
35
+ }
36
+ catch (error) {
37
+ if (error.code === 'ENOENT')
38
+ return true;
39
+ throw error;
40
+ }
41
+ const fd = openSync(path, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
42
+ let raw;
43
+ try {
44
+ if (!fstatSync(fd).isFile())
45
+ throw new Error('setting must be a regular file');
46
+ const buffer = Buffer.alloc(MAX_RECORD_BYTES + 1);
47
+ let size = 0;
48
+ while (size < buffer.length) {
49
+ const bytes = readSync(fd, buffer, size, buffer.length - size, null);
50
+ if (bytes === 0)
51
+ break;
52
+ size += bytes;
53
+ }
54
+ if (size > MAX_RECORD_BYTES)
55
+ throw new Error('setting exceeds 64 KiB');
56
+ raw = buffer.toString('utf8', 0, size);
57
+ }
58
+ finally {
59
+ closeSync(fd);
60
+ }
61
+ const value = JSON.parse(raw);
62
+ if (!value ||
63
+ value.version !== 1 ||
64
+ value.rootDir !== plugin.rootDir ||
65
+ value.name !== plugin.name ||
66
+ typeof value.enabled !== 'boolean') {
67
+ throw new Error('setting has an invalid version, plugin identity or enabled value');
68
+ }
69
+ return value.enabled;
70
+ }
71
+ catch (error) {
72
+ // Corruption must not quietly turn a disabled executable plugin on.
73
+ throw new Error(`Could not read plugin setting ${path}: ${String(error)}`, { cause: error });
74
+ }
75
+ }
76
+ write(plugin, enabled) {
77
+ ensurePrivateStateDirectory(this.home, 'plugin-settings');
78
+ this.read(plugin);
79
+ const path = this.path(plugin);
80
+ const temporary = `${path}.tmp.${randomUUID()}`;
81
+ const fd = openSync(temporary, 'wx', 0o600);
82
+ try {
83
+ try {
84
+ writeFileSync(fd, `${JSON.stringify({ version: 1, rootDir: plugin.rootDir, name: plugin.name, enabled }, null, 2)}\n`);
85
+ fsyncSync(fd);
86
+ }
87
+ finally {
88
+ closeSync(fd);
89
+ }
90
+ restrictToOwner(temporary);
91
+ // Separate plugins never overwrite each other's settings. For this
92
+ // plugin the last complete replacement wins, without a stale RMW merge.
93
+ renameSync(temporary, path);
94
+ }
95
+ finally {
96
+ try {
97
+ unlinkSync(temporary);
98
+ }
99
+ catch {
100
+ // Cleanup must not mask a write error or turn a committed rename
101
+ // into a reported failure. Temporary names are never read as settings.
102
+ }
103
+ }
104
+ }
105
+ }
106
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/integrations/plugins/settings.ts"],"names":[],"mappings":"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"}
@@ -28,9 +28,9 @@
28
28
  * - Windows: POSIX modes do not exist — `fs.chmod` there only toggles the
29
29
  * read-only attribute, so a `0600` that "succeeded" would prove nothing.
30
30
  * The equivalent is a discretionary ACL, so inheritance is removed and a
31
- * single full-control entry is granted to the current user's SID; the ACL
32
- * is then saved back as SDDL and required to contain exactly that one
33
- * allow entry and nothing else.
31
+ * full-control entry is granted to the current user's SID; the ACL is then
32
+ * saved back as SDDL and checked for access by that user. An existing
33
+ * LocalSystem grant is permitted; grants to other accounts are refused.
34
34
  *
35
35
  * ## What is in the file
36
36
  *
@@ -107,8 +107,9 @@ export declare function clearStoredCodexCredential(home?: string): void;
107
107
  /** Remove every credential Namzu owns in one store mutation. */
108
108
  export declare function clearAllStoredCredentials(home?: string): void;
109
109
  /**
110
- * Make `path` readable and writable by its owner and by nobody else, and
111
- * PROVE it. Throws `CredentialStoreError` when the proof cannot be produced.
110
+ * Make `path` private to the current account, and PROVE it. Windows may retain
111
+ * access for the operating system's LocalSystem account. Throws
112
+ * `CredentialStoreError` when the proof cannot be produced.
112
113
  *
113
114
  * Exported because it is the load-bearing half of this module and a security
114
115
  * property nobody can check by reading the caller.
@@ -141,8 +142,8 @@ export declare function readAclSddl(path: string): string | null;
141
142
  /** The current account's security identifier, or `null` off Windows / on failure. */
142
143
  export declare function currentUserSid(): string | null;
143
144
  /**
144
- * Require an SDDL discretionary ACL to grant exactly one principal, and that
145
- * principal to be `sid`.
145
+ * Require a protected SDDL discretionary ACL that grants the current account
146
+ * access, with no other allowed principal except Windows LocalSystem.
146
147
  *
147
148
  * Split out from the spawning above because it is the actual assertion, and
148
149
  * an assertion that can only run on one operating system is an assertion
@@ -1 +1 @@
1
- {"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAqBH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAKzD,eAAO,MAAM,wBAAwB,EAAG,CAAU,CAAA;AAElD,wFAAwF;AACxF,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,SAAkB,IAAI,0BAAyB;CAC/C;AAED,MAAM,MAAM,0BAA0B,GACnC;IAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAA;CAAE,CAAA;AAE9E,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,MAAM,+BAA+B,GACxC;IAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAA;CAAE,GACpE;IACA,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAAA;CAC7C,CAAA;AAQJ,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAE3F;AAED,4EAA4E;AAC5E,wBAAgB,yBAAyB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAErF;AAsDD;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAChD,IAAI,EAAE,oBAAoB,EAC1B,IAAI,CAAC,EAAE,MAAM,GACX,MAAM,CAUR;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,qBAAqB,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAc7F;AAED,wBAAgB,4BAA4B,CAC3C,QAAQ,EAAE,qBAAqB,EAC/B,WAAW,EAAE,qBAAqB,EAClC,IAAI,CAAC,EAAE,MAAM,GACX,+BAA+B,CAiBjC;AAED;;;;;;;;GAQG;AACH,wBAAgB,mCAAmC,CAClD,QAAQ,EAAE,oBAAoB,EAC9B,WAAW,EAAE,oBAAoB,EACjC,IAAI,CAAC,EAAE,MAAM,GACX,0BAA0B,CAiB5B;AA4DD,wDAAwD;AACxD,wBAAgB,iCAAiC,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAiBrE;AAED,0FAA0F;AAC1F,wBAAgB,0BAA0B,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAc9D;AAED,gEAAgE;AAChE,wBAAgB,yBAAyB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAI7D;AAsGD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAiBlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAMpE;AAgDD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBvD;AAED,qFAAqF;AACrF,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAc9C;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAoCjF"}
1
+ {"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAqBH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAKzD,eAAO,MAAM,wBAAwB,EAAG,CAAU,CAAA;AAElD,wFAAwF;AACxF,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,SAAkB,IAAI,0BAAyB;CAC/C;AAED,MAAM,MAAM,0BAA0B,GACnC;IAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAA;CAAE,CAAA;AAE9E,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,MAAM,+BAA+B,GACxC;IAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAA;CAAE,GACpE;IACA,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAAA;CAC7C,CAAA;AAQJ,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAE3F;AAED,4EAA4E;AAC5E,wBAAgB,yBAAyB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAErF;AAsDD;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAChD,IAAI,EAAE,oBAAoB,EAC1B,IAAI,CAAC,EAAE,MAAM,GACX,MAAM,CAUR;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,qBAAqB,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAc7F;AAED,wBAAgB,4BAA4B,CAC3C,QAAQ,EAAE,qBAAqB,EAC/B,WAAW,EAAE,qBAAqB,EAClC,IAAI,CAAC,EAAE,MAAM,GACX,+BAA+B,CAiBjC;AAED;;;;;;;;GAQG;AACH,wBAAgB,mCAAmC,CAClD,QAAQ,EAAE,oBAAoB,EAC9B,WAAW,EAAE,oBAAoB,EACjC,IAAI,CAAC,EAAE,MAAM,GACX,0BAA0B,CAiB5B;AA4DD,wDAAwD;AACxD,wBAAgB,iCAAiC,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAiBrE;AAED,0FAA0F;AAC1F,wBAAgB,0BAA0B,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAc9D;AAED,gEAAgE;AAChE,wBAAgB,yBAAyB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAI7D;AAsGD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAiBlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAMpE;AA8DD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBvD;AAED,qFAAqF;AACrF,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAc9C;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAmDjF"}
@@ -28,9 +28,9 @@
28
28
  * - Windows: POSIX modes do not exist — `fs.chmod` there only toggles the
29
29
  * read-only attribute, so a `0600` that "succeeded" would prove nothing.
30
30
  * The equivalent is a discretionary ACL, so inheritance is removed and a
31
- * single full-control entry is granted to the current user's SID; the ACL
32
- * is then saved back as SDDL and required to contain exactly that one
33
- * allow entry and nothing else.
31
+ * full-control entry is granted to the current user's SID; the ACL is then
32
+ * saved back as SDDL and checked for access by that user. An existing
33
+ * LocalSystem grant is permitted; grants to other accounts are refused.
34
34
  *
35
35
  * ## What is in the file
36
36
  *
@@ -374,8 +374,9 @@ function publishLockAtomically(lockPath, token) {
374
374
  }
375
375
  }
376
376
  /**
377
- * Make `path` readable and writable by its owner and by nobody else, and
378
- * PROVE it. Throws `CredentialStoreError` when the proof cannot be produced.
377
+ * Make `path` private to the current account, and PROVE it. Windows may retain
378
+ * access for the operating system's LocalSystem account. Throws
379
+ * `CredentialStoreError` when the proof cannot be produced.
379
380
  *
380
381
  * Exported because it is the load-bearing half of this module and a security
381
382
  * property nobody can check by reading the caller.
@@ -413,8 +414,12 @@ export function assertOwnerOnlyMode(mode, path) {
413
414
  }
414
415
  /**
415
416
  * The Windows half: remove inheritance, grant the current user's SID full
416
- * control, then read the resulting ACL back as SDDL and require it to be
417
- * exactly that one allow entry.
417
+ * control, then read the resulting ACL back as SDDL. Existing explicit grants
418
+ * survive `/inheritance:r` and `/grant:r`; only LocalSystem may remain beside
419
+ * the current account. Directory grants propagate to children, so Windows does
420
+ * not substitute the creator token's default ACL for new state partitions.
421
+ * Directory protection also removes the built-in Administrators grant; it does
422
+ * not accept that group as private. Other account grants are refused.
418
423
  *
419
424
  * Both helpers are invoked by absolute path under `%SystemRoot%\System32`.
420
425
  * Resolving them through `PATH` is how a same-named executable earlier on the
@@ -441,7 +446,17 @@ function restrictToOwnerWindows(path) {
441
446
  if (!sid) {
442
447
  throw new CredentialStoreError(`could not determine the current account's security identifier, so the protection of ${path} cannot be established.`);
443
448
  }
444
- run('icacls.exe', [path, '/inheritance:r', '/grant:r', `*${sid}:F`]);
449
+ const directory = statSync(path).isDirectory();
450
+ run('icacls.exe', [
451
+ path,
452
+ '/inheritance:r',
453
+ '/grant:r',
454
+ `*${sid}:${directory ? '(OI)(CI)F' : 'F'}`,
455
+ // Tighten the named private directory, including older generated state
456
+ // whose non-inheritable parent caused Windows to add this default grant.
457
+ // Never reset the ACL through a potentially wider parent descriptor.
458
+ ...(directory ? ['/remove:g', '*S-1-5-32-544'] : []),
459
+ ]);
445
460
  const saved = readAclSddl(path);
446
461
  if (saved === null) {
447
462
  throw new CredentialStoreError(`could not read back the access-control list of ${path}, so its privacy is unestablished.`);
@@ -501,8 +516,8 @@ export function currentUserSid() {
501
516
  }
502
517
  }
503
518
  /**
504
- * Require an SDDL discretionary ACL to grant exactly one principal, and that
505
- * principal to be `sid`.
519
+ * Require a protected SDDL discretionary ACL that grants the current account
520
+ * access, with no other allowed principal except Windows LocalSystem.
506
521
  *
507
522
  * Split out from the spawning above because it is the actual assertion, and
508
523
  * an assertion that can only run on one operating system is an assertion
@@ -511,10 +526,10 @@ export function currentUserSid() {
511
526
  * at a match would call that private.
512
527
  */
513
528
  export function assertSoleOwnerSddl(sddl, sid, path) {
514
- const dacl = sddl.match(/D:([A-Z]*)((?:\([^)]*\))*)/);
529
+ const dacl = sddl.match(/D:([A-Z]*)(.*?)(?=[OGS]:|[\r\n]|$)/u);
515
530
  const flags = dacl?.[1] ?? '';
516
531
  const body = dacl?.[2] ?? '';
517
- if (!dacl || body.length === 0) {
532
+ if (!dacl || !/^(?:\([^()]*\))+$/u.test(body)) {
518
533
  throw new CredentialStoreError(`the access-control list of ${path} could not be read back, so its privacy is unestablished.`);
519
534
  }
520
535
  if (!flags.includes('P')) {
@@ -524,18 +539,30 @@ export function assertSoleOwnerSddl(sddl, sid, path) {
524
539
  if (aces.length === 0) {
525
540
  throw new CredentialStoreError(`the access-control list of ${path} could not be read back, so its privacy is unestablished.`);
526
541
  }
542
+ let grantsCurrentAccount = false;
543
+ const normalizeSid = (value) => value.toUpperCase() === 'SY' ? 'S-1-5-18' : value.toUpperCase();
527
544
  for (const ace of aces) {
528
545
  const type = ace[0] ?? '';
529
546
  const trustee = ace[5] ?? '';
530
- // Only an ALLOW entry grants anything; a DENY entry narrows and is safe.
531
- if (type !== 'A' && type !== 'AI')
547
+ // Object/conditional ACEs need a different parser. They cannot be
548
+ // classified as harmless merely because their type is not plain A.
549
+ if (ace.length !== 6 || (type !== 'A' && type !== 'D') || ace[3] || ace[4]) {
550
+ throw new CredentialStoreError(`the access-control list of ${path} contains an unsupported entry, so its privacy is unestablished.`);
551
+ }
552
+ if (type === 'D')
532
553
  continue;
533
- if (trustee.toUpperCase() !== sid.toUpperCase()) {
554
+ const currentAccount = normalizeSid(trustee) === normalizeSid(sid);
555
+ if (!currentAccount && normalizeSid(trustee) !== 'S-1-5-18') {
534
556
  throw new CredentialStoreError(`${path} grants access to an account other than yours (${trustee}) — refusing to keep a credential there.`);
535
557
  }
558
+ // An inherit-only grant applies to descendants, not this path. A
559
+ // SYSTEM-only list likewise says nothing about the current user's access.
560
+ if (currentAccount && !(ace[1] ?? '').includes('IO') && ace[2]) {
561
+ grantsCurrentAccount = true;
562
+ }
536
563
  }
537
- if (!aces.some((ace) => (ace[0] ?? '') === 'A' || (ace[0] ?? '') === 'AI')) {
538
- throw new CredentialStoreError(`${path} ended with no account able to read it, which is not a credential store — refusing.`);
564
+ if (!grantsCurrentAccount) {
565
+ throw new CredentialStoreError(`${path} ended with no access granted to your account, which is not a credential store — refusing.`);
539
566
  }
540
567
  }
541
568
  //# sourceMappingURL=credential-store.js.map