@devflow-tools/sdk 0.17.2 → 0.17.4

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 (52) hide show
  1. package/dist/action-lease.d.ts +65 -0
  2. package/dist/action-lease.d.ts.map +1 -0
  3. package/dist/action-lease.js +153 -0
  4. package/dist/action-lease.js.map +1 -0
  5. package/dist/action-lease.test.d.ts +2 -0
  6. package/dist/action-lease.test.d.ts.map +1 -0
  7. package/dist/action-lease.test.js +67 -0
  8. package/dist/action-lease.test.js.map +1 -0
  9. package/dist/canonical-action-binding.d.ts.map +1 -1
  10. package/dist/canonical-action-binding.js +29 -1
  11. package/dist/canonical-action-binding.js.map +1 -1
  12. package/dist/canonical-action-binding.test.d.ts +2 -0
  13. package/dist/canonical-action-binding.test.d.ts.map +1 -0
  14. package/dist/canonical-action-binding.test.js +42 -0
  15. package/dist/canonical-action-binding.test.js.map +1 -0
  16. package/dist/capability-rollout.d.ts +56 -0
  17. package/dist/capability-rollout.d.ts.map +1 -1
  18. package/dist/capability-rollout.js +178 -1
  19. package/dist/capability-rollout.js.map +1 -1
  20. package/dist/index.d.ts +5 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +5 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/semantic-resolution.d.ts +104 -0
  25. package/dist/semantic-resolution.d.ts.map +1 -0
  26. package/dist/semantic-resolution.js +178 -0
  27. package/dist/semantic-resolution.js.map +1 -0
  28. package/dist/semantic-resolution.test.d.ts +2 -0
  29. package/dist/semantic-resolution.test.d.ts.map +1 -0
  30. package/dist/semantic-resolution.test.js +106 -0
  31. package/dist/semantic-resolution.test.js.map +1 -0
  32. package/dist/task-runtime-reducer.d.ts +3 -0
  33. package/dist/task-runtime-reducer.d.ts.map +1 -0
  34. package/dist/task-runtime-reducer.js +219 -0
  35. package/dist/task-runtime-reducer.js.map +1 -0
  36. package/dist/task-runtime-store.d.ts +34 -0
  37. package/dist/task-runtime-store.d.ts.map +1 -0
  38. package/dist/task-runtime-store.js +126 -0
  39. package/dist/task-runtime-store.js.map +1 -0
  40. package/dist/task-runtime.d.ts +114 -0
  41. package/dist/task-runtime.d.ts.map +1 -0
  42. package/dist/task-runtime.js +157 -0
  43. package/dist/task-runtime.js.map +1 -0
  44. package/dist/task-runtime.test.d.ts +2 -0
  45. package/dist/task-runtime.test.d.ts.map +1 -0
  46. package/dist/task-runtime.test.js +60 -0
  47. package/dist/task-runtime.test.js.map +1 -0
  48. package/dist/types/task-context-envelope.d.ts +8 -0
  49. package/dist/types/task-context-envelope.d.ts.map +1 -1
  50. package/dist/types/task-semantic-control.d.ts +6 -2
  51. package/dist/types/task-semantic-control.d.ts.map +1 -1
  52. package/package.json +3 -3
@@ -0,0 +1,106 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createTaskSemanticFrameV2, projectSemanticFrameToLegacyIntent, semanticEvidenceId, semanticTextHash, } from './semantic-resolution.js';
3
+ describe('semantic resolution contracts', () => {
4
+ it('accepts a valid resolved analysis frame', () => {
5
+ const prompt = 'explain the cache design';
6
+ const frame = createTaskSemanticFrameV2(frameInput(prompt), prompt);
7
+ expect(frame.frameHash).toMatch(/^[a-f0-9]{64}$/u);
8
+ expect(projectSemanticFrameToLegacyIntent(frame)).toEqual({
9
+ intent: 'understand', action: 'analyze', mutating: false,
10
+ });
11
+ });
12
+ it('rejects a forged source span', () => {
13
+ const prompt = 'publish 0.18.0';
14
+ const evidence = span(prompt, 'publish', 'action', 'release');
15
+ evidence.textHash = semanticTextHash('forged');
16
+ expect(() => createTaskSemanticFrameV2(frameInput(prompt, {
17
+ primaryIntent: 'feature',
18
+ primaryAction: 'release',
19
+ mutationPermission: 'explicitly_authorized',
20
+ evidence: [evidence],
21
+ }), prompt)).toThrow('SEMANTIC_EVIDENCE_HASH_MISMATCH');
22
+ });
23
+ it('rejects model-only mutation with no action span', () => {
24
+ const prompt = 'ship it';
25
+ expect(() => createTaskSemanticFrameV2(frameInput(prompt, {
26
+ primaryIntent: 'feature',
27
+ primaryAction: 'release',
28
+ mutationPermission: 'explicitly_authorized',
29
+ }), prompt)).toThrow('SEMANTIC_ACTION_EVIDENCE_REQUIRED');
30
+ });
31
+ it('preserves conditional steps as non-authorized', () => {
32
+ const prompt = 'if tests pass, publish';
33
+ const condition = span(prompt, 'if tests pass', 'condition', 'tests_pass');
34
+ const action = span(prompt, 'publish', 'action', 'release');
35
+ const frame = createTaskSemanticFrameV2(frameInput(prompt, {
36
+ primaryIntent: 'feature',
37
+ primaryAction: 'release',
38
+ mutationPermission: 'conditional',
39
+ evidence: [condition, action],
40
+ steps: [{
41
+ order: 0,
42
+ action: 'release',
43
+ condition: 'tests_pass',
44
+ mutationPermission: 'conditional',
45
+ evidenceIds: [semanticEvidenceId(condition), semanticEvidenceId(action)],
46
+ }],
47
+ }), prompt);
48
+ expect(projectSemanticFrameToLegacyIntent(frame)).toEqual({
49
+ intent: 'feature', action: 'analyze', mutating: false,
50
+ });
51
+ });
52
+ it('projects an abstained frame to non-mutating analyze', () => {
53
+ const prompt = 'do it';
54
+ const frame = createTaskSemanticFrameV2(frameInput(prompt, {
55
+ state: 'abstained',
56
+ primaryIntent: 'unknown',
57
+ primaryAction: 'modify',
58
+ mutationPermission: 'ambiguous',
59
+ outOfScope: true,
60
+ }), prompt);
61
+ expect(projectSemanticFrameToLegacyIntent(frame)).toEqual({
62
+ intent: 'unknown', action: 'analyze', mutating: false,
63
+ });
64
+ });
65
+ });
66
+ function frameInput(prompt, overrides = {}) {
67
+ return {
68
+ schemaVersion: 'task-semantic-frame.v2',
69
+ sourceHash: semanticTextHash(prompt),
70
+ state: 'resolved',
71
+ primaryIntent: 'understand',
72
+ primaryAction: 'analyze',
73
+ mutationPermission: 'not_requested',
74
+ intents: ['understand'],
75
+ entities: [],
76
+ targetAnchors: [],
77
+ constraints: [],
78
+ negations: [],
79
+ steps: [],
80
+ memoryDirective: 'none',
81
+ knowledgeNeeds: [],
82
+ outOfScope: false,
83
+ confidence: { overall: 0.9, perField: { intent: 0.9 } },
84
+ evidence: [],
85
+ resolver: {
86
+ generatedBy: 'deterministic',
87
+ routeCatalogVersion: 'test-catalog.v1',
88
+ thresholdVersion: 'test-threshold.v1',
89
+ },
90
+ createdAt: 1,
91
+ ...overrides,
92
+ };
93
+ }
94
+ function span(prompt, text, field, value) {
95
+ const start = prompt.indexOf(text);
96
+ return {
97
+ field,
98
+ source: 'lexical_feature',
99
+ value,
100
+ start,
101
+ end: start + text.length,
102
+ textHash: semanticTextHash(text),
103
+ confidence: 1,
104
+ };
105
+ }
106
+ //# sourceMappingURL=semantic-resolution.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-resolution.test.js","sourceRoot":"","sources":["../src/semantic-resolution.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type TaskRuntimeEventV1, type TaskRuntimeSnapshotV1, type TaskSpecV1 } from './task-runtime.js';
2
+ export declare function reduceTaskRuntime(taskSpec: TaskSpecV1, events: TaskRuntimeEventV1[]): TaskRuntimeSnapshotV1;
3
+ //# sourceMappingURL=task-runtime-reducer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-runtime-reducer.d.ts","sourceRoot":"","sources":["../src/task-runtime-reducer.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EAEhB,MAAM,mBAAmB,CAAC;AAE3B,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,kBAAkB,EAAE,GAC3B,qBAAqB,CAmCvB"}
@@ -0,0 +1,219 @@
1
+ import { assertTaskRuntimeEventV1, assertTaskRuntimeSnapshotV1, stableRuntimeHash, } from './task-runtime.js';
2
+ export function reduceTaskRuntime(taskSpec, events) {
3
+ if (events.length === 0)
4
+ throw new Error('TASK_RUNTIME_EVENT_STREAM_EMPTY');
5
+ const state = initialState(taskSpec);
6
+ for (const [index, event] of events.entries()) {
7
+ assertTaskRuntimeEventV1(event);
8
+ if (event.sequence !== index + 1)
9
+ throw new Error(`TASK_RUNTIME_SEQUENCE_GAP:${index + 1}`);
10
+ if (event.taskSpecHash !== taskSpec.specHash)
11
+ throw new Error('TASK_RUNTIME_SPEC_MISMATCH');
12
+ if (!sameIdentity(event.identity, taskSpec.identity))
13
+ throw new Error('TASK_RUNTIME_IDENTITY_MISMATCH');
14
+ applyEvent(state, event);
15
+ }
16
+ const last = events.at(-1);
17
+ const terminal = terminalOutcome(state);
18
+ const body = {
19
+ schemaVersion: 'task-runtime-snapshot.v1',
20
+ producer: 'devflow-task-runtime-reducer',
21
+ producerVersion: '1.0.0',
22
+ identity: taskSpec.identity,
23
+ taskSpecHash: taskSpec.specHash,
24
+ lastEventSequence: last.sequence,
25
+ artifacts: state.artifacts,
26
+ channels: state.channels,
27
+ ...(state.contextReceiptId ? { contextReceiptId: state.contextReceiptId } : {}),
28
+ action: state.action,
29
+ verification: state.verification,
30
+ memory: state.memory,
31
+ durableWorkIds: [...state.durableWorkOwners.keys()].sort(),
32
+ terminal,
33
+ runtimeHealth: state.runtimeHealth,
34
+ updatedAt: last.createdAt,
35
+ };
36
+ const snapshot = { ...body, snapshotHash: stableRuntimeHash(body) };
37
+ assertTaskRuntimeSnapshotV1(snapshot);
38
+ return snapshot;
39
+ }
40
+ function initialState(taskSpec) {
41
+ return {
42
+ artifacts: {
43
+ requiredIdentityIds: [...taskSpec.artifacts.requiredIdentityIds],
44
+ resolvedIdentityIds: [],
45
+ ambiguousIdentityIds: [],
46
+ },
47
+ channels: {},
48
+ action: obligation(taskSpec.obligations.action),
49
+ verification: obligation(taskSpec.obligations.verification),
50
+ memory: { requirement: 'required', state: 'pending' },
51
+ durableWorkOwners: new Map(),
52
+ runtimeHealth: 'healthy',
53
+ };
54
+ }
55
+ function obligation(requirement) {
56
+ return { requirement, state: requirement === 'not_required' ? 'satisfied' : 'pending' };
57
+ }
58
+ function applyEvent(state, event) {
59
+ const payload = event.payload;
60
+ switch (event.kind) {
61
+ case 'task.spec.bound':
62
+ case 'action.lease.issued':
63
+ return;
64
+ case 'context.completed':
65
+ state.channels = readChannels(payload.channels);
66
+ state.artifacts = readArtifacts(payload.artifacts, state.artifacts);
67
+ state.contextReceiptId = optionalString(payload.contextReceiptId);
68
+ state.runtimeHealth = mergeHealth(state.runtimeHealth, readHealth(payload.runtimeHealth));
69
+ return;
70
+ case 'action.started':
71
+ state.action = withReceipt(state.action, 'pending', payload);
72
+ return;
73
+ case 'action.succeeded':
74
+ state.action = withReceipt(state.action, 'satisfied', payload);
75
+ return;
76
+ case 'action.failed':
77
+ state.action = withReceipt(state.action, 'failed', payload);
78
+ return;
79
+ case 'verification.succeeded':
80
+ state.verification = withReceipt(state.verification, 'satisfied', payload);
81
+ return;
82
+ case 'verification.failed':
83
+ state.verification = withReceipt(state.verification, 'failed', payload);
84
+ return;
85
+ case 'memory.committed':
86
+ case 'memory.skipped':
87
+ state.memory = withReceipt(state.memory, 'satisfied', payload);
88
+ return;
89
+ case 'memory.pending':
90
+ state.memory = withReceipt(state.memory, 'pending', payload);
91
+ return;
92
+ case 'memory.failed':
93
+ state.memory = withReceipt(state.memory, 'failed', payload);
94
+ return;
95
+ case 'durable_work.owned':
96
+ state.durableWorkOwners.set(requiredString(payload.workId, 'workId'), requiredString(payload.obligation, 'obligation'));
97
+ return;
98
+ case 'durable_work.completed':
99
+ state.durableWorkOwners.delete(requiredString(payload.workId, 'workId'));
100
+ return;
101
+ case 'durable_work.dead_lettered':
102
+ state.durableWorkOwners.delete(requiredString(payload.workId, 'workId'));
103
+ failObligation(state, optionalString(payload.obligation));
104
+ state.runtimeHealth = mergeHealth(state.runtimeHealth, 'degraded');
105
+ }
106
+ }
107
+ function terminalOutcome(state) {
108
+ const obligations = [state.action, state.verification, state.memory];
109
+ const requiredChannels = Object.values(state.channels)
110
+ .filter((channel) => channel?.requirement === 'required');
111
+ const permanentFailure = obligations.some(item => item.requirement === 'required' && item.state === 'failed')
112
+ || requiredChannels.some(item => item.status === 'failed');
113
+ if (permanentFailure)
114
+ return 'failed';
115
+ const incomplete = [
116
+ ...(state.action.requirement === 'required' && state.action.state === 'pending' ? ['action'] : []),
117
+ ...(state.verification.requirement === 'required' && state.verification.state === 'pending' ? ['verification'] : []),
118
+ ...(state.memory.requirement === 'required' && state.memory.state === 'pending' ? ['memory'] : []),
119
+ ...requiredChannels.filter(item => !channelSatisfied(item)).map(item => `channel:${channelName(state, item)}`),
120
+ ];
121
+ const ownedObligations = new Set(state.durableWorkOwners.values());
122
+ if (incomplete.length > 0 && incomplete.every(item => ownedObligations.has(item)))
123
+ return 'retry_pending';
124
+ if (incomplete.length > 0)
125
+ return 'failed';
126
+ const materialDegradation = state.runtimeHealth !== 'healthy'
127
+ || obligations.some(item => item.state === 'degraded')
128
+ || Object.values(state.channels).some(item => item?.material && item.status === 'degraded');
129
+ return materialDegradation ? 'completed_with_degradation' : 'completed';
130
+ }
131
+ function channelName(state, target) {
132
+ return (Object.entries(state.channels).find(([, value]) => value === target)?.[0]) ?? 'unknown';
133
+ }
134
+ function channelSatisfied(channel) {
135
+ return channel.status === 'satisfied'
136
+ || channel.status === 'intentional_abstention'
137
+ || channel.status === 'empty_valid'
138
+ || channel.status === 'degraded';
139
+ }
140
+ function withReceipt(current, state, payload) {
141
+ return {
142
+ ...current,
143
+ state,
144
+ ...(optionalString(payload.receiptId) ? { receiptId: optionalString(payload.receiptId) } : {}),
145
+ ...(optionalString(payload.reasonCode) ? { reasonCode: optionalString(payload.reasonCode) } : {}),
146
+ };
147
+ }
148
+ function failObligation(state, obligationName) {
149
+ if (obligationName === 'action')
150
+ state.action = { ...state.action, state: 'failed', reasonCode: 'dead_lettered' };
151
+ if (obligationName === 'verification')
152
+ state.verification = { ...state.verification, state: 'failed', reasonCode: 'dead_lettered' };
153
+ if (obligationName === 'memory')
154
+ state.memory = { ...state.memory, state: 'failed', reasonCode: 'dead_lettered' };
155
+ }
156
+ function readChannels(value) {
157
+ if (value === undefined)
158
+ return {};
159
+ const source = record(value, 'channels');
160
+ const result = {};
161
+ for (const channel of ['code', 'memory', 'knowledge']) {
162
+ if (source[channel] === undefined)
163
+ continue;
164
+ const item = record(source[channel], `channels.${channel}`);
165
+ result[channel] = {
166
+ requirement: oneOf(item.requirement, ['required', 'optional', 'not_required'], `channels.${channel}.requirement`),
167
+ status: oneOf(item.status, ['satisfied', 'intentional_abstention', 'empty_valid', 'degraded', 'failed'], `channels.${channel}.status`),
168
+ reasonCode: requiredString(item.reasonCode, `channels.${channel}.reasonCode`),
169
+ evidenceIds: stringArray(item.evidenceIds, `channels.${channel}.evidenceIds`),
170
+ material: Boolean(item.material),
171
+ };
172
+ }
173
+ return result;
174
+ }
175
+ function readArtifacts(value, fallback) {
176
+ if (value === undefined)
177
+ return fallback;
178
+ const item = record(value, 'artifacts');
179
+ return {
180
+ requiredIdentityIds: stringArray(item.requiredIdentityIds, 'artifacts.requiredIdentityIds'),
181
+ resolvedIdentityIds: stringArray(item.resolvedIdentityIds, 'artifacts.resolvedIdentityIds'),
182
+ ambiguousIdentityIds: stringArray(item.ambiguousIdentityIds, 'artifacts.ambiguousIdentityIds'),
183
+ };
184
+ }
185
+ function readHealth(value) {
186
+ return value === undefined ? 'healthy' : oneOf(value, ['healthy', 'degraded', 'unavailable'], 'runtimeHealth');
187
+ }
188
+ function mergeHealth(current, next) {
189
+ const rank = { healthy: 0, degraded: 1, unavailable: 2 };
190
+ return rank[next] > rank[current] ? next : current;
191
+ }
192
+ function sameIdentity(left, right) {
193
+ return stableRuntimeHash(left) === stableRuntimeHash(right);
194
+ }
195
+ function record(value, field) {
196
+ if (!value || typeof value !== 'object' || Array.isArray(value))
197
+ throw new Error(`TASK_RUNTIME_PAYLOAD_INVALID:${field}`);
198
+ return value;
199
+ }
200
+ function requiredString(value, field) {
201
+ if (typeof value !== 'string' || !value.trim())
202
+ throw new Error(`TASK_RUNTIME_PAYLOAD_INVALID:${field}`);
203
+ return value;
204
+ }
205
+ function optionalString(value) {
206
+ return typeof value === 'string' && value.trim() ? value : undefined;
207
+ }
208
+ function stringArray(value, field) {
209
+ if (!Array.isArray(value) || value.some(item => typeof item !== 'string' || !item.trim())) {
210
+ throw new Error(`TASK_RUNTIME_PAYLOAD_INVALID:${field}`);
211
+ }
212
+ return [...value];
213
+ }
214
+ function oneOf(value, values, field) {
215
+ if (typeof value !== 'string' || !values.includes(value))
216
+ throw new Error(`TASK_RUNTIME_PAYLOAD_INVALID:${field}`);
217
+ return value;
218
+ }
219
+ //# sourceMappingURL=task-runtime-reducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-runtime-reducer.js","sourceRoot":"","sources":["../src/task-runtime-reducer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type DevFlowDatabase } from '@devflow-tools/database';
2
+ import { type TaskRuntimeEventKind, type TaskRuntimeEventV1, type TaskRuntimeSnapshotV1, type TaskSpecV1 } from './task-runtime.js';
3
+ export type EvidenceRuntimeMode = 'off' | 'shadow' | 'project';
4
+ export interface AppendTaskRuntimeBoundaryInput {
5
+ projectRoot: string;
6
+ taskSpec?: TaskSpecV1;
7
+ identity?: TaskRuntimeEventV1['identity'];
8
+ kind: TaskRuntimeEventKind;
9
+ payload?: Record<string, unknown>;
10
+ dedupeKey: string;
11
+ producer: string;
12
+ producerVersion?: string;
13
+ createdAt?: number;
14
+ database?: DevFlowDatabase;
15
+ env?: NodeJS.ProcessEnv;
16
+ }
17
+ export interface AppendedTaskRuntimeBoundary {
18
+ mode: Exclude<EvidenceRuntimeMode, 'off'>;
19
+ event: TaskRuntimeEventV1;
20
+ snapshot: TaskRuntimeSnapshotV1;
21
+ replayed: boolean;
22
+ }
23
+ export interface AppendTaskRuntimeBoundaryForTaskInput extends Omit<AppendTaskRuntimeBoundaryInput, 'taskSpec' | 'identity' | 'database'> {
24
+ sessionId: string;
25
+ turnId: string;
26
+ database?: DevFlowDatabase;
27
+ }
28
+ /** Append from an already-bound runtime stream without rebuilding host identity. */
29
+ export declare function appendTaskRuntimeBoundaryForTask(input: AppendTaskRuntimeBoundaryForTaskInput): AppendedTaskRuntimeBoundary | null;
30
+ export declare function resolveEvidenceRuntimeMode(projectRoot: string, env?: NodeJS.ProcessEnv): EvidenceRuntimeMode;
31
+ export declare function evidenceRuntimeProjectHash(projectRoot: string): string;
32
+ export declare function appendTaskRuntimeBoundary(input: AppendTaskRuntimeBoundaryInput): AppendedTaskRuntimeBoundary | null;
33
+ export declare function loadTaskSpec(database: DevFlowDatabase, identity?: TaskRuntimeEventV1['identity']): TaskSpecV1;
34
+ //# sourceMappingURL=task-runtime-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-runtime-store.d.ts","sourceRoot":"","sources":["../src/task-runtime-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,8BAA8B;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,QAAQ,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,EAAE,oBAAoB,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,OAAO,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;IAC1C,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,qBAAqB,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,qCAAsC,SAAQ,IAAI,CACjE,8BAA8B,EAC9B,UAAU,GAAG,UAAU,GAAG,UAAU,CACrC;IACC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,oFAAoF;AACpF,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,qCAAqC,GAC3C,2BAA2B,GAAG,IAAI,CAkBpC;AAED,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,mBAAmB,CAOrB;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAItE;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,8BAA8B,GACpC,2BAA2B,GAAG,IAAI,CAuEpC;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,eAAe,EACzB,QAAQ,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,GACxC,UAAU,CAUZ"}
@@ -0,0 +1,126 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { realpathSync } from 'node:fs';
3
+ import { openGlobalDevFlowDatabase, } from '@devflow-tools/database';
4
+ import { assertTaskSpecV1, stableRuntimeHash, } from './task-runtime.js';
5
+ import { reduceTaskRuntime } from './task-runtime-reducer.js';
6
+ /** Append from an already-bound runtime stream without rebuilding host identity. */
7
+ export function appendTaskRuntimeBoundaryForTask(input) {
8
+ const ownsDatabase = !input.database;
9
+ const database = input.database ?? openGlobalDevFlowDatabase(undefined, { busyTimeoutMs: 250 });
10
+ try {
11
+ const first = database.listTaskRuntimeEvents(input.projectRoot, input.sessionId, input.turnId)[0];
12
+ const taskSpec = first?.payload.taskSpec;
13
+ if (!taskSpec || typeof taskSpec !== 'object' || Array.isArray(taskSpec)) {
14
+ throw new Error('TASK_RUNTIME_SPEC_EVENT_MISSING');
15
+ }
16
+ const { sessionId: _sessionId, turnId: _turnId, database: _database, ...boundary } = input;
17
+ return appendTaskRuntimeBoundary({
18
+ ...boundary,
19
+ taskSpec: taskSpec,
20
+ database,
21
+ });
22
+ }
23
+ finally {
24
+ if (ownsDatabase)
25
+ database.close();
26
+ }
27
+ }
28
+ export function resolveEvidenceRuntimeMode(projectRoot, env = process.env) {
29
+ const requested = env.DEVFLOW_EVIDENCE_RUNTIME_MODE;
30
+ if (requested !== 'shadow' && requested !== 'project')
31
+ return 'off';
32
+ if (requested === 'shadow')
33
+ return 'shadow';
34
+ const allowed = new Set((env.DEVFLOW_EVIDENCE_RUNTIME_PROJECTS ?? '')
35
+ .split(',').map(value => value.trim()).filter(Boolean));
36
+ return allowed.has(evidenceRuntimeProjectHash(projectRoot)) ? 'project' : 'off';
37
+ }
38
+ export function evidenceRuntimeProjectHash(projectRoot) {
39
+ let canonical = projectRoot;
40
+ try {
41
+ canonical = realpathSync(projectRoot);
42
+ }
43
+ catch { /* Non-existent roots remain fail-closed for project mode. */ }
44
+ return createHash('sha256').update(canonical).digest('hex');
45
+ }
46
+ export function appendTaskRuntimeBoundary(input) {
47
+ const mode = resolveEvidenceRuntimeMode(input.projectRoot, input.env);
48
+ if (mode === 'off')
49
+ return null;
50
+ const ownsDatabase = !input.database;
51
+ const database = input.database ?? openGlobalDevFlowDatabase(undefined, { busyTimeoutMs: 250 });
52
+ try {
53
+ const taskSpec = input.taskSpec ?? loadTaskSpec(database, input.identity);
54
+ assertTaskSpecV1(taskSpec);
55
+ if (input.identity && stableRuntimeHash(input.identity) !== stableRuntimeHash(taskSpec.identity)) {
56
+ throw new Error('TASK_RUNTIME_IDENTITY_MISMATCH');
57
+ }
58
+ const eventId = `task-runtime:${stableRuntimeHash({
59
+ identity: taskSpec.identity,
60
+ kind: input.kind,
61
+ dedupeKey: input.dedupeKey,
62
+ }).slice(0, 32)}`;
63
+ const existing = database.getTaskRuntimeEvent(eventId);
64
+ if (existing) {
65
+ const expectedPayload = input.kind === 'task.spec.bound'
66
+ ? { ...(input.payload ?? {}), taskSpec }
67
+ : input.payload ?? {};
68
+ if (existing.kind !== input.kind
69
+ || existing.taskSpecHash !== taskSpec.specHash
70
+ || stableRuntimeHash(existing.payload) !== stableRuntimeHash(expectedPayload)) {
71
+ throw new Error(`TASK_RUNTIME_EVENT_CONFLICT:${eventId}`);
72
+ }
73
+ const snapshot = database.getTaskRuntimeSnapshot(taskSpec.identity.projectRoot, taskSpec.identity.sessionId, taskSpec.identity.turnId);
74
+ if (!snapshot)
75
+ throw new Error('TASK_RUNTIME_SNAPSHOT_MISSING');
76
+ return { mode, event: existing, snapshot: snapshot, replayed: true };
77
+ }
78
+ let previous = database.listTaskRuntimeEvents(taskSpec.identity.projectRoot, taskSpec.identity.sessionId, taskSpec.identity.turnId);
79
+ if (previous.length === 0 && input.kind !== 'task.spec.bound') {
80
+ appendTaskRuntimeBoundary({
81
+ ...input,
82
+ taskSpec,
83
+ identity: taskSpec.identity,
84
+ kind: 'task.spec.bound',
85
+ payload: {},
86
+ dedupeKey: taskSpec.specHash,
87
+ producer: 'task-runtime-bootstrap',
88
+ createdAt: taskSpec.createdAt,
89
+ database,
90
+ });
91
+ previous = database.listTaskRuntimeEvents(taskSpec.identity.projectRoot, taskSpec.identity.sessionId, taskSpec.identity.turnId);
92
+ }
93
+ const event = {
94
+ schemaVersion: 'task-runtime-event.v1',
95
+ producer: input.producer,
96
+ producerVersion: input.producerVersion ?? '1.0.0',
97
+ eventId,
98
+ sequence: previous.length + 1,
99
+ identity: taskSpec.identity,
100
+ taskSpecHash: taskSpec.specHash,
101
+ kind: input.kind,
102
+ payload: input.kind === 'task.spec.bound'
103
+ ? { ...(input.payload ?? {}), taskSpec }
104
+ : input.payload ?? {},
105
+ createdAt: input.createdAt ?? Date.now(),
106
+ };
107
+ const snapshot = reduceTaskRuntime(taskSpec, [...previous, event]);
108
+ const persisted = database.appendTaskRuntimeEventAndSnapshot(event, snapshot);
109
+ return { mode, event, snapshot: persisted, replayed: false };
110
+ }
111
+ finally {
112
+ if (ownsDatabase)
113
+ database.close();
114
+ }
115
+ }
116
+ export function loadTaskSpec(database, identity) {
117
+ if (!identity)
118
+ throw new Error('TASK_RUNTIME_IDENTITY_REQUIRED');
119
+ const first = database.listTaskRuntimeEvents(identity.projectRoot, identity.sessionId, identity.turnId)[0];
120
+ const candidate = first?.payload.taskSpec;
121
+ if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {
122
+ throw new Error('TASK_RUNTIME_SPEC_EVENT_MISSING');
123
+ }
124
+ return candidate;
125
+ }
126
+ //# sourceMappingURL=task-runtime-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-runtime-store.js","sourceRoot":"","sources":["../src/task-runtime-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EACL,yBAAyB,GAE1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,GAKlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAkC9D,oFAAoF;AACpF,MAAM,UAAU,gCAAgC,CAC9C,KAA4C;IAE5C,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,yBAAyB,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAChG,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,qBAAqB,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClG,MAAM,QAAQ,GAAG,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC;QACzC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC;QAC3F,OAAO,yBAAyB,CAAC;YAC/B,GAAG,QAAQ;YACX,QAAQ,EAAE,QAAiC;YAC3C,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,YAAY;YAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,WAAmB,EACnB,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,SAAS,GAAG,GAAG,CAAC,6BAA6B,CAAC;IACpD,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,SAAS,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,iCAAiC,IAAI,EAAE,CAAC;SAClE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,WAAmB;IAC5D,IAAI,SAAS,GAAG,WAAW,CAAC;IAC5B,IAAI,CAAC;QAAC,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,6DAA6D,CAAC,CAAC;IACtH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,KAAqC;IAErC,MAAM,IAAI,GAAG,0BAA0B,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACtE,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,yBAAyB,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAChG,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1E,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3B,IAAI,KAAK,CAAC,QAAQ,IAAI,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjG,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,OAAO,GAAG,gBAAgB,iBAAiB,CAAC;YAChD,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,KAAK,iBAAiB;gBACtD,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE;gBACxC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;YACxB,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;mBAC3B,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAAC,QAAQ;mBAC3C,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,iBAAiB,CAAC,eAAe,CAAC,EAAE,CAAC;gBAChF,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,sBAAsB,CAC9C,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CACrF,CAAC;YACF,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAChE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAA8B,EAAE,QAAQ,EAAE,QAAiC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACtH,CAAC;QACD,IAAI,QAAQ,GAAG,QAAQ,CAAC,qBAAqB,CAC3C,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAC7D,CAAC;QAC1B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC9D,yBAAyB,CAAC;gBACxB,GAAG,KAAK;gBACR,QAAQ;gBACR,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,EAAE;gBACX,SAAS,EAAE,QAAQ,CAAC,QAAQ;gBAC5B,QAAQ,EAAE,wBAAwB;gBAClC,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,QAAQ;aACT,CAAC,CAAC;YACH,QAAQ,GAAG,QAAQ,CAAC,qBAAqB,CACvC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAC7D,CAAC;QAC5B,CAAC;QACD,MAAM,KAAK,GAAuB;YAChC,aAAa,EAAE,uBAAuB;YACtC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,OAAO;YACjD,OAAO;YACP,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;YAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,YAAY,EAAE,QAAQ,CAAC,QAAQ;YAC/B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,IAAI,KAAK,iBAAiB;gBACvC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE;gBACxC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE;YACvB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;SACzC,CAAC;QACF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QACnE,MAAM,SAAS,GAAG,QAAQ,CAAC,iCAAiC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC9E,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAkC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACxF,CAAC;YAAS,CAAC;QACT,IAAI,YAAY;YAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAyB,EACzB,QAAyC;IAEzC,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,QAAQ,CAAC,qBAAqB,CAC1C,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAC1D,CAAC,CAAC,CAAC,CAAC;IACL,MAAM,SAAS,GAAG,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC;IAC1C,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,SAAkC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,114 @@
1
+ import type { CanonicalTaskIdentity, ImmutableTaskIntentArtifact, IntentEvidence } from './types/task-semantic-control.js';
2
+ import type { CanonicalTaskIntent } from './types/task-context-envelope.js';
3
+ import type { RetrievalTaskAction } from './types/memory.js';
4
+ export declare const TASK_SPEC_SCHEMA: "task-spec.v1";
5
+ export declare const TASK_RUNTIME_EVENT_SCHEMA: "task-runtime-event.v1";
6
+ export declare const TASK_RUNTIME_SNAPSHOT_SCHEMA: "task-runtime-snapshot.v1";
7
+ export type ArtifactKind = 'component' | 'page' | 'route' | 'module' | 'test' | 'config' | 'resource' | 'source';
8
+ export type ChannelRequirement = 'required' | 'optional' | 'not_required';
9
+ export type ChannelResultStatus = 'satisfied' | 'intentional_abstention' | 'empty_valid' | 'degraded' | 'failed';
10
+ export type TerminalOutcome = 'running' | 'retry_pending' | 'completed' | 'completed_with_degradation' | 'failed';
11
+ export type RuntimeHealth = 'healthy' | 'degraded' | 'unavailable';
12
+ export type ObligationState = 'pending' | 'satisfied' | 'degraded' | 'failed';
13
+ export interface TaskSpecV1 {
14
+ schemaVersion: typeof TASK_SPEC_SCHEMA;
15
+ producer: string;
16
+ producerVersion: string;
17
+ identity: CanonicalTaskIdentity;
18
+ revision: number;
19
+ supersedesSpecHash?: string;
20
+ source: {
21
+ rawPromptRef: string;
22
+ normalizedPrompt: string;
23
+ sourceEventIds: string[];
24
+ sourceHash: string;
25
+ };
26
+ intent: {
27
+ kind: CanonicalTaskIntent;
28
+ action: RetrievalTaskAction;
29
+ explicitCommand?: string;
30
+ entities: string[];
31
+ constraints: string[];
32
+ evidence: IntentEvidence[];
33
+ };
34
+ artifacts: {
35
+ explicitAnchors: string[];
36
+ requestedKinds: ArtifactKind[];
37
+ requiredIdentityIds: string[];
38
+ ambiguityPolicy: 'reject' | 'request_disambiguation';
39
+ };
40
+ obligations: {
41
+ action: 'required' | 'not_required';
42
+ verification: 'required' | 'optional' | 'not_required';
43
+ memoryDecision: 'required';
44
+ knowledge: 'explicit' | 'automatic' | 'not_applicable';
45
+ };
46
+ budgets: {
47
+ hookDeadlineMs: number;
48
+ contextTokens: number;
49
+ responseReserveTokens: number;
50
+ perChannelMs: Partial<Record<'code' | 'memory' | 'knowledge', number>>;
51
+ };
52
+ specHash: string;
53
+ createdAt: number;
54
+ }
55
+ export type TaskRuntimeEventKind = 'task.spec.bound' | 'context.completed' | 'action.lease.issued' | 'action.started' | 'action.succeeded' | 'action.failed' | 'verification.succeeded' | 'verification.failed' | 'memory.committed' | 'memory.skipped' | 'memory.pending' | 'memory.failed' | 'durable_work.owned' | 'durable_work.completed' | 'durable_work.dead_lettered';
56
+ export interface TaskRuntimeEventV1 {
57
+ schemaVersion: typeof TASK_RUNTIME_EVENT_SCHEMA;
58
+ producer: string;
59
+ producerVersion: string;
60
+ eventId: string;
61
+ sequence: number;
62
+ identity: CanonicalTaskIdentity;
63
+ taskSpecHash: string;
64
+ kind: TaskRuntimeEventKind;
65
+ payload: Record<string, unknown>;
66
+ createdAt: number;
67
+ }
68
+ export interface ChannelRuntimeState {
69
+ requirement: ChannelRequirement;
70
+ status: ChannelResultStatus;
71
+ reasonCode: string;
72
+ evidenceIds: string[];
73
+ material: boolean;
74
+ }
75
+ export interface ObligationRuntimeState {
76
+ requirement: ChannelRequirement;
77
+ state: ObligationState;
78
+ receiptId?: string;
79
+ reasonCode?: string;
80
+ }
81
+ export interface ArtifactResolutionSummary {
82
+ requiredIdentityIds: string[];
83
+ resolvedIdentityIds: string[];
84
+ ambiguousIdentityIds: string[];
85
+ }
86
+ export interface TaskRuntimeSnapshotV1 {
87
+ schemaVersion: typeof TASK_RUNTIME_SNAPSHOT_SCHEMA;
88
+ producer: string;
89
+ producerVersion: string;
90
+ identity: CanonicalTaskIdentity;
91
+ taskSpecHash: string;
92
+ lastEventSequence: number;
93
+ artifacts: ArtifactResolutionSummary;
94
+ channels: Partial<Record<'code' | 'memory' | 'knowledge', ChannelRuntimeState>>;
95
+ contextReceiptId?: string;
96
+ action: ObligationRuntimeState;
97
+ verification: ObligationRuntimeState;
98
+ memory: ObligationRuntimeState;
99
+ durableWorkIds: string[];
100
+ terminal: TerminalOutcome;
101
+ runtimeHealth: RuntimeHealth;
102
+ snapshotHash: string;
103
+ updatedAt: number;
104
+ }
105
+ export declare function taskSpecFromImmutableIntent(artifact: ImmutableTaskIntentArtifact, options?: {
106
+ hookDeadlineMs?: number;
107
+ contextTokens?: number;
108
+ }): TaskSpecV1;
109
+ export declare function assertTaskSpecV1(value: TaskSpecV1): void;
110
+ export declare function assertTaskRuntimeEventV1(value: TaskRuntimeEventV1): void;
111
+ export declare function assertTaskRuntimeSnapshotV1(value: TaskRuntimeSnapshotV1): void;
112
+ export declare function stableRuntimeJson(value: unknown): string;
113
+ export declare function stableRuntimeHash(value: unknown): string;
114
+ //# sourceMappingURL=task-runtime.d.ts.map