@dsh-enhanced/assistant-delivery 0.1.65 → 0.1.67

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 (101) hide show
  1. package/README.md +128 -4
  2. package/lib/agent-runtime.d.ts +6 -2
  3. package/lib/agent-runtime.d.ts.map +1 -1
  4. package/lib/agent-runtime.js +60 -14
  5. package/lib/agent-runtime.js.map +1 -1
  6. package/lib/attention-audit-store.d.ts +54 -0
  7. package/lib/attention-audit-store.d.ts.map +1 -0
  8. package/lib/attention-audit-store.js +213 -0
  9. package/lib/attention-audit-store.js.map +1 -0
  10. package/lib/attention-enforcement.d.ts +75 -0
  11. package/lib/attention-enforcement.d.ts.map +1 -0
  12. package/lib/attention-enforcement.js +84 -0
  13. package/lib/attention-enforcement.js.map +1 -0
  14. package/lib/attention.d.ts +203 -0
  15. package/lib/attention.d.ts.map +1 -0
  16. package/lib/attention.js +288 -0
  17. package/lib/attention.js.map +1 -0
  18. package/lib/coordinator.d.ts.map +1 -1
  19. package/lib/coordinator.js +6 -0
  20. package/lib/coordinator.js.map +1 -1
  21. package/lib/feedback-command.d.ts +23 -0
  22. package/lib/feedback-command.d.ts.map +1 -1
  23. package/lib/feedback-command.js +176 -0
  24. package/lib/feedback-command.js.map +1 -1
  25. package/lib/foreground-observation.d.ts +21 -0
  26. package/lib/foreground-observation.d.ts.map +1 -1
  27. package/lib/foreground-observation.js.map +1 -1
  28. package/lib/foreground-termination.d.ts +31 -0
  29. package/lib/foreground-termination.d.ts.map +1 -0
  30. package/lib/foreground-termination.js +42 -0
  31. package/lib/foreground-termination.js.map +1 -0
  32. package/lib/in-process-reload-runtime.d.ts +87 -0
  33. package/lib/in-process-reload-runtime.d.ts.map +1 -0
  34. package/lib/in-process-reload-runtime.js +319 -0
  35. package/lib/in-process-reload-runtime.js.map +1 -0
  36. package/lib/index.d.ts +20 -6
  37. package/lib/index.d.ts.map +1 -1
  38. package/lib/index.js +9 -3
  39. package/lib/index.js.map +1 -1
  40. package/lib/native-termination.d.ts +12 -0
  41. package/lib/native-termination.d.ts.map +1 -0
  42. package/lib/native-termination.js +57 -0
  43. package/lib/native-termination.js.map +1 -0
  44. package/lib/native-web-owner.d.ts +7 -0
  45. package/lib/native-web-owner.d.ts.map +1 -1
  46. package/lib/native-web-owner.js +40 -10
  47. package/lib/native-web-owner.js.map +1 -1
  48. package/lib/operator-snapshot.d.ts +31 -3
  49. package/lib/operator-snapshot.d.ts.map +1 -1
  50. package/lib/operator-snapshot.js +120 -47
  51. package/lib/operator-snapshot.js.map +1 -1
  52. package/lib/progress-attention.d.ts +55 -0
  53. package/lib/progress-attention.d.ts.map +1 -0
  54. package/lib/progress-attention.js +128 -0
  55. package/lib/progress-attention.js.map +1 -0
  56. package/lib/service.d.ts +515 -4
  57. package/lib/service.d.ts.map +1 -1
  58. package/lib/service.js +2183 -130
  59. package/lib/service.js.map +1 -1
  60. package/lib/sqlite.d.ts +1 -1
  61. package/lib/sqlite.d.ts.map +1 -1
  62. package/lib/sqlite.js +102 -2
  63. package/lib/sqlite.js.map +1 -1
  64. package/lib/store.d.ts +113 -2
  65. package/lib/store.d.ts.map +1 -1
  66. package/lib/store.js +450 -39
  67. package/lib/store.js.map +1 -1
  68. package/lib/types.d.ts +175 -0
  69. package/lib/types.d.ts.map +1 -1
  70. package/lib/types.js.map +1 -1
  71. package/lib/version.d.ts +1 -1
  72. package/lib/version.js +1 -1
  73. package/lib/work-item-engineering-context.d.ts +127 -0
  74. package/lib/work-item-engineering-context.d.ts.map +1 -0
  75. package/lib/work-item-engineering-context.js +151 -0
  76. package/lib/work-item-engineering-context.js.map +1 -0
  77. package/lib/work-item-feedback-schema.d.ts +2 -0
  78. package/lib/work-item-feedback-schema.d.ts.map +1 -0
  79. package/lib/work-item-feedback-schema.js +29 -0
  80. package/lib/work-item-feedback-schema.js.map +1 -0
  81. package/lib/work-item-feedback-store.d.ts +29 -0
  82. package/lib/work-item-feedback-store.d.ts.map +1 -0
  83. package/lib/work-item-feedback-store.js +111 -0
  84. package/lib/work-item-feedback-store.js.map +1 -0
  85. package/lib/work-item-feedback.d.ts +157 -0
  86. package/lib/work-item-feedback.d.ts.map +1 -0
  87. package/lib/work-item-feedback.js +2 -0
  88. package/lib/work-item-feedback.js.map +1 -0
  89. package/lib/work-item-replies-schema.d.ts +3 -0
  90. package/lib/work-item-replies-schema.d.ts.map +1 -0
  91. package/lib/work-item-replies-schema.js +45 -0
  92. package/lib/work-item-replies-schema.js.map +1 -0
  93. package/lib/work-item-replies-store.d.ts +43 -0
  94. package/lib/work-item-replies-store.d.ts.map +1 -0
  95. package/lib/work-item-replies-store.js +203 -0
  96. package/lib/work-item-replies-store.js.map +1 -0
  97. package/lib/work-item-replies.d.ts +93 -0
  98. package/lib/work-item-replies.d.ts.map +1 -0
  99. package/lib/work-item-replies.js +15 -0
  100. package/lib/work-item-replies.js.map +1 -0
  101. package/package.json +24 -24
@@ -0,0 +1,151 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { isProxy } from 'node:util/types';
3
+ import { acceptanceCanonicalJson } from '@dsh-enhanced/task-acceptance-contract';
4
+ const HEX = /^[a-f0-9]{64}$/u;
5
+ function fail() { throw new Error('invalid work item engineering context'); }
6
+ const hash = (text) => createHash('sha256').update(text, 'utf8').digest('hex');
7
+ const digest = (value) => hash(acceptanceCanonicalJson(value));
8
+ const positive = (value) => typeof value === 'number' && Number.isSafeInteger(value) && value > 0;
9
+ const size = (value) => typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;
10
+ const identifier = (value) => typeof value === 'string' && value.length > 0 && Buffer.byteLength(value) <= 4096 && !/\p{Cc}/u.test(value) && Buffer.from(value).toString('utf8') === value;
11
+ const hex = (value) => typeof value === 'string' && HEX.test(value);
12
+ function exact(value, required, optional = []) {
13
+ if (!value || typeof value !== 'object' || Array.isArray(value))
14
+ return fail();
15
+ const record = value, keys = Object.keys(record);
16
+ if (required.some(key => !Object.hasOwn(record, key)) || keys.some(key => !required.includes(key) && !optional.includes(key)))
17
+ return fail();
18
+ return record;
19
+ }
20
+ /** Snapshot plain inert data without invoking peer accessors or repairing original Unicode. */
21
+ export function engineeringContextData(value) {
22
+ const ancestors = new Set();
23
+ let entries = 0;
24
+ const visit = (part, depth) => {
25
+ if (part === null || typeof part === 'string' || typeof part === 'boolean' || typeof part === 'number' && Number.isFinite(part))
26
+ return;
27
+ if (!part || typeof part !== 'object' || isProxy(part) || depth > 20 || ancestors.has(part) || ++entries > 20000)
28
+ fail();
29
+ const array = Array.isArray(part), prototype = Object.getPrototypeOf(part);
30
+ if (prototype !== (array ? Array.prototype : Object.prototype) && prototype !== null)
31
+ fail();
32
+ ancestors.add(part);
33
+ for (const key of Reflect.ownKeys(part)) {
34
+ if (array && key === 'length')
35
+ continue;
36
+ const descriptor = Object.getOwnPropertyDescriptor(part, key);
37
+ if (typeof key !== 'string' || !descriptor.enumerable || !Object.hasOwn(descriptor, 'value'))
38
+ fail();
39
+ visit(descriptor.value, depth + 1);
40
+ }
41
+ ancestors.delete(part);
42
+ };
43
+ visit(value, 0);
44
+ const text = acceptanceCanonicalJson(value);
45
+ if (Buffer.byteLength(text) > 524288)
46
+ fail();
47
+ const result = JSON.parse(text);
48
+ const freeze = (part) => { if (part && typeof part === 'object') {
49
+ for (const child of Object.values(part))
50
+ freeze(child);
51
+ Object.freeze(part);
52
+ } };
53
+ freeze(result);
54
+ return result;
55
+ }
56
+ function textRecord(value, report) {
57
+ const record = exact(value, report ? ['itemId', 'revision', 'text', 'fullTextDigest', 'fullBytes'] : ['itemId', 'text', 'fullTextDigest', 'fullBytes']);
58
+ if (!identifier(record.itemId) || report && !positive(record.revision) || typeof record.text !== 'string' || !size(record.fullBytes) || !hex(record.fullTextDigest)
59
+ || !report && !record.text.trim() || Buffer.from(record.text).toString('utf8') !== record.text || Buffer.byteLength(record.text) !== record.fullBytes || hash(record.text) !== record.fullTextDigest)
60
+ fail();
61
+ return record;
62
+ }
63
+ /** Defense in depth: source authority is still the producer-owned ephemeral capability. */
64
+ export function validateWorkItemEngineeringMaterial(value) {
65
+ const data = engineeringContextData(value), material = exact(data, ['protocol', 'itemId', 'rootItemId', 'feedbackProofDigest', 'nodes', 'continuationInputs', 'parentReports', 'materialDigest']);
66
+ if (material.protocol !== 'assistant-work-items/engineering-material/v1' || !identifier(material.itemId) || !identifier(material.rootItemId) || !hex(material.feedbackProofDigest) || !hex(material.materialDigest)
67
+ || !Array.isArray(material.nodes) || material.nodes.length < 1 || material.nodes.length > 33 || !Array.isArray(material.continuationInputs) || !Array.isArray(material.parentReports))
68
+ fail();
69
+ const nodes = material.nodes, inputs = material.continuationInputs, reports = material.parentReports;
70
+ const ids = new Set(), selected = [];
71
+ for (const [index, value] of nodes.entries()) {
72
+ const node = exact(value, ['itemId', 'planProtocol', 'planDigest', 'input', 'parent']);
73
+ if (!identifier(node.itemId) || ids.has(node.itemId) || !hex(node.planDigest))
74
+ fail();
75
+ ids.add(node.itemId);
76
+ if (index === 0) {
77
+ const input = exact(node.input, ['kind', 'inboxId', 'sourceDigest', 'executionRef', 'completionSequence', 'binding']), binding = exact(input.binding, ['id', 'version', 'generation']);
78
+ if (node.itemId !== material.rootItemId || node.parent !== null || node.planProtocol !== 'assistant-work-items/foreground-diagnosis-plan/v1' || input.kind !== 'foreground'
79
+ || !identifier(input.inboxId) || input.executionRef !== input.inboxId || !hex(input.sourceDigest) || !positive(input.completionSequence) || !identifier(binding.id) || !positive(binding.version) || !positive(binding.generation))
80
+ fail();
81
+ }
82
+ else {
83
+ const input = exact(node.input, ['kind', 'sourceDigest', 'inputSha256', 'inputBytes'], ['replyId']), parent = exact(node.parent, ['itemId', 'rootItemId', 'report', 'outcomeRevision', 'productionDigest']);
84
+ if (node.planProtocol !== 'assistant-work-items/owner-continuation-plan/v2' || input.kind !== 'continuation'
85
+ || !hex(input.sourceDigest) || !hex(input.inputSha256) || !size(input.inputBytes) || input.inputBytes > 16384 || parent.itemId !== nodes[index - 1].itemId
86
+ || parent.rootItemId !== material.rootItemId || !hex(parent.productionDigest) || parent.outcomeRevision !== null && !positive(parent.outcomeRevision)
87
+ || (node.planProtocol === 'assistant-work-items/owner-continuation-plan/v2' ? !identifier(input.replyId) : Object.hasOwn(input, 'replyId')))
88
+ fail();
89
+ if (parent.report !== null) {
90
+ const report = exact(parent.report, ['itemId', 'revision', 'digest', 'fullTextDigest', 'fullBytes', 'status', 'truncated']);
91
+ if (report.itemId !== parent.itemId || !positive(report.revision) || !hex(report.digest) || !hex(report.fullTextDigest) || !size(report.fullBytes) || report.fullBytes > 65536
92
+ || !['progress', 'waiting', 'ready', 'blocked', 'failed'].includes(String(report.status)) || typeof report.truncated !== 'boolean')
93
+ fail();
94
+ selected.push(report);
95
+ }
96
+ }
97
+ }
98
+ if (nodes.at(-1).itemId !== material.itemId || inputs.length !== nodes.length - 1 || reports.length !== selected.length)
99
+ fail();
100
+ let inputBytes = 0, reportBytes = 0;
101
+ for (const [index, value] of inputs.entries()) {
102
+ const record = textRecord(value, false), node = nodes[index + 1], input = node.input;
103
+ if (record.itemId !== node.itemId || record.fullTextDigest !== input.inputSha256 || record.fullBytes !== input.inputBytes)
104
+ fail();
105
+ inputBytes += record.fullBytes;
106
+ }
107
+ for (const [index, value] of reports.entries()) {
108
+ const record = textRecord(value, true), ref = selected[index];
109
+ if (record.itemId !== ref.itemId || record.revision !== ref.revision || record.fullTextDigest !== ref.fullTextDigest || record.fullBytes !== ref.fullBytes)
110
+ fail();
111
+ reportBytes += record.fullBytes;
112
+ }
113
+ if (inputBytes > 16384 || reportBytes > 262144)
114
+ fail();
115
+ const { materialDigest, ...unsigned } = material;
116
+ if (digest(unsigned) !== materialDigest)
117
+ fail();
118
+ return data;
119
+ }
120
+ export function frameWorkItemEngineeringContext(material, rootText) {
121
+ if (typeof rootText !== 'string' || !rootText.trim() || Buffer.from(rootText).toString('utf8') !== rootText)
122
+ fail();
123
+ const objective = acceptanceCanonicalJson({ protocol: 'work-item-owner-objective/v1', inputs: material.nodes.map((node, index) => ({ itemId: node.itemId, source: node.input, text: index === 0 ? rootText : material.continuationInputs[index - 1].text })) });
124
+ if (Buffer.byteLength(objective) > 16384)
125
+ fail();
126
+ const unsigned = { protocol: 'assistant-delivery/work-item-engineering-context/v1', itemId: material.itemId, rootItemId: material.rootItemId, feedbackProofDigest: material.feedbackProofDigest,
127
+ materialDigest: material.materialDigest, nodes: material.nodes, objective: { protocol: 'work-item-owner-objective/v1', fullTextDigest: hash(objective), fullBytes: Buffer.byteLength(objective) }, reports: material.nodes.flatMap(node => node.parent?.report ? [node.parent.report] : []) };
128
+ return Object.freeze({ manifest: engineeringContextData({ ...unsigned, manifestDigest: digest(unsigned) }), objective });
129
+ }
130
+ export function pageWorkItemEngineeringContext(source, material, input) {
131
+ const selector = exact(input.selector, input.selector.kind === 'objective' ? ['kind'] : ['kind', 'itemId', 'revision']);
132
+ let text = source.objective;
133
+ if (selector.kind === 'parent-report') {
134
+ if (!identifier(selector.itemId) || !positive(selector.revision))
135
+ fail();
136
+ const report = material.parentReports.find(report => report.itemId === selector.itemId && report.revision === selector.revision);
137
+ if (!report)
138
+ fail();
139
+ text = report.text;
140
+ }
141
+ else if (selector.kind !== 'objective')
142
+ fail();
143
+ const bytes = Buffer.from(text), offset = input.offset ?? 0, limit = input.maxBytes ?? 4096;
144
+ if (!Number.isSafeInteger(offset) || offset < 0 || offset > bytes.length || offset < bytes.length && (bytes[offset] & 0xc0) === 0x80 || !Number.isSafeInteger(limit) || limit < 4 || limit > 8192)
145
+ fail();
146
+ let end = Math.min(offset + limit, bytes.length);
147
+ while (end > offset && end < bytes.length && (bytes[end] & 0xc0) === 0x80)
148
+ end--;
149
+ return Object.freeze({ manifestDigest: source.manifest.manifestDigest, fullTextDigest: hash(text), fullBytes: bytes.length, text: bytes.subarray(offset, end).toString('utf8'), offset, returnedBytes: end - offset, ...(end < bytes.length ? { nextOffset: end } : {}) });
150
+ }
151
+ //# sourceMappingURL=work-item-engineering-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-item-engineering-context.js","sourceRoot":"","sources":["../src/work-item-engineering-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const workItemFeedbackSchema = "\n CREATE TABLE delivery_work_item_feedback (\n inbox_id TEXT PRIMARY KEY REFERENCES inbox_messages(id),\n operation_id TEXT NOT NULL UNIQUE,\n admission_sequence INTEGER NOT NULL UNIQUE CHECK(admission_sequence>=1),\n item_id TEXT NOT NULL,\n source_digest TEXT NOT NULL CHECK(length(source_digest)=64),\n source_json TEXT NOT NULL CHECK(json_valid(source_json)),\n state TEXT NOT NULL CHECK(state IN ('pending','frozen','recorded','conflict','cancelled')),\n command_json TEXT CHECK(command_json IS NULL OR json_valid(command_json)),\n proof_digest TEXT CHECK(proof_digest IS NULL OR length(proof_digest)=64),\n canonical_json TEXT CHECK(canonical_json IS NULL OR json_valid(canonical_json)),\n CHECK(state!='frozen' OR (command_json IS NOT NULL AND proof_digest IS NOT NULL)),\n CHECK(state!='recorded' OR canonical_json IS NOT NULL)\n ) STRICT;\n CREATE INDEX delivery_work_item_feedback_pending ON delivery_work_item_feedback(state,admission_sequence);\n CREATE TRIGGER delivery_work_item_feedback_source_immutable\n BEFORE UPDATE OF inbox_id,operation_id,admission_sequence,item_id,source_digest,source_json ON delivery_work_item_feedback\n BEGIN SELECT RAISE(ABORT,'work item feedback source is immutable'); END;\n CREATE TRIGGER delivery_work_item_feedback_selection_immutable BEFORE UPDATE ON delivery_work_item_feedback\n WHEN (OLD.command_json IS NOT NULL AND NEW.command_json IS NOT OLD.command_json)\n OR (OLD.proof_digest IS NOT NULL AND NEW.proof_digest IS NOT OLD.proof_digest)\n OR (OLD.canonical_json IS NOT NULL AND NEW.canonical_json IS NOT OLD.canonical_json)\n OR (OLD.state IN ('recorded','conflict','cancelled') AND NEW.state!=OLD.state)\n BEGIN SELECT RAISE(ABORT,'work item feedback selection is immutable'); END;\n CREATE TRIGGER delivery_work_item_feedback_no_delete BEFORE DELETE ON delivery_work_item_feedback\n BEGIN SELECT RAISE(ABORT,'work item feedback source is durable'); END;\n";
2
+ //# sourceMappingURL=work-item-feedback-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-item-feedback-schema.d.ts","sourceRoot":"","sources":["../src/work-item-feedback-schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,u8DA2BlC,CAAA"}
@@ -0,0 +1,29 @@
1
+ export const workItemFeedbackSchema = `
2
+ CREATE TABLE delivery_work_item_feedback (
3
+ inbox_id TEXT PRIMARY KEY REFERENCES inbox_messages(id),
4
+ operation_id TEXT NOT NULL UNIQUE,
5
+ admission_sequence INTEGER NOT NULL UNIQUE CHECK(admission_sequence>=1),
6
+ item_id TEXT NOT NULL,
7
+ source_digest TEXT NOT NULL CHECK(length(source_digest)=64),
8
+ source_json TEXT NOT NULL CHECK(json_valid(source_json)),
9
+ state TEXT NOT NULL CHECK(state IN ('pending','frozen','recorded','conflict','cancelled')),
10
+ command_json TEXT CHECK(command_json IS NULL OR json_valid(command_json)),
11
+ proof_digest TEXT CHECK(proof_digest IS NULL OR length(proof_digest)=64),
12
+ canonical_json TEXT CHECK(canonical_json IS NULL OR json_valid(canonical_json)),
13
+ CHECK(state!='frozen' OR (command_json IS NOT NULL AND proof_digest IS NOT NULL)),
14
+ CHECK(state!='recorded' OR canonical_json IS NOT NULL)
15
+ ) STRICT;
16
+ CREATE INDEX delivery_work_item_feedback_pending ON delivery_work_item_feedback(state,admission_sequence);
17
+ CREATE TRIGGER delivery_work_item_feedback_source_immutable
18
+ BEFORE UPDATE OF inbox_id,operation_id,admission_sequence,item_id,source_digest,source_json ON delivery_work_item_feedback
19
+ BEGIN SELECT RAISE(ABORT,'work item feedback source is immutable'); END;
20
+ CREATE TRIGGER delivery_work_item_feedback_selection_immutable BEFORE UPDATE ON delivery_work_item_feedback
21
+ WHEN (OLD.command_json IS NOT NULL AND NEW.command_json IS NOT OLD.command_json)
22
+ OR (OLD.proof_digest IS NOT NULL AND NEW.proof_digest IS NOT OLD.proof_digest)
23
+ OR (OLD.canonical_json IS NOT NULL AND NEW.canonical_json IS NOT OLD.canonical_json)
24
+ OR (OLD.state IN ('recorded','conflict','cancelled') AND NEW.state!=OLD.state)
25
+ BEGIN SELECT RAISE(ABORT,'work item feedback selection is immutable'); END;
26
+ CREATE TRIGGER delivery_work_item_feedback_no_delete BEFORE DELETE ON delivery_work_item_feedback
27
+ BEGIN SELECT RAISE(ABORT,'work item feedback source is durable'); END;
28
+ `;
29
+ //# sourceMappingURL=work-item-feedback-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-item-feedback-schema.js","sourceRoot":"","sources":["../src/work-item-feedback-schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BrC,CAAA"}
@@ -0,0 +1,29 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import type { InboxRecord } from './types.js';
3
+ import type { ObjectiveCommand } from './feedback-command.js';
4
+ import type { WorkItemFeedbackIntent, WorkItemFeedbackSource } from './work-item-feedback.js';
5
+ export declare class WorkItemFeedbackStore {
6
+ private readonly database;
7
+ private readonly transaction;
8
+ private readonly getInbox;
9
+ constructor(database: DatabaseSync, transaction: <T>(fn: () => T) => T, getInbox: (id: string) => InboxRecord | undefined);
10
+ get(inboxId: string): WorkItemFeedbackIntent | undefined;
11
+ admit(source: WorkItemFeedbackSource, fence: () => void): WorkItemFeedbackIntent;
12
+ /**
13
+ * Insert the result intent and hand the Inbox off exactly once. A mixed
14
+ * result+continuation reply runs this and the continuation insert in one
15
+ * outer transaction, so the canonical result owns the handoff and the
16
+ * continuation reuses the processed Inbox.
17
+ */
18
+ admitInTransaction(source: WorkItemFeedbackSource, fence: () => void): WorkItemFeedbackIntent;
19
+ pending(afterSequence: number, limit: number): readonly WorkItemFeedbackIntent[];
20
+ freeze(inboxId: string, command: ObjectiveCommand, proofDigest: string, fence: () => void): WorkItemFeedbackIntent;
21
+ settle(inboxId: string, state: 'recorded' | 'conflict' | 'cancelled', canonical: WorkItemFeedbackIntent['canonical'] | undefined, fence: () => void): void;
22
+ findOutcome(outcomeId: string, operationId: string): WorkItemFeedbackIntent | undefined;
23
+ byOperation(operationId: string): WorkItemFeedbackIntent | undefined;
24
+ /** Cross-service canonical append can commit before this SQLite ACK; its stable operation remains the recovery key. */
25
+ withOwnerWriterFence<T>(operationId: string, callback: (intent: WorkItemFeedbackIntent) => T, verify: (intent: WorkItemFeedbackIntent, result: T) => NonNullable<WorkItemFeedbackIntent['canonical']>): T;
26
+ pendingAcknowledgements(afterSequence: number, limit: number): readonly WorkItemFeedbackIntent[];
27
+ cancelBefore(bindingId: string, sequence: number): void;
28
+ }
29
+ //# sourceMappingURL=work-item-feedback-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-item-feedback-store.d.ts","sourceRoot":"","sources":["../src/work-item-feedback-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAG7F,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAAc,OAAO,CAAC,QAAQ,CAAC,WAAW;IAAkB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAA7F,QAAQ,EAAC,YAAY,EAAkB,WAAW,EAAC,CAAC,CAAC,EAAE,EAAE,EAAC,MAAI,CAAC,KAAG,CAAC,EAAkB,QAAQ,EAAC,CAAC,EAAE,EAAC,MAAM,KAAG,WAAW,GAAC,SAAS;IAC7J,GAAG,CAAC,OAAO,EAAC,MAAM,GAAE,sBAAsB,GAAC,SAAS;IASpD,KAAK,CAAC,MAAM,EAAC,sBAAsB,EAAC,KAAK,EAAC,MAAI,IAAI,GAAE,sBAAsB;IAG1E;;;;;OAKG;IACH,kBAAkB,CAAC,MAAM,EAAC,sBAAsB,EAAC,KAAK,EAAC,MAAI,IAAI,GAAE,sBAAsB;IAUvF,OAAO,CAAC,aAAa,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,GAAE,SAAS,sBAAsB,EAAE;IAK5E,MAAM,CAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,gBAAgB,EAAC,WAAW,EAAC,MAAM,EAAC,KAAK,EAAC,MAAI,IAAI,GAAE,sBAAsB;IAexG,MAAM,CAAC,OAAO,EAAC,MAAM,EAAC,KAAK,EAAC,UAAU,GAAC,UAAU,GAAC,WAAW,EAAC,SAAS,EAAC,sBAAsB,CAAC,WAAW,CAAC,GAAC,SAAS,EAAC,KAAK,EAAC,MAAI,IAAI,GAAE,IAAI;IAQ1I,WAAW,CAAC,SAAS,EAAC,MAAM,EAAC,WAAW,EAAC,MAAM,GAAE,sBAAsB,GAAC,SAAS;IAKjF,WAAW,CAAC,WAAW,EAAC,MAAM,GAAE,sBAAsB,GAAC,SAAS;IAIhE,uHAAuH;IACvH,oBAAoB,CAAC,CAAC,EAAE,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAC,CAAC,MAAM,EAAC,sBAAsB,KAAG,CAAC,EACpF,MAAM,EAAC,CAAC,MAAM,EAAC,sBAAsB,EAAC,MAAM,EAAC,CAAC,KAAG,WAAW,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,GAAE,CAAC;IAYtG,uBAAuB,CAAC,aAAa,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,GAAE,SAAS,sBAAsB,EAAE;IAM5F,YAAY,CAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,GAAE,IAAI;CAGpD"}
@@ -0,0 +1,111 @@
1
+ import { workItemReplyCanonical, workItemReplyDigest } from './work-item-replies.js';
2
+ export class WorkItemFeedbackStore {
3
+ database;
4
+ transaction;
5
+ getInbox;
6
+ constructor(database, transaction, getInbox) {
7
+ this.database = database;
8
+ this.transaction = transaction;
9
+ this.getInbox = getInbox;
10
+ }
11
+ get(inboxId) {
12
+ const row = this.database.prepare('SELECT * FROM delivery_work_item_feedback WHERE inbox_id=?').get(inboxId);
13
+ if (!row)
14
+ return undefined;
15
+ const source = JSON.parse(row.source_json);
16
+ if (workItemReplyDigest(source) !== row.source_digest || source.inboxId !== row.inbox_id || source.operationId !== row.operation_id
17
+ || source.admissionCursor.sequence !== row.admission_sequence || source.target.itemId !== row.item_id)
18
+ throw new Error('invalid work item feedback source');
19
+ return { source, sourceDigest: row.source_digest, state: row.state, ...(row.command_json === null ? {} : { command: JSON.parse(row.command_json) }),
20
+ ...(row.proof_digest === null ? {} : { proofDigest: row.proof_digest }), ...(row.canonical_json === null ? {} : { canonical: JSON.parse(row.canonical_json) }) };
21
+ }
22
+ admit(source, fence) {
23
+ return this.transaction(() => this.admitInTransaction(source, fence));
24
+ }
25
+ /**
26
+ * Insert the result intent and hand the Inbox off exactly once. A mixed
27
+ * result+continuation reply runs this and the continuation insert in one
28
+ * outer transaction, so the canonical result owns the handoff and the
29
+ * continuation reuses the processed Inbox.
30
+ */
31
+ admitInTransaction(source, fence) {
32
+ fence();
33
+ const inbox = this.getInbox(source.inboxId);
34
+ if (!inbox || !['received', 'authorized'].includes(inbox.status) || inbox.envelopeHash !== source.envelopeHash || inbox.envelope.text !== source.inputText)
35
+ throw new Error('feedback Inbox changed');
36
+ this.database.prepare(`INSERT INTO delivery_work_item_feedback(inbox_id,operation_id,admission_sequence,item_id,source_digest,source_json,state) VALUES(?,?,?,?,?,?,'pending')`)
37
+ .run(source.inboxId, source.operationId, source.admissionCursor.sequence, source.target.itemId, workItemReplyDigest(source), workItemReplyCanonical(source));
38
+ const handed = this.database.prepare("UPDATE inbox_messages SET status='processed',binding_id=?,failure_code=NULL WHERE id=? AND status IN ('received','authorized')").run(source.binding.id, source.inboxId);
39
+ if (handed.changes !== 1)
40
+ throw new Error('feedback Inbox handoff lost');
41
+ return this.get(source.inboxId);
42
+ }
43
+ pending(afterSequence, limit) {
44
+ const rows = this.database.prepare(`SELECT inbox_id FROM delivery_work_item_feedback WHERE state IN ('pending','frozen') AND admission_sequence>? ORDER BY admission_sequence LIMIT ?`)
45
+ .all(afterSequence, limit);
46
+ return rows.map(row => this.get(row.inbox_id));
47
+ }
48
+ freeze(inboxId, command, proofDigest, fence) {
49
+ return this.transaction(() => {
50
+ fence();
51
+ const current = this.get(inboxId);
52
+ if (!current)
53
+ throw new Error('feedback intent missing');
54
+ if (current.state !== 'pending')
55
+ return current;
56
+ // Canonical work-item identity, not an individual report/outbox, orders votes.
57
+ const earlier = this.database.prepare(`SELECT 1 FROM delivery_work_item_feedback WHERE item_id=? AND admission_sequence<? AND state IN ('pending','frozen')
58
+ AND json_extract(source_json,'$.scope')=json_extract(?,'$.scope') AND json_extract(source_json,'$.owner')=json_extract(?,'$.owner') LIMIT 1`)
59
+ .get(current.source.target.itemId, current.source.admissionCursor.sequence, workItemReplyCanonical(current.source), workItemReplyCanonical(current.source));
60
+ if (earlier)
61
+ return current;
62
+ this.database.prepare("UPDATE delivery_work_item_feedback SET command_json=?,proof_digest=?,state='frozen' WHERE inbox_id=? AND state='pending'")
63
+ .run(workItemReplyCanonical(command), proofDigest, inboxId);
64
+ return this.get(inboxId);
65
+ });
66
+ }
67
+ settle(inboxId, state, canonical, fence) {
68
+ this.transaction(() => {
69
+ fence();
70
+ const current = this.get(inboxId);
71
+ if (!current || !['pending', 'frozen'].includes(current.state))
72
+ return;
73
+ this.database.prepare('UPDATE delivery_work_item_feedback SET state=?,canonical_json=? WHERE inbox_id=? AND state IN (\'pending\',\'frozen\')')
74
+ .run(state, canonical === undefined ? null : workItemReplyCanonical(canonical), inboxId);
75
+ });
76
+ }
77
+ findOutcome(outcomeId, operationId) {
78
+ const row = this.database.prepare("SELECT inbox_id FROM delivery_work_item_feedback WHERE state='recorded' AND operation_id=? AND json_extract(canonical_json,'$.outcomeId')=?")
79
+ .get(operationId, outcomeId);
80
+ return row === undefined ? undefined : this.get(row.inbox_id);
81
+ }
82
+ byOperation(operationId) {
83
+ const row = this.database.prepare('SELECT inbox_id FROM delivery_work_item_feedback WHERE operation_id=?').get(operationId);
84
+ return row ? this.get(row.inbox_id) : undefined;
85
+ }
86
+ /** Cross-service canonical append can commit before this SQLite ACK; its stable operation remains the recovery key. */
87
+ withOwnerWriterFence(operationId, callback, verify) {
88
+ return this.transaction(() => {
89
+ const intent = this.byOperation(operationId);
90
+ if (!intent || intent.state !== 'frozen')
91
+ throw new Error('owner feedback writer requires exact frozen intent');
92
+ const result = callback(intent);
93
+ const canonical = verify(intent, result);
94
+ const updated = this.database.prepare("UPDATE delivery_work_item_feedback SET state='recorded',canonical_json=? WHERE inbox_id=? AND state='frozen'")
95
+ .run(workItemReplyCanonical(canonical), intent.source.inboxId);
96
+ if (updated.changes !== 1)
97
+ throw new Error('owner feedback ACK lost its frozen source');
98
+ return result;
99
+ });
100
+ }
101
+ pendingAcknowledgements(afterSequence, limit) {
102
+ const rows = this.database.prepare(`SELECT inbox_id FROM delivery_work_item_feedback f WHERE state IN ('recorded','conflict') AND admission_sequence>?
103
+ AND NOT EXISTS(SELECT 1 FROM outbox_messages o WHERE o.idempotency_key='feedback:'||f.inbox_id||':ack') ORDER BY admission_sequence LIMIT ?`)
104
+ .all(afterSequence, limit);
105
+ return rows.map(row => this.get(row.inbox_id));
106
+ }
107
+ cancelBefore(bindingId, sequence) {
108
+ this.database.prepare("UPDATE delivery_work_item_feedback SET state='cancelled' WHERE state IN ('pending','frozen') AND admission_sequence<? AND json_extract(source_json,'$.binding.id')=?").run(sequence, bindingId);
109
+ }
110
+ }
111
+ //# sourceMappingURL=work-item-feedback-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-item-feedback-store.js","sourceRoot":"","sources":["../src/work-item-feedback-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ import type { TrustedTaskLearningProjectionReceipt } from '@dsh-enhanced/assistant-evaluation';
2
+ import type { OwnerForegroundTaskSourceContent, OwnerForegroundTaskSourceScope, OwnerRouteValidationReceipt } from './types.js';
3
+ import type { OwnerForegroundLearningTask } from './service.js';
4
+ import type { WorkItemReplySource } from './work-item-replies.js';
5
+ import type { ObjectiveCommand, ObjectiveFeedbackStatus } from './feedback-command.js';
6
+ export type WorkItemFeedbackSelection = Readonly<{
7
+ kind: 'natural';
8
+ value: ObjectiveFeedbackStatus | 'withdraw';
9
+ }> | Readonly<{
10
+ kind: 'explicit';
11
+ command: ObjectiveCommand;
12
+ }>;
13
+ export interface WorkItemFeedbackSource {
14
+ readonly protocol: 'assistant-delivery/work-item-feedback/v1';
15
+ readonly inboxId: string;
16
+ readonly envelopeHash: string;
17
+ readonly inputText: string;
18
+ readonly inputSha256: string;
19
+ readonly admissionCursor: WorkItemReplySource['admissionCursor'];
20
+ readonly occurredAt: number;
21
+ readonly owner: WorkItemReplySource['owner'];
22
+ readonly principalId: string;
23
+ readonly binding: WorkItemReplySource['binding'];
24
+ readonly scope: WorkItemReplySource['scope'];
25
+ readonly target: WorkItemReplySource['target'];
26
+ readonly selection: WorkItemFeedbackSelection;
27
+ readonly operationId: string;
28
+ }
29
+ export interface WorkItemFeedbackIntent {
30
+ readonly source: WorkItemFeedbackSource;
31
+ readonly sourceDigest: string;
32
+ readonly state: 'pending' | 'frozen' | 'recorded' | 'conflict' | 'cancelled';
33
+ readonly command?: ObjectiveCommand;
34
+ readonly proofDigest?: string;
35
+ readonly canonical?: Readonly<{
36
+ version: number;
37
+ objectiveStatus: ObjectiveFeedbackStatus | 'unknown';
38
+ outcomeId?: string;
39
+ }>;
40
+ }
41
+ /** Structural public identity keeps older optional Evaluation type exports loadable while disabled. */
42
+ export interface WorkItemFeedbackProofIdentity {
43
+ readonly protocol: 'assistant-work-items/owner-report-feedback/v1';
44
+ readonly itemId: string;
45
+ readonly reportRevision: number;
46
+ readonly reportDigest: string;
47
+ readonly sourceId: string;
48
+ readonly itemKind: string;
49
+ readonly scope: Readonly<{
50
+ workspace: string;
51
+ preset: string;
52
+ }>;
53
+ readonly owner: Readonly<{
54
+ ownerRouteId: string;
55
+ principalId: string;
56
+ principalRecordId: string;
57
+ principalVersion: number;
58
+ }>;
59
+ readonly originBindingId: string;
60
+ readonly production: Readonly<{
61
+ automationId: string;
62
+ occurrenceId: string;
63
+ runId: string;
64
+ definitionHash: string;
65
+ definitionVersion: number;
66
+ executionStatus: 'succeeded' | 'failed' | 'timed-out' | 'cancelled';
67
+ completedAt: number;
68
+ quiescent: true;
69
+ budgetSettlementState: 'finalized';
70
+ }>;
71
+ readonly supplier: Readonly<{
72
+ provider: string;
73
+ model: string;
74
+ reasoningEffort?: string;
75
+ }>;
76
+ readonly planDigest: string;
77
+ readonly proofDigest: string;
78
+ }
79
+ /** Full proof text is verified privately. This identity's proofDigest binds that original text, never its presentation. */
80
+ export interface OwnerWorkItemLearningTask {
81
+ readonly protocol: 'assistant-delivery/owner-work-item-learning/v1';
82
+ readonly owner: Readonly<OwnerRouteValidationReceipt>;
83
+ readonly canonical: TrustedTaskLearningProjectionReceipt;
84
+ readonly judgement: 'owner-feedback';
85
+ readonly ownerRevision: Readonly<{
86
+ version: number;
87
+ action: 'initial' | 'correct';
88
+ operationId: string;
89
+ }>;
90
+ readonly proofIdentity: Readonly<WorkItemFeedbackProofIdentity>;
91
+ readonly sourceDigest: string;
92
+ readonly presentation: Readonly<{
93
+ brief: Readonly<{
94
+ text: string;
95
+ truncated: boolean;
96
+ redacted: boolean;
97
+ }>;
98
+ report: Readonly<{
99
+ text: string;
100
+ truncated: boolean;
101
+ redacted: boolean;
102
+ }>;
103
+ feedback: Readonly<{
104
+ inboxId: string;
105
+ text: string;
106
+ truncated: boolean;
107
+ redacted: boolean;
108
+ }>;
109
+ }>;
110
+ readonly presentationDigest: string;
111
+ }
112
+ /** Exact immutable expectations; foreground v1 identities remain unchanged. */
113
+ export type OwnerWorkItemLearningSourceExpectation = Readonly<{
114
+ kind: 'work-item';
115
+ itemId: string;
116
+ outcomeId: string;
117
+ expectedSourceDigest: string;
118
+ expectedContentDigest: string;
119
+ canonical: Readonly<{
120
+ version: number;
121
+ digest: string;
122
+ objectiveStatus: 'achieved' | 'not-achieved';
123
+ }>;
124
+ }>;
125
+ export type OwnerLearningSourceExpectation = Readonly<{
126
+ kind: 'foreground';
127
+ inboxId: string;
128
+ expectedSourceDigest: string;
129
+ }> | OwnerWorkItemLearningSourceExpectation;
130
+ export type OwnerLearningSourceSnapshot = Readonly<{
131
+ kind: 'foreground';
132
+ inboxId: string;
133
+ content?: Readonly<OwnerForegroundTaskSourceContent> | undefined;
134
+ currentCanonical?: TrustedTaskLearningProjectionReceipt | undefined;
135
+ task?: Readonly<OwnerForegroundLearningTask> | undefined;
136
+ ownerRevision?: Readonly<{
137
+ outcomeId: string;
138
+ version: number;
139
+ action: 'initial' | 'correct' | 'withdraw';
140
+ objectiveStatus: string;
141
+ operationId?: string;
142
+ }> | undefined;
143
+ }> | Readonly<{
144
+ kind: 'work-item';
145
+ itemId: string;
146
+ task?: Readonly<OwnerWorkItemLearningTask> | undefined;
147
+ currentCanonical?: TrustedTaskLearningProjectionReceipt | undefined;
148
+ ownerRevision?: Readonly<{
149
+ outcomeId: string;
150
+ version: number;
151
+ action: 'initial' | 'correct' | 'withdraw';
152
+ objectiveStatus: string;
153
+ operationId?: string;
154
+ }> | undefined;
155
+ }>;
156
+ export type OwnerWorkItemLearningTaskFenceInput = OwnerForegroundTaskSourceScope & Omit<OwnerWorkItemLearningSourceExpectation, 'kind'>;
157
+ //# sourceMappingURL=work-item-feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-item-feedback.d.ts","sourceRoot":"","sources":["../src/work-item-feedback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=work-item-feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-item-feedback.js","sourceRoot":"","sources":["../src/work-item-feedback.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ /** Delivery-owned authority and handoff journals. Input and report identity never change after admission. */
2
+ export declare const workItemRepliesSchema = "\n CREATE TABLE delivery_work_item_reports (\n outbox_id TEXT PRIMARY KEY REFERENCES outbox_messages(id),\n intent_hash TEXT NOT NULL CHECK(length(intent_hash)=64),\n target_json TEXT NOT NULL CHECK(json_valid(target_json)),\n binding_json TEXT NOT NULL CHECK(json_valid(binding_json))\n ) STRICT;\n CREATE TRIGGER delivery_work_item_reports_no_update BEFORE UPDATE ON delivery_work_item_reports\n BEGIN SELECT RAISE(ABORT, 'work item report target is immutable'); END;\n CREATE TRIGGER delivery_work_item_reports_no_delete BEFORE DELETE ON delivery_work_item_reports\n BEGIN SELECT RAISE(ABORT, 'work item report target is durable'); END;\n CREATE TABLE delivery_work_item_reply_streams (\n stream_key TEXT PRIMARY KEY CHECK(length(stream_key)=64),\n head_item_id TEXT NOT NULL,\n revision INTEGER NOT NULL CHECK(revision>=0)\n ) STRICT;\n CREATE TABLE delivery_work_item_replies (\n inbox_id TEXT PRIMARY KEY REFERENCES inbox_messages(id),\n stream_key TEXT NOT NULL REFERENCES delivery_work_item_reply_streams(stream_key),\n admission_sequence INTEGER NOT NULL UNIQUE CHECK(admission_sequence>=1),\n source_digest TEXT NOT NULL CHECK(length(source_digest)=64),\n source_json TEXT NOT NULL CHECK(json_valid(source_json)),\n execution_parent_item_id TEXT,\n child_item_id TEXT,\n child_plan_digest TEXT CHECK(child_plan_digest IS NULL OR length(child_plan_digest)=64),\n state TEXT NOT NULL CHECK(state IN ('pending','routed','cancelled')),\n CHECK((child_item_id IS NULL AND child_plan_digest IS NULL) OR\n (child_item_id IS NOT NULL AND child_plan_digest IS NOT NULL AND execution_parent_item_id IS NOT NULL)),\n CHECK(state != 'routed' OR child_item_id IS NOT NULL)\n ) STRICT;\n CREATE INDEX delivery_work_item_replies_pending ON delivery_work_item_replies(state, admission_sequence);\n CREATE TRIGGER delivery_work_item_replies_source_immutable\n BEFORE UPDATE OF inbox_id,stream_key,admission_sequence,source_digest,source_json ON delivery_work_item_replies\n BEGIN SELECT RAISE(ABORT, 'work item reply source is immutable'); END;\n CREATE TRIGGER delivery_work_item_replies_selection_immutable BEFORE UPDATE ON delivery_work_item_replies\n WHEN (OLD.execution_parent_item_id IS NOT NULL AND NEW.execution_parent_item_id IS NOT OLD.execution_parent_item_id)\n OR (OLD.child_item_id IS NOT NULL AND (NEW.child_item_id IS NOT OLD.child_item_id OR NEW.child_plan_digest IS NOT OLD.child_plan_digest))\n OR (OLD.state = 'cancelled' AND NEW.state != 'cancelled')\n OR (OLD.state = 'routed' AND NEW.state = 'pending')\n BEGIN SELECT RAISE(ABORT, 'work item reply selection is immutable'); END;\n CREATE TRIGGER delivery_work_item_replies_no_delete BEFORE DELETE ON delivery_work_item_replies\n BEGIN SELECT RAISE(ABORT, 'work item reply source is durable'); END;\n";
3
+ //# sourceMappingURL=work-item-replies-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-item-replies-schema.d.ts","sourceRoot":"","sources":["../src/work-item-replies-schema.ts"],"names":[],"mappings":"AAAA,6GAA6G;AAC7G,eAAO,MAAM,qBAAqB,6zFA0CjC,CAAA"}
@@ -0,0 +1,45 @@
1
+ /** Delivery-owned authority and handoff journals. Input and report identity never change after admission. */
2
+ export const workItemRepliesSchema = `
3
+ CREATE TABLE delivery_work_item_reports (
4
+ outbox_id TEXT PRIMARY KEY REFERENCES outbox_messages(id),
5
+ intent_hash TEXT NOT NULL CHECK(length(intent_hash)=64),
6
+ target_json TEXT NOT NULL CHECK(json_valid(target_json)),
7
+ binding_json TEXT NOT NULL CHECK(json_valid(binding_json))
8
+ ) STRICT;
9
+ CREATE TRIGGER delivery_work_item_reports_no_update BEFORE UPDATE ON delivery_work_item_reports
10
+ BEGIN SELECT RAISE(ABORT, 'work item report target is immutable'); END;
11
+ CREATE TRIGGER delivery_work_item_reports_no_delete BEFORE DELETE ON delivery_work_item_reports
12
+ BEGIN SELECT RAISE(ABORT, 'work item report target is durable'); END;
13
+ CREATE TABLE delivery_work_item_reply_streams (
14
+ stream_key TEXT PRIMARY KEY CHECK(length(stream_key)=64),
15
+ head_item_id TEXT NOT NULL,
16
+ revision INTEGER NOT NULL CHECK(revision>=0)
17
+ ) STRICT;
18
+ CREATE TABLE delivery_work_item_replies (
19
+ inbox_id TEXT PRIMARY KEY REFERENCES inbox_messages(id),
20
+ stream_key TEXT NOT NULL REFERENCES delivery_work_item_reply_streams(stream_key),
21
+ admission_sequence INTEGER NOT NULL UNIQUE CHECK(admission_sequence>=1),
22
+ source_digest TEXT NOT NULL CHECK(length(source_digest)=64),
23
+ source_json TEXT NOT NULL CHECK(json_valid(source_json)),
24
+ execution_parent_item_id TEXT,
25
+ child_item_id TEXT,
26
+ child_plan_digest TEXT CHECK(child_plan_digest IS NULL OR length(child_plan_digest)=64),
27
+ state TEXT NOT NULL CHECK(state IN ('pending','routed','cancelled')),
28
+ CHECK((child_item_id IS NULL AND child_plan_digest IS NULL) OR
29
+ (child_item_id IS NOT NULL AND child_plan_digest IS NOT NULL AND execution_parent_item_id IS NOT NULL)),
30
+ CHECK(state != 'routed' OR child_item_id IS NOT NULL)
31
+ ) STRICT;
32
+ CREATE INDEX delivery_work_item_replies_pending ON delivery_work_item_replies(state, admission_sequence);
33
+ CREATE TRIGGER delivery_work_item_replies_source_immutable
34
+ BEFORE UPDATE OF inbox_id,stream_key,admission_sequence,source_digest,source_json ON delivery_work_item_replies
35
+ BEGIN SELECT RAISE(ABORT, 'work item reply source is immutable'); END;
36
+ CREATE TRIGGER delivery_work_item_replies_selection_immutable BEFORE UPDATE ON delivery_work_item_replies
37
+ WHEN (OLD.execution_parent_item_id IS NOT NULL AND NEW.execution_parent_item_id IS NOT OLD.execution_parent_item_id)
38
+ OR (OLD.child_item_id IS NOT NULL AND (NEW.child_item_id IS NOT OLD.child_item_id OR NEW.child_plan_digest IS NOT OLD.child_plan_digest))
39
+ OR (OLD.state = 'cancelled' AND NEW.state != 'cancelled')
40
+ OR (OLD.state = 'routed' AND NEW.state = 'pending')
41
+ BEGIN SELECT RAISE(ABORT, 'work item reply selection is immutable'); END;
42
+ CREATE TRIGGER delivery_work_item_replies_no_delete BEFORE DELETE ON delivery_work_item_replies
43
+ BEGIN SELECT RAISE(ABORT, 'work item reply source is durable'); END;
44
+ `;
45
+ //# sourceMappingURL=work-item-replies-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-item-replies-schema.js","sourceRoot":"","sources":["../src/work-item-replies-schema.ts"],"names":[],"mappings":"AAAA,6GAA6G;AAC7G,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CpC,CAAA"}