@cluesmith/codev 3.3.0 → 3.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/dashboard-dist/assets/{index-JCbkpAcV.js → index-D3XaKpZW.js} +45 -43
  2. package/dashboard-dist/assets/index-D3XaKpZW.js.map +1 -0
  3. package/dashboard-dist/index.html +1 -1
  4. package/dist/agent-farm/cli.d.ts.map +1 -1
  5. package/dist/agent-farm/cli.js +99 -36
  6. package/dist/agent-farm/cli.js.map +1 -1
  7. package/dist/agent-farm/commands/reset/constants.d.ts +119 -1
  8. package/dist/agent-farm/commands/reset/constants.d.ts.map +1 -1
  9. package/dist/agent-farm/commands/reset/constants.js +119 -1
  10. package/dist/agent-farm/commands/reset/constants.js.map +1 -1
  11. package/dist/agent-farm/commands/reset/context.d.ts +20 -2
  12. package/dist/agent-farm/commands/reset/context.d.ts.map +1 -1
  13. package/dist/agent-farm/commands/reset/context.js +44 -3
  14. package/dist/agent-farm/commands/reset/context.js.map +1 -1
  15. package/dist/agent-farm/commands/reset/index.d.ts +7 -7
  16. package/dist/agent-farm/commands/reset/index.js +8 -8
  17. package/dist/agent-farm/commands/reset/index.js.map +1 -1
  18. package/dist/agent-farm/commands/reset/receipt.d.ts +1 -1
  19. package/dist/agent-farm/commands/reset/receipt.d.ts.map +1 -1
  20. package/dist/agent-farm/commands/reset/receipt.js +19 -8
  21. package/dist/agent-farm/commands/reset/receipt.js.map +1 -1
  22. package/dist/agent-farm/commands/reset/reorient.d.ts +1 -1
  23. package/dist/agent-farm/commands/reset/reorient.d.ts.map +1 -1
  24. package/dist/agent-farm/commands/reset/reorient.js +12 -5
  25. package/dist/agent-farm/commands/reset/reorient.js.map +1 -1
  26. package/dist/agent-farm/commands/reset/self.d.ts +335 -0
  27. package/dist/agent-farm/commands/reset/self.d.ts.map +1 -0
  28. package/dist/agent-farm/commands/reset/self.js +636 -0
  29. package/dist/agent-farm/commands/reset/self.js.map +1 -0
  30. package/dist/agent-farm/commands/reset.d.ts +18 -3
  31. package/dist/agent-farm/commands/reset.d.ts.map +1 -1
  32. package/dist/agent-farm/commands/reset.js +55 -33
  33. package/dist/agent-farm/commands/reset.js.map +1 -1
  34. package/dist/agent-farm/commands/self-refresh.d.ts +60 -0
  35. package/dist/agent-farm/commands/self-refresh.d.ts.map +1 -0
  36. package/dist/agent-farm/commands/self-refresh.js +506 -0
  37. package/dist/agent-farm/commands/self-refresh.js.map +1 -0
  38. package/dist/agent-farm/commands/send.d.ts.map +1 -1
  39. package/dist/agent-farm/commands/send.js +27 -2
  40. package/dist/agent-farm/commands/send.js.map +1 -1
  41. package/dist/agent-farm/commands/spawn-worktree.js +1 -1
  42. package/dist/agent-farm/commands/spawn-worktree.js.map +1 -1
  43. package/dist/agent-farm/commands/spawn.d.ts +7 -0
  44. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  45. package/dist/agent-farm/commands/spawn.js +13 -1
  46. package/dist/agent-farm/commands/spawn.js.map +1 -1
  47. package/dist/agent-farm/commands/tower.d.ts.map +1 -1
  48. package/dist/agent-farm/commands/tower.js +13 -0
  49. package/dist/agent-farm/commands/tower.js.map +1 -1
  50. package/dist/agent-farm/lib/reconnect-backoff.d.ts +10 -0
  51. package/dist/agent-farm/lib/reconnect-backoff.d.ts.map +1 -1
  52. package/dist/agent-farm/lib/reconnect-backoff.js +10 -0
  53. package/dist/agent-farm/lib/reconnect-backoff.js.map +1 -1
  54. package/dist/agent-farm/lib/tower-client.d.ts +12 -0
  55. package/dist/agent-farm/lib/tower-client.d.ts.map +1 -1
  56. package/dist/agent-farm/lib/tower-client.js +12 -0
  57. package/dist/agent-farm/lib/tower-client.js.map +1 -1
  58. package/dist/agent-farm/lib/tunnel-client.d.ts.map +1 -1
  59. package/dist/agent-farm/lib/tunnel-client.js +7 -3
  60. package/dist/agent-farm/lib/tunnel-client.js.map +1 -1
  61. package/dist/agent-farm/servers/canvas-relay.d.ts +60 -0
  62. package/dist/agent-farm/servers/canvas-relay.d.ts.map +1 -0
  63. package/dist/agent-farm/servers/canvas-relay.js +376 -0
  64. package/dist/agent-farm/servers/canvas-relay.js.map +1 -0
  65. package/dist/agent-farm/servers/gate-profiles.d.ts +1 -1
  66. package/dist/agent-farm/servers/gate-profiles.js +1 -1
  67. package/dist/agent-farm/servers/mailbox-delivery.d.ts +141 -13
  68. package/dist/agent-farm/servers/mailbox-delivery.d.ts.map +1 -1
  69. package/dist/agent-farm/servers/mailbox-delivery.js +172 -16
  70. package/dist/agent-farm/servers/mailbox-delivery.js.map +1 -1
  71. package/dist/agent-farm/servers/mailbox-wiring.d.ts +24 -2
  72. package/dist/agent-farm/servers/mailbox-wiring.d.ts.map +1 -1
  73. package/dist/agent-farm/servers/mailbox-wiring.js +92 -32
  74. package/dist/agent-farm/servers/mailbox-wiring.js.map +1 -1
  75. package/dist/agent-farm/servers/message-write.d.ts +58 -18
  76. package/dist/agent-farm/servers/message-write.d.ts.map +1 -1
  77. package/dist/agent-farm/servers/message-write.js +73 -28
  78. package/dist/agent-farm/servers/message-write.js.map +1 -1
  79. package/dist/agent-farm/servers/overview.d.ts +19 -0
  80. package/dist/agent-farm/servers/overview.d.ts.map +1 -1
  81. package/dist/agent-farm/servers/overview.js +78 -1
  82. package/dist/agent-farm/servers/overview.js.map +1 -1
  83. package/dist/agent-farm/servers/render-gate.d.ts +13 -0
  84. package/dist/agent-farm/servers/render-gate.d.ts.map +1 -1
  85. package/dist/agent-farm/servers/render-gate.js +21 -0
  86. package/dist/agent-farm/servers/render-gate.js.map +1 -1
  87. package/dist/agent-farm/servers/session-submit.d.ts +221 -28
  88. package/dist/agent-farm/servers/session-submit.d.ts.map +1 -1
  89. package/dist/agent-farm/servers/session-submit.js +334 -43
  90. package/dist/agent-farm/servers/session-submit.js.map +1 -1
  91. package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
  92. package/dist/agent-farm/servers/tower-routes.js +269 -64
  93. package/dist/agent-farm/servers/tower-routes.js.map +1 -1
  94. package/dist/agent-farm/servers/tower-server.js +25 -3
  95. package/dist/agent-farm/servers/tower-server.js.map +1 -1
  96. package/dist/agent-farm/servers/tower-terminals.d.ts +6 -0
  97. package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
  98. package/dist/agent-farm/servers/tower-terminals.js +30 -5
  99. package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
  100. package/dist/agent-farm/servers/tower-tunnel.d.ts.map +1 -1
  101. package/dist/agent-farm/servers/tower-tunnel.js +14 -0
  102. package/dist/agent-farm/servers/tower-tunnel.js.map +1 -1
  103. package/dist/agent-farm/servers/tower-websocket.d.ts +6 -1
  104. package/dist/agent-farm/servers/tower-websocket.d.ts.map +1 -1
  105. package/dist/agent-farm/servers/tower-websocket.js +90 -37
  106. package/dist/agent-farm/servers/tower-websocket.js.map +1 -1
  107. package/dist/agent-farm/types.d.ts +37 -2
  108. package/dist/agent-farm/types.d.ts.map +1 -1
  109. package/dist/agent-farm/utils/harness.d.ts +3 -3
  110. package/dist/agent-farm/utils/harness.js +1 -1
  111. package/dist/agent-farm/utils/message-format.d.ts +67 -3
  112. package/dist/agent-farm/utils/message-format.d.ts.map +1 -1
  113. package/dist/agent-farm/utils/message-format.js +127 -14
  114. package/dist/agent-farm/utils/message-format.js.map +1 -1
  115. package/dist/agent-farm/utils/server-utils.d.ts +86 -4
  116. package/dist/agent-farm/utils/server-utils.d.ts.map +1 -1
  117. package/dist/agent-farm/utils/server-utils.js +303 -5
  118. package/dist/agent-farm/utils/server-utils.js.map +1 -1
  119. package/dist/commands/porch/context-refresh.d.ts +181 -0
  120. package/dist/commands/porch/context-refresh.d.ts.map +1 -0
  121. package/dist/commands/porch/context-refresh.js +270 -0
  122. package/dist/commands/porch/context-refresh.js.map +1 -0
  123. package/dist/commands/porch/index.d.ts +6 -0
  124. package/dist/commands/porch/index.d.ts.map +1 -1
  125. package/dist/commands/porch/index.js +46 -0
  126. package/dist/commands/porch/index.js.map +1 -1
  127. package/dist/commands/porch/next.d.ts +0 -9
  128. package/dist/commands/porch/next.d.ts.map +1 -1
  129. package/dist/commands/porch/next.js +133 -4
  130. package/dist/commands/porch/next.js.map +1 -1
  131. package/dist/commands/porch/protocol.d.ts.map +1 -1
  132. package/dist/commands/porch/protocol.js +102 -0
  133. package/dist/commands/porch/protocol.js.map +1 -1
  134. package/dist/commands/porch/types.d.ts +61 -0
  135. package/dist/commands/porch/types.d.ts.map +1 -1
  136. package/dist/lib/forge-contracts.d.ts +9 -0
  137. package/dist/lib/forge-contracts.d.ts.map +1 -1
  138. package/dist/lib/forge-contracts.js.map +1 -1
  139. package/dist/lib/github.d.ts +15 -1
  140. package/dist/lib/github.d.ts.map +1 -1
  141. package/dist/lib/github.js +17 -0
  142. package/dist/lib/github.js.map +1 -1
  143. package/dist/lib/self-refresh-invocation.d.ts +60 -0
  144. package/dist/lib/self-refresh-invocation.d.ts.map +1 -0
  145. package/dist/lib/self-refresh-invocation.js +64 -0
  146. package/dist/lib/self-refresh-invocation.js.map +1 -0
  147. package/dist/lib/test-env.d.ts +50 -0
  148. package/dist/lib/test-env.d.ts.map +1 -1
  149. package/dist/lib/test-env.js +76 -0
  150. package/dist/lib/test-env.js.map +1 -1
  151. package/dist/terminal/attach-replay.d.ts +39 -0
  152. package/dist/terminal/attach-replay.d.ts.map +1 -0
  153. package/dist/terminal/attach-replay.js +76 -0
  154. package/dist/terminal/attach-replay.js.map +1 -0
  155. package/dist/terminal/pty-manager.d.ts.map +1 -1
  156. package/dist/terminal/pty-manager.js +35 -17
  157. package/dist/terminal/pty-manager.js.map +1 -1
  158. package/dist/terminal/pty-session.d.ts +81 -12
  159. package/dist/terminal/pty-session.d.ts.map +1 -1
  160. package/dist/terminal/pty-session.js +113 -25
  161. package/dist/terminal/pty-session.js.map +1 -1
  162. package/dist/terminal/session-screen.d.ts +25 -0
  163. package/dist/terminal/session-screen.d.ts.map +1 -1
  164. package/dist/terminal/session-screen.js +53 -8
  165. package/dist/terminal/session-screen.js.map +1 -1
  166. package/package.json +10 -7
  167. package/scripts/forge/gitea/pr-view.sh +4 -1
  168. package/scripts/forge/github/pr-view.sh +1 -1
  169. package/scripts/forge/gitlab/pr-view.sh +4 -1
  170. package/skeleton/.claude/skills/afx/SKILL.md +54 -0
  171. package/skeleton/.claude/skills/arch-save/SKILL.md +8 -2
  172. package/skeleton/.claude/skills/builder-refresh/SKILL.md +138 -0
  173. package/skeleton/.codex/skills/afx/SKILL.md +54 -0
  174. package/skeleton/.codex/skills/arch-save/SKILL.md +8 -2
  175. package/skeleton/.codex/skills/builder-refresh/SKILL.md +138 -0
  176. package/skeleton/protocol-schema.json +17 -0
  177. package/skeleton/protocols/air/protocol.json +1 -1
  178. package/skeleton/protocols/aspir/protocol.json +5 -1
  179. package/skeleton/protocols/bugfix/protocol.json +1 -1
  180. package/skeleton/protocols/experiment/protocol.json +1 -1
  181. package/skeleton/protocols/maintain/protocol.json +1 -1
  182. package/skeleton/protocols/pir/builder-prompt.md +3 -2
  183. package/skeleton/protocols/pir/prompts/implement.md +1 -1
  184. package/skeleton/protocols/pir/prompts/plan.md +1 -1
  185. package/skeleton/protocols/pir/prompts/review.md +1 -1
  186. package/skeleton/protocols/pir/protocol.json +1 -1
  187. package/skeleton/protocols/pir/protocol.md +4 -4
  188. package/skeleton/protocols/protocol-schema.json +17 -0
  189. package/skeleton/protocols/research/protocol.json +1 -1
  190. package/skeleton/protocols/spike/protocol.json +1 -1
  191. package/skeleton/protocols/spir/protocol.json +5 -1
  192. package/skeleton/resources/commands/agent-farm.md +14 -11
  193. package/skeleton/roles/builder.md +3 -4
  194. package/templates/3d-viewer.html +32 -4
  195. package/templates/open.html +58 -12
  196. package/templates/tower.html +26 -7
  197. package/templates/vendor/three-3MFLoader.js +1478 -0
  198. package/templates/vendor/three-STLLoader.js +410 -0
  199. package/templates/vendor/three-TrackballControls.js +828 -0
  200. package/templates/vendor/three-fflate.module.js +2474 -0
  201. package/templates/vendor/three.module.js +53044 -0
  202. package/dashboard-dist/assets/index-JCbkpAcV.js.map +0 -1
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Self-refresh orchestrator — the tail of the refresh machine, run by the
3
+ * builder on itself (Spec 1470).
4
+ *
5
+ * ## Why this exists separately from `runReset`
6
+ *
7
+ * `afx refresh` cannot be invoked by its own target. It sends a save request and
8
+ * then POLLS for the receipt while waiting for the terminal to fall quiet — but
9
+ * a builder running it would be mid-turn for the whole poll, so it could never
10
+ * answer its own request. The run would burn the 300 s receipt timeout and
11
+ * abort. The receipt and quiescence gates structurally require a driver outside
12
+ * the turn.
13
+ *
14
+ * So this module is the TAIL of that machine, not a second copy of it: verify an
15
+ * already-written save → assemble the re-orientation → schedule the re-entry →
16
+ * clear. The verification and assembly are the SAME modules `runReset` uses
17
+ * ({@link verifyReceipt}, {@link assembleReorientation}), which a structural test
18
+ * pins. What is deliberately different is the save REQUEST text — see
19
+ * {@link buildBoundarySaveRequest}.
20
+ *
21
+ * ## The two-step handshake, and why it is not one call
22
+ *
23
+ * `verifyReceipt` requires the nonce to be INSIDE the state file. In the self
24
+ * path the builder writes that file before invoking the command, so a nonce
25
+ * minted at invocation could never be in a file already on disk — every run
26
+ * would abort `wrong-nonce`. Hence:
27
+ *
28
+ * begin → mint nonce, write the challenge file, return the save request
29
+ * (builder writes .builder-state.md, reproducing the nonce)
30
+ * execute → verify against THAT nonce, assemble, schedule, clear, consume
31
+ * the challenge
32
+ *
33
+ * The challenge is deleted on use and overwritten by every `begin`, which is
34
+ * what stops a stale `.builder-state.md` from an EARLIER boundary passing the
35
+ * gate. The driven path gets that freshness for free from being externally
36
+ * driven; the self path has to earn it.
37
+ *
38
+ * ## Ordering, and the one place it differs from `/arch-save`
39
+ *
40
+ * Schedule the re-entry FIRST, clear SECOND. `/arch-save` does the reverse. The
41
+ * two failure directions are not symmetric:
42
+ *
43
+ * - schedule fails, no clear sent → builder keeps everything. Recoverable.
44
+ * - clear sent, schedule fails → context destroyed, nobody coming back.
45
+ *
46
+ * Only the second is unrecoverable, so the destructive step goes last. Baked
47
+ * Decision 4 requires the automatic path to be MORE conservative than the manual
48
+ * one; this is that, made concrete rather than asserted.
49
+ *
50
+ * ## Everything is a port, and every action is logged before it happens
51
+ *
52
+ * Same discipline as `runReset`, for the same reason: every safety property here
53
+ * is an ORDERING property ("the clear never happens before X"), and ordering is
54
+ * what is hardest to prove by reading. Actions go through injected ports and the
55
+ * invariant tests assert over an ordered step log rather than over mocks, so "no
56
+ * clear without a verified save" becomes something a test can fail on.
57
+ *
58
+ * The IRREVERSIBLE action is logged BEFORE it is attempted (`clear-attempted`),
59
+ * with a second entry (`clear`) only on success. That asymmetry is deliberate:
60
+ * `sendRaw` can succeed on the wire and still throw, and a log written only on
61
+ * success would then claim no clear occurred about a context that no longer
62
+ * exists — with every `expectNoClear` assertion agreeing. Reversible steps are
63
+ * logged after they succeed, where a failure is genuinely a non-event.
64
+ * (`runReset` logs its clear after the fact; that same weakness is noted for the
65
+ * review artifact rather than fixed here, since this phase does not own it.)
66
+ */
67
+ import { type ReceiptFsPort, type ReceiptObservation } from './receipt.js';
68
+ import { type IssuePayload, type ReorientationPayload, type ResumeNoticePort, type SpawnPromptPort } from './reorient.js';
69
+ import type { ResolvedBuilderContext } from './context.js';
70
+ /** Filesystem surface. Superset of the receipt gate's, plus writes and delete. */
71
+ export interface SelfRefreshFsPort extends ReceiptFsPort {
72
+ write(path: string, content: string): void;
73
+ remove(path: string): void;
74
+ }
75
+ /** Wall clock and sleep, injected so tests run instantly and deterministically. */
76
+ export interface SelfRefreshClockPort {
77
+ /** Wall clock, for timestamps that cross process boundaries (`issuedAt`). */
78
+ now(): number;
79
+ sleep(ms: number): Promise<void>;
80
+ /**
81
+ * MONOTONIC reading, for measuring the stability gap.
82
+ *
83
+ * `Date.now()` is not monotonic: an NTP step forward inside the window would
84
+ * make the measured gap satisfy the stability check when no real time passed —
85
+ * spoofing the very measurement that replaced an asserted value. (A backward
86
+ * step is already fail-safe: negative elapsed reads as still-growing.)
87
+ *
88
+ * Optional so existing callers and fakes keep working; when absent the code
89
+ * falls back to `now()`, which is the previous behaviour rather than a new
90
+ * hazard.
91
+ */
92
+ monotonicNow?(): number;
93
+ }
94
+ /**
95
+ * What the builder can do to its OWN terminal.
96
+ *
97
+ * Two distinct operations, never one `send(data, mode)`. Tower's raw route types
98
+ * literal input into the PTY; the delayed route persists a formatted message to
99
+ * the mailbox for later delivery. Confusing them is silent: `/clear` sent as a
100
+ * normal message would be delivered as text rather than executed.
101
+ */
102
+ export interface SelfTerminalPort {
103
+ /** Schedule a message to self for delivery after `delaySeconds`. */
104
+ scheduleReentry(message: string, delaySeconds: number): Promise<void>;
105
+ /** Type literal text into our own PTY. This is how `/clear` is delivered. */
106
+ sendRaw(text: string): Promise<void>;
107
+ }
108
+ /** Git surface — only what the dirty-worktree gate needs. */
109
+ export interface SelfGitPort {
110
+ /** True when tracked files have uncommitted modifications (staged or not). */
111
+ hasUncommittedTrackedChanges(): boolean;
112
+ }
113
+ /**
114
+ * The ordered record of what happened.
115
+ *
116
+ * `clear` is the only irreversible entry. Every invariant test is a statement
117
+ * about this array — most importantly that `clear` never appears without
118
+ * `reorient-written` and `reentry-scheduled` before it.
119
+ */
120
+ export type SelfRefreshStepName = 'challenge-read' | 'worktree-checked' | 'receipt-accepted' | 'assemble' | 'reorient-written' | 'reentry-scheduled' | 'challenge-marked'
121
+ /**
122
+ * Logged BEFORE the clear is sent, and never removed.
123
+ *
124
+ * The distinction from `clear` is the whole point. `terminal.sendRaw` can
125
+ * succeed on the wire and still throw client-side — a dropped socket after
126
+ * delivery, say — and in that case the builder IS cleared while the call
127
+ * reports failure. Logging only on success would produce a run that says "no
128
+ * clear happened" about a context that no longer exists, and every
129
+ * `expectNoClear` assertion would agree with it.
130
+ *
131
+ * So the log records the INTENT before the irreversible act. `clear-attempted`
132
+ * without `clear` means "we do not know" — which is the truth, and is
133
+ * reportable. Anything asserting that no clear occurred must check for both.
134
+ */
135
+ | 'clear-attempted'
136
+ /** Logged only after `sendRaw` returned successfully. */
137
+ | 'clear' | 'challenge-consumed';
138
+ export interface SelfRefreshStep {
139
+ name: SelfRefreshStepName;
140
+ at: number;
141
+ detail?: string;
142
+ }
143
+ export type SelfRefreshFailure = 'no-challenge'
144
+ /**
145
+ * A safety PARAMETER was invalid — a configuration error, not a bad save.
146
+ *
147
+ * Distinct from `receipt-rejected` because the advice differs completely:
148
+ * "rewrite your save" is exactly wrong when the real problem is `--min-bytes 0`.
149
+ */
150
+ | 'invalid-parameters' | 'dirty-worktree' | 'receipt-rejected' | 'assembly-failed'
151
+ /**
152
+ * The frame was built but could not be persisted.
153
+ *
154
+ * Distinct from `assembly-failed` because the causes and the fixes differ: one
155
+ * is a missing input (a context field), the other is the filesystem. A caller
156
+ * that cannot tell them apart cannot advise.
157
+ */
158
+ | 'reorient-write-failed' | 'reentry-failed'
159
+ /**
160
+ * The challenge could not be marked consumed, so the clear was not attempted.
161
+ *
162
+ * Distinct from `reentry-failed` because the recovery differs: by this point a
163
+ * re-entry is already queued, so a retry queues a SECOND one. The message has
164
+ * to say so.
165
+ */
166
+ | 'challenge-burn-failed' | 'clear-failed';
167
+ export interface BeginResult {
168
+ nonce: string;
169
+ statePath: string;
170
+ challengePath: string;
171
+ /** The message telling the builder what to write. */
172
+ saveRequest: string;
173
+ }
174
+ export interface SelfRefreshResult {
175
+ /**
176
+ * `dry-run` is deliberately distinct from `aborted`.
177
+ *
178
+ * A rehearsal that verified and assembled cleanly is a SUCCESS, and folding it
179
+ * into `aborted` would make the report announce "ABORTED" on a healthy run and
180
+ * force every caller's exit-code logic to special-case `failure === undefined`
181
+ * — a contract nobody would guess from the type.
182
+ */
183
+ outcome: 'completed' | 'aborted' | 'dry-run';
184
+ steps: SelfRefreshStep[];
185
+ /** Present when aborted — which gate refused, for the report. */
186
+ failure?: SelfRefreshFailure;
187
+ /** Human-readable reason, naming the specific gate. */
188
+ reason?: string;
189
+ statePath: string;
190
+ reorientPath?: string;
191
+ payload?: ReorientationPayload;
192
+ stateBytes?: number;
193
+ }
194
+ /** The persisted challenge. */
195
+ export interface Challenge {
196
+ nonce: string;
197
+ issuedAt: number;
198
+ /** Boundary id from porch, e.g. `enter:review`. Shapes the save request. */
199
+ boundary?: string;
200
+ /**
201
+ * Set immediately BEFORE the clear is attempted; refused by the gate on any
202
+ * later run. Makes a challenge single-use even when the post-clear delete
203
+ * fails, which is the difference between "tidied up" and "cannot be replayed".
204
+ */
205
+ consumedAt?: number;
206
+ }
207
+ /**
208
+ * The boundary-aware save request.
209
+ *
210
+ * This is the one place the self path deliberately diverges from the driven one.
211
+ * `buildSaveRequest` (receipt.ts) asks for a "complete working state" and says
212
+ * "do not summarise for brevity" — right for a MID-PHASE reset, where a builder
213
+ * may be holding a half-finished action nothing on disk records.
214
+ *
215
+ * A boundary save is a different problem. Spec 1470 fixes the boundaries at
216
+ * moments when the durable state is already externalised — the spec, the plan,
217
+ * `status.yaml`, the thread narrative and git — so what a cold reader actually
218
+ * needs is the residue those artifacts do NOT carry. Asking for "everything"
219
+ * here produces a long file that mostly restates the plan, and Baked Decision 2
220
+ * explicitly says to keep the builder save minimal.
221
+ *
222
+ * Hence: pointers over prose. Receipts with commit hashes, not narration of what
223
+ * the commits contain.
224
+ *
225
+ * At the REVIEW boundary there is one further exclusion, and it is the whole
226
+ * reason that boundary is a quality feature rather than only a context one: a
227
+ * builder entering review in a fresh context should read its own diff cold. If
228
+ * the save carries "I implemented X and it is correct because Y", the refresh
229
+ * hands back the very perspective it was supposed to remove.
230
+ */
231
+ export declare function buildBoundarySaveRequest(nonce: string, statePath: string, boundary?: string): string;
232
+ /**
233
+ * `path.join`, not string concatenation — the same reasoning `stateFilePath`
234
+ * documents. These paths are shown to the builder verbatim and stat'd by the
235
+ * gate, so a hand-built separator would name one path in the instruction and
236
+ * check a different one on Windows. `join` also collapses a trailing slash.
237
+ */
238
+ export declare function challengeFilePath(worktreePath: string): string;
239
+ export declare function reorientFilePath(worktreePath: string): string;
240
+ export interface BeginOptions {
241
+ fs: SelfRefreshFsPort;
242
+ clock: SelfRefreshClockPort;
243
+ worktree: string;
244
+ boundary?: string;
245
+ /** Injected for tests; defaults to the real generator. */
246
+ makeNonce?: () => string;
247
+ }
248
+ /**
249
+ * Mint a challenge and tell the builder what to write.
250
+ *
251
+ * Overwrites any existing challenge deliberately: a fresh `begin` must invalidate
252
+ * a previous boundary's nonce, or a stale `.builder-state.md` left on disk would
253
+ * satisfy the gate without the builder writing anything.
254
+ *
255
+ * Writes NOTHING destructive and touches no terminal. Nothing here can lose work.
256
+ */
257
+ export declare function beginSelfRefresh(options: BeginOptions): BeginResult;
258
+ export declare function parseChallenge(raw: string, now: number): {
259
+ ok: true;
260
+ challenge: Challenge;
261
+ } | {
262
+ ok: false;
263
+ reason: string;
264
+ };
265
+ export interface RunSelfRefreshOptions {
266
+ fs: SelfRefreshFsPort;
267
+ clock: SelfRefreshClockPort;
268
+ terminal: SelfTerminalPort;
269
+ git: SelfGitPort;
270
+ context: ResolvedBuilderContext;
271
+ buildSpawnPrompt: SpawnPromptPort;
272
+ buildResumeNotice?: ResumeNoticePort;
273
+ issue?: IssuePayload;
274
+ addendum?: string;
275
+ minBytes?: number;
276
+ stabilityWindowMs?: number;
277
+ reentryDelaySeconds?: number;
278
+ /**
279
+ * Reject a challenge older than this. Defaults to
280
+ * {@link DEFAULT_CHALLENGE_MAX_AGE_MS}.
281
+ */
282
+ challengeMaxAgeMs?: number;
283
+ /**
284
+ * Boundary this run is FOR, when the caller knows it.
285
+ *
286
+ * A challenge names the boundary it was issued at. If an execute aborts
287
+ * (dirty worktree, Tower down) the challenge survives on disk, and the builder
288
+ * may then commit, work on, and reach a LATER boundary. Running execute there
289
+ * without a fresh `begin` would let the lingering challenge validate a
290
+ * `.builder-state.md` describing superseded work — precisely the staleness the
291
+ * handshake exists to stop.
292
+ */
293
+ expectedBoundary?: string;
294
+ /** Report what would happen; send nothing, clear nothing, consume nothing. */
295
+ dryRun?: boolean;
296
+ /** Escape hatch for a worktree that is legitimately dirty. Off by default. */
297
+ allowDirty?: boolean;
298
+ }
299
+ export declare function runSelfRefresh(options: RunSelfRefreshOptions): Promise<SelfRefreshResult>;
300
+ /**
301
+ * Mark the re-entry as an AUTOMATIC refresh before it is scheduled.
302
+ *
303
+ * A builder cannot tell its own scheduled message from an architect's. Verified
304
+ * by probe during the specify phase: `afx send <self> "..."` is rendered by the
305
+ * harness as `### [ARCHITECT INSTRUCTION | … ] ###`. So a frame that merely says
306
+ * "context refresh" arrives looking like an order from the architect, and a
307
+ * refreshed builder may treat re-orientation as a new instruction — or, worse,
308
+ * wait for a follow-up that will never come.
309
+ *
310
+ * Added HERE rather than in `assembleReorientation`, which is shared: on the
311
+ * driven path the message genuinely IS from an architect who typed
312
+ * `afx refresh`, so labelling it automatic there would be false. The
313
+ * discriminator belongs to the path that is actually automatic.
314
+ */
315
+ export declare function buildAutomaticReentryFrame(inline: string): string;
316
+ /**
317
+ * The literal marker. Exported so tests pin the exact string a builder sees,
318
+ * rather than a paraphrase that could drift away from it.
319
+ */
320
+ export declare const AUTOMATIC_REENTRY_MARKER = "## AUTOMATIC CONTEXT REFRESH \u2014 re-entry (not an architect instruction)";
321
+ /** Render a result for a human. */
322
+ export declare function formatSelfRefreshReport(result: SelfRefreshResult): string;
323
+ /**
324
+ * Did this run reach the irreversible step?
325
+ *
326
+ * True for a CONFIRMED clear and for an ATTEMPTED one, because an attempt whose
327
+ * send threw may still have landed. Anything asking "is this builder's context
328
+ * safe?" must treat both as unsafe; a helper that answered only about confirmed
329
+ * clears would be the optimistic reading of an ambiguous event.
330
+ */
331
+ export declare function didClear(result: SelfRefreshResult): boolean;
332
+ /** Strictly confirmed: `sendRaw` returned successfully. */
333
+ export declare function didClearConfirmed(result: SelfRefreshResult): boolean;
334
+ export type { ReceiptObservation };
335
+ //# sourceMappingURL=self.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self.d.ts","sourceRoot":"","sources":["../../../../src/agent-farm/commands/reset/self.ts"],"names":[],"mappings":"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"}