@pugi/cli 0.1.0-beta.99 → 1.0.0-alpha.2

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 (448) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +11 -191
  3. package/bin/pugi +8 -0
  4. package/package.json +15 -71
  5. package/postinstall.mjs +31 -0
  6. package/CHANGELOG.md +0 -132
  7. package/THIRD_PARTY_NOTICES.md +0 -40
  8. package/assets/pugi-mascot.ansi +0 -16
  9. package/assets/pugi-prozr2-mascot.ansi +0 -9
  10. package/bin/run.js +0 -34
  11. package/dist/commands/deploy.js +0 -439
  12. package/dist/commands/flatten.js +0 -191
  13. package/dist/commands/jobs-watch.js +0 -201
  14. package/dist/commands/jobs.js +0 -260
  15. package/dist/commands/retro.js +0 -210
  16. package/dist/commands/smoke.js +0 -133
  17. package/dist/core/agent-progress/cleanup.js +0 -134
  18. package/dist/core/agent-progress/schema.js +0 -144
  19. package/dist/core/agent-progress/writer.js +0 -101
  20. package/dist/core/agents/adaptive-router.js +0 -330
  21. package/dist/core/agents/loader.js +0 -104
  22. package/dist/core/agents/query-decomposer.js +0 -297
  23. package/dist/core/agents/registry.js +0 -69
  24. package/dist/core/approvals/shortcut-resolver.js +0 -98
  25. package/dist/core/artifact-chain/dispatcher.js +0 -148
  26. package/dist/core/artifact-chain/exporter.js +0 -164
  27. package/dist/core/artifact-chain/state.js +0 -243
  28. package/dist/core/artifact-chain/steps.js +0 -169
  29. package/dist/core/ask-user/question.js +0 -92
  30. package/dist/core/audit/audit-trail.js +0 -275
  31. package/dist/core/auth/ensure-authenticated.js +0 -129
  32. package/dist/core/auth/env-provider.js +0 -238
  33. package/dist/core/auto-open-browser.js +0 -128
  34. package/dist/core/auto-update/channels.js +0 -122
  35. package/dist/core/auto-update/checker.js +0 -241
  36. package/dist/core/auto-update/state.js +0 -235
  37. package/dist/core/bare-mode/index.js +0 -107
  38. package/dist/core/bash/redirect.js +0 -281
  39. package/dist/core/bash-classifier.js +0 -1397
  40. package/dist/core/checkpoint/resumer.js +0 -149
  41. package/dist/core/checkpoint/rewinder.js +0 -291
  42. package/dist/core/checkpoints/shadow-git.js +0 -670
  43. package/dist/core/citations/parser.js +0 -109
  44. package/dist/core/classifier/yolo-classifier.js +0 -88
  45. package/dist/core/clipboard.js +0 -70
  46. package/dist/core/codegraph/decision-store.js +0 -248
  47. package/dist/core/codegraph/detect-repo.js +0 -459
  48. package/dist/core/codegraph/install.js +0 -134
  49. package/dist/core/codegraph/offer-hook.js +0 -220
  50. package/dist/core/compact/auto-trigger.js +0 -96
  51. package/dist/core/compact/buffer-rewriter.js +0 -115
  52. package/dist/core/compact/summarizer.js +0 -208
  53. package/dist/core/compact/token-counter.js +0 -108
  54. package/dist/core/consensus/anvil-fanout.js +0 -276
  55. package/dist/core/consensus/diff-capture.js +0 -491
  56. package/dist/core/consensus/rubric.js +0 -233
  57. package/dist/core/context/builder.js +0 -114
  58. package/dist/core/context/compaction-events.js +0 -99
  59. package/dist/core/context/compaction.js +0 -602
  60. package/dist/core/context/index.js +0 -28
  61. package/dist/core/context/invariants.js +0 -250
  62. package/dist/core/context/markdown-loader.js +0 -288
  63. package/dist/core/context/markdown-traverse.js +0 -255
  64. package/dist/core/context/pugiignore.js +0 -316
  65. package/dist/core/context/repo-skeleton.js +0 -533
  66. package/dist/core/context/tool-eviction.js +0 -55
  67. package/dist/core/context/watcher.js +0 -342
  68. package/dist/core/context/working-set.js +0 -165
  69. package/dist/core/coordinator/agent-tools.js +0 -77
  70. package/dist/core/coordinator/agent-toolset.js +0 -65
  71. package/dist/core/coordinator/fsm.js +0 -73
  72. package/dist/core/coordinator/mode-fsm.js +0 -70
  73. package/dist/core/cost/rate-card.js +0 -129
  74. package/dist/core/cost/tracker.js +0 -221
  75. package/dist/core/credentials.js +0 -355
  76. package/dist/core/cron/scheduler.js +0 -138
  77. package/dist/core/denial-tracking/index.js +0 -8
  78. package/dist/core/denial-tracking/state.js +0 -264
  79. package/dist/core/diagnostics/probe-runner.js +0 -93
  80. package/dist/core/diagnostics/probes/api.js +0 -46
  81. package/dist/core/diagnostics/probes/auth.js +0 -93
  82. package/dist/core/diagnostics/probes/bare-mode.js +0 -42
  83. package/dist/core/diagnostics/probes/cli-version.js +0 -127
  84. package/dist/core/diagnostics/probes/config.js +0 -72
  85. package/dist/core/diagnostics/probes/denial-tracking.js +0 -57
  86. package/dist/core/diagnostics/probes/disk.js +0 -81
  87. package/dist/core/diagnostics/probes/engine-live.js +0 -46
  88. package/dist/core/diagnostics/probes/git.js +0 -65
  89. package/dist/core/diagnostics/probes/hooks.js +0 -118
  90. package/dist/core/diagnostics/probes/mcp.js +0 -75
  91. package/dist/core/diagnostics/probes/node.js +0 -59
  92. package/dist/core/diagnostics/probes/pnpm.js +0 -36
  93. package/dist/core/diagnostics/probes/pugi-md.js +0 -89
  94. package/dist/core/diagnostics/probes/sandbox.js +0 -72
  95. package/dist/core/diagnostics/probes/session.js +0 -74
  96. package/dist/core/diagnostics/probes/status-snapshot.js +0 -488
  97. package/dist/core/diagnostics/probes/workspace.js +0 -63
  98. package/dist/core/diagnostics/types.js +0 -70
  99. package/dist/core/dispatch/cache-cleanup.js +0 -197
  100. package/dist/core/dispatch/cache-handoff.js +0 -295
  101. package/dist/core/edits/apply-patch-layer-e.js +0 -189
  102. package/dist/core/edits/dispatch.js +0 -511
  103. package/dist/core/edits/format-detector.js +0 -260
  104. package/dist/core/edits/format-matrix.js +0 -26
  105. package/dist/core/edits/fuzzy-ladder.js +0 -650
  106. package/dist/core/edits/index.js +0 -19
  107. package/dist/core/edits/journal.js +0 -199
  108. package/dist/core/edits/layer-a-apply.js +0 -217
  109. package/dist/core/edits/layer-a-fuzzy-apply.js +0 -198
  110. package/dist/core/edits/layer-b-apply.js +0 -211
  111. package/dist/core/edits/layer-c-apply.js +0 -160
  112. package/dist/core/edits/layer-d-ast.js +0 -572
  113. package/dist/core/edits/marker-parser.js +0 -401
  114. package/dist/core/edits/security-gate.js +0 -223
  115. package/dist/core/edits/verify-hook.js +0 -273
  116. package/dist/core/edits/worktree.js +0 -322
  117. package/dist/core/engine/adapter-runner.js +0 -8
  118. package/dist/core/engine/anvil-client.js +0 -344
  119. package/dist/core/engine/auto-compact.js +0 -179
  120. package/dist/core/engine/budgets.js +0 -195
  121. package/dist/core/engine/context-prefix.js +0 -155
  122. package/dist/core/engine/index.js +0 -12
  123. package/dist/core/engine/intensity.js +0 -163
  124. package/dist/core/engine/intent.js +0 -260
  125. package/dist/core/engine/native-pugi.js +0 -1616
  126. package/dist/core/engine/noop.js +0 -27
  127. package/dist/core/engine/prompts.js +0 -236
  128. package/dist/core/engine/strip-internal-fields.js +0 -124
  129. package/dist/core/engine/tool-bridge.js +0 -2173
  130. package/dist/core/engine/verification-patterns.js +0 -195
  131. package/dist/core/evaluation/golden-dataset.js +0 -293
  132. package/dist/core/feedback/queue.js +0 -177
  133. package/dist/core/feedback/submitter.js +0 -145
  134. package/dist/core/file-cache.js +0 -141
  135. package/dist/core/flatten/flatten-repo.js +0 -439
  136. package/dist/core/format/osc8-link.js +0 -28
  137. package/dist/core/hook-chains.js +0 -392
  138. package/dist/core/hooks/citation-verify-hook.js +0 -138
  139. package/dist/core/hooks/citation-verify.js +0 -112
  140. package/dist/core/hooks/events.js +0 -46
  141. package/dist/core/hooks/index.js +0 -15
  142. package/dist/core/hooks/registry.js +0 -216
  143. package/dist/core/hooks/runner.js +0 -236
  144. package/dist/core/hooks/v2/event-emitter.js +0 -115
  145. package/dist/core/hooks/v2/executor.js +0 -282
  146. package/dist/core/hooks/v2/index.js +0 -25
  147. package/dist/core/hooks/v2/lifecycle.js +0 -104
  148. package/dist/core/hooks/v2/loader.js +0 -216
  149. package/dist/core/hooks/v2/matcher.js +0 -125
  150. package/dist/core/hooks/v2/trust.js +0 -143
  151. package/dist/core/hooks/v2/types.js +0 -86
  152. package/dist/core/hooks/worktree-events.js +0 -158
  153. package/dist/core/hooks.js +0 -415
  154. package/dist/core/image/renderer.js +0 -71
  155. package/dist/core/index-store.js +0 -260
  156. package/dist/core/init/detector.js +0 -582
  157. package/dist/core/init/template-renderer.js +0 -242
  158. package/dist/core/jobs/registry.js +0 -462
  159. package/dist/core/ledger/results-tsv.js +0 -142
  160. package/dist/core/log-discipline/stdout-redirect.js +0 -51
  161. package/dist/core/lsp/cache.js +0 -105
  162. package/dist/core/lsp/client.js +0 -1229
  163. package/dist/core/lsp/language-detect.js +0 -66
  164. package/dist/core/lsp/post-edit-diagnostics.js +0 -171
  165. package/dist/core/lsp/server-detect.js +0 -173
  166. package/dist/core/lsp/symbol-cache.js +0 -162
  167. package/dist/core/lsp/symbol-tools.js +0 -664
  168. package/dist/core/mcp/client.js +0 -385
  169. package/dist/core/mcp/http-server.js +0 -553
  170. package/dist/core/mcp/orchestrator-config.js +0 -192
  171. package/dist/core/mcp/orchestrator-tools.js +0 -806
  172. package/dist/core/mcp/permission.js +0 -190
  173. package/dist/core/mcp/registry.js +0 -193
  174. package/dist/core/mcp/server-tools.js +0 -219
  175. package/dist/core/mcp/server.js +0 -397
  176. package/dist/core/mcp/trust.js +0 -91
  177. package/dist/core/memory/dual-write.js +0 -416
  178. package/dist/core/memory/passive-extract.js +0 -130
  179. package/dist/core/memory/phase1-kinds.js +0 -20
  180. package/dist/core/memory/secret-scanner.js +0 -304
  181. package/dist/core/memory-sync/queue.js +0 -170
  182. package/dist/core/metrics/extract.js +0 -113
  183. package/dist/core/modes/roo-modes.js +0 -68
  184. package/dist/core/onboarding/ensure-initialized.js +0 -133
  185. package/dist/core/onboarding/marker.js +0 -111
  186. package/dist/core/onboarding/telemetry-state.js +0 -108
  187. package/dist/core/output-style/presets.js +0 -176
  188. package/dist/core/output-style/state.js +0 -185
  189. package/dist/core/path-security.js +0 -345
  190. package/dist/core/permission.js +0 -369
  191. package/dist/core/permissions/auto-classifier.js +0 -124
  192. package/dist/core/permissions/bash-parser.js +0 -371
  193. package/dist/core/permissions/circuit-breaker.js +0 -83
  194. package/dist/core/permissions/constrained-edit.js +0 -91
  195. package/dist/core/permissions/gate.js +0 -278
  196. package/dist/core/permissions/index.js +0 -20
  197. package/dist/core/permissions/mode.js +0 -174
  198. package/dist/core/permissions/network-egress.js +0 -137
  199. package/dist/core/permissions/state.js +0 -241
  200. package/dist/core/permissions/tool-class.js +0 -107
  201. package/dist/core/plan-mode/ui-state.js +0 -51
  202. package/dist/core/plans/plan-artifact.js +0 -721
  203. package/dist/core/policy-limits/etag-store.js +0 -122
  204. package/dist/core/prd-check/parser.js +0 -215
  205. package/dist/core/prd-check/reporter.js +0 -127
  206. package/dist/core/prd-check/session-review.js +0 -557
  207. package/dist/core/prd-check/verifiers.js +0 -223
  208. package/dist/core/prompt-cache/client-cache.js +0 -99
  209. package/dist/core/prompts/assembly.js +0 -29
  210. package/dist/core/prompts/registry.js +0 -364
  211. package/dist/core/pugi-gitignore.js +0 -52
  212. package/dist/core/pugi-md/cc-compat-rules.js +0 -735
  213. package/dist/core/pugi-md/context-injector.js +0 -76
  214. package/dist/core/pugi-md/walk-up.js +0 -207
  215. package/dist/core/python/uv-installer.js +0 -270
  216. package/dist/core/python/uv-resolver.js +0 -83
  217. package/dist/core/rate-limit/narrator.js +0 -146
  218. package/dist/core/recipes/cli-types.js +0 -20
  219. package/dist/core/recipes/loader.js +0 -103
  220. package/dist/core/recipes/runner.js +0 -345
  221. package/dist/core/recipes/schema.js +0 -587
  222. package/dist/core/release-notes/parser.js +0 -241
  223. package/dist/core/release-notes/state.js +0 -116
  224. package/dist/core/repl/ask.js +0 -512
  225. package/dist/core/repl/cancellation.js +0 -98
  226. package/dist/core/repl/cap-warning.js +0 -91
  227. package/dist/core/repl/clipboard-read.js +0 -174
  228. package/dist/core/repl/dispatch-fsm.js +0 -220
  229. package/dist/core/repl/engine-bridge.js +0 -303
  230. package/dist/core/repl/history-search.js +0 -175
  231. package/dist/core/repl/history.js +0 -182
  232. package/dist/core/repl/kill-ring.js +0 -138
  233. package/dist/core/repl/model-pricing.js +0 -135
  234. package/dist/core/repl/privacy-banner.js +0 -71
  235. package/dist/core/repl/session.js +0 -4962
  236. package/dist/core/repl/slash-commands.js +0 -747
  237. package/dist/core/repl/store/index.js +0 -12
  238. package/dist/core/repl/store/jsonl-log.js +0 -321
  239. package/dist/core/repl/store/lockfile.js +0 -155
  240. package/dist/core/repl/store/session-store.js +0 -821
  241. package/dist/core/repl/store/types.js +0 -44
  242. package/dist/core/repl/store/uuid-v7.js +0 -68
  243. package/dist/core/repl/tool-route.js +0 -382
  244. package/dist/core/repl/workspace-context.js +0 -206
  245. package/dist/core/repo-map/build.js +0 -125
  246. package/dist/core/repo-map/cache.js +0 -185
  247. package/dist/core/repo-map/extractor.js +0 -254
  248. package/dist/core/repo-map/formatter.js +0 -145
  249. package/dist/core/repo-map/page-rank.js +0 -105
  250. package/dist/core/repo-map/scanner.js +0 -211
  251. package/dist/core/retro/git-collector.js +0 -251
  252. package/dist/core/retro/health-card.js +0 -25
  253. package/dist/core/retro/metrics.js +0 -342
  254. package/dist/core/retro/narrative.js +0 -249
  255. package/dist/core/retro/plane-collector.js +0 -274
  256. package/dist/core/retro/pr-issue-link.js +0 -65
  257. package/dist/core/retro/types.js +0 -16
  258. package/dist/core/retry-budget/budget.js +0 -284
  259. package/dist/core/retry-budget/index.js +0 -5
  260. package/dist/core/retry-budget/retry-cap.js +0 -74
  261. package/dist/core/routing/lead-worker.js +0 -43
  262. package/dist/core/routing/pre-flight-estimator.js +0 -108
  263. package/dist/core/runs/run-tree.js +0 -103
  264. package/dist/core/sandboxing/adapter.js +0 -29
  265. package/dist/core/sandboxing/index.js +0 -49
  266. package/dist/core/sandboxing/none.js +0 -19
  267. package/dist/core/sandboxing/seatbelt.js +0 -183
  268. package/dist/core/security/injection-scanner.js +0 -367
  269. package/dist/core/security/output-filter.js +0 -418
  270. package/dist/core/session/env-file.js +0 -105
  271. package/dist/core/session/section-budgets.js +0 -140
  272. package/dist/core/session.js +0 -377
  273. package/dist/core/settings.js +0 -400
  274. package/dist/core/share/formatter.js +0 -271
  275. package/dist/core/share/redactor.js +0 -221
  276. package/dist/core/share/uploader.js +0 -267
  277. package/dist/core/skills/defaults.js +0 -457
  278. package/dist/core/skills/loader.js +0 -454
  279. package/dist/core/skills/sources.js +0 -480
  280. package/dist/core/skills/trust.js +0 -172
  281. package/dist/core/smoke/headless-driver.js +0 -174
  282. package/dist/core/smoke/orchestrator.js +0 -194
  283. package/dist/core/smoke/runner.js +0 -238
  284. package/dist/core/smoke/scenario-parser.js +0 -316
  285. package/dist/core/statusline.js +0 -99
  286. package/dist/core/subagents/dispatcher-real.js +0 -600
  287. package/dist/core/subagents/dispatcher.js +0 -352
  288. package/dist/core/subagents/index.js +0 -39
  289. package/dist/core/subagents/isolation-matrix.js +0 -213
  290. package/dist/core/subagents/spawn.js +0 -101
  291. package/dist/core/telemetry/emitter.js +0 -229
  292. package/dist/core/telemetry/queue.js +0 -251
  293. package/dist/core/theme/context.js +0 -91
  294. package/dist/core/theme/presets.js +0 -228
  295. package/dist/core/theme/state.js +0 -181
  296. package/dist/core/todos/invariant.js +0 -10
  297. package/dist/core/todos/state.js +0 -177
  298. package/dist/core/tool-schema/compressor.js +0 -89
  299. package/dist/core/transport/version-interceptor.js +0 -166
  300. package/dist/core/trust.js +0 -109
  301. package/dist/core/tui/thinking-block.js +0 -64
  302. package/dist/core/vim/keymap.js +0 -288
  303. package/dist/core/vim/state.js +0 -92
  304. package/dist/core/watch-markers/marker-watcher.js +0 -133
  305. package/dist/core/worktree/include-parser.js +0 -249
  306. package/dist/core/worktree-manager/cleanup.js +0 -123
  307. package/dist/core/worktree-manager/manager.js +0 -303
  308. package/dist/index.js +0 -44
  309. package/dist/runtime/bootstrap.js +0 -190
  310. package/dist/runtime/cli.js +0 -8121
  311. package/dist/runtime/commands/agents.js +0 -385
  312. package/dist/runtime/commands/budget.js +0 -192
  313. package/dist/runtime/commands/cancel.js +0 -231
  314. package/dist/runtime/commands/chain.js +0 -489
  315. package/dist/runtime/commands/codegraph-status.js +0 -227
  316. package/dist/runtime/commands/compact.js +0 -297
  317. package/dist/runtime/commands/config.js +0 -595
  318. package/dist/runtime/commands/cost.js +0 -199
  319. package/dist/runtime/commands/delegate.js +0 -312
  320. package/dist/runtime/commands/dispatch.js +0 -126
  321. package/dist/runtime/commands/doctor.js +0 -579
  322. package/dist/runtime/commands/feedback.js +0 -184
  323. package/dist/runtime/commands/hooks.js +0 -187
  324. package/dist/runtime/commands/init.js +0 -254
  325. package/dist/runtime/commands/lsp.js +0 -368
  326. package/dist/runtime/commands/mcp.js +0 -935
  327. package/dist/runtime/commands/memory.js +0 -582
  328. package/dist/runtime/commands/model.js +0 -237
  329. package/dist/runtime/commands/onboarding.js +0 -275
  330. package/dist/runtime/commands/patch.js +0 -128
  331. package/dist/runtime/commands/permissions.js +0 -112
  332. package/dist/runtime/commands/plan.js +0 -143
  333. package/dist/runtime/commands/prd-check.js +0 -285
  334. package/dist/runtime/commands/privacy.js +0 -107
  335. package/dist/runtime/commands/recipe.js +0 -325
  336. package/dist/runtime/commands/redo-blob-store.js +0 -92
  337. package/dist/runtime/commands/redo.js +0 -361
  338. package/dist/runtime/commands/release-notes.js +0 -229
  339. package/dist/runtime/commands/repo-map.js +0 -95
  340. package/dist/runtime/commands/report.js +0 -299
  341. package/dist/runtime/commands/resume.js +0 -118
  342. package/dist/runtime/commands/review-consensus.js +0 -414
  343. package/dist/runtime/commands/rewind.js +0 -333
  344. package/dist/runtime/commands/roster.js +0 -117
  345. package/dist/runtime/commands/sessions.js +0 -163
  346. package/dist/runtime/commands/share.js +0 -316
  347. package/dist/runtime/commands/skills.js +0 -401
  348. package/dist/runtime/commands/status.js +0 -186
  349. package/dist/runtime/commands/stickers.js +0 -82
  350. package/dist/runtime/commands/style.js +0 -194
  351. package/dist/runtime/commands/theme.js +0 -196
  352. package/dist/runtime/commands/undo.js +0 -361
  353. package/dist/runtime/commands/update.js +0 -289
  354. package/dist/runtime/commands/vim.js +0 -140
  355. package/dist/runtime/commands/worktree.js +0 -177
  356. package/dist/runtime/commands/worktrees.js +0 -155
  357. package/dist/runtime/deprecation-warning.js +0 -69
  358. package/dist/runtime/engine-exit-code.js +0 -50
  359. package/dist/runtime/headless-repl.js +0 -195
  360. package/dist/runtime/headless.js +0 -548
  361. package/dist/runtime/load-hooks-or-exit.js +0 -71
  362. package/dist/runtime/plan-decompose.js +0 -531
  363. package/dist/runtime/sigint-guard.js +0 -272
  364. package/dist/runtime/stream-renderer.js +0 -195
  365. package/dist/runtime/update-check.js +0 -294
  366. package/dist/runtime/version.js +0 -65
  367. package/dist/runtime/worktree-bootstrap.js +0 -579
  368. package/dist/skills/bundled/batch.js +0 -617
  369. package/dist/skills/bundled/index.js +0 -45
  370. package/dist/skills/bundled/loop.js +0 -358
  371. package/dist/skills/bundled/remember.js +0 -383
  372. package/dist/skills/bundled/simplify.js +0 -289
  373. package/dist/skills/bundled/skillify.js +0 -373
  374. package/dist/skills/bundled/stuck.js +0 -558
  375. package/dist/skills/bundled/verify.js +0 -439
  376. package/dist/testing/vcr.js +0 -486
  377. package/dist/tools/agent-tool.js +0 -229
  378. package/dist/tools/apply-patch.js +0 -556
  379. package/dist/tools/ask-user-question.js +0 -337
  380. package/dist/tools/ask-user.js +0 -115
  381. package/dist/tools/bash.js +0 -1238
  382. package/dist/tools/brief.js +0 -224
  383. package/dist/tools/cron.js +0 -433
  384. package/dist/tools/enter-worktree.js +0 -250
  385. package/dist/tools/exit-worktree.js +0 -147
  386. package/dist/tools/file-tools.js +0 -553
  387. package/dist/tools/http-request.js +0 -336
  388. package/dist/tools/lsp-tools.js +0 -565
  389. package/dist/tools/mcp-tool.js +0 -260
  390. package/dist/tools/multi-edit.js +0 -361
  391. package/dist/tools/powershell.js +0 -268
  392. package/dist/tools/registry.js +0 -166
  393. package/dist/tools/server-tools.js +0 -892
  394. package/dist/tools/skill-tool.js +0 -96
  395. package/dist/tools/sleep.js +0 -99
  396. package/dist/tools/synthetic-output.js +0 -133
  397. package/dist/tools/tasks.js +0 -208
  398. package/dist/tools/todo-write.js +0 -184
  399. package/dist/tools/verify-plan-execution.js +0 -295
  400. package/dist/tools/web-fetch-injection-scanner.js +0 -207
  401. package/dist/tools/web-fetch.js +0 -720
  402. package/dist/tools/web-search.js +0 -458
  403. package/dist/tui/agent-progress-card.js +0 -111
  404. package/dist/tui/agent-tree-pane.js +0 -9
  405. package/dist/tui/agent-tree.js +0 -87
  406. package/dist/tui/ask-cli.js +0 -52
  407. package/dist/tui/ask-modal.js +0 -211
  408. package/dist/tui/ask-user-question-chips.js +0 -315
  409. package/dist/tui/ask-user-question-prompt.js +0 -203
  410. package/dist/tui/compact-banner.js +0 -81
  411. package/dist/tui/conversation-pane.js +0 -164
  412. package/dist/tui/cost-table.js +0 -111
  413. package/dist/tui/device-flow.js +0 -142
  414. package/dist/tui/doctor-table.js +0 -46
  415. package/dist/tui/feedback-prompt.js +0 -156
  416. package/dist/tui/input-box.js +0 -732
  417. package/dist/tui/login-picker.js +0 -69
  418. package/dist/tui/markdown-render.js +0 -266
  419. package/dist/tui/multi-file-diff-approval.js +0 -375
  420. package/dist/tui/onboarding-wizard.js +0 -240
  421. package/dist/tui/permissions-picker.js +0 -86
  422. package/dist/tui/render.js +0 -160
  423. package/dist/tui/repl-render.js +0 -770
  424. package/dist/tui/repl-splash-art.js +0 -64
  425. package/dist/tui/repl-splash-mascot.js +0 -154
  426. package/dist/tui/repl-splash.js +0 -117
  427. package/dist/tui/repl.js +0 -378
  428. package/dist/tui/slash-palette.js +0 -106
  429. package/dist/tui/splash-data.js +0 -61
  430. package/dist/tui/splash.js +0 -31
  431. package/dist/tui/status-bar.js +0 -209
  432. package/dist/tui/status-table.js +0 -7
  433. package/dist/tui/stickers-art.js +0 -136
  434. package/dist/tui/style-table.js +0 -28
  435. package/dist/tui/theme-table.js +0 -29
  436. package/dist/tui/thinking-spinner.js +0 -123
  437. package/dist/tui/tool-stream-pane.js +0 -140
  438. package/dist/tui/update-banner.js +0 -33
  439. package/dist/tui/vim-input.js +0 -267
  440. package/dist/tui/welcome-banner.js +0 -107
  441. package/dist/tui/welcome-data.js +0 -293
  442. package/dist/tui/workspace-context.js +0 -105
  443. package/docs/examples/codegraph.mcp.json +0 -10
  444. package/test/scenarios/codegen-create-file.scenario.txt +0 -13
  445. package/test/scenarios/compact-force.scenario.txt +0 -12
  446. package/test/scenarios/identity.scenario.txt +0 -11
  447. package/test/scenarios/persona-handoff.scenario.txt +0 -12
  448. package/test/scenarios/walkback.scenario.txt +0 -12
@@ -1,304 +0,0 @@
1
- /**
2
- * Persona-memory secret scanner (backlog, hardening).
3
- *
4
- * Defense against API keys / credentials accidentally landing in shared
5
- * persona memory. A naive operator typing `pugi memory write fact "Use
6
- * API key sk-ant-..."` would silently persist that secret to the
7
- * `the platform database.persona_memory` table — visible to every persona, every
8
- * recall query, every dual-write sink. This module is the chokepoint
9
- * that refuses such writes.
10
- *
11
- * # Scope
12
- *
13
- * Scoped to the persona-memory write surface (`pugi memory write` and
14
- * the `pugi remember` curator's `defaultPersist`). NOT a global secret
15
- * scanner — the tarball pre-publish gate
16
- * (`apps/pugi-cli/scripts/secret-scanner.mjs`) covers npm publish, and
17
- * gitleaks covers git history. The two scanners share the pattern
18
- * vocabulary but live at different boundaries; do NOT consolidate
19
- * without re-validating each call site.
20
- *
21
- * # Patterns shipped
22
- *
23
- * 1. Anthropic key sk-ant-… high
24
- * 2. Generic OpenAI-style sk-… high
25
- * 3. GitHub PAT / installation tokens (ghp_/ghs_/gho_/ghu_)
26
- * high
27
- * 4. AWS access key id AKIA… high
28
- * 5. Plane API token plane_api_… high [pugi-leak-ok]
29
- * 6. npm token npm_… high
30
- * 7. Slack token xox[bpoars]-… high
31
- * 8. Stripe secret key sk_(live|test)_… high
32
- * 9. JWT-shaped token eyJ…\.…\.… medium
33
- * 10. Generic Bearer header Bearer <opaque> medium
34
- * 11. Private-key PEM header -----BEGIN … PRIVATE… high
35
- * 12. Pugi internal Anvil key anvil_… / sk_anvil_… high
36
- *
37
- * Each rule names its pattern; matches are surfaced by `pattern` name
38
- * so the operator can map the rejection back to a credential type.
39
- *
40
- * # Confidence levels
41
- *
42
- * `high` — the regex is prefix-anchored to a vendor-issued shape that
43
- * is rare in normal English text (e.g. `sk-ant-`, `AKIA`, `ghp_`). A
44
- * single match is enough to reject.
45
- *
46
- * `medium` — the regex is structural (JWT, Bearer, hex blob). False
47
- * positives ARE possible. Default behaviour rejects on medium matches
48
- * too (security-first), but operators can downgrade to high-only via
49
- * the `PUGI_MEMORY_SECRET_STRICT=0` opt-out — see `scanForSecrets`'s
50
- * `strict` option.
51
- *
52
- * # Opt-outs
53
- *
54
- * - `PUGI_MEMORY_SECRET_SCAN_DISABLE=1` bypass entirely (tests).
55
- * - `PUGI_MEMORY_SECRET_STRICT=0` ignore medium-confidence
56
- * matches (still rejects
57
- * on high).
58
- * - `--allow-redacted` flag (handled by caller) opts into auto-redact
59
- * instead of reject. The scanner exposes `redactSecrets` for that
60
- * caller — see `runtime/commands/memory.ts`.
61
- *
62
- * # independent implementation provenance
63
- *
64
- * Inspired by the the upstream tool teamMemorySync.secretScanner pattern
65
- * (intel from leak-research memos). independent implementation TypeScript
66
- * implementation — no upstream code reused. Pattern vocabulary was
67
- * cross-referenced against the existing
68
- * `apps/pugi-cli/scripts/secret-scanner.mjs` tarball gate so a single
69
- * vendor (AWS, GitHub, etc.) is handled the same way in both surfaces.
70
- */
71
- /**
72
- * Pattern registry. Each regex is anchored with a non-capturing
73
- * boundary and uses bounded quantifiers — no `.*` and no nested
74
- * alternations that would invite catastrophic backtracking.
75
- *
76
- * NOTE: regexes are constructed with the `g` flag here because
77
- * `String.prototype.matchAll` requires it. The scanner clones each
78
- * regex before iterating so concurrent calls do not share `lastIndex`.
79
- */
80
- const SECRET_RULES = [
81
- {
82
- pattern: 'anthropic-api-key',
83
- // sk-ant- followed by 40+ url-safe chars. Anthropic keys are
84
- // typically 95+ chars; production keys can run 200+ chars. The
85
- // greedy `{40,}` plus a negative lookahead terminates cleanly on
86
- // any length without an upper bound that would silently miss
87
- // longer keys (Claude reviewer P1).
88
- regex: /\bsk-ant-[A-Za-z0-9_-]{40,}(?![A-Za-z0-9_-])/g,
89
- confidence: 'high',
90
- },
91
- {
92
- pattern: 'openai-project-key',
93
- // OpenAI project keys (`sk-proj-…`) include hyphens/underscores
94
- // in the tail, so the legacy alphanumeric class would silently
95
- // miss them. Anchored to the literal `sk-proj-` prefix and
96
- // terminated via lookahead so length never caps detection.
97
- regex: /\bsk-proj-[A-Za-z0-9_-]{40,}(?![A-Za-z0-9_-])/g,
98
- confidence: 'high',
99
- },
100
- {
101
- pattern: 'openai-sk-key',
102
- // OpenAI legacy "sk-" + 32+ alphanumeric. We anchor with a word
103
- // boundary so prose like "the SK-Mafia" can't collide. The lower
104
- // bound is 20 to align with the spec; OpenAI in practice issues
105
- // 48-char keys. Lookahead-terminated so length cannot cap us out.
106
- regex: /\bsk-[A-Za-z0-9]{20,}(?![A-Za-z0-9])/g,
107
- confidence: 'high',
108
- },
109
- {
110
- pattern: 'github-token',
111
- // ghp_ / ghs_ / gho_ / ghu_ + exactly 36 base62 chars (vendor
112
- // doc'd shape).
113
- regex: /\bgh[psou]_[A-Za-z0-9]{36}\b/g,
114
- confidence: 'high',
115
- },
116
- {
117
- pattern: 'aws-access-key-id',
118
- // 16 uppercase alphanumerics after `AKIA` — vendor format. Word
119
- // boundary keeps `MAKIAYZX...` (unlikely but possible) out.
120
- regex: /\bAKIA[0-9A-Z]{16}\b/g,
121
- confidence: 'high',
122
- },
123
- {
124
- pattern: 'plane-api-token',
125
- // Plane (project management) personal API tokens. Bounded to 20+
126
- // url-safe chars after the prefix.
127
- regex: /\bplane_api_[A-Za-z0-9]{20,}(?![A-Za-z0-9])/g, // [pugi-leak-ok]
128
- confidence: 'high',
129
- },
130
- {
131
- pattern: 'npm-token',
132
- // npm_ + 36 base62 chars (vendor format).
133
- regex: /\bnpm_[A-Za-z0-9]{36}\b/g,
134
- confidence: 'high',
135
- },
136
- {
137
- pattern: 'slack-token',
138
- // xoxb / xoxp / xoxo / xoxa / xoxr / xoxs. Slack tokens are
139
- // hyphen-segmented; we bound the trailing segment length to dodge
140
- // `.*`-style backtracking.
141
- regex: /\bxox[bpoars]-[A-Za-z0-9-]{10,}(?![A-Za-z0-9-])/g,
142
- confidence: 'high',
143
- },
144
- {
145
- pattern: 'stripe-key',
146
- // sk_live_ / sk_test_ + 24+ base62 chars.
147
- regex: /\bsk_(?:live|test)_[A-Za-z0-9]{24,}(?![A-Za-z0-9])/g,
148
- confidence: 'high',
149
- },
150
- {
151
- pattern: 'private-key-pem',
152
- // PEM block headers — RSA / OPENSSH / EC / DSA / PGP. Anchored
153
- // alternation, no nested quantifiers.
154
- regex: /-----BEGIN (?:RSA|OPENSSH|EC|DSA|PGP) PRIVATE KEY-----/g,
155
- confidence: 'high',
156
- },
157
- {
158
- pattern: 'anvil-api-key',
159
- // Pugi-internal Anvil keys — both the legacy and scoped shapes.
160
- regex: /\b(?:sk_)?anvil_[A-Za-z0-9_-]{16,}(?![A-Za-z0-9_-])/g,
161
- confidence: 'high',
162
- },
163
- {
164
- pattern: 'jwt-token',
165
- // Three base64url segments separated by `.`. The 20-char lower
166
- // bound per segment dodges the "u.s.a" trap; real JWTs have
167
- // headers like `eyJhbGciOi…` which are well above this floor.
168
- regex: /\beyJ[A-Za-z0-9_-]{18,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\b/g,
169
- confidence: 'medium',
170
- },
171
- {
172
- pattern: 'bearer-token',
173
- // Authorization-header shape with an opaque 20+ char tail.
174
- // Case-insensitive `Bearer` keyword. Bounded tail to avoid
175
- // matching whole prose paragraphs.
176
- regex: /\b[Bb]earer\s+[A-Za-z0-9_.~+/=-]{20,200}\b/g,
177
- confidence: 'medium',
178
- },
179
- ];
180
- /** Resolve the strict-mode setting (env-first, opt-out via "0" / "false"). */
181
- function resolveStrict(opt) {
182
- if (typeof opt === 'boolean')
183
- return opt;
184
- const raw = process.env.PUGI_MEMORY_SECRET_STRICT;
185
- if (raw === undefined)
186
- return true;
187
- const lowered = raw.trim().toLowerCase();
188
- return !(lowered === '0' || lowered === 'false' || lowered === 'no');
189
- }
190
- /** Predicate — is the scanner currently disabled via env? */
191
- export function isScanDisabled() {
192
- const raw = process.env.PUGI_MEMORY_SECRET_SCAN_DISABLE;
193
- if (raw === undefined)
194
- return false;
195
- const lowered = raw.trim().toLowerCase();
196
- return lowered === '1' || lowered === 'true' || lowered === 'yes';
197
- }
198
- /** Compute 1-based line number for a byte offset. */
199
- function lineNumberFor(text, offset) {
200
- let line = 1;
201
- for (let i = 0; i < offset && i < text.length; i += 1) {
202
- if (text.charCodeAt(i) === 10)
203
- line += 1;
204
- }
205
- return line;
206
- }
207
- /**
208
- * Scan `text` for secret patterns. Returns one `SecretMatch` per hit,
209
- * in occurrence order. Empty array means clean.
210
- *
211
- * The function is pure — it does NOT read env outside of resolving the
212
- * strict-mode default for `options.strict`. Callers that need a fully
213
- * deterministic invocation should pass `options.strict` explicitly.
214
- */
215
- export function scanForSecrets(text, options) {
216
- if (text.length === 0)
217
- return [];
218
- const strict = resolveStrict(options?.strict);
219
- const out = [];
220
- for (const rule of SECRET_RULES) {
221
- if (!strict && rule.confidence === 'medium')
222
- continue;
223
- // Clone the regex per-rule so concurrent scans (e.g. parallel
224
- // tests) don't share `lastIndex`. This also defends against
225
- // accidental mutation if a future rule forgets the `g` flag.
226
- const rx = new RegExp(rule.regex.source, rule.regex.flags);
227
- for (const m of text.matchAll(rx)) {
228
- if (m.index === undefined)
229
- continue;
230
- out.push({
231
- pattern: rule.pattern,
232
- match: m[0],
233
- offset: m.index,
234
- lineNumber: lineNumberFor(text, m.index),
235
- confidence: rule.confidence,
236
- });
237
- }
238
- }
239
- // Sort by offset so callers see a left-to-right walk of the input
240
- // even when multiple rules fired in different orders.
241
- out.sort((a, b) => a.offset - b.offset);
242
- return out;
243
- }
244
- /**
245
- * Replace every detected secret with a `[SECRET:<pattern>]` placeholder
246
- * and return both the redacted text and the original match list. The
247
- * pattern name is included in the placeholder so the operator can see
248
- * what category was scrubbed.
249
- *
250
- * Redaction respects the same strict-mode resolution as `scanForSecrets`.
251
- */
252
- export function redactSecrets(text, options) {
253
- const matches = scanForSecrets(text, options);
254
- if (matches.length === 0)
255
- return { redacted: text, matches };
256
- // Walk right-to-left so earlier offsets stay valid as we splice.
257
- let redacted = text;
258
- for (let i = matches.length - 1; i >= 0; i -= 1) {
259
- const m = matches[i];
260
- if (m === undefined)
261
- continue;
262
- const before = redacted.slice(0, m.offset);
263
- const after = redacted.slice(m.offset + m.match.length);
264
- redacted = `${before}[SECRET:${m.pattern}]${after}`;
265
- }
266
- return { redacted, matches };
267
- }
268
- /**
269
- * Hard guard for memory write entry points. Throws a
270
- * `MemorySecretGuardError` on any non-empty match set (after the env
271
- * disable check). Caller side handles the `--allow-redacted` flow by
272
- * calling `redactSecrets` directly.
273
- *
274
- * Returns the (unchanged) input string when the scan is clean — lets
275
- * the call site stay one-liner: `content = assertNoSecrets(content)`.
276
- */
277
- export function assertNoSecrets(text, options) {
278
- if (isScanDisabled())
279
- return text;
280
- const matches = scanForSecrets(text, options);
281
- if (matches.length === 0)
282
- return text;
283
- throw new MemorySecretGuardError(matches);
284
- }
285
- /**
286
- * Thrown when memory content would persist a credential. The error
287
- * carries the structured match list so the CLI can render an
288
- * actionable message (pattern names + line numbers) without
289
- * re-leaking the secrets back into the operator's terminal.
290
- */
291
- export class MemorySecretGuardError extends Error {
292
- matches;
293
- constructor(matches) {
294
- const names = Array.from(new Set(matches.map((m) => m.pattern))).join(', ');
295
- super(`pugi memory: refused to persist content containing secret(s) — pattern(s): ${names}. ` +
296
- `Set PUGI_MEMORY_SECRET_SCAN_DISABLE=1 to bypass, or rewrite the content. ` +
297
- `Use \`pugi memory write --allow-redacted\` to auto-scrub.`);
298
- this.name = 'MemorySecretGuardError';
299
- this.matches = matches;
300
- }
301
- }
302
- /** Stable export for tests + integration call sites. */
303
- export const SECRET_PATTERN_NAMES = SECRET_RULES.map((r) => r.pattern);
304
- //# sourceMappingURL=secret-scanner.js.map
@@ -1,170 +0,0 @@
1
- /**
2
- * Pugi memory sync queue .
3
- *
4
- * Local pending-write queue for `pugi memory` commands when the
5
- * operator is offline or the admin-api is unreachable. Each pending
6
- * mutation lands on disk as one JSONL line; `pugi memory sync` reads
7
- * the queue, fires them to the admin-api in order, and rewrites the
8
- * file with only the entries that still failed.
9
- *
10
- * Storage:
11
- *
12
- * ~/.pugi/memory-queue.jsonl (mode 0600)
13
- *
14
- * Each line is a fully-typed `PendingMemoryOperation` envelope. The
15
- * envelope is forward-compatible: an older CLI reading a JSONL file
16
- * written by a newer CLI silently skips lines whose `op` field is
17
- * not in its known set (so a partial-rollback scenario doesn't crash
18
- * the queue).
19
- *
20
- * Design intent:
21
- * - Append-only on disk for the hot path (`pugi memory write` /
22
- * `pugi memory forget` queue when offline). Rewrites only on
23
- * successful sync.
24
- * - One file per operator (PUGI_HOME-aware). Queue is local to the
25
- * machine — no cross-host coordination. Multi-device sync is
26
- * deferred to Phase 6 (server-side outbox).
27
- * - No fsync / atomic rename ceremony in v1 — best effort. The
28
- * queue is a convenience surface, not a durability primitive;
29
- * the source of truth is the admin-api row.
30
- */
31
- import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync, } from 'node:fs';
32
- import { homedir } from 'node:os';
33
- import { dirname, resolve } from 'node:path';
34
- import { z } from 'zod';
35
- import { assertNoSecrets } from '../memory/secret-scanner.js';
36
- /** Six canonical kinds — must mirror `apps/admin-api/src/persona-memory/persona-memory.types.ts`. */
37
- export const PERSONA_MEMORY_KINDS = [
38
- 'pattern',
39
- 'preference',
40
- 'architecture',
41
- 'bug',
42
- 'workflow',
43
- 'fact',
44
- ];
45
- const writeOpSchema = z.object({
46
- op: z.literal('write'),
47
- enqueuedAt: z.string().datetime(),
48
- personaSlug: z.string().min(1).max(64),
49
- kind: z.enum(PERSONA_MEMORY_KINDS),
50
- content: z.string().min(1).max(4000),
51
- forgetAfter: z.string().datetime().nullable().optional(),
52
- });
53
- const forgetOpSchema = z.object({
54
- op: z.literal('forget'),
55
- enqueuedAt: z.string().datetime(),
56
- id: z.string().min(1),
57
- });
58
- const pendingMemoryOpSchema = z.discriminatedUnion('op', [
59
- writeOpSchema,
60
- forgetOpSchema,
61
- ]);
62
- /** Default storage path. Override via `PUGI_HOME` for tests / multi-account. */
63
- export function defaultQueuePath() {
64
- const root = process.env.PUGI_HOME ?? resolve(homedir(), '.pugi');
65
- return resolve(root, 'memory-queue.jsonl');
66
- }
67
- /**
68
- * Append one pending operation to the queue file. Creates the parent
69
- * directory + file with mode 0600 if missing. Pure-disk, no network.
70
- *
71
- * Returns the count of pending ops after the append (1-based) so the
72
- * CLI command can render "queued (3 pending) — run `pugi memory sync`".
73
- */
74
- export function enqueueMemoryOp(op, pathOverride) {
75
- const fullOp = {
76
- ...op,
77
- enqueuedAt: new Date().toISOString(),
78
- };
79
- pendingMemoryOpSchema.parse(fullOp);
80
- // Backlog (P1 security hardening): refuse to enqueue any write
81
- // whose `content` matches a known secret shape (sk-ant-, ghp_, AKIA…
82
- // etc). `assertNoSecrets` throws `MemorySecretGuardError` carrying
83
- // the matched pattern list, which the CLI catches and renders
84
- // without re-leaking the value back to the operator. The opt-out
85
- // env (`PUGI_MEMORY_SECRET_SCAN_DISABLE=1`) is honoured inside
86
- // `assertNoSecrets` so tests + emergency overrides have a knob.
87
- // `forget` ops carry only an id, so they bypass the scan.
88
- if (fullOp.op === 'write') {
89
- assertNoSecrets(fullOp.content);
90
- }
91
- const queuePath = pathOverride ?? defaultQueuePath();
92
- ensureQueueFile(queuePath);
93
- const existing = readFileSync(queuePath, 'utf-8');
94
- const line = `${JSON.stringify(fullOp)}\n`;
95
- writeFileSync(queuePath, `${existing}${line}`, { encoding: 'utf-8', mode: 0o600 });
96
- // Best-effort chmod (in case the file existed already at the wrong mode).
97
- try {
98
- chmodSync(queuePath, 0o600);
99
- }
100
- catch {
101
- // ignore — the file was just written above, mode might be platform-dependent.
102
- }
103
- return countPending(queuePath);
104
- }
105
- /** Read the queue file and return parsed entries. Skips unknown / malformed lines. */
106
- export function readMemoryQueue(pathOverride) {
107
- const queuePath = pathOverride ?? defaultQueuePath();
108
- if (!existsSync(queuePath))
109
- return [];
110
- const raw = readFileSync(queuePath, 'utf-8');
111
- const out = [];
112
- for (const line of raw.split(/\r?\n/)) {
113
- const trimmed = line.trim();
114
- if (!trimmed)
115
- continue;
116
- try {
117
- const parsed = pendingMemoryOpSchema.parse(JSON.parse(trimmed));
118
- out.push(parsed);
119
- }
120
- catch {
121
- // forward-compat: a future op kind we don't recognise should not
122
- // crash the queue; just drop the line during this read.
123
- continue;
124
- }
125
- }
126
- return out;
127
- }
128
- /** Rewrite the queue file with `remaining` entries only. Empty array clears the file. */
129
- export function rewriteMemoryQueue(remaining, pathOverride) {
130
- const queuePath = pathOverride ?? defaultQueuePath();
131
- ensureQueueFile(queuePath);
132
- if (remaining.length === 0) {
133
- writeFileSync(queuePath, '', { encoding: 'utf-8', mode: 0o600 });
134
- return;
135
- }
136
- const body = remaining.map((op) => JSON.stringify(op)).join('\n') + '\n';
137
- writeFileSync(queuePath, body, { encoding: 'utf-8', mode: 0o600 });
138
- }
139
- /** Count pending ops without re-parsing every line individually for the typed shape. */
140
- export function countPending(pathOverride) {
141
- const queuePath = pathOverride ?? defaultQueuePath();
142
- if (!existsSync(queuePath))
143
- return 0;
144
- const raw = readFileSync(queuePath, 'utf-8');
145
- let n = 0;
146
- for (const line of raw.split(/\r?\n/)) {
147
- if (line.trim().length > 0)
148
- n++;
149
- }
150
- return n;
151
- }
152
- /** Quick predicate — was anything ever queued? */
153
- export function hasPendingOps(pathOverride) {
154
- return countPending(pathOverride) > 0;
155
- }
156
- function ensureQueueFile(queuePath) {
157
- const dir = dirname(queuePath);
158
- if (!existsSync(dir))
159
- mkdirSync(dir, { recursive: true, mode: 0o700 });
160
- if (!existsSync(queuePath)) {
161
- writeFileSync(queuePath, '', { encoding: 'utf-8', mode: 0o600 });
162
- try {
163
- chmodSync(queuePath, 0o600);
164
- }
165
- catch {
166
- // ignore
167
- }
168
- }
169
- }
170
- //# sourceMappingURL=queue.js.map
@@ -1,113 +0,0 @@
1
- /**
2
- * Metric extraction primitive (task P1).
3
- *
4
- * Scans a log buffer line by line for named regex patterns and emits one
5
- * `ExtractedMetric` per match. Used by the pugi_eval harness to lift
6
- * karpathy-style flat log lines (e.g. `e2e: total=51 pass=45 fail=6
7
- * dur=170.48s`) into structured measurements without committing to a
8
- * full log-parser dependency.
9
- *
10
- * Contract:
11
- * - Every supplied pattern MUST contain a numeric capture group 1.
12
- * Patterns lacking a capture group throw a clear error rather than
13
- * silently emitting NaN — a missing group is a programming bug, not
14
- * a data condition.
15
- * - Lines that don't match are skipped, not reported. Callers that
16
- * need per-line trace coverage should layer their own scanner.
17
- * - Each match emits a fresh ISO-8601 timestamp via `new Date()`. The
18
- * timestamp reflects extraction time, not the moment the log line
19
- * was produced — log producers that need true event time should
20
- * embed it themselves and pattern it out.
21
- * - Regex `lastIndex` state is not relied upon: we test each line as
22
- * a self-contained string. Patterns may be sticky or global without
23
- * affecting correctness.
24
- */
25
- /**
26
- * Scan `logText` for each named pattern and emit one metric per match.
27
- *
28
- * Output order: outer loop over the patterns map insertion order, inner
29
- * loop over lines in source order. So all `pugi_score` hits arrive
30
- * before all `tokens_in` hits when both patterns fire on the same
31
- * buffer. Tests rely on this stable ordering; do not switch to a
32
- * line-major loop without updating the spec.
33
- */
34
- export function extractMetrics(logText, patterns) {
35
- const lines = logText.split(/\r?\n/);
36
- const out = [];
37
- for (const [name, pattern] of Object.entries(patterns)) {
38
- assertHasCaptureGroup(name, pattern);
39
- for (let i = 0; i < lines.length; i += 1) {
40
- const line = lines[i] ?? '';
41
- const match = line.match(pattern);
42
- if (!match)
43
- continue;
44
- const raw = match[1];
45
- if (raw === undefined)
46
- continue;
47
- const value = parseFloat(raw);
48
- if (!Number.isFinite(value))
49
- continue;
50
- out.push({
51
- name,
52
- value,
53
- ts: new Date().toISOString(),
54
- line: i + 1,
55
- });
56
- }
57
- }
58
- return out;
59
- }
60
- /**
61
- * Common pugi_eval log patterns. Case-insensitive on the metric key so
62
- * `Pugi_Score`, `PUGI_SCORE`, and `pugi_score` all match — karpathy-style
63
- * harness output varies. The numeric capture group is always group 1.
64
- *
65
- * Separator class `[:\s=]+` accepts `key: value`, `key=value`, and
66
- * `key value` shapes. Numeric class `[0-9.]+` is liberal enough for
67
- * scientific-notation-free floats; exotic encodings (1e6, NaN, hex)
68
- * are not in scope — pugi_eval emits decimal-only.
69
- */
70
- export const DEFAULT_PATTERNS = {
71
- pugi_score: /pugi_score[:\s=]+([0-9.]+)/i,
72
- tokens_in: /tokens.in[:\s=]+([0-9]+)/i,
73
- tokens_out: /tokens.out[:\s=]+([0-9]+)/i,
74
- wall_clock_sec: /wall.clock.*?([0-9.]+)\s*s(?:ec)?/i,
75
- dur: /dur[:\s=]+([0-9.]+)/i,
76
- pass: /pass[:\s=]+([0-9]+)/i,
77
- fail: /fail[:\s=]+([0-9]+)/i,
78
- };
79
- /**
80
- * Validate that `pattern` has at least one capture group by probing the
81
- * regex source. Throws a clear `Error` rather than letting `match[1]`
82
- * silently return `undefined` at every line — a missing group is a
83
- * programmer error and we want it loud on first call.
84
- *
85
- * Detection is heuristic but conservative: counts `(` characters that
86
- * are not preceded by `\` and not opening a `(?:` non-capturing group
87
- * or `(?=` / `(?!` lookaround. Good enough for the patterns we ship;
88
- * patterns that fool the heuristic will still be caught by the runtime
89
- * `parseFloat(undefined) → NaN` skip — they just won't emit metrics.
90
- */
91
- function assertHasCaptureGroup(name, pattern) {
92
- const src = pattern.source;
93
- let depth = 0;
94
- for (let i = 0; i < src.length; i += 1) {
95
- const ch = src[i];
96
- if (ch === '\\') {
97
- i += 1;
98
- continue;
99
- }
100
- if (ch !== '(')
101
- continue;
102
- const next = src[i + 1];
103
- const next2 = src[i + 2];
104
- if (next === '?' && (next2 === ':' || next2 === '=' || next2 === '!' || next2 === '<')) {
105
- continue;
106
- }
107
- depth += 1;
108
- }
109
- if (depth === 0) {
110
- throw new Error(`extractMetrics: pattern "${name}" has no capture group; add (...) around the numeric value`);
111
- }
112
- }
113
- //# sourceMappingURL=extract.js.map
@@ -1,68 +0,0 @@
1
- /**
2
- * @file Defines the operational modes for the Roo agent, controlling tool access and behavior.
3
- */
4
- export const MODES = {
5
- architect: {
6
- name: 'architect',
7
- description: 'Researches and proposes solutions, but does not implement them.',
8
- allowed_groups: ['read', 'web', 'memory'],
9
- system_prompt_addendum: 'You are an architect. Read + propose. Do not edit.',
10
- },
11
- code: {
12
- name: 'code',
13
- description: 'Implements code changes as specified.',
14
- allowed_groups: ['read', 'edit', 'bash', 'web', 'mcp', 'memory'],
15
- system_prompt_addendum: 'Implement как specified.',
16
- },
17
- ask: {
18
- name: 'ask',
19
- description: 'Answers questions about the codebase without making changes.',
20
- allowed_groups: ['read', 'web', 'memory'],
21
- system_prompt_addendum: 'Answer questions. Do not modify state.',
22
- },
23
- debug: {
24
- name: 'debug',
25
- description: 'Investigates issues and can run commands, but requires approval for edits.',
26
- allowed_groups: ['read', 'bash', 'web', 'memory'],
27
- system_prompt_addendum: 'Investigate root cause. Edit only after explicit user approval.',
28
- },
29
- orchestrator: {
30
- name: 'orchestrator',
31
- description: 'Coordinates sub-agents to accomplish complex tasks.',
32
- allowed_groups: ['read', 'web', 'agent_spawn', 'memory'],
33
- system_prompt_addendum: 'Coordinate sub-agents. Delegate edits.',
34
- },
35
- };
36
- /**
37
- * Checks if a specific tool is allowed in a given agent mode.
38
- *
39
- * @param mode The current mode of the agent.
40
- * @param tool The name of the tool being checked.
41
- * @param group The tool group the tool belongs to.
42
- * @returns True if the tool is allowed, false otherwise.
43
- */
44
- export function isToolAllowed(mode, tool, group) {
45
- const modeDef = MODES[mode];
46
- if (!modeDef) {
47
- return false;
48
- }
49
- const groupAllowed = modeDef.allowed_groups.includes(group);
50
- if (!groupAllowed) {
51
- return false;
52
- }
53
- const toolDenied = modeDef.denied_tools?.includes(tool) ?? false;
54
- if (toolDenied) {
55
- return false;
56
- }
57
- return true;
58
- }
59
- /**
60
- * Retrieves the system prompt addendum for a given mode.
61
- *
62
- * @param mode The current mode of the agent.
63
- * @returns The system prompt addendum string, or an empty string if none is defined.
64
- */
65
- export function getModeAddendum(mode) {
66
- return MODES[mode]?.system_prompt_addendum ?? '';
67
- }
68
- //# sourceMappingURL=roo-modes.js.map