@agentwhy/cli 0.0.0-dev

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 (400) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +2 -0
  3. package/README.md +181 -0
  4. package/THIRD_PARTY_NOTICES.md +31 -0
  5. package/dist/adapter/claude-code/contract/assumptions.js +208 -0
  6. package/dist/adapter/claude-code/contract/denials.js +15 -0
  7. package/dist/adapter/claude-code/contract/entry-points.js +15 -0
  8. package/dist/adapter/claude-code/contract/fields.js +73 -0
  9. package/dist/adapter/claude-code/contract/hooks.js +96 -0
  10. package/dist/adapter/claude-code/contract/identifiers.js +15 -0
  11. package/dist/adapter/claude-code/contract/layout.js +29 -0
  12. package/dist/adapter/claude-code/contract/line-types.js +26 -0
  13. package/dist/adapter/claude-code/contract/projects.js +23 -0
  14. package/dist/adapter/claude-code/contract/recognition.js +14 -0
  15. package/dist/adapter/claude-code/contract/session-title.js +20 -0
  16. package/dist/adapter/claude-code/contract/settings.js +27 -0
  17. package/dist/adapter/claude-code/contract/task-notifications.js +33 -0
  18. package/dist/adapter/claude-code/contract/tools.js +37 -0
  19. package/dist/adapter/claude-code/contract/version.js +51 -0
  20. package/dist/adapter/claude-code/discovery/claude-code-project-catalogue.js +129 -0
  21. package/dist/adapter/claude-code/discovery/claude-code-recognition.js +46 -0
  22. package/dist/adapter/claude-code/discovery/claude-code-session-catalogue.js +100 -0
  23. package/dist/adapter/claude-code/discovery/claude-code-session-discovery.js +61 -0
  24. package/dist/adapter/claude-code/discovery/claude-code-session-titles.js +28 -0
  25. package/dist/adapter/claude-code/discovery/discovered-session.js +1 -0
  26. package/dist/adapter/claude-code/discovery/session-entries.js +41 -0
  27. package/dist/adapter/claude-code/discovery/transcript-tail.js +81 -0
  28. package/dist/adapter/claude-code/events/claude-code-session-source.js +197 -0
  29. package/dist/adapter/claude-code/events/delegation-index.js +15 -0
  30. package/dist/adapter/claude-code/events/transcript-scan.js +179 -0
  31. package/dist/adapter/claude-code/hooks/hook-output.js +42 -0
  32. package/dist/adapter/claude-code/hooks/pre-tool-use-input.js +23 -0
  33. package/dist/adapter/claude-code/hooks/stop-input.js +25 -0
  34. package/dist/adapter/claude-code/hooks/subagent-stop-input.js +26 -0
  35. package/dist/adapter/claude-code/policy/deny-rules.js +46 -0
  36. package/dist/adapter/claude-code/probe/claude-code-probe.js +86 -0
  37. package/dist/adapter/claude-code/probe/collectors/agent-tool-input-key-collector.js +24 -0
  38. package/dist/adapter/claude-code/probe/collectors/denial-kind-collector.js +20 -0
  39. package/dist/adapter/claude-code/probe/collectors/denied-call-collector.js +11 -0
  40. package/dist/adapter/claude-code/probe/collectors/identifier-collector.js +19 -0
  41. package/dist/adapter/claude-code/probe/collectors/line-collector.js +1 -0
  42. package/dist/adapter/claude-code/probe/collectors/line-type-collector.js +29 -0
  43. package/dist/adapter/claude-code/probe/collectors/sidechain-collector.js +20 -0
  44. package/dist/adapter/claude-code/probe/collectors/task-notification-collector.js +51 -0
  45. package/dist/adapter/claude-code/probe/collectors/tool-result-reference-collector.js +31 -0
  46. package/dist/adapter/claude-code/probe/collectors/tool-use-collector.js +24 -0
  47. package/dist/adapter/claude-code/probe/collectors/tool-version-collector.js +14 -0
  48. package/dist/adapter/claude-code/probe/collectors/top-level-key-collector.js +14 -0
  49. package/dist/adapter/claude-code/probe/collectors/unknown-line-type-key-collector.js +24 -0
  50. package/dist/adapter/claude-code/probe/collectors/working-directory-collector.js +28 -0
  51. package/dist/adapter/claude-code/probe/doctor-report.js +1 -0
  52. package/dist/adapter/claude-code/probe/meta-tally.js +42 -0
  53. package/dist/adapter/claude-code/probe/session-probe.js +1 -0
  54. package/dist/adapter/claude-code/probe/session-tally.js +41 -0
  55. package/dist/adapter/claude-code/probe/transcript-line.js +30 -0
  56. package/dist/adapter/claude-code/probe/transcript-tally.js +74 -0
  57. package/dist/adapter/claude-code/settings/deny-entries.js +65 -0
  58. package/dist/adapter/claude-code/settings/hook-entries.js +303 -0
  59. package/dist/adapter/codex/contract/actions.js +69 -0
  60. package/dist/adapter/codex/contract/assumptions.js +55 -0
  61. package/dist/adapter/codex/contract/capabilities.js +24 -0
  62. package/dist/adapter/codex/contract/delegations.js +30 -0
  63. package/dist/adapter/codex/contract/deliveries.js +25 -0
  64. package/dist/adapter/codex/contract/envelope.js +33 -0
  65. package/dist/adapter/codex/contract/hook-refusals.js +14 -0
  66. package/dist/adapter/codex/contract/hooks.js +46 -0
  67. package/dist/adapter/codex/contract/messages.js +47 -0
  68. package/dist/adapter/codex/contract/permissions.js +27 -0
  69. package/dist/adapter/codex/contract/reviews.js +13 -0
  70. package/dist/adapter/codex/contract/session.js +31 -0
  71. package/dist/adapter/codex/contract/turns.js +23 -0
  72. package/dist/adapter/codex/contract/version.js +15 -0
  73. package/dist/adapter/codex/discovery/codex-conversations.js +44 -0
  74. package/dist/adapter/codex/discovery/codex-project-catalogue.js +49 -0
  75. package/dist/adapter/codex/discovery/codex-recognition.js +20 -0
  76. package/dist/adapter/codex/discovery/codex-session-catalogue.js +28 -0
  77. package/dist/adapter/codex/discovery/codex-session-discovery.js +115 -0
  78. package/dist/adapter/codex/discovery/codex-session-index.js +21 -0
  79. package/dist/adapter/codex/discovery/codex-session-titles.js +135 -0
  80. package/dist/adapter/codex/discovery/session-header.js +86 -0
  81. package/dist/adapter/codex/discovery/session-owners.js +11 -0
  82. package/dist/adapter/codex/discovery/session-roots.js +49 -0
  83. package/dist/adapter/codex/events/action-items.js +138 -0
  84. package/dist/adapter/codex/events/capability-records.js +26 -0
  85. package/dist/adapter/codex/events/codex-session-source.js +121 -0
  86. package/dist/adapter/codex/events/hook-refusals.js +27 -0
  87. package/dist/adapter/codex/events/rollout-scan.js +614 -0
  88. package/dist/adapter/codex/events/turn-permissions.js +60 -0
  89. package/dist/adapter/codex/hooks/pre-tool-use-input.js +24 -0
  90. package/dist/adapter/codex/hooks/stop-refusals.js +57 -0
  91. package/dist/adapter/codex/probe/codex-doctor-report.js +1 -0
  92. package/dist/adapter/codex/probe/codex-probe.js +268 -0
  93. package/dist/adapter/codex/settings/codex-hooks.js +83 -0
  94. package/dist/cli/cli-command.js +1 -0
  95. package/dist/cli/command-router.js +42 -0
  96. package/dist/cli/commands/check-cli-command.js +128 -0
  97. package/dist/cli/commands/codex-stop-cli-command.js +27 -0
  98. package/dist/cli/commands/doctor-arguments.js +32 -0
  99. package/dist/cli/commands/doctor-cli-command.js +31 -0
  100. package/dist/cli/commands/doctor-usage.js +14 -0
  101. package/dist/cli/commands/init-cli-command.js +123 -0
  102. package/dist/cli/commands/menu-cli-command.js +58 -0
  103. package/dist/cli/commands/notify-cli-command.js +158 -0
  104. package/dist/cli/commands/refuse-cli-command.js +79 -0
  105. package/dist/cli/commands/report-arguments.js +62 -0
  106. package/dist/cli/commands/report-cli-command.js +36 -0
  107. package/dist/cli/commands/report-usage.js +41 -0
  108. package/dist/cli/commands/sessions-cli-command.js +184 -0
  109. package/dist/cli/commands/start-cli-command.js +83 -0
  110. package/dist/cli/commands/watch-cli-command.js +142 -0
  111. package/dist/cli/exit-codes.js +13 -0
  112. package/dist/cli/project-switches.js +46 -0
  113. package/dist/cli.js +80 -0
  114. package/dist/composition-root.js +411 -0
  115. package/dist/core/access/command-line.js +454 -0
  116. package/dist/core/access/listing.js +58 -0
  117. package/dist/core/access/path-shape.js +59 -0
  118. package/dist/core/access/path-tokens.js +37 -0
  119. package/dist/core/access/protected-access.js +310 -0
  120. package/dist/core/access/protected-values.js +102 -0
  121. package/dist/core/access/recorded-effect.js +67 -0
  122. package/dist/core/access/returns.js +173 -0
  123. package/dist/core/access/search-output.js +34 -0
  124. package/dist/core/access/search-reach.js +268 -0
  125. package/dist/core/access/uses.js +143 -0
  126. package/dist/core/access/words-before.js +52 -0
  127. package/dist/core/agent.js +1 -0
  128. package/dist/core/capability.js +11 -0
  129. package/dist/core/combined-project-catalogue.js +36 -0
  130. package/dist/core/combined-session-catalogue.js +25 -0
  131. package/dist/core/completeness.js +10 -0
  132. package/dist/core/context.js +1 -0
  133. package/dist/core/correlation/correlate.js +329 -0
  134. package/dist/core/delegation.js +1 -0
  135. package/dist/core/detector/prompt-signals.js +78 -0
  136. package/dist/core/entry-point.js +1 -0
  137. package/dist/core/event.js +1 -0
  138. package/dist/core/evidence.js +9 -0
  139. package/dist/core/late-message.js +32 -0
  140. package/dist/core/message.js +1 -0
  141. package/dist/core/nearest-project.js +28 -0
  142. package/dist/core/policy/default-policy.js +32 -0
  143. package/dist/core/policy/glob.js +56 -0
  144. package/dist/core/policy/parse-policy.js +70 -0
  145. package/dist/core/policy/policy.js +20 -0
  146. package/dist/core/policy/resolve-policy.js +16 -0
  147. package/dist/core/project-catalogue.js +1 -0
  148. package/dist/core/project-root.js +133 -0
  149. package/dist/core/provider-titles.js +10 -0
  150. package/dist/core/redaction/entropy.js +46 -0
  151. package/dist/core/redaction/redacted.js +4 -0
  152. package/dist/core/redaction/redactor.js +339 -0
  153. package/dist/core/redaction/secret-patterns.js +22 -0
  154. package/dist/core/redaction/value-shapes.js +81 -0
  155. package/dist/core/redaction/value-trace.js +110 -0
  156. package/dist/core/review.js +1 -0
  157. package/dist/core/session-catalogue.js +19 -0
  158. package/dist/core/session-filter.js +42 -0
  159. package/dist/core/session-format.js +27 -0
  160. package/dist/core/session-model.js +1 -0
  161. package/dist/core/session-reader.js +22 -0
  162. package/dist/core/session-records.js +1 -0
  163. package/dist/core/session-source.js +1 -0
  164. package/dist/core/session-titles.js +21 -0
  165. package/dist/core/turn.js +1 -0
  166. package/dist/doctor/codex-doctor.js +14 -0
  167. package/dist/doctor/doctor-use-case.js +1 -0
  168. package/dist/doctor/format-selecting-doctor.js +28 -0
  169. package/dist/doctor/render/attention/attention-rule.js +1 -0
  170. package/dist/doctor/render/attention/doctor-attention-rules.js +28 -0
  171. package/dist/doctor/render/attention/rules/damaged-meta-files-rule.js +8 -0
  172. package/dist/doctor/render/attention/rules/damaged-transcripts-rule.js +9 -0
  173. package/dist/doctor/render/attention/rules/incomplete-subagent-pairs-rule.js +6 -0
  174. package/dist/doctor/render/attention/rules/missing-main-transcript-rule.js +5 -0
  175. package/dist/doctor/render/attention/rules/missing-spilled-results-rule.js +6 -0
  176. package/dist/doctor/render/attention/rules/multiple-working-directories-rule.js +15 -0
  177. package/dist/doctor/render/attention/rules/unknown-denial-kinds-rule.js +5 -0
  178. package/dist/doctor/render/attention/rules/unknown-line-types-rule.js +6 -0
  179. package/dist/doctor/render/attention/rules/unrecognised-entries-rule.js +6 -0
  180. package/dist/doctor/render/attention/rules/unusable-directories-rule.js +12 -0
  181. package/dist/doctor/render/attention/transcript-scopes.js +6 -0
  182. package/dist/doctor/render/codex-text-doctor-renderer.js +97 -0
  183. package/dist/doctor/render/doctor-renderers.js +1 -0
  184. package/dist/doctor/render/json-doctor-renderer.js +7 -0
  185. package/dist/doctor/render/output-format.js +1 -0
  186. package/dist/doctor/render/text-doctor-renderer.js +124 -0
  187. package/dist/doctor/session-doctor.js +16 -0
  188. package/dist/infrastructure/clack-asker.js +24 -0
  189. package/dist/infrastructure/clack-chooser.js +40 -0
  190. package/dist/infrastructure/clack-multi-chooser.js +31 -0
  191. package/dist/infrastructure/file-alert-store.js +120 -0
  192. package/dist/infrastructure/file-checked-store.js +55 -0
  193. package/dist/infrastructure/file-mark-store.js +67 -0
  194. package/dist/infrastructure/file-onboarding-store.js +93 -0
  195. package/dist/infrastructure/folder-window.js +26 -0
  196. package/dist/infrastructure/node-agentwhy-invocation.js +99 -0
  197. package/dist/infrastructure/node-browser.js +40 -0
  198. package/dist/infrastructure/node-file-system.js +111 -0
  199. package/dist/infrastructure/node-local-server.js +115 -0
  200. package/dist/infrastructure/node-text-input.js +26 -0
  201. package/dist/infrastructure/os-notifier.js +21 -0
  202. package/dist/infrastructure/osascript-folder-chooser.js +53 -0
  203. package/dist/infrastructure/powershell-folder-chooser.js +78 -0
  204. package/dist/infrastructure/real-directory.js +18 -0
  205. package/dist/infrastructure/stream-printer.js +11 -0
  206. package/dist/infrastructure/terminal-banner.js +19 -0
  207. package/dist/ports/agentwhy-invocation.js +1 -0
  208. package/dist/ports/alert-store.js +1 -0
  209. package/dist/ports/asker.js +1 -0
  210. package/dist/ports/browser.js +1 -0
  211. package/dist/ports/checked-store.js +1 -0
  212. package/dist/ports/chooser.js +1 -0
  213. package/dist/ports/directory-reader.js +1 -0
  214. package/dist/ports/file-access-error.js +11 -0
  215. package/dist/ports/file-reader.js +1 -0
  216. package/dist/ports/file-tail-reader.js +1 -0
  217. package/dist/ports/file-writer.js +1 -0
  218. package/dist/ports/folder-chooser.js +1 -0
  219. package/dist/ports/local-server.js +1 -0
  220. package/dist/ports/mark-store.js +10 -0
  221. package/dist/ports/multi-chooser.js +1 -0
  222. package/dist/ports/notifier.js +1 -0
  223. package/dist/ports/onboarding-store.js +1 -0
  224. package/dist/ports/printer.js +1 -0
  225. package/dist/ports/text-input.js +1 -0
  226. package/dist/refuse/command-reach.js +135 -0
  227. package/dist/refuse/command-refusal.js +88 -0
  228. package/dist/refuse/render/codex-stop-words.js +21 -0
  229. package/dist/refuse/render/refusal-words.js +34 -0
  230. package/dist/report/build-report.js +1037 -0
  231. package/dist/report/check/actions-digest.js +73 -0
  232. package/dist/report/check/check-lines.js +83 -0
  233. package/dist/report/check/mark-request.js +90 -0
  234. package/dist/report/check/marks.js +84 -0
  235. package/dist/report/check/render/text-digest-renderer.js +332 -0
  236. package/dist/report/check/session-actions.js +90 -0
  237. package/dist/report/check/session-check.js +91 -0
  238. package/dist/report/choose-policy.js +61 -0
  239. package/dist/report/flow-reads.js +18 -0
  240. package/dist/report/private-files/tell-lists.js +84 -0
  241. package/dist/report/project-rules.js +33 -0
  242. package/dist/report/render/home-relative.js +18 -0
  243. package/dist/report/render/html-head.js +26 -0
  244. package/dist/report/render/html-report-components.js +48 -0
  245. package/dist/report/render/html-report-styles.js +500 -0
  246. package/dist/report/render/html-sidebar.js +42 -0
  247. package/dist/report/render/path-tail.js +14 -0
  248. package/dist/report/render/report-copy.js +1177 -0
  249. package/dist/report/render/report-page/advanced-view.js +167 -0
  250. package/dist/report/render/report-page/file-story.js +114 -0
  251. package/dist/report/render/report-page/files-view.js +381 -0
  252. package/dist/report/render/report-page/files.js +77 -0
  253. package/dist/report/render/report-page/fix-wizard-script.js +269 -0
  254. package/dist/report/render/report-page/fix-wizard.js +310 -0
  255. package/dist/report/render/report-page/helpers-view.js +383 -0
  256. package/dist/report/render/report-page/helpers.js +51 -0
  257. package/dist/report/render/report-page/item-names.js +63 -0
  258. package/dist/report/render/report-page/protect-patterns.js +13 -0
  259. package/dist/report/render/report-page/providers.js +208 -0
  260. package/dist/report/render/report-page/record-view.js +367 -0
  261. package/dist/report/render/report-page/report-page-renderer.js +129 -0
  262. package/dist/report/render/report-page/report-views.js +31 -0
  263. package/dist/report/render/report-page/story-window.js +356 -0
  264. package/dist/report/render/report-page/times.js +25 -0
  265. package/dist/report/render/report-page/to-do-view.js +299 -0
  266. package/dist/report/render/report-page/to-do.js +152 -0
  267. package/dist/report/render/report-page.js +1 -0
  268. package/dist/report/render/session-view.js +250 -0
  269. package/dist/report/render/text-report-renderer.js +981 -0
  270. package/dist/report/render/ui/add-file-popup.js +122 -0
  271. package/dist/report/render/ui/app-sidebar.js +78 -0
  272. package/dist/report/render/ui/ask-panel.js +80 -0
  273. package/dist/report/render/ui/avatar.js +19 -0
  274. package/dist/report/render/ui/backdrop.js +29 -0
  275. package/dist/report/render/ui/brand-mark.js +4 -0
  276. package/dist/report/render/ui/button.js +67 -0
  277. package/dist/report/render/ui/callout.js +20 -0
  278. package/dist/report/render/ui/chat-example.js +17 -0
  279. package/dist/report/render/ui/checklist.js +50 -0
  280. package/dist/report/render/ui/confirm-dialog.js +34 -0
  281. package/dist/report/render/ui/data-table.js +49 -0
  282. package/dist/report/render/ui/drawer.js +25 -0
  283. package/dist/report/render/ui/file-chip.js +37 -0
  284. package/dist/report/render/ui/fold-line.js +22 -0
  285. package/dist/report/render/ui/guide-card.js +25 -0
  286. package/dist/report/render/ui/hero.js +37 -0
  287. package/dist/report/render/ui/labelled-select.js +10 -0
  288. package/dist/report/render/ui/live-script.js +222 -0
  289. package/dist/report/render/ui/local-date.js +58 -0
  290. package/dist/report/render/ui/mode-icon.js +6 -0
  291. package/dist/report/render/ui/page-shell.js +101 -0
  292. package/dist/report/render/ui/pill-tabs.js +47 -0
  293. package/dist/report/render/ui/popup.js +77 -0
  294. package/dist/report/render/ui/progress.js +35 -0
  295. package/dist/report/render/ui/project-list.js +284 -0
  296. package/dist/report/render/ui/scope-choice.js +19 -0
  297. package/dist/report/render/ui/stats.js +21 -0
  298. package/dist/report/render/ui/status-icon.js +30 -0
  299. package/dist/report/render/ui/status-look.js +21 -0
  300. package/dist/report/render/ui/switch.js +11 -0
  301. package/dist/report/render/ui/tag.js +19 -0
  302. package/dist/report/render/ui/task-list.js +56 -0
  303. package/dist/report/render/ui/tokens.js +46 -0
  304. package/dist/report/render/ui/update-notice.js +146 -0
  305. package/dist/report/render/ui/words/app-words.js +163 -0
  306. package/dist/report/render/ui/words/conversations-words.js +457 -0
  307. package/dist/report/render/ui/words/month-words.js +59 -0
  308. package/dist/report/render/ui/words/onboarding-words.js +446 -0
  309. package/dist/report/render/ui/words/projects-words.js +217 -0
  310. package/dist/report/render/ui/words/report-words.js +2099 -0
  311. package/dist/report/render/ui/words/settings-words.js +611 -0
  312. package/dist/report/render/ui/words/to-fix-words.js +287 -0
  313. package/dist/report/report-model.js +2 -0
  314. package/dist/report/report-use-case.js +1 -0
  315. package/dist/report/rule-names.js +20 -0
  316. package/dist/report/session-report.js +163 -0
  317. package/dist/report/start/app-nav.js +37 -0
  318. package/dist/report/start/conversations/calendar-view.js +104 -0
  319. package/dist/report/start/conversations/conversation-columns.js +187 -0
  320. package/dist/report/start/conversations/conversations-renderer.js +54 -0
  321. package/dist/report/start/conversations/empty-week.js +120 -0
  322. package/dist/report/start/conversations/files-window.js +166 -0
  323. package/dist/report/start/conversations/period-section.js +280 -0
  324. package/dist/report/start/conversations/periods-script.js +440 -0
  325. package/dist/report/start/conversations/periods.js +110 -0
  326. package/dist/report/start/conversations/week-view.js +30 -0
  327. package/dist/report/start/conversations/weeks.js +17 -0
  328. package/dist/report/start/month/month-renderer.js +50 -0
  329. package/dist/report/start/month/month-view.js +135 -0
  330. package/dist/report/start/month/months.js +17 -0
  331. package/dist/report/start/onboarding/done.js +171 -0
  332. package/dist/report/start/onboarding/finish-onboarding.js +93 -0
  333. package/dist/report/start/onboarding/intro.js +100 -0
  334. package/dist/report/start/onboarding/onboarding-changes.js +40 -0
  335. package/dist/report/start/onboarding/onboarding-renderer.js +195 -0
  336. package/dist/report/start/onboarding/onboarding-script.js +400 -0
  337. package/dist/report/start/onboarding/onboarding-view.js +98 -0
  338. package/dist/report/start/onboarding/project-step.js +210 -0
  339. package/dist/report/start/onboarding/steps.js +239 -0
  340. package/dist/report/start/onboarding/welcome.js +66 -0
  341. package/dist/report/start/page-notice.js +10 -0
  342. package/dist/report/start/projects/index-projects.js +43 -0
  343. package/dist/report/start/projects/moved-page.js +82 -0
  344. package/dist/report/start/projects/project-switch.js +138 -0
  345. package/dist/report/start/projects/projects-window.js +67 -0
  346. package/dist/report/start/projects/temporary-space.js +18 -0
  347. package/dist/report/start/render/air-datepicker-vendor.js +27 -0
  348. package/dist/report/start/render/session-status.js +41 -0
  349. package/dist/report/start/render/start-words.js +84 -0
  350. package/dist/report/start/repository.js +28 -0
  351. package/dist/report/start/serve/index-handler.js +372 -0
  352. package/dist/report/start/serve/onboarding-request.js +50 -0
  353. package/dist/report/start/serve/settings-request.js +1 -0
  354. package/dist/report/start/serve/settings-setup.js +193 -0
  355. package/dist/report/start/session-index.js +1 -0
  356. package/dist/report/start/session-start.js +974 -0
  357. package/dist/report/start/settings/alerts-tab.js +104 -0
  358. package/dist/report/start/settings/files-tab.js +169 -0
  359. package/dist/report/start/settings/general-tab.js +71 -0
  360. package/dist/report/start/settings/settings-renderer.js +254 -0
  361. package/dist/report/start/settings/settings-script.js +161 -0
  362. package/dist/report/start/settings/settings-view.js +240 -0
  363. package/dist/report/start/settings/settings-windows.js +334 -0
  364. package/dist/report/start/settings-files.js +43 -0
  365. package/dist/report/start/to-fix/done-list.js +45 -0
  366. package/dist/report/start/to-fix/file-window.js +110 -0
  367. package/dist/report/start/to-fix/to-fix-list.js +70 -0
  368. package/dist/report/start/to-fix/to-fix-renderer.js +237 -0
  369. package/dist/report/start/to-fix/to-fix-script.js +94 -0
  370. package/dist/report/start/to-fix/to-fix-view.js +124 -0
  371. package/dist/report/watch/agent-alert.js +72 -0
  372. package/dist/report/watch/notice-choices.js +35 -0
  373. package/dist/report/watch/notice-settings.js +65 -0
  374. package/dist/report/watch/preferences.js +100 -0
  375. package/dist/report/watch/render/instruction-words.js +54 -0
  376. package/dist/report/watch/render/notice-words.js +182 -0
  377. package/dist/report/watch/subagent-watch.js +345 -0
  378. package/dist/report/watch/watch-notice.js +1 -0
  379. package/dist/setup/behind.js +18 -0
  380. package/dist/setup/codex-mirror.js +171 -0
  381. package/dist/setup/not-a-project.js +19 -0
  382. package/dist/setup/project-setup.js +644 -0
  383. package/dist/setup/protected-patterns.js +30 -0
  384. package/dist/shared/colour.js +23 -0
  385. package/dist/shared/compare.js +4 -0
  386. package/dist/shared/content-version.js +13 -0
  387. package/dist/shared/counter.js +11 -0
  388. package/dist/shared/file-stamp.js +4 -0
  389. package/dist/shared/json.js +13 -0
  390. package/dist/shared/label.js +13 -0
  391. package/dist/shared/package-name.js +6 -0
  392. package/dist/shared/plain-invocation.js +44 -0
  393. package/dist/shared/plain-version.js +21 -0
  394. package/dist/shared/printable.js +25 -0
  395. package/dist/shared/renderer.js +1 -0
  396. package/dist/shared/sentence.js +20 -0
  397. package/dist/shared/terminal-logo.js +41 -0
  398. package/dist/shared/text-table.js +15 -0
  399. package/dist/shared/wrap.js +29 -0
  400. package/package.json +70 -0
@@ -0,0 +1,49 @@
1
+ import { AMBIGUOUS, sessionOwners } from './session-owners.js';
2
+ /** X3/X5: only unique first-line ids join. Roots are indices into the caller's input, never inferred new agents. */
3
+ export function sessionRoots(headers) {
4
+ const owners = sessionOwners(headers.map((header) => header.id === '' ? undefined : header.id));
5
+ const resolved = new Map();
6
+ return headers.map((_, start) => {
7
+ const chain = new Set();
8
+ let index = start;
9
+ let relation;
10
+ while (true) {
11
+ const cached = resolved.get(index);
12
+ if (cached !== undefined) {
13
+ relation = cached;
14
+ break;
15
+ }
16
+ if (chain.has(index)) {
17
+ relation = { kind: 'unresolved', reason: 'cycle' };
18
+ break;
19
+ }
20
+ chain.add(index);
21
+ const header = headers[index];
22
+ if (header === undefined || header.id === '' || header.parent.kind === 'unknown') {
23
+ relation = { kind: 'unresolved', reason: 'invalid-identity' };
24
+ break;
25
+ }
26
+ if (owners.get(header.id) === AMBIGUOUS) {
27
+ relation = { kind: 'unresolved', reason: 'duplicate-id' };
28
+ break;
29
+ }
30
+ if (header.parent.kind === 'root') {
31
+ relation = { kind: 'resolved', root: index };
32
+ break;
33
+ }
34
+ const owner = owners.get(header.parent.id);
35
+ if (owner === undefined) {
36
+ relation = { kind: 'unresolved', reason: 'missing-parent' };
37
+ break;
38
+ }
39
+ if (owner === AMBIGUOUS) {
40
+ relation = { kind: 'unresolved', reason: 'duplicate-id' };
41
+ break;
42
+ }
43
+ index = owner;
44
+ }
45
+ for (const member of chain)
46
+ resolved.set(member, relation);
47
+ return relation;
48
+ });
49
+ }
@@ -0,0 +1,138 @@
1
+ import { basename } from 'node:path';
2
+ import { isJsonObject } from '../../../shared/json.js';
3
+ import { ACTION_ITEMS, CHANGE_KINDS, COMMAND, FILE_CHANGE, IMAGE_VIEW, ITEM, ITEM_STATUSES, MCP, OMISSION_NOTICE, SHELL_FLAGS, SHELLS, WEB_SEARCH, } from '../contract/actions.js';
4
+ /** The action item types the contract names, whether or not it has a profile for them (X6). */
5
+ export function isActionItem(type) {
6
+ return Object.values(ACTION_ITEMS).some((known) => known === type);
7
+ }
8
+ /**
9
+ * One action item, read as X6-X11 say. An item type the contract does not name is read the same way as `Extension`:
10
+ * an unknown tool whose recorded fields are kept as raw input, with no targets and no effect - the caller adds the
11
+ * capability gap that says an item was not understood.
12
+ */
13
+ export function readAction(item) {
14
+ const execution = executionOf(item);
15
+ switch (item[ITEM.type]) {
16
+ case ACTION_ITEMS.command:
17
+ return command(item, execution);
18
+ case ACTION_ITEMS.fileChange:
19
+ return fileChange(item, execution);
20
+ case ACTION_ITEMS.mcp:
21
+ return {
22
+ ...unknownTool('McpToolCall', pick(item, [MCP.server, MCP.tool, MCP.arguments]), execution),
23
+ ...rawOutput(item[MCP.result]),
24
+ };
25
+ case ACTION_ITEMS.webSearch:
26
+ return { ...unknownTool('WebSearch', pick(item, [WEB_SEARCH.action]), execution), ...rawOutput(item[WEB_SEARCH.results]) };
27
+ case ACTION_ITEMS.imageView: {
28
+ const path = item[IMAGE_VIEW.path];
29
+ return unknownTool('ImageView', typeof path === 'string' ? { path } : {}, execution);
30
+ }
31
+ case ACTION_ITEMS.extension:
32
+ return unknownTool('Extension', withoutEnvelope(item), execution);
33
+ default:
34
+ return unknownTool('unrecognised action', withoutEnvelope(item), execution);
35
+ }
36
+ }
37
+ /** X11: the status an item recorded, which says it ran and never what it reached. An item_completed with none completed. */
38
+ function executionOf(item) {
39
+ const status = item[ITEM.status];
40
+ const exitCode = item[COMMAND.exitCode];
41
+ const known = status === undefined ? 'completed' : status === ITEM_STATUSES.completed ? 'completed' : status === ITEM_STATUSES.failed ? 'failed' : 'unrecognised';
42
+ return { status: known, ...(typeof exitCode === 'number' && Number.isInteger(exitCode) ? { exitCode } : {}) };
43
+ }
44
+ /**
45
+ * X7, X8: the command line is `command[2]` only when `command` is exactly `[shell, -lc|-c, line]` with a listed shell;
46
+ * any other shape keeps the whole array as input and is not read as a line. `parsed_cmd` is never read. A read line is
47
+ * named by the shell the record says ran it, `zsh (cat)` beside Claude Code's `Bash (cat)`: a listed name, never the
48
+ * record's text. Any other shape keeps the item's type as its name.
49
+ */
50
+ function command(item, execution) {
51
+ const words = item[COMMAND.command];
52
+ const directory = item[COMMAND.workingDirectory];
53
+ const input = { command: words, ...(typeof directory === 'string' ? { cwd: directory } : {}) };
54
+ const shape = Array.isArray(words) && words.length === 3 && SHELL_FLAGS.some((flag) => flag === words[1]) && typeof words[2] === 'string'
55
+ ? { shell: shellOf(words[0]), line: words[2] }
56
+ : undefined;
57
+ const output = item[COMMAND.output];
58
+ const recorded = typeof output === 'string'
59
+ ? { output: { text: output, completeness: OMISSION_NOTICE.test(output) ? 'partial' : 'unknown' } }
60
+ : {};
61
+ if (shape?.shell === undefined)
62
+ return { ...unknownTool('CommandExecution', input, execution), ...recorded };
63
+ return {
64
+ toolName: shape.shell, input, targets: [], commands: [shape.line], resultShape: 'listing', toolKnown: true, execution, ...recorded, unanswered: [],
65
+ };
66
+ }
67
+ /** The listed shell `program` names, by its file name: `/bin/zsh` is `zsh`. */
68
+ function shellOf(program) {
69
+ return typeof program === 'string' ? SHELLS.find((shell) => shell === basename(program)) : undefined;
70
+ }
71
+ /**
72
+ * X9: the targets are the keys of `changes` and every `move_path`; `written` is the text of an add and the added lines of
73
+ * an update, for a completed change only. A failed change keeps its proposed text in its raw input and writes nothing; a
74
+ * change kind or diff this does not read writes nothing either, and says so.
75
+ */
76
+ function fileChange(item, execution) {
77
+ const changes = item[FILE_CHANGE.changes];
78
+ if (!isJsonObject(changes))
79
+ return unknownTool('FileChange', withoutEnvelope(item), execution);
80
+ const targets = [];
81
+ const written = [];
82
+ let unread = false;
83
+ for (const [path, change] of Object.entries(changes)) {
84
+ targets.push(path);
85
+ if (!isJsonObject(change)) {
86
+ unread = true;
87
+ continue;
88
+ }
89
+ const moved = change[FILE_CHANGE.movePath];
90
+ if (typeof moved === 'string' && moved !== '')
91
+ targets.push(moved);
92
+ const kind = change[FILE_CHANGE.kind];
93
+ const content = change[FILE_CHANGE.content];
94
+ const diff = change[FILE_CHANGE.diff];
95
+ if (kind === CHANGE_KINDS.add && typeof content === 'string')
96
+ written.push(content);
97
+ else if (kind === CHANGE_KINDS.update && typeof diff === 'string')
98
+ written.push(...addedLines(diff));
99
+ else if (kind !== CHANGE_KINDS.delete)
100
+ unread = true;
101
+ }
102
+ const completed = execution.status === 'completed';
103
+ return {
104
+ toolName: 'FileChange',
105
+ input: { changes },
106
+ targets,
107
+ commands: [],
108
+ resultShape: 'none',
109
+ toolKnown: true,
110
+ ...(completed ? { written } : {}),
111
+ execution,
112
+ // X9: a change this does not read adds nothing it may have saved. A failed one is an unestablished effect already,
113
+ // which the core says as such.
114
+ unanswered: completed && unread ? ['access'] : [],
115
+ };
116
+ }
117
+ /** The lines an update adds, never the lines it removes: a value only there was in the file already (R7). */
118
+ function addedLines(diff) {
119
+ return diff.split('\n').filter((line) => line.startsWith('+') && !line.startsWith('+++')).map((line) => line.slice(1));
120
+ }
121
+ function unknownTool(toolName, input, execution) {
122
+ return { toolName, input, targets: [], commands: [], resultShape: 'none', toolKnown: false, execution, unanswered: [] };
123
+ }
124
+ /**
125
+ * A result whose text fields the contract does not name (X10): kept whole as raw text, so a value in it is still found and
126
+ * redacted, and never said to be complete.
127
+ */
128
+ function rawOutput(value) {
129
+ if (value === undefined || value === null)
130
+ return {};
131
+ return { output: { text: typeof value === 'string' ? value : JSON.stringify(value), completeness: 'unknown' } };
132
+ }
133
+ function pick(item, keys) {
134
+ return Object.fromEntries(keys.filter((key) => key in item).map((key) => [key, item[key]]));
135
+ }
136
+ function withoutEnvelope(item) {
137
+ return Object.fromEntries(Object.entries(item).filter(([key]) => key !== ITEM.type && key !== ITEM.id));
138
+ }
@@ -0,0 +1,26 @@
1
+ import { MEASURED_PROFILES, UNKNOWN_MODE_ANSWERS, UNMEASURED_PROFILES } from '../contract/capabilities.js';
2
+ /**
3
+ * The questions a file answers, declared per source (X23): its build and history mode choose the contract's profile, and
4
+ * what its reading found adds to it. An unrecognised part or an interrupted turn makes the action stream `unmeasured`
5
+ * beside whatever the profile says, and never less.
6
+ */
7
+ export function capabilitiesOf(header, source, agentId, facts) {
8
+ const agent = agentId === undefined ? {} : { agentId };
9
+ const answers = { ...answersFor(header) };
10
+ if (facts.hiddenReasoning)
11
+ answers.reasoning = 'absent';
12
+ if (facts.permissionsRecorded)
13
+ answers.permissions = facts.permissionsIncomplete ? 'unmeasured' : 'supported';
14
+ const records = Object.entries(answers).map(([question, state]) => ({
15
+ question: question, state: state, source, ...agent,
16
+ }));
17
+ if (facts.unrecognised || facts.interrupted)
18
+ records.push({ question: 'actions', state: 'unmeasured', source, ...agent });
19
+ return records;
20
+ }
21
+ function answersFor(header) {
22
+ if (header.historyMode === 'unknown')
23
+ return UNKNOWN_MODE_ANSWERS;
24
+ const measured = MEASURED_PROFILES.find((profile) => header.version !== undefined && profile.builds.includes(header.version) && profile.historyModes.includes(header.historyMode));
25
+ return measured?.answers ?? UNMEASURED_PROFILES[header.historyMode];
26
+ }
@@ -0,0 +1,121 @@
1
+ import { basename } from 'node:path';
2
+ import { MAIN_AGENT_TYPE } from '../../../core/agent.js';
3
+ import { correlate } from '../../../core/correlation/correlate.js';
4
+ import { agentSource, mainSource, reviewSource } from '../../../core/evidence.js';
5
+ import { scanRollout } from './rollout-scan.js';
6
+ /**
7
+ * Reads a Codex conversation into the core's model: the rollout asked for and every rollout whose recorded parents lead
8
+ * to it (X5), each read by `scanRollout`, joined by `correlate`. A reviewer's file is a review, never an agent (X19).
9
+ */
10
+ export class CodexSessionSource {
11
+ #discovery;
12
+ #files;
13
+ #sessionsRoot;
14
+ #index;
15
+ constructor(dependencies) {
16
+ this.#discovery = dependencies.discovery;
17
+ this.#files = dependencies.files;
18
+ this.#sessionsRoot = dependencies.sessionsRoot;
19
+ this.#index = dependencies.index;
20
+ }
21
+ async read(input) {
22
+ const collected = emptyCollection();
23
+ const tree = await this.#discovery.tree(input, this.#sessionsRoot, this.#index?.latest());
24
+ if (tree.kind !== 'tree') {
25
+ // Not a Codex session, or not readable: there is no session to report on, and saying so is the whole answer.
26
+ collected.gaps.push({ kind: 'session-missing' });
27
+ return correlate(recordsOf(basename(input), collected));
28
+ }
29
+ const roles = rolesOf(tree.members);
30
+ const root = roles[0];
31
+ collected.agents.push({ id: root.agentId, type: MAIN_AGENT_TYPE, depth: 0 });
32
+ for (const role of roles.slice(1))
33
+ if (role.kind === 'agent')
34
+ collected.agents.push(agentOf(role));
35
+ // The root's id is another file's too, so no child could join it (X3); and a folder or file the search could not
36
+ // read may have held a part of this conversation. A file it read whose first line is no Codex session's could not:
37
+ // the chain is found by that line alone (X5), so it is no member of any tree, and `doctor` is where it is counted.
38
+ if (tree.rootShared)
39
+ collected.gaps.push({ kind: 'relation-unresolved', agentId: root.agentId });
40
+ collected.gaps.push(...tree.gaps.filter((gap) => gap.reason !== 'unknown-format').map(() => ({ kind: 'source-missing' })));
41
+ for (const [index, member] of tree.members.entries())
42
+ await scanRollout(this.#files, member.path, roles[index], collected);
43
+ // A started agent whose own file is not here still started: it is kept, and its missing record said (X16).
44
+ const known = new Set(collected.agents.map((agent) => agent.id));
45
+ for (const entry of collected.delegationIndex) {
46
+ if (known.has(entry.agentId))
47
+ continue;
48
+ known.add(entry.agentId);
49
+ collected.agents.push({ id: entry.agentId, ...(entry.requestedType === undefined ? {} : { type: entry.requestedType }) });
50
+ collected.gaps.push({ kind: 'source-missing', agentId: entry.agentId });
51
+ }
52
+ return correlate(recordsOf(root.agentId, collected));
53
+ }
54
+ }
55
+ /** Who each file is, from the tree alone: the root is the conversation; a child is an agent, a reviewer, or unknown. */
56
+ function rolesOf(members) {
57
+ const threads = new Map(members.map((member) => [member.header.id, member.header]));
58
+ return members.map((member, index) => {
59
+ const id = member.header.id;
60
+ const parent = member.parent === undefined ? undefined : members[member.parent];
61
+ const reviewer = index > 0 && member.header.origin.kind === 'reviewer';
62
+ return {
63
+ header: member.header,
64
+ kind: reviewer ? 'reviewer' : 'agent',
65
+ agentId: id,
66
+ source: index === 0 ? mainSource() : reviewer ? reviewSource(id) : agentSource(id),
67
+ ...(reviewer && parent !== undefined && parent.header.origin.kind !== 'reviewer' ? { reviewedAgentId: parent.header.id } : {}),
68
+ idScope: index === 0 ? '' : `${index}:`,
69
+ childByPath: childrenByPath(members, index),
70
+ threads,
71
+ };
72
+ });
73
+ }
74
+ /** An agent's started children by `agent_path`. A name two of them share names neither (X18). */
75
+ function childrenByPath(members, index) {
76
+ const byPath = new Map();
77
+ for (const member of members) {
78
+ const origin = member.header.origin;
79
+ if (member.parent !== index || origin.kind !== 'spawned' || origin.agentPath === undefined)
80
+ continue;
81
+ byPath.set(origin.agentPath, byPath.has(origin.agentPath) ? undefined : member.header.id);
82
+ }
83
+ return byPath;
84
+ }
85
+ /** X15: a started agent's type is its role where one is set, and `subagent` otherwise; its depth is the one recorded. */
86
+ function agentOf(role) {
87
+ const origin = role.header.origin;
88
+ if (origin.kind !== 'spawned')
89
+ return { id: role.agentId };
90
+ return { id: role.agentId, type: origin.role ?? 'subagent', ...(origin.depth === undefined ? {} : { depth: origin.depth }) };
91
+ }
92
+ function emptyCollection() {
93
+ return {
94
+ agents: [], calls: [], results: [], delegations: [], delegationIndex: [], followUps: [], followUpIndex: [], messages: [],
95
+ agentReports: [], turns: [], reviews: [], contexts: [], deliveries: [], capabilities: [], gaps: [], workingDirectories: new Set(),
96
+ };
97
+ }
98
+ function recordsOf(sessionId, collected) {
99
+ return {
100
+ sessionId,
101
+ provider: 'codex',
102
+ agents: collected.agents,
103
+ calls: collected.calls,
104
+ results: collected.results,
105
+ delegations: collected.delegations,
106
+ delegationIndex: collected.delegationIndex,
107
+ messages: collected.messages,
108
+ // Codex names no call when a report comes back; its reports name their agents (X18).
109
+ deliveredReports: [],
110
+ agentReports: collected.agentReports,
111
+ followUps: collected.followUps,
112
+ followUpIndex: collected.followUpIndex,
113
+ turns: collected.turns,
114
+ reviews: collected.reviews,
115
+ contexts: collected.contexts,
116
+ deliveries: collected.deliveries,
117
+ capabilities: collected.capabilities,
118
+ workingDirectories: [...collected.workingDirectories],
119
+ gaps: collected.gaps,
120
+ };
121
+ }
@@ -0,0 +1,27 @@
1
+ import { HOOK_REFUSAL } from '../contract/hook-refusals.js';
2
+ /**
3
+ * agentwhy's own reason (`refuse/render/refusal-words.ts` `refusalReason`), after Codex's words for a hook's refusal: "it
4
+ * names P", "W expands to P" or "this search would read P", then "which this project's policy protects (R)". A test
5
+ * reads `refusalReason`'s own sentences back through this, so the two cannot drift apart unnoticed.
6
+ */
7
+ const REFUSED = new RegExp(escaped(HOOK_REFUSAL.blocked) +
8
+ "(agentwhy refused this command: (?:it names (.+?)|\\S+ expands to (.+?)|this search would read (.+?)), which this project's policy protects \\((.+?)\\)[^\\n]*?)" +
9
+ '(?:' + escaped(HOOK_REFUSAL.command) + '([^\\n]*))?$', 'gm');
10
+ /**
11
+ * Every command agentwhy's Codex hook refused in one cell's output, in order (CK12). A hook's refusal in any other words
12
+ * is not read: Codex types none (XB1), and a reason nobody here wrote is not guessed at.
13
+ */
14
+ export function hookRefusalsIn(text) {
15
+ return [...text.matchAll(REFUSED)].flatMap((match) => {
16
+ const path = match[2] ?? match[3] ?? match[4];
17
+ const pattern = match[5];
18
+ const reason = match[1];
19
+ if (path === undefined || pattern === undefined || reason === undefined)
20
+ return [];
21
+ const command = match[6]?.trim();
22
+ return [{ path, pattern, reason, ...(command === undefined || command === '' ? {} : { command }) }];
23
+ });
24
+ }
25
+ function escaped(text) {
26
+ return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
27
+ }