@dsh-enhanced/assistant-work-items 0.0.0-stage → 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 (152) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +685 -2
  3. package/cordis.patch.yml +11 -0
  4. package/lib/acceptance-binding.d.ts +86 -0
  5. package/lib/acceptance-binding.d.ts.map +1 -0
  6. package/lib/acceptance-binding.js +250 -0
  7. package/lib/acceptance-binding.js.map +1 -0
  8. package/lib/admission.d.ts +95 -0
  9. package/lib/admission.d.ts.map +1 -0
  10. package/lib/admission.js +642 -0
  11. package/lib/admission.js.map +1 -0
  12. package/lib/authority.d.ts +99 -0
  13. package/lib/authority.d.ts.map +1 -0
  14. package/lib/authority.js +233 -0
  15. package/lib/authority.js.map +1 -0
  16. package/lib/config.d.ts +365 -0
  17. package/lib/config.d.ts.map +1 -0
  18. package/lib/config.js +672 -0
  19. package/lib/config.js.map +1 -0
  20. package/lib/continuation-contract.d.ts +126 -0
  21. package/lib/continuation-contract.d.ts.map +1 -0
  22. package/lib/continuation-contract.js +109 -0
  23. package/lib/continuation-contract.js.map +1 -0
  24. package/lib/continuation-record.d.ts +32 -0
  25. package/lib/continuation-record.d.ts.map +1 -0
  26. package/lib/continuation-record.js +57 -0
  27. package/lib/continuation-record.js.map +1 -0
  28. package/lib/continuation.d.ts +89 -0
  29. package/lib/continuation.d.ts.map +1 -0
  30. package/lib/continuation.js +607 -0
  31. package/lib/continuation.js.map +1 -0
  32. package/lib/diagnosis-contract.d.ts +95 -0
  33. package/lib/diagnosis-contract.d.ts.map +1 -0
  34. package/lib/diagnosis-contract.js +167 -0
  35. package/lib/diagnosis-contract.js.map +1 -0
  36. package/lib/diagnosis.d.ts +70 -0
  37. package/lib/diagnosis.d.ts.map +1 -0
  38. package/lib/diagnosis.js +466 -0
  39. package/lib/diagnosis.js.map +1 -0
  40. package/lib/dispatch.d.ts +100 -0
  41. package/lib/dispatch.d.ts.map +1 -0
  42. package/lib/dispatch.js +317 -0
  43. package/lib/dispatch.js.map +1 -0
  44. package/lib/engineering-context.d.ts +86 -0
  45. package/lib/engineering-context.d.ts.map +1 -0
  46. package/lib/engineering-context.js +263 -0
  47. package/lib/engineering-context.js.map +1 -0
  48. package/lib/evaluation.d.ts +125 -0
  49. package/lib/evaluation.d.ts.map +1 -0
  50. package/lib/evaluation.js +295 -0
  51. package/lib/evaluation.js.map +1 -0
  52. package/lib/event-follow.d.ts +93 -0
  53. package/lib/event-follow.d.ts.map +1 -0
  54. package/lib/event-follow.js +150 -0
  55. package/lib/event-follow.js.map +1 -0
  56. package/lib/feedback-targets.d.ts +91 -0
  57. package/lib/feedback-targets.d.ts.map +1 -0
  58. package/lib/feedback-targets.js +362 -0
  59. package/lib/feedback-targets.js.map +1 -0
  60. package/lib/index.d.ts +27 -0
  61. package/lib/index.d.ts.map +1 -0
  62. package/lib/index.js +25 -0
  63. package/lib/index.js.map +1 -0
  64. package/lib/intake-admission.d.ts +49 -0
  65. package/lib/intake-admission.d.ts.map +1 -0
  66. package/lib/intake-admission.js +100 -0
  67. package/lib/intake-admission.js.map +1 -0
  68. package/lib/intake-evaluation-runtime.d.ts +74 -0
  69. package/lib/intake-evaluation-runtime.d.ts.map +1 -0
  70. package/lib/intake-evaluation-runtime.js +343 -0
  71. package/lib/intake-evaluation-runtime.js.map +1 -0
  72. package/lib/intake-evaluation.d.ts +180 -0
  73. package/lib/intake-evaluation.d.ts.map +1 -0
  74. package/lib/intake-evaluation.js +440 -0
  75. package/lib/intake-evaluation.js.map +1 -0
  76. package/lib/intake.d.ts +118 -0
  77. package/lib/intake.d.ts.map +1 -0
  78. package/lib/intake.js +137 -0
  79. package/lib/intake.js.map +1 -0
  80. package/lib/ledger.d.ts +86 -0
  81. package/lib/ledger.d.ts.map +1 -0
  82. package/lib/ledger.js +145 -0
  83. package/lib/ledger.js.map +1 -0
  84. package/lib/mandate.d.ts +45 -0
  85. package/lib/mandate.d.ts.map +1 -0
  86. package/lib/mandate.js +168 -0
  87. package/lib/mandate.js.map +1 -0
  88. package/lib/outcome.d.ts +137 -0
  89. package/lib/outcome.d.ts.map +1 -0
  90. package/lib/outcome.js +303 -0
  91. package/lib/outcome.js.map +1 -0
  92. package/lib/owner-access.d.ts +35 -0
  93. package/lib/owner-access.d.ts.map +1 -0
  94. package/lib/owner-access.js +152 -0
  95. package/lib/owner-access.js.map +1 -0
  96. package/lib/owner-continuation.d.ts +27 -0
  97. package/lib/owner-continuation.d.ts.map +1 -0
  98. package/lib/owner-continuation.js +131 -0
  99. package/lib/owner-continuation.js.map +1 -0
  100. package/lib/owner-recall.d.ts +85 -0
  101. package/lib/owner-recall.d.ts.map +1 -0
  102. package/lib/owner-recall.js +134 -0
  103. package/lib/owner-recall.js.map +1 -0
  104. package/lib/owner-replies.d.ts +44 -0
  105. package/lib/owner-replies.d.ts.map +1 -0
  106. package/lib/owner-replies.js +268 -0
  107. package/lib/owner-replies.js.map +1 -0
  108. package/lib/peers.d.ts +624 -0
  109. package/lib/peers.d.ts.map +1 -0
  110. package/lib/peers.js +10 -0
  111. package/lib/peers.js.map +1 -0
  112. package/lib/policy-notice.d.ts +31 -0
  113. package/lib/policy-notice.d.ts.map +1 -0
  114. package/lib/policy-notice.js +137 -0
  115. package/lib/policy-notice.js.map +1 -0
  116. package/lib/reply-contract.d.ts +67 -0
  117. package/lib/reply-contract.d.ts.map +1 -0
  118. package/lib/reply-contract.js +58 -0
  119. package/lib/reply-contract.js.map +1 -0
  120. package/lib/service.d.ts +632 -0
  121. package/lib/service.d.ts.map +1 -0
  122. package/lib/service.js +2447 -0
  123. package/lib/service.js.map +1 -0
  124. package/lib/settlement.d.ts +74 -0
  125. package/lib/settlement.d.ts.map +1 -0
  126. package/lib/settlement.js +233 -0
  127. package/lib/settlement.js.map +1 -0
  128. package/lib/signals.d.ts +176 -0
  129. package/lib/signals.d.ts.map +1 -0
  130. package/lib/signals.js +497 -0
  131. package/lib/signals.js.map +1 -0
  132. package/lib/store.d.ts +791 -0
  133. package/lib/store.d.ts.map +1 -0
  134. package/lib/store.js +3266 -0
  135. package/lib/store.js.map +1 -0
  136. package/lib/tools.d.ts +7 -0
  137. package/lib/tools.d.ts.map +1 -0
  138. package/lib/tools.js +443 -0
  139. package/lib/tools.js.map +1 -0
  140. package/lib/types.d.ts +831 -0
  141. package/lib/types.d.ts.map +1 -0
  142. package/lib/types.js +29 -0
  143. package/lib/types.js.map +1 -0
  144. package/lib/version.d.ts +2 -0
  145. package/lib/version.d.ts.map +1 -0
  146. package/lib/version.js +2 -0
  147. package/lib/version.js.map +1 -0
  148. package/lib/workspace.d.ts +43 -0
  149. package/lib/workspace.d.ts.map +1 -0
  150. package/lib/workspace.js +137 -0
  151. package/lib/workspace.js.map +1 -0
  152. package/package.json +101 -3
@@ -0,0 +1,31 @@
1
+ /**
2
+ * WP21 slice 2: Policy-change notices and follow-up ownership.
3
+ *
4
+ * Both are deterministic projections over durable ledger state. A Policy
5
+ * change never cancels, parks or wakes work: it only records, once per
6
+ * (item, policyVersion), that a live item's frozen mandate basis no longer
7
+ * matches what the current Policy decides. Dispatch re-verification
8
+ * (`WorkItemAuthority.check`) stays the only gate that parks an item.
9
+ */
10
+ import type { WorkItemAuthority } from './authority.js';
11
+ import type { WorkItemStore } from './store.js';
12
+ import type { WorkItemFollowUpInput, WorkItemPolicyChange, WorkItemPolicyChangeResult } from './types.js';
13
+ /** Upper bound on live items one notice call assesses; larger ledgers continue via `next`. */
14
+ export declare const MAX_POLICY_NOTICE_ITEMS = 1000;
15
+ export declare function normalizePolicyChange(value: unknown): WorkItemPolicyChange;
16
+ export declare function normalizeFollowUp(value: unknown): WorkItemFollowUpInput;
17
+ /**
18
+ * Compute which live items a Policy version affects and record one durable
19
+ * notice per affected item.
20
+ *
21
+ * Idempotent across restarts: the notice is keyed by (item, policyVersion) in
22
+ * the ledger, so replaying the same version writes nothing new. Items Policy
23
+ * cannot answer for are reported and retried by the next call with the same
24
+ * version. No item state, lease or dispatch is touched.
25
+ *
26
+ * One call assesses at most {@link MAX_POLICY_NOTICE_ITEMS} live items in
27
+ * admission order; it never truncates silently: `remaining` counts the live
28
+ * items after the page and `next` continues the pass.
29
+ */
30
+ export declare function noticePolicyChange(store: WorkItemStore, authority: WorkItemAuthority, change: WorkItemPolicyChange, pageSize?: number): WorkItemPolicyChangeResult;
31
+ //# sourceMappingURL=policy-notice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-notice.d.ts","sourceRoot":"","sources":["../src/policy-notice.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAE3B,MAAM,YAAY,CAAA;AAGnB,8FAA8F;AAC9F,eAAO,MAAM,uBAAuB,OAAO,CAAA;AAsB3C,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAa1E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CAUvE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,GAAE,MAAgC,GACzC,0BAA0B,CAiD5B"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * WP21 slice 2: Policy-change notices and follow-up ownership.
3
+ *
4
+ * Both are deterministic projections over durable ledger state. A Policy
5
+ * change never cancels, parks or wakes work: it only records, once per
6
+ * (item, policyVersion), that a live item's frozen mandate basis no longer
7
+ * matches what the current Policy decides. Dispatch re-verification
8
+ * (`WorkItemAuthority.check`) stays the only gate that parks an item.
9
+ */
10
+ import { WorkItemError } from './types.js';
11
+ /** Upper bound on live items one notice call assesses; larger ledgers continue via `next`. */
12
+ export const MAX_POLICY_NOTICE_ITEMS = 1000;
13
+ const MAX_TOKEN = 256;
14
+ function invalid(message) {
15
+ throw new WorkItemError('invalid-input', message);
16
+ }
17
+ /** Printable, bounded, non-empty identity token. */
18
+ function token(value, field) {
19
+ if (typeof value !== 'string' || value.length === 0 || value.length > MAX_TOKEN || !/^[\x21-\x7e]+$/.test(value)) {
20
+ invalid(`${field} must be a printable token of 1-${MAX_TOKEN} characters`);
21
+ }
22
+ return value;
23
+ }
24
+ function exactKeys(value, keys, what) {
25
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
26
+ invalid(`${what} must be an object`);
27
+ const record = value;
28
+ for (const key of Object.keys(record))
29
+ if (!keys.includes(key))
30
+ invalid(`${what} has unknown field ${key}`);
31
+ return record;
32
+ }
33
+ export function normalizePolicyChange(value) {
34
+ const record = exactKeys(value, ['protocol', 'policyVersion', 'after'], 'policy change');
35
+ if (record['protocol'] !== 'work-items/policy-change/v1')
36
+ invalid('policy change protocol is not work-items/policy-change/v1');
37
+ const policyVersion = token(record['policyVersion'], 'policyVersion');
38
+ if (record['after'] === undefined)
39
+ return Object.freeze({ protocol: 'work-items/policy-change/v1', policyVersion });
40
+ const after = exactKeys(record['after'], ['createdAt', 'id'], 'policy change cursor');
41
+ const createdAt = after['createdAt'];
42
+ if (typeof createdAt !== 'number' || !Number.isSafeInteger(createdAt) || createdAt < 0)
43
+ invalid('cursor createdAt must be a non-negative integer');
44
+ return Object.freeze({
45
+ protocol: 'work-items/policy-change/v1',
46
+ policyVersion,
47
+ after: Object.freeze({ createdAt, id: token(after['id'], 'cursor id') }),
48
+ });
49
+ }
50
+ export function normalizeFollowUp(value) {
51
+ const record = exactKeys(value, ['protocol', 'itemId', 'bindingId', 'messageId', 'sourceDigest'], 'follow-up');
52
+ if (record['protocol'] !== 'work-items/follow-up/v1')
53
+ invalid('follow-up protocol is not work-items/follow-up/v1');
54
+ return Object.freeze({
55
+ protocol: 'work-items/follow-up/v1',
56
+ itemId: token(record['itemId'], 'itemId'),
57
+ bindingId: token(record['bindingId'], 'bindingId'),
58
+ messageId: token(record['messageId'], 'messageId'),
59
+ sourceDigest: token(record['sourceDigest'], 'sourceDigest'),
60
+ });
61
+ }
62
+ /**
63
+ * Compute which live items a Policy version affects and record one durable
64
+ * notice per affected item.
65
+ *
66
+ * Idempotent across restarts: the notice is keyed by (item, policyVersion) in
67
+ * the ledger, so replaying the same version writes nothing new. Items Policy
68
+ * cannot answer for are reported and retried by the next call with the same
69
+ * version. No item state, lease or dispatch is touched.
70
+ *
71
+ * One call assesses at most {@link MAX_POLICY_NOTICE_ITEMS} live items in
72
+ * admission order; it never truncates silently: `remaining` counts the live
73
+ * items after the page and `next` continues the pass.
74
+ */
75
+ export function noticePolicyChange(store, authority, change, pageSize = MAX_POLICY_NOTICE_ITEMS) {
76
+ // A peer that cannot evaluate at all leaves the ledger untouched, including
77
+ // locally-judged malformed bases that need no Policy call.
78
+ const missing = authority.assessUnavailable();
79
+ if (missing !== null)
80
+ return Object.freeze({ outcome: 'unavailable', detail: missing });
81
+ const limit = Math.max(1, Math.min(Math.trunc(pageSize), MAX_POLICY_NOTICE_ITEMS));
82
+ const page = store.listLiveItemsPage({ ...(change.after === undefined ? {} : { after: change.after }), limit });
83
+ const notified = [];
84
+ const alreadyNotified = [];
85
+ const unavailable = [];
86
+ let unaffected = 0;
87
+ let legacy = 0;
88
+ // Assess everything first (evaluate is side-effect free), then write every
89
+ // affected notice in one transaction.
90
+ const affected = [];
91
+ for (const item of page.items) {
92
+ const assessment = authority.assess(item);
93
+ if (assessment.kind === 'unavailable') {
94
+ unavailable.push(item.id);
95
+ continue;
96
+ }
97
+ if (assessment.kind === 'legacy') {
98
+ legacy += 1;
99
+ continue;
100
+ }
101
+ if (assessment.kind === 'allow') {
102
+ unaffected += 1;
103
+ continue;
104
+ }
105
+ const basis = item.authority;
106
+ affected.push(Object.freeze({
107
+ itemId: item.id,
108
+ notice: Object.freeze({
109
+ reasonCode: assessment.reasonCode,
110
+ frozenRuleId: basis?.mandate?.ruleId ?? basis?.ruleId ?? null,
111
+ currentRuleId: assessment.currentRuleId,
112
+ decisionId: basis?.mandate?.decisionId ?? null,
113
+ }),
114
+ }));
115
+ }
116
+ const recorded = store.recordPolicyNotices(change.policyVersion, affected);
117
+ recorded.forEach((notice, index) => {
118
+ if (notice === undefined)
119
+ alreadyNotified.push(affected[index].itemId);
120
+ else
121
+ notified.push(notice);
122
+ });
123
+ const last = page.items.at(-1);
124
+ const next = page.remaining > 0 && last !== undefined ? Object.freeze({ createdAt: last.createdAt, id: last.id }) : null;
125
+ return Object.freeze({
126
+ outcome: 'noticed',
127
+ policyVersion: change.policyVersion,
128
+ notified: Object.freeze(notified),
129
+ alreadyNotified: Object.freeze(alreadyNotified),
130
+ unaffected,
131
+ legacy,
132
+ unavailable: Object.freeze(unavailable),
133
+ next,
134
+ remaining: page.remaining,
135
+ });
136
+ }
137
+ //# sourceMappingURL=policy-notice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-notice.js","sourceRoot":"","sources":["../src/policy-notice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { NormalizedConfig } from './config.js';
2
+ import type { WorkItemReplySource } from './peers.js';
3
+ import type { WorkItemRecord } from './types.js';
4
+ import { type ContinuationActivation, type ContinuationParent, type ContinuationProductionProof, type ContinuationSource, type WorkItemContinuationPlan } from './continuation-contract.js';
5
+ export interface ReplySupplierEvidence {
6
+ readonly kind: 'diagnosis-plan' | 'continuation-plan';
7
+ readonly itemId: string;
8
+ /** SHA-256 of the complete canonical parent plan, including its own digest. */
9
+ readonly planDigest: string;
10
+ readonly production: ContinuationProductionProof;
11
+ }
12
+ export declare function immutableReply(source: WorkItemReplySource): {
13
+ protocol: "assistant-delivery/work-item-reply/v1";
14
+ id: string;
15
+ sourceDigest: string;
16
+ admissionCursor: Readonly<{
17
+ epoch: string;
18
+ sequence: number;
19
+ }>;
20
+ inputSha256: string;
21
+ inputBytes: number;
22
+ scope: Readonly<{
23
+ workspace: string;
24
+ preset: string;
25
+ }>;
26
+ principalId: string;
27
+ owner: Readonly<{
28
+ principalRecordId: string;
29
+ principalVersion: number;
30
+ }>;
31
+ binding: Readonly<{
32
+ id: string;
33
+ version: number;
34
+ generation: number;
35
+ }>;
36
+ target: Readonly<{
37
+ outboxId: string;
38
+ providerMessageId: string;
39
+ itemId: string;
40
+ reportRevision: number;
41
+ reportDigest: string;
42
+ streamId: string;
43
+ }>;
44
+ };
45
+ export interface WorkItemReplyContinuationPlan extends Omit<WorkItemContinuationPlan, 'protocol' | 'source' | 'authorization'> {
46
+ readonly protocol: 'assistant-work-items/owner-continuation-plan/v2';
47
+ readonly source: WorkItemContinuationPlan['source'] & Readonly<{
48
+ origin: Readonly<{
49
+ kind: 'owner-report-reply';
50
+ reply: ReturnType<typeof immutableReply>;
51
+ supplier: ReplySupplierEvidence;
52
+ }>;
53
+ }>;
54
+ readonly authorization: Omit<WorkItemContinuationPlan['authorization'], 'modelOrigin'> & Readonly<{
55
+ modelOrigin: 'inherited-parent-execution';
56
+ }>;
57
+ }
58
+ export type StoredContinuationPlan = WorkItemContinuationPlan | WorkItemReplyContinuationPlan;
59
+ export declare const isReplyContinuationPlan: (plan: StoredContinuationPlan) => plan is WorkItemReplyContinuationPlan;
60
+ export declare function createReplyContinuationPlan(item: WorkItemRecord, source: WorkItemReplySource, parent: ContinuationParent, supplier: Readonly<{
61
+ modelSelection: ContinuationSource['modelSelection'];
62
+ evidence: ReplySupplierEvidence;
63
+ }>, config: NormalizedConfig, activation: ContinuationActivation, schemas: readonly {
64
+ name: string;
65
+ }[]): Readonly<WorkItemReplyContinuationPlan>;
66
+ export declare function parseStoredContinuationPlan(text: string): Readonly<StoredContinuationPlan>;
67
+ //# sourceMappingURL=reply-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply-contract.d.ts","sourceRoot":"","sources":["../src/reply-contract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,OAAO,EACL,KAAK,sBAAsB,EAAE,KAAK,kBAAkB,EAAE,KAAK,2BAA2B,EAAE,KAAK,kBAAkB,EAAE,KAAK,wBAAwB,EAAE,MAAM,4BAA4B,CAAA;AAEpL,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAC,gBAAgB,GAAC,mBAAmB,CAAA;IAClD,QAAQ,CAAC,MAAM,EAAC,MAAM,CAAA;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,EAAC,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,EAAC,2BAA2B,CAAA;CAChD;AACD,wBAAgB,cAAc,CAAC,MAAM,EAAC,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASxD;AACD,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CAAC,wBAAwB,EAAC,UAAU,GAAC,QAAQ,GAAC,eAAe,CAAC;IACvH,QAAQ,CAAC,QAAQ,EAAC,iDAAiD,CAAA;IACnE,QAAQ,CAAC,MAAM,EAAC,wBAAwB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;QAC5D,MAAM,EAAC,QAAQ,CAAC;YAAC,IAAI,EAAC,oBAAoB,CAAC;YAAA,KAAK,EAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;YAAA,QAAQ,EAAC,qBAAqB,CAAA;SAAC,CAAC,CAAA;KACpH,CAAC,CAAA;IACF,QAAQ,CAAC,aAAa,EAAC,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,EAAC,aAAa,CAAC,GAAG,QAAQ,CAAC;QAAC,WAAW,EAAC,4BAA4B,CAAA;KAAC,CAAC,CAAA;CAC5I;AACD,MAAM,MAAM,sBAAsB,GAAC,wBAAwB,GAAC,6BAA6B,CAAA;AACzF,eAAO,MAAM,uBAAuB,GAAE,MAAK,sBAAsB,KAAE,IAAI,IAAI,6BAAgG,CAAA;AAE3K,wBAAgB,2BAA2B,CAAC,IAAI,EAAC,cAAc,EAAC,MAAM,EAAC,mBAAmB,EAAC,MAAM,EAAC,kBAAkB,EAClH,QAAQ,EAAC,QAAQ,CAAC;IAAC,cAAc,EAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAAA,QAAQ,EAAC,qBAAqB,CAAA;CAAC,CAAC,EACvG,MAAM,EAAC,gBAAgB,EAAC,UAAU,EAAC,sBAAsB,EAAC,OAAO,EAAC,SAAS;IAAC,IAAI,EAAC,MAAM,CAAA;CAAC,EAAE,GAAE,QAAQ,CAAC,6BAA6B,CAAC,CAcpI;AACD,wBAAgB,2BAA2B,CAAC,IAAI,EAAC,MAAM,GAAE,QAAQ,CAAC,sBAAsB,CAAC,CAcxF"}
@@ -0,0 +1,58 @@
1
+ import { acceptanceCanonicalJson, acceptanceDigest } from '@dsh-enhanced/task-acceptance-contract';
2
+ import { MAX_CONTINUATION_INPUT_BYTES, MAX_CONTINUATION_PLAN_BYTES, continuationDigest } from './continuation-record.js';
3
+ import { continuationFail, createContinuationPlan, parseContinuationPlan } from './continuation-contract.js';
4
+ export function immutableReply(source) {
5
+ if (source.protocol !== 'assistant-delivery/work-item-reply/v1' || typeof source.id !== 'string' || !source.id
6
+ || !/^[a-f0-9]{64}$/u.test(source.sourceDigest) || source.inputSha256 !== continuationDigest(source.inputText)
7
+ || source.inputBytes !== Buffer.byteLength(source.inputText) || source.inputBytes < 1 || source.inputBytes > MAX_CONTINUATION_INPUT_BYTES
8
+ || Buffer.from(source.inputText, 'utf8').toString('utf8') !== source.inputText)
9
+ continuationFail('reply source bytes invalid');
10
+ // ACK, delivery status and mutable stream head do not change source identity.
11
+ return { protocol: source.protocol, id: source.id, sourceDigest: source.sourceDigest, admissionCursor: source.admissionCursor,
12
+ inputSha256: source.inputSha256, inputBytes: source.inputBytes, scope: source.scope, principalId: source.principalId,
13
+ owner: source.owner, binding: source.binding, target: source.target };
14
+ }
15
+ export const isReplyContinuationPlan = (plan) => plan.protocol === 'assistant-work-items/owner-continuation-plan/v2';
16
+ export function createReplyContinuationPlan(item, source, parent, supplier, config, activation, schemas) {
17
+ if (!config.ownerReplyContinuation || source.state === 'cancelled' || source.executionParentItemId !== parent.itemId
18
+ || source.scope.workspace !== item.scope.workspace || source.scope.preset !== item.scope.preset || source.principalId !== item.scope.principalId
19
+ || source.owner.principalRecordId !== item.owner.principalRecordId || source.owner.principalVersion !== item.owner.principalVersion
20
+ || source.binding.id !== item.originBindingId || source.binding.version !== item.owner.bindingVersion || source.binding.generation !== item.owner.generation
21
+ || supplier.evidence.itemId !== parent.itemId || acceptanceCanonicalJson(supplier.evidence.production) !== acceptanceCanonicalJson(parent.production))
22
+ continuationFail('reply source admission association differs');
23
+ const base = createContinuationPlan(item, { sourceDigest: source.sourceDigest, inputText: source.inputText, modelSelection: supplier.modelSelection }, parent, config, activation, schemas);
24
+ const { digest: _digest, ...common } = base;
25
+ const unsigned = { ...common, protocol: 'assistant-work-items/owner-continuation-plan/v2',
26
+ source: { ...base.source, origin: { kind: 'owner-report-reply', reply: immutableReply(source), supplier: supplier.evidence } },
27
+ authorization: { ...base.authorization, modelOrigin: 'inherited-parent-execution' } };
28
+ const value = { ...unsigned, digest: acceptanceDigest(unsigned) }, text = acceptanceCanonicalJson(value);
29
+ if (Buffer.byteLength(text) > MAX_CONTINUATION_PLAN_BYTES)
30
+ continuationFail('reply plan exceeds byte bound');
31
+ return Object.freeze(JSON.parse(text));
32
+ }
33
+ export function parseStoredContinuationPlan(text) {
34
+ if (typeof text !== 'string' || Buffer.byteLength(text) > MAX_CONTINUATION_PLAN_BYTES)
35
+ continuationFail('stored plan exceeds bound');
36
+ let value;
37
+ try {
38
+ value = JSON.parse(text);
39
+ }
40
+ catch {
41
+ continuationFail('stored plan is not JSON');
42
+ }
43
+ if (!value || typeof value !== 'object' || Array.isArray(value))
44
+ continuationFail('stored plan malformed');
45
+ if (value.protocol !== 'assistant-work-items/owner-continuation-plan/v2')
46
+ return parseContinuationPlan(text);
47
+ const plan = value;
48
+ if (acceptanceCanonicalJson(plan) !== text || Object.keys(plan).sort().join() !== ['protocol', 'item', 'source', 'parent', 'authorization', 'activation', 'toolSchemas', 'contract', 'digest'].sort().join()
49
+ || !plan.source || !plan.source.origin || plan.source.origin.kind !== 'owner-report-reply' || !plan.source.origin.reply || !plan.source.origin.supplier
50
+ || plan.source.origin.reply.protocol !== 'assistant-delivery/work-item-reply/v1'
51
+ || plan.authorization?.modelOrigin !== 'inherited-parent-execution')
52
+ continuationFail('stored reply plan malformed');
53
+ const { digest, ...unsigned } = plan;
54
+ if (typeof digest !== 'string' || digest !== acceptanceDigest(unsigned))
55
+ continuationFail('stored reply plan digest differs');
56
+ return Object.freeze(plan);
57
+ }
58
+ //# sourceMappingURL=reply-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply-contract.js","sourceRoot":"","sources":["../src/reply-contract.ts"],"names":[],"mappings":"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"}