@namzu/sdk 61.4.0 → 62.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 (302) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/agents/QueryAgent.d.ts.map +1 -1
  3. package/dist/agents/QueryAgent.js +2 -0
  4. package/dist/agents/QueryAgent.js.map +1 -1
  5. package/dist/bridge/acp/permission.d.ts +8 -0
  6. package/dist/bridge/acp/permission.d.ts.map +1 -1
  7. package/dist/bridge/acp/permission.js.map +1 -1
  8. package/dist/bridge/acp/server.d.ts.map +1 -1
  9. package/dist/bridge/acp/server.js +8 -1
  10. package/dist/bridge/acp/server.js.map +1 -1
  11. package/dist/constants/tools/index.d.ts +2 -0
  12. package/dist/constants/tools/index.d.ts.map +1 -1
  13. package/dist/constants/tools/index.js +23 -0
  14. package/dist/constants/tools/index.js.map +1 -1
  15. package/dist/eval/harness-protection.js +1 -1
  16. package/dist/eval/harness-protection.js.map +1 -1
  17. package/dist/learning/cycle.d.ts +5 -3
  18. package/dist/learning/cycle.d.ts.map +1 -1
  19. package/dist/learning/cycle.js +11 -13
  20. package/dist/learning/cycle.js.map +1 -1
  21. package/dist/learning/guidance.d.ts +74 -0
  22. package/dist/learning/guidance.d.ts.map +1 -0
  23. package/dist/learning/guidance.js +259 -0
  24. package/dist/learning/guidance.js.map +1 -0
  25. package/dist/learning/skill.d.ts +2 -2
  26. package/dist/learning/skill.d.ts.map +1 -1
  27. package/dist/learning/skill.js +6 -6
  28. package/dist/learning/skill.js.map +1 -1
  29. package/dist/learning/store.d.ts.map +1 -1
  30. package/dist/learning/store.js +6 -6
  31. package/dist/learning/store.js.map +1 -1
  32. package/dist/pals/communication/ingress-schema.d.ts +8 -8
  33. package/dist/pals/communication/schema.d.ts +2 -2
  34. package/dist/peers/client.d.ts +2 -3
  35. package/dist/peers/client.d.ts.map +1 -1
  36. package/dist/peers/client.js +2 -3
  37. package/dist/peers/client.js.map +1 -1
  38. package/dist/peers/endpoint.d.ts +1 -2
  39. package/dist/peers/endpoint.d.ts.map +1 -1
  40. package/dist/peers/endpoint.js +1 -2
  41. package/dist/peers/endpoint.js.map +1 -1
  42. package/dist/peers/protocol.d.ts.map +1 -1
  43. package/dist/peers/protocol.js +1 -0
  44. package/dist/peers/protocol.js.map +1 -1
  45. package/dist/prompt/coding-agent-doctrine.d.ts +4 -4
  46. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  47. package/dist/prompt/coding-agent-doctrine.js +5 -3
  48. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  49. package/dist/prompt/index.d.ts +0 -4
  50. package/dist/prompt/index.d.ts.map +1 -1
  51. package/dist/prompt/index.js +0 -2
  52. package/dist/prompt/index.js.map +1 -1
  53. package/dist/provider/fallback.d.ts.map +1 -1
  54. package/dist/provider/fallback.js +3 -0
  55. package/dist/provider/fallback.js.map +1 -1
  56. package/dist/provider/idle-timeout.d.ts.map +1 -1
  57. package/dist/provider/idle-timeout.js +5 -0
  58. package/dist/provider/idle-timeout.js.map +1 -1
  59. package/dist/provider/model-window-suffix.d.ts.map +1 -1
  60. package/dist/provider/model-window-suffix.js +1 -0
  61. package/dist/provider/model-window-suffix.js.map +1 -1
  62. package/dist/provider/retry.d.ts.map +1 -1
  63. package/dist/provider/retry.js +5 -0
  64. package/dist/provider/retry.js.map +1 -1
  65. package/dist/provider/step-stopped.d.ts +19 -0
  66. package/dist/provider/step-stopped.d.ts.map +1 -0
  67. package/dist/provider/step-stopped.js +25 -0
  68. package/dist/provider/step-stopped.js.map +1 -0
  69. package/dist/provider/token-budget.d.ts.map +1 -1
  70. package/dist/provider/token-budget.js +6 -1
  71. package/dist/provider/token-budget.js.map +1 -1
  72. package/dist/public-runtime.d.ts +3 -14
  73. package/dist/public-runtime.d.ts.map +1 -1
  74. package/dist/public-runtime.js +3 -14
  75. package/dist/public-runtime.js.map +1 -1
  76. package/dist/public-tools.d.ts +0 -2
  77. package/dist/public-tools.d.ts.map +1 -1
  78. package/dist/public-tools.js +0 -2
  79. package/dist/public-tools.js.map +1 -1
  80. package/dist/public-types.d.ts +3 -21
  81. package/dist/public-types.d.ts.map +1 -1
  82. package/dist/runtime/query/iteration/index.d.ts +17 -0
  83. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  84. package/dist/runtime/query/iteration/index.js +168 -5
  85. package/dist/runtime/query/iteration/index.js.map +1 -1
  86. package/dist/runtime/query/iteration/phases/per-call-review.d.ts.map +1 -1
  87. package/dist/runtime/query/iteration/phases/per-call-review.js +4 -5
  88. package/dist/runtime/query/iteration/phases/per-call-review.js.map +1 -1
  89. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  90. package/dist/runtime/query/iteration/phases/tool-review.js +6 -3
  91. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  92. package/dist/runtime/query/iteration/stream-turn.d.ts +9 -1
  93. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  94. package/dist/runtime/query/iteration/stream-turn.js +48 -2
  95. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  96. package/dist/runtime/query/resume-pending.d.ts.map +1 -1
  97. package/dist/runtime/query/resume-pending.js +7 -4
  98. package/dist/runtime/query/resume-pending.js.map +1 -1
  99. package/dist/runtime/query/review-policy.d.ts +40 -8
  100. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  101. package/dist/runtime/query/review-policy.js +139 -24
  102. package/dist/runtime/query/review-policy.js.map +1 -1
  103. package/dist/runtime/query/turn/completion-audit.d.ts +32 -0
  104. package/dist/runtime/query/turn/completion-audit.d.ts.map +1 -0
  105. package/dist/runtime/query/turn/completion-audit.js +56 -0
  106. package/dist/runtime/query/turn/completion-audit.js.map +1 -0
  107. package/dist/runtime/query/turn/stall-monitor.d.ts +78 -0
  108. package/dist/runtime/query/turn/stall-monitor.d.ts.map +1 -0
  109. package/dist/runtime/query/turn/stall-monitor.js +101 -0
  110. package/dist/runtime/query/turn/stall-monitor.js.map +1 -0
  111. package/dist/session/paths.d.ts +1 -2
  112. package/dist/session/paths.d.ts.map +1 -1
  113. package/dist/session/paths.js +1 -4
  114. package/dist/session/paths.js.map +1 -1
  115. package/dist/tools/builtins/bash.d.ts +2 -1
  116. package/dist/tools/builtins/bash.d.ts.map +1 -1
  117. package/dist/tools/builtins/bash.js +5 -2
  118. package/dist/tools/builtins/bash.js.map +1 -1
  119. package/dist/tools/builtins/content-fingerprint.d.ts +13 -0
  120. package/dist/tools/builtins/content-fingerprint.d.ts.map +1 -1
  121. package/dist/tools/builtins/content-fingerprint.js +25 -0
  122. package/dist/tools/builtins/content-fingerprint.js.map +1 -1
  123. package/dist/tools/builtins/edit.d.ts.map +1 -1
  124. package/dist/tools/builtins/edit.js +7 -2
  125. package/dist/tools/builtins/edit.js.map +1 -1
  126. package/dist/tools/builtins/shell-read-credit.d.ts +15 -0
  127. package/dist/tools/builtins/shell-read-credit.d.ts.map +1 -0
  128. package/dist/tools/builtins/shell-read-credit.js +161 -0
  129. package/dist/tools/builtins/shell-read-credit.js.map +1 -0
  130. package/dist/tools/paths.d.ts +15 -2
  131. package/dist/tools/paths.d.ts.map +1 -1
  132. package/dist/tools/paths.js +17 -2
  133. package/dist/tools/paths.js.map +1 -1
  134. package/dist/turn/evidence-recall.d.ts +1 -1
  135. package/dist/turn/evidence-recall.d.ts.map +1 -1
  136. package/dist/turn/evidence-recall.js +5 -14
  137. package/dist/turn/evidence-recall.js.map +1 -1
  138. package/dist/types/acp/index.d.ts +6 -0
  139. package/dist/types/acp/index.d.ts.map +1 -1
  140. package/dist/types/agent/base.d.ts +4 -0
  141. package/dist/types/agent/base.d.ts.map +1 -1
  142. package/dist/types/hitl/index.d.ts +8 -0
  143. package/dist/types/hitl/index.d.ts.map +1 -1
  144. package/dist/types/hitl/index.js.map +1 -1
  145. package/dist/types/ids/index.d.ts +1 -1
  146. package/dist/types/message/index.d.ts +1 -1
  147. package/dist/types/message/index.d.ts.map +1 -1
  148. package/dist/types/message/index.js +1 -0
  149. package/dist/types/message/index.js.map +1 -1
  150. package/dist/types/provider/interface.d.ts +12 -0
  151. package/dist/types/provider/interface.d.ts.map +1 -1
  152. package/dist/types/session/config.d.ts +25 -0
  153. package/dist/types/session/config.d.ts.map +1 -1
  154. package/dist/types/session/records.d.ts.map +1 -1
  155. package/dist/types/session/records.js +2 -0
  156. package/dist/types/session/records.js.map +1 -1
  157. package/dist/types/session/turn.d.ts +1 -1
  158. package/dist/types/session/turn.d.ts.map +1 -1
  159. package/dist/types/session/turn.js.map +1 -1
  160. package/package.json +1 -1
  161. package/src/agents/QueryAgent.ts +2 -0
  162. package/src/bridge/acp/permission.ts +8 -0
  163. package/src/bridge/acp/server.ts +7 -1
  164. package/src/constants/tools/index.ts +27 -0
  165. package/src/eval/harness-protection.ts +1 -1
  166. package/src/learning/cycle.ts +15 -16
  167. package/src/learning/guidance.ts +339 -0
  168. package/src/learning/skill.ts +7 -7
  169. package/src/learning/store.ts +5 -6
  170. package/src/peers/client.ts +2 -3
  171. package/src/peers/endpoint.ts +1 -2
  172. package/src/peers/protocol.ts +1 -0
  173. package/src/prompt/coding-agent-doctrine.ts +5 -3
  174. package/src/prompt/index.ts +0 -4
  175. package/src/provider/fallback.ts +7 -0
  176. package/src/provider/idle-timeout.ts +8 -0
  177. package/src/provider/model-window-suffix.ts +1 -0
  178. package/src/provider/retry.ts +8 -0
  179. package/src/provider/step-stopped.ts +27 -0
  180. package/src/provider/token-budget.ts +6 -1
  181. package/src/public-runtime.ts +6 -28
  182. package/src/public-tools.ts +0 -3
  183. package/src/public-types.ts +5 -137
  184. package/src/runtime/query/iteration/index.ts +207 -5
  185. package/src/runtime/query/iteration/phases/per-call-review.ts +7 -5
  186. package/src/runtime/query/iteration/phases/tool-review.ts +5 -3
  187. package/src/runtime/query/iteration/stream-turn.ts +51 -1
  188. package/src/runtime/query/resume-pending.ts +11 -4
  189. package/src/runtime/query/review-policy.ts +157 -24
  190. package/src/runtime/query/turn/completion-audit.ts +71 -0
  191. package/src/runtime/query/turn/stall-monitor.ts +158 -0
  192. package/src/session/paths.ts +2 -6
  193. package/src/tools/builtins/bash.ts +6 -2
  194. package/src/tools/builtins/content-fingerprint.ts +25 -0
  195. package/src/tools/builtins/edit.ts +11 -2
  196. package/src/tools/builtins/shell-read-credit.ts +159 -0
  197. package/src/tools/paths.ts +18 -2
  198. package/src/turn/evidence-recall.ts +7 -15
  199. package/src/types/acp/index.ts +6 -0
  200. package/src/types/agent/base.ts +4 -0
  201. package/src/types/hitl/index.ts +8 -0
  202. package/src/types/ids/index.ts +1 -1
  203. package/src/types/message/index.ts +1 -0
  204. package/src/types/provider/interface.ts +13 -0
  205. package/src/types/session/config.ts +27 -0
  206. package/src/types/session/records.ts +2 -0
  207. package/src/types/session/turn.ts +2 -1
  208. package/dist/learning/deprecated.d.ts +0 -86
  209. package/dist/learning/deprecated.d.ts.map +0 -1
  210. package/dist/learning/deprecated.js +0 -22
  211. package/dist/learning/deprecated.js.map +0 -1
  212. package/dist/manager/resident/activity.d.ts +0 -74
  213. package/dist/manager/resident/activity.d.ts.map +0 -1
  214. package/dist/manager/resident/activity.js +0 -125
  215. package/dist/manager/resident/activity.js.map +0 -1
  216. package/dist/manager/resident/agenda.d.ts +0 -167
  217. package/dist/manager/resident/agenda.d.ts.map +0 -1
  218. package/dist/manager/resident/agenda.js +0 -588
  219. package/dist/manager/resident/agenda.js.map +0 -1
  220. package/dist/manager/resident/consumption.d.ts +0 -98
  221. package/dist/manager/resident/consumption.d.ts.map +0 -1
  222. package/dist/manager/resident/consumption.js +0 -237
  223. package/dist/manager/resident/consumption.js.map +0 -1
  224. package/dist/manager/resident/delivery-window.d.ts +0 -28
  225. package/dist/manager/resident/delivery-window.d.ts.map +0 -1
  226. package/dist/manager/resident/delivery-window.js +0 -80
  227. package/dist/manager/resident/delivery-window.js.map +0 -1
  228. package/dist/manager/resident/evidence-recall.d.ts +0 -30
  229. package/dist/manager/resident/evidence-recall.d.ts.map +0 -1
  230. package/dist/manager/resident/evidence-recall.js +0 -297
  231. package/dist/manager/resident/evidence-recall.js.map +0 -1
  232. package/dist/manager/resident/history-disk.d.ts +0 -10
  233. package/dist/manager/resident/history-disk.d.ts.map +0 -1
  234. package/dist/manager/resident/history-disk.js +0 -50
  235. package/dist/manager/resident/history-disk.js.map +0 -1
  236. package/dist/manager/resident/history.d.ts +0 -115
  237. package/dist/manager/resident/history.d.ts.map +0 -1
  238. package/dist/manager/resident/history.js +0 -203
  239. package/dist/manager/resident/history.js.map +0 -1
  240. package/dist/manager/resident/host.d.ts +0 -112
  241. package/dist/manager/resident/host.d.ts.map +0 -1
  242. package/dist/manager/resident/host.js +0 -254
  243. package/dist/manager/resident/host.js.map +0 -1
  244. package/dist/manager/resident/initiative.d.ts +0 -86
  245. package/dist/manager/resident/initiative.d.ts.map +0 -1
  246. package/dist/manager/resident/initiative.js +0 -131
  247. package/dist/manager/resident/initiative.js.map +0 -1
  248. package/dist/manager/resident/loop.d.ts +0 -49
  249. package/dist/manager/resident/loop.d.ts.map +0 -1
  250. package/dist/manager/resident/loop.js +0 -75
  251. package/dist/manager/resident/loop.js.map +0 -1
  252. package/dist/manager/resident/outbox.d.ts +0 -124
  253. package/dist/manager/resident/outbox.d.ts.map +0 -1
  254. package/dist/manager/resident/outbox.js +0 -216
  255. package/dist/manager/resident/outbox.js.map +0 -1
  256. package/dist/manager/resident/proposal.d.ts +0 -65
  257. package/dist/manager/resident/proposal.d.ts.map +0 -1
  258. package/dist/manager/resident/proposal.js +0 -77
  259. package/dist/manager/resident/proposal.js.map +0 -1
  260. package/dist/manager/resident/store.d.ts +0 -108
  261. package/dist/manager/resident/store.d.ts.map +0 -1
  262. package/dist/manager/resident/store.js +0 -205
  263. package/dist/manager/resident/store.js.map +0 -1
  264. package/dist/manager/resident/tool-evidence.d.ts +0 -112
  265. package/dist/manager/resident/tool-evidence.d.ts.map +0 -1
  266. package/dist/manager/resident/tool-evidence.js +0 -289
  267. package/dist/manager/resident/tool-evidence.js.map +0 -1
  268. package/dist/prompt/resident-learning.d.ts +0 -29
  269. package/dist/prompt/resident-learning.d.ts.map +0 -1
  270. package/dist/prompt/resident-learning.js +0 -126
  271. package/dist/prompt/resident-learning.js.map +0 -1
  272. package/dist/prompt/resident-step.d.ts +0 -42
  273. package/dist/prompt/resident-step.d.ts.map +0 -1
  274. package/dist/prompt/resident-step.js +0 -137
  275. package/dist/prompt/resident-step.js.map +0 -1
  276. package/dist/tools/resident-history.d.ts +0 -12
  277. package/dist/tools/resident-history.d.ts.map +0 -1
  278. package/dist/tools/resident-history.js +0 -82
  279. package/dist/tools/resident-history.js.map +0 -1
  280. package/dist/tools/resident-tool-evidence.d.ts +0 -9
  281. package/dist/tools/resident-tool-evidence.d.ts.map +0 -1
  282. package/dist/tools/resident-tool-evidence.js +0 -61
  283. package/dist/tools/resident-tool-evidence.js.map +0 -1
  284. package/src/learning/deprecated.ts +0 -124
  285. package/src/manager/resident/activity.ts +0 -211
  286. package/src/manager/resident/agenda.ts +0 -937
  287. package/src/manager/resident/consumption.ts +0 -335
  288. package/src/manager/resident/delivery-window.ts +0 -99
  289. package/src/manager/resident/evidence-recall.ts +0 -369
  290. package/src/manager/resident/history-disk.ts +0 -63
  291. package/src/manager/resident/history.ts +0 -348
  292. package/src/manager/resident/host.ts +0 -390
  293. package/src/manager/resident/initiative.ts +0 -231
  294. package/src/manager/resident/loop.ts +0 -119
  295. package/src/manager/resident/outbox.ts +0 -341
  296. package/src/manager/resident/proposal.ts +0 -119
  297. package/src/manager/resident/store.ts +0 -279
  298. package/src/manager/resident/tool-evidence.ts +0 -455
  299. package/src/prompt/resident-learning.ts +0 -152
  300. package/src/prompt/resident-step.ts +0 -182
  301. package/src/tools/resident-history.ts +0 -88
  302. package/src/tools/resident-tool-evidence.ts +0 -72
@@ -1,279 +0,0 @@
1
- import { createHash, randomUUID } from 'node:crypto'
2
- import { join } from 'node:path'
3
- import { z } from 'zod'
4
- import {
5
- DiskRevisionRecordStore,
6
- revisionFileSegment,
7
- } from '../../store/kv/revision-record-store.js'
8
- import { defineSchema } from '../../store/schema.js'
9
- import type { TenantId } from '../../types/ids/index.js'
10
- import { asTenantId } from '../../utils/id.js'
11
-
12
- const text = z.string().trim().min(1).max(8_000)
13
- const time = z.number().int().nonnegative().safe()
14
- const MAX_WAKE_EVIDENCE_CHARS = 16_000
15
- const wakeEvidence = z
16
- .array(z.object({ reason: text, receivedAt: time }).readonly())
17
- .min(1)
18
- .max(16, 'Resident has 16 pending wake inputs; process them before adding more.')
19
- .refine(
20
- (entries) =>
21
- entries.reduce((total, entry) => total + entry.reason.length, 0) <= MAX_WAKE_EVIDENCE_CHARS,
22
- 'Resident wake evidence exceeds 16000 characters; process pending evidence before adding more.',
23
- )
24
- .readonly()
25
- export const residentDecisionSchema = z.discriminatedUnion('kind', [
26
- z.object({ kind: z.literal('wait'), summary: text, wakeAt: time.nullable() }),
27
- z.object({ kind: z.literal('complete'), summary: text }),
28
- z.object({ kind: z.literal('blocked'), summary: text }),
29
- ])
30
-
31
- /**
32
- * @experimental One bounded step's durable disposition; silence is not completion.
33
- *
34
- * @deprecated Residents are deprecated and removed in the next major release. Learning (`runLearningCycle` and the other `Learning*` names) keeps working, but `runLearningCycle` still takes a resident agenda until learning gets its own activation target in the next major release; for long-running work use scheduled tasks (`LocalTaskScheduler`), session goals and background agents.
35
- */
36
- export type ResidentDecision = z.infer<typeof residentDecisionSchema>
37
-
38
- export const residentStateSchema = z
39
- .object({
40
- tenantId: z.string().uuid(),
41
- agentKey: z.string().min(1).max(200),
42
- pursuitId: z.string().uuid().optional(),
43
- identity: text,
44
- objective: text,
45
- revision: z.number().int().positive().safe(),
46
- stepsAdmitted: time,
47
- phase: z.enum(['waiting', 'running', 'complete', 'blocked']),
48
- wakeAt: time.nullable(),
49
- reason: text,
50
- /** Accepted wake inputs, in commit order, retained until this step settles. */
51
- wakeEvidence: wakeEvidence.optional(),
52
- summary: text.nullable(),
53
- claimId: z.string().uuid().nullable(),
54
- })
55
- .superRefine((state, context) => {
56
- if ((state.phase === 'running') !== (state.claimId !== null)) {
57
- context.addIssue({
58
- code: z.ZodIssueCode.custom,
59
- message: 'Running state requires a claim.',
60
- })
61
- }
62
- if (state.phase !== 'waiting' && state.wakeAt !== null) {
63
- context.addIssue({
64
- code: z.ZodIssueCode.custom,
65
- message: 'Only waiting state may have a wake time.',
66
- })
67
- }
68
- if (state.wakeEvidence && state.phase !== 'waiting' && state.phase !== 'running') {
69
- context.addIssue({
70
- code: z.ZodIssueCode.custom,
71
- message: 'Only waiting or unresolved running work may retain wake evidence.',
72
- })
73
- }
74
- })
75
-
76
- /**
77
- * @experimental Persisted identity and one pursuit, independent of a conversation.
78
- *
79
- * @deprecated Residents are deprecated and removed in the next major release. Learning (`runLearningCycle` and the other `Learning*` names) keeps working, but `runLearningCycle` still takes a resident agenda until learning gets its own activation target in the next major release; for long-running work use scheduled tasks (`LocalTaskScheduler`), session goals and background agents.
80
- */
81
- export type ResidentState = Readonly<z.infer<typeof residentStateSchema>>
82
-
83
- /** Bounded addressing for local resident state. Stored scope is still validated. */
84
- export function residentKeySegment(key: string): string {
85
- const encoded = revisionFileSegment(key)
86
- return encoded.length <= 255
87
- ? encoded
88
- : `~sha256-${createHash('sha256').update(encoded).digest('hex')}`
89
- }
90
-
91
- /**
92
- * @experimental Minimal atomic contract needed to execute an existing pursuit.
93
- *
94
- * @deprecated Residents are deprecated and removed in the next major release. Learning (`runLearningCycle` and the other `Learning*` names) keeps working, but `runLearningCycle` still takes a resident agenda until learning gets its own activation target in the next major release; for long-running work use scheduled tasks (`LocalTaskScheduler`), session goals and background agents.
95
- */
96
- export type ResidentExecutionStore = Pick<ResidentStore, 'read' | 'claim' | 'settle'>
97
-
98
- /**
99
- * @experimental Backends must atomically compare revisions and publish admission before work.
100
- *
101
- * @deprecated Residents are deprecated and removed in the next major release. Learning (`runLearningCycle` and the other `Learning*` names) keeps working, but `runLearningCycle` still takes a resident agenda until learning gets its own activation target in the next major release; for long-running work use scheduled tasks (`LocalTaskScheduler`), session goals and background agents.
102
- */
103
- export interface ResidentStore {
104
- read(): Promise<ResidentState | null>
105
- create(identity: string, objective: string): Promise<ResidentState>
106
- claim(expected: ResidentState, now: number): Promise<ResidentState>
107
- settle(expected: ResidentState, decision: ResidentDecision, now: number): Promise<ResidentState>
108
- wake(expected: ResidentState, reason: string, now: number): Promise<ResidentState>
109
- }
110
-
111
- /**
112
- * A competing owner advanced this resident's immutable revision.
113
- *
114
- * @deprecated Residents are deprecated and removed in the next major release. Learning (`runLearningCycle` and the other `Learning*` names) keeps working, but `runLearningCycle` still takes a resident agenda until learning gets its own activation target in the next major release; for long-running work use scheduled tasks (`LocalTaskScheduler`), session goals and background agents.
115
- */
116
- export class ResidentConflictError extends Error {
117
- constructor() {
118
- super('Resident state changed; read the current state before retrying.')
119
- this.name = 'ResidentConflictError'
120
- }
121
- }
122
-
123
- /**
124
- * @experimental Local-filesystem state for one tenant/agent key and one pursuit.
125
- * A running claim never expires automatically: a crashed step may have effects.
126
- * Uses exclusive immutable revision publication, not a read/rename lock.
127
- *
128
- * @deprecated Residents are deprecated and removed in the next major release. Learning (`runLearningCycle` and the other `Learning*` names) keeps working, but `runLearningCycle` still takes a resident agenda until learning gets its own activation target in the next major release; for long-running work use scheduled tasks (`LocalTaskScheduler`), session goals and background agents.
129
- */
130
- export class DiskResidentStore implements ResidentStore {
131
- private readonly records = new DiskRevisionRecordStore<ResidentState>(
132
- defineSchema({ kind: 'resident', current: 2, migrations: { 1: (record) => record } }),
133
- 'resident store',
134
- (record) => record.revision,
135
- )
136
- private readonly location
137
- private readonly tenantId: TenantId
138
- private readonly agentKey: string
139
-
140
- constructor(root: string, scope: { tenantId: TenantId; agentKey: string }) {
141
- this.tenantId = asTenantId(scope.tenantId)
142
- this.agentKey = z.string().min(1).max(200).parse(scope.agentKey)
143
- const directory = join(root, this.tenantId, residentKeySegment(this.agentKey))
144
- this.location = {
145
- legacyPath: join(directory, 'state.json'),
146
- revisionsDir: join(directory, 'revisions'),
147
- publishLegacyProjection: false,
148
- }
149
- }
150
-
151
- private checked(record: ResidentState): ResidentState {
152
- const state = residentStateSchema.parse(record)
153
- if (
154
- state.pursuitId !== undefined ||
155
- state.tenantId !== this.tenantId ||
156
- state.agentKey !== this.agentKey
157
- ) {
158
- throw new Error('Resident record does not match the bound tenant and agent.')
159
- }
160
- return Object.freeze(state)
161
- }
162
-
163
- async read(): Promise<ResidentState | null> {
164
- const state = await this.records.read(this.location)
165
- return state === null ? null : this.checked(state)
166
- }
167
-
168
- async create(identity: string, objective: string): Promise<ResidentState> {
169
- const initial = this.checked({
170
- tenantId: this.tenantId,
171
- agentKey: this.agentKey,
172
- identity,
173
- objective,
174
- revision: 1,
175
- stepsAdmitted: 0,
176
- phase: 'waiting',
177
- wakeAt: 0,
178
- reason: 'Initial pursuit',
179
- summary: null,
180
- claimId: null,
181
- })
182
- return this.records.transact(this.location, (current) => {
183
- if (current !== null) throw new ResidentConflictError()
184
- return { record: initial, result: initial }
185
- })
186
- }
187
-
188
- private async change(
189
- expected: ResidentState,
190
- mutate: (current: ResidentState) => ResidentState,
191
- ): Promise<ResidentState> {
192
- this.checked(expected)
193
- return this.records.transact(this.location, (record) => {
194
- if (record === null) throw new ResidentConflictError()
195
- const current = this.checked(record)
196
- if (current.revision !== expected.revision || current.claimId !== expected.claimId) {
197
- throw new ResidentConflictError()
198
- }
199
- const next = this.checked({
200
- ...mutate(current),
201
- revision: current.revision + 1,
202
- })
203
- return { record: next, result: next }
204
- })
205
- }
206
-
207
- /** Persist admission before invoking a model, tool or developer callback. */
208
- async claim(expected: ResidentState, now: number): Promise<ResidentState> {
209
- return this.change(expected, (state) => claimResidentState(state, now))
210
- }
211
-
212
- /** Only the exact admitted revision may settle; late owners cannot overwrite recovery. */
213
- async settle(
214
- expected: ResidentState,
215
- decision: ResidentDecision,
216
- now: number,
217
- ): Promise<ResidentState> {
218
- return this.change(expected, (state) => settleResidentState(state, decision, now))
219
- }
220
-
221
- /** Host-supplied new evidence can wake a waiting pursuit; terminal work stays terminal. */
222
- async wake(expected: ResidentState, reason: string, now: number): Promise<ResidentState> {
223
- return this.change(expected, (state) => wakeResidentState(state, reason, now))
224
- }
225
- }
226
-
227
- /** Internal transitions shared by single-pursuit and whole-agent admission. */
228
- export function claimResidentState(state: ResidentState, now: number): ResidentState {
229
- time.parse(now)
230
- if (state.phase !== 'waiting' || state.wakeAt === null || state.wakeAt > now)
231
- throw new Error('Resident is not due.')
232
- return {
233
- ...state,
234
- phase: 'running',
235
- wakeAt: null,
236
- claimId: randomUUID(),
237
- stepsAdmitted: state.stepsAdmitted + 1,
238
- }
239
- }
240
-
241
- export function settleResidentState(
242
- state: ResidentState,
243
- decision: ResidentDecision,
244
- now: number,
245
- ): ResidentState {
246
- time.parse(now)
247
- const outcome = residentDecisionSchema.parse(decision)
248
- if (outcome.kind === 'wait' && outcome.wakeAt !== null && outcome.wakeAt <= now)
249
- throw new Error('A scheduled continuation must be in the future.')
250
- if (state.phase !== 'running') throw new Error('Resident has no admitted step to settle.')
251
- // Admission alone is not acknowledgment: an interrupted step retains every
252
- // input. Only successful exact-claim settlement consumes the captured batch.
253
- const { wakeEvidence: _consumed, ...settled } = state
254
- return {
255
- ...settled,
256
- phase: outcome.kind === 'wait' ? 'waiting' : outcome.kind,
257
- wakeAt: outcome.kind === 'wait' ? outcome.wakeAt : null,
258
- summary: outcome.summary,
259
- reason: 'Scheduled continuation',
260
- claimId: null,
261
- }
262
- }
263
-
264
- export function wakeResidentState(
265
- state: ResidentState,
266
- reason: string,
267
- now: number,
268
- ): ResidentState {
269
- time.parse(now)
270
- const evidence = text.parse(reason)
271
- if (state.phase !== 'waiting') throw new Error('Only a waiting resident can be woken.')
272
- // Never evict an accepted input to admit another. Backpressure leaves both
273
- // the durable state and its revision untouched, so the sender can retry later.
274
- const pending = wakeEvidence.parse([
275
- ...(state.wakeEvidence ?? []),
276
- { reason: evidence, receivedAt: now },
277
- ])
278
- return { ...state, wakeAt: now, reason: evidence, wakeEvidence: pending }
279
- }