@citadel-labs/citadel 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 (307) hide show
  1. package/README.md +145 -0
  2. package/dist/__tests__/append-bead.test.d.ts +2 -0
  3. package/dist/__tests__/append-bead.test.d.ts.map +1 -0
  4. package/dist/__tests__/append-bead.test.js +88 -0
  5. package/dist/__tests__/append-bead.test.js.map +1 -0
  6. package/dist/__tests__/blocked-outposts.test.d.ts +2 -0
  7. package/dist/__tests__/blocked-outposts.test.d.ts.map +1 -0
  8. package/dist/__tests__/blocked-outposts.test.js +142 -0
  9. package/dist/__tests__/blocked-outposts.test.js.map +1 -0
  10. package/dist/__tests__/bugfixes.test.d.ts +2 -0
  11. package/dist/__tests__/bugfixes.test.d.ts.map +1 -0
  12. package/dist/__tests__/bugfixes.test.js +503 -0
  13. package/dist/__tests__/bugfixes.test.js.map +1 -0
  14. package/dist/__tests__/citizen-tribute.test.d.ts +2 -0
  15. package/dist/__tests__/citizen-tribute.test.d.ts.map +1 -0
  16. package/dist/__tests__/citizen-tribute.test.js +106 -0
  17. package/dist/__tests__/citizen-tribute.test.js.map +1 -0
  18. package/dist/__tests__/cli-e2e/dispatch-note-resolve.test.d.ts +2 -0
  19. package/dist/__tests__/cli-e2e/dispatch-note-resolve.test.d.ts.map +1 -0
  20. package/dist/__tests__/cli-e2e/dispatch-note-resolve.test.js +65 -0
  21. package/dist/__tests__/cli-e2e/dispatch-note-resolve.test.js.map +1 -0
  22. package/dist/__tests__/cli-e2e/full-lifecycle.test.d.ts +2 -0
  23. package/dist/__tests__/cli-e2e/full-lifecycle.test.d.ts.map +1 -0
  24. package/dist/__tests__/cli-e2e/full-lifecycle.test.js +157 -0
  25. package/dist/__tests__/cli-e2e/full-lifecycle.test.js.map +1 -0
  26. package/dist/__tests__/cli-e2e/helpers.d.ts +28 -0
  27. package/dist/__tests__/cli-e2e/helpers.d.ts.map +1 -0
  28. package/dist/__tests__/cli-e2e/helpers.js +76 -0
  29. package/dist/__tests__/cli-e2e/helpers.js.map +1 -0
  30. package/dist/__tests__/cli-e2e/init-outpost-status.test.d.ts +2 -0
  31. package/dist/__tests__/cli-e2e/init-outpost-status.test.d.ts.map +1 -0
  32. package/dist/__tests__/cli-e2e/init-outpost-status.test.js +79 -0
  33. package/dist/__tests__/cli-e2e/init-outpost-status.test.js.map +1 -0
  34. package/dist/__tests__/cli-e2e/reset-stop-tribute-trace.test.d.ts +2 -0
  35. package/dist/__tests__/cli-e2e/reset-stop-tribute-trace.test.d.ts.map +1 -0
  36. package/dist/__tests__/cli-e2e/reset-stop-tribute-trace.test.js +158 -0
  37. package/dist/__tests__/cli-e2e/reset-stop-tribute-trace.test.js.map +1 -0
  38. package/dist/__tests__/courier.test.d.ts +2 -0
  39. package/dist/__tests__/courier.test.d.ts.map +1 -0
  40. package/dist/__tests__/courier.test.js +97 -0
  41. package/dist/__tests__/courier.test.js.map +1 -0
  42. package/dist/__tests__/e2e-smoke.test.d.ts +2 -0
  43. package/dist/__tests__/e2e-smoke.test.d.ts.map +1 -0
  44. package/dist/__tests__/e2e-smoke.test.js +137 -0
  45. package/dist/__tests__/e2e-smoke.test.js.map +1 -0
  46. package/dist/__tests__/fo-broadcast.test.d.ts +2 -0
  47. package/dist/__tests__/fo-broadcast.test.d.ts.map +1 -0
  48. package/dist/__tests__/fo-broadcast.test.js +134 -0
  49. package/dist/__tests__/fo-broadcast.test.js.map +1 -0
  50. package/dist/__tests__/fo-command-processor.test.d.ts +2 -0
  51. package/dist/__tests__/fo-command-processor.test.d.ts.map +1 -0
  52. package/dist/__tests__/fo-command-processor.test.js +86 -0
  53. package/dist/__tests__/fo-command-processor.test.js.map +1 -0
  54. package/dist/__tests__/fo-escalation.test.d.ts +2 -0
  55. package/dist/__tests__/fo-escalation.test.d.ts.map +1 -0
  56. package/dist/__tests__/fo-escalation.test.js +126 -0
  57. package/dist/__tests__/fo-escalation.test.js.map +1 -0
  58. package/dist/__tests__/fo-nudge-watcher.test.d.ts +2 -0
  59. package/dist/__tests__/fo-nudge-watcher.test.d.ts.map +1 -0
  60. package/dist/__tests__/fo-nudge-watcher.test.js +154 -0
  61. package/dist/__tests__/fo-nudge-watcher.test.js.map +1 -0
  62. package/dist/__tests__/fo-nudge-wiring.test.d.ts +2 -0
  63. package/dist/__tests__/fo-nudge-wiring.test.d.ts.map +1 -0
  64. package/dist/__tests__/fo-nudge-wiring.test.js +31 -0
  65. package/dist/__tests__/fo-nudge-wiring.test.js.map +1 -0
  66. package/dist/__tests__/fo-relay.test.d.ts +2 -0
  67. package/dist/__tests__/fo-relay.test.d.ts.map +1 -0
  68. package/dist/__tests__/fo-relay.test.js +90 -0
  69. package/dist/__tests__/fo-relay.test.js.map +1 -0
  70. package/dist/__tests__/fo-task-report.test.d.ts +2 -0
  71. package/dist/__tests__/fo-task-report.test.d.ts.map +1 -0
  72. package/dist/__tests__/fo-task-report.test.js +81 -0
  73. package/dist/__tests__/fo-task-report.test.js.map +1 -0
  74. package/dist/__tests__/fo-webhook.test.d.ts +2 -0
  75. package/dist/__tests__/fo-webhook.test.d.ts.map +1 -0
  76. package/dist/__tests__/fo-webhook.test.js +70 -0
  77. package/dist/__tests__/fo-webhook.test.js.map +1 -0
  78. package/dist/__tests__/integration.test.d.ts +2 -0
  79. package/dist/__tests__/integration.test.d.ts.map +1 -0
  80. package/dist/__tests__/integration.test.js +763 -0
  81. package/dist/__tests__/integration.test.js.map +1 -0
  82. package/dist/__tests__/multi-outpost-dep.test.d.ts +2 -0
  83. package/dist/__tests__/multi-outpost-dep.test.d.ts.map +1 -0
  84. package/dist/__tests__/multi-outpost-dep.test.js +173 -0
  85. package/dist/__tests__/multi-outpost-dep.test.js.map +1 -0
  86. package/dist/__tests__/nudge.test.d.ts +2 -0
  87. package/dist/__tests__/nudge.test.d.ts.map +1 -0
  88. package/dist/__tests__/nudge.test.js +103 -0
  89. package/dist/__tests__/nudge.test.js.map +1 -0
  90. package/dist/__tests__/outpost-registry.test.d.ts +2 -0
  91. package/dist/__tests__/outpost-registry.test.d.ts.map +1 -0
  92. package/dist/__tests__/outpost-registry.test.js +72 -0
  93. package/dist/__tests__/outpost-registry.test.js.map +1 -0
  94. package/dist/__tests__/process-registry.test.d.ts +2 -0
  95. package/dist/__tests__/process-registry.test.d.ts.map +1 -0
  96. package/dist/__tests__/process-registry.test.js +108 -0
  97. package/dist/__tests__/process-registry.test.js.map +1 -0
  98. package/dist/__tests__/session-log.test.d.ts +2 -0
  99. package/dist/__tests__/session-log.test.d.ts.map +1 -0
  100. package/dist/__tests__/session-log.test.js +60 -0
  101. package/dist/__tests__/session-log.test.js.map +1 -0
  102. package/dist/__tests__/spawn-citizen.test.d.ts +2 -0
  103. package/dist/__tests__/spawn-citizen.test.d.ts.map +1 -0
  104. package/dist/__tests__/spawn-citizen.test.js +48 -0
  105. package/dist/__tests__/spawn-citizen.test.js.map +1 -0
  106. package/dist/__tests__/timeout-watchdog.test.d.ts +2 -0
  107. package/dist/__tests__/timeout-watchdog.test.d.ts.map +1 -0
  108. package/dist/__tests__/timeout-watchdog.test.js +81 -0
  109. package/dist/__tests__/timeout-watchdog.test.js.map +1 -0
  110. package/dist/__tests__/worktree-manager.test.d.ts +2 -0
  111. package/dist/__tests__/worktree-manager.test.d.ts.map +1 -0
  112. package/dist/__tests__/worktree-manager.test.js +98 -0
  113. package/dist/__tests__/worktree-manager.test.js.map +1 -0
  114. package/dist/cli/aliases.d.ts +10 -0
  115. package/dist/cli/aliases.d.ts.map +1 -0
  116. package/dist/cli/aliases.js +56 -0
  117. package/dist/cli/aliases.js.map +1 -0
  118. package/dist/cli/command.d.ts +3 -0
  119. package/dist/cli/command.d.ts.map +1 -0
  120. package/dist/cli/command.js +63 -0
  121. package/dist/cli/command.js.map +1 -0
  122. package/dist/cli/index.d.ts +3 -0
  123. package/dist/cli/index.d.ts.map +1 -0
  124. package/dist/cli/index.js +29 -0
  125. package/dist/cli/index.js.map +1 -0
  126. package/dist/cli/init.d.ts +3 -0
  127. package/dist/cli/init.d.ts.map +1 -0
  128. package/dist/cli/init.js +57 -0
  129. package/dist/cli/init.js.map +1 -0
  130. package/dist/cli/outpost.d.ts +3 -0
  131. package/dist/cli/outpost.d.ts.map +1 -0
  132. package/dist/cli/outpost.js +65 -0
  133. package/dist/cli/outpost.js.map +1 -0
  134. package/dist/cli/reset.d.ts +3 -0
  135. package/dist/cli/reset.d.ts.map +1 -0
  136. package/dist/cli/reset.js +67 -0
  137. package/dist/cli/reset.js.map +1 -0
  138. package/dist/cli/session.d.ts +3 -0
  139. package/dist/cli/session.d.ts.map +1 -0
  140. package/dist/cli/session.js +112 -0
  141. package/dist/cli/session.js.map +1 -0
  142. package/dist/cli/start.d.ts +3 -0
  143. package/dist/cli/start.d.ts.map +1 -0
  144. package/dist/cli/start.js +105 -0
  145. package/dist/cli/start.js.map +1 -0
  146. package/dist/cli/status.d.ts +3 -0
  147. package/dist/cli/status.d.ts.map +1 -0
  148. package/dist/cli/status.js +128 -0
  149. package/dist/cli/status.js.map +1 -0
  150. package/dist/cli/tribute.d.ts +3 -0
  151. package/dist/cli/tribute.d.ts.map +1 -0
  152. package/dist/cli/tribute.js +160 -0
  153. package/dist/cli/tribute.js.map +1 -0
  154. package/dist/cli/worktree.d.ts +3 -0
  155. package/dist/cli/worktree.d.ts.map +1 -0
  156. package/dist/cli/worktree.js +64 -0
  157. package/dist/cli/worktree.js.map +1 -0
  158. package/dist/core/append-bead.d.ts +13 -0
  159. package/dist/core/append-bead.d.ts.map +1 -0
  160. package/dist/core/append-bead.js +68 -0
  161. package/dist/core/append-bead.js.map +1 -0
  162. package/dist/core/blocked-outposts.d.ts +15 -0
  163. package/dist/core/blocked-outposts.d.ts.map +1 -0
  164. package/dist/core/blocked-outposts.js +77 -0
  165. package/dist/core/blocked-outposts.js.map +1 -0
  166. package/dist/core/citizen-bootstrap.d.ts +17 -0
  167. package/dist/core/citizen-bootstrap.d.ts.map +1 -0
  168. package/dist/core/citizen-bootstrap.js +118 -0
  169. package/dist/core/citizen-bootstrap.js.map +1 -0
  170. package/dist/core/citizen-tribute.d.ts +17 -0
  171. package/dist/core/citizen-tribute.d.ts.map +1 -0
  172. package/dist/core/citizen-tribute.js +55 -0
  173. package/dist/core/citizen-tribute.js.map +1 -0
  174. package/dist/core/command-bead.d.ts +6 -0
  175. package/dist/core/command-bead.d.ts.map +1 -0
  176. package/dist/core/command-bead.js +20 -0
  177. package/dist/core/command-bead.js.map +1 -0
  178. package/dist/core/courier.d.ts +52 -0
  179. package/dist/core/courier.d.ts.map +1 -0
  180. package/dist/core/courier.js +167 -0
  181. package/dist/core/courier.js.map +1 -0
  182. package/dist/core/fo-broadcast.d.ts +15 -0
  183. package/dist/core/fo-broadcast.d.ts.map +1 -0
  184. package/dist/core/fo-broadcast.js +57 -0
  185. package/dist/core/fo-broadcast.js.map +1 -0
  186. package/dist/core/fo-command-processor.d.ts +7 -0
  187. package/dist/core/fo-command-processor.d.ts.map +1 -0
  188. package/dist/core/fo-command-processor.js +123 -0
  189. package/dist/core/fo-command-processor.js.map +1 -0
  190. package/dist/core/fo-dispatch.d.ts +24 -0
  191. package/dist/core/fo-dispatch.d.ts.map +1 -0
  192. package/dist/core/fo-dispatch.js +76 -0
  193. package/dist/core/fo-dispatch.js.map +1 -0
  194. package/dist/core/fo-escalation.d.ts +20 -0
  195. package/dist/core/fo-escalation.d.ts.map +1 -0
  196. package/dist/core/fo-escalation.js +83 -0
  197. package/dist/core/fo-escalation.js.map +1 -0
  198. package/dist/core/fo-handlers/ceiling-hit.d.ts +8 -0
  199. package/dist/core/fo-handlers/ceiling-hit.d.ts.map +1 -0
  200. package/dist/core/fo-handlers/ceiling-hit.js +10 -0
  201. package/dist/core/fo-handlers/ceiling-hit.js.map +1 -0
  202. package/dist/core/fo-handlers/slot-open.d.ts +13 -0
  203. package/dist/core/fo-handlers/slot-open.d.ts.map +1 -0
  204. package/dist/core/fo-handlers/slot-open.js +63 -0
  205. package/dist/core/fo-handlers/slot-open.js.map +1 -0
  206. package/dist/core/fo-nudge-watcher.d.ts +19 -0
  207. package/dist/core/fo-nudge-watcher.d.ts.map +1 -0
  208. package/dist/core/fo-nudge-watcher.js +71 -0
  209. package/dist/core/fo-nudge-watcher.js.map +1 -0
  210. package/dist/core/fo-nudge-wiring.d.ts +13 -0
  211. package/dist/core/fo-nudge-wiring.d.ts.map +1 -0
  212. package/dist/core/fo-nudge-wiring.js +120 -0
  213. package/dist/core/fo-nudge-wiring.js.map +1 -0
  214. package/dist/core/fo-relay.d.ts +7 -0
  215. package/dist/core/fo-relay.d.ts.map +1 -0
  216. package/dist/core/fo-relay.js +47 -0
  217. package/dist/core/fo-relay.js.map +1 -0
  218. package/dist/core/fo-retry-policy.d.ts +17 -0
  219. package/dist/core/fo-retry-policy.d.ts.map +1 -0
  220. package/dist/core/fo-retry-policy.js +89 -0
  221. package/dist/core/fo-retry-policy.js.map +1 -0
  222. package/dist/core/fo-state.d.ts +25 -0
  223. package/dist/core/fo-state.d.ts.map +1 -0
  224. package/dist/core/fo-state.js +99 -0
  225. package/dist/core/fo-state.js.map +1 -0
  226. package/dist/core/fo-task-report.d.ts +16 -0
  227. package/dist/core/fo-task-report.d.ts.map +1 -0
  228. package/dist/core/fo-task-report.js +63 -0
  229. package/dist/core/fo-task-report.js.map +1 -0
  230. package/dist/core/fo-webhook.d.ts +22 -0
  231. package/dist/core/fo-webhook.d.ts.map +1 -0
  232. package/dist/core/fo-webhook.js +43 -0
  233. package/dist/core/fo-webhook.js.map +1 -0
  234. package/dist/core/grand-archives.d.ts +14 -0
  235. package/dist/core/grand-archives.d.ts.map +1 -0
  236. package/dist/core/grand-archives.js +79 -0
  237. package/dist/core/grand-archives.js.map +1 -0
  238. package/dist/core/nudge.d.ts +6 -0
  239. package/dist/core/nudge.d.ts.map +1 -0
  240. package/dist/core/nudge.js +19 -0
  241. package/dist/core/nudge.js.map +1 -0
  242. package/dist/core/outpost-registry.d.ts +16 -0
  243. package/dist/core/outpost-registry.d.ts.map +1 -0
  244. package/dist/core/outpost-registry.js +27 -0
  245. package/dist/core/outpost-registry.js.map +1 -0
  246. package/dist/core/pre-spawn-check.d.ts +16 -0
  247. package/dist/core/pre-spawn-check.d.ts.map +1 -0
  248. package/dist/core/pre-spawn-check.js +50 -0
  249. package/dist/core/pre-spawn-check.js.map +1 -0
  250. package/dist/core/process-registry.d.ts +17 -0
  251. package/dist/core/process-registry.d.ts.map +1 -0
  252. package/dist/core/process-registry.js +71 -0
  253. package/dist/core/process-registry.js.map +1 -0
  254. package/dist/core/spawn-citizen.d.ts +23 -0
  255. package/dist/core/spawn-citizen.d.ts.map +1 -0
  256. package/dist/core/spawn-citizen.js +99 -0
  257. package/dist/core/spawn-citizen.js.map +1 -0
  258. package/dist/core/timeout-watchdog.d.ts +14 -0
  259. package/dist/core/timeout-watchdog.d.ts.map +1 -0
  260. package/dist/core/timeout-watchdog.js +68 -0
  261. package/dist/core/timeout-watchdog.js.map +1 -0
  262. package/dist/core/validate-tribute.d.ts +11 -0
  263. package/dist/core/validate-tribute.d.ts.map +1 -0
  264. package/dist/core/validate-tribute.js +44 -0
  265. package/dist/core/validate-tribute.js.map +1 -0
  266. package/dist/core/worktree-manager.d.ts +20 -0
  267. package/dist/core/worktree-manager.d.ts.map +1 -0
  268. package/dist/core/worktree-manager.js +123 -0
  269. package/dist/core/worktree-manager.js.map +1 -0
  270. package/dist/index.d.ts +30 -0
  271. package/dist/index.d.ts.map +1 -0
  272. package/dist/index.js +30 -0
  273. package/dist/index.js.map +1 -0
  274. package/dist/types/agent.d.ts +47 -0
  275. package/dist/types/agent.d.ts.map +1 -0
  276. package/dist/types/agent.js +4 -0
  277. package/dist/types/agent.js.map +1 -0
  278. package/dist/types/beads.d.ts +175 -0
  279. package/dist/types/beads.d.ts.map +1 -0
  280. package/dist/types/beads.js +4 -0
  281. package/dist/types/beads.js.map +1 -0
  282. package/dist/types/index.d.ts +4 -0
  283. package/dist/types/index.d.ts.map +1 -0
  284. package/dist/types/index.js +4 -0
  285. package/dist/types/index.js.map +1 -0
  286. package/dist/types/registry.d.ts +110 -0
  287. package/dist/types/registry.d.ts.map +1 -0
  288. package/dist/types/registry.js +3 -0
  289. package/dist/types/registry.js.map +1 -0
  290. package/docs/README.md +7 -0
  291. package/docs/architecture.md +106 -0
  292. package/docs/cli-reference.md +81 -0
  293. package/docs/configuration.md +143 -0
  294. package/docs/contributing.md +65 -0
  295. package/docs/getting-started.md +88 -0
  296. package/grand-archives/archetypes/architect/archetype.json +18 -0
  297. package/grand-archives/archetypes/qa-engineer/archetype.json +18 -0
  298. package/grand-archives/archetypes/software-engineer/archetype.json +18 -0
  299. package/grand-archives/archetypes/software-engineer/system-prompt.md +39 -0
  300. package/grand-archives/archetypes/software-engineer/toolset.json +15 -0
  301. package/grand-archives/first-officer/config.json +21 -0
  302. package/grand-archives/first-officer/system-prompt.md +47 -0
  303. package/grand-archives/first-officer/toolset.json +19 -0
  304. package/grand-archives/registry.json +8 -0
  305. package/grand-archives/shared/base-prompt-preamble.md +25 -0
  306. package/grand-archives/shared/base-tools.json +10 -0
  307. package/package.json +73 -0
@@ -0,0 +1,55 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { appendBead, mintBeadId, readBeads } from './append-bead.js';
4
+ import { SCHEMA_VERSION } from '../types/index.js';
5
+ /**
6
+ * Write a Tribute bead from within a Citizen process.
7
+ * Reads env vars for context. Writes to <outpost_path>/.beads/tribute/<task_id>_tribute.jsonl
8
+ * Attempt number is determined from existing lines + 1.
9
+ */
10
+ export async function writeTribute(opts) {
11
+ const beadsRoot = requireEnv('CITADEL_BEADS_ROOT');
12
+ const outpost = requireEnv('CITADEL_OUTPOST');
13
+ const citizenId = requireEnv('CITADEL_CITIZEN_ID');
14
+ const taskId = requireEnv('CITADEL_TASK_ID');
15
+ const worktree = requireEnv('CITADEL_WORKTREE');
16
+ const archetype = requireEnv('CITADEL_ARCHETYPE');
17
+ // Resolve outpost path from outposts.json
18
+ const outpostsPath = path.join(beadsRoot, '.citadel', 'outposts.json');
19
+ const raw = await fs.readFile(outpostsPath, 'utf-8');
20
+ const registry = JSON.parse(raw);
21
+ const outpostEntry = registry.outposts.find((o) => o.slug === outpost);
22
+ if (!outpostEntry)
23
+ throw new Error(`Outpost "${outpost}" not found in registry`);
24
+ const tributePath = path.join(outpostEntry.path, '.beads', 'tribute', `${taskId}_tribute.jsonl`);
25
+ // Determine attempt number
26
+ const existing = await readBeads(tributePath);
27
+ const attempt = existing.length + 1;
28
+ const bead = {
29
+ bead_id: mintBeadId('TRIBUTE'),
30
+ bead_type: 'TRIBUTE',
31
+ schema_version: SCHEMA_VERSION,
32
+ created_at: new Date().toISOString(),
33
+ citizen_id: citizenId,
34
+ task_id: taskId,
35
+ originating_mail_ref: opts.originatingMailRef,
36
+ archetype,
37
+ outpost,
38
+ worktree,
39
+ attempt,
40
+ status: opts.status,
41
+ summary: opts.summary,
42
+ artifacts: opts.artifacts,
43
+ acceptance_met: opts.acceptanceMet,
44
+ elapsed_seconds: opts.elapsedSeconds,
45
+ ...(opts.prUrl ? { pr_url: opts.prUrl } : {}),
46
+ };
47
+ return appendBead(tributePath, bead);
48
+ }
49
+ function requireEnv(name) {
50
+ const value = process.env[name];
51
+ if (!value)
52
+ throw new Error(`Missing required env var: ${name}`);
53
+ return value;
54
+ }
55
+ //# sourceMappingURL=citizen-tribute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"citizen-tribute.js","sourceRoot":"","sources":["../../src/core/citizen-tribute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAanD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAyB;IAC1D,MAAM,SAAS,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAElD,0CAA0C;IAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IACvE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACzF,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,OAAO,yBAAyB,CAAC,CAAC;IAEjF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,gBAAgB,CAAC,CAAC;IAEjG,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAc,WAAW,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAEpC,MAAM,IAAI,GAAgB;QACxB,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC;QAC9B,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,cAAc;QAC9B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,UAAU,EAAE,SAAS;QACrB,OAAO,EAAE,MAAM;QACf,oBAAoB,EAAE,IAAI,CAAC,kBAAkB;QAC7C,SAAS;QACT,OAAO;QACP,QAAQ;QACR,OAAO;QACP,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,cAAc,EAAE,IAAI,CAAC,aAAa;QAClC,eAAe,EAAE,IAAI,CAAC,cAAc;QACpC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC;IAEF,OAAO,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;IACjE,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { CommandBead, CommandName, CommandArgs } from '../types/index.js';
2
+ /**
3
+ * Write a Command Bead to .citadel/commands/<bead_id>.jsonl
4
+ */
5
+ export declare function writeCommandBead(citadelRoot: string, command: CommandName, args: CommandArgs): Promise<CommandBead>;
6
+ //# sourceMappingURL=command-bead.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-bead.d.ts","sourceRoot":"","sources":["../../src/core/command-bead.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE/E;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,WAAW,CAAC,CAgBtB"}
@@ -0,0 +1,20 @@
1
+ import path from 'node:path';
2
+ import { appendBead, mintBeadId } from './append-bead.js';
3
+ import { SCHEMA_VERSION } from '../types/index.js';
4
+ /**
5
+ * Write a Command Bead to .citadel/commands/<bead_id>.jsonl
6
+ */
7
+ export async function writeCommandBead(citadelRoot, command, args) {
8
+ const beadId = mintBeadId('COMMAND');
9
+ const bead = {
10
+ bead_id: beadId,
11
+ bead_type: 'COMMAND',
12
+ schema_version: SCHEMA_VERSION,
13
+ created_at: new Date().toISOString(),
14
+ command,
15
+ args,
16
+ processed: false,
17
+ };
18
+ return appendBead(path.join(citadelRoot, '.citadel', 'commands', `${beadId}.jsonl`), bead);
19
+ }
20
+ //# sourceMappingURL=command-bead.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-bead.js","sourceRoot":"","sources":["../../src/core/command-bead.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,OAAoB,EACpB,IAAiB;IAEjB,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,IAAI,GAAgB;QACxB,OAAO,EAAE,MAAM;QACf,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,cAAc;QAC9B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,OAAO;QACP,IAAI;QACJ,SAAS,EAAE,KAAK;KACjB,CAAC;IAEF,OAAO,UAAU,CACf,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,EACjE,IAAI,CACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,52 @@
1
+ import type { CourierConfig } from '../types/index.js';
2
+ import { EventEmitter } from 'node:events';
3
+ export interface CourierOptions {
4
+ configPath?: string;
5
+ citadelRoot?: string;
6
+ }
7
+ export type CourierEvent = {
8
+ type: 'mail';
9
+ outpost: string;
10
+ filePath: string;
11
+ } | {
12
+ type: 'tribute';
13
+ outpost: string;
14
+ filePath: string;
15
+ } | {
16
+ type: 'command';
17
+ filePath: string;
18
+ } | {
19
+ type: 'nudge';
20
+ filePath: string;
21
+ };
22
+ export interface CourierEventHandlers {
23
+ onMail: (outpost: string, filePath: string) => Promise<void>;
24
+ onTribute: (outpost: string, filePath: string) => Promise<void>;
25
+ onCommand: (filePath: string) => Promise<void>;
26
+ onNudge: (filePath: string) => Promise<void>;
27
+ }
28
+ export declare class Courier extends EventEmitter {
29
+ private options;
30
+ private config;
31
+ private watcher;
32
+ private citadelRoot;
33
+ constructor(options?: CourierOptions);
34
+ /** Resolve config: explicit path > courier.config.yaml > defaults */
35
+ resolveConfig(): Promise<CourierConfig>;
36
+ /** Load outpost registry and build watch paths */
37
+ private buildWatchPaths;
38
+ /** Classify a changed file path into a CourierEvent */
39
+ private classifyEvent;
40
+ /** Extract outpost slug from a bead file path by matching against known outpost paths */
41
+ private outpostPaths;
42
+ private extractOutpostSlug;
43
+ /** Start watching */
44
+ start(): Promise<void>;
45
+ /** Register handler callbacks for Courier events */
46
+ setEventHandlers(handlers: CourierEventHandlers): void;
47
+ private handleFileEvent;
48
+ /** Stop watching */
49
+ stop(): Promise<void>;
50
+ getConfig(): CourierConfig;
51
+ }
52
+ //# sourceMappingURL=courier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"courier.d.ts","sourceRoot":"","sources":["../../src/core/courier.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED,qBAAa,OAAQ,SAAQ,YAAY;IAK3B,OAAO,CAAC,OAAO;IAJ3B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,WAAW,CAAS;gBAER,OAAO,GAAE,cAAmB;IAKhD,qEAAqE;IAC/D,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC;IA2B7C,kDAAkD;YACpC,eAAe;IAwB7B,uDAAuD;IACvD,OAAO,CAAC,aAAa;IA+BrB,yFAAyF;IACzF,OAAO,CAAC,YAAY,CAAkC;IAEtD,OAAO,CAAC,kBAAkB;IAO1B,qBAAqB;IACf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC5B,oDAAoD;IACpD,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAuBtD,OAAO,CAAC,eAAe;IAOvB,oBAAoB;IACd,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,SAAS,IAAI,aAAa;CAG3B"}
@@ -0,0 +1,167 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs/promises';
3
+ import { parse as parseYaml } from 'yaml';
4
+ import { watch as chokidarWatch } from 'chokidar';
5
+ import { EventEmitter } from 'node:events';
6
+ export class Courier extends EventEmitter {
7
+ options;
8
+ config;
9
+ watcher = null;
10
+ citadelRoot;
11
+ constructor(options = {}) {
12
+ super();
13
+ this.options = options;
14
+ this.citadelRoot = options.citadelRoot ?? process.cwd();
15
+ }
16
+ /** Resolve config: explicit path > courier.config.yaml > defaults */
17
+ async resolveConfig() {
18
+ if (this.options.configPath) {
19
+ const raw = await fs.readFile(this.options.configPath, 'utf-8');
20
+ this.config = parseYaml(raw);
21
+ return this.config;
22
+ }
23
+ const yamlPath = path.join(this.citadelRoot, 'courier.config.yaml');
24
+ try {
25
+ const raw = await fs.readFile(yamlPath, 'utf-8');
26
+ this.config = parseYaml(raw);
27
+ return this.config;
28
+ }
29
+ catch {
30
+ // Fall back to defaults
31
+ this.config = {
32
+ citadel_root: '.',
33
+ poll_interval_ms: 500,
34
+ debounce_ms: 200,
35
+ default_max_citizens: 3,
36
+ citizen_timeout_seconds: 1800,
37
+ log_level: 'INFO',
38
+ log_path: '.citadel/logs/courier.log',
39
+ };
40
+ return this.config;
41
+ }
42
+ }
43
+ /** Load outpost registry and build watch paths */
44
+ async buildWatchPaths() {
45
+ const paths = [];
46
+ const outpostsPath = path.join(this.citadelRoot, '.citadel', 'outposts.json');
47
+ try {
48
+ const raw = await fs.readFile(outpostsPath, 'utf-8');
49
+ const registry = JSON.parse(raw);
50
+ for (const outpost of registry.outposts) {
51
+ if (outpost.status !== 'ACTIVE')
52
+ continue;
53
+ paths.push(path.join(outpost.path, '.beads', 'mail'));
54
+ paths.push(path.join(outpost.path, '.beads', 'tribute'));
55
+ }
56
+ }
57
+ catch {
58
+ // No outposts registered yet
59
+ }
60
+ // Also watch citadel-level directories
61
+ paths.push(path.join(this.citadelRoot, '.citadel', 'commands'));
62
+ paths.push(path.join(this.citadelRoot, '.citadel', 'nudges.jsonl'));
63
+ return paths;
64
+ }
65
+ /** Classify a changed file path into a CourierEvent */
66
+ classifyEvent(filePath) {
67
+ // Normalize paths for comparison
68
+ const norm = path.resolve(filePath);
69
+ // Check if it's a command file
70
+ const commandsDir = path.resolve(this.citadelRoot, '.citadel', 'commands');
71
+ if (norm.startsWith(commandsDir)) {
72
+ return { type: 'command', filePath: norm };
73
+ }
74
+ // Check if it's the nudges file
75
+ const nudgesPath = path.resolve(this.citadelRoot, '.citadel', 'nudges.jsonl');
76
+ if (norm === nudgesPath) {
77
+ return { type: 'nudge', filePath: norm };
78
+ }
79
+ // Check outpost paths (mail or tribute)
80
+ // We need to figure out which outpost this belongs to
81
+ if (norm.includes(path.sep + '.beads' + path.sep + 'mail' + path.sep)) {
82
+ const outpost = this.extractOutpostSlug(norm);
83
+ if (outpost)
84
+ return { type: 'mail', outpost, filePath: norm };
85
+ }
86
+ if (norm.includes(path.sep + '.beads' + path.sep + 'tribute' + path.sep)) {
87
+ const outpost = this.extractOutpostSlug(norm);
88
+ if (outpost)
89
+ return { type: 'tribute', outpost, filePath: norm };
90
+ }
91
+ return null;
92
+ }
93
+ /** Extract outpost slug from a bead file path by matching against known outpost paths */
94
+ outpostPaths = new Map(); // path -> slug
95
+ extractOutpostSlug(filePath) {
96
+ for (const [outpostPath, slug] of this.outpostPaths) {
97
+ if (filePath.startsWith(outpostPath))
98
+ return slug;
99
+ }
100
+ return null;
101
+ }
102
+ /** Start watching */
103
+ async start() {
104
+ await this.resolveConfig();
105
+ // Build outpost path -> slug mapping
106
+ const outpostsPath = path.join(this.citadelRoot, '.citadel', 'outposts.json');
107
+ try {
108
+ const raw = await fs.readFile(outpostsPath, 'utf-8');
109
+ const registry = JSON.parse(raw);
110
+ for (const outpost of registry.outposts) {
111
+ this.outpostPaths.set(path.resolve(outpost.path), outpost.slug);
112
+ }
113
+ }
114
+ catch {
115
+ // No outposts
116
+ }
117
+ const watchPaths = await this.buildWatchPaths();
118
+ this.watcher = chokidarWatch(watchPaths, {
119
+ ignoreInitial: true,
120
+ persistent: true,
121
+ awaitWriteFinish: {
122
+ stabilityThreshold: this.config.debounce_ms,
123
+ pollInterval: 50,
124
+ },
125
+ });
126
+ this.watcher.on('add', (fp) => this.handleFileEvent(fp));
127
+ this.watcher.on('change', (fp) => this.handleFileEvent(fp));
128
+ this.emit('started');
129
+ }
130
+ /** Register handler callbacks for Courier events */
131
+ setEventHandlers(handlers) {
132
+ this.on('event', (event) => {
133
+ switch (event.type) {
134
+ case 'mail':
135
+ handlers.onMail(event.outpost, event.filePath).catch(err => console.error(`[Courier] mail handler error: ${err.message}`));
136
+ break;
137
+ case 'tribute':
138
+ handlers.onTribute(event.outpost, event.filePath).catch(err => console.error(`[Courier] tribute handler error: ${err.message}`));
139
+ break;
140
+ case 'command':
141
+ handlers.onCommand(event.filePath).catch(err => console.error(`[Courier] command handler error: ${err.message}`));
142
+ break;
143
+ case 'nudge':
144
+ handlers.onNudge(event.filePath).catch(err => console.error(`[Courier] nudge handler error: ${err.message}`));
145
+ break;
146
+ }
147
+ });
148
+ }
149
+ handleFileEvent(filePath) {
150
+ const event = this.classifyEvent(filePath);
151
+ if (event) {
152
+ this.emit('event', event);
153
+ }
154
+ }
155
+ /** Stop watching */
156
+ async stop() {
157
+ if (this.watcher) {
158
+ await this.watcher.close();
159
+ this.watcher = null;
160
+ }
161
+ this.emit('stopped');
162
+ }
163
+ getConfig() {
164
+ return this.config;
165
+ }
166
+ }
167
+ //# sourceMappingURL=courier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"courier.js","sourceRoot":"","sources":["../../src/core/courier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { TributeBead } from '../types/index.js';
2
+ export interface BroadcastResult {
3
+ sent: number;
4
+ recipients: Array<{
5
+ outpost: string;
6
+ taskId: string;
7
+ mailBeadId: string;
8
+ }>;
9
+ }
10
+ /**
11
+ * On SUCCESS tribute: find all tasks across outposts that depend on the
12
+ * resolved task_id and send each a DEPENDENCY_RESOLVED mail.
13
+ */
14
+ export declare function broadcastDependencyResolved(citadelRoot: string, tribute: TributeBead): Promise<BroadcastResult>;
15
+ //# sourceMappingURL=fo-broadcast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fo-broadcast.d.ts","sourceRoot":"","sources":["../../src/core/fo-broadcast.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAY,WAAW,EAA6B,MAAM,mBAAmB,CAAC;AAE1F,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5E;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,eAAe,CAAC,CAqD1B"}
@@ -0,0 +1,57 @@
1
+ import path from 'node:path';
2
+ import { appendBead, mintBeadId } from './append-bead.js';
3
+ import { getBlockedOutposts } from './blocked-outposts.js';
4
+ import { getActiveOutposts } from './outpost-registry.js';
5
+ import { SCHEMA_VERSION } from '../types/index.js';
6
+ /**
7
+ * On SUCCESS tribute: find all tasks across outposts that depend on the
8
+ * resolved task_id and send each a DEPENDENCY_RESOLVED mail.
9
+ */
10
+ export async function broadcastDependencyResolved(citadelRoot, tribute) {
11
+ const blocked = await getBlockedOutposts(citadelRoot, tribute.task_id);
12
+ const result = { sent: 0, recipients: [] };
13
+ if (blocked.length === 0)
14
+ return result;
15
+ // Resolve outpost paths for writing mail
16
+ const activeOutposts = await getActiveOutposts(citadelRoot);
17
+ const outpostPathMap = new Map(activeOutposts.map(o => [o.slug, o.path]));
18
+ for (const task of blocked) {
19
+ const outpostPath = outpostPathMap.get(task.outpost);
20
+ if (!outpostPath)
21
+ continue;
22
+ const payload = {
23
+ resolved_task_id: tribute.task_id,
24
+ resolved_by_outpost: tribute.outpost,
25
+ tribute_ref: tribute.bead_id,
26
+ pr_url: tribute.pr_url,
27
+ summary: tribute.summary,
28
+ };
29
+ const mail = {
30
+ bead_id: mintBeadId('MAIL'),
31
+ bead_type: 'MAIL',
32
+ schema_version: SCHEMA_VERSION,
33
+ created_at: new Date().toISOString(),
34
+ task_id: task.taskId,
35
+ mail_type: 'DEPENDENCY_RESOLVED',
36
+ from: 'citadel',
37
+ to: task.outpost,
38
+ subject: `Dependency resolved: ${tribute.task_id}`,
39
+ read: false,
40
+ retry_of: null,
41
+ payload,
42
+ };
43
+ const mailPath = path.join(outpostPath, '.beads', 'mail', `depres-${mail.bead_id}.jsonl`);
44
+ await appendBead(mailPath, mail);
45
+ result.sent++;
46
+ result.recipients.push({
47
+ outpost: task.outpost,
48
+ taskId: task.taskId,
49
+ mailBeadId: mail.bead_id,
50
+ });
51
+ }
52
+ if (result.sent > 0) {
53
+ console.log(`[FO] DEPENDENCY_RESOLVED broadcast: ${result.sent} task(s) notified for resolved "${tribute.task_id}"`);
54
+ }
55
+ return result;
56
+ }
57
+ //# sourceMappingURL=fo-broadcast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fo-broadcast.js","sourceRoot":"","sources":["../../src/core/fo-broadcast.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQnD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,WAAmB,EACnB,OAAoB;IAEpB,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,MAAM,GAAoB,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAE5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAExC,yCAAyC;IACzC,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE1E,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW;YAAE,SAAS;QAE3B,MAAM,OAAO,GAA8B;YACzC,gBAAgB,EAAE,OAAO,CAAC,OAAO;YACjC,mBAAmB,EAAE,OAAO,CAAC,OAAO;YACpC,WAAW,EAAE,OAAO,CAAC,OAAO;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;QAEF,MAAM,IAAI,GAAa;YACrB,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC;YAC3B,SAAS,EAAE,MAAM;YACjB,cAAc,EAAE,cAAc;YAC9B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,OAAO,EAAE,IAAI,CAAC,MAAM;YACpB,SAAS,EAAE,qBAAqB;YAChC,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,IAAI,CAAC,OAAO;YAChB,OAAO,EAAE,wBAAwB,OAAO,CAAC,OAAO,EAAE;YAClD,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,IAAI;YACd,OAAO;SACR,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,IAAI,CAAC,OAAO,QAAQ,CAAC,CAAC;QAC1F,MAAM,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEjC,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,uCAAuC,MAAM,CAAC,IAAI,mCAAmC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC;IACvH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { ProcessRegistry } from './process-registry.js';
2
+ import type { CommandBead } from '../types/index.js';
3
+ /**
4
+ * Process a Command Bead — dispatch, note, retry, or resolve.
5
+ */
6
+ export declare function processCommandBead(citadelRoot: string, bead: CommandBead, processRegistry: ProcessRegistry): Promise<void>;
7
+ //# sourceMappingURL=fo-command-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fo-command-processor.d.ts","sourceRoot":"","sources":["../../src/core/fo-command-processor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,KAAK,EAAE,WAAW,EAA6E,MAAM,mBAAmB,CAAC;AAGhI;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,WAAW,EACjB,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,IAAI,CAAC,CAef"}
@@ -0,0 +1,123 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs/promises';
3
+ import { appendBead, mintBeadId } from './append-bead.js';
4
+ import { dispatch } from './fo-dispatch.js';
5
+ import { GrandArchives } from './grand-archives.js';
6
+ import { reconstructState } from './fo-state.js';
7
+ import { SCHEMA_VERSION } from '../types/index.js';
8
+ import { nanoid } from 'nanoid';
9
+ /**
10
+ * Process a Command Bead — dispatch, note, retry, or resolve.
11
+ */
12
+ export async function processCommandBead(citadelRoot, bead, processRegistry) {
13
+ switch (bead.command) {
14
+ case 'dispatch':
15
+ await handleDispatch(citadelRoot, bead.args, processRegistry);
16
+ break;
17
+ case 'note':
18
+ await handleNote(citadelRoot, bead.args);
19
+ break;
20
+ case 'retry':
21
+ await handleRetry(citadelRoot, bead.args, processRegistry);
22
+ break;
23
+ case 'resolve':
24
+ await handleResolve(citadelRoot, bead.args, processRegistry);
25
+ break;
26
+ }
27
+ }
28
+ async function handleDispatch(citadelRoot, args, processRegistry) {
29
+ await dispatch({
30
+ citadelRoot,
31
+ outpostSlug: args.outpost,
32
+ task: {
33
+ title: args.task,
34
+ description: args.task,
35
+ acceptanceCriteria: [],
36
+ },
37
+ archetype: args.archetype,
38
+ processRegistry,
39
+ });
40
+ }
41
+ async function handleNote(citadelRoot, args) {
42
+ // Resolve outpost path
43
+ const outpostsPath = path.join(citadelRoot, '.citadel', 'outposts.json');
44
+ const raw = await fs.readFile(outpostsPath, 'utf-8');
45
+ const registry = JSON.parse(raw);
46
+ const outpost = registry.outposts.find(o => o.slug === args.outpost);
47
+ if (!outpost)
48
+ throw new Error(`Outpost "${args.outpost}" not found`);
49
+ // Resolve archetype for spawn_hint (PRD §3.1.1: all downward mail carries spawn_hint)
50
+ let archetypeKey = outpost.default_archetype;
51
+ if (!archetypeKey) {
52
+ const archives = new GrandArchives(citadelRoot);
53
+ const archetypeRegistry = await archives.listArchetypes();
54
+ const active = archetypeRegistry.archetypes.find(a => a.status === 'active');
55
+ if (active)
56
+ archetypeKey = active.key;
57
+ }
58
+ const citizenId = `citizen-${nanoid()}`;
59
+ const mail = {
60
+ bead_id: mintBeadId('MAIL'),
61
+ bead_type: 'MAIL',
62
+ schema_version: SCHEMA_VERSION,
63
+ created_at: new Date().toISOString(),
64
+ task_id: args.task_id,
65
+ mail_type: 'OPERATOR_NOTE',
66
+ from: 'citadel',
67
+ to: args.outpost,
68
+ subject: 'Operator note',
69
+ read: false,
70
+ retry_of: null,
71
+ spawn_hint: {
72
+ archetype: archetypeKey ?? 'software-engineer',
73
+ citizen_id: citizenId,
74
+ },
75
+ payload: {
76
+ body: args.body,
77
+ task_id: args.task_id,
78
+ },
79
+ };
80
+ const mailPath = path.join(outpost.path, '.beads', 'mail', `note-${mail.bead_id}.jsonl`);
81
+ await appendBead(mailPath, mail);
82
+ console.log(`[FO] Note sent to outpost "${args.outpost}"`);
83
+ }
84
+ async function handleRetry(citadelRoot, args, _processRegistry) {
85
+ // Find the original TASK_ASSIGNMENT for this task
86
+ const state = await reconstructState(citadelRoot);
87
+ const task = state.tasks.find(t => t.taskId === args.task_id);
88
+ if (!task)
89
+ throw new Error(`Task "${args.task_id}" not found in state`);
90
+ const origMail = task.assignmentMail;
91
+ // Re-dispatch with retry_of
92
+ const outpostsPath = path.join(citadelRoot, '.citadel', 'outposts.json');
93
+ const raw = await fs.readFile(outpostsPath, 'utf-8');
94
+ const registry = JSON.parse(raw);
95
+ const outpost = registry.outposts.find(o => o.slug === task.outpost);
96
+ if (!outpost)
97
+ throw new Error(`Outpost "${task.outpost}" not found`);
98
+ const retryMail = {
99
+ ...origMail,
100
+ bead_id: mintBeadId('MAIL'),
101
+ created_at: new Date().toISOString(),
102
+ read: false,
103
+ retry_of: origMail.bead_id,
104
+ };
105
+ const mailPath = path.join(outpost.path, '.beads', 'mail', `retry-${retryMail.bead_id}.jsonl`);
106
+ await appendBead(mailPath, retryMail);
107
+ console.log(`[FO] Retry issued for task "${args.task_id}"`);
108
+ }
109
+ async function handleResolve(citadelRoot, args, _processRegistry) {
110
+ const { task_id, action, note } = args;
111
+ switch (action) {
112
+ case 'retry':
113
+ await handleRetry(citadelRoot, { task_id }, _processRegistry);
114
+ break;
115
+ case 'abandon':
116
+ console.log(`[FO] Task "${task_id}" abandoned${note ? `: ${note}` : ''}`);
117
+ break;
118
+ case 'rewrite':
119
+ console.log(`[FO] Task "${task_id}" marked for rewrite${note ? `: ${note}` : ''}`);
120
+ break;
121
+ }
122
+ }
123
+ //# sourceMappingURL=fo-command-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fo-command-processor.js","sourceRoot":"","sources":["../../src/core/fo-command-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { MailBead } from '../types/index.js';
2
+ import { ProcessRegistry } from './process-registry.js';
3
+ export interface DispatchOptions {
4
+ citadelRoot: string;
5
+ outpostSlug: string;
6
+ task: TaskDescription;
7
+ archetype?: string;
8
+ processRegistry: ProcessRegistry;
9
+ }
10
+ export interface TaskDescription {
11
+ title: string;
12
+ description: string;
13
+ acceptanceCriteria: string[];
14
+ priority?: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
15
+ contextRefs?: string[];
16
+ dependencies?: string[];
17
+ timeoutSeconds?: number;
18
+ }
19
+ /**
20
+ * First Officer dispatch: select archetype, mint citizen_id, compose TASK_ASSIGNMENT mail,
21
+ * write to outpost inbox. Respects max_citizens ceiling.
22
+ */
23
+ export declare function dispatch(opts: DispatchOptions): Promise<MailBead>;
24
+ //# sourceMappingURL=fo-dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fo-dispatch.d.ts","sourceRoot":"","sources":["../../src/core/fo-dispatch.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAgE,MAAM,mBAAmB,CAAC;AAChH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuEvE"}