@shivaedev/work-board 0.7.2 → 0.8.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 (198) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +93 -2
  3. package/assets/agent.js +37 -0
  4. package/assets/native.js +32 -25
  5. package/dist/board.d.ts +1 -0
  6. package/dist/board.d.ts.map +1 -1
  7. package/dist/board.js +15 -2
  8. package/dist/board.js.map +1 -1
  9. package/dist/browser/client.d.ts +19 -79
  10. package/dist/browser/client.d.ts.map +1 -1
  11. package/dist/browser/client.js +12 -1
  12. package/dist/browser/client.js.map +1 -1
  13. package/dist/browser/entry.d.ts +3 -0
  14. package/dist/browser/entry.d.ts.map +1 -0
  15. package/dist/browser/entry.js +7 -0
  16. package/dist/browser/entry.js.map +1 -0
  17. package/dist/browser/responses/draftSession.d.ts +8 -0
  18. package/dist/browser/responses/draftSession.d.ts.map +1 -0
  19. package/dist/browser/responses/draftSession.js +92 -0
  20. package/dist/browser/responses/draftSession.js.map +1 -0
  21. package/dist/browser/responses/drafts.d.ts +16 -0
  22. package/dist/browser/responses/drafts.d.ts.map +1 -0
  23. package/dist/browser/responses/drafts.js +49 -0
  24. package/dist/browser/responses/drafts.js.map +1 -0
  25. package/dist/browser/responses/preview.d.ts +3 -0
  26. package/dist/browser/responses/preview.d.ts.map +1 -0
  27. package/dist/browser/responses/preview.js +4 -0
  28. package/dist/browser/responses/preview.js.map +1 -0
  29. package/dist/browser/responses/schema.d.ts +127 -0
  30. package/dist/browser/responses/schema.d.ts.map +1 -0
  31. package/dist/browser/responses/schema.js +47 -0
  32. package/dist/browser/responses/schema.js.map +1 -0
  33. package/dist/browser/responses/setup.d.ts +2 -0
  34. package/dist/browser/responses/setup.d.ts.map +1 -0
  35. package/dist/browser/responses/setup.js +99 -0
  36. package/dist/browser/responses/setup.js.map +1 -0
  37. package/dist/browser/responses/submit.d.ts +4 -0
  38. package/dist/browser/responses/submit.d.ts.map +1 -0
  39. package/dist/browser/responses/submit.js +36 -0
  40. package/dist/browser/responses/submit.js.map +1 -0
  41. package/dist/browser/session.d.ts +1 -79
  42. package/dist/browser/session.d.ts.map +1 -1
  43. package/dist/cli.d.ts.map +1 -1
  44. package/dist/cli.js +24 -15
  45. package/dist/cli.js.map +1 -1
  46. package/dist/files/changes.d.ts +1 -0
  47. package/dist/files/changes.d.ts.map +1 -1
  48. package/dist/files/changes.js +1 -1
  49. package/dist/files/changes.js.map +1 -1
  50. package/dist/http/respond.d.ts.map +1 -1
  51. package/dist/http/respond.js +2 -0
  52. package/dist/http/respond.js.map +1 -1
  53. package/dist/metadata/backlinks.d.ts.map +1 -1
  54. package/dist/metadata/backlinks.js +2 -0
  55. package/dist/metadata/backlinks.js.map +1 -1
  56. package/dist/metadata/fields.d.ts +17 -1
  57. package/dist/metadata/fields.d.ts.map +1 -1
  58. package/dist/metadata/problems.d.ts.map +1 -1
  59. package/dist/metadata/problems.js +2 -0
  60. package/dist/metadata/problems.js.map +1 -1
  61. package/dist/metadata/schema.d.ts +17 -1
  62. package/dist/metadata/schema.d.ts.map +1 -1
  63. package/dist/metadata/schema.js +6 -2
  64. package/dist/metadata/schema.js.map +1 -1
  65. package/dist/page/attentionDetails.d.ts.map +1 -1
  66. package/dist/page/attentionDetails.js +2 -1
  67. package/dist/page/attentionDetails.js.map +1 -1
  68. package/dist/page/metadataDetails.d.ts.map +1 -1
  69. package/dist/page/metadataDetails.js +6 -0
  70. package/dist/page/metadataDetails.js.map +1 -1
  71. package/dist/page/navigationScript.js +1 -1
  72. package/dist/page/shell.d.ts +1 -1
  73. package/dist/page/shell.d.ts.map +1 -1
  74. package/dist/page/shell.js.map +1 -1
  75. package/dist/page/style.d.ts.map +1 -1
  76. package/dist/page/style.js +2 -1
  77. package/dist/page/style.js.map +1 -1
  78. package/dist/page/swap.d.ts +1 -1
  79. package/dist/page/swap.d.ts.map +1 -1
  80. package/dist/page/swap.js +3 -0
  81. package/dist/page/swap.js.map +1 -1
  82. package/dist/path/Identity.d.ts +3 -0
  83. package/dist/path/Identity.d.ts.map +1 -0
  84. package/dist/path/Identity.js +3 -0
  85. package/dist/path/Identity.js.map +1 -0
  86. package/dist/responses/agent-cli.d.ts +2 -0
  87. package/dist/responses/agent-cli.d.ts.map +1 -0
  88. package/dist/responses/agent-cli.js +31 -0
  89. package/dist/responses/agent-cli.js.map +1 -0
  90. package/dist/responses/agent.d.ts +68 -0
  91. package/dist/responses/agent.d.ts.map +1 -0
  92. package/dist/responses/agent.js +49 -0
  93. package/dist/responses/agent.js.map +1 -0
  94. package/dist/responses/await.d.ts +33 -0
  95. package/dist/responses/await.d.ts.map +1 -0
  96. package/dist/responses/await.js +21 -0
  97. package/dist/responses/await.js.map +1 -0
  98. package/dist/responses/flags.d.ts +6 -0
  99. package/dist/responses/flags.d.ts.map +1 -0
  100. package/dist/responses/flags.js +23 -0
  101. package/dist/responses/flags.js.map +1 -0
  102. package/dist/responses/locate.d.ts +13 -0
  103. package/dist/responses/locate.d.ts.map +1 -0
  104. package/dist/responses/locate.js +50 -0
  105. package/dist/responses/locate.js.map +1 -0
  106. package/dist/responses/outcome.d.ts +65 -0
  107. package/dist/responses/outcome.d.ts.map +1 -0
  108. package/dist/responses/outcome.js +14 -0
  109. package/dist/responses/outcome.js.map +1 -0
  110. package/dist/responses/page.d.ts +6 -0
  111. package/dist/responses/page.d.ts.map +1 -0
  112. package/dist/responses/page.js +25 -0
  113. package/dist/responses/page.js.map +1 -0
  114. package/dist/responses/publish.d.ts +4 -0
  115. package/dist/responses/publish.d.ts.map +1 -0
  116. package/dist/responses/publish.js +56 -0
  117. package/dist/responses/publish.js.map +1 -0
  118. package/dist/responses/publishIn.d.ts +3 -0
  119. package/dist/responses/publishIn.d.ts.map +1 -0
  120. package/dist/responses/publishIn.js +69 -0
  121. package/dist/responses/publishIn.js.map +1 -0
  122. package/dist/responses/read.d.ts +30 -0
  123. package/dist/responses/read.d.ts.map +1 -0
  124. package/dist/responses/read.js +43 -0
  125. package/dist/responses/read.js.map +1 -0
  126. package/dist/responses/records.d.ts +12 -0
  127. package/dist/responses/records.d.ts.map +1 -0
  128. package/dist/responses/records.js +47 -0
  129. package/dist/responses/records.js.map +1 -0
  130. package/dist/responses/retry.d.ts +22 -0
  131. package/dist/responses/retry.d.ts.map +1 -0
  132. package/dist/responses/retry.js +14 -0
  133. package/dist/responses/retry.js.map +1 -0
  134. package/dist/responses/service.d.ts +106 -0
  135. package/dist/responses/service.d.ts.map +1 -0
  136. package/dist/responses/service.js +90 -0
  137. package/dist/responses/service.js.map +1 -0
  138. package/dist/responses/waitFor.d.ts +31 -0
  139. package/dist/responses/waitFor.d.ts.map +1 -0
  140. package/dist/responses/waitFor.js +47 -0
  141. package/dist/responses/waitFor.js.map +1 -0
  142. package/dist/rpc/contract.d.ts +101 -2
  143. package/dist/rpc/contract.d.ts.map +1 -1
  144. package/dist/rpc/contract.js +3 -2
  145. package/dist/rpc/contract.js.map +1 -1
  146. package/dist/rpc/responseContract.d.ts +212 -0
  147. package/dist/rpc/responseContract.d.ts.map +1 -0
  148. package/dist/rpc/responseContract.js +37 -0
  149. package/dist/rpc/responseContract.js.map +1 -0
  150. package/dist/rpc/server.d.ts +3 -1
  151. package/dist/rpc/server.d.ts.map +1 -1
  152. package/dist/rpc/server.js +6 -1
  153. package/dist/rpc/server.js.map +1 -1
  154. package/dist/serve-cli.d.ts +3 -0
  155. package/dist/serve-cli.d.ts.map +1 -0
  156. package/dist/serve-cli.js +20 -0
  157. package/dist/serve-cli.js.map +1 -0
  158. package/package.json +2 -2
  159. package/src/board.ts +16 -2
  160. package/src/browser/client.ts +30 -4
  161. package/src/browser/entry.ts +9 -0
  162. package/src/browser/responses/draftSession.ts +88 -0
  163. package/src/browser/responses/drafts.ts +58 -0
  164. package/src/browser/responses/preview.ts +5 -0
  165. package/src/browser/responses/schema.ts +52 -0
  166. package/src/browser/responses/setup.ts +102 -0
  167. package/src/browser/responses/submit.ts +41 -0
  168. package/src/cli.ts +14 -22
  169. package/src/files/changes.ts +2 -1
  170. package/src/http/respond.ts +2 -0
  171. package/src/metadata/backlinks.ts +2 -0
  172. package/src/metadata/problems.ts +2 -0
  173. package/src/metadata/schema.ts +6 -2
  174. package/src/page/attentionDetails.ts +2 -1
  175. package/src/page/metadataDetails.ts +6 -0
  176. package/src/page/navigationScript.ts +1 -1
  177. package/src/page/shell.ts +1 -1
  178. package/src/page/style.ts +2 -1
  179. package/src/page/swap.ts +3 -0
  180. package/src/path/Identity.ts +3 -0
  181. package/src/responses/agent-cli.ts +35 -0
  182. package/src/responses/agent.ts +59 -0
  183. package/src/responses/await.ts +21 -0
  184. package/src/responses/flags.ts +22 -0
  185. package/src/responses/locate.ts +55 -0
  186. package/src/responses/outcome.ts +15 -0
  187. package/src/responses/page.ts +41 -0
  188. package/src/responses/publish.ts +53 -0
  189. package/src/responses/publishIn.ts +64 -0
  190. package/src/responses/read.ts +45 -0
  191. package/src/responses/records.ts +53 -0
  192. package/src/responses/retry.ts +23 -0
  193. package/src/responses/service.ts +106 -0
  194. package/src/responses/waitFor.ts +58 -0
  195. package/src/rpc/contract.ts +3 -2
  196. package/src/rpc/responseContract.ts +46 -0
  197. package/src/rpc/server.ts +8 -1
  198. package/src/serve-cli.ts +37 -0
@@ -1,5 +1,7 @@
1
1
  import { Schema } from "effect";
2
- export const Identity = Schema.String.check(Schema.isPattern(/^[a-zA-Z\d][a-zA-Z\d._-]*$/u));
2
+ import { QuestionRecord, ResponseRecord } from "#browser/responses/schema.ts";
3
+ import { Identity as SourceIdentity } from "#path/Identity.ts";
4
+ export const Identity = SourceIdentity;
3
5
  export const Reference = Schema.String.check(Schema.isPattern(/^[a-zA-Z\d][a-zA-Z\d._-]*(?:#[a-zA-Z\d][a-zA-Z\d._-]*)?$/u));
4
6
  const Text = Schema.String.check(Schema.isPattern(/\S/u));
5
7
  const Attention = Schema.Struct({
@@ -27,10 +29,12 @@ export const Metadata = Schema.Struct({
27
29
  evidence: Schema.optional(Schema.Array(Evidence)),
28
30
  id: Schema.optional(Identity),
29
31
  items: Schema.optional(Schema.Array(Identity)),
30
- kind: Schema.optional(Schema.Literals(["task", "investigation", "decision", "result", "project", "board"])),
32
+ kind: Schema.optional(Schema.Literals(["task", "investigation", "decision", "result", "project", "board", "question", "response"])),
31
33
  nextAction: Schema.optional(Text),
32
34
  owner: Schema.optional(Text),
35
+ question: Schema.optional(QuestionRecord),
33
36
  relationships: Schema.optional(Schema.Array(Relationship)),
37
+ response: Schema.optional(ResponseRecord),
34
38
  status: Schema.optional(Text),
35
39
  }).pipe(Schema.encodeKeys({ nextAction: "next_action" }));
36
40
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/metadata/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/metadata/schema.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"attentionDetails.d.ts","sourceRoot":"","sources":["../../src/page/attentionDetails.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIzD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAWnG"}
1
+ {"version":3,"file":"attentionDetails.d.ts","sourceRoot":"","sources":["../../src/page/attentionDetails.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIzD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAWnG"}
@@ -1,4 +1,5 @@
1
1
  import { attentionSource } from "#attention/requests.ts";
2
+ import { identityUrl } from "#metadata/links.ts";
2
3
  import { escapeHtml } from "./escape.js";
3
4
  import { referenceHtml } from "./metadataLinks.js";
4
5
  export function attentionDetails(parsed, file, model) {
@@ -7,7 +8,7 @@ export function attentionDetails(parsed, file, model) {
7
8
  return "";
8
9
  }
9
10
  return `<h3>Recorded attention requests</h3><p>Open/closed is source state. Closing a request does not establish acceptance or record an answer.</p><ul>${requests
10
- .map((request, index) => `<li id="${attentionSource({ file, parsed }, index)}" tabindex="-1"><b>${escapeHtml(request.kind)} · ${escapeHtml(request.id)} · ${escapeHtml(request.state)}</b><p>${escapeHtml(request.reason)}</p><p>Response needed from: ${request.responseFrom.map(escapeHtml).join(", ")}</p><p>Recorded to unblock: ${request.unblocks.map((target) => referenceHtml(target, target, model)).join(", ")}</p><p>Source: ${escapeHtml(file)}:${parsed.lines[`attention.${index}`] ?? parsed.lines.attention ?? 2}</p></li>`)
11
+ .map((request, index) => `<li id="${attentionSource({ file, parsed }, index)}" tabindex="-1"><b>${escapeHtml(request.kind)} · ${escapeHtml(request.id)} · ${escapeHtml(request.state)}</b><p>${escapeHtml(request.reason)}</p><p>Response needed from: ${request.responseFrom.map(escapeHtml).join(", ")}</p><p>Recorded to unblock: ${request.unblocks.map((target) => referenceHtml(target, target, model)).join(", ")}</p><p><a href="/_board/respond?item=${encodeURIComponent(parsed.fields.id ?? "")}&amp;request=${encodeURIComponent(request.id)}">Respond to this request</a> · <a href="${identityUrl(parsed.fields.id ?? "")}">Reviewed item</a></p><p>Source: ${escapeHtml(file)}:${parsed.lines[`attention.${index}`] ?? parsed.lines.attention ?? 2}</p></li>`)
11
12
  .join("")}</ul>`;
12
13
  }
13
14
  //# sourceMappingURL=attentionDetails.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"attentionDetails.js","sourceRoot":"","sources":["../../src/page/attentionDetails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,UAAU,gBAAgB,CAAC,MAAsB,EAAE,IAAY,EAAE,KAAoB;IAC1F,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACX,CAAC;IACD,OAAO,mJAAmJ,QAAQ;SAChK,GAAG,CACH,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAClB,WAAW,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,sBAAsB,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,gCAAgC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,KAAK,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,WAAW,CAClf;SACA,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"attentionDetails.js","sourceRoot":"","sources":["../../src/page/attentionDetails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,UAAU,gBAAgB,CAAC,MAAsB,EAAE,IAAY,EAAE,KAAoB;IAC1F,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACX,CAAC;IACD,OAAO,mJAAmJ,QAAQ;SAChK,GAAG,CACH,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAClB,WAAW,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,sBAAsB,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,gCAAgC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,wCAAwC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,gBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,4CAA4C,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,qCAAqC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,KAAK,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,WAAW,CACptB;SACA,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;AACnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"metadataDetails.d.ts","sourceRoot":"","sources":["../../src/page/metadataDetails.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQzD,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAgBlG"}
1
+ {"version":3,"file":"metadataDetails.d.ts","sourceRoot":"","sources":["../../src/page/metadataDetails.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQzD,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAsBlG"}
@@ -14,6 +14,12 @@ export function metadataDetails(parsed, file, model) {
14
14
  fields.items?.length
15
15
  ? `<h3>Declared board membership</h3><ul>${fields.items.map((id) => `<li>${referenceHtml(id, id, model)}</li>`).join("")}</ul>`
16
16
  : "",
17
+ fields.question
18
+ ? `<h3>Reviewed question</h3><p>${referenceHtml(fields.question.item, fields.question.item, model)} / ${escapeHtml(fields.question.request)} · ${escapeHtml(fields.question.reason)}</p><p>Reviewed SHA-256: <code>${fields.question.reviewedRevision}</code>. Registered: ${new Date(fields.question.registeredAt).toISOString()}. Unanswered deadline: ${new Date(fields.question.deadline).toISOString()}.</p>`
19
+ : "",
20
+ fields.response
21
+ ? `<h3>Recorded response</h3><p>${referenceHtml(fields.response.question, fields.response.question, model)} · ${escapeHtml(fields.response.author)} · ${escapeHtml(fields.response.type)}</p><p>Reviewed SHA-256: <code>${fields.response.reviewedRevision}</code>. This is authored feedback, not verified acceptance.</p>`
22
+ : "",
17
23
  criteriaEvidence(parsed, model),
18
24
  attentionDetails(parsed, file, model),
19
25
  recordedEvidence(parsed, file, model),
@@ -1 +1 @@
1
- {"version":3,"file":"metadataDetails.js","sourceRoot":"","sources":["../../src/page/metadataDetails.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,UAAU,eAAe,CAAC,MAAsB,EAAE,IAAY,EAAE,KAAoB;IACzF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,OAAO,GAAG;QACf,wBAAwB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,0BAA0B,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY;QAC1N,MAAM,CAAC,aAAa,EAAE,MAAM;YAC3B,CAAC,CAAC,6BAA6B,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO;YAC5L,CAAC,CAAC,EAAE;QACL,MAAM,CAAC,KAAK,EAAE,MAAM;YACnB,CAAC,CAAC,yCAAyC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO;YAC/H,CAAC,CAAC,EAAE;QAEL,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC;QAC/B,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;QACrC,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;KACrC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,OAAO,OAAO,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"metadataDetails.js","sourceRoot":"","sources":["../../src/page/metadataDetails.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,UAAU,eAAe,CAAC,MAAsB,EAAE,IAAY,EAAE,KAAoB;IACzF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,OAAO,GAAG;QACf,wBAAwB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,0BAA0B,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY;QAC1N,MAAM,CAAC,aAAa,EAAE,MAAM;YAC3B,CAAC,CAAC,6BAA6B,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO;YAC5L,CAAC,CAAC,EAAE;QACL,MAAM,CAAC,KAAK,EAAE,MAAM;YACnB,CAAC,CAAC,yCAAyC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO;YAC/H,CAAC,CAAC,EAAE;QAEL,MAAM,CAAC,QAAQ;YACd,CAAC,CAAC,gCAAgC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,kCAAkC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,wBAAwB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,0BAA0B,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,OAAO;YAClZ,CAAC,CAAC,EAAE;QACL,MAAM,CAAC,QAAQ;YACd,CAAC,CAAC,gCAAgC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,kCAAkC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,kEAAkE;YAC5T,CAAC,CAAC,EAAE;QACL,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC;QAC/B,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;QACrC,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;KACrC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,OAAO,OAAO,CAAC;AAChB,CAAC"}
@@ -88,7 +88,7 @@ document.addEventListener("click", (event) => {
88
88
  const link = event.target.closest?.("a[href]");
89
89
  if (!link || event.defaultPrevented || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey || link.hasAttribute("download") || (link.target && link.target !== "_self")) return;
90
90
  const target = new URL(link.href, location.href);
91
- if (target.origin !== location.origin || !(target.pathname === "/" || (target.pathname === "/_board/start" || target.pathname === "/_board/changes" || target.pathname === "/_board/overview" || target.pathname === "/_board/work" || target.pathname.startsWith("/_board/item/")) || /\\.md$/i.test(target.pathname))) return;
91
+ if (target.origin !== location.origin || !(target.pathname === "/" || (target.pathname === "/_board/respond" || target.pathname === "/_board/start" || target.pathname === "/_board/changes" || target.pathname === "/_board/overview" || target.pathname === "/_board/work" || target.pathname.startsWith("/_board/item/")) || /\\.md$/i.test(target.pathname))) return;
92
92
  event.preventDefault();
93
93
  navigate(target);
94
94
  });
@@ -1,2 +1,2 @@
1
- export declare const shell: (title: string, nav: string, main: string, workspace: string, board: boolean, identity?: string, view?: boolean | "overview" | "changes" | "start") => string;
1
+ export declare const shell: (title: string, nav: string, main: string, workspace: string, board: boolean, identity?: string, view?: boolean | "overview" | "changes" | "start" | "response") => string;
2
2
  //# sourceMappingURL=shell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,KAAK,GACjB,OAAO,MAAM,EACb,KAAK,MAAM,EACX,MAAM,MAAM,EACZ,WAAW,MAAM,EACjB,OAAO,OAAO,EACd,WAAW,MAAM,EACjB,OAAM,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,OAAe,KACtD,MAmBQ,CAAC"}
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,KAAK,GACjB,OAAO,MAAM,EACb,KAAK,MAAM,EACX,MAAM,MAAM,EACZ,WAAW,MAAM,EACjB,OAAO,OAAO,EACd,WAAW,MAAM,EACjB,OAAM,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,UAAkB,KACnE,MAmBQ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,SAAS,QAAQ,CAAC,IAAY;IAC7B,OAAO,IAAI;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;SACjD,IAAI,CAAC,kCAAkC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CACpB,KAAa,EACb,GAAW,EACX,IAAY,EACZ,SAAiB,EACjB,KAAc,EACd,QAAiB,EACjB,OAAmD,KAAK,EAC/C,EAAE,CACX;IACC,kDAAkD,UAAU,CAAC,SAAS,CAAC,gCAAgC;IACvG,qHAAqH;IACrH,UAAU,UAAU,CAAC,KAAK,CAAC,UAAU;IACrC,yGAAyG;IACzG,gQAAgQ;IAChQ,0GAA0G;IAC1G,yLAAyL;IACzL,4DAA4D,GAAG,gBAAgB;IAC/E,6IAA6I;IAC7I,iIAAiI,QAAQ,CAAC,KAAK,CAAC,QAAQ;IACxJ,kEAAkE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,kFAAkF,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,yEAAyE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,6QAA6Q;IACtnB,yEAAyE;IACzE,wMAAwM;IACxM,0LAA0L;IAC1L,wJAAwJ;IACxJ,QAAQ,IAAI,CAAC,CAAC,CAAC,eAAe,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,wBAAwB,UAAU,CAAC,KAAK,CAAC,eAAe,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,mBAAmB,IAAI,SAAS;IAC/S,eAAe,YAAY,GAAG,YAAY,gBAAgB;CAC1D,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,SAAS,QAAQ,CAAC,IAAY;IAC7B,OAAO,IAAI;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;SACjD,IAAI,CAAC,kCAAkC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CACpB,KAAa,EACb,GAAW,EACX,IAAY,EACZ,SAAiB,EACjB,KAAc,EACd,QAAiB,EACjB,OAAgE,KAAK,EAC5D,EAAE,CACX;IACC,kDAAkD,UAAU,CAAC,SAAS,CAAC,gCAAgC;IACvG,qHAAqH;IACrH,UAAU,UAAU,CAAC,KAAK,CAAC,UAAU;IACrC,yGAAyG;IACzG,gQAAgQ;IAChQ,0GAA0G;IAC1G,yLAAyL;IACzL,4DAA4D,GAAG,gBAAgB;IAC/E,6IAA6I;IAC7I,iIAAiI,QAAQ,CAAC,KAAK,CAAC,QAAQ;IACxJ,kEAAkE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,kFAAkF,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,yEAAyE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,6QAA6Q;IACtnB,yEAAyE;IACzE,wMAAwM;IACxM,0LAA0L;IAC1L,wJAAwJ;IACxJ,QAAQ,IAAI,CAAC,CAAC,CAAC,eAAe,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,wBAAwB,UAAU,CAAC,KAAK,CAAC,eAAe,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,mBAAmB,IAAI,SAAS;IAC/S,eAAe,YAAY,GAAG,YAAY,gBAAgB;CAC1D,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAsFA,eAAO,MAAM,KAAK,QAYN,CAAC"}
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAsFA,eAAO,MAAM,KAAK,QAa2d,CAAC"}
@@ -90,5 +90,6 @@ export const style = theme
90
90
  + workStyle()
91
91
  + attentionStyle()
92
92
  + visualStyles
93
- + documents;
93
+ + documents
94
+ + ".response-panel { max-width: 850px; margin: auto; padding: 1.5rem; } .response-panel form { display: grid; gap: 1rem; } .response-panel label { display: grid; gap: .5rem; } .response-panel input, .response-panel textarea, .response-panel select { width: 100%; box-sizing: border-box; font: inherit; background: var(--surface); color: inherit; padding: .75rem; border: 1px solid var(--border); } .response-panel pre, .response-panel code { white-space: pre-wrap; overflow-wrap: anywhere; }";
94
95
  //# sourceMappingURL=style.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Bb,CAAC;AAEF,MAAM,KAAK,GAAG;;;;;;;;;;;;CAYb,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;CAQhB,CAAC;AAEF,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBjB,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GACjB,KAAK;MACH,MAAM;MACN,KAAK;MACL,KAAK;MACL,QAAQ;MACR,aAAa,EAAE;MACf,YAAY;MACZ,cAAc;MACd,SAAS,EAAE;MACX,cAAc,EAAE;MAChB,YAAY;MACZ,SAAS,CAAC"}
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Bb,CAAC;AAEF,MAAM,KAAK,GAAG;;;;;;;;;;;;CAYb,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;CAQhB,CAAC;AAEF,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBjB,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GACjB,KAAK;MACH,MAAM;MACN,KAAK;MACL,KAAK;MACL,QAAQ;MACR,aAAa,EAAE;MACf,YAAY;MACZ,cAAc;MACd,SAAS,EAAE;MACX,cAAc,EAAE;MAChB,YAAY;MACZ,SAAS;MACT,0eAA0e,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const swap = "\nconst containers = new Set([\"DIV\", \"SECTION\", \"ARTICLE\", \"HEADER\", \"FOOTER\", \"MAIN\", \"NAV\", \"FORM\", \"SELECT\", \"LABEL\", \"ASIDE\"]);\n\nconst structural = (element) => [...element.childNodes].every((node) => node.nodeType === 1 || node.textContent.trim() === \"\");\n\nconst pristine = new WeakMap();\nconst flash = (element) => {\n if (element.matches(\"[data-modified]\")) return;\n if (!element.matches(\"p, li, pre, blockquote, h1, h2, h3, h4, h5, h6, .item, .notes, .metadata-panel\")) return;\n element.setAttribute(\"data-live-change\", \"\");\n setTimeout(() => element.removeAttribute(\"data-live-change\"), 2500);\n};\n\nexport const remember = (element) => {\n pristine.set(element, normalized(element));\n if (containers.has(element.tagName)) for (const child of element.children) remember(child);\n};\n\nconst normalized = (element) => {\n const copy = element.cloneNode(true);\n for (const tool of copy.querySelectorAll(\"[data-visual-tools], [data-image-error], [data-diagram-error]\")) tool.remove();\n for (const node of [copy, ...copy.querySelectorAll(\"*\")]) {\n node.removeAttribute(\"data-live-change\");\n if (node.tagName === \"DETAILS\") node.removeAttribute(\"open\");\n if (node.matches(\"figure.diagram\")) {\n node.querySelector(\".diagram-svg\")?.remove();\n node.dataset.state = \"pending\";\n delete node.dataset.error;\n }\n if (node.matches(\"[data-modified]\")) node.textContent = \"\";\n if (node.matches(\"img[data-local-image]\")) {\n node.setAttribute(\"src\", node.dataset.localImage);\n for (const attribute of [\"tabindex\", \"role\", \"aria-label\"]) node.removeAttribute(attribute);\n }\n }\n return copy.outerHTML;\n};\n\nconst signature = (element) => {\n if (!pristine.has(element)) pristine.set(element, normalized(element));\n return pristine.get(element);\n};\n\nconst normalizedShell = (element) => { const copy = element.cloneNode(false); copy.removeAttribute(\"data-live-change\"); return copy.outerHTML; };\n\nconst sameShell = (old, next) =>\n old.tagName === next.tagName && containers.has(old.tagName) && normalizedShell(old) === normalizedShell(next);\n\nconst matches = (a, b) => {\n let start = 0;\n while (start < a.length && start < b.length && a[start] === b[start]) start++;\n let tail = 0;\n while (tail < a.length - start && tail < b.length - start && a[a.length - 1 - tail] === b[b.length - 1 - tail]) tail++;\n const n = a.length - start - tail;\n const m = b.length - start - tail;\n const table = Array.from({ length: n + 1 }, () => new Uint32Array(m + 1));\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n table[i][j] = a[start + i] === b[start + j] ? table[i + 1][j + 1] + 1 : Math.max(table[i + 1][j], table[i][j + 1]);\n }\n }\n const pairs = Array.from({ length: start }, (_, index) => [index, index]);\n for (let i = 0, j = 0; i < n && j < m; ) {\n if (a[start + i] === b[start + j]) pairs.push([start + i++, start + j++]);\n else if (table[i + 1][j] >= table[i][j + 1]) i++;\n else j++;\n }\n for (let index = tail; index > 0; index--) pairs.push([a.length - index, b.length - index]);\n return [...pairs, [a.length, b.length]];\n};\n\nconst patch = (current, incoming, highlight) => {\n const selected = current.tagName === \"SELECT\" ? current.value : null;\n const fallback = incoming.tagName === \"SELECT\" ? incoming.value : null;\n if (!structural(current) || !structural(incoming)) {\n current.replaceChildren(...incoming.childNodes);\n for (const child of current.children) remember(child);\n if (highlight) flash(current);\n return;\n }\n const olds = [...current.children];\n const news = [...incoming.children];\n const signatures = news.map(normalized);\n const arrive = (index) => {\n remember(news[index]);\n if (highlight) flash(news[index]);\n return news[index];\n };\n let i = 0;\n let j = 0;\n for (const [kept, arrived] of matches(olds.map(signature), signatures)) {\n const anchor = olds[kept] ?? null;\n for (; i < kept && j < arrived; i++, j++) {\n if (sameShell(olds[i], news[j])) {\n patch(olds[i], news[j], highlight);\n pristine.set(olds[i], signatures[j]);\n } else olds[i].replaceWith(arrive(j));\n }\n for (; i < kept; i++) olds[i].remove();\n for (; j < arrived; j++) current.insertBefore(arrive(j), anchor);\n i++;\n j++;\n }\n if (selected !== null) current.value = [...current.options].some((option) => option.value === selected) ? selected : fallback;\n};\n\nconst keysOf = (root) => {\n const seen = new Map();\n return [...root.querySelectorAll(\"details\")].map((details) => {\n const base =\n details.dataset.key ??\n (details.closest(\".item\")?.querySelector(\"h3\")?.textContent ?? \"\") + \"|\" + (details.querySelector(\"summary\")?.textContent ?? \"\");\n const count = seen.get(base) ?? 0;\n seen.set(base, count + 1);\n return [base + \"#\" + count, details];\n });\n};\n\nconst carryDrawings = (drawings, figures) => {\n if (drawings.length !== figures.length) return;\n figures.forEach((figure, index) => {\n const drawing = drawings[index];\n if (figure.dataset.state !== \"pending\" || drawing === null || drawing.isConnected) return;\n figure.prepend(drawing);\n figure.dataset.state = \"redrawing\";\n });\n};\n\nexport const swap = (current, incoming, highlight = false) => {\n const before = keysOf(current);\n const open = new Map(before.map(([key, details]) => [key, details.open]));\n const existing = new Set(before.map(([, details]) => details));\n const drawings = [...current.querySelectorAll(\"figure.diagram\")].map((figure) => figure.querySelector(\".diagram-svg\"));\n patch(current, incoming, highlight);\n carryDrawings(drawings, [...current.querySelectorAll(\"figure.diagram\")]);\n for (const [key, details] of keysOf(current)) {\n const was = open.get(key);\n if (was !== undefined && !existing.has(details)) details.open = was;\n }\n};\n";
1
+ export declare const swap = "\nconst containers = new Set([\"DIV\", \"SECTION\", \"ARTICLE\", \"HEADER\", \"FOOTER\", \"MAIN\", \"NAV\", \"FORM\", \"SELECT\", \"LABEL\", \"ASIDE\"]);\n\nconst structural = (element) => [...element.childNodes].every((node) => node.nodeType === 1 || node.textContent.trim() === \"\");\n\nconst pristine = new WeakMap();\nconst flash = (element) => {\n if (element.matches(\"[data-modified]\")) return;\n if (!element.matches(\"p, li, pre, blockquote, h1, h2, h3, h4, h5, h6, .item, .notes, .metadata-panel\")) return;\n element.setAttribute(\"data-live-change\", \"\");\n setTimeout(() => element.removeAttribute(\"data-live-change\"), 2500);\n};\n\nexport const remember = (element) => {\n pristine.set(element, normalized(element));\n if (containers.has(element.tagName)) for (const child of element.children) remember(child);\n};\n\nconst normalized = (element) => {\n const copy = element.cloneNode(true);\n for (const form of [copy, ...copy.querySelectorAll(\"#response-form\")]) {\n if (form.id === \"response-form\") { form.replaceChildren(); delete form.dataset.bound; }\n }\n for (const tool of copy.querySelectorAll(\"[data-visual-tools], [data-image-error], [data-diagram-error]\")) tool.remove();\n for (const node of [copy, ...copy.querySelectorAll(\"*\")]) {\n node.removeAttribute(\"data-live-change\");\n if (node.tagName === \"DETAILS\") node.removeAttribute(\"open\");\n if (node.matches(\"figure.diagram\")) {\n node.querySelector(\".diagram-svg\")?.remove();\n node.dataset.state = \"pending\";\n delete node.dataset.error;\n }\n if (node.matches(\"[data-modified]\")) node.textContent = \"\";\n if (node.matches(\"img[data-local-image]\")) {\n node.setAttribute(\"src\", node.dataset.localImage);\n for (const attribute of [\"tabindex\", \"role\", \"aria-label\"]) node.removeAttribute(attribute);\n }\n }\n return copy.outerHTML;\n};\n\nconst signature = (element) => {\n if (!pristine.has(element)) pristine.set(element, normalized(element));\n return pristine.get(element);\n};\n\nconst normalizedShell = (element) => { const copy = element.cloneNode(false); copy.removeAttribute(\"data-live-change\"); return copy.outerHTML; };\n\nconst sameShell = (old, next) =>\n old.tagName === next.tagName && containers.has(old.tagName) && normalizedShell(old) === normalizedShell(next);\n\nconst matches = (a, b) => {\n let start = 0;\n while (start < a.length && start < b.length && a[start] === b[start]) start++;\n let tail = 0;\n while (tail < a.length - start && tail < b.length - start && a[a.length - 1 - tail] === b[b.length - 1 - tail]) tail++;\n const n = a.length - start - tail;\n const m = b.length - start - tail;\n const table = Array.from({ length: n + 1 }, () => new Uint32Array(m + 1));\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n table[i][j] = a[start + i] === b[start + j] ? table[i + 1][j + 1] + 1 : Math.max(table[i + 1][j], table[i][j + 1]);\n }\n }\n const pairs = Array.from({ length: start }, (_, index) => [index, index]);\n for (let i = 0, j = 0; i < n && j < m; ) {\n if (a[start + i] === b[start + j]) pairs.push([start + i++, start + j++]);\n else if (table[i + 1][j] >= table[i][j + 1]) i++;\n else j++;\n }\n for (let index = tail; index > 0; index--) pairs.push([a.length - index, b.length - index]);\n return [...pairs, [a.length, b.length]];\n};\n\nconst patch = (current, incoming, highlight) => {\n const selected = current.tagName === \"SELECT\" ? current.value : null;\n const fallback = incoming.tagName === \"SELECT\" ? incoming.value : null;\n if (!structural(current) || !structural(incoming)) {\n current.replaceChildren(...incoming.childNodes);\n for (const child of current.children) remember(child);\n if (highlight) flash(current);\n return;\n }\n const olds = [...current.children];\n const news = [...incoming.children];\n const signatures = news.map(normalized);\n const arrive = (index) => {\n remember(news[index]);\n if (highlight) flash(news[index]);\n return news[index];\n };\n let i = 0;\n let j = 0;\n for (const [kept, arrived] of matches(olds.map(signature), signatures)) {\n const anchor = olds[kept] ?? null;\n for (; i < kept && j < arrived; i++, j++) {\n if (sameShell(olds[i], news[j])) {\n patch(olds[i], news[j], highlight);\n pristine.set(olds[i], signatures[j]);\n } else olds[i].replaceWith(arrive(j));\n }\n for (; i < kept; i++) olds[i].remove();\n for (; j < arrived; j++) current.insertBefore(arrive(j), anchor);\n i++;\n j++;\n }\n if (selected !== null) current.value = [...current.options].some((option) => option.value === selected) ? selected : fallback;\n};\n\nconst keysOf = (root) => {\n const seen = new Map();\n return [...root.querySelectorAll(\"details\")].map((details) => {\n const base =\n details.dataset.key ??\n (details.closest(\".item\")?.querySelector(\"h3\")?.textContent ?? \"\") + \"|\" + (details.querySelector(\"summary\")?.textContent ?? \"\");\n const count = seen.get(base) ?? 0;\n seen.set(base, count + 1);\n return [base + \"#\" + count, details];\n });\n};\n\nconst carryDrawings = (drawings, figures) => {\n if (drawings.length !== figures.length) return;\n figures.forEach((figure, index) => {\n const drawing = drawings[index];\n if (figure.dataset.state !== \"pending\" || drawing === null || drawing.isConnected) return;\n figure.prepend(drawing);\n figure.dataset.state = \"redrawing\";\n });\n};\n\nexport const swap = (current, incoming, highlight = false) => {\n const before = keysOf(current);\n const open = new Map(before.map(([key, details]) => [key, details.open]));\n const existing = new Set(before.map(([, details]) => details));\n const drawings = [...current.querySelectorAll(\"figure.diagram\")].map((figure) => figure.querySelector(\".diagram-svg\"));\n patch(current, incoming, highlight);\n carryDrawings(drawings, [...current.querySelectorAll(\"figure.diagram\")]);\n for (const [key, details] of keysOf(current)) {\n const was = open.get(key);\n if (was !== undefined && !existing.has(details)) details.open = was;\n }\n};\n";
2
2
  //# sourceMappingURL=swap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../src/page/swap.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,m7LA4IhB,CAAC"}
1
+ {"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../src/page/swap.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,qmMA+IhB,CAAC"}
package/dist/page/swap.js CHANGED
@@ -18,6 +18,9 @@ export const remember = (element) => {
18
18
 
19
19
  const normalized = (element) => {
20
20
  const copy = element.cloneNode(true);
21
+ for (const form of [copy, ...copy.querySelectorAll("#response-form")]) {
22
+ if (form.id === "response-form") { form.replaceChildren(); delete form.dataset.bound; }
23
+ }
21
24
  for (const tool of copy.querySelectorAll("[data-visual-tools], [data-image-error], [data-diagram-error]")) tool.remove();
22
25
  for (const node of [copy, ...copy.querySelectorAll("*")]) {
23
26
  node.removeAttribute("data-live-change");
@@ -1 +1 @@
1
- {"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/page/swap.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4InB,CAAC"}
1
+ {"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/page/swap.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+InB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Schema } from "effect";
2
+ export declare const Identity: Schema.String;
3
+ //# sourceMappingURL=Identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Identity.d.ts","sourceRoot":"","sources":["../../src/path/Identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,eAAO,MAAM,QAAQ,eAAuE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Schema } from "effect";
2
+ export const Identity = Schema.String.check(Schema.isPattern(/^[a-zA-Z\d][a-zA-Z\d._-]*$/u));
3
+ //# sourceMappingURL=Identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Identity.js","sourceRoot":"","sources":["../../src/path/Identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runAgent(args: readonly string[]): Promise<void>;
2
+ //# sourceMappingURL=agent-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-cli.d.ts","sourceRoot":"","sources":["../../src/responses/agent-cli.ts"],"names":[],"mappings":"AAIA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,iBA8BrD"}
@@ -0,0 +1,31 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { agentRequest } from "./agent.js";
3
+ import { flags } from "./flags.js";
4
+ export async function runAgent(args) {
5
+ const [action, request, ...options] = args;
6
+ if ((action !== "wait" && action !== "response" && action !== "question") || !request) {
7
+ throw new Error("Usage: work-board question <item>/<request> | wait <question-id> [--after <response-id>] | response <question-id> [--port 4747]");
8
+ }
9
+ const parsed = flags(options);
10
+ const controller = new AbortController();
11
+ function cancel() {
12
+ controller.abort();
13
+ }
14
+ process.once("SIGINT", cancel);
15
+ process.once("SIGTERM", cancel);
16
+ try {
17
+ const result = await Effect.runPromise(agentRequest(action, { ...parsed, request }, (text) => process.stderr.write(`${text}\n`)).pipe(Effect.result), { signal: controller.signal });
18
+ if (result._tag === "Failure") {
19
+ if (result.failure instanceof Error && "code" in result.failure && result.failure.code === "Unanswered") {
20
+ process.exitCode = 2;
21
+ }
22
+ throw result.failure;
23
+ }
24
+ process.stdout.write(`${JSON.stringify(result.success)}\n`);
25
+ }
26
+ finally {
27
+ process.removeListener("SIGINT", cancel);
28
+ process.removeListener("SIGTERM", cancel);
29
+ }
30
+ }
31
+ //# sourceMappingURL=agent-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-cli.js","sourceRoot":"","sources":["../../src/responses/agent-cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAuB;IACrD,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;IAC3C,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACvF,MAAM,IAAI,KAAK,CACd,iIAAiI,CACjI,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,SAAS,MAAM;QACd,UAAU,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CACrC,YAAY,CAAC,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAC7G,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAC7B,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,MAAM,CAAC,OAAO,YAAY,KAAK,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACzG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACtB,CAAC;YACD,MAAM,MAAM,CAAC,OAAO,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;YAAS,CAAC;QACV,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;AACF,CAAC"}
@@ -0,0 +1,68 @@
1
+ import * as Effect from "effect/Effect";
2
+ export interface AgentOptions {
3
+ readonly after?: string | undefined;
4
+ readonly request: string;
5
+ readonly revision?: string | undefined;
6
+ readonly url: string;
7
+ }
8
+ export declare function agentRequest(action: "question" | "response" | "wait", options: AgentOptions, diagnostic?: (text: string) => void): Effect.Effect<{
9
+ readonly context: string;
10
+ readonly id: string;
11
+ readonly item: string;
12
+ readonly reason: string;
13
+ readonly request: string;
14
+ readonly reviewedRevision: string;
15
+ readonly source: string;
16
+ } | {
17
+ readonly question: {
18
+ readonly context: string;
19
+ readonly id: string;
20
+ readonly question: {
21
+ readonly deadline: number;
22
+ readonly item: string;
23
+ readonly reason: string;
24
+ readonly registeredAt: number;
25
+ readonly request: string;
26
+ readonly reviewedRevision: string;
27
+ readonly source: string;
28
+ };
29
+ };
30
+ readonly responses: readonly {
31
+ readonly body: string;
32
+ readonly id: string;
33
+ readonly response: {
34
+ readonly author: string;
35
+ readonly question: string;
36
+ readonly recordedAt: number;
37
+ readonly reviewedRevision: string;
38
+ readonly type: "answer" | "clarify" | "not_now";
39
+ };
40
+ }[];
41
+ } | {
42
+ readonly kind: "response";
43
+ readonly question: {
44
+ readonly context: string;
45
+ readonly id: string;
46
+ readonly question: {
47
+ readonly deadline: number;
48
+ readonly item: string;
49
+ readonly reason: string;
50
+ readonly registeredAt: number;
51
+ readonly request: string;
52
+ readonly reviewedRevision: string;
53
+ readonly source: string;
54
+ };
55
+ };
56
+ readonly response: {
57
+ readonly body: string;
58
+ readonly id: string;
59
+ readonly response: {
60
+ readonly author: string;
61
+ readonly question: string;
62
+ readonly recordedAt: number;
63
+ readonly reviewedRevision: string;
64
+ readonly type: "answer" | "clarify" | "not_now";
65
+ };
66
+ };
67
+ }, Error | import("effect/unstable/rpc/RpcClientError").RpcClientError, never>;
68
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/responses/agent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAOxC,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACrB;AAmBD,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+EA0BjJ"}
@@ -0,0 +1,49 @@
1
+ import * as NodeHttpClient from "@effect/platform-node/NodeHttpClient";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Layer from "effect/Layer";
4
+ import * as RpcClient from "effect/unstable/rpc/RpcClient";
5
+ import * as RpcSerialization from "effect/unstable/rpc/RpcSerialization";
6
+ import { responseContract } from "#rpc/responseContract.ts";
7
+ import { waitForResponse } from "./waitFor.js";
8
+ function protocol(url) {
9
+ return RpcClient.layerProtocolHttp({ url: `${url}/_board/rpc` }).pipe(Layer.provide([NodeHttpClient.layerNodeHttp, RpcSerialization.layerNdjson]));
10
+ }
11
+ function validate(url) {
12
+ const parsed = new URL(url);
13
+ if (parsed.protocol !== "http:"
14
+ || !["127.0.0.1", "localhost", "[::1]"].includes(parsed.hostname)
15
+ || parsed.username
16
+ || parsed.password
17
+ || parsed.pathname !== "/"
18
+ || parsed.search
19
+ || parsed.hash) {
20
+ throw new Error("Use a loopback Work Board URL, such as http://127.0.0.1:4747.");
21
+ }
22
+ return parsed.origin;
23
+ }
24
+ export function agentRequest(action, options, diagnostic = () => undefined) {
25
+ return Effect.scoped(Effect.gen(function* () {
26
+ const client = yield* RpcClient.make(responseContract, { flatten: true });
27
+ const [item, request, extra] = options.request.split("/");
28
+ if (action === "question") {
29
+ if (!(item && request) || extra) {
30
+ return yield* Effect.fail(new Error("Use question <item>/<request>."));
31
+ }
32
+ return yield* client("work-board.question", { item, request });
33
+ }
34
+ let id = options.request;
35
+ if (request !== undefined) {
36
+ if (action !== "wait" || !item || !request || extra || !options.revision) {
37
+ return yield* Effect.fail(new Error("Use wait <item>/<request> --revision <reviewed SHA-256>, or wait <registered-question-id>."));
38
+ }
39
+ const question = yield* client("work-board.registerQuestion", { item, request, revision: options.revision });
40
+ id = question.id;
41
+ diagnostic(`Registered ${id}; reattach with work-board wait ${id}. Deadline: ${new Date(question.question.deadline).toISOString()}`);
42
+ }
43
+ if (action === "response") {
44
+ return yield* client("work-board.responses", { question: id });
45
+ }
46
+ return yield* waitForResponse(() => client("work-board.awaitResponse", { after: options.after, question: id }), diagnostic);
47
+ })).pipe(Effect.provide(protocol(validate(options.url))));
48
+ }
49
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/responses/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { Effect } from "effect";
2
+ import { type Reading, ResponseFailed } from "#browser/responses/schema.ts";
3
+ export declare function awaitResponse(read: (id: string) => Effect.Effect<Reading, ResponseFailed>): (input: {
4
+ readonly question: string;
5
+ readonly after?: string | undefined;
6
+ }) => Effect.Effect<{
7
+ expired: boolean;
8
+ question: {
9
+ readonly context: string;
10
+ readonly id: string;
11
+ readonly question: {
12
+ readonly deadline: number;
13
+ readonly item: string;
14
+ readonly reason: string;
15
+ readonly registeredAt: number;
16
+ readonly request: string;
17
+ readonly reviewedRevision: string;
18
+ readonly source: string;
19
+ };
20
+ };
21
+ response: {
22
+ readonly body: string;
23
+ readonly id: string;
24
+ readonly response: {
25
+ readonly author: string;
26
+ readonly question: string;
27
+ readonly recordedAt: number;
28
+ readonly reviewedRevision: string;
29
+ readonly type: "answer" | "clarify" | "not_now";
30
+ };
31
+ } | undefined;
32
+ }, ResponseFailed, never>;
33
+ //# sourceMappingURL=await.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"await.d.ts","sourceRoot":"","sources":["../../src/responses/await.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,KAAK,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG5E,wBAAgB,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC;uBACN,MAAM;qBAAmB,MAAM,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAe9H"}
@@ -0,0 +1,21 @@
1
+ import { Clock, Effect } from "effect";
2
+ import { ResponseFailed } from "#browser/responses/schema.ts";
3
+ import { outcome } from "./outcome.js";
4
+ export function awaitResponse(read) {
5
+ return Effect.fn("WorkBoard.awaitResponse")(function* (input) {
6
+ const lease = (yield* Clock.currentTimeMillis) + 30_000;
7
+ while (true) {
8
+ const result = yield* read(input.question);
9
+ const now = yield* Clock.currentTimeMillis;
10
+ const state = outcome(result, input.after, now);
11
+ if (state.kind === "missing_cursor") {
12
+ return yield* Effect.fail(new ResponseFailed({ code: "Missing", message: "The next-response cursor is not recorded for this question." }));
13
+ }
14
+ if (state.kind !== "pending" || now >= lease) {
15
+ return { expired: state.kind === "unanswered", question: result.question, response: state.kind === "response" ? state.response : undefined };
16
+ }
17
+ yield* Effect.sleep("1 second");
18
+ }
19
+ });
20
+ }
21
+ //# sourceMappingURL=await.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"await.js","sourceRoot":"","sources":["../../src/responses/await.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAgB,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,UAAU,aAAa,CAAC,IAA4D;IACzF,OAAO,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAyE;QAC/H,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC;QACxD,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAChD,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACrC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,6DAA6D,EAAE,CAAC,CAAC,CAAC;YAC5I,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;gBAC9C,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YAC9I,CAAC;YACD,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function flags(args: readonly string[]): {
2
+ after: string | undefined;
3
+ revision: string | undefined;
4
+ url: string;
5
+ };
6
+ //# sourceMappingURL=flags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/responses/flags.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE;;;;EAqB5C"}
@@ -0,0 +1,23 @@
1
+ export function flags(args) {
2
+ const values = new Map();
3
+ for (let index = 0; index < args.length; index += 2) {
4
+ const name = args[index];
5
+ const value = args[index + 1];
6
+ if (!(name && value && ["--port", "--url", "--revision", "--after"].includes(name))) {
7
+ throw new Error("Use --port, --url, --revision or --after, each with a value.");
8
+ }
9
+ if (values.has(name)) {
10
+ throw new Error(`Repeated option ${name}`);
11
+ }
12
+ values.set(name, value);
13
+ }
14
+ const port = values.get("--port") ?? "4747";
15
+ if (/^\d{1,5}$/u.exec(port) === null || Number(port) > 65_535 || Number(port) < 1) {
16
+ throw new Error("Invalid port.");
17
+ }
18
+ if (values.has("--url") && values.has("--port")) {
19
+ throw new Error("Choose --url or --port.");
20
+ }
21
+ return { after: values.get("--after"), revision: values.get("--revision"), url: values.get("--url") ?? `http://127.0.0.1:${port}` };
22
+ }
23
+ //# sourceMappingURL=flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/responses/flags.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,KAAK,CAAC,IAAuB;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACrF,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;IAC5C,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,oBAAoB,IAAI,EAAE,EAAE,CAAC;AACrI,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Effect, type FileSystem } from "effect";
2
+ import { ResponseFailed } from "#browser/responses/schema.ts";
3
+ import type { Snapshot } from "#search/snapshot.ts";
4
+ export declare function locate(root: string, realRoot: string, snapshot: Effect.Effect<Snapshot, ResponseFailed>, fs: FileSystem.FileSystem): (item: string, request: string) => Effect.Effect<{
5
+ readonly context: string;
6
+ readonly id: string;
7
+ readonly item: string;
8
+ readonly reason: string;
9
+ readonly request: string;
10
+ readonly reviewedRevision: string;
11
+ readonly source: string;
12
+ }, ResponseFailed, FileSystem.FileSystem | import("effect/Path").Path>;
13
+ //# sourceMappingURL=locate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locate.d.ts","sourceRoot":"","sources":["../../src/responses/locate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEjD,OAAO,EAAwB,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAIpF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAMpD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,UAAU;;;;;;;;uEA0ClI"}
@@ -0,0 +1,50 @@
1
+ import { Effect } from "effect";
2
+ import { attentionRequests } from "#attention/requests.ts";
3
+ import { ResponseFailed } from "#browser/responses/schema.ts";
4
+ import { markdownPath } from "#files/markdownPath.ts";
5
+ import { metadataModel } from "#metadata/model.ts";
6
+ import { metadataParse } from "#metadata/parse.ts";
7
+ import { questionId, revisionOf } from "./records.js";
8
+ function reject(code, message) {
9
+ return Effect.fail(new ResponseFailed({ code, message }));
10
+ }
11
+ export function locate(root, realRoot, snapshot, fs) {
12
+ return Effect.fn("WorkBoard.locate")(function* (item, request) {
13
+ const data = yield* snapshot;
14
+ const entry = attentionRequests(data).entries.find((candidate) => candidate.itemId === item && candidate.request.id === request);
15
+ if (!entry) {
16
+ return yield* reject("Missing", "The exact open attention request is missing, ambiguous or unavailable.");
17
+ }
18
+ const real = yield* markdownPath(root, realRoot, entry.document.file);
19
+ if (!real) {
20
+ return yield* reject("Missing", "The reviewed source moved or disappeared.");
21
+ }
22
+ const source = yield* fs.readFileString(real).pipe(Effect.catch(() => reject("Unavailable", "The source could not be read.")));
23
+ if (new TextEncoder().encode(source).length > 256 * 1024) {
24
+ return yield* reject("Unsupported", "Question context is limited to 256 KiB; use a focused source document.");
25
+ }
26
+ const parsed = metadataParse(source);
27
+ if (parsed.fields.id !== item
28
+ || parsed.fields.attention?.filter((candidate) => candidate.id === request && candidate.state === "open").length !== 1) {
29
+ return yield* reject("Stale", "The source request changed. Re-read the question before proceeding.");
30
+ }
31
+ const documents = [...data.documents.filter((document) => document.file !== entry.document.file), { file: entry.document.file, parsed }];
32
+ const model = metadataModel(documents, data.unavailable, data.model.rootFile);
33
+ const fresh = attentionRequests({ ...data, documents, model }).entries.find((candidate) => candidate.itemId === item && candidate.request.id === request)?.request;
34
+ if (!fresh) {
35
+ return yield* reject("Stale", "The current request or its references are invalid. Review the source diagnostics before registering it.");
36
+ }
37
+ const revision = revisionOf(source);
38
+ const question = {
39
+ context: source,
40
+ id: questionId(item, request, revision, entry.document.file),
41
+ item,
42
+ reason: fresh.reason,
43
+ request,
44
+ reviewedRevision: revision,
45
+ source: entry.document.file,
46
+ };
47
+ return question;
48
+ });
49
+ }
50
+ //# sourceMappingURL=locate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locate.js","sourceRoot":"","sources":["../../src/responses/locate.ts"],"names":[],"mappings":"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"}