@jitsusama/agentic-harness.core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (974) hide show
  1. package/README.md +52 -0
  2. package/dist/advisor/charter.d.ts +14 -0
  3. package/dist/advisor/charter.js +48 -0
  4. package/dist/advisor/findings.d.ts +43 -0
  5. package/dist/advisor/findings.js +82 -0
  6. package/dist/advisor/index.d.ts +24 -0
  7. package/dist/advisor/index.js +23 -0
  8. package/dist/advisor/settings.d.ts +16 -0
  9. package/dist/advisor/settings.js +30 -0
  10. package/dist/advisor/substantive.d.ts +14 -0
  11. package/dist/advisor/substantive.js +33 -0
  12. package/dist/advisor/tools.d.ts +38 -0
  13. package/dist/advisor/tools.js +202 -0
  14. package/dist/attribution/commit-hook.d.ts +53 -0
  15. package/dist/attribution/commit-hook.js +133 -0
  16. package/dist/attribution/gh-footer.d.ts +27 -0
  17. package/dist/attribution/gh-footer.js +80 -0
  18. package/dist/attribution/index.d.ts +11 -0
  19. package/dist/attribution/index.js +11 -0
  20. package/dist/attribution/model-name.d.ts +11 -0
  21. package/dist/attribution/model-name.js +26 -0
  22. package/dist/bin/attribution.d.ts +36 -0
  23. package/dist/bin/attribution.js +82 -0
  24. package/dist/bin/cli.d.ts +14 -0
  25. package/dist/bin/cli.js +236 -0
  26. package/dist/bin/gate-deps.d.ts +23 -0
  27. package/dist/bin/gate-deps.js +61 -0
  28. package/dist/bin/guardians.d.ts +51 -0
  29. package/dist/bin/guardians.js +174 -0
  30. package/dist/bin/memory.d.ts +16 -0
  31. package/dist/bin/memory.js +81 -0
  32. package/dist/bin/notes.d.ts +30 -0
  33. package/dist/bin/notes.js +67 -0
  34. package/dist/bin/process-exec.d.ts +14 -0
  35. package/dist/bin/process-exec.js +31 -0
  36. package/dist/bin/quest.d.ts +38 -0
  37. package/dist/bin/quest.js +187 -0
  38. package/dist/bin/slack-auth.d.ts +49 -0
  39. package/dist/bin/slack-auth.js +107 -0
  40. package/dist/clock/index.d.ts +46 -0
  41. package/dist/clock/index.js +72 -0
  42. package/dist/command/cwd.d.ts +21 -0
  43. package/dist/command/cwd.js +60 -0
  44. package/dist/command/edit.d.ts +14 -0
  45. package/dist/command/edit.js +22 -0
  46. package/dist/command/flags.d.ts +29 -0
  47. package/dist/command/flags.js +111 -0
  48. package/dist/command/index.d.ts +16 -0
  49. package/dist/command/index.js +12 -0
  50. package/dist/command/tokenize.d.ts +7 -0
  51. package/dist/command/tokenize.js +315 -0
  52. package/dist/command/types.d.ts +66 -0
  53. package/dist/command/types.js +9 -0
  54. package/dist/completion/index.d.ts +17 -0
  55. package/dist/completion/index.js +16 -0
  56. package/dist/completion/investigate.d.ts +63 -0
  57. package/dist/completion/investigate.js +198 -0
  58. package/dist/completion/resolve.d.ts +29 -0
  59. package/dist/completion/resolve.js +42 -0
  60. package/dist/completion/side.d.ts +51 -0
  61. package/dist/completion/side.js +93 -0
  62. package/dist/completion/types.d.ts +84 -0
  63. package/dist/completion/types.js +14 -0
  64. package/dist/exec/exec.d.ts +38 -0
  65. package/dist/exec/exec.js +51 -0
  66. package/dist/exec/index.d.ts +8 -0
  67. package/dist/exec/index.js +8 -0
  68. package/dist/gate/decision.d.ts +52 -0
  69. package/dist/gate/decision.js +68 -0
  70. package/dist/gate/deps.d.ts +14 -0
  71. package/dist/gate/deps.js +1 -0
  72. package/dist/gate/index.d.ts +2 -0
  73. package/dist/gate/index.js +1 -0
  74. package/dist/git-cli/index.d.ts +47 -0
  75. package/dist/git-cli/index.js +127 -0
  76. package/dist/github-cli/command-spec.d.ts +14 -0
  77. package/dist/github-cli/command-spec.js +18 -0
  78. package/dist/github-cli/index.d.ts +71 -0
  79. package/dist/github-cli/index.js +188 -0
  80. package/dist/google/apis/calendar.d.ts +64 -0
  81. package/dist/google/apis/calendar.js +297 -0
  82. package/dist/google/apis/docs.d.ts +29 -0
  83. package/dist/google/apis/docs.js +154 -0
  84. package/dist/google/apis/drive.d.ts +46 -0
  85. package/dist/google/apis/drive.js +189 -0
  86. package/dist/google/apis/gmail.d.ts +67 -0
  87. package/dist/google/apis/gmail.js +374 -0
  88. package/dist/google/apis/index.d.ts +10 -0
  89. package/dist/google/apis/index.js +10 -0
  90. package/dist/google/apis/sheets.d.ts +16 -0
  91. package/dist/google/apis/sheets.js +54 -0
  92. package/dist/google/apis/slides.d.ts +16 -0
  93. package/dist/google/apis/slides.js +40 -0
  94. package/dist/google/auth/browser.d.ts +5 -0
  95. package/dist/google/auth/browser.js +27 -0
  96. package/dist/google/auth/credentials.d.ts +26 -0
  97. package/dist/google/auth/credentials.js +69 -0
  98. package/dist/google/auth/errors.d.ts +15 -0
  99. package/dist/google/auth/errors.js +26 -0
  100. package/dist/google/auth/index.d.ts +12 -0
  101. package/dist/google/auth/index.js +12 -0
  102. package/dist/google/auth/oauth-app.d.ts +15 -0
  103. package/dist/google/auth/oauth-app.js +20 -0
  104. package/dist/google/auth/oauth.d.ts +46 -0
  105. package/dist/google/auth/oauth.js +146 -0
  106. package/dist/google/auth/server.d.ts +13 -0
  107. package/dist/google/auth/server.js +70 -0
  108. package/dist/google/auth/setup-instructions.d.ts +16 -0
  109. package/dist/google/auth/setup-instructions.js +24 -0
  110. package/dist/google/auth/store.d.ts +19 -0
  111. package/dist/google/auth/store.js +27 -0
  112. package/dist/google/index.d.ts +13 -0
  113. package/dist/google/index.js +12 -0
  114. package/dist/google/paths.d.ts +17 -0
  115. package/dist/google/paths.js +28 -0
  116. package/dist/google/renderers/calendar.d.ts +23 -0
  117. package/dist/google/renderers/calendar.js +312 -0
  118. package/dist/google/renderers/drive.d.ts +31 -0
  119. package/dist/google/renderers/drive.js +214 -0
  120. package/dist/google/renderers/email.d.ts +16 -0
  121. package/dist/google/renderers/email.js +130 -0
  122. package/dist/google/renderers/index.d.ts +8 -0
  123. package/dist/google/renderers/index.js +8 -0
  124. package/dist/google/types.d.ts +143 -0
  125. package/dist/google/types.js +27 -0
  126. package/dist/governance/distill.d.ts +31 -0
  127. package/dist/governance/distill.js +78 -0
  128. package/dist/governance/index.d.ts +11 -0
  129. package/dist/governance/index.js +10 -0
  130. package/dist/governance/render.d.ts +13 -0
  131. package/dist/governance/render.js +23 -0
  132. package/dist/governance/store.d.ts +32 -0
  133. package/dist/governance/store.js +102 -0
  134. package/dist/governance/types.d.ts +19 -0
  135. package/dist/governance/types.js +9 -0
  136. package/dist/guardian/index.d.ts +7 -0
  137. package/dist/guardian/index.js +7 -0
  138. package/dist/guardian/types.d.ts +37 -0
  139. package/dist/guardian/types.js +12 -0
  140. package/dist/internal/github/cli.d.ts +40 -0
  141. package/dist/internal/github/cli.js +102 -0
  142. package/dist/internal/guardian/commit-file.d.ts +7 -0
  143. package/dist/internal/guardian/commit-file.js +36 -0
  144. package/dist/internal/guardian/commit-format.d.ts +35 -0
  145. package/dist/internal/guardian/commit-format.js +63 -0
  146. package/dist/internal/guardian/commit-shell.d.ts +38 -0
  147. package/dist/internal/guardian/commit-shell.js +134 -0
  148. package/dist/internal/guardian/history-gate.d.ts +41 -0
  149. package/dist/internal/guardian/history-gate.js +76 -0
  150. package/dist/internal/guardian/prose-gate.d.ts +31 -0
  151. package/dist/internal/guardian/prose-gate.js +50 -0
  152. package/dist/internal/guardian/redirect-gate.d.ts +41 -0
  153. package/dist/internal/guardian/redirect-gate.js +114 -0
  154. package/dist/internal/guardian/section-gate.d.ts +20 -0
  155. package/dist/internal/guardian/section-gate.js +36 -0
  156. package/dist/internal/guardian/title-gate.d.ts +20 -0
  157. package/dist/internal/guardian/title-gate.js +36 -0
  158. package/dist/internal/json-array.d.ts +11 -0
  159. package/dist/internal/json-array.js +40 -0
  160. package/dist/internal/lsp/registry.d.ts +12 -0
  161. package/dist/internal/lsp/registry.js +16 -0
  162. package/dist/internal/notes/discovery.d.ts +59 -0
  163. package/dist/internal/notes/discovery.js +91 -0
  164. package/dist/internal/notes/frontmatter.d.ts +52 -0
  165. package/dist/internal/notes/frontmatter.js +163 -0
  166. package/dist/internal/notes/id.d.ts +42 -0
  167. package/dist/internal/notes/id.js +80 -0
  168. package/dist/internal/notes/io.d.ts +25 -0
  169. package/dist/internal/notes/io.js +51 -0
  170. package/dist/internal/notes/sanitize.d.ts +19 -0
  171. package/dist/internal/notes/sanitize.js +35 -0
  172. package/dist/internal/process-global.d.ts +20 -0
  173. package/dist/internal/process-global.js +28 -0
  174. package/dist/internal/quest/alias-index.d.ts +61 -0
  175. package/dist/internal/quest/alias-index.js +69 -0
  176. package/dist/internal/quest/append-journey.d.ts +22 -0
  177. package/dist/internal/quest/append-journey.js +63 -0
  178. package/dist/internal/quest/bash-write.d.ts +49 -0
  179. package/dist/internal/quest/bash-write.js +208 -0
  180. package/dist/internal/quest/dates.d.ts +14 -0
  181. package/dist/internal/quest/dates.js +20 -0
  182. package/dist/internal/quest/discovery.d.ts +96 -0
  183. package/dist/internal/quest/discovery.js +354 -0
  184. package/dist/internal/quest/fields.d.ts +37 -0
  185. package/dist/internal/quest/fields.js +94 -0
  186. package/dist/internal/quest/frontmatter.d.ts +88 -0
  187. package/dist/internal/quest/frontmatter.js +630 -0
  188. package/dist/internal/quest/git-signals.d.ts +53 -0
  189. package/dist/internal/quest/git-signals.js +192 -0
  190. package/dist/internal/quest/id.d.ts +50 -0
  191. package/dist/internal/quest/id.js +116 -0
  192. package/dist/internal/quest/io.d.ts +54 -0
  193. package/dist/internal/quest/io.js +233 -0
  194. package/dist/internal/quest/mentions.d.ts +45 -0
  195. package/dist/internal/quest/mentions.js +70 -0
  196. package/dist/internal/quest/mutate.d.ts +38 -0
  197. package/dist/internal/quest/mutate.js +83 -0
  198. package/dist/internal/quest/process-liveness.d.ts +98 -0
  199. package/dist/internal/quest/process-liveness.js +216 -0
  200. package/dist/internal/quest/quest-doc.d.ts +116 -0
  201. package/dist/internal/quest/quest-doc.js +239 -0
  202. package/dist/internal/quest/ranking.d.ts +48 -0
  203. package/dist/internal/quest/ranking.js +114 -0
  204. package/dist/internal/quest/reopen.d.ts +65 -0
  205. package/dist/internal/quest/reopen.js +113 -0
  206. package/dist/internal/quest/resolve-cwd.d.ts +32 -0
  207. package/dist/internal/quest/resolve-cwd.js +89 -0
  208. package/dist/internal/quest/sanitize.d.ts +42 -0
  209. package/dist/internal/quest/sanitize.js +69 -0
  210. package/dist/internal/quest/scaffold.d.ts +59 -0
  211. package/dist/internal/quest/scaffold.js +169 -0
  212. package/dist/internal/quest/scratch.d.ts +27 -0
  213. package/dist/internal/quest/scratch.js +106 -0
  214. package/dist/internal/quest/session-liveness.d.ts +125 -0
  215. package/dist/internal/quest/session-liveness.js +386 -0
  216. package/dist/internal/quest/session-ownership.d.ts +22 -0
  217. package/dist/internal/quest/session-ownership.js +100 -0
  218. package/dist/internal/quest/session-registry.d.ts +221 -0
  219. package/dist/internal/quest/session-registry.js +266 -0
  220. package/dist/internal/quest/status.d.ts +10 -0
  221. package/dist/internal/quest/status.js +15 -0
  222. package/dist/internal/quest/structural-journal.d.ts +41 -0
  223. package/dist/internal/quest/structural-journal.js +67 -0
  224. package/dist/internal/quest/structural.d.ts +43 -0
  225. package/dist/internal/quest/structural.js +77 -0
  226. package/dist/internal/quest/toc.d.ts +28 -0
  227. package/dist/internal/quest/toc.js +90 -0
  228. package/dist/internal/quest/trees.d.ts +53 -0
  229. package/dist/internal/quest/trees.js +145 -0
  230. package/dist/internal/quest/url-fetchers.d.ts +50 -0
  231. package/dist/internal/quest/url-fetchers.js +97 -0
  232. package/dist/internal/quest/write-classifier.d.ts +46 -0
  233. package/dist/internal/quest/write-classifier.js +59 -0
  234. package/dist/internal/refs/builtins.d.ts +32 -0
  235. package/dist/internal/refs/builtins.js +179 -0
  236. package/dist/internal/refs/registry.d.ts +25 -0
  237. package/dist/internal/refs/registry.js +42 -0
  238. package/dist/internal/registry/global-symbol-registry.d.ts +37 -0
  239. package/dist/internal/registry/global-symbol-registry.js +55 -0
  240. package/dist/internal/review/registry.d.ts +12 -0
  241. package/dist/internal/review/registry.js +16 -0
  242. package/dist/internal/sqlite/db.d.ts +16 -0
  243. package/dist/internal/sqlite/db.js +26 -0
  244. package/dist/internal/terminal/builtins.d.ts +8 -0
  245. package/dist/internal/terminal/builtins.js +14 -0
  246. package/dist/internal/terminal/drivers/fallback.d.ts +8 -0
  247. package/dist/internal/terminal/drivers/fallback.js +31 -0
  248. package/dist/internal/terminal/drivers/shared.d.ts +39 -0
  249. package/dist/internal/terminal/drivers/shared.js +51 -0
  250. package/dist/internal/terminal/drivers/tmux.d.ts +14 -0
  251. package/dist/internal/terminal/drivers/tmux.js +88 -0
  252. package/dist/internal/terminal/drivers/wezterm.d.ts +35 -0
  253. package/dist/internal/terminal/drivers/wezterm.js +175 -0
  254. package/dist/internal/terminal/registry.d.ts +12 -0
  255. package/dist/internal/terminal/registry.js +16 -0
  256. package/dist/internal/tree/builtins.d.ts +8 -0
  257. package/dist/internal/tree/builtins.js +10 -0
  258. package/dist/internal/tree/providers/git-worktree.d.ts +20 -0
  259. package/dist/internal/tree/providers/git-worktree.js +279 -0
  260. package/dist/internal/tree/registry.d.ts +12 -0
  261. package/dist/internal/tree/registry.js +16 -0
  262. package/dist/lsp/config.d.ts +77 -0
  263. package/dist/lsp/config.js +154 -0
  264. package/dist/lsp/external.d.ts +13 -0
  265. package/dist/lsp/external.js +52 -0
  266. package/dist/lsp/format.d.ts +11 -0
  267. package/dist/lsp/format.js +54 -0
  268. package/dist/lsp/index.d.ts +17 -0
  269. package/dist/lsp/index.js +16 -0
  270. package/dist/lsp/offsets.d.ts +22 -0
  271. package/dist/lsp/offsets.js +51 -0
  272. package/dist/lsp/registry.d.ts +28 -0
  273. package/dist/lsp/registry.js +45 -0
  274. package/dist/lsp/standalone/backend.d.ts +42 -0
  275. package/dist/lsp/standalone/backend.js +150 -0
  276. package/dist/lsp/standalone/document.d.ts +45 -0
  277. package/dist/lsp/standalone/document.js +81 -0
  278. package/dist/lsp/standalone/server.d.ts +84 -0
  279. package/dist/lsp/standalone/server.js +521 -0
  280. package/dist/lsp/types.d.ts +119 -0
  281. package/dist/lsp/types.js +13 -0
  282. package/dist/memory/db.d.ts +15 -0
  283. package/dist/memory/db.js +25 -0
  284. package/dist/memory/index.d.ts +12 -0
  285. package/dist/memory/index.js +11 -0
  286. package/dist/memory/paths.d.ts +19 -0
  287. package/dist/memory/paths.js +33 -0
  288. package/dist/memory/scope.d.ts +14 -0
  289. package/dist/memory/scope.js +22 -0
  290. package/dist/memory/store.d.ts +12 -0
  291. package/dist/memory/store.js +146 -0
  292. package/dist/memory/types.d.ts +80 -0
  293. package/dist/memory/types.js +6 -0
  294. package/dist/notes/types.d.ts +50 -0
  295. package/dist/notes/types.js +23 -0
  296. package/dist/notes/verbs/create.d.ts +5 -0
  297. package/dist/notes/verbs/create.js +55 -0
  298. package/dist/notes/verbs/mutate.d.ts +8 -0
  299. package/dist/notes/verbs/mutate.js +152 -0
  300. package/dist/notes/verbs/queries.d.ts +15 -0
  301. package/dist/notes/verbs/queries.js +116 -0
  302. package/dist/notes/verbs/reindex.d.ts +12 -0
  303. package/dist/notes/verbs/reindex.js +35 -0
  304. package/dist/notes/verbs/shared.d.ts +37 -0
  305. package/dist/notes/verbs/shared.js +29 -0
  306. package/dist/observability/index.d.ts +13 -0
  307. package/dist/observability/index.js +12 -0
  308. package/dist/observability/recorder.d.ts +50 -0
  309. package/dist/observability/recorder.js +77 -0
  310. package/dist/observability/store.d.ts +22 -0
  311. package/dist/observability/store.js +213 -0
  312. package/dist/observability/types.d.ts +82 -0
  313. package/dist/observability/types.js +1 -0
  314. package/dist/process/index.d.ts +9 -0
  315. package/dist/process/index.js +9 -0
  316. package/dist/process/process.d.ts +95 -0
  317. package/dist/process/process.js +153 -0
  318. package/dist/prose/block.d.ts +9 -0
  319. package/dist/prose/block.js +43 -0
  320. package/dist/prose/detect.d.ts +50 -0
  321. package/dist/prose/detect.js +217 -0
  322. package/dist/prose/gate.d.ts +14 -0
  323. package/dist/prose/gate.js +21 -0
  324. package/dist/prose/index.d.ts +4 -0
  325. package/dist/prose/index.js +4 -0
  326. package/dist/prose/wrap.d.ts +9 -0
  327. package/dist/prose/wrap.js +47 -0
  328. package/dist/quest/actions.d.ts +20 -0
  329. package/dist/quest/actions.js +107 -0
  330. package/dist/quest/config.d.ts +79 -0
  331. package/dist/quest/config.js +83 -0
  332. package/dist/quest/index.d.ts +29 -0
  333. package/dist/quest/index.js +28 -0
  334. package/dist/quest/lifecycle.d.ts +365 -0
  335. package/dist/quest/lifecycle.js +900 -0
  336. package/dist/quest/lookup.d.ts +243 -0
  337. package/dist/quest/lookup.js +496 -0
  338. package/dist/quest/machine.d.ts +48 -0
  339. package/dist/quest/machine.js +96 -0
  340. package/dist/quest/render-rows.d.ts +166 -0
  341. package/dist/quest/render-rows.js +214 -0
  342. package/dist/quest/state.d.ts +111 -0
  343. package/dist/quest/state.js +46 -0
  344. package/dist/quest/types.d.ts +224 -0
  345. package/dist/quest/types.js +10 -0
  346. package/dist/quest/verbs/alias.d.ts +9 -0
  347. package/dist/quest/verbs/alias.js +129 -0
  348. package/dist/quest/verbs/lifecycle.d.ts +36 -0
  349. package/dist/quest/verbs/lifecycle.js +407 -0
  350. package/dist/quest/verbs/queries.d.ts +24 -0
  351. package/dist/quest/verbs/queries.js +241 -0
  352. package/dist/quest/verbs/reorder.d.ts +15 -0
  353. package/dist/quest/verbs/reorder.js +85 -0
  354. package/dist/quest/verbs/shared.d.ts +63 -0
  355. package/dist/quest/verbs/shared.js +35 -0
  356. package/dist/quest/verbs/stage.d.ts +39 -0
  357. package/dist/quest/verbs/stage.js +506 -0
  358. package/dist/quest/verbs/structural.d.ts +23 -0
  359. package/dist/quest/verbs/structural.js +310 -0
  360. package/dist/quest/verbs/tree-ops.d.ts +20 -0
  361. package/dist/quest/verbs/tree-ops.js +289 -0
  362. package/dist/refs/index.d.ts +13 -0
  363. package/dist/refs/index.js +12 -0
  364. package/dist/refs/lookup.d.ts +53 -0
  365. package/dist/refs/lookup.js +102 -0
  366. package/dist/refs/register.d.ts +34 -0
  367. package/dist/refs/register.js +44 -0
  368. package/dist/refs/types.d.ts +81 -0
  369. package/dist/refs/types.js +17 -0
  370. package/dist/remote/index.d.ts +9 -0
  371. package/dist/remote/index.js +9 -0
  372. package/dist/remote/name.d.ts +22 -0
  373. package/dist/remote/name.js +30 -0
  374. package/dist/result/cite.d.ts +84 -0
  375. package/dist/result/cite.js +127 -0
  376. package/dist/result/counts.d.ts +15 -0
  377. package/dist/result/counts.js +17 -0
  378. package/dist/result/details.d.ts +61 -0
  379. package/dist/result/details.js +121 -0
  380. package/dist/result/digest.d.ts +37 -0
  381. package/dist/result/digest.js +227 -0
  382. package/dist/result/follow.d.ts +29 -0
  383. package/dist/result/follow.js +37 -0
  384. package/dist/result/index.d.ts +26 -0
  385. package/dist/result/index.js +26 -0
  386. package/dist/result/listing.d.ts +62 -0
  387. package/dist/result/listing.js +72 -0
  388. package/dist/result/location.d.ts +67 -0
  389. package/dist/result/location.js +125 -0
  390. package/dist/result/query.d.ts +67 -0
  391. package/dist/result/query.js +144 -0
  392. package/dist/result/spill.d.ts +41 -0
  393. package/dist/result/spill.js +121 -0
  394. package/dist/result/store.d.ts +83 -0
  395. package/dist/result/store.js +214 -0
  396. package/dist/result/view.d.ts +31 -0
  397. package/dist/result/view.js +38 -0
  398. package/dist/review/anchor.d.ts +84 -0
  399. package/dist/review/anchor.js +89 -0
  400. package/dist/review/ask/agents.d.ts +80 -0
  401. package/dist/review/ask/agents.js +296 -0
  402. package/dist/review/ask/anchorable.d.ts +35 -0
  403. package/dist/review/ask/anchorable.js +76 -0
  404. package/dist/review/ask/answer.d.ts +54 -0
  405. package/dist/review/ask/answer.js +209 -0
  406. package/dist/review/ask/audit.d.ts +71 -0
  407. package/dist/review/ask/audit.js +158 -0
  408. package/dist/review/ask/collect.d.ts +41 -0
  409. package/dist/review/ask/collect.js +82 -0
  410. package/dist/review/ask/council.d.ts +290 -0
  411. package/dist/review/ask/council.js +386 -0
  412. package/dist/review/ask/critique.d.ts +69 -0
  413. package/dist/review/ask/critique.js +157 -0
  414. package/dist/review/ask/harvest.d.ts +119 -0
  415. package/dist/review/ask/harvest.js +409 -0
  416. package/dist/review/ask/identity.d.ts +93 -0
  417. package/dist/review/ask/identity.js +134 -0
  418. package/dist/review/ask/judge.d.ts +37 -0
  419. package/dist/review/ask/judge.js +140 -0
  420. package/dist/review/ask/persona.d.ts +84 -0
  421. package/dist/review/ask/persona.js +127 -0
  422. package/dist/review/ask/progress.d.ts +117 -0
  423. package/dist/review/ask/progress.js +137 -0
  424. package/dist/review/ask/prompt.d.ts +131 -0
  425. package/dist/review/ask/prompt.js +242 -0
  426. package/dist/review/ask/roster.d.ts +94 -0
  427. package/dist/review/ask/roster.js +338 -0
  428. package/dist/review/ask/run.d.ts +435 -0
  429. package/dist/review/ask/run.js +340 -0
  430. package/dist/review/ask/span.d.ts +70 -0
  431. package/dist/review/ask/span.js +166 -0
  432. package/dist/review/ask/stack-round.d.ts +66 -0
  433. package/dist/review/ask/stack-round.js +125 -0
  434. package/dist/review/ask/start.d.ts +48 -0
  435. package/dist/review/ask/start.js +118 -0
  436. package/dist/review/ask/store.d.ts +83 -0
  437. package/dist/review/ask/store.js +226 -0
  438. package/dist/review/ask/wire.d.ts +89 -0
  439. package/dist/review/ask/wire.js +204 -0
  440. package/dist/review/attach.d.ts +161 -0
  441. package/dist/review/attach.js +357 -0
  442. package/dist/review/authoring.d.ts +84 -0
  443. package/dist/review/authoring.js +203 -0
  444. package/dist/review/backed.d.ts +90 -0
  445. package/dist/review/backed.js +168 -0
  446. package/dist/review/bind.d.ts +75 -0
  447. package/dist/review/bind.js +223 -0
  448. package/dist/review/budget.d.ts +133 -0
  449. package/dist/review/budget.js +278 -0
  450. package/dist/review/capabilities.d.ts +217 -0
  451. package/dist/review/capabilities.js +46 -0
  452. package/dist/review/change.d.ts +155 -0
  453. package/dist/review/change.js +15 -0
  454. package/dist/review/checks.d.ts +56 -0
  455. package/dist/review/checks.js +11 -0
  456. package/dist/review/config.d.ts +71 -0
  457. package/dist/review/config.js +125 -0
  458. package/dist/review/conventions.d.ts +35 -0
  459. package/dist/review/conventions.js +58 -0
  460. package/dist/review/conversation.d.ts +98 -0
  461. package/dist/review/conversation.js +16 -0
  462. package/dist/review/decided.d.ts +58 -0
  463. package/dist/review/decided.js +67 -0
  464. package/dist/review/diff.d.ts +116 -0
  465. package/dist/review/diff.js +237 -0
  466. package/dist/review/draft/continuation.d.ts +23 -0
  467. package/dist/review/draft/continuation.js +32 -0
  468. package/dist/review/draft/fanout.d.ts +57 -0
  469. package/dist/review/draft/fanout.js +46 -0
  470. package/dist/review/draft/handle.d.ts +55 -0
  471. package/dist/review/draft/handle.js +110 -0
  472. package/dist/review/draft/plan.d.ts +112 -0
  473. package/dist/review/draft/plan.js +343 -0
  474. package/dist/review/draft/publish.d.ts +38 -0
  475. package/dist/review/draft/publish.js +118 -0
  476. package/dist/review/draft/render.d.ts +32 -0
  477. package/dist/review/draft/render.js +100 -0
  478. package/dist/review/draft/state.d.ts +98 -0
  479. package/dist/review/draft/state.js +83 -0
  480. package/dist/review/draft/store.d.ts +33 -0
  481. package/dist/review/draft/store.js +100 -0
  482. package/dist/review/elsewhere.d.ts +27 -0
  483. package/dist/review/elsewhere.js +39 -0
  484. package/dist/review/engine.d.ts +106 -0
  485. package/dist/review/engine.js +243 -0
  486. package/dist/review/events.d.ts +59 -0
  487. package/dist/review/events.js +35 -0
  488. package/dist/review/failed.d.ts +46 -0
  489. package/dist/review/failed.js +56 -0
  490. package/dist/review/finding.d.ts +81 -0
  491. package/dist/review/finding.js +85 -0
  492. package/dist/review/fix.d.ts +147 -0
  493. package/dist/review/fix.js +175 -0
  494. package/dist/review/followup.d.ts +84 -0
  495. package/dist/review/followup.js +123 -0
  496. package/dist/review/index.d.ts +134 -0
  497. package/dist/review/index.js +80 -0
  498. package/dist/review/keys.d.ts +23 -0
  499. package/dist/review/keys.js +40 -0
  500. package/dist/review/landing.d.ts +37 -0
  501. package/dist/review/landing.js +68 -0
  502. package/dist/review/lenses.d.ts +132 -0
  503. package/dist/review/lenses.js +430 -0
  504. package/dist/review/propose-from.d.ts +76 -0
  505. package/dist/review/propose-from.js +86 -0
  506. package/dist/review/provider.d.ts +306 -0
  507. package/dist/review/provider.js +16 -0
  508. package/dist/review/providers/git/index.d.ts +23 -0
  509. package/dist/review/providers/git/index.js +214 -0
  510. package/dist/review/providers/github/authoring.d.ts +22 -0
  511. package/dist/review/providers/github/authoring.js +350 -0
  512. package/dist/review/providers/github/claims.d.ts +49 -0
  513. package/dist/review/providers/github/claims.js +136 -0
  514. package/dist/review/providers/github/conversation.d.ts +18 -0
  515. package/dist/review/providers/github/conversation.js +455 -0
  516. package/dist/review/providers/github/fields.d.ts +30 -0
  517. package/dist/review/providers/github/fields.js +47 -0
  518. package/dist/review/providers/github/index.d.ts +15 -0
  519. package/dist/review/providers/github/index.js +110 -0
  520. package/dist/review/providers/github/proposals.d.ts +14 -0
  521. package/dist/review/providers/github/proposals.js +298 -0
  522. package/dist/review/providers/github/queue.d.ts +46 -0
  523. package/dist/review/providers/github/queue.js +122 -0
  524. package/dist/review/providers/github/stacking.d.ts +20 -0
  525. package/dist/review/providers/github/stacking.js +107 -0
  526. package/dist/review/queue.d.ts +43 -0
  527. package/dist/review/queue.js +56 -0
  528. package/dist/review/reactable.d.ts +93 -0
  529. package/dist/review/reactable.js +140 -0
  530. package/dist/review/register.d.ts +52 -0
  531. package/dist/review/register.js +53 -0
  532. package/dist/review/resolve.d.ts +58 -0
  533. package/dist/review/resolve.js +150 -0
  534. package/dist/review/retarget.d.ts +73 -0
  535. package/dist/review/retarget.js +82 -0
  536. package/dist/review/revisited.d.ts +77 -0
  537. package/dist/review/revisited.js +121 -0
  538. package/dist/review/stack.d.ts +110 -0
  539. package/dist/review/stack.js +52 -0
  540. package/dist/sections/block.d.ts +9 -0
  541. package/dist/sections/block.js +42 -0
  542. package/dist/sections/detect.d.ts +31 -0
  543. package/dist/sections/detect.js +67 -0
  544. package/dist/sections/gate.d.ts +21 -0
  545. package/dist/sections/gate.js +22 -0
  546. package/dist/sections/index.d.ts +5 -0
  547. package/dist/sections/index.js +5 -0
  548. package/dist/sections/sanctioned.d.ts +13 -0
  549. package/dist/sections/sanctioned.js +21 -0
  550. package/dist/shell/index.d.ts +8 -0
  551. package/dist/shell/index.js +8 -0
  552. package/dist/shell/parse.d.ts +125 -0
  553. package/dist/shell/parse.js +298 -0
  554. package/dist/slack/api/channels.d.ts +12 -0
  555. package/dist/slack/api/channels.js +28 -0
  556. package/dist/slack/api/client.d.ts +94 -0
  557. package/dist/slack/api/client.js +272 -0
  558. package/dist/slack/api/files.d.ts +95 -0
  559. package/dist/slack/api/files.js +223 -0
  560. package/dist/slack/api/index.d.ts +11 -0
  561. package/dist/slack/api/index.js +11 -0
  562. package/dist/slack/api/messages.d.ts +98 -0
  563. package/dist/slack/api/messages.js +292 -0
  564. package/dist/slack/api/reactions.d.ts +47 -0
  565. package/dist/slack/api/reactions.js +50 -0
  566. package/dist/slack/api/resolve-conversations.d.ts +43 -0
  567. package/dist/slack/api/resolve-conversations.js +130 -0
  568. package/dist/slack/api/resolve-messages.d.ts +29 -0
  569. package/dist/slack/api/resolve-messages.js +93 -0
  570. package/dist/slack/api/resolve-users.d.ts +27 -0
  571. package/dist/slack/api/resolve-users.js +73 -0
  572. package/dist/slack/api/search.d.ts +86 -0
  573. package/dist/slack/api/search.js +186 -0
  574. package/dist/slack/api/users.d.ts +12 -0
  575. package/dist/slack/api/users.js +33 -0
  576. package/dist/slack/auth/browser-extract.d.ts +33 -0
  577. package/dist/slack/auth/browser-extract.js +201 -0
  578. package/dist/slack/auth/browser.d.ts +5 -0
  579. package/dist/slack/auth/browser.js +25 -0
  580. package/dist/slack/auth/credentials.d.ts +14 -0
  581. package/dist/slack/auth/credentials.js +24 -0
  582. package/dist/slack/auth/errors.d.ts +9 -0
  583. package/dist/slack/auth/errors.js +19 -0
  584. package/dist/slack/auth/extract.d.ts +23 -0
  585. package/dist/slack/auth/extract.js +44 -0
  586. package/dist/slack/auth/index.d.ts +12 -0
  587. package/dist/slack/auth/index.js +11 -0
  588. package/dist/slack/auth/oauth-app.d.ts +11 -0
  589. package/dist/slack/auth/oauth-app.js +20 -0
  590. package/dist/slack/auth/oauth.d.ts +31 -0
  591. package/dist/slack/auth/oauth.js +82 -0
  592. package/dist/slack/auth/server.d.ts +14 -0
  593. package/dist/slack/auth/server.js +75 -0
  594. package/dist/slack/auth/store.d.ts +17 -0
  595. package/dist/slack/auth/store.js +27 -0
  596. package/dist/slack/block-message.d.ts +9 -0
  597. package/dist/slack/block-message.js +30 -0
  598. package/dist/slack/blocks.d.ts +94 -0
  599. package/dist/slack/blocks.js +765 -0
  600. package/dist/slack/content-gate.d.ts +12 -0
  601. package/dist/slack/content-gate.js +22 -0
  602. package/dist/slack/detect.d.ts +31 -0
  603. package/dist/slack/detect.js +125 -0
  604. package/dist/slack/index.d.ts +18 -0
  605. package/dist/slack/index.js +17 -0
  606. package/dist/slack/paths.d.ts +28 -0
  607. package/dist/slack/paths.js +46 -0
  608. package/dist/slack/renderers/channel.d.ts +6 -0
  609. package/dist/slack/renderers/channel.js +27 -0
  610. package/dist/slack/renderers/index.d.ts +9 -0
  611. package/dist/slack/renderers/index.js +9 -0
  612. package/dist/slack/renderers/message.d.ts +21 -0
  613. package/dist/slack/renderers/message.js +214 -0
  614. package/dist/slack/renderers/reactions.d.ts +8 -0
  615. package/dist/slack/renderers/reactions.js +43 -0
  616. package/dist/slack/renderers/search.d.ts +6 -0
  617. package/dist/slack/renderers/search.js +39 -0
  618. package/dist/slack/renderers/user.d.ts +6 -0
  619. package/dist/slack/renderers/user.js +32 -0
  620. package/dist/slack/resolvers/cache.d.ts +29 -0
  621. package/dist/slack/resolvers/cache.js +70 -0
  622. package/dist/slack/resolvers/conversation-cache.d.ts +42 -0
  623. package/dist/slack/resolvers/conversation-cache.js +128 -0
  624. package/dist/slack/resolvers/conversation.d.ts +44 -0
  625. package/dist/slack/resolvers/conversation.js +229 -0
  626. package/dist/slack/resolvers/index.d.ts +8 -0
  627. package/dist/slack/resolvers/index.js +8 -0
  628. package/dist/slack/resolvers/target.d.ts +19 -0
  629. package/dist/slack/resolvers/target.js +45 -0
  630. package/dist/slack/resolvers/url.d.ts +20 -0
  631. package/dist/slack/resolvers/url.js +22 -0
  632. package/dist/slack/resolvers/user.d.ts +54 -0
  633. package/dist/slack/resolvers/user.js +134 -0
  634. package/dist/slack/types.d.ts +180 -0
  635. package/dist/slack/types.js +13 -0
  636. package/dist/tdd/attest.d.ts +21 -0
  637. package/dist/tdd/attest.js +21 -0
  638. package/dist/tdd/discipline.d.ts +11 -0
  639. package/dist/tdd/discipline.js +28 -0
  640. package/dist/tdd/index.d.ts +14 -0
  641. package/dist/tdd/index.js +13 -0
  642. package/dist/tdd/machine.d.ts +48 -0
  643. package/dist/tdd/machine.js +139 -0
  644. package/dist/tdd/presentation.d.ts +34 -0
  645. package/dist/tdd/presentation.js +38 -0
  646. package/dist/tdd/queries.d.ts +10 -0
  647. package/dist/tdd/queries.js +22 -0
  648. package/dist/terminal/index.d.ts +12 -0
  649. package/dist/terminal/index.js +11 -0
  650. package/dist/terminal/register.d.ts +21 -0
  651. package/dist/terminal/register.js +31 -0
  652. package/dist/terminal/resolve.d.ts +63 -0
  653. package/dist/terminal/resolve.js +117 -0
  654. package/dist/terminal/types.d.ts +134 -0
  655. package/dist/terminal/types.js +19 -0
  656. package/dist/thinking/index.d.ts +20 -0
  657. package/dist/thinking/index.js +27 -0
  658. package/dist/title/block.d.ts +9 -0
  659. package/dist/title/block.js +32 -0
  660. package/dist/title/detect.d.ts +25 -0
  661. package/dist/title/detect.js +154 -0
  662. package/dist/title/gate.d.ts +19 -0
  663. package/dist/title/gate.js +21 -0
  664. package/dist/title/index.d.ts +3 -0
  665. package/dist/title/index.js +3 -0
  666. package/dist/tree/index.d.ts +18 -0
  667. package/dist/tree/index.js +17 -0
  668. package/dist/tree/register.d.ts +21 -0
  669. package/dist/tree/register.js +31 -0
  670. package/dist/tree/resolve.d.ts +20 -0
  671. package/dist/tree/resolve.js +31 -0
  672. package/dist/tree/types.d.ts +83 -0
  673. package/dist/tree/types.js +12 -0
  674. package/dist/ui/count.d.ts +29 -0
  675. package/dist/ui/count.js +35 -0
  676. package/dist/ui/path.d.ts +25 -0
  677. package/dist/ui/path.js +40 -0
  678. package/dist/verify/index.d.ts +17 -0
  679. package/dist/verify/index.js +14 -0
  680. package/dist/verify/project.d.ts +21 -0
  681. package/dist/verify/project.js +49 -0
  682. package/dist/verify/resolve.d.ts +26 -0
  683. package/dist/verify/resolve.js +27 -0
  684. package/dist/verify/run.d.ts +31 -0
  685. package/dist/verify/run.js +145 -0
  686. package/dist/web/a11y/announcements.d.ts +67 -0
  687. package/dist/web/a11y/announcements.js +116 -0
  688. package/dist/web/a11y/budget.d.ts +75 -0
  689. package/dist/web/a11y/budget.js +97 -0
  690. package/dist/web/a11y/focus.d.ts +37 -0
  691. package/dist/web/a11y/focus.js +106 -0
  692. package/dist/web/a11y/index.d.ts +19 -0
  693. package/dist/web/a11y/index.js +25 -0
  694. package/dist/web/a11y/naming.d.ts +23 -0
  695. package/dist/web/a11y/naming.js +55 -0
  696. package/dist/web/a11y/outline.d.ts +23 -0
  697. package/dist/web/a11y/outline.js +42 -0
  698. package/dist/web/a11y/reading.d.ts +12 -0
  699. package/dist/web/a11y/reading.js +101 -0
  700. package/dist/web/a11y/scope.d.ts +23 -0
  701. package/dist/web/a11y/scope.js +99 -0
  702. package/dist/web/a11y/states.d.ts +22 -0
  703. package/dist/web/a11y/states.js +53 -0
  704. package/dist/web/a11y/tree.d.ts +124 -0
  705. package/dist/web/a11y/tree.js +269 -0
  706. package/dist/web/a11y/walk.d.ts +225 -0
  707. package/dist/web/a11y/walk.js +568 -0
  708. package/dist/web/a11y/walkprobe.d.ts +44 -0
  709. package/dist/web/a11y/walkprobe.js +365 -0
  710. package/dist/web/audit/axe.d.ts +219 -0
  711. package/dist/web/audit/axe.js +322 -0
  712. package/dist/web/audit/behind.d.ts +63 -0
  713. package/dist/web/audit/behind.js +142 -0
  714. package/dist/web/audit/capture.d.ts +43 -0
  715. package/dist/web/audit/capture.js +185 -0
  716. package/dist/web/audit/colour.d.ts +85 -0
  717. package/dist/web/audit/colour.js +189 -0
  718. package/dist/web/audit/contrast.d.ts +74 -0
  719. package/dist/web/audit/contrast.js +104 -0
  720. package/dist/web/audit/health.d.ts +27 -0
  721. package/dist/web/audit/health.js +57 -0
  722. package/dist/web/audit/index.d.ts +22 -0
  723. package/dist/web/audit/index.js +22 -0
  724. package/dist/web/audit/pair.d.ts +55 -0
  725. package/dist/web/audit/pair.js +157 -0
  726. package/dist/web/audit/probe.d.ts +31 -0
  727. package/dist/web/audit/probe.js +189 -0
  728. package/dist/web/audit/report.d.ts +22 -0
  729. package/dist/web/audit/report.js +250 -0
  730. package/dist/web/audit/structure.d.ts +126 -0
  731. package/dist/web/audit/structure.js +595 -0
  732. package/dist/web/audit/sweep.d.ts +66 -0
  733. package/dist/web/audit/sweep.js +117 -0
  734. package/dist/web/audit/target.d.ts +89 -0
  735. package/dist/web/audit/target.js +168 -0
  736. package/dist/web/audit/verdict.d.ts +48 -0
  737. package/dist/web/audit/verdict.js +52 -0
  738. package/dist/web/audit/visual.d.ts +161 -0
  739. package/dist/web/audit/visual.js +297 -0
  740. package/dist/web/browser.d.ts +213 -0
  741. package/dist/web/browser.js +927 -0
  742. package/dist/web/compare/images.d.ts +45 -0
  743. package/dist/web/compare/images.js +101 -0
  744. package/dist/web/compare/index.d.ts +15 -0
  745. package/dist/web/compare/index.js +15 -0
  746. package/dist/web/compare/provenance.d.ts +48 -0
  747. package/dist/web/compare/provenance.js +86 -0
  748. package/dist/web/compare/regions.d.ts +78 -0
  749. package/dist/web/compare/regions.js +211 -0
  750. package/dist/web/cookies/extract.d.ts +26 -0
  751. package/dist/web/cookies/extract.js +167 -0
  752. package/dist/web/cookies/index.d.ts +8 -0
  753. package/dist/web/cookies/index.js +7 -0
  754. package/dist/web/cookies/inject.d.ts +13 -0
  755. package/dist/web/cookies/inject.js +27 -0
  756. package/dist/web/cookies/setup.d.ts +31 -0
  757. package/dist/web/cookies/setup.js +94 -0
  758. package/dist/web/design/index.d.ts +9 -0
  759. package/dist/web/design/index.js +9 -0
  760. package/dist/web/design/inventory.d.ts +126 -0
  761. package/dist/web/design/inventory.js +324 -0
  762. package/dist/web/design/probe.d.ts +24 -0
  763. package/dist/web/design/probe.js +88 -0
  764. package/dist/web/element/actionable.d.ts +34 -0
  765. package/dist/web/element/actionable.js +48 -0
  766. package/dist/web/element/animations.d.ts +48 -0
  767. package/dist/web/element/animations.js +74 -0
  768. package/dist/web/element/box.d.ts +53 -0
  769. package/dist/web/element/box.js +58 -0
  770. package/dist/web/element/hover.d.ts +75 -0
  771. package/dist/web/element/hover.js +172 -0
  772. package/dist/web/element/index.d.ts +17 -0
  773. package/dist/web/element/index.js +17 -0
  774. package/dist/web/element/listeners.d.ts +72 -0
  775. package/dist/web/element/listeners.js +98 -0
  776. package/dist/web/element/measure.d.ts +40 -0
  777. package/dist/web/element/measure.js +118 -0
  778. package/dist/web/element/probes.d.ts +108 -0
  779. package/dist/web/element/probes.js +195 -0
  780. package/dist/web/element/pseudo.d.ts +51 -0
  781. package/dist/web/element/pseudo.js +96 -0
  782. package/dist/web/element/view.d.ts +30 -0
  783. package/dist/web/element/view.js +117 -0
  784. package/dist/web/element/visibility.d.ts +42 -0
  785. package/dist/web/element/visibility.js +67 -0
  786. package/dist/web/envelope/artifacts.d.ts +23 -0
  787. package/dist/web/envelope/artifacts.js +45 -0
  788. package/dist/web/envelope/index.d.ts +9 -0
  789. package/dist/web/envelope/index.js +9 -0
  790. package/dist/web/envelope/naming.d.ts +23 -0
  791. package/dist/web/envelope/naming.js +43 -0
  792. package/dist/web/envelope/paged.d.ts +42 -0
  793. package/dist/web/envelope/paged.js +99 -0
  794. package/dist/web/envelope/sink.d.ts +43 -0
  795. package/dist/web/envelope/sink.js +67 -0
  796. package/dist/web/environment/devices.d.ts +65 -0
  797. package/dist/web/environment/devices.js +82 -0
  798. package/dist/web/environment/emulation.d.ts +124 -0
  799. package/dist/web/environment/emulation.js +258 -0
  800. package/dist/web/environment/index.d.ts +15 -0
  801. package/dist/web/environment/index.js +15 -0
  802. package/dist/web/environment/probes.d.ts +18 -0
  803. package/dist/web/environment/probes.js +40 -0
  804. package/dist/web/environment/shaping.d.ts +90 -0
  805. package/dist/web/environment/shaping.js +141 -0
  806. package/dist/web/environment/status.d.ts +51 -0
  807. package/dist/web/environment/status.js +109 -0
  808. package/dist/web/environment/storage.d.ts +55 -0
  809. package/dist/web/environment/storage.js +142 -0
  810. package/dist/web/environment/tabs.d.ts +32 -0
  811. package/dist/web/environment/tabs.js +47 -0
  812. package/dist/web/environment/view.d.ts +10 -0
  813. package/dist/web/environment/view.js +42 -0
  814. package/dist/web/evaluate/index.d.ts +6 -0
  815. package/dist/web/evaluate/index.js +6 -0
  816. package/dist/web/evaluate/outcome.d.ts +74 -0
  817. package/dist/web/evaluate/outcome.js +91 -0
  818. package/dist/web/evaluate/probe.d.ts +31 -0
  819. package/dist/web/evaluate/probe.js +303 -0
  820. package/dist/web/index.d.ts +47 -0
  821. package/dist/web/index.js +47 -0
  822. package/dist/web/input/index.d.ts +11 -0
  823. package/dist/web/input/index.js +11 -0
  824. package/dist/web/input/keys.d.ts +48 -0
  825. package/dist/web/input/keys.js +189 -0
  826. package/dist/web/input/pointer.d.ts +56 -0
  827. package/dist/web/input/pointer.js +77 -0
  828. package/dist/web/input/touch.d.ts +61 -0
  829. package/dist/web/input/touch.js +83 -0
  830. package/dist/web/mermaid.d.ts +69 -0
  831. package/dist/web/mermaid.js +223 -0
  832. package/dist/web/paths.d.ts +16 -0
  833. package/dist/web/paths.js +27 -0
  834. package/dist/web/perf/heap.d.ts +42 -0
  835. package/dist/web/perf/heap.js +73 -0
  836. package/dist/web/perf/index.d.ts +14 -0
  837. package/dist/web/perf/index.js +14 -0
  838. package/dist/web/perf/layers.d.ts +98 -0
  839. package/dist/web/perf/layers.js +165 -0
  840. package/dist/web/perf/probe.d.ts +26 -0
  841. package/dist/web/perf/probe.js +123 -0
  842. package/dist/web/perf/profile.d.ts +53 -0
  843. package/dist/web/perf/profile.js +97 -0
  844. package/dist/web/perf/trace.d.ts +152 -0
  845. package/dist/web/perf/trace.js +429 -0
  846. package/dist/web/perf/view.d.ts +6 -0
  847. package/dist/web/perf/view.js +86 -0
  848. package/dist/web/perf/vitals.d.ts +141 -0
  849. package/dist/web/perf/vitals.js +175 -0
  850. package/dist/web/reader.d.ts +131 -0
  851. package/dist/web/reader.js +340 -0
  852. package/dist/web/screenshot.d.ts +50 -0
  853. package/dist/web/screenshot.js +108 -0
  854. package/dist/web/search.d.ts +49 -0
  855. package/dist/web/search.js +137 -0
  856. package/dist/web/session/artifacts.d.ts +32 -0
  857. package/dist/web/session/artifacts.js +47 -0
  858. package/dist/web/session/emulation.d.ts +118 -0
  859. package/dist/web/session/emulation.js +307 -0
  860. package/dist/web/session/recording.d.ts +51 -0
  861. package/dist/web/session/recording.js +64 -0
  862. package/dist/web/session/settling.d.ts +42 -0
  863. package/dist/web/session/settling.js +104 -0
  864. package/dist/web/session/shaping.d.ts +48 -0
  865. package/dist/web/session/shaping.js +113 -0
  866. package/dist/web/session/sourcemaps.d.ts +64 -0
  867. package/dist/web/session/sourcemaps.js +135 -0
  868. package/dist/web/session/telemetry.d.ts +219 -0
  869. package/dist/web/session/telemetry.js +486 -0
  870. package/dist/web/session/wires.d.ts +22 -0
  871. package/dist/web/session/wires.js +11 -0
  872. package/dist/web/session.d.ts +1153 -0
  873. package/dist/web/session.js +3400 -0
  874. package/dist/web/snapshot/deep.d.ts +36 -0
  875. package/dist/web/snapshot/deep.js +91 -0
  876. package/dist/web/snapshot/flatten.d.ts +101 -0
  877. package/dist/web/snapshot/flatten.js +131 -0
  878. package/dist/web/snapshot/index.d.ts +8 -0
  879. package/dist/web/snapshot/index.js +10 -0
  880. package/dist/web/snapshot/presented.d.ts +32 -0
  881. package/dist/web/snapshot/presented.js +74 -0
  882. package/dist/web/snapshot/query.d.ts +67 -0
  883. package/dist/web/snapshot/query.js +136 -0
  884. package/dist/web/sourcemap/index.d.ts +9 -0
  885. package/dist/web/sourcemap/index.js +9 -0
  886. package/dist/web/sourcemap/mappings.d.ts +111 -0
  887. package/dist/web/sourcemap/mappings.js +218 -0
  888. package/dist/web/styles/capture.d.ts +49 -0
  889. package/dist/web/styles/capture.js +85 -0
  890. package/dist/web/styles/cascade.d.ts +107 -0
  891. package/dist/web/styles/cascade.js +275 -0
  892. package/dist/web/styles/curation.d.ts +45 -0
  893. package/dist/web/styles/curation.js +282 -0
  894. package/dist/web/styles/index.d.ts +10 -0
  895. package/dist/web/styles/index.js +10 -0
  896. package/dist/web/target/index.d.ts +7 -0
  897. package/dist/web/target/index.js +7 -0
  898. package/dist/web/target/refusals.d.ts +59 -0
  899. package/dist/web/target/refusals.js +305 -0
  900. package/dist/web/target/target.d.ts +59 -0
  901. package/dist/web/target/target.js +94 -0
  902. package/dist/web/telemetry/buffer.d.ts +35 -0
  903. package/dist/web/telemetry/buffer.js +72 -0
  904. package/dist/web/telemetry/console.d.ts +127 -0
  905. package/dist/web/telemetry/console.js +217 -0
  906. package/dist/web/telemetry/dialogs.d.ts +41 -0
  907. package/dist/web/telemetry/dialogs.js +38 -0
  908. package/dist/web/telemetry/downloads.d.ts +42 -0
  909. package/dist/web/telemetry/downloads.js +65 -0
  910. package/dist/web/telemetry/failure.d.ts +31 -0
  911. package/dist/web/telemetry/failure.js +72 -0
  912. package/dist/web/telemetry/har.d.ts +97 -0
  913. package/dist/web/telemetry/har.js +227 -0
  914. package/dist/web/telemetry/index.d.ts +18 -0
  915. package/dist/web/telemetry/index.js +18 -0
  916. package/dist/web/telemetry/lifecycle.d.ts +69 -0
  917. package/dist/web/telemetry/lifecycle.js +120 -0
  918. package/dist/web/telemetry/network.d.ts +152 -0
  919. package/dist/web/telemetry/network.js +130 -0
  920. package/dist/web/telemetry/requests.d.ts +31 -0
  921. package/dist/web/telemetry/requests.js +119 -0
  922. package/dist/web/telemetry/sockets.d.ts +56 -0
  923. package/dist/web/telemetry/sockets.js +101 -0
  924. package/dist/web/telemetry/view.d.ts +16 -0
  925. package/dist/web/telemetry/view.js +125 -0
  926. package/dist/web/wait/conditions.d.ts +87 -0
  927. package/dist/web/wait/conditions.js +100 -0
  928. package/dist/web/wait/index.d.ts +6 -0
  929. package/dist/web/wait/index.js +6 -0
  930. package/dist/web/wait/settle.d.ts +54 -0
  931. package/dist/web/wait/settle.js +84 -0
  932. package/dist/work/ask.d.ts +45 -0
  933. package/dist/work/ask.js +85 -0
  934. package/dist/work/author.d.ts +61 -0
  935. package/dist/work/author.js +144 -0
  936. package/dist/work/broker.d.ts +151 -0
  937. package/dist/work/broker.js +165 -0
  938. package/dist/work/events.d.ts +98 -0
  939. package/dist/work/events.js +57 -0
  940. package/dist/work/history.d.ts +69 -0
  941. package/dist/work/history.js +174 -0
  942. package/dist/work/index.d.ts +49 -0
  943. package/dist/work/index.js +33 -0
  944. package/dist/work/inplay.d.ts +43 -0
  945. package/dist/work/inplay.js +42 -0
  946. package/dist/work/memory.d.ts +84 -0
  947. package/dist/work/memory.js +203 -0
  948. package/dist/work/objection.d.ts +92 -0
  949. package/dist/work/objection.js +72 -0
  950. package/dist/work/provider.d.ts +79 -0
  951. package/dist/work/provider.js +45 -0
  952. package/dist/work/providers/git.d.ts +29 -0
  953. package/dist/work/providers/git.js +87 -0
  954. package/dist/work/publish.d.ts +53 -0
  955. package/dist/work/publish.js +139 -0
  956. package/dist/work/rebase.d.ts +78 -0
  957. package/dist/work/rebase.js +261 -0
  958. package/dist/work/reclaim.d.ts +56 -0
  959. package/dist/work/reclaim.js +52 -0
  960. package/dist/work/register.d.ts +29 -0
  961. package/dist/work/register.js +41 -0
  962. package/dist/work/stack.d.ts +126 -0
  963. package/dist/work/stack.js +243 -0
  964. package/dist/work/stacks.d.ts +156 -0
  965. package/dist/work/stacks.js +524 -0
  966. package/dist/work/survey.d.ts +52 -0
  967. package/dist/work/survey.js +58 -0
  968. package/dist/work/tidy.d.ts +147 -0
  969. package/dist/work/tidy.js +136 -0
  970. package/dist/work/tree.d.ts +120 -0
  971. package/dist/work/tree.js +69 -0
  972. package/dist/work/unattended.d.ts +40 -0
  973. package/dist/work/unattended.js +57 -0
  974. package/package.json +145 -0
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Production git predicates for the write classifier. Each shells
3
+ * out to git from the directory enclosing the target, so a target
4
+ * in a different repository than the session cwd is judged against
5
+ * its own repository. Every call fails closed to the safe answer
6
+ * when git is absent, the path is outside a repository, or the
7
+ * subprocess errors: no tree root, not ignored, not tracked.
8
+ *
9
+ * The pure classifier takes these as injected predicates; this
10
+ * module is the real implementation it composes in production.
11
+ */
12
+ import { execFileSync } from "node:child_process";
13
+ import { existsSync, realpathSync, statSync } from "node:fs";
14
+ import * as path from "node:path";
15
+ /**
16
+ * Wall-clock ceiling for a single git invocation. The classifier
17
+ * runs on the synchronous tool_call path, so a wedged git must not
18
+ * hang the event loop with no operator lever; a timeout throws,
19
+ * which every caller already treats as the safe answer.
20
+ */
21
+ const GIT_TIMEOUT_MS = 5000;
22
+ /** Run git in `cwd`, returning trimmed stdout, or null on any failure. */
23
+ function git(cwd, args) {
24
+ try {
25
+ return execFileSync("git", args, {
26
+ cwd,
27
+ encoding: "utf8",
28
+ stdio: ["ignore", "pipe", "ignore"],
29
+ timeout: GIT_TIMEOUT_MS,
30
+ }).trim();
31
+ }
32
+ catch {
33
+ // git missing, non-zero exit (e.g. not a repo, not ignored,
34
+ // not tracked) or any spawn error: the caller's safe answer.
35
+ return null;
36
+ }
37
+ }
38
+ /**
39
+ * The canonical directory to run git from and the canonical target
40
+ * path, for a target that may not exist yet. Walks up to the
41
+ * nearest existing ancestor (so git runs from a real directory
42
+ * even when several leading path segments are missing) and
43
+ * realpath's it, so a /var versus /private/var spelling does not
44
+ * read as outside the repository. The missing tail is re-appended
45
+ * to form the full canonical target.
46
+ */
47
+ function located(absPath) {
48
+ const resolved = path.resolve(absPath);
49
+ const tail = [];
50
+ let prefix = path.dirname(resolved);
51
+ tail.unshift(path.basename(resolved));
52
+ while (true) {
53
+ try {
54
+ const dir = realpathSync(prefix);
55
+ return { dir, target: path.join(dir, ...tail) };
56
+ }
57
+ catch {
58
+ // prefix does not exist; step up and try its parent.
59
+ }
60
+ const parent = path.dirname(prefix);
61
+ if (parent === prefix)
62
+ return { dir: prefix, target: resolved };
63
+ tail.unshift(path.basename(prefix));
64
+ prefix = parent;
65
+ }
66
+ }
67
+ /**
68
+ * The git working tree root containing the target, or null when the
69
+ * target is not inside any repository. Resolves through `.git` files
70
+ * (worktrees) natively via rev-parse.
71
+ *
72
+ * Accepts a directory as readily as a file. It did not always: it ran
73
+ * git from `located().dir`, which resolves an existing directory to
74
+ * its parent, and the parent of a repository root is outside the
75
+ * repository. So the one input a caller is most likely to hold, the
76
+ * root of the checkout they are standing in, answered null. Two
77
+ * callers knew and worked around it by appending a filename they
78
+ * invented; the third did not, and shipped a verb that refused in the
79
+ * only place it was meant to work.
80
+ */
81
+ export function gitTreeRootOf(absPath) {
82
+ const root = git(fromInside(absPath), ["rev-parse", "--show-toplevel"]);
83
+ return root && root.length > 0 ? root : null;
84
+ }
85
+ /**
86
+ * The directory to run git from for a target: the target itself when
87
+ * it is a directory, and otherwise the nearest existing ancestor.
88
+ */
89
+ function fromInside(absPath) {
90
+ try {
91
+ if (statSync(absPath).isDirectory())
92
+ return realpathSync(absPath);
93
+ }
94
+ catch {
95
+ // Does not exist, so it is a path a caller invented to probe with.
96
+ // located() walks up to the nearest real ancestor, which is what
97
+ // those callers were relying on and what still happens below.
98
+ }
99
+ return located(absPath).dir;
100
+ }
101
+ /**
102
+ * Whether the target sits in a repository's primary checkout, as
103
+ * opposed to a linked worktree. The main tree's git-dir equals its
104
+ * git-common-dir; a linked worktree's git-dir is under
105
+ * `.git/worktrees/`, so the two differ. False when git cannot answer
106
+ * or the path is outside any repository, so a doubtful case never
107
+ * reads as the shared main tree by accident.
108
+ */
109
+ export function isMainWorkingTree(absPath) {
110
+ // Probe a child path so git runs from the directory itself, the
111
+ // same trick gitTreeRootOf uses; located() otherwise resolves to
112
+ // the parent of an existing directory.
113
+ const { dir } = located(path.join(absPath, ".quest-tree-probe"));
114
+ const gitDir = git(dir, ["rev-parse", "--path-format=absolute", "--git-dir"]);
115
+ const commonDir = git(dir, [
116
+ "rev-parse",
117
+ "--path-format=absolute",
118
+ "--git-common-dir",
119
+ ]);
120
+ if (!gitDir || !commonDir)
121
+ return false;
122
+ return canonicalPath(gitDir) === canonicalPath(commonDir);
123
+ }
124
+ /** Whether the target is gitignored at its destination. */
125
+ export function isGitignored(absPath) {
126
+ const { dir, target } = located(absPath);
127
+ try {
128
+ execFileSync("git", ["check-ignore", "-q", "--", target], {
129
+ cwd: dir,
130
+ stdio: "ignore",
131
+ timeout: GIT_TIMEOUT_MS,
132
+ });
133
+ return true;
134
+ }
135
+ catch {
136
+ // Exit 1 (not ignored) and 128 (not a repo) both land here as
137
+ // "not ignored," which is the safe answer for the classifier.
138
+ return false;
139
+ }
140
+ }
141
+ /**
142
+ * Canonicalize a path for comparison, tolerating a path that does
143
+ * not exist yet. Resolves the longest existing ancestor (which
144
+ * turns /var into /private/var on macOS) and re-appends the missing
145
+ * tail. The literal path survives a total failure.
146
+ */
147
+ export function canonicalPath(p) {
148
+ const tail = [];
149
+ let prefix = p;
150
+ while (!existsSync(prefix)) {
151
+ const parent = path.dirname(prefix);
152
+ if (parent === prefix)
153
+ return p;
154
+ tail.unshift(path.basename(prefix));
155
+ prefix = parent;
156
+ }
157
+ try {
158
+ const real = realpathSync(prefix);
159
+ return tail.length > 0 ? path.join(real, ...tail) : real;
160
+ }
161
+ catch {
162
+ // realpath can fail on a broken symlink; the literal path is best.
163
+ return p;
164
+ }
165
+ }
166
+ /**
167
+ * Whether `child` is `parent` or lives beneath it, comparing
168
+ * canonicalized paths with a separator boundary so a /var versus
169
+ * /private/var spelling still matches and a sibling whose name
170
+ * merely shares a prefix (feature-2 against feat) does not.
171
+ */
172
+ export function isWithin(child, parent) {
173
+ const c = canonicalPath(child);
174
+ const p = canonicalPath(parent);
175
+ return c === p || c.startsWith(p + path.sep);
176
+ }
177
+ /** Whether the target is tracked in its repository's index. */
178
+ export function isTracked(absPath) {
179
+ const { dir, target } = located(absPath);
180
+ try {
181
+ execFileSync("git", ["ls-files", "--error-unmatch", "--", target], {
182
+ cwd: dir,
183
+ stdio: "ignore",
184
+ timeout: GIT_TIMEOUT_MS,
185
+ });
186
+ return true;
187
+ }
188
+ catch {
189
+ // Non-zero exit (untracked or not a repo): not tracked.
190
+ return false;
191
+ }
192
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Quest and document ID minting.
3
+ *
4
+ * IDs are deterministic in shape, random in suffix:
5
+ *
6
+ * PREFIX-YYYYMMDD-XXXXXX
7
+ *
8
+ * `PREFIX` is one of the four-character codes for our
9
+ * document kinds. `YYYYMMDD` is the creation date in the
10
+ * local timezone (we never coordinate IDs across timezones,
11
+ * so local is what the user expects to see). `XXXXXX` is a
12
+ * six-character base-36 (upper) random suffix giving roughly
13
+ * 2.18 billion distinct IDs per kind per day.
14
+ */
15
+ /** Recognised ID prefixes for the four document kinds plus quests. */
16
+ export declare const ID_PREFIXES: readonly ["QEST", "PLAN", "RSCH", "BRIF", "RPRT"];
17
+ export type IdPrefix = (typeof ID_PREFIXES)[number];
18
+ /**
19
+ * Mint a fresh ID. The date defaults to `new Date()`; tests
20
+ * pass a fixed date for stable output.
21
+ */
22
+ export declare function mintId(prefix: IdPrefix, date?: Date): string;
23
+ /** Quick validation: is this string a valid ID? */
24
+ export declare function isId(text: string): boolean;
25
+ /** Extract the prefix from an ID, or `undefined` for an invalid ID. */
26
+ export declare function prefixOf(id: string): IdPrefix | undefined;
27
+ /** Extract the date portion (YYYYMMDD) from an ID, or `undefined`. */
28
+ export declare function dateOf(id: string): string | undefined;
29
+ /** Find every valid ID in a body of text. */
30
+ export declare function findIds(text: string): string[];
31
+ /**
32
+ * How an inline ID mention reads. A bare `QEST-...` reads
33
+ * as a `reference`. An id preceded by the `→` sigil
34
+ * (after optional whitespace) reads as `produced`: the
35
+ * containing document is the work that produced the
36
+ * mentioned id.
37
+ */
38
+ export type IdMentionRelation = "produced" | "reference";
39
+ export interface IdMention {
40
+ id: string;
41
+ relation: IdMentionRelation;
42
+ }
43
+ /**
44
+ * Find every ID in a body of text and classify each
45
+ * mention as a bare reference or a produced-by sigil hit.
46
+ * When the same id appears more than once, the strongest
47
+ * relation wins: a single `→ ID` anywhere upgrades the
48
+ * record from `reference` to `produced`.
49
+ */
50
+ export declare function findIdsWithRelation(text: string): IdMention[];
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Quest and document ID minting.
3
+ *
4
+ * IDs are deterministic in shape, random in suffix:
5
+ *
6
+ * PREFIX-YYYYMMDD-XXXXXX
7
+ *
8
+ * `PREFIX` is one of the four-character codes for our
9
+ * document kinds. `YYYYMMDD` is the creation date in the
10
+ * local timezone (we never coordinate IDs across timezones,
11
+ * so local is what the user expects to see). `XXXXXX` is a
12
+ * six-character base-36 (upper) random suffix giving roughly
13
+ * 2.18 billion distinct IDs per kind per day.
14
+ */
15
+ import { randomBytes } from "node:crypto";
16
+ /** Recognised ID prefixes for the four document kinds plus quests. */
17
+ export const ID_PREFIXES = ["QEST", "PLAN", "RSCH", "BRIF", "RPRT"];
18
+ // YYYY: 1900-2999. MM: 01-12. DD: 01-31. This is a
19
+ // shape check, not a perfect calendar validator: it
20
+ // rejects the obvious garbage (00000000, 20261345) the
21
+ // old `\d{8}` accepted while staying cheap.
22
+ const DATE_PATTERN = "(?:19|2[0-9])\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])";
23
+ const ID_REGEX = new RegExp(`^(${ID_PREFIXES.join("|")})-(${DATE_PATTERN})-([0-9A-Z]{6})$`);
24
+ const ID_REGEX_BODY = `(${ID_PREFIXES.join("|")})-(${DATE_PATTERN})-([0-9A-Z]{6})`;
25
+ function pad(n) {
26
+ return String(n).padStart(2, "0");
27
+ }
28
+ function ymd(date) {
29
+ return `${date.getFullYear()}${pad(date.getMonth() + 1)}${pad(date.getDate())}`;
30
+ }
31
+ /** Build a six-character base-36 uppercase random suffix. */
32
+ function randomSuffix() {
33
+ const bytes = randomBytes(6);
34
+ const out = [];
35
+ for (let i = 0; i < 6; i++) {
36
+ out.push((bytes[i] % 36).toString(36).toUpperCase());
37
+ }
38
+ return out.join("");
39
+ }
40
+ /**
41
+ * Mint a fresh ID. The date defaults to `new Date()`; tests
42
+ * pass a fixed date for stable output.
43
+ */
44
+ export function mintId(prefix, date = new Date()) {
45
+ return `${prefix}-${ymd(date)}-${randomSuffix()}`;
46
+ }
47
+ /** Quick validation: is this string a valid ID? */
48
+ export function isId(text) {
49
+ return ID_REGEX.test(text);
50
+ }
51
+ /** Extract the prefix from an ID, or `undefined` for an invalid ID. */
52
+ export function prefixOf(id) {
53
+ const match = ID_REGEX.exec(id);
54
+ return match ? match[1] : undefined;
55
+ }
56
+ /** Extract the date portion (YYYYMMDD) from an ID, or `undefined`. */
57
+ export function dateOf(id) {
58
+ const match = ID_REGEX.exec(id);
59
+ return match ? match[2] : undefined;
60
+ }
61
+ /** Find every valid ID in a body of text. */
62
+ export function findIds(text) {
63
+ // We need a no-anchor flavour of the regex so it can
64
+ // scan the middle of a string. The `\b` boundary keeps
65
+ // us from matching IDs embedded inside longer tokens.
66
+ const scan = new RegExp(`\\b${ID_REGEX_BODY}\\b`, "g");
67
+ const out = [];
68
+ const seen = new Set();
69
+ for (const m of text.matchAll(scan)) {
70
+ if (!seen.has(m[0])) {
71
+ seen.add(m[0]);
72
+ out.push(m[0]);
73
+ }
74
+ }
75
+ return out;
76
+ }
77
+ /**
78
+ * Find every ID in a body of text and classify each
79
+ * mention as a bare reference or a produced-by sigil hit.
80
+ * When the same id appears more than once, the strongest
81
+ * relation wins: a single `→ ID` anywhere upgrades the
82
+ * record from `reference` to `produced`.
83
+ */
84
+ export function findIdsWithRelation(text) {
85
+ const scan = new RegExp(`\\b${ID_REGEX_BODY}\\b`, "g");
86
+ const seen = new Map();
87
+ const order = [];
88
+ for (const m of text.matchAll(scan)) {
89
+ const id = m[0];
90
+ const start = m.index ?? 0;
91
+ const relation = sigilBefore(text, start) ? "produced" : "reference";
92
+ const prev = seen.get(id);
93
+ if (prev === undefined) {
94
+ order.push(id);
95
+ seen.set(id, relation);
96
+ continue;
97
+ }
98
+ if (prev === "reference" && relation === "produced") {
99
+ seen.set(id, relation);
100
+ }
101
+ }
102
+ return order.map((id) => ({
103
+ id,
104
+ relation: seen.get(id) ?? "reference",
105
+ }));
106
+ }
107
+ function sigilBefore(text, idStart) {
108
+ // Walk backwards past whitespace; if we hit a → with
109
+ // nothing but whitespace in between, the id reads as
110
+ // `produced`. Anything else (text, punctuation, line
111
+ // boundary) means bare reference.
112
+ let i = idStart - 1;
113
+ while (i >= 0 && /\s/.test(text[i]))
114
+ i--;
115
+ return i >= 0 && text[i] === "\u2192";
116
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Atomic file IO and per-quest advisory locks.
3
+ *
4
+ * Quest READMEs are read-modify-write at every action,
5
+ * potentially from two pi sessions attached to the same
6
+ * quest at the same time. Two concerns:
7
+ *
8
+ * 1. Torn reads. The "read text, parse, mutate, write
9
+ * text" sequence is not atomic against a concurrent
10
+ * reader; on a slow disk a reader sees half a file.
11
+ * We write to a sibling temp file, fsync, then rename
12
+ * over the target so observers always see the old or
13
+ * new file in full.
14
+ *
15
+ * 2. Lost updates. Two pi sessions running in parallel
16
+ * both load the README, both mutate frontmatter
17
+ * in-memory, both write back: the second overwrites
18
+ * the first. We take a coarse per-quest lock around
19
+ * the read-modify-write so the second waits.
20
+ *
21
+ * The lock is file-creation with `O_EXCL`. A short retry
22
+ * loop covers the normal contention case; a stale-lock
23
+ * sweep kicks in when the lock is older than
24
+ * `STALE_LOCK_MS` so a crashed pi cannot wedge the quest
25
+ * for the rest of time. The lock is advisory: a process
26
+ * that bypasses it can still write through. We rely on
27
+ * every README write going through `withQuestLock`.
28
+ */
29
+ /**
30
+ * Write `data` to `path` atomically: write to a sibling
31
+ * temp file in the same directory, fsync, then rename
32
+ * over the target. The rename is atomic on POSIX
33
+ * filesystems for files on the same volume.
34
+ */
35
+ export declare function atomicWriteFile(path: string, data: string): void;
36
+ /**
37
+ * Run `fn` under an advisory lock on the given quest dir.
38
+ * Acquires `<questDir>/.quest.lock`, runs fn, releases.
39
+ * Steals locks older than `STALE_LOCK_MS` whose owner is
40
+ * no longer alive.
41
+ */
42
+ export declare function withQuestLock<T>(questDir: string, fn: () => T): T;
43
+ /**
44
+ * Convenience helper: lock the quest, write the README
45
+ * atomically, release. Most call sites use this directly.
46
+ */
47
+ export declare function writeQuestReadmeAtomic(questDir: string, contents: string): void;
48
+ /** Fallback when we have a path but no enclosing quest dir. */
49
+ export declare function atomicWriteUnderLock(questDir: string, path: string, contents: string): void;
50
+ /** Synchronous sleep used in tests when emulating contention. */
51
+ export declare const __testing: {
52
+ LOCK_TIMEOUT_MS: number;
53
+ STALE_LOCK_MS: number;
54
+ };
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Atomic file IO and per-quest advisory locks.
3
+ *
4
+ * Quest READMEs are read-modify-write at every action,
5
+ * potentially from two pi sessions attached to the same
6
+ * quest at the same time. Two concerns:
7
+ *
8
+ * 1. Torn reads. The "read text, parse, mutate, write
9
+ * text" sequence is not atomic against a concurrent
10
+ * reader; on a slow disk a reader sees half a file.
11
+ * We write to a sibling temp file, fsync, then rename
12
+ * over the target so observers always see the old or
13
+ * new file in full.
14
+ *
15
+ * 2. Lost updates. Two pi sessions running in parallel
16
+ * both load the README, both mutate frontmatter
17
+ * in-memory, both write back: the second overwrites
18
+ * the first. We take a coarse per-quest lock around
19
+ * the read-modify-write so the second waits.
20
+ *
21
+ * The lock is file-creation with `O_EXCL`. A short retry
22
+ * loop covers the normal contention case; a stale-lock
23
+ * sweep kicks in when the lock is older than
24
+ * `STALE_LOCK_MS` so a crashed pi cannot wedge the quest
25
+ * for the rest of time. The lock is advisory: a process
26
+ * that bypasses it can still write through. We rely on
27
+ * every README write going through `withQuestLock`.
28
+ */
29
+ import { closeSync, existsSync, fsyncSync, openSync, readFileSync, renameSync, statSync, unlinkSync, writeSync, } from "node:fs";
30
+ import { dirname, join } from "node:path";
31
+ /** Lock-acquire retry budget per call. */
32
+ const LOCK_TIMEOUT_MS = 5000;
33
+ /** Sleep between retries. */
34
+ const LOCK_RETRY_MS = 25;
35
+ /** A lock older than this is considered stale and stolen. */
36
+ const STALE_LOCK_MS = 30_000;
37
+ const LOCK_NAME = ".quest.lock";
38
+ /**
39
+ * Write `data` to `path` atomically: write to a sibling
40
+ * temp file in the same directory, fsync, then rename
41
+ * over the target. The rename is atomic on POSIX
42
+ * filesystems for files on the same volume.
43
+ */
44
+ export function atomicWriteFile(path, data) {
45
+ const dir = dirname(path);
46
+ const tmp = join(dir, `.${path.split("/").pop()}.tmp-${process.pid}-${Math.random()
47
+ .toString(36)
48
+ .slice(2, 10)}`);
49
+ const fd = openSync(tmp, "w");
50
+ try {
51
+ writeSync(fd, data);
52
+ fsyncSync(fd);
53
+ }
54
+ finally {
55
+ closeSync(fd);
56
+ }
57
+ try {
58
+ renameSync(tmp, path);
59
+ }
60
+ catch (err) {
61
+ try {
62
+ unlinkSync(tmp);
63
+ }
64
+ catch {
65
+ // Best-effort cleanup; the temp's leftover state is
66
+ // safe to leave in place and is not user-visible.
67
+ }
68
+ throw err;
69
+ }
70
+ }
71
+ function readLockRecord(lockPath) {
72
+ try {
73
+ const text = readFileSync(lockPath, "utf8");
74
+ const parsed = JSON.parse(text);
75
+ const pid = typeof parsed.pid === "number" && Number.isFinite(parsed.pid)
76
+ ? parsed.pid
77
+ : undefined;
78
+ const startedAt = typeof parsed.startedAt === "number" && Number.isFinite(parsed.startedAt)
79
+ ? parsed.startedAt
80
+ : undefined;
81
+ if (pid === undefined || startedAt === undefined)
82
+ return undefined;
83
+ return { pid, startedAt };
84
+ }
85
+ catch {
86
+ // Lock file is malformed or unreadable. Treat as stale
87
+ // so the steal loop can recover instead of wedging.
88
+ return undefined;
89
+ }
90
+ }
91
+ function isProcessAlive(pid) {
92
+ if (pid <= 0 || pid === process.pid)
93
+ return false;
94
+ try {
95
+ // kill(pid, 0) probes whether the pid exists; throws
96
+ // ESRCH when it doesn't and EPERM when it does but we
97
+ // can't signal it. Either non-throw is "alive enough".
98
+ process.kill(pid, 0);
99
+ return true;
100
+ }
101
+ catch (err) {
102
+ return err.code === "EPERM";
103
+ }
104
+ }
105
+ function tryStealStaleLock(lockPath, now) {
106
+ const record = readLockRecord(lockPath);
107
+ if (!record) {
108
+ // Malformed lock file; remove and retry.
109
+ try {
110
+ unlinkSync(lockPath);
111
+ }
112
+ catch {
113
+ // Another process beat us to the cleanup; that's fine.
114
+ }
115
+ return true;
116
+ }
117
+ const age = now - record.startedAt;
118
+ if (age < STALE_LOCK_MS && isProcessAlive(record.pid))
119
+ return false;
120
+ try {
121
+ unlinkSync(lockPath);
122
+ return true;
123
+ }
124
+ catch {
125
+ // Another process beat us to the cleanup; let the
126
+ // next loop iteration retry the acquire.
127
+ return false;
128
+ }
129
+ }
130
+ function acquireLock(lockPath) {
131
+ const deadline = Date.now() + LOCK_TIMEOUT_MS;
132
+ let lastStealCheck = 0;
133
+ while (true) {
134
+ try {
135
+ const fd = openSync(lockPath, "wx");
136
+ const payload = {
137
+ pid: process.pid,
138
+ startedAt: Date.now(),
139
+ };
140
+ writeSync(fd, JSON.stringify(payload));
141
+ fsyncSync(fd);
142
+ return fd;
143
+ }
144
+ catch (err) {
145
+ const code = err.code;
146
+ if (code !== "EEXIST")
147
+ throw err;
148
+ }
149
+ const now = Date.now();
150
+ if (now >= deadline) {
151
+ throw new Error(`Timed out acquiring quest lock at ${lockPath} after ${LOCK_TIMEOUT_MS}ms.`);
152
+ }
153
+ // Probe for staleness every couple of retries so a
154
+ // crashed holder doesn't keep us spinning.
155
+ if (now - lastStealCheck > LOCK_RETRY_MS * 4) {
156
+ tryStealStaleLock(lockPath, now);
157
+ lastStealCheck = now;
158
+ }
159
+ // Busy-wait inside the retry budget. Node has no
160
+ // blocking sleep without async, and the caller is
161
+ // already running a synchronous read-modify-write.
162
+ const sleepUntil = Date.now() + LOCK_RETRY_MS;
163
+ while (Date.now() < sleepUntil) {
164
+ // spin
165
+ }
166
+ }
167
+ }
168
+ function releaseLock(lockPath, fd) {
169
+ try {
170
+ closeSync(fd);
171
+ }
172
+ catch {
173
+ // Already closed; cleanup of the path below still runs.
174
+ }
175
+ try {
176
+ unlinkSync(lockPath);
177
+ }
178
+ catch {
179
+ // Lock file was stolen out from under us or never
180
+ // committed; nothing more we can do.
181
+ }
182
+ }
183
+ /**
184
+ * Run `fn` under an advisory lock on the given quest dir.
185
+ * Acquires `<questDir>/.quest.lock`, runs fn, releases.
186
+ * Steals locks older than `STALE_LOCK_MS` whose owner is
187
+ * no longer alive.
188
+ */
189
+ export function withQuestLock(questDir, fn) {
190
+ if (!existsSync(questDir)) {
191
+ throw new Error(`Quest directory ${questDir} does not exist.`);
192
+ }
193
+ const lockPath = join(questDir, LOCK_NAME);
194
+ // Probe once before the loop so we don't wait the full
195
+ // retry budget on a clearly-stale lock.
196
+ if (existsSync(lockPath)) {
197
+ try {
198
+ const age = Date.now() - statSync(lockPath).mtimeMs;
199
+ if (age > STALE_LOCK_MS)
200
+ tryStealStaleLock(lockPath, Date.now());
201
+ }
202
+ catch {
203
+ // Stat failed; the acquire loop handles it.
204
+ }
205
+ }
206
+ const fd = acquireLock(lockPath);
207
+ try {
208
+ return fn();
209
+ }
210
+ finally {
211
+ releaseLock(lockPath, fd);
212
+ }
213
+ }
214
+ /**
215
+ * Convenience helper: lock the quest, write the README
216
+ * atomically, release. Most call sites use this directly.
217
+ */
218
+ export function writeQuestReadmeAtomic(questDir, contents) {
219
+ withQuestLock(questDir, () => {
220
+ atomicWriteFile(join(questDir, "README.md"), contents);
221
+ });
222
+ }
223
+ /** Fallback when we have a path but no enclosing quest dir. */
224
+ export function atomicWriteUnderLock(questDir, path, contents) {
225
+ withQuestLock(questDir, () => {
226
+ atomicWriteFile(path, contents);
227
+ });
228
+ }
229
+ /** Synchronous sleep used in tests when emulating contention. */
230
+ export const __testing = {
231
+ LOCK_TIMEOUT_MS,
232
+ STALE_LOCK_MS,
233
+ };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Reverse-mention index: for each quest in the index, find
3
+ * every other quest whose body or documents mention it.
4
+ *
5
+ * Two kinds of mentions:
6
+ *
7
+ * - Bare IDs in prose: `QEST-...`, `PLAN-...`, etc.
8
+ * - Refs: anything the registered ref types extract.
9
+ *
10
+ * For Echoes rendering on `quest show`, we care about
11
+ * inbound mentions: "who has mentioned QEST-X". The reverse
12
+ * map is keyed by the target id (or ref canonical) and
13
+ * values are the source quests.
14
+ */
15
+ import type { QuestIndex } from "./discovery.js";
16
+ import type { IdMentionRelation } from "./id.js";
17
+ /** One inbound mention. */
18
+ export interface MentionEdge {
19
+ /** The quest the mention came from. */
20
+ from: string;
21
+ /** Short snippet of context around the mention. */
22
+ snippet: string;
23
+ /**
24
+ * How the source document referred to this id. `produced`
25
+ * when the mention was preceded by the → sigil; a bare
26
+ * reference otherwise. Refs carry `reference` since the
27
+ * sigil applies to ids only.
28
+ */
29
+ relation: IdMentionRelation;
30
+ }
31
+ /** Snapshot of mentions for the whole index. */
32
+ export interface MentionIndex {
33
+ /** Inbound mentions keyed by target quest/document id. */
34
+ byId: Map<string, MentionEdge[]>;
35
+ /** Inbound mentions keyed by `${type}:${value}` for refs. */
36
+ byRef: Map<string, MentionEdge[]>;
37
+ }
38
+ /**
39
+ * Build a reverse-mention index over every quest in the
40
+ * input. Each quest contributes both its README body and
41
+ * its documents' bodies to the mention pool.
42
+ */
43
+ export declare function buildMentionIndex(index: QuestIndex): MentionIndex;
44
+ /** Convenience: lookup inbound mentions for one target quest id. */
45
+ export declare function mentionsOf(index: MentionIndex, targetId: string): MentionEdge[];