@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.
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-workflow/SKILL.md +135 -377
- package/build/integrations/pi/keiyaku.ts +11 -116
- package/build/src/akuma/akuma-errors.d.ts +1 -0
- package/build/src/akuma/akuma-errors.js +1 -0
- package/build/src/akuma/akuma-handle.d.ts +1 -0
- package/build/src/akuma/akuma-handle.js +6 -7
- package/build/src/akuma/akuma-product.d.ts +6 -8
- package/build/src/akuma/akuma-product.js +141 -57
- package/build/src/akuma/akuma.d.ts +5 -7
- package/build/src/akuma/akuma.js +1 -22
- package/build/src/akuma/archetype.d.ts +6 -5
- package/build/src/akuma/archetype.js +137 -38
- package/build/src/akuma/body.d.ts +5 -5
- package/build/src/akuma/body.js +223 -63
- package/build/src/akuma/call-input.d.ts +4 -0
- package/build/src/akuma/call-input.js +21 -0
- package/build/src/akuma/call-request.d.ts +5 -8
- package/build/src/akuma/call-request.js +28 -73
- package/build/src/akuma/fleet-execution.d.ts +26 -0
- package/build/src/akuma/fleet-execution.js +109 -0
- package/build/src/{library/fleet-result.d.ts → akuma/fleet-observation.d.ts} +13 -57
- package/build/src/{library/fleet-result.js → akuma/fleet-observation.js} +4 -25
- package/build/src/akuma/fleet-request.d.ts +122 -0
- package/build/src/akuma/fleet-request.js +168 -0
- package/build/src/akuma/heart/facts.d.ts +23 -0
- package/build/src/akuma/heart/facts.js +7 -0
- package/build/src/akuma/heart/index.d.ts +43 -4
- package/build/src/akuma/heart/index.js +107 -7
- package/build/src/akuma/heart/request-authority.d.ts +2 -0
- package/build/src/akuma/heart/request-authority.js +28 -3
- package/build/src/akuma/heart/request-rows.d.ts +2 -0
- package/build/src/akuma/heart/request-rows.js +24 -5
- package/build/src/akuma/heart/rows.d.ts +4 -1
- package/build/src/akuma/heart/rows.js +46 -19
- package/build/src/akuma/heart/schema.d.ts +1 -1
- package/build/src/akuma/heart/schema.js +28 -6
- package/build/src/akuma/heart/storage.d.ts +1 -1
- package/build/src/akuma/heart/tells.d.ts +29 -0
- package/build/src/akuma/heart/tells.js +136 -5
- package/build/src/akuma/heart/timeline.js +9 -3
- package/build/src/akuma/projection-read.js +36 -3
- package/build/src/akuma/projection.js +3 -4
- package/build/src/akuma/provider.d.ts +4 -0
- package/build/src/akuma/provider.js +56 -3
- package/build/src/akuma/providers/claude/index.js +3 -0
- package/build/src/akuma/providers/codex-app-server/index.js +14 -12
- package/build/src/akuma/providers/pi/index.js +7 -1
- package/build/src/akuma/publication.js +65 -49
- package/build/src/akuma/request-lifecycle.d.ts +5 -4
- package/build/src/akuma/request-lifecycle.js +29 -16
- package/build/src/akuma/request-rendezvous.d.ts +15 -12
- package/build/src/akuma/request-rendezvous.js +80 -51
- package/build/src/akuma/request-serve.d.ts +1 -2
- package/build/src/akuma/request-serve.js +94 -39
- package/build/src/akuma/request-wire.d.ts +57 -26
- package/build/src/akuma/request-wire.js +64 -25
- package/build/src/akuma/turn-drive.d.ts +5 -4
- package/build/src/akuma/turn-drive.js +27 -11
- package/build/src/akuma-body.d.ts +4 -6
- package/build/src/akuma-body.js +19 -17
- package/build/src/bounded-list.d.ts +8 -0
- package/build/src/bounded-list.js +14 -0
- package/build/src/cli/accepted.d.ts +1 -1
- package/build/src/cli/accepted.js +1 -0
- package/build/src/cli/commands/akuma-invoke.js +1 -25
- package/build/src/cli/commands/contract-help.d.ts +5 -2
- package/build/src/cli/commands/contract-help.js +62 -12
- package/build/src/cli/commands/contract-invoke.d.ts +5 -0
- package/build/src/cli/commands/contract-invoke.js +26 -1
- package/build/src/cli/commands/contract.js +50 -18
- package/build/src/cli/commands/task-invoke.js +10 -2
- package/build/src/cli/commands/task-query.js +3 -4
- package/build/src/cli/coordinates.d.ts +13 -0
- package/build/src/cli/coordinates.js +38 -24
- package/build/src/cli/draft.d.ts +1 -1
- package/build/src/cli/invoke.js +14 -1
- package/build/src/cli/render/akuma-activity.d.ts +0 -1
- package/build/src/cli/render/akuma-activity.js +5 -38
- package/build/src/cli/render/akuma.js +4 -1
- package/build/src/cli/render/audit.js +4 -1
- package/build/src/cli/render/catalog.js +13 -39
- package/build/src/cli/render/contract.js +4 -14
- package/build/src/cli/render/kanshi-akuma.js +3 -8
- package/build/src/cli/render/kanshi.js +8 -34
- package/build/src/cli/render/nuke.js +7 -3
- package/build/src/cli/render/receipt.d.ts +1 -0
- package/build/src/cli/render/receipt.js +8 -0
- package/build/src/cli/render/refusal.js +4 -3
- package/build/src/cli/render/task.js +4 -37
- package/build/src/cli/render/terminal.d.ts +2 -6
- package/build/src/cli/render/terminal.js +4 -9
- package/build/src/cli/result.d.ts +2 -1
- package/build/src/contract-guidance.js +13 -3
- package/build/src/contract-worktree.d.ts +1 -0
- package/build/src/contract-worktree.js +26 -2
- package/build/src/core/facts/codec.d.ts +2 -1
- package/build/src/core/facts/codec.js +3 -0
- package/build/src/core/facts/gate.d.ts +2 -1
- package/build/src/core/facts/gate.js +63 -0
- package/build/src/core/verbs/abandon.d.ts +2 -1
- package/build/src/core/verbs/abandon.js +16 -0
- package/build/src/core/verbs/amend.d.ts +2 -1
- package/build/src/core/verbs/amend.js +20 -0
- package/build/src/core/verbs/arc.d.ts +2 -1
- package/build/src/core/verbs/arc.js +16 -0
- package/build/src/core/verbs/attestation.d.ts +2 -1
- package/build/src/core/verbs/attestation.js +16 -0
- package/build/src/core/verbs/bind.d.ts +2 -1
- package/build/src/core/verbs/bind.js +16 -0
- package/build/src/core/verbs/deliver.d.ts +2 -1
- package/build/src/core/verbs/deliver.js +16 -0
- package/build/src/core/verbs/placement.d.ts +2 -1
- package/build/src/core/verbs/placement.js +58 -1
- package/build/src/dispatch/association.d.ts +13 -0
- package/build/src/dispatch/association.js +20 -0
- package/build/src/dispatch/index.d.ts +6 -0
- package/build/src/dispatch/index.js +27 -3
- package/build/src/git/hooks.d.ts +9 -1
- package/build/src/git/hooks.js +79 -1
- package/build/src/git/nuke.d.ts +2 -1
- package/build/src/git/nuke.js +6 -11
- package/build/src/git/private-state-seat.d.ts +26 -1
- package/build/src/git/private-state-seat.js +78 -13
- package/build/src/git/process.d.ts +2 -0
- package/build/src/git/reconcile.d.ts +1 -2
- package/build/src/git/reconcile.js +0 -6
- package/build/src/git/repository.d.ts +0 -2
- package/build/src/git/repository.js +27 -25
- package/build/src/git/result-codec.d.ts +29 -0
- package/build/src/git/result-codec.js +306 -0
- package/build/src/git/target-placement.js +2 -8
- package/build/src/git/workspace.d.ts +2 -0
- package/build/src/git/workspace.js +4 -0
- package/build/src/index.d.ts +1 -0
- package/build/src/kanshi/fleet.js +1 -1
- package/build/src/kanshi/read.js +55 -28
- package/build/src/kanshi/report.d.ts +4 -3
- package/build/src/kanshi/select.js +14 -1
- package/build/src/library/address.d.ts +1 -0
- package/build/src/library/address.js +4 -7
- package/build/src/library/akuma-creation.d.ts +5 -3
- package/build/src/library/akuma-creation.js +90 -33
- package/build/src/library/audit.js +2 -1
- package/build/src/library/catalog.d.ts +10 -2
- package/build/src/library/catalog.js +65 -25
- package/build/src/library/composition.d.ts +1 -0
- package/build/src/library/composition.js +1 -0
- package/build/src/library/configuration.d.ts +4 -21
- package/build/src/library/configuration.js +2 -158
- package/build/src/library/continuation.d.ts +20 -1
- package/build/src/library/continuation.js +36 -0
- package/build/src/library/contract-bind.d.ts +1 -0
- package/build/src/library/contract-bind.js +16 -5
- package/build/src/library/contract-forwarding.d.ts +2 -2
- package/build/src/library/contract-forwarding.js +18 -4
- package/build/src/library/contract-handle.js +4 -3
- package/build/src/library/contract-operations.d.ts +5 -9
- package/build/src/library/contract-operations.js +34 -47
- package/build/src/library/contract.d.ts +11 -2
- package/build/src/library/contract.js +21 -1
- package/build/src/library/delivery.d.ts +4 -1
- package/build/src/library/delivery.js +47 -0
- package/build/src/library/fleet.d.ts +4 -136
- package/build/src/library/fleet.js +31 -315
- package/build/src/library/keiyaku.d.ts +7 -3
- package/build/src/library/keiyaku.js +1 -0
- package/build/src/library/mutation.d.ts +431 -3
- package/build/src/library/mutation.js +192 -19
- package/build/src/library/nuke.d.ts +7 -1
- package/build/src/library/nuke.js +18 -4
- package/build/src/library/reconcile.d.ts +14 -0
- package/build/src/library/reconcile.js +22 -8
- package/build/src/library/refusal.d.ts +9 -1
- package/build/src/library/refusal.js +76 -0
- package/build/src/library/region.d.ts +0 -8
- package/build/src/library/region.js +1 -29
- package/build/src/library/result-codec.d.ts +2 -0
- package/build/src/library/result-codec.js +12 -0
- package/build/src/markdown/lex.js +9 -2
- package/build/src/markdown/types.d.ts +2 -1
- package/build/src/markdown/types.js +3 -1
- package/build/src/plugin/akuma-signals.d.ts +12 -0
- package/build/src/plugin/akuma-signals.js +14 -0
- package/build/src/plugin/public.d.ts +51 -0
- package/build/src/plugin/public.js +1 -0
- package/build/src/plugin/runtime.d.ts +14 -0
- package/build/src/plugin/runtime.js +357 -0
- package/build/src/protocol/amend.js +3 -3
- package/build/src/protocol/attempt.d.ts +2 -1
- package/build/src/protocol/attempt.js +1 -1
- package/build/src/protocol/audit.d.ts +1 -1
- package/build/src/protocol/audit.js +1 -1
- package/build/src/protocol/bind.d.ts +3 -1
- package/build/src/protocol/bind.js +26 -0
- package/build/src/protocol/completion.js +0 -1
- package/build/src/protocol/deliver.d.ts +1 -1
- package/build/src/protocol/deliver.js +136 -57
- package/build/src/protocol/intent.d.ts +0 -1
- package/build/src/protocol/intent.js +0 -1
- package/build/src/protocol/operations.d.ts +9 -2
- package/build/src/protocol/operations.js +16 -1
- package/build/src/protocol/outcome.d.ts +3 -0
- package/build/src/protocol/outcome.js +17 -1
- package/build/src/protocol/placement.js +10 -3
- package/build/src/protocol/read/status.d.ts +8 -0
- package/build/src/protocol/read/status.js +49 -0
- package/build/src/protocol/reintegrate.js +10 -3
- package/build/src/protocol/result-codec.d.ts +22 -0
- package/build/src/protocol/result-codec.js +442 -0
- package/build/src/protocol/review.d.ts +1 -1
- package/build/src/protocol/review.js +81 -46
- package/build/src/protocol/run.d.ts +22 -2
- package/build/src/protocol/run.js +119 -29
- package/build/src/runtime/proc/lifecycle.js +1 -1
- package/build/src/runtime/proc/line-rpc.d.ts +7 -1
- package/build/src/runtime/proc/line-rpc.js +49 -9
- package/build/src/runtime/proc/run.d.ts +0 -1
- package/build/src/runtime/proc/run.js +1 -11
- package/build/src/runtime/proc/termination.d.ts +1 -0
- package/build/src/runtime/proc/termination.js +63 -18
- package/build/src/runtime/proc/windows-launch.exe +0 -0
- package/build/src/settings.d.ts +10 -0
- package/build/src/settings.js +88 -2
- package/build/src/settlement/result-codec.d.ts +2 -0
- package/build/src/settlement/result-codec.js +56 -0
- package/build/src/settlement/settle.d.ts +5 -12
- package/build/src/settlement/settle.js +60 -55
- package/build/src/task/board.d.ts +3 -0
- package/build/src/task/board.js +22 -4
- package/build/src/task/catalog.d.ts +13 -2
- package/build/src/task/catalog.js +59 -5
- package/build/src/task/compose.d.ts +4 -2
- package/build/src/task/compose.js +56 -30
- package/build/src/task/created-observation.d.ts +39 -0
- package/build/src/task/created-observation.js +26 -0
- package/build/src/task/identity.d.ts +6 -0
- package/build/src/task/identity.js +48 -7
- package/build/src/task/index.d.ts +4 -3
- package/build/src/task/index.js +19 -16
- package/build/src/task/input.d.ts +3 -1
- package/build/src/task/input.js +7 -4
- package/build/src/task/lifecycle-operations.d.ts +6 -0
- package/build/src/task/lifecycle-operations.js +116 -0
- package/build/src/task/mutation-result.d.ts +762 -20
- package/build/src/task/mutation-result.js +34 -9
- package/build/src/task/mutation.d.ts +4 -9
- package/build/src/task/mutation.js +17 -52
- package/build/src/task/operation-types.d.ts +114 -0
- package/build/src/task/operation-types.js +1 -0
- package/build/src/task/operations.d.ts +6 -113
- package/build/src/task/operations.js +75 -117
- package/build/src/task/query.d.ts +8 -11
- package/build/src/task/query.js +7 -14
- package/build/src/task/store.d.ts +11 -1
- package/build/src/task/store.js +169 -55
- package/build/src/task/view.d.ts +4 -0
- package/build/src/task/view.js +7 -0
- package/build/src/verification/declaration.d.ts +1 -0
- package/build/src/verification/declaration.js +18 -1
- package/build/src/verification/execution.d.ts +0 -1
- package/build/src/verification/execution.js +5 -5
- package/build/src/world.d.ts +0 -2
- package/build/src/world.js +3 -7
- package/package.json +17 -5
- package/build/src/cli/square-edge.d.ts +0 -7
- package/build/src/cli/square-edge.js +0 -159
- package/build/src/git/ref-migration.d.ts +0 -22
- package/build/src/git/ref-migration.js +0 -55
- package/build/src/library/contract-forwarding-reconciliation-result.d.ts +0 -102
- package/build/src/library/contract-forwarding-reconciliation-result.js +0 -92
- package/build/src/library/contract-forwarding-result.d.ts +0 -4270
- package/build/src/library/contract-forwarding-result.js +0 -521
|
@@ -1,16 +1,23 @@
|
|
|
1
|
-
import { isTaskSegment,
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
547
|
-
export declare function
|
|
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
|
|
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
|
-
|
|
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
|
|
185
|
+
result: await port.task({
|
|
210
186
|
world,
|
|
211
187
|
request: request.request,
|
|
212
|
-
requester:
|
|
213
|
-
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:
|
|
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
|
|
7
|
-
|
|
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
|
|
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
|
|
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;
|