@astrosheep/keiyaku 4.5.11 → 4.5.13

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 (272) hide show
  1. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-workflow/SKILL.md +135 -377
  2. package/build/integrations/pi/keiyaku.ts +11 -116
  3. package/build/src/akuma/akuma-errors.d.ts +1 -0
  4. package/build/src/akuma/akuma-errors.js +1 -0
  5. package/build/src/akuma/akuma-handle.d.ts +1 -0
  6. package/build/src/akuma/akuma-handle.js +6 -7
  7. package/build/src/akuma/akuma-product.d.ts +6 -8
  8. package/build/src/akuma/akuma-product.js +141 -57
  9. package/build/src/akuma/akuma.d.ts +5 -7
  10. package/build/src/akuma/akuma.js +1 -22
  11. package/build/src/akuma/archetype.d.ts +6 -5
  12. package/build/src/akuma/archetype.js +137 -38
  13. package/build/src/akuma/body.d.ts +5 -5
  14. package/build/src/akuma/body.js +223 -63
  15. package/build/src/akuma/call-input.d.ts +4 -0
  16. package/build/src/akuma/call-input.js +21 -0
  17. package/build/src/akuma/call-request.d.ts +5 -8
  18. package/build/src/akuma/call-request.js +28 -73
  19. package/build/src/akuma/fleet-execution.d.ts +26 -0
  20. package/build/src/akuma/fleet-execution.js +109 -0
  21. package/build/src/{library/fleet-result.d.ts → akuma/fleet-observation.d.ts} +13 -57
  22. package/build/src/{library/fleet-result.js → akuma/fleet-observation.js} +4 -25
  23. package/build/src/akuma/fleet-request.d.ts +122 -0
  24. package/build/src/akuma/fleet-request.js +168 -0
  25. package/build/src/akuma/heart/facts.d.ts +23 -0
  26. package/build/src/akuma/heart/facts.js +7 -0
  27. package/build/src/akuma/heart/index.d.ts +43 -4
  28. package/build/src/akuma/heart/index.js +107 -7
  29. package/build/src/akuma/heart/request-authority.d.ts +2 -0
  30. package/build/src/akuma/heart/request-authority.js +28 -3
  31. package/build/src/akuma/heart/request-rows.d.ts +2 -0
  32. package/build/src/akuma/heart/request-rows.js +24 -5
  33. package/build/src/akuma/heart/rows.d.ts +4 -1
  34. package/build/src/akuma/heart/rows.js +46 -19
  35. package/build/src/akuma/heart/schema.d.ts +1 -1
  36. package/build/src/akuma/heart/schema.js +28 -6
  37. package/build/src/akuma/heart/storage.d.ts +1 -1
  38. package/build/src/akuma/heart/tells.d.ts +29 -0
  39. package/build/src/akuma/heart/tells.js +136 -5
  40. package/build/src/akuma/heart/timeline.js +9 -3
  41. package/build/src/akuma/projection-read.js +36 -3
  42. package/build/src/akuma/projection.js +3 -4
  43. package/build/src/akuma/provider.d.ts +4 -0
  44. package/build/src/akuma/provider.js +56 -3
  45. package/build/src/akuma/providers/claude/index.js +3 -0
  46. package/build/src/akuma/providers/codex-app-server/index.js +14 -12
  47. package/build/src/akuma/providers/pi/index.js +7 -1
  48. package/build/src/akuma/publication.js +65 -49
  49. package/build/src/akuma/request-lifecycle.d.ts +5 -4
  50. package/build/src/akuma/request-lifecycle.js +29 -16
  51. package/build/src/akuma/request-rendezvous.d.ts +15 -12
  52. package/build/src/akuma/request-rendezvous.js +80 -51
  53. package/build/src/akuma/request-serve.d.ts +1 -2
  54. package/build/src/akuma/request-serve.js +94 -39
  55. package/build/src/akuma/request-wire.d.ts +57 -26
  56. package/build/src/akuma/request-wire.js +64 -25
  57. package/build/src/akuma/turn-drive.d.ts +5 -4
  58. package/build/src/akuma/turn-drive.js +27 -11
  59. package/build/src/akuma-body.d.ts +4 -6
  60. package/build/src/akuma-body.js +19 -17
  61. package/build/src/bounded-list.d.ts +8 -0
  62. package/build/src/bounded-list.js +14 -0
  63. package/build/src/cli/accepted.d.ts +1 -1
  64. package/build/src/cli/accepted.js +1 -0
  65. package/build/src/cli/commands/akuma-invoke.js +1 -25
  66. package/build/src/cli/commands/contract-help.d.ts +5 -2
  67. package/build/src/cli/commands/contract-help.js +62 -12
  68. package/build/src/cli/commands/contract-invoke.d.ts +5 -0
  69. package/build/src/cli/commands/contract-invoke.js +26 -1
  70. package/build/src/cli/commands/contract.js +50 -18
  71. package/build/src/cli/commands/task-invoke.js +10 -2
  72. package/build/src/cli/commands/task-query.js +3 -4
  73. package/build/src/cli/coordinates.d.ts +13 -0
  74. package/build/src/cli/coordinates.js +38 -24
  75. package/build/src/cli/draft.d.ts +1 -1
  76. package/build/src/cli/invoke.js +14 -1
  77. package/build/src/cli/render/akuma-activity.d.ts +0 -1
  78. package/build/src/cli/render/akuma-activity.js +5 -38
  79. package/build/src/cli/render/akuma.js +4 -1
  80. package/build/src/cli/render/audit.js +4 -1
  81. package/build/src/cli/render/catalog.js +13 -39
  82. package/build/src/cli/render/contract.js +4 -14
  83. package/build/src/cli/render/kanshi-akuma.js +3 -8
  84. package/build/src/cli/render/kanshi.js +8 -34
  85. package/build/src/cli/render/nuke.js +7 -3
  86. package/build/src/cli/render/receipt.d.ts +1 -0
  87. package/build/src/cli/render/receipt.js +8 -0
  88. package/build/src/cli/render/refusal.js +4 -3
  89. package/build/src/cli/render/task.js +4 -37
  90. package/build/src/cli/render/terminal.d.ts +2 -6
  91. package/build/src/cli/render/terminal.js +4 -9
  92. package/build/src/cli/result.d.ts +2 -1
  93. package/build/src/contract-guidance.js +13 -3
  94. package/build/src/contract-worktree.d.ts +1 -0
  95. package/build/src/contract-worktree.js +26 -2
  96. package/build/src/core/facts/codec.d.ts +2 -1
  97. package/build/src/core/facts/codec.js +3 -0
  98. package/build/src/core/facts/gate.d.ts +2 -1
  99. package/build/src/core/facts/gate.js +63 -0
  100. package/build/src/core/verbs/abandon.d.ts +2 -1
  101. package/build/src/core/verbs/abandon.js +16 -0
  102. package/build/src/core/verbs/amend.d.ts +2 -1
  103. package/build/src/core/verbs/amend.js +20 -0
  104. package/build/src/core/verbs/arc.d.ts +2 -1
  105. package/build/src/core/verbs/arc.js +16 -0
  106. package/build/src/core/verbs/attestation.d.ts +2 -1
  107. package/build/src/core/verbs/attestation.js +16 -0
  108. package/build/src/core/verbs/bind.d.ts +2 -1
  109. package/build/src/core/verbs/bind.js +16 -0
  110. package/build/src/core/verbs/deliver.d.ts +2 -1
  111. package/build/src/core/verbs/deliver.js +16 -0
  112. package/build/src/core/verbs/placement.d.ts +2 -1
  113. package/build/src/core/verbs/placement.js +58 -1
  114. package/build/src/dispatch/association.d.ts +13 -0
  115. package/build/src/dispatch/association.js +20 -0
  116. package/build/src/dispatch/index.d.ts +6 -0
  117. package/build/src/dispatch/index.js +27 -3
  118. package/build/src/git/hooks.d.ts +9 -1
  119. package/build/src/git/hooks.js +79 -1
  120. package/build/src/git/nuke.d.ts +2 -1
  121. package/build/src/git/nuke.js +6 -11
  122. package/build/src/git/private-state-seat.d.ts +26 -1
  123. package/build/src/git/private-state-seat.js +78 -13
  124. package/build/src/git/process.d.ts +2 -0
  125. package/build/src/git/reconcile.d.ts +1 -2
  126. package/build/src/git/reconcile.js +0 -6
  127. package/build/src/git/repository.d.ts +0 -2
  128. package/build/src/git/repository.js +27 -25
  129. package/build/src/git/result-codec.d.ts +29 -0
  130. package/build/src/git/result-codec.js +306 -0
  131. package/build/src/git/target-placement.js +2 -8
  132. package/build/src/git/workspace.d.ts +2 -0
  133. package/build/src/git/workspace.js +4 -0
  134. package/build/src/index.d.ts +1 -0
  135. package/build/src/kanshi/fleet.js +1 -1
  136. package/build/src/kanshi/read.js +55 -28
  137. package/build/src/kanshi/report.d.ts +4 -3
  138. package/build/src/kanshi/select.js +14 -1
  139. package/build/src/library/address.d.ts +1 -0
  140. package/build/src/library/address.js +4 -7
  141. package/build/src/library/akuma-creation.d.ts +5 -3
  142. package/build/src/library/akuma-creation.js +90 -33
  143. package/build/src/library/audit.js +2 -1
  144. package/build/src/library/catalog.d.ts +10 -2
  145. package/build/src/library/catalog.js +65 -25
  146. package/build/src/library/composition.d.ts +1 -0
  147. package/build/src/library/composition.js +1 -0
  148. package/build/src/library/configuration.d.ts +4 -21
  149. package/build/src/library/configuration.js +2 -158
  150. package/build/src/library/continuation.d.ts +20 -1
  151. package/build/src/library/continuation.js +36 -0
  152. package/build/src/library/contract-bind.d.ts +1 -0
  153. package/build/src/library/contract-bind.js +16 -5
  154. package/build/src/library/contract-forwarding.d.ts +2 -2
  155. package/build/src/library/contract-forwarding.js +18 -4
  156. package/build/src/library/contract-handle.js +4 -3
  157. package/build/src/library/contract-operations.d.ts +5 -9
  158. package/build/src/library/contract-operations.js +34 -47
  159. package/build/src/library/contract.d.ts +11 -2
  160. package/build/src/library/contract.js +21 -1
  161. package/build/src/library/delivery.d.ts +4 -1
  162. package/build/src/library/delivery.js +47 -0
  163. package/build/src/library/fleet.d.ts +4 -136
  164. package/build/src/library/fleet.js +31 -315
  165. package/build/src/library/keiyaku.d.ts +7 -3
  166. package/build/src/library/keiyaku.js +1 -0
  167. package/build/src/library/mutation.d.ts +431 -3
  168. package/build/src/library/mutation.js +192 -19
  169. package/build/src/library/nuke.d.ts +7 -1
  170. package/build/src/library/nuke.js +18 -4
  171. package/build/src/library/reconcile.d.ts +14 -0
  172. package/build/src/library/reconcile.js +22 -8
  173. package/build/src/library/refusal.d.ts +9 -1
  174. package/build/src/library/refusal.js +76 -0
  175. package/build/src/library/region.d.ts +0 -8
  176. package/build/src/library/region.js +1 -29
  177. package/build/src/library/result-codec.d.ts +2 -0
  178. package/build/src/library/result-codec.js +12 -0
  179. package/build/src/markdown/lex.js +9 -2
  180. package/build/src/markdown/types.d.ts +2 -1
  181. package/build/src/markdown/types.js +3 -1
  182. package/build/src/plugin/akuma-signals.d.ts +12 -0
  183. package/build/src/plugin/akuma-signals.js +14 -0
  184. package/build/src/plugin/public.d.ts +51 -0
  185. package/build/src/plugin/public.js +1 -0
  186. package/build/src/plugin/runtime.d.ts +14 -0
  187. package/build/src/plugin/runtime.js +357 -0
  188. package/build/src/protocol/amend.js +3 -3
  189. package/build/src/protocol/attempt.d.ts +2 -1
  190. package/build/src/protocol/attempt.js +1 -1
  191. package/build/src/protocol/audit.d.ts +1 -1
  192. package/build/src/protocol/audit.js +1 -1
  193. package/build/src/protocol/bind.d.ts +3 -1
  194. package/build/src/protocol/bind.js +26 -0
  195. package/build/src/protocol/completion.js +0 -1
  196. package/build/src/protocol/deliver.d.ts +1 -1
  197. package/build/src/protocol/deliver.js +136 -57
  198. package/build/src/protocol/intent.d.ts +0 -1
  199. package/build/src/protocol/intent.js +0 -1
  200. package/build/src/protocol/operations.d.ts +9 -2
  201. package/build/src/protocol/operations.js +16 -1
  202. package/build/src/protocol/outcome.d.ts +3 -0
  203. package/build/src/protocol/outcome.js +17 -1
  204. package/build/src/protocol/placement.js +10 -3
  205. package/build/src/protocol/read/status.d.ts +8 -0
  206. package/build/src/protocol/read/status.js +49 -0
  207. package/build/src/protocol/reintegrate.js +10 -3
  208. package/build/src/protocol/result-codec.d.ts +22 -0
  209. package/build/src/protocol/result-codec.js +442 -0
  210. package/build/src/protocol/review.d.ts +1 -1
  211. package/build/src/protocol/review.js +81 -46
  212. package/build/src/protocol/run.d.ts +22 -2
  213. package/build/src/protocol/run.js +119 -29
  214. package/build/src/runtime/proc/lifecycle.js +1 -1
  215. package/build/src/runtime/proc/line-rpc.d.ts +7 -1
  216. package/build/src/runtime/proc/line-rpc.js +49 -9
  217. package/build/src/runtime/proc/run.d.ts +0 -1
  218. package/build/src/runtime/proc/run.js +1 -11
  219. package/build/src/runtime/proc/termination.d.ts +1 -0
  220. package/build/src/runtime/proc/termination.js +63 -18
  221. package/build/src/runtime/proc/windows-launch.exe +0 -0
  222. package/build/src/settings.d.ts +10 -0
  223. package/build/src/settings.js +88 -2
  224. package/build/src/settlement/result-codec.d.ts +2 -0
  225. package/build/src/settlement/result-codec.js +56 -0
  226. package/build/src/settlement/settle.d.ts +5 -12
  227. package/build/src/settlement/settle.js +60 -55
  228. package/build/src/task/board.d.ts +3 -0
  229. package/build/src/task/board.js +22 -4
  230. package/build/src/task/catalog.d.ts +13 -2
  231. package/build/src/task/catalog.js +59 -5
  232. package/build/src/task/compose.d.ts +4 -2
  233. package/build/src/task/compose.js +56 -30
  234. package/build/src/task/created-observation.d.ts +39 -0
  235. package/build/src/task/created-observation.js +26 -0
  236. package/build/src/task/identity.d.ts +6 -0
  237. package/build/src/task/identity.js +48 -7
  238. package/build/src/task/index.d.ts +4 -3
  239. package/build/src/task/index.js +19 -16
  240. package/build/src/task/input.d.ts +3 -1
  241. package/build/src/task/input.js +7 -4
  242. package/build/src/task/lifecycle-operations.d.ts +6 -0
  243. package/build/src/task/lifecycle-operations.js +116 -0
  244. package/build/src/task/mutation-result.d.ts +762 -20
  245. package/build/src/task/mutation-result.js +34 -9
  246. package/build/src/task/mutation.d.ts +4 -9
  247. package/build/src/task/mutation.js +17 -52
  248. package/build/src/task/operation-types.d.ts +114 -0
  249. package/build/src/task/operation-types.js +1 -0
  250. package/build/src/task/operations.d.ts +6 -113
  251. package/build/src/task/operations.js +75 -117
  252. package/build/src/task/query.d.ts +8 -11
  253. package/build/src/task/query.js +7 -14
  254. package/build/src/task/store.d.ts +11 -1
  255. package/build/src/task/store.js +169 -55
  256. package/build/src/task/view.d.ts +4 -0
  257. package/build/src/task/view.js +7 -0
  258. package/build/src/verification/declaration.d.ts +1 -0
  259. package/build/src/verification/declaration.js +18 -1
  260. package/build/src/verification/execution.d.ts +0 -1
  261. package/build/src/verification/execution.js +5 -5
  262. package/build/src/world.d.ts +0 -2
  263. package/build/src/world.js +3 -7
  264. package/package.json +17 -5
  265. package/build/src/cli/square-edge.d.ts +0 -7
  266. package/build/src/cli/square-edge.js +0 -159
  267. package/build/src/git/ref-migration.d.ts +0 -22
  268. package/build/src/git/ref-migration.js +0 -55
  269. package/build/src/library/contract-forwarding-reconciliation-result.d.ts +0 -102
  270. package/build/src/library/contract-forwarding-reconciliation-result.js +0 -92
  271. package/build/src/library/contract-forwarding-result.d.ts +0 -4270
  272. package/build/src/library/contract-forwarding-result.js +0 -521
@@ -1,16 +1,23 @@
1
- import { isTaskSegment, formatTaskId, parseTaskId } from "./identity.js";
1
+ import { isTaskSegment, canonicalTaskId, parseTaskId } from "./identity.js";
2
2
  import { z } from "zod";
3
3
  const nonblankTextSchema = z.string().refine((value) => value.trim() !== "");
4
+ function withoutUndefined(value, keys) {
5
+ const result = { ...value };
6
+ for (const key of keys) {
7
+ const field = result[key];
8
+ delete result[key];
9
+ if (field !== undefined)
10
+ result[key] = field;
11
+ }
12
+ return result;
13
+ }
4
14
  const timestampSchema = z.string().refine((value) => {
5
15
  const parsed = Date.parse(value);
6
16
  return Number.isFinite(parsed) && new Date(parsed).toISOString() === value;
7
17
  }, "expected canonical UTC timestamp");
8
18
  export const taskMutationIdSchema = z.string().transform((value, context) => {
9
19
  try {
10
- const id = formatTaskId(parseTaskId(value));
11
- if (id !== value)
12
- throw new Error("not canonical");
13
- return id;
20
+ return canonicalTaskId(value);
14
21
  }
15
22
  catch {
16
23
  context.addIssue({ code: "custom", message: "expected canonical TaskId" });
@@ -26,6 +33,9 @@ const taskPrioritySchema = z.union([z.literal(0), z.literal(1), z.literal(2), z.
26
33
  const taskRetrySchema = z
27
34
  .object({ kind: z.literal("retry"), reason: z.enum(["busy", "concurrent-modification"]) })
28
35
  .strict();
36
+ const taskCleanupFailureSchema = z
37
+ .object({ kind: z.literal("lock-release-failed"), diagnostics: z.array(z.string()) })
38
+ .strict();
29
39
  const taskViewSchema = z
30
40
  .object({
31
41
  id: taskMutationIdSchema,
@@ -75,7 +85,10 @@ const taskRefusalSchema = z.union([
75
85
  z.object({ kind: z.literal("invalid-composition"), diagnostics: z.array(compositionDiagnosticSchema) }).strict(),
76
86
  ]);
77
87
  export const taskMutationResultSchema = z.union([
78
- z.object({ kind: z.literal("accepted"), value: taskViewSchema }).strict(),
88
+ z
89
+ .object({ kind: z.literal("accepted"), value: taskViewSchema, cleanup: taskCleanupFailureSchema.optional() })
90
+ .strict()
91
+ .transform((value) => withoutUndefined(value, ["cleanup"])),
79
92
  z.object({ kind: z.literal("refused"), refusal: taskRefusalSchema }).strict(),
80
93
  taskRetrySchema,
81
94
  ]);
@@ -84,8 +97,10 @@ export const taskUpdateResultSchema = z.union([
84
97
  .object({
85
98
  kind: z.literal("accepted"),
86
99
  value: z.object({ task: taskViewSchema, documentDiff: z.string() }).strict(),
100
+ cleanup: taskCleanupFailureSchema.optional(),
87
101
  })
88
- .strict(),
102
+ .strict()
103
+ .transform((value) => withoutUndefined(value, ["cleanup"])),
89
104
  z.object({ kind: z.literal("refused"), refusal: taskRefusalSchema }).strict(),
90
105
  taskRetrySchema,
91
106
  ]);
@@ -110,7 +125,15 @@ export const taskCompositionResultSchema = z.union([
110
125
  .strict()),
111
126
  })
112
127
  .strict(),
113
- z.object({ kind: z.literal("accepted"), ...compositionFactsSchema, documentChanges: documentChangesSchema }).strict(),
128
+ z
129
+ .object({
130
+ kind: z.literal("accepted"),
131
+ ...compositionFactsSchema,
132
+ documentChanges: documentChangesSchema,
133
+ cleanup: taskCleanupFailureSchema.optional(),
134
+ })
135
+ .strict()
136
+ .transform((value) => withoutUndefined(value, ["cleanup"])),
114
137
  z
115
138
  .object({
116
139
  kind: z.literal("refused"),
@@ -124,10 +147,12 @@ export const taskCompositionResultSchema = z.union([
124
147
  kind: z.literal("incomplete"),
125
148
  ...compositionFactsSchema,
126
149
  documentChanges: documentChangesSchema,
150
+ cleanup: taskCleanupFailureSchema.optional(),
127
151
  stopped: z.union([taskRefusalSchema, taskRetrySchema]),
128
152
  draft: z.string(),
129
153
  })
130
- .strict(),
154
+ .strict()
155
+ .transform((value) => withoutUndefined(value, ["cleanup"])),
131
156
  ]);
132
157
  export const taskMutationExecutionResultSchema = z.union([
133
158
  taskBatchResultSchema,
@@ -1,5 +1,5 @@
1
1
  import { type WorldRoot } from "../world.js";
2
- import { type ErasedRequestCommand, type RequestCommand } from "../akuma/request-wire.js";
2
+ import { type ErasedRequestCommand, type RequestProtocol, type ServiceRequestCommand } from "../akuma/request-wire.js";
3
3
  import { type TaskBatchResult, type TaskMutationResult, type TaskUpdateResult } from "./operations.js";
4
4
  import { type TaskCompositionResult } from "./compose.js";
5
5
  import { type TaskMutationExecutionResult } from "./mutation-result.js";
@@ -7,7 +7,6 @@ import { z } from "zod";
7
7
  export type { TaskMutationExecutionResult } from "./mutation-result.js";
8
8
  export declare const TASK_MUTATION_ACTIONS: readonly ["task.add", "task.addDocument", "task.compose", "task.done", "task.drop", "task.hold", "task.resume", "task.start", "task.stop", "task.update"];
9
9
  export type TaskMutationAction = (typeof TASK_MUTATION_ACTIONS)[number];
10
- export declare function isTaskMutationAction(value: unknown): value is TaskMutationAction;
11
10
  declare const taskRequestSchemas: {
12
11
  readonly "task.add": z.ZodPipe<z.ZodObject<{
13
12
  input: z.ZodObject<{
@@ -537,14 +536,10 @@ export type TaskMutationRequestPort = Readonly<{
537
536
  signal: AbortSignal;
538
537
  }>): Promise<TaskMutationExecutionResult>;
539
538
  }>;
540
- type TaskMutationExecutionContext = Readonly<{
541
- requester: string;
542
- signal: AbortSignal;
543
- upstream: TaskMutationRequestPort;
544
- }>;
545
539
  /** Task owns forwarded mutation payload, live result, and durable service evidence. */
546
- export declare function taskMutationRequestCommand(action: TaskMutationAction): RequestCommand<TaskMutationBodyRequest, TaskMutationExecutionResult, TaskMutationService, ForwardedTaskReference, TaskMutationExecutionContext>;
547
- export declare function taskMutationRequestCommands(): Readonly<Record<TaskMutationAction, ErasedRequestCommand>>;
540
+ export declare function taskMutationRequestProtocol(action: TaskMutationAction): RequestProtocol<TaskMutationBodyRequest, TaskMutationExecutionResult, ForwardedTaskReference>;
541
+ export declare function taskMutationRequestCommand(action: TaskMutationAction, port: TaskMutationRequestPort): ServiceRequestCommand<TaskMutationBodyRequest, TaskMutationExecutionResult, TaskMutationService, ForwardedTaskReference>;
542
+ export declare function taskMutationRequestCommands(port: TaskMutationRequestPort): Readonly<Record<TaskMutationAction, ErasedRequestCommand>>;
548
543
  export declare function requestForwardedTask<Request extends TaskMutationRequest>(input: Readonly<{
549
544
  directory: string;
550
545
  id?: never;
@@ -1,7 +1,6 @@
1
- /* eslint-disable max-lines -- Task owns one coherent forwarded mutation boundary. */
2
1
  import { World } from "../world.js";
3
2
  import { requestBodyCommand } from "../akuma/request-rendezvous.js";
4
- import { eraseRequestCommand } from "../akuma/request-wire.js";
3
+ import { eraseRequestCommand, } from "../akuma/request-wire.js";
5
4
  import { addTask, addTaskDocument, batchTasks, lifecycleTask, updateTask, } from "./operations.js";
6
5
  import { composeTasks } from "./compose.js";
7
6
  import { isTaskSegment } from "./identity.js";
@@ -19,10 +18,6 @@ export const TASK_MUTATION_ACTIONS = Object.freeze([
19
18
  "task.stop",
20
19
  "task.update",
21
20
  ]);
22
- const TASK_MUTATION_ACTION_SET = new Set(TASK_MUTATION_ACTIONS);
23
- export function isTaskMutationAction(value) {
24
- return typeof value === "string" && TASK_MUTATION_ACTION_SET.has(value);
25
- }
26
21
  const nonblankTextSchema = z.string().refine((value) => value.trim() !== "");
27
22
  const namespaceSchema = z.array(z.string().refine(isTaskSegment)).readonly();
28
23
  const taskIdsBaseSchema = z.array(taskMutationIdSchema).superRefine((ids, context) => {
@@ -141,30 +136,6 @@ export const taskMutationServiceSchema = z.object({ action: z.enum(TASK_MUTATION
141
136
  export const forwardedTaskReferenceSchema = z
142
137
  .object({ kind: z.literal("served-reference"), action: z.enum(TASK_MUTATION_ACTIONS) })
143
138
  .strict();
144
- function decodeTaskMutationExecutionContext(value) {
145
- const context = resultRecord(value);
146
- if (context === null ||
147
- typeof context.requester !== "string" ||
148
- context.requester.trim() === "" ||
149
- !isAbortSignal(context.signal) ||
150
- !isTaskMutationRequestPort(context.upstream))
151
- throw new Error("invalid Task execution context");
152
- return { requester: context.requester, signal: context.signal, upstream: context.upstream };
153
- }
154
- function isAbortSignal(value) {
155
- return (value !== null &&
156
- typeof value === "object" &&
157
- typeof value.throwIfAborted === "function");
158
- }
159
- function isTaskMutationRequestPort(value) {
160
- const port = resultRecord(value);
161
- return port !== null && typeof port.task === "function";
162
- }
163
- function resultRecord(value) {
164
- return value !== null && typeof value === "object" && !Array.isArray(value)
165
- ? value
166
- : null;
167
- }
168
139
  function decodeTaskBodyRequest(action, value) {
169
140
  const parsed = taskBodyRequestSchemas[action].safeParse(value);
170
141
  return parsed.success ? parsed.data : null;
@@ -182,7 +153,7 @@ function decodeTaskReference(action, value) {
182
153
  return parsed.data;
183
154
  }
184
155
  /** Task owns forwarded mutation payload, live result, and durable service evidence. */
185
- export function taskMutationRequestCommand(action) {
156
+ export function taskMutationRequestProtocol(action) {
186
157
  return {
187
158
  action,
188
159
  encodeRequest: (input) => {
@@ -197,39 +168,33 @@ export function taskMutationRequestCommand(action) {
197
168
  }
198
169
  return result;
199
170
  },
171
+ decodeReference: (reference) => decodeTaskReference(action, reference),
172
+ isPermitted: (allowed) => allowed.includes(action),
173
+ };
174
+ }
175
+ export function taskMutationRequestCommand(action, port) {
176
+ return {
177
+ completion: "service",
178
+ protocol: taskMutationRequestProtocol(action),
200
179
  encodeService: (service) => decodeTaskService(action, service),
201
180
  decodeService: (service) => decodeTaskService(action, service),
202
181
  projectService: (service) => decodeTaskReference(action, { kind: "served-reference", action: service.action }),
203
- decodeReference: (reference) => decodeTaskReference(action, reference),
204
- isPermitted: (allowed) => allowed.includes(action),
205
- decodeExecutionContext: decodeTaskMutationExecutionContext,
206
- execute: async (request, context) => {
182
+ execute: async (request, facts) => {
207
183
  const world = await World.prove(request.world);
208
184
  return {
209
- result: await context.upstream.task({
185
+ result: await port.task({
210
186
  world,
211
187
  request: request.request,
212
- requester: context.requester,
213
- signal: context.signal,
188
+ requester: facts.requester,
189
+ signal: facts.signal,
214
190
  }),
215
191
  service: { action: request.request.action },
216
192
  };
217
193
  },
218
194
  };
219
195
  }
220
- export function taskMutationRequestCommands() {
221
- return {
222
- "task.add": eraseRequestCommand(taskMutationRequestCommand("task.add")),
223
- "task.addDocument": eraseRequestCommand(taskMutationRequestCommand("task.addDocument")),
224
- "task.compose": eraseRequestCommand(taskMutationRequestCommand("task.compose")),
225
- "task.done": eraseRequestCommand(taskMutationRequestCommand("task.done")),
226
- "task.drop": eraseRequestCommand(taskMutationRequestCommand("task.drop")),
227
- "task.hold": eraseRequestCommand(taskMutationRequestCommand("task.hold")),
228
- "task.resume": eraseRequestCommand(taskMutationRequestCommand("task.resume")),
229
- "task.start": eraseRequestCommand(taskMutationRequestCommand("task.start")),
230
- "task.stop": eraseRequestCommand(taskMutationRequestCommand("task.stop")),
231
- "task.update": eraseRequestCommand(taskMutationRequestCommand("task.update")),
232
- };
196
+ export function taskMutationRequestCommands(port) {
197
+ return Object.fromEntries(TASK_MUTATION_ACTIONS.map((action) => [action, eraseRequestCommand(taskMutationRequestCommand(action, port))]));
233
198
  }
234
199
  function taskResultForRequest(request, value) {
235
200
  const schema = request.action === "task.compose"
@@ -245,7 +210,7 @@ export async function requestForwardedTask(input) {
245
210
  const response = await requestBodyCommand({
246
211
  directory: input.directory,
247
212
  ...(input.id === undefined ? {} : { id: input.id }),
248
- command: taskMutationRequestCommand(input.request.action),
213
+ command: taskMutationRequestProtocol(input.request.action),
249
214
  value: { world: input.world, request: input.request },
250
215
  ...(input.signal === undefined ? {} : { signal: input.signal }),
251
216
  });
@@ -0,0 +1,114 @@
1
+ import type { TaskDocument, TaskPriority, TaskState } from "./document.js";
2
+ import type { TaskId } from "./identity.js";
3
+ export type TaskView = Readonly<TaskDocument & {
4
+ namespace: readonly string[];
5
+ }>;
6
+ export type TaskCleanupFailure = Readonly<{
7
+ kind: "lock-release-failed";
8
+ diagnostics: readonly string[];
9
+ }>;
10
+ export type TaskCompositionDiagnostic = Readonly<{
11
+ line: number;
12
+ reason: string;
13
+ token: string;
14
+ }>;
15
+ export type TaskRefusal = Readonly<{
16
+ kind: "task-missing";
17
+ taskId: TaskId;
18
+ }> | Readonly<{
19
+ kind: "invalid-lifecycle-transition";
20
+ taskId: TaskId;
21
+ state: TaskState;
22
+ verb: TaskLifecycleVerb;
23
+ }> | Readonly<{
24
+ kind: "invalid-graph";
25
+ diagnostic: string;
26
+ }> | Readonly<{
27
+ kind: "invalid-namespace-context";
28
+ path: string;
29
+ }> | Readonly<{
30
+ kind: "relation-owned-by-other";
31
+ taskId: TaskId;
32
+ related: TaskId;
33
+ declaringTask: TaskId;
34
+ }> | Readonly<{
35
+ kind: "invalid-composition";
36
+ diagnostics: readonly TaskCompositionDiagnostic[];
37
+ }>;
38
+ export type TaskRetry = "busy" | "concurrent-modification";
39
+ export type TaskOutcome<A> = Readonly<{
40
+ kind: "accepted";
41
+ value: A;
42
+ cleanup?: TaskCleanupFailure;
43
+ }> | Readonly<{
44
+ kind: "refused";
45
+ refusal: TaskRefusal;
46
+ }> | Readonly<{
47
+ kind: "retry";
48
+ reason: TaskRetry;
49
+ }>;
50
+ export type TaskMutationResult = TaskOutcome<TaskView>;
51
+ export type TaskUpdateResult = TaskOutcome<Readonly<{
52
+ task: TaskView;
53
+ documentDiff: string;
54
+ }>>;
55
+ export type TaskLifecycleVerb = "start" | "stop" | "hold" | "resume" | "done" | "drop";
56
+ export type TaskBatchResult = Readonly<{
57
+ items: readonly Readonly<{
58
+ id: TaskId;
59
+ outcome: TaskMutationResult;
60
+ }>[];
61
+ }>;
62
+ export type SettledTaskAction = "done";
63
+ export type SettledTaskResult = Readonly<{
64
+ kind: "changed";
65
+ task: TaskView;
66
+ action: SettledTaskAction;
67
+ cleanup?: TaskCleanupFailure;
68
+ }> | Readonly<{
69
+ kind: "unchanged";
70
+ }> | Readonly<{
71
+ kind: "refused";
72
+ refusal: TaskRefusal;
73
+ }> | Readonly<{
74
+ kind: "retry";
75
+ reason: TaskRetry;
76
+ }>;
77
+ export type AddTaskInput = Readonly<{
78
+ title: string;
79
+ namespace?: readonly string[];
80
+ body?: string;
81
+ note?: string;
82
+ state?: TaskState;
83
+ priority?: TaskPriority;
84
+ needs?: readonly TaskId[];
85
+ parent?: TaskId | null;
86
+ supersedes?: readonly TaskId[];
87
+ relates?: readonly TaskId[];
88
+ actor?: string;
89
+ signal?: AbortSignal;
90
+ }>;
91
+ export type AddTaskDocumentInput = Readonly<{
92
+ markdown: string;
93
+ namespace?: readonly string[];
94
+ actor?: string;
95
+ signal?: AbortSignal;
96
+ }>;
97
+ export type UpdateTaskInput = Readonly<{
98
+ title?: string;
99
+ body?: string;
100
+ appendBody?: string;
101
+ note?: string;
102
+ priority?: TaskPriority;
103
+ needs?: readonly TaskId[];
104
+ addNeeds?: readonly TaskId[];
105
+ dropNeeds?: readonly TaskId[];
106
+ parent?: TaskId | null;
107
+ supersedes?: readonly TaskId[];
108
+ addSupersedes?: readonly TaskId[];
109
+ dropSupersedes?: readonly TaskId[];
110
+ relates?: readonly TaskId[];
111
+ addRelates?: readonly TaskId[];
112
+ dropRelates?: readonly TaskId[];
113
+ signal?: AbortSignal;
114
+ }>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,127 +1,20 @@
1
1
  import { type BlockedTaskRow, type TaskBoardObservation, type TaskDetailFacts, type TaskRow } from "./board.js";
2
- import { type TaskDocument, type TaskPriority, type TaskState } from "./document.js";
3
2
  import { type TaskId } from "./identity.js";
4
3
  import type { WorldRoot } from "../world.js";
5
4
  import { type TaskPage, type TaskQueryExpression, type TaskQueryRow, type TaskQuerySort } from "./query.js";
6
- export type TaskView = Readonly<TaskDocument & {
7
- namespace: readonly string[];
8
- }>;
5
+ export { advanceTaskTimestamp, taskView } from "./view.js";
6
+ export type { AddTaskDocumentInput, AddTaskInput, TaskCleanupFailure, SettledTaskAction, SettledTaskResult, TaskBatchResult, TaskCompositionDiagnostic, TaskLifecycleVerb, TaskMutationResult, TaskOutcome, TaskRefusal, TaskRetry, TaskUpdateResult, TaskView, UpdateTaskInput, } from "./operation-types.js";
7
+ import type { AddTaskDocumentInput, AddTaskInput, TaskMutationResult, TaskOutcome, TaskUpdateResult, TaskView, UpdateTaskInput } from "./operation-types.js";
9
8
  export declare function nukeTask(world: WorldRoot, options?: Readonly<{
10
9
  timeoutMs?: number;
11
10
  }>): Promise<void>;
12
- export type TaskCompositionDiagnostic = Readonly<{
13
- line: number;
14
- reason: string;
15
- token: string;
16
- }>;
17
- export type TaskRefusal = Readonly<{
18
- kind: "task-missing";
19
- taskId: TaskId;
20
- }> | Readonly<{
21
- kind: "invalid-lifecycle-transition";
22
- taskId: TaskId;
23
- state: TaskState;
24
- verb: TaskLifecycleVerb;
25
- }> | Readonly<{
26
- kind: "invalid-graph";
27
- diagnostic: string;
28
- }> | Readonly<{
29
- kind: "invalid-namespace-context";
30
- path: string;
31
- }> | Readonly<{
32
- kind: "relation-owned-by-other";
33
- taskId: TaskId;
34
- related: TaskId;
35
- declaringTask: TaskId;
36
- }> | Readonly<{
37
- kind: "invalid-composition";
38
- diagnostics: readonly TaskCompositionDiagnostic[];
39
- }>;
40
- export type TaskRetry = "busy" | "concurrent-modification";
41
- export type TaskOutcome<A> = Readonly<{
42
- kind: "accepted";
43
- value: A;
44
- }> | Readonly<{
45
- kind: "refused";
46
- refusal: TaskRefusal;
47
- }> | Readonly<{
48
- kind: "retry";
49
- reason: TaskRetry;
50
- }>;
51
- export type TaskMutationResult = TaskOutcome<TaskView>;
52
- export type TaskUpdateResult = TaskOutcome<Readonly<{
53
- task: TaskView;
54
- documentDiff: string;
55
- }>>;
56
- export type TaskLifecycleVerb = "start" | "stop" | "hold" | "resume" | "done" | "drop";
57
- export type TaskBatchResult = Readonly<{
58
- items: readonly Readonly<{
59
- id: TaskId;
60
- outcome: TaskMutationResult;
61
- }>[];
62
- }>;
63
- export type SettledTaskAction = "done";
64
- export type SettledTaskResult = Readonly<{
65
- kind: "changed";
66
- task: TaskView;
67
- action: SettledTaskAction;
68
- }> | Readonly<{
69
- kind: "unchanged";
70
- }> | Readonly<{
71
- kind: "refused";
72
- refusal: TaskRefusal;
73
- }> | Readonly<{
74
- kind: "retry";
75
- reason: TaskRetry;
76
- }>;
77
- export type AddTaskInput = Readonly<{
78
- title: string;
79
- namespace?: readonly string[];
80
- body?: string;
81
- note?: string;
82
- state?: TaskState;
83
- priority?: TaskPriority;
84
- needs?: readonly TaskId[];
85
- parent?: TaskId | null;
86
- supersedes?: readonly TaskId[];
87
- relates?: readonly TaskId[];
88
- actor?: string;
89
- signal?: AbortSignal;
90
- }>;
91
- export type AddTaskDocumentInput = Readonly<{
92
- markdown: string;
93
- namespace?: readonly string[];
94
- actor?: string;
95
- signal?: AbortSignal;
96
- }>;
97
- export type UpdateTaskInput = Readonly<{
98
- title?: string;
99
- body?: string;
100
- appendBody?: string;
101
- note?: string;
102
- priority?: TaskPriority;
103
- needs?: readonly TaskId[];
104
- addNeeds?: readonly TaskId[];
105
- dropNeeds?: readonly TaskId[];
106
- parent?: TaskId | null;
107
- supersedes?: readonly TaskId[];
108
- addSupersedes?: readonly TaskId[];
109
- dropSupersedes?: readonly TaskId[];
110
- relates?: readonly TaskId[];
111
- addRelates?: readonly TaskId[];
112
- dropRelates?: readonly TaskId[];
113
- signal?: AbortSignal;
114
- }>;
115
- export declare function taskView(document: TaskDocument): TaskView;
116
- /** Internal Task timestamp rule shared by ordinary mutations and compose. */
117
- export declare function advanceTaskTimestamp(previous: string, candidate: string): string;
11
+ export type { TaskState } from "./document.js";
118
12
  export declare function addTask(world: WorldRoot, input: AddTaskInput): Promise<TaskMutationResult>;
119
13
  export declare function addTaskDocument(world: WorldRoot, input: AddTaskDocumentInput): Promise<TaskMutationResult>;
120
14
  export declare function updateTask(world: WorldRoot, id: TaskId, input: UpdateTaskInput): Promise<TaskUpdateResult>;
121
- export declare function lifecycleTask(world: WorldRoot, id: TaskId, verb: TaskLifecycleVerb, signal?: AbortSignal, note?: string): Promise<TaskMutationResult>;
122
- export declare function batchTasks(world: WorldRoot, verb: "start" | "done" | "drop" | "hold", ids: readonly TaskId[], signal?: AbortSignal, note?: string): Promise<TaskBatchResult>;
123
- export declare function settleTask(world: WorldRoot, id: TaskId): Promise<SettledTaskResult>;
15
+ export { batchTasks, lifecycleTask, settleTask } from "./lifecycle-operations.js";
124
16
  export declare function listTasks(world: WorldRoot, namespace: readonly string[] | undefined, selection: "active" | "closed" | "all", scope?: "namespace" | "world", limit?: number): Promise<TaskOutcome<TaskPage<TaskRow>>>;
17
+ export declare function readTaskDetail(world: WorldRoot, id: TaskId): Promise<TaskDetailFacts | null>;
125
18
  export declare function readTaskDetails(world: WorldRoot, ids: readonly TaskId[]): Promise<TaskOutcome<readonly TaskDetailFacts[]>>;
126
19
  export declare function observeTaskDetails(world: WorldRoot, ids: readonly TaskId[]): Promise<TaskOutcome<readonly (Omit<TaskDetailFacts, "task"> & Readonly<{
127
20
  task: TaskView;