@namzu/cli 23.0.0 → 25.0.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 (243) hide show
  1. package/CHANGELOG.md +845 -0
  2. package/README.md +13 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +18 -10
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/drain.d.ts +0 -23
  7. package/dist/commands/drain.d.ts.map +1 -1
  8. package/dist/commands/drain.js +23 -9
  9. package/dist/commands/drain.js.map +1 -1
  10. package/dist/commands/resident-flags.d.ts +24 -0
  11. package/dist/commands/resident-flags.d.ts.map +1 -0
  12. package/dist/commands/resident-flags.js +191 -0
  13. package/dist/commands/resident-flags.js.map +1 -0
  14. package/dist/commands/resident-learning.d.ts +6 -0
  15. package/dist/commands/resident-learning.d.ts.map +1 -0
  16. package/dist/commands/resident-learning.js +293 -0
  17. package/dist/commands/resident-learning.js.map +1 -0
  18. package/dist/commands/resident.d.ts +20 -0
  19. package/dist/commands/resident.d.ts.map +1 -0
  20. package/dist/commands/resident.js +418 -0
  21. package/dist/commands/resident.js.map +1 -0
  22. package/dist/commands/run-flags.d.ts +2 -2
  23. package/dist/commands/run-flags.d.ts.map +1 -1
  24. package/dist/commands/run-flags.js +6 -6
  25. package/dist/commands/run-flags.js.map +1 -1
  26. package/dist/commands/run-stream.d.ts.map +1 -1
  27. package/dist/commands/run-stream.js +9 -10
  28. package/dist/commands/run-stream.js.map +1 -1
  29. package/dist/commands/run.d.ts.map +1 -1
  30. package/dist/commands/run.js +3 -2
  31. package/dist/commands/run.js.map +1 -1
  32. package/dist/commands/upgrade.d.ts +1 -0
  33. package/dist/commands/upgrade.d.ts.map +1 -1
  34. package/dist/commands/upgrade.js +6 -3
  35. package/dist/commands/upgrade.js.map +1 -1
  36. package/dist/config/load.d.ts.map +1 -1
  37. package/dist/config/load.js +27 -4
  38. package/dist/config/load.js.map +1 -1
  39. package/dist/config/run-limits.d.ts +11 -0
  40. package/dist/config/run-limits.d.ts.map +1 -0
  41. package/dist/config/run-limits.js +64 -0
  42. package/dist/config/run-limits.js.map +1 -0
  43. package/dist/config/schema.d.ts +12 -4
  44. package/dist/config/schema.d.ts.map +1 -1
  45. package/dist/config/schema.js.map +1 -1
  46. package/dist/context/runtime-message.d.ts.map +1 -1
  47. package/dist/context/runtime-message.js +2 -0
  48. package/dist/context/runtime-message.js.map +1 -1
  49. package/dist/integrations/npm-invocation.d.ts +10 -0
  50. package/dist/integrations/npm-invocation.d.ts.map +1 -0
  51. package/dist/integrations/npm-invocation.js +23 -0
  52. package/dist/integrations/npm-invocation.js.map +1 -0
  53. package/dist/integrations/plugins/runtime.d.ts +19 -1
  54. package/dist/integrations/plugins/runtime.d.ts.map +1 -1
  55. package/dist/integrations/plugins/runtime.js +89 -1
  56. package/dist/integrations/plugins/runtime.js.map +1 -1
  57. package/dist/integrations/plugins/settings.d.ts +15 -0
  58. package/dist/integrations/plugins/settings.d.ts.map +1 -0
  59. package/dist/integrations/plugins/settings.js +106 -0
  60. package/dist/integrations/plugins/settings.js.map +1 -0
  61. package/dist/integrations/providers/credential-store.d.ts +8 -7
  62. package/dist/integrations/providers/credential-store.d.ts.map +1 -1
  63. package/dist/integrations/providers/credential-store.js +44 -17
  64. package/dist/integrations/providers/credential-store.js.map +1 -1
  65. package/dist/integrations/providers/discover.d.ts.map +1 -1
  66. package/dist/integrations/providers/discover.js +7 -2
  67. package/dist/integrations/providers/discover.js.map +1 -1
  68. package/dist/integrations/providers/harness-credentials.d.ts +2 -2
  69. package/dist/integrations/providers/harness-credentials.d.ts.map +1 -1
  70. package/dist/integrations/providers/harness-credentials.js +13 -8
  71. package/dist/integrations/providers/harness-credentials.js.map +1 -1
  72. package/dist/integrations/providers/setup.d.ts.map +1 -1
  73. package/dist/integrations/providers/setup.js +52 -5
  74. package/dist/integrations/providers/setup.js.map +1 -1
  75. package/dist/integrations/resident/foreground.d.ts +19 -0
  76. package/dist/integrations/resident/foreground.d.ts.map +1 -0
  77. package/dist/integrations/resident/foreground.js +95 -0
  78. package/dist/integrations/resident/foreground.js.map +1 -0
  79. package/dist/integrations/resident/inspection.d.ts +10 -0
  80. package/dist/integrations/resident/inspection.d.ts.map +1 -0
  81. package/dist/integrations/resident/inspection.js +263 -0
  82. package/dist/integrations/resident/inspection.js.map +1 -0
  83. package/dist/integrations/resident/learning-sources.d.ts +4 -0
  84. package/dist/integrations/resident/learning-sources.d.ts.map +1 -0
  85. package/dist/integrations/resident/learning-sources.js +79 -0
  86. package/dist/integrations/resident/learning-sources.js.map +1 -0
  87. package/dist/integrations/resident/learning-storage.d.ts +5 -0
  88. package/dist/integrations/resident/learning-storage.d.ts.map +1 -0
  89. package/dist/integrations/resident/learning-storage.js +51 -0
  90. package/dist/integrations/resident/learning-storage.js.map +1 -0
  91. package/dist/integrations/resident/lifecycle-errors.d.ts +9 -0
  92. package/dist/integrations/resident/lifecycle-errors.d.ts.map +1 -0
  93. package/dist/integrations/resident/lifecycle-errors.js +15 -0
  94. package/dist/integrations/resident/lifecycle-errors.js.map +1 -0
  95. package/dist/integrations/resident/owned-runner.d.ts +17 -0
  96. package/dist/integrations/resident/owned-runner.d.ts.map +1 -0
  97. package/dist/integrations/resident/owned-runner.js +91 -0
  98. package/dist/integrations/resident/owned-runner.js.map +1 -0
  99. package/dist/integrations/resident/runner-control.d.ts +47 -0
  100. package/dist/integrations/resident/runner-control.d.ts.map +1 -0
  101. package/dist/integrations/resident/runner-control.js +238 -0
  102. package/dist/integrations/resident/runner-control.js.map +1 -0
  103. package/dist/integrations/resident/runner-launch.d.ts +52 -0
  104. package/dist/integrations/resident/runner-launch.d.ts.map +1 -0
  105. package/dist/integrations/resident/runner-launch.js +142 -0
  106. package/dist/integrations/resident/runner-launch.js.map +1 -0
  107. package/dist/integrations/resident/runner-store.d.ts +44 -0
  108. package/dist/integrations/resident/runner-store.d.ts.map +1 -0
  109. package/dist/integrations/resident/runner-store.js +281 -0
  110. package/dist/integrations/resident/runner-store.js.map +1 -0
  111. package/dist/integrations/resident/runner-worker.d.ts +2 -0
  112. package/dist/integrations/resident/runner-worker.d.ts.map +1 -0
  113. package/dist/integrations/resident/runner-worker.js +146 -0
  114. package/dist/integrations/resident/runner-worker.js.map +1 -0
  115. package/dist/integrations/resident/session-step.d.ts +29 -0
  116. package/dist/integrations/resident/session-step.d.ts.map +1 -0
  117. package/dist/integrations/resident/session-step.js +462 -0
  118. package/dist/integrations/resident/session-step.js.map +1 -0
  119. package/dist/integrations/resident/storage.d.ts +17 -0
  120. package/dist/integrations/resident/storage.d.ts.map +1 -0
  121. package/dist/integrations/resident/storage.js +140 -0
  122. package/dist/integrations/resident/storage.js.map +1 -0
  123. package/dist/integrations/resident/tool-evidence.d.ts +6 -0
  124. package/dist/integrations/resident/tool-evidence.d.ts.map +1 -0
  125. package/dist/integrations/resident/tool-evidence.js +117 -0
  126. package/dist/integrations/resident/tool-evidence.js.map +1 -0
  127. package/dist/integrations/resident/verification.d.ts +11 -0
  128. package/dist/integrations/resident/verification.d.ts.map +1 -0
  129. package/dist/integrations/resident/verification.js +109 -0
  130. package/dist/integrations/resident/verification.js.map +1 -0
  131. package/dist/integrations/sessions/compaction-evidence.d.ts +5 -0
  132. package/dist/integrations/sessions/compaction-evidence.d.ts.map +1 -0
  133. package/dist/integrations/sessions/compaction-evidence.js +59 -0
  134. package/dist/integrations/sessions/compaction-evidence.js.map +1 -0
  135. package/dist/integrations/sessions/context-inventory.js +1 -1
  136. package/dist/integrations/sessions/context-inventory.js.map +1 -1
  137. package/dist/integrations/sessions/conversation-search.d.ts +56 -8
  138. package/dist/integrations/sessions/conversation-search.d.ts.map +1 -1
  139. package/dist/integrations/sessions/conversation-search.js +600 -63
  140. package/dist/integrations/sessions/conversation-search.js.map +1 -1
  141. package/dist/integrations/sessions/database.d.ts +5 -0
  142. package/dist/integrations/sessions/database.d.ts.map +1 -0
  143. package/dist/integrations/sessions/database.js +34 -0
  144. package/dist/integrations/sessions/database.js.map +1 -0
  145. package/dist/integrations/sessions/evidence-page-validation.d.ts +8 -0
  146. package/dist/integrations/sessions/evidence-page-validation.d.ts.map +1 -0
  147. package/dist/integrations/sessions/evidence-page-validation.js +74 -0
  148. package/dist/integrations/sessions/evidence-page-validation.js.map +1 -0
  149. package/dist/integrations/sessions/evidence-recall.d.ts +5 -0
  150. package/dist/integrations/sessions/evidence-recall.d.ts.map +1 -0
  151. package/dist/integrations/sessions/evidence-recall.js +173 -0
  152. package/dist/integrations/sessions/evidence-recall.js.map +1 -0
  153. package/dist/integrations/sessions/paths.d.ts +7 -0
  154. package/dist/integrations/sessions/paths.d.ts.map +1 -0
  155. package/dist/integrations/sessions/paths.js +14 -0
  156. package/dist/integrations/sessions/paths.js.map +1 -0
  157. package/dist/integrations/sessions/run-discovery.d.ts +24 -0
  158. package/dist/integrations/sessions/run-discovery.d.ts.map +1 -0
  159. package/dist/integrations/sessions/run-discovery.js +142 -0
  160. package/dist/integrations/sessions/run-discovery.js.map +1 -0
  161. package/dist/integrations/sessions/store.d.ts +8 -18
  162. package/dist/integrations/sessions/store.d.ts.map +1 -1
  163. package/dist/integrations/sessions/store.js +14 -39
  164. package/dist/integrations/sessions/store.js.map +1 -1
  165. package/dist/integrations/sessions/transcript-export.d.ts +0 -1
  166. package/dist/integrations/sessions/transcript-export.d.ts.map +1 -1
  167. package/dist/integrations/sessions/transcript-export.js +3 -2
  168. package/dist/integrations/sessions/transcript-export.js.map +1 -1
  169. package/dist/integrations/sessions/turn-evidence.d.ts +0 -9
  170. package/dist/integrations/sessions/turn-evidence.d.ts.map +1 -1
  171. package/dist/integrations/sessions/turn-evidence.js +5 -2
  172. package/dist/integrations/sessions/turn-evidence.js.map +1 -1
  173. package/dist/integrations/state/private-directory.d.ts +4 -2
  174. package/dist/integrations/state/private-directory.d.ts.map +1 -1
  175. package/dist/integrations/state/private-directory.js +6 -4
  176. package/dist/integrations/state/private-directory.js.map +1 -1
  177. package/dist/integrations/state/report.d.ts.map +1 -1
  178. package/dist/integrations/state/report.js +78 -21
  179. package/dist/integrations/state/report.js.map +1 -1
  180. package/dist/integrations/subagents/parent.d.ts +3 -2
  181. package/dist/integrations/subagents/parent.d.ts.map +1 -1
  182. package/dist/integrations/subagents/parent.js +11 -6
  183. package/dist/integrations/subagents/parent.js.map +1 -1
  184. package/dist/integrations/subagents/policy.d.ts +2 -5
  185. package/dist/integrations/subagents/policy.d.ts.map +1 -1
  186. package/dist/integrations/subagents/policy.js +2 -5
  187. package/dist/integrations/subagents/policy.js.map +1 -1
  188. package/dist/integrations/subagents/runtime.d.ts +7 -0
  189. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  190. package/dist/integrations/subagents/runtime.js +9 -7
  191. package/dist/integrations/subagents/runtime.js.map +1 -1
  192. package/dist/permissions/rules.d.ts +2 -8
  193. package/dist/permissions/rules.d.ts.map +1 -1
  194. package/dist/permissions/rules.js +19 -10
  195. package/dist/permissions/rules.js.map +1 -1
  196. package/dist/tui/App.d.ts +0 -12
  197. package/dist/tui/App.d.ts.map +1 -1
  198. package/dist/tui/App.js +235 -15
  199. package/dist/tui/App.js.map +1 -1
  200. package/dist/tui/ChoicePicker.d.ts +2 -1
  201. package/dist/tui/ChoicePicker.d.ts.map +1 -1
  202. package/dist/tui/ChoicePicker.js +10 -8
  203. package/dist/tui/ChoicePicker.js.map +1 -1
  204. package/dist/tui/ToolOutputViewer.js +1 -1
  205. package/dist/tui/ToolOutputViewer.js.map +1 -1
  206. package/dist/tui/agent.d.ts +29 -3
  207. package/dist/tui/agent.d.ts.map +1 -1
  208. package/dist/tui/agent.js +233 -46
  209. package/dist/tui/agent.js.map +1 -1
  210. package/dist/tui/conversation-evidence-view.d.ts +6 -0
  211. package/dist/tui/conversation-evidence-view.d.ts.map +1 -0
  212. package/dist/tui/conversation-evidence-view.js +96 -0
  213. package/dist/tui/conversation-evidence-view.js.map +1 -0
  214. package/dist/tui/conversation-history.d.ts +3 -1
  215. package/dist/tui/conversation-history.d.ts.map +1 -1
  216. package/dist/tui/conversation-history.js +16 -1
  217. package/dist/tui/conversation-history.js.map +1 -1
  218. package/dist/tui/exit-summary.d.ts +1 -1
  219. package/dist/tui/exit-summary.d.ts.map +1 -1
  220. package/dist/tui/exit-summary.js +17 -5
  221. package/dist/tui/exit-summary.js.map +1 -1
  222. package/dist/tui/markdownParser.d.ts.map +1 -1
  223. package/dist/tui/markdownParser.js +2 -1
  224. package/dist/tui/markdownParser.js.map +1 -1
  225. package/dist/tui/plugin-view.d.ts +9 -0
  226. package/dist/tui/plugin-view.d.ts.map +1 -0
  227. package/dist/tui/plugin-view.js +59 -0
  228. package/dist/tui/plugin-view.js.map +1 -0
  229. package/dist/tui/run-interruption.d.ts +2 -2
  230. package/dist/tui/run-interruption.d.ts.map +1 -1
  231. package/dist/tui/run-interruption.js +5 -1
  232. package/dist/tui/run-interruption.js.map +1 -1
  233. package/dist/tui/run-limits-settings.d.ts +39 -0
  234. package/dist/tui/run-limits-settings.d.ts.map +1 -0
  235. package/dist/tui/run-limits-settings.js +88 -0
  236. package/dist/tui/run-limits-settings.js.map +1 -0
  237. package/dist/tui/slashCommands.d.ts +6 -1
  238. package/dist/tui/slashCommands.d.ts.map +1 -1
  239. package/dist/tui/slashCommands.js +40 -9
  240. package/dist/tui/slashCommands.js.map +1 -1
  241. package/dist/tui/types.d.ts +4 -2
  242. package/dist/tui/types.d.ts.map +1 -1
  243. package/package.json +6 -6
@@ -0,0 +1,263 @@
1
+ import { join } from 'node:path';
2
+ import { isDeepStrictEqual, stripVTControlCharacters } from 'node:util';
3
+ import { inspectResidentConsumption, isEntityId, } from '@namzu/sdk';
4
+ import { readResidentAttemptReceipt } from './tool-evidence.js';
5
+ function object(value) {
6
+ if (!value || typeof value !== 'object' || Array.isArray(value))
7
+ throw new Error('Invalid resident receipt object.');
8
+ return value;
9
+ }
10
+ function count(value) {
11
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0)
12
+ throw new Error('Invalid receipt count.');
13
+ return value;
14
+ }
15
+ function text(value) {
16
+ if (typeof value !== 'string')
17
+ throw new Error('Invalid receipt text.');
18
+ return value;
19
+ }
20
+ function id(value) {
21
+ if (!isEntityId(value, 'run'))
22
+ throw new Error('Invalid receipt identity.');
23
+ return value;
24
+ }
25
+ function identity(value) {
26
+ const v = object(value);
27
+ if (v.version !== 1)
28
+ throw new Error('Unknown attempt receipt version.');
29
+ return {
30
+ version: 1,
31
+ pursuitId: id(v.pursuitId),
32
+ claimId: id(v.claimId),
33
+ sessionId: id(v.sessionId),
34
+ runId: id(v.runId),
35
+ };
36
+ }
37
+ function parseBudget(value) {
38
+ if (value === undefined)
39
+ return null;
40
+ const b = object(value);
41
+ if (typeof b.poisoned !== 'boolean')
42
+ throw new Error('Invalid budget state.');
43
+ return {
44
+ ownTokens: count(b.ownTokens),
45
+ treeTokens: count(b.treeTokens),
46
+ inFlightRequests: count(b.inFlightRequests),
47
+ unsettledChildren: count(b.unsettledChildren),
48
+ poisoned: b.poisoned,
49
+ unresolvedRequests: b.unresolvedRequests === undefined ? null : count(b.unresolvedRequests),
50
+ };
51
+ }
52
+ function parseFinish(value) {
53
+ const f = object(value);
54
+ if (f.cleanup !== 'confirmed' && f.cleanup !== 'unconfirmed')
55
+ throw new Error('Unknown cleanup state.');
56
+ if (f.error !== null)
57
+ text(f.error);
58
+ if (f.stopReason !== null)
59
+ text(f.stopReason);
60
+ const decision = f.decision === null ? null : object(f.decision);
61
+ if (decision && !['wait', 'complete', 'blocked'].includes(text(decision.kind)))
62
+ throw new Error('Invalid attempt outcome.');
63
+ const u = f.usage === null ? null : object(f.usage);
64
+ const cost = u ? object(u.cost) : null;
65
+ if (cost &&
66
+ (typeof cost.totalCost !== 'number' || !Number.isFinite(cost.totalCost) || cost.totalCost < 0))
67
+ throw new Error('Invalid cost.');
68
+ return {
69
+ ...identity(f),
70
+ finishedAt: count(f.finishedAt),
71
+ cleanup: f.cleanup,
72
+ error: f.error,
73
+ decision,
74
+ budget: parseBudget(f.budget),
75
+ verificationPolicy: f.verificationPolicy,
76
+ verification: f.verification ? object(f.verification) : null,
77
+ usage: u && cost
78
+ ? {
79
+ totalTokens: count(u.totalTokens),
80
+ cost: {
81
+ totalCost: cost.totalCost,
82
+ unpricedTokens: count(cost.unpricedTokens),
83
+ },
84
+ }
85
+ : null,
86
+ };
87
+ }
88
+ /** Uses only scoped attempt/run records. No provider discovery or session writes. */
89
+ export function residentConsumptionResolver(resident) {
90
+ const read = async (path, signal) => {
91
+ try {
92
+ return await readResidentAttemptReceipt(resident.root, path, signal);
93
+ }
94
+ catch (error) {
95
+ if (error.code === 'ENOENT')
96
+ return null;
97
+ throw error;
98
+ }
99
+ };
100
+ return {
101
+ maxReadBytes: 3 * 65_536,
102
+ async resolve(admission, signal) {
103
+ id(admission.claimId);
104
+ const dir = join(resident.artifactsRoot, admission.claimId);
105
+ const rawStart = await read(join(dir, 'start.json'), signal);
106
+ if (!rawStart)
107
+ return null;
108
+ const start = { ...identity(rawStart), startedAt: count(object(rawStart).startedAt) };
109
+ if (start.claimId !== admission.claimId || start.pursuitId !== admission.pursuitId)
110
+ throw new Error('Attempt does not match the admitted claim.');
111
+ const rawRun = await read(join(resident.root, 'sessions', start.sessionId, 'runs', start.runId, 'run.json'), signal);
112
+ if (!rawRun)
113
+ return null;
114
+ const raw = object(rawRun);
115
+ const run = {
116
+ id: id(raw.id),
117
+ metadata: { scope: object(object(raw.metadata).scope) },
118
+ tokenUsage: { totalTokens: count(object(raw.tokenUsage).totalTokens) },
119
+ budget: parseBudget(raw.budget),
120
+ };
121
+ if (run.id !== start.runId ||
122
+ !isDeepStrictEqual(run.metadata.scope, {
123
+ tenantId: resident.tenantId,
124
+ projectId: resident.projectId,
125
+ sessionId: start.sessionId,
126
+ runId: start.runId,
127
+ }))
128
+ throw new Error('Attempt run is outside this resident project.');
129
+ const rawFinish = await read(join(dir, 'finish.json'), signal);
130
+ const finish = rawFinish === null ? null : parseFinish(rawFinish);
131
+ if (finish &&
132
+ (!isDeepStrictEqual(identity(start), identity(finish)) ||
133
+ finish.finishedAt < start.startedAt))
134
+ throw new Error('Attempt receipts disagree.');
135
+ if (finish?.usage && finish.usage.totalTokens !== run.tokenUsage.totalTokens)
136
+ throw new Error('Finish usage disagrees with the scoped run.');
137
+ const tree = finish?.budget ?? run.budget;
138
+ if (tree && tree.ownTokens !== run.tokenUsage.totalTokens)
139
+ throw new Error('Tree ledger disagrees with own usage.');
140
+ let verification = !finish || finish.verificationPolicy ? 'unconfirmed' : 'unconfigured';
141
+ if (finish?.verification) {
142
+ const receipt = object(finish.verification.receipt);
143
+ if (!/^[a-f0-9]{64}$/.test(text(finish.verification.answerSha256)) ||
144
+ !Array.isArray(receipt.observations) ||
145
+ receipt.observations.length < 1 ||
146
+ receipt.observations.length > 32)
147
+ throw new Error('Invalid verification receipt.');
148
+ const expectedScope = {
149
+ tenantId: resident.tenantId,
150
+ projectId: resident.projectId,
151
+ pursuitId: admission.pursuitId,
152
+ claimId: admission.claimId,
153
+ sessionId: start.sessionId,
154
+ runId: start.runId,
155
+ revision: admission.pursuitRevision,
156
+ };
157
+ if (!isDeepStrictEqual(JSON.parse(text(receipt.scope)), expectedScope) ||
158
+ receipt.runId !== start.runId ||
159
+ finish.decision?.kind !== 'complete' ||
160
+ finish.error !== null ||
161
+ finish.cleanup !== 'confirmed' ||
162
+ receipt.observations.some((item) => {
163
+ const o = object(item);
164
+ const at = count(o.observedAt);
165
+ count(o.bytes);
166
+ text(o.source);
167
+ return (!/^[a-f0-9]{64}$/.test(text(o.sha256)) ||
168
+ at < start.startedAt ||
169
+ at > finish.finishedAt);
170
+ }))
171
+ throw new Error('Verification receipt does not match this attempt.');
172
+ const policy = object(finish.verificationPolicy);
173
+ const claims = object(receipt.claims);
174
+ if (policy.version !== 1 ||
175
+ !Array.isArray(policy.claims) ||
176
+ policy.claims.length < 1 ||
177
+ policy.claims.length > 32 ||
178
+ Object.keys(claims).length !== policy.claims.length)
179
+ throw new Error('Invalid verification policy.');
180
+ const requirements = policy.claims.map(object);
181
+ const sources = new Set(requirements.map((r) => text(r.source)));
182
+ if (new Set(requirements.map((r) => text(r.id))).size !== requirements.length ||
183
+ requirements.some((r) => {
184
+ const key = text(r.id);
185
+ const value = claims[key];
186
+ return (!Object.hasOwn(claims, key) ||
187
+ !(value === null ||
188
+ typeof value === 'boolean' ||
189
+ (typeof value === 'string' && value.length <= 2000) ||
190
+ (typeof value === 'number' && Number.isSafeInteger(value))) ||
191
+ (Object.hasOwn(r, 'expected') && !isDeepStrictEqual(value, r.expected)));
192
+ }) ||
193
+ receipt.observations.length !== sources.size ||
194
+ new Set(receipt.observations.map((o) => text(object(o).source))).size !== sources.size ||
195
+ receipt.observations.some((o) => !sources.has(text(object(o).source))))
196
+ throw new Error('Incomplete verification evidence.');
197
+ verification = 'recorded';
198
+ }
199
+ return {
200
+ runId: start.runId,
201
+ ownTokens: finish?.usage?.totalTokens ?? run.tokenUsage.totalTokens,
202
+ treeTokens: tree?.treeTokens ?? null,
203
+ ownCostUsd: finish?.usage?.cost.totalCost ?? null,
204
+ unpricedOwnTokens: finish?.usage?.cost.unpricedTokens ?? null,
205
+ usageFinal: !!finish?.usage &&
206
+ finish.error === null &&
207
+ finish.cleanup === 'confirmed' &&
208
+ !!tree &&
209
+ tree.inFlightRequests === 0 &&
210
+ tree.unsettledChildren === 0 &&
211
+ !tree.poisoned &&
212
+ tree.unresolvedRequests === 0,
213
+ cleanup: (finish?.cleanup ?? 'unknown'),
214
+ verification,
215
+ };
216
+ },
217
+ };
218
+ }
219
+ const line = (value) => stripVTControlCharacters(value).replace(/[\p{Cc}\p{Cf}]/gu, ' ');
220
+ export function residentInspectionText(report) {
221
+ const { recorded, unknown } = report;
222
+ const deferred = report.attempts.filter((a) => a.receiptStatus === 'deferred');
223
+ const missing = report.attempts.filter((a) => a.receiptStatus === 'missing').length;
224
+ const invalid = report.attempts.filter((a) => a.receiptStatus === 'invalid' || a.receiptStatus === 'duplicate-run').length;
225
+ const settled = report.attempts.filter((a) => a.settlement).length;
226
+ const verified = report.attempts.filter((a) => a.settlement?.outcome === 'complete' && a.receipt?.verification === 'recorded').length;
227
+ return [
228
+ `Resident ${line(report.scope.agentKey)} · ${report.historyComplete ? 'lifetime history' : 'partial history'}`,
229
+ `Revisions ${report.fromRevision}–${report.throughRevision} of ${report.scope.throughRevision}${report.nextCursor === null ? '' : ` · next cursor ${report.nextCursor}`}`,
230
+ `${report.attempts.length} admitted · ${settled} settled · ${verified} ${verified === 1 ? 'completion' : 'completions'} with recorded verification · ${report.archivedPursuits.length} archived pursuits`,
231
+ `Recorded tokens: ${recorded.ownTokens} own · ${recorded.treeTokens} including descendants (separate totals)`,
232
+ `Known own cost: $${recorded.ownCostUsd.toFixed(6)}${unknown.ownPriceAttempts ? ' (partial)' : ''} · ${recorded.unpricedOwnTokens} unpriced own tokens · descendant prices not included`,
233
+ `Incomplete attempts: ${unknown.ownUsageAttempts} own usage · ${unknown.treeUsageAttempts} tree usage · ${unknown.ownPriceAttempts} own price`,
234
+ ...(report.unavailableRevisions.length
235
+ ? [`Unavailable history revisions: ${report.unavailableRevisions.join(', ')}`]
236
+ : []),
237
+ ...(missing || invalid || deferred.length
238
+ ? [
239
+ `Receipts: ${missing} missing · ${invalid} invalid · ${deferred.length} deferred by read allowance`,
240
+ ]
241
+ : []),
242
+ ...(deferred[0]
243
+ ? [
244
+ `Continue deferred receipts: resident inspect --cursor ${deferred[0].revision} --through-revision ${report.scope.throughRevision}`,
245
+ ]
246
+ : []),
247
+ 'Accounting only; existing limits apply per step. Verification is historical, not a current-source check.',
248
+ '',
249
+ ...report.attempts.slice(-20).map((a) => {
250
+ const state = a.settlement?.outcome ??
251
+ (report.historyComplete ? 'unsettled' : 'settlement outside this view or unresolved');
252
+ return `${a.claimId} · step ${a.step} · ${state} · ${a.receipt?.ownTokens ?? '?'} own tokens${a.receipt?.usageFinal ? '' : ' (partial/unknown)'}\n ${line(a.objective).slice(0, 180)}`;
253
+ }),
254
+ ...(report.attempts.length > 20
255
+ ? [`Showing latest 20 of ${report.attempts.length} inspected attempts; JSON includes all.`]
256
+ : []),
257
+ ].join('\n');
258
+ }
259
+ export async function inspectCliResident(resident, throughRevision, options, signal) {
260
+ const inspection = await inspectResidentConsumption(resident.agenda.activity(throughRevision), residentConsumptionResolver(resident), options, signal);
261
+ return { inspection, text: residentInspectionText(inspection) };
262
+ }
263
+ //# sourceMappingURL=inspection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspection.js","sourceRoot":"","sources":["../../../src/integrations/resident/inspection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ResidentLearningSource, ResidentLearningState } from '@namzu/sdk';
2
+ /** Resolve only declared local file dependencies; no credentials, network or model calls. */
3
+ export declare function residentLearningSources(cwd: string, learning?: ResidentLearningState): () => readonly ResidentLearningSource[];
4
+ //# sourceMappingURL=learning-sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-sources.d.ts","sourceRoot":"","sources":["../../../src/integrations/resident/learning-sources.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAM/E,6FAA6F;AAC7F,wBAAgB,uBAAuB,CACtC,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,qBAAqB,GAC9B,MAAM,SAAS,sBAAsB,EAAE,CA4EzC"}
@@ -0,0 +1,79 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { constants, closeSync, fstatSync, openSync, readSync, realpathSync, statSync, } from 'node:fs';
3
+ import { isAbsolute, relative, resolve, sep } from 'node:path';
4
+ const PREFIX = 'workspace-file:';
5
+ const MAX_BYTES = 256 * 1024;
6
+ const MAX_TOTAL_BYTES = 1024 * 1024;
7
+ /** Resolve only declared local file dependencies; no credentials, network or model calls. */
8
+ export function residentLearningSources(cwd, learning) {
9
+ const keys = [
10
+ ...new Set(learning?.skills.flatMap((skill) => skill.sources?.map((source) => source.key) ?? []) ?? []),
11
+ ];
12
+ return () => {
13
+ const observations = [];
14
+ let remaining = MAX_TOTAL_BYTES;
15
+ const root = realpathSync(cwd);
16
+ for (const key of keys) {
17
+ if (!key.startsWith(PREFIX))
18
+ continue;
19
+ const path = key.slice(PREFIX.length);
20
+ // Keys are portable, canonical, workspace-relative paths. No traversal or Windows ADS.
21
+ if (!path ||
22
+ path.includes('\\') ||
23
+ path.includes(':') ||
24
+ path.includes('\0') ||
25
+ isAbsolute(path) ||
26
+ path.split('/').some((part) => !part || part === '.' || part === '..'))
27
+ continue;
28
+ let fd;
29
+ try {
30
+ const target = resolve(root, path);
31
+ const actual = realpathSync(target);
32
+ const fromRoot = relative(root, actual);
33
+ if (!fromRoot ||
34
+ isAbsolute(fromRoot) ||
35
+ fromRoot === '..' ||
36
+ fromRoot.startsWith(`..${sep}`) ||
37
+ actual !== target)
38
+ continue;
39
+ fd = openSync(target, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0) | (constants.O_NONBLOCK ?? 0));
40
+ const before = fstatSync(fd, { bigint: true });
41
+ if (!before.isFile() || before.size > BigInt(MAX_BYTES) || before.size > BigInt(remaining))
42
+ continue;
43
+ const size = Number(before.size);
44
+ remaining -= size;
45
+ const bytes = Buffer.alloc(size + 1);
46
+ let length = 0;
47
+ while (length < bytes.length) {
48
+ const count = readSync(fd, bytes, length, bytes.length - length, length);
49
+ if (!count)
50
+ break;
51
+ length += count;
52
+ }
53
+ const after = fstatSync(fd, { bigint: true });
54
+ const current = statSync(target, { bigint: true });
55
+ if (length !== size ||
56
+ current.dev !== after.dev ||
57
+ current.ino !== after.ino ||
58
+ after.size !== before.size ||
59
+ after.mtimeNs !== before.mtimeNs ||
60
+ after.ctimeNs !== before.ctimeNs ||
61
+ realpathSync(target) !== actual)
62
+ continue;
63
+ observations.push({
64
+ key,
65
+ revision: createHash('sha256').update(bytes.subarray(0, size)).digest('hex'),
66
+ });
67
+ }
68
+ catch {
69
+ /* Missing, changed or unreadable sources remain unverified. */
70
+ }
71
+ finally {
72
+ if (fd !== undefined)
73
+ closeSync(fd);
74
+ }
75
+ }
76
+ return observations;
77
+ };
78
+ }
79
+ //# sourceMappingURL=learning-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-sources.js","sourceRoot":"","sources":["../../../src/integrations/resident/learning-sources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { SqliteResidentLearningStore } from '@namzu/sdk';
2
+ import type { CliResident } from './storage.js';
3
+ /** One installation database; SQL scope replaces a directory/index per experiment. */
4
+ export declare function residentLearningStore(resident: CliResident, readOnly?: boolean): SqliteResidentLearningStore | null;
5
+ //# sourceMappingURL=learning-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-storage.d.ts","sourceRoot":"","sources":["../../../src/integrations/resident/learning-storage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAA;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,sFAAsF;AACtF,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,WAAW,EACrB,QAAQ,UAAQ,GACd,2BAA2B,GAAG,IAAI,CAuCpC"}
@@ -0,0 +1,51 @@
1
+ import { existsSync, lstatSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { SqliteResidentLearningStore } from '@namzu/sdk';
4
+ import { ensurePrivateStateDirectory } from '../state/private-directory.js';
5
+ /** One installation database; SQL scope replaces a directory/index per experiment. */
6
+ export function residentLearningStore(resident, readOnly = false) {
7
+ const databasePath = join(resident.root, 'state', 'learning.sqlite');
8
+ const learningRoot = join(resident.root, 'learning');
9
+ const artifactsPath = join(learningRoot, 'artifacts');
10
+ if (readOnly) {
11
+ for (const directory of [join(resident.root, 'state'), learningRoot, artifactsPath]) {
12
+ if (!existsSync(directory))
13
+ continue;
14
+ const entry = lstatSync(directory);
15
+ if (!entry.isDirectory() || entry.isSymbolicLink())
16
+ throw new Error(`Learning state requires a real directory: ${directory}`);
17
+ }
18
+ if (!existsSync(databasePath))
19
+ return null;
20
+ }
21
+ else {
22
+ ensurePrivateStateDirectory(resident.root, 'state');
23
+ ensurePrivateStateDirectory(resident.root, 'learning');
24
+ ensurePrivateStateDirectory(learningRoot, 'artifacts');
25
+ }
26
+ for (const file of [
27
+ databasePath,
28
+ `${databasePath}-journal`,
29
+ `${databasePath}-wal`,
30
+ `${databasePath}-shm`,
31
+ ]) {
32
+ let entry;
33
+ try {
34
+ entry = lstatSync(file);
35
+ }
36
+ catch (error) {
37
+ if (error.code === 'ENOENT')
38
+ continue;
39
+ throw error;
40
+ }
41
+ if (!entry.isFile() || entry.isSymbolicLink() || entry.nlink !== 1)
42
+ throw new Error(`Learning database requires a private regular file: ${file}`);
43
+ }
44
+ return new SqliteResidentLearningStore({
45
+ databasePath,
46
+ artifactsPath,
47
+ scope: resident,
48
+ readOnly,
49
+ });
50
+ }
51
+ //# sourceMappingURL=learning-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-storage.js","sourceRoot":"","sources":["../../../src/integrations/resident/learning-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAA;AAG3E,sFAAsF;AACtF,MAAM,UAAU,qBAAqB,CACpC,QAAqB,EACrB,QAAQ,GAAG,KAAK;IAEhB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAA;IACpE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACpD,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IACrD,IAAI,QAAQ,EAAE,CAAC;QACd,KAAK,MAAM,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC;YACrF,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,SAAQ;YACpC,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAA;YAClC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE;gBACjD,MAAM,IAAI,KAAK,CAAC,6CAA6C,SAAS,EAAE,CAAC,CAAA;QAC3E,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO,IAAI,CAAA;IAC3C,CAAC;SAAM,CAAC;QACP,2BAA2B,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACnD,2BAA2B,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QACtD,2BAA2B,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IACvD,CAAC;IACD,KAAK,MAAM,IAAI,IAAI;QAClB,YAAY;QACZ,GAAG,YAAY,UAAU;QACzB,GAAG,YAAY,MAAM;QACrB,GAAG,YAAY,MAAM;KACrB,EAAE,CAAC;QACH,IAAI,KAAmC,CAAA;QACvC,IAAI,CAAC;YACJ,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAQ;YAChE,MAAM,KAAK,CAAA;QACZ,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,sDAAsD,IAAI,EAAE,CAAC,CAAA;IAC/E,CAAC;IACD,OAAO,IAAI,2BAA2B,CAAC;QACtC,YAAY;QACZ,aAAa;QACb,KAAK,EAAE,QAAQ;QACf,QAAQ;KACR,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The callback has finished awaiting cleanup, but cannot certify that every
3
+ * owned resource drained. A managed runner must retain its ownership record.
4
+ * Latch this error at the step boundary: cancellation may hide it at the host.
5
+ */
6
+ export declare class ResidentCleanupUnconfirmedError extends AggregateError {
7
+ constructor(errors: readonly unknown[]);
8
+ }
9
+ //# sourceMappingURL=lifecycle-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle-errors.d.ts","sourceRoot":"","sources":["../../../src/integrations/resident/lifecycle-errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,+BAAgC,SAAQ,cAAc;gBACtD,MAAM,EAAE,SAAS,OAAO,EAAE;CAYtC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The callback has finished awaiting cleanup, but cannot certify that every
3
+ * owned resource drained. A managed runner must retain its ownership record.
4
+ * Latch this error at the step boundary: cancellation may hide it at the host.
5
+ */
6
+ export class ResidentCleanupUnconfirmedError extends AggregateError {
7
+ constructor(errors) {
8
+ super(errors, [
9
+ 'Resident cleanup is unconfirmed; runner ownership must be retained.',
10
+ ...errors.map((error) => (error instanceof Error ? error.message : String(error)).slice(0, 4_000)),
11
+ ].join('\n'));
12
+ this.name = 'ResidentCleanupUnconfirmedError';
13
+ }
14
+ }
15
+ //# sourceMappingURL=lifecycle-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle-errors.js","sourceRoot":"","sources":["../../../src/integrations/resident/lifecycle-errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,+BAAgC,SAAQ,cAAc;IAClE,YAAY,MAA0B;QACrC,KAAK,CACJ,MAAM,EACN;YACC,qEAAqE;YACrE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACvB,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CACxE;SACD,CAAC,IAAI,CAAC,IAAI,CAAC,CACZ,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAA;IAC9C,CAAC;CACD"}
@@ -0,0 +1,17 @@
1
+ import type { ResidentContextualStep, ResidentHostResult } from '@namzu/sdk';
2
+ import { type RunnerRecord, publicRunner } from './runner-store.js';
3
+ import type { CliResident } from './storage.js';
4
+ export interface OwnedResidentOptions {
5
+ readonly resident: CliResident;
6
+ readonly owner: RunnerRecord;
7
+ readonly step: ResidentContextualStep;
8
+ readonly signal: AbortSignal;
9
+ readonly keepAlive: boolean;
10
+ readonly maxIdleMs: number;
11
+ /** Readiness means control and durable ownership are installed, not model availability. */
12
+ readonly ready?: (owner: ReturnType<typeof publicRunner>, signal: AbortSignal) => Promise<void>;
13
+ readonly pollIntervalMs?: number;
14
+ }
15
+ /** Keep ownership until the SDK invocation, callback cleanup and control server drain. */
16
+ export declare function runOwnedResident(options: OwnedResidentOptions): Promise<ResidentHostResult>;
17
+ //# sourceMappingURL=owned-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-runner.d.ts","sourceRoot":"","sources":["../../../src/integrations/resident/owned-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAI5E,OAAO,EACN,KAAK,YAAY,EAGjB,YAAY,EAEZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAA;IAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;IAC5B,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAA;IACrC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,2FAA2F;IAC3F,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/F,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,0FAA0F;AAC1F,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA+EjG"}
@@ -0,0 +1,91 @@
1
+ import { runResidentForeground } from './foreground.js';
2
+ import { ResidentCleanupUnconfirmedError } from './lifecycle-errors.js';
3
+ import { createRunnerControlServer } from './runner-control.js';
4
+ import { attachRunning, finishRunner, publicRunner, readRunner, } from './runner-store.js';
5
+ /** Keep ownership until the SDK invocation, callback cleanup and control server drain. */
6
+ export async function runOwnedResident(options) {
7
+ const { resident } = options;
8
+ let owner = options.owner;
9
+ let phase = 'starting';
10
+ let stepsStarted = 0;
11
+ const controller = new AbortController();
12
+ const signal = AbortSignal.any([options.signal, controller.signal]);
13
+ const abort = () => {
14
+ phase = 'stopping';
15
+ controller.abort(new Error('Resident runner stop requested.'));
16
+ };
17
+ const checkControl = async () => {
18
+ const current = readRunner(resident);
19
+ if (current?.instanceId !== owner.instanceId || current.phase !== 'running')
20
+ throw new Error('Resident runner ownership changed; this invocation is fenced.');
21
+ };
22
+ let server;
23
+ let outcome = 'startup_failed';
24
+ let cleanupConfirmed = true;
25
+ try {
26
+ signal.throwIfAborted();
27
+ const state = await resident.agenda.read();
28
+ if (!state || state.paused || (state.pauseGeneration ?? 0) !== owner.pauseGeneration)
29
+ throw new Error('Resident admission changed before runner startup. Resume and start a new invocation.');
30
+ if (state.pursuits.some((p) => p.state.phase === 'running'))
31
+ throw new Error('Inspect and reconcile unresolved work before starting a runner.');
32
+ server = await createRunnerControlServer({
33
+ instanceId: owner.instanceId,
34
+ token: owner.token,
35
+ getStatus: () => ({
36
+ pid: process.pid,
37
+ phase: signal.aborted ? 'stopping' : phase,
38
+ stepsStarted,
39
+ }),
40
+ onStop: abort,
41
+ });
42
+ owner = attachRunning(resident, owner, { pid: process.pid, port: server.port });
43
+ await checkControl();
44
+ await options.ready?.(publicRunner(owner), signal);
45
+ signal.throwIfAborted();
46
+ phase = 'idle';
47
+ const result = await runResidentForeground({
48
+ agenda: resident.agenda,
49
+ step: async (...args) => {
50
+ phase = 'working';
51
+ stepsStarted++;
52
+ try {
53
+ return await options.step(...args);
54
+ }
55
+ catch (error) {
56
+ // The SDK host turns aborted callbacks into a cancelled result.
57
+ // Latch failed drainage before that conversion can hide it.
58
+ if (error instanceof ResidentCleanupUnconfirmedError)
59
+ cleanupConfirmed = false;
60
+ throw error;
61
+ }
62
+ finally {
63
+ phase = signal.aborted ? 'stopping' : 'idle';
64
+ }
65
+ },
66
+ signal,
67
+ maxSteps: owner.maxSteps,
68
+ maxIdleMs: options.maxIdleMs,
69
+ keepAlive: options.keepAlive,
70
+ expectedPauseGeneration: owner.pauseGeneration,
71
+ checkControl,
72
+ ...(options.pollIntervalMs ? { pollIntervalMs: options.pollIntervalMs } : {}),
73
+ });
74
+ outcome = result.status;
75
+ return result;
76
+ }
77
+ catch (error) {
78
+ if (error instanceof ResidentCleanupUnconfirmedError)
79
+ cleanupConfirmed = false;
80
+ outcome = signal.aborted ? 'cancelled' : 'failed';
81
+ throw error;
82
+ }
83
+ finally {
84
+ phase = 'stopping';
85
+ // A stopped receipt is a drainage acknowledgement, never a PID-liveness guess.
86
+ await server?.close();
87
+ if (cleanupConfirmed)
88
+ finishRunner(resident, owner, outcome);
89
+ }
90
+ }
91
+ //# sourceMappingURL=owned-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-runner.js","sourceRoot":"","sources":["../../../src/integrations/resident/owned-runner.ts"],"names":[],"mappings":"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"}