@fabric-harness/sdk 1.13.0 → 2.0.0

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 (169) hide show
  1. package/dist/action.d.ts +69 -0
  2. package/dist/action.d.ts.map +1 -0
  3. package/dist/action.js +119 -0
  4. package/dist/action.js.map +1 -0
  5. package/dist/agent-definition.d.ts +6 -0
  6. package/dist/agent-definition.d.ts.map +1 -1
  7. package/dist/agent-definition.js.map +1 -1
  8. package/dist/agent.d.ts +2 -0
  9. package/dist/agent.d.ts.map +1 -1
  10. package/dist/agent.js +35 -1
  11. package/dist/agent.js.map +1 -1
  12. package/dist/attachment-store-contract.d.ts +34 -0
  13. package/dist/attachment-store-contract.d.ts.map +1 -0
  14. package/dist/attachment-store-contract.js +0 -0
  15. package/dist/attachment-store-contract.js.map +1 -0
  16. package/dist/attachment-store.d.ts +107 -0
  17. package/dist/attachment-store.d.ts.map +1 -0
  18. package/dist/attachment-store.js +164 -0
  19. package/dist/attachment-store.js.map +1 -0
  20. package/dist/channel.d.ts +84 -0
  21. package/dist/channel.d.ts.map +1 -0
  22. package/dist/channel.js +115 -0
  23. package/dist/channel.js.map +1 -0
  24. package/dist/context-budget.d.ts +16 -0
  25. package/dist/context-budget.d.ts.map +1 -1
  26. package/dist/context-budget.js +38 -3
  27. package/dist/context-budget.js.map +1 -1
  28. package/dist/conversation-projection.d.ts +52 -0
  29. package/dist/conversation-projection.d.ts.map +1 -0
  30. package/dist/conversation-projection.js +207 -0
  31. package/dist/conversation-projection.js.map +1 -0
  32. package/dist/conversation-stream-contract.d.ts +37 -0
  33. package/dist/conversation-stream-contract.d.ts.map +1 -0
  34. package/dist/conversation-stream-contract.js +453 -0
  35. package/dist/conversation-stream-contract.js.map +1 -0
  36. package/dist/conversation-stream.d.ts +141 -0
  37. package/dist/conversation-stream.d.ts.map +1 -0
  38. package/dist/conversation-stream.js +159 -0
  39. package/dist/conversation-stream.js.map +1 -0
  40. package/dist/cost-budget.d.ts +106 -1
  41. package/dist/cost-budget.d.ts.map +1 -1
  42. package/dist/cost-budget.js +48 -2
  43. package/dist/cost-budget.js.map +1 -1
  44. package/dist/delivered-message.d.ts +90 -0
  45. package/dist/delivered-message.d.ts.map +1 -0
  46. package/dist/delivered-message.js +154 -0
  47. package/dist/delivered-message.js.map +1 -0
  48. package/dist/dispatch.d.ts +108 -0
  49. package/dist/dispatch.d.ts.map +1 -0
  50. package/dist/dispatch.js +179 -0
  51. package/dist/dispatch.js.map +1 -0
  52. package/dist/error.d.ts +1 -1
  53. package/dist/error.d.ts.map +1 -1
  54. package/dist/error.js.map +1 -1
  55. package/dist/history.d.ts +49 -2
  56. package/dist/history.d.ts.map +1 -1
  57. package/dist/history.js +163 -0
  58. package/dist/history.js.map +1 -1
  59. package/dist/in-memory-submission-store.d.ts +53 -0
  60. package/dist/in-memory-submission-store.d.ts.map +1 -0
  61. package/dist/in-memory-submission-store.js +340 -0
  62. package/dist/in-memory-submission-store.js.map +1 -0
  63. package/dist/index.d.ts +51 -13
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +28 -7
  66. package/dist/index.js.map +1 -1
  67. package/dist/loop.d.ts +29 -3
  68. package/dist/loop.d.ts.map +1 -1
  69. package/dist/loop.js +167 -24
  70. package/dist/loop.js.map +1 -1
  71. package/dist/model.d.ts +37 -0
  72. package/dist/model.d.ts.map +1 -1
  73. package/dist/model.js +250 -79
  74. package/dist/model.js.map +1 -1
  75. package/dist/otel-observer.d.ts +44 -0
  76. package/dist/otel-observer.d.ts.map +1 -0
  77. package/dist/otel-observer.js +165 -0
  78. package/dist/otel-observer.js.map +1 -0
  79. package/dist/persistence.d.ts +70 -0
  80. package/dist/persistence.d.ts.map +1 -0
  81. package/dist/persistence.js +17 -0
  82. package/dist/persistence.js.map +1 -0
  83. package/dist/persistent-agent.d.ts +86 -0
  84. package/dist/persistent-agent.d.ts.map +1 -0
  85. package/dist/persistent-agent.js +75 -0
  86. package/dist/persistent-agent.js.map +1 -0
  87. package/dist/pi-loop-runtime.d.ts.map +1 -1
  88. package/dist/pi-loop-runtime.js +7 -1
  89. package/dist/pi-loop-runtime.js.map +1 -1
  90. package/dist/profile.d.ts +33 -0
  91. package/dist/profile.d.ts.map +1 -0
  92. package/dist/profile.js +10 -0
  93. package/dist/profile.js.map +1 -0
  94. package/dist/providers.d.ts +14 -0
  95. package/dist/providers.d.ts.map +1 -1
  96. package/dist/providers.js +18 -1
  97. package/dist/providers.js.map +1 -1
  98. package/dist/result.d.ts +12 -0
  99. package/dist/result.d.ts.map +1 -1
  100. package/dist/result.js +26 -0
  101. package/dist/result.js.map +1 -1
  102. package/dist/retrieval.d.ts +61 -0
  103. package/dist/retrieval.d.ts.map +1 -0
  104. package/dist/retrieval.js +26 -0
  105. package/dist/retrieval.js.map +1 -0
  106. package/dist/runtime-mode.d.ts +1 -1
  107. package/dist/runtime-mode.d.ts.map +1 -1
  108. package/dist/runtime-mode.js +2 -1
  109. package/dist/runtime-mode.js.map +1 -1
  110. package/dist/scope-key.d.ts +25 -0
  111. package/dist/scope-key.d.ts.map +1 -0
  112. package/dist/scope-key.js +34 -0
  113. package/dist/scope-key.js.map +1 -0
  114. package/dist/session.d.ts +47 -1
  115. package/dist/session.d.ts.map +1 -1
  116. package/dist/session.js +364 -35
  117. package/dist/session.js.map +1 -1
  118. package/dist/skills.d.ts +33 -0
  119. package/dist/skills.d.ts.map +1 -0
  120. package/dist/skills.js +65 -0
  121. package/dist/skills.js.map +1 -0
  122. package/dist/store.d.ts +36 -1
  123. package/dist/store.d.ts.map +1 -1
  124. package/dist/store.js +83 -0
  125. package/dist/store.js.map +1 -1
  126. package/dist/stream-chunks.d.ts +42 -0
  127. package/dist/stream-chunks.d.ts.map +1 -0
  128. package/dist/stream-chunks.js +138 -0
  129. package/dist/stream-chunks.js.map +1 -0
  130. package/dist/strict.d.ts +40 -11
  131. package/dist/strict.d.ts.map +1 -1
  132. package/dist/strict.js +22 -7
  133. package/dist/strict.js.map +1 -1
  134. package/dist/submission-context.d.ts +26 -0
  135. package/dist/submission-context.d.ts.map +1 -0
  136. package/dist/submission-context.js +20 -0
  137. package/dist/submission-context.js.map +1 -0
  138. package/dist/submission-runner.d.ts +150 -0
  139. package/dist/submission-runner.d.ts.map +1 -0
  140. package/dist/submission-runner.js +767 -0
  141. package/dist/submission-runner.js.map +1 -0
  142. package/dist/submission-state.d.ts +50 -0
  143. package/dist/submission-state.d.ts.map +1 -0
  144. package/dist/submission-state.js +82 -0
  145. package/dist/submission-state.js.map +1 -0
  146. package/dist/submission-store-contract.d.ts +31 -0
  147. package/dist/submission-store-contract.d.ts.map +1 -0
  148. package/dist/submission-store-contract.js +730 -0
  149. package/dist/submission-store-contract.js.map +1 -0
  150. package/dist/submission-store.d.ts +365 -0
  151. package/dist/submission-store.d.ts.map +1 -0
  152. package/dist/submission-store.js +191 -0
  153. package/dist/submission-store.js.map +1 -0
  154. package/dist/submission-telemetry.d.ts +56 -0
  155. package/dist/submission-telemetry.d.ts.map +1 -0
  156. package/dist/submission-telemetry.js +36 -0
  157. package/dist/submission-telemetry.js.map +1 -0
  158. package/dist/testing-contracts.d.ts +17 -0
  159. package/dist/testing-contracts.d.ts.map +1 -0
  160. package/dist/testing-contracts.js +14 -0
  161. package/dist/testing-contracts.js.map +1 -0
  162. package/dist/tools.d.ts +32 -4
  163. package/dist/tools.d.ts.map +1 -1
  164. package/dist/tools.js +132 -6
  165. package/dist/tools.js.map +1 -1
  166. package/dist/types.d.ts +132 -3
  167. package/dist/types.d.ts.map +1 -1
  168. package/dist/types.js.map +1 -1
  169. package/package.json +16 -8
@@ -0,0 +1,154 @@
1
+ import { renderSignalMessage } from './history.js';
2
+ /** Maximum accepted base64 length for a single inline attachment. */
3
+ export const MAX_ATTACHMENT_DATA_LENGTH = 14 * 1024 * 1024;
4
+ /**
5
+ * The tag name is rendered (escaped attributes/body, but the tag itself is
6
+ * structural) as the signal's XML envelope in model context, so it must be a
7
+ * valid XML name — anything looser would let a caller-controlled value
8
+ * inject markup that the body/attribute escaping exists to prevent.
9
+ */
10
+ const XML_TAG_NAME_RE = /^[A-Za-z_][A-Za-z0-9_.-]*$/;
11
+ /** Thrown by {@link parseDeliveredMessage} on malformed input. */
12
+ export class InvalidDeliveredMessageError extends Error {
13
+ code = 'INVALID_DELIVERED_MESSAGE';
14
+ constructor(reason) {
15
+ super(reason);
16
+ this.name = 'InvalidDeliveredMessageError';
17
+ }
18
+ }
19
+ const SHAPE_HINT = 'Delivered messages must be { kind: "user", body: string, attachments?: attachment[] } ' +
20
+ 'or { kind: "signal", type: string, body: string, attributes?: Record<string, string>, tagName?: string }.';
21
+ function isRecord(value) {
22
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
23
+ }
24
+ /**
25
+ * Validate a raw value as a {@link DeliveredMessage}. Shared by dispatch
26
+ * admission and the direct HTTP route so every transport produces the same
27
+ * structured error on bad input.
28
+ */
29
+ export function parseDeliveredMessage(value) {
30
+ if (!isRecord(value))
31
+ throw new InvalidDeliveredMessageError(SHAPE_HINT);
32
+ if (value.kind === 'user') {
33
+ if (typeof value.body !== 'string')
34
+ throw new InvalidDeliveredMessageError(SHAPE_HINT);
35
+ let attachments;
36
+ if (value.attachments !== undefined) {
37
+ if (!Array.isArray(value.attachments))
38
+ throw new InvalidDeliveredMessageError(SHAPE_HINT);
39
+ attachments = value.attachments.map((raw) => parseDeliveredAttachment(raw));
40
+ }
41
+ return { kind: 'user', body: value.body, ...(attachments ? { attachments } : {}) };
42
+ }
43
+ if (value.kind === 'signal') {
44
+ if (typeof value.type !== 'string' || value.type.length === 0) {
45
+ throw new InvalidDeliveredMessageError('Signal message "type" must be a non-empty string.');
46
+ }
47
+ if (typeof value.body !== 'string')
48
+ throw new InvalidDeliveredMessageError(SHAPE_HINT);
49
+ let attributes;
50
+ if (value.attributes !== undefined) {
51
+ if (!isRecord(value.attributes))
52
+ throw new InvalidDeliveredMessageError(SHAPE_HINT);
53
+ attributes = {};
54
+ for (const [key, attr] of Object.entries(value.attributes)) {
55
+ if (typeof attr !== 'string') {
56
+ throw new InvalidDeliveredMessageError('Signal message "attributes" values must be strings.');
57
+ }
58
+ attributes[key] = attr;
59
+ }
60
+ }
61
+ let tagName;
62
+ if (value.tagName !== undefined) {
63
+ if (typeof value.tagName !== 'string' || !XML_TAG_NAME_RE.test(value.tagName)) {
64
+ throw new InvalidDeliveredMessageError('Signal message "tagName" must be a valid XML tag name ' +
65
+ '(letters, digits, "_", "-", "."; must not start with a digit, "-", or ".").');
66
+ }
67
+ tagName = value.tagName;
68
+ }
69
+ return {
70
+ kind: 'signal',
71
+ type: value.type,
72
+ body: value.body,
73
+ ...(attributes ? { attributes } : {}),
74
+ ...(tagName ? { tagName } : {}),
75
+ };
76
+ }
77
+ throw new InvalidDeliveredMessageError(SHAPE_HINT);
78
+ }
79
+ function parseDeliveredAttachment(value) {
80
+ if (!isRecord(value) || value.type !== 'image' || typeof value.mimeType !== 'string') {
81
+ throw new InvalidDeliveredMessageError('Attachments must be { type: "image", data?: base64 string, ref?: { id, digest, sizeBytes }, mimeType: string, filename?: string }.');
82
+ }
83
+ if (value.data === undefined && value.ref === undefined) {
84
+ throw new InvalidDeliveredMessageError('Attachments must carry inline "data" (base64) or a durable "ref".');
85
+ }
86
+ if (value.data !== undefined) {
87
+ if (typeof value.data !== 'string') {
88
+ throw new InvalidDeliveredMessageError('Attachment "data" must be a base64 string when provided.');
89
+ }
90
+ if (value.data.length > MAX_ATTACHMENT_DATA_LENGTH) {
91
+ throw new InvalidDeliveredMessageError(`Attachment data exceeds the ${MAX_ATTACHMENT_DATA_LENGTH} character limit.`);
92
+ }
93
+ }
94
+ let ref;
95
+ if (value.ref !== undefined) {
96
+ const raw = value.ref;
97
+ if (!isRecord(raw) ||
98
+ typeof raw.id !== 'string' ||
99
+ typeof raw.digest !== 'string' ||
100
+ typeof raw.sizeBytes !== 'number') {
101
+ throw new InvalidDeliveredMessageError('Attachment "ref" must be { id: string, digest: string, sizeBytes: number }.');
102
+ }
103
+ ref = { id: raw.id, digest: raw.digest, sizeBytes: raw.sizeBytes };
104
+ }
105
+ if (value.filename !== undefined && typeof value.filename !== 'string') {
106
+ throw new InvalidDeliveredMessageError('Attachment "filename" must be a string when provided.');
107
+ }
108
+ return {
109
+ type: 'image',
110
+ ...(typeof value.data === 'string' ? { data: value.data } : {}),
111
+ mimeType: value.mimeType,
112
+ ...(typeof value.filename === 'string' ? { filename: value.filename } : {}),
113
+ ...(ref ? { ref } : {}),
114
+ };
115
+ }
116
+ /** True when a raw value already looks like a {@link DeliveredMessage} (has a valid `kind`). */
117
+ export function isDeliveredMessageShape(value) {
118
+ return isRecord(value) && (value.kind === 'user' || value.kind === 'signal');
119
+ }
120
+ /**
121
+ * Normalize legacy inputs into a {@link DeliveredMessage}:
122
+ * - a string → a user message with that body
123
+ * - a value with a `kind` discriminator → validated as a DeliveredMessage
124
+ * - any other JSON value → a user message with the JSON-stringified body
125
+ * (matching the historical dispatch rendering, so behavior is unchanged
126
+ * for pre-DeliveredMessage callers)
127
+ */
128
+ export function normalizeDeliveredMessage(input) {
129
+ if (typeof input === 'string')
130
+ return { kind: 'user', body: input };
131
+ if (isDeliveredMessageShape(input))
132
+ return parseDeliveredMessage(input);
133
+ return { kind: 'user', body: JSON.stringify(input ?? null) };
134
+ }
135
+ /**
136
+ * Render a delivered message to the prompt text form. User messages pass
137
+ * their body through verbatim; signals render as their XML envelope via the
138
+ * shared {@link renderSignalMessage} machinery.
139
+ */
140
+ export function renderDeliveredMessage(message) {
141
+ if (message.kind === 'user')
142
+ return message.body;
143
+ return renderSignalMessage(deliveredSignalToEntryData(message));
144
+ }
145
+ /** Map a signal-kind message onto the persisted `signal` entry's data shape. */
146
+ export function deliveredSignalToEntryData(message) {
147
+ return {
148
+ signalType: message.type,
149
+ content: message.body,
150
+ ...(message.attributes ? { attributes: message.attributes } : {}),
151
+ ...(message.tagName ? { tagName: message.tagName } : {}),
152
+ };
153
+ }
154
+ //# sourceMappingURL=delivered-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivered-message.js","sourceRoot":"","sources":["../src/delivered-message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAyDnD,qEAAqE;AACrE,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,eAAe,GAAG,4BAA4B,CAAC;AAErD,kEAAkE;AAClE,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAC5C,IAAI,GAAG,2BAA2B,CAAC;IAC5C,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC7C,CAAC;CACF;AAED,MAAM,UAAU,GACd,wFAAwF;IACxF,2GAA2G,CAAC;AAE9G,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,4BAA4B,CAAC,UAAU,CAAC,CAAC;IAEzE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,4BAA4B,CAAC,UAAU,CAAC,CAAC;QACvF,IAAI,WAA8C,CAAC;QACnD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;gBAAE,MAAM,IAAI,4BAA4B,CAAC,UAAU,CAAC,CAAC;YAC1F,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACrF,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,4BAA4B,CAAC,mDAAmD,CAAC,CAAC;QAC9F,CAAC;QACD,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,4BAA4B,CAAC,UAAU,CAAC,CAAC;QACvF,IAAI,UAA8C,CAAC;QACnD,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;gBAAE,MAAM,IAAI,4BAA4B,CAAC,UAAU,CAAC,CAAC;YACpF,UAAU,GAAG,EAAE,CAAC;YAChB,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3D,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,MAAM,IAAI,4BAA4B,CAAC,qDAAqD,CAAC,CAAC;gBAChG,CAAC;gBACD,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACzB,CAAC;QACH,CAAC;QACD,IAAI,OAA2B,CAAC;QAChC,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9E,MAAM,IAAI,4BAA4B,CACpC,wDAAwD;oBACtD,6EAA6E,CAChF,CAAC;YACJ,CAAC;YACD,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC1B,CAAC;QACD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,4BAA4B,CAAC,UAAU,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC9C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACrF,MAAM,IAAI,4BAA4B,CACpC,oIAAoI,CACrI,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QACxD,MAAM,IAAI,4BAA4B,CACpC,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,4BAA4B,CAAC,0DAA0D,CAAC,CAAC;QACrG,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,0BAA0B,EAAE,CAAC;YACnD,MAAM,IAAI,4BAA4B,CACpC,+BAA+B,0BAA0B,mBAAmB,CAC7E,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,GAAuC,CAAC;IAC5C,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACtB,IACE,CAAC,QAAQ,CAAC,GAAG,CAAC;YACd,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;YAC1B,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;YAC9B,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EACjC,CAAC;YACD,MAAM,IAAI,4BAA4B,CACpC,6EAA6E,CAC9E,CAAC;QACJ,CAAC;QACD,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;IACrE,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACvE,MAAM,IAAI,4BAA4B,CAAC,uDAAuD,CAAC,CAAC;IAClG,CAAC;IACD,OAAO;QACL,IAAI,EAAE,OAAO;QACb,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,GAAG,CAAC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxB,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACpE,IAAI,uBAAuB,CAAC,KAAK,CAAC;QAAE,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACxE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAyB;IAC9D,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC;IACjD,OAAO,mBAAmB,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,0BAA0B,CACxC,OAAsD;IAEtD,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,IAAI;QACxB,OAAO,EAAE,OAAO,CAAC,IAAI;QACrB,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,108 @@
1
+ import type { DeliveredMessage } from './delivered-message.js';
2
+ import type { CreatedAgent } from './persistent-agent.js';
3
+ import type { FabricActor, JsonObject } from './types.js';
4
+ /** Async delivery request to a persistent agent instance + session. */
5
+ export interface AgentDispatchRequest {
6
+ /** Instance id of the target persistent agent. */
7
+ id: string;
8
+ /** Named session within the instance. Defaults to `"default"`. */
9
+ session?: string;
10
+ /**
11
+ * The message delivered to the session. Preferred over `input`; a string
12
+ * or plain JSON `input` is normalized into a user-kind message.
13
+ */
14
+ message?: DeliveredMessage;
15
+ /** Legacy JSON-serializable payload. Normalized into `message` at admission. */
16
+ input?: DeliveredMessage | string | JsonObject;
17
+ }
18
+ /** A dispatch request that names its target agent. */
19
+ export interface NamedAgentDispatchRequest extends AgentDispatchRequest {
20
+ agent: string;
21
+ }
22
+ /** Acceptance confirmation for an enqueued dispatch. */
23
+ export interface DispatchReceipt {
24
+ dispatchId: string;
25
+ acceptedAt: string;
26
+ }
27
+ /** Internal enqueued form, carrying correlation + isolation metadata. */
28
+ export interface DispatchInput {
29
+ dispatchId: string;
30
+ agent: string;
31
+ id: string;
32
+ session: string;
33
+ /** The normalized message delivered to the session. */
34
+ message: DeliveredMessage;
35
+ /**
36
+ * Legacy payload, retained for wire compatibility with pre-2.0 queue
37
+ * implementations. New code should read `message`.
38
+ * @deprecated Read `message` instead.
39
+ */
40
+ input: unknown;
41
+ acceptedAt: string;
42
+ tenantId?: string;
43
+ actor?: FabricActor;
44
+ /** Absolute timestamp (ms) after which the dispatch should be aborted. */
45
+ timeoutAt?: number;
46
+ /** Absolute timestamp (ms) after which the dispatch lease expires and may be reclaimed. */
47
+ leaseExpiresAt?: number;
48
+ }
49
+ /** Consumes enqueued dispatches and applies them to an instance session. */
50
+ export interface DispatchProcessor {
51
+ process(input: DispatchInput): Promise<void> | void;
52
+ }
53
+ /** Admission queue for dispatches. The default is in-process; durable backends implement the same shape. */
54
+ export interface DispatchQueue {
55
+ enqueue(input: DispatchInput): Promise<DispatchReceipt>;
56
+ }
57
+ export interface InMemoryDispatchQueueOptions {
58
+ /** Lease duration in milliseconds. Default: 5 minutes. */
59
+ leaseTimeoutMs?: number;
60
+ /** Maximum number of concurrent dispatches. Default: Infinity. */
61
+ maxConcurrent?: number;
62
+ }
63
+ /**
64
+ * In-process dispatch queue: microtask-drained, concurrent across sessions,
65
+ * serialized within a single session. Suitable for the `inline`/`stateless`
66
+ * runtimes and dev. Durable delivery (surviving restarts) is provided by the
67
+ * Temporal-backed queue, which implements this same interface.
68
+ */
69
+ export declare class InMemoryDispatchQueue implements DispatchQueue {
70
+ private readonly processor;
71
+ private readonly leaseTimeoutMs;
72
+ private readonly maxConcurrent;
73
+ private readonly pending;
74
+ private readonly inFlight;
75
+ private concurrency;
76
+ private shuttingDown;
77
+ private drainPromise;
78
+ private scheduled;
79
+ constructor(processor: DispatchProcessor, options?: InMemoryDispatchQueueOptions);
80
+ enqueue(input: DispatchInput): Promise<DispatchReceipt>;
81
+ /** Signal the queue to stop accepting new work. */
82
+ shutdown(): void;
83
+ /** Resolve once the queue has drained all pending and in-flight work. */
84
+ whenIdle(): Promise<void>;
85
+ private sessionKey;
86
+ private scheduleDrain;
87
+ private attemptStartDispatches;
88
+ private runDispatch;
89
+ }
90
+ interface DispatchRuntime {
91
+ queue: DispatchQueue;
92
+ }
93
+ /** Configure the ambient dispatch queue used by {@link dispatch}. */
94
+ export declare function configureDispatchRuntime(runtime: DispatchRuntime): void;
95
+ /** Clear the ambient dispatch runtime (tests/teardown). */
96
+ export declare function resetDispatchRuntime(): void;
97
+ /** Register a name for a {@link CreatedAgent} so `dispatch(agent, ...)` can resolve it. */
98
+ export declare function registerCreatedAgentName(agent: CreatedAgent, name: string): void;
99
+ export declare function dispatch(agent: CreatedAgent, request: AgentDispatchRequest): Promise<DispatchReceipt>;
100
+ export declare function dispatch(request: NamedAgentDispatchRequest): Promise<DispatchReceipt>;
101
+ /** Validate + normalize a named request and enqueue it, generating the dispatch id. */
102
+ export declare function enqueueDispatch(queue: DispatchQueue, request: NamedAgentDispatchRequest, extra?: {
103
+ tenantId?: string;
104
+ actor?: FabricActor;
105
+ dispatchId?: string;
106
+ }): Promise<DispatchReceipt>;
107
+ export {};
108
+ //# sourceMappingURL=dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ import { normalizeDeliveredMessage } from './delivered-message.js';
2
+ /**
3
+ * In-process dispatch queue: microtask-drained, concurrent across sessions,
4
+ * serialized within a single session. Suitable for the `inline`/`stateless`
5
+ * runtimes and dev. Durable delivery (surviving restarts) is provided by the
6
+ * Temporal-backed queue, which implements this same interface.
7
+ */
8
+ export class InMemoryDispatchQueue {
9
+ processor;
10
+ leaseTimeoutMs;
11
+ maxConcurrent;
12
+ pending = new Map();
13
+ inFlight = new Map();
14
+ concurrency = 0;
15
+ shuttingDown = false;
16
+ drainPromise;
17
+ scheduled = false;
18
+ constructor(processor, options) {
19
+ this.processor = processor;
20
+ this.leaseTimeoutMs = options?.leaseTimeoutMs ?? 5 * 60 * 1000;
21
+ this.maxConcurrent = options?.maxConcurrent ?? Number.POSITIVE_INFINITY;
22
+ }
23
+ async enqueue(input) {
24
+ if (this.shuttingDown) {
25
+ throw new Error('[fabric-harness:dispatch] Dispatch queue is shutting down.');
26
+ }
27
+ const key = this.sessionKey(input);
28
+ const queue = this.pending.get(key) ?? [];
29
+ queue.push(input);
30
+ this.pending.set(key, queue);
31
+ this.scheduleDrain();
32
+ return { dispatchId: input.dispatchId, acceptedAt: input.acceptedAt };
33
+ }
34
+ /** Signal the queue to stop accepting new work. */
35
+ shutdown() {
36
+ this.shuttingDown = true;
37
+ }
38
+ /** Resolve once the queue has drained all pending and in-flight work. */
39
+ async whenIdle() {
40
+ while (this.scheduled || this.inFlight.size > 0) {
41
+ if (this.drainPromise)
42
+ await this.drainPromise;
43
+ if (this.inFlight.size > 0) {
44
+ await Promise.all([...this.inFlight.values()]);
45
+ }
46
+ }
47
+ }
48
+ sessionKey(input) {
49
+ return `${input.agent}::${input.id}::${input.session}`;
50
+ }
51
+ scheduleDrain() {
52
+ if (this.scheduled)
53
+ return;
54
+ this.scheduled = true;
55
+ this.drainPromise = new Promise((resolve) => {
56
+ queueMicrotask(() => {
57
+ void this.attemptStartDispatches().finally(resolve);
58
+ });
59
+ });
60
+ }
61
+ async attemptStartDispatches() {
62
+ try {
63
+ while (!this.shuttingDown) {
64
+ let startedAny = false;
65
+ for (const [key, queue] of this.pending) {
66
+ if (this.inFlight.has(key))
67
+ continue;
68
+ if (this.concurrency >= this.maxConcurrent)
69
+ break;
70
+ const input = queue.shift();
71
+ if (!input) {
72
+ this.pending.delete(key);
73
+ continue;
74
+ }
75
+ startedAny = true;
76
+ input.leaseExpiresAt = Date.now() + this.leaseTimeoutMs;
77
+ this.concurrency++;
78
+ this.runDispatch(key, input);
79
+ }
80
+ if (!startedAny)
81
+ break;
82
+ }
83
+ }
84
+ finally {
85
+ this.scheduled = false;
86
+ const hasStartable = [...this.pending.entries()].some(([key, queue]) => queue.length > 0 && !this.inFlight.has(key));
87
+ if (hasStartable && !this.shuttingDown && this.concurrency < this.maxConcurrent) {
88
+ this.scheduleDrain();
89
+ }
90
+ }
91
+ }
92
+ runDispatch(key, input) {
93
+ const promise = Promise.resolve()
94
+ .then(() => this.processor.process(input))
95
+ .catch((error) => {
96
+ console.error('[fabric-harness:dispatch] processor failed:', error);
97
+ })
98
+ .finally(() => {
99
+ this.inFlight.delete(key);
100
+ this.concurrency--;
101
+ const queue = this.pending.get(key);
102
+ if (queue && queue.length === 0) {
103
+ this.pending.delete(key);
104
+ }
105
+ this.scheduleDrain();
106
+ });
107
+ this.inFlight.set(key, promise);
108
+ }
109
+ }
110
+ let dispatchRuntime;
111
+ const createdAgentNames = new WeakMap();
112
+ /** Configure the ambient dispatch queue used by {@link dispatch}. */
113
+ export function configureDispatchRuntime(runtime) {
114
+ dispatchRuntime = runtime;
115
+ }
116
+ /** Clear the ambient dispatch runtime (tests/teardown). */
117
+ export function resetDispatchRuntime() {
118
+ dispatchRuntime = undefined;
119
+ }
120
+ /** Register a name for a {@link CreatedAgent} so `dispatch(agent, ...)` can resolve it. */
121
+ export function registerCreatedAgentName(agent, name) {
122
+ createdAgentNames.set(agent, name);
123
+ }
124
+ export function dispatch(agentOrRequest, maybeRequest) {
125
+ if (!dispatchRuntime?.queue) {
126
+ throw new Error('[fabric-harness] dispatch() called before a dispatch queue was configured.');
127
+ }
128
+ const named = resolveNamedRequest(agentOrRequest, maybeRequest);
129
+ return enqueueDispatch(dispatchRuntime.queue, named);
130
+ }
131
+ function resolveNamedRequest(agentOrRequest, maybeRequest) {
132
+ if (isNamedRequest(agentOrRequest))
133
+ return agentOrRequest;
134
+ if (!maybeRequest)
135
+ throw new Error('[fabric-harness] dispatch(agent, request) requires a request.');
136
+ const name = createdAgentNames.get(agentOrRequest);
137
+ if (!name) {
138
+ throw new Error('[fabric-harness] dispatch() target is not a registered persistent agent. ' +
139
+ 'Use dispatch({ agent: "<name>", id, input }) or register the agent with registerCreatedAgentName().');
140
+ }
141
+ return { ...maybeRequest, agent: name };
142
+ }
143
+ function isNamedRequest(value) {
144
+ return typeof value === 'object' && value !== null && typeof value.agent === 'string';
145
+ }
146
+ /** Validate + normalize a named request and enqueue it, generating the dispatch id. */
147
+ export async function enqueueDispatch(queue, request, extra = {}) {
148
+ if (!request.agent)
149
+ throw new Error('dispatch: a non-empty agent name is required.');
150
+ if (!request.id)
151
+ throw new Error('dispatch: a non-empty instance id is required.');
152
+ if (request.session !== undefined && request.session.trim() === '') {
153
+ throw new Error('dispatch: session must be a non-empty string when provided.');
154
+ }
155
+ let input;
156
+ try {
157
+ // Snapshot at admission time (also proves JSON-serializability).
158
+ input = JSON.parse(JSON.stringify(request.message ?? request.input ?? null));
159
+ }
160
+ catch {
161
+ throw new Error('dispatch: input must be JSON-serializable.');
162
+ }
163
+ const message = normalizeDeliveredMessage(input);
164
+ const dispatchInput = {
165
+ // A caller-supplied id (e.g. derived from a platform event id) gives exactly-once delivery via
166
+ // the persistent-run idempotency marker; otherwise mint a fresh one.
167
+ dispatchId: extra.dispatchId?.trim() || crypto.randomUUID(),
168
+ agent: request.agent,
169
+ id: request.id,
170
+ session: request.session ?? 'default',
171
+ message,
172
+ input,
173
+ acceptedAt: new Date().toISOString(),
174
+ ...(extra.tenantId ? { tenantId: extra.tenantId } : {}),
175
+ ...(extra.actor ? { actor: extra.actor } : {}),
176
+ };
177
+ return queue.enqueue(dispatchInput);
178
+ }
179
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"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"}
package/dist/error.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { JsonObject } from './types.js';
2
- export type FabricErrorCode = 'AGENT_NOT_FOUND' | 'SESSION_NOT_FOUND' | 'SKILL_NOT_FOUND' | 'ROLE_NOT_FOUND' | 'POLICY_DENIED' | 'APPROVAL_REQUIRED' | 'APPROVAL_DENIED' | 'SANDBOX_UNAVAILABLE' | 'SANDBOX_ESCAPE_BLOCKED' | 'MODEL_TIMEOUT' | 'MODEL_RATE_LIMITED' | 'MODEL_CONTEXT_OVERFLOW' | 'MODEL_AUTH_FAILED' | 'TOOL_NOT_FOUND' | 'TOOL_VALIDATION_FAILED' | 'RESULT_VALIDATION_FAILED' | 'TOOL_EXECUTION_FAILED' | 'COMMAND_DENIED' | 'CHECKPOINT_NOT_FOUND' | 'STORE_CONFLICT' | 'STORE_UNAVAILABLE' | 'INVALID_WORKSPACE' | 'MOUNT_INVALID_PATH' | 'COST_LIMIT_EXCEEDED' | 'WEBHOOK_AUTH_FAILED' | 'UNKNOWN';
2
+ export type FabricErrorCode = 'AGENT_NOT_FOUND' | 'SESSION_NOT_FOUND' | 'SKILL_NOT_FOUND' | 'ROLE_NOT_FOUND' | 'POLICY_DENIED' | 'APPROVAL_REQUIRED' | 'APPROVAL_DENIED' | 'SANDBOX_UNAVAILABLE' | 'SANDBOX_ESCAPE_BLOCKED' | 'MODEL_TIMEOUT' | 'MODEL_RATE_LIMITED' | 'MODEL_CONTEXT_OVERFLOW' | 'MODEL_AUTH_FAILED' | 'TOOL_NOT_FOUND' | 'TOOL_VALIDATION_FAILED' | 'RESULT_VALIDATION_FAILED' | 'RESULT_UNAVAILABLE' | 'TOOL_EXECUTION_FAILED' | 'COMMAND_DENIED' | 'CHECKPOINT_NOT_FOUND' | 'STORE_CONFLICT' | 'STORE_UNAVAILABLE' | 'INVALID_WORKSPACE' | 'MOUNT_INVALID_PATH' | 'INVALID_CONFIG' | 'COST_LIMIT_EXCEEDED' | 'WEBHOOK_AUTH_FAILED' | 'UNKNOWN';
3
3
  export interface FabricErrorOptions {
4
4
  code: FabricErrorCode;
5
5
  message: string;
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,mBAAmB,GACnB,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,mBAAmB,GACnB,iBAAiB,GACjB,qBAAqB,GACrB,wBAAwB,GACxB,eAAe,GACf,oBAAoB,GACpB,wBAAwB,GACxB,mBAAmB,GACnB,gBAAgB,GAChB,wBAAwB,GACxB,0BAA0B,GAC1B,uBAAuB,GACvB,gBAAgB,GAChB,sBAAsB,GACtB,gBAAgB,GAChB,mBAAmB,GACnB,mBAAmB,GACnB,oBAAoB,GACpB,qBAAqB,GACrB,qBAAqB,GACrB,SAAS,CAAC;AAEd,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAEhB,OAAO,EAAE,kBAAkB;IAUvC,MAAM,CAAC,QAAQ,GAAE,QAAQ,GAAG,WAA+E,GAAG,UAAU;IAOxH,YAAY,IAAI,UAAU;IAI1B,eAAe,IAAI,UAAU;CAG9B;AAQD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,GAAG,WAAW,CAGtG"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,mBAAmB,GACnB,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,mBAAmB,GACnB,iBAAiB,GACjB,qBAAqB,GACrB,wBAAwB,GACxB,eAAe,GACf,oBAAoB,GACpB,wBAAwB,GACxB,mBAAmB,GACnB,gBAAgB,GAChB,wBAAwB,GACxB,0BAA0B,GAC1B,oBAAoB,GACpB,uBAAuB,GACvB,gBAAgB,GAChB,sBAAsB,GACtB,gBAAgB,GAChB,mBAAmB,GACnB,mBAAmB,GACnB,oBAAoB,GACpB,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,GACrB,SAAS,CAAC;AAEd,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAEhB,OAAO,EAAE,kBAAkB;IAUvC,MAAM,CAAC,QAAQ,GAAE,QAAQ,GAAG,WAA+E,GAAG,UAAU;IAOxH,YAAY,IAAI,UAAU;IAI1B,eAAe,IAAI,UAAU;CAG9B;AAQD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,GAAG,WAAW,CAGtG"}
package/dist/error.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAyC5C,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAkB;IACtB,OAAO,CAAc;IACrB,aAAa,CAAS;IACtB,aAAa,CAAc;IAC3B,SAAS,CAAU;IAE5B,YAAY,OAA2B;QACrC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3F,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9E,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/F,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS;YAAE,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAChG,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,WAAmC,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;QACzG,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACzK,MAAM,OAAO,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QAC1E,IAAI,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;CACF;AAED,SAAS,iBAAiB,CAAC,IAAqB,EAAE,OAAe;IAC/D,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,YAAY;QAAE,OAAO,UAAU,CAAC,OAAO,CAAW,CAAC;IACnF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,8CAA8C,CAAC;IAC9E,OAAO,UAAU,CAAC,OAAO,CAAW,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,KAAK,YAAY,WAAW,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,QAA2C;IACvF,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA2C5C,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAkB;IACtB,OAAO,CAAc;IACrB,aAAa,CAAS;IACtB,aAAa,CAAc;IAC3B,SAAS,CAAU;IAE5B,YAAY,OAA2B;QACrC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3F,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9E,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/F,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS;YAAE,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAChG,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,WAAmC,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;QACzG,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACzK,MAAM,OAAO,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QAC1E,IAAI,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;CACF;AAED,SAAS,iBAAiB,CAAC,IAAqB,EAAE,OAAe;IAC/D,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,YAAY;QAAE,OAAO,UAAU,CAAC,OAAO,CAAW,CAAC;IACnF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,8CAA8C,CAAC;IAC9E,OAAO,UAAU,CAAC,OAAO,CAAW,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,KAAK,YAAY,WAAW,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,QAA2C;IACvF,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACxD,CAAC"}
package/dist/history.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import type { ModelMessage } from './model.js';
2
- import type { Role, SessionData, SessionEntry } from './types.js';
2
+ import type { Role, SessionData, SessionEntry, SignalEntryData } from './types.js';
3
3
  export declare const DEFAULT_HEADLESS_PREAMBLE = "You are running in headless autonomous mode (background-agent mode) with no human operator assumed. Work autonomously: Do not ask clarifying questions or wait for in-band user input. Make safe, reasonable assumptions when possible; if blocked by missing credentials, unavailable capabilities, denied policy, or required approvals, fail closed with a concise actionable explanation. Irreversible or high-risk actions must go through policy/approval gates, not natural-language confirmation. Summarize what you did and any remaining risks or follow-ups.";
4
4
  export declare class SessionHistory {
5
5
  private readonly entries;
6
6
  private readonly byId;
7
- private readonly leafId;
7
+ private leafId;
8
8
  private constructor();
9
9
  static fromData(data: SessionData | undefined): SessionHistory;
10
10
  /**
@@ -25,9 +25,56 @@ export declare class SessionHistory {
25
25
  */
26
26
  nextPromptAfter(stepId: string): SessionEntry | undefined;
27
27
  getActivePath(): SessionEntry[];
28
+ /**
29
+ * Rewind the active path to a specific entry. Used during interrupted-tool
30
+ * repair to branch from a prior entry when partial out-of-order results need
31
+ * to be replaced with a correctly ordered complete batch.
32
+ */
33
+ setLeaf(entryId: string): void;
34
+ /**
35
+ * Active-path entries appended after `afterLeafId` (exclusive), in order.
36
+ *
37
+ * - `afterLeafId` is null/undefined means "from the start of the path" →
38
+ * returns the entire active path.
39
+ * - When the id is found, returns entries strictly after it.
40
+ * - When the id is *not* on the current active path (e.g. a branch switch
41
+ * happened mid-window), returns `[]`. Callers use this for bounded windowing
42
+ * — falling back to the full path would silently include unrelated history.
43
+ * An empty result is the safer answer for usage aggregation: zero is loud
44
+ * (sums won't match expectations) while full-history is silent overcounting.
45
+ */
46
+ getActivePathSince(afterLeafId: string | null | undefined): SessionEntry[];
28
47
  getLatestCompaction(): SessionEntry | undefined;
48
+ /** Trailing dangling tool calls on THIS history's active path. See {@link findTrailingDanglingToolCalls}. */
49
+ findTrailingDanglingToolCalls(): SessionEntry[];
29
50
  buildContextEntries(): SessionEntry[];
30
51
  buildModelMessages(role?: Role): ModelMessage[];
31
52
  }
32
53
  export declare function buildModelMessagesFromHistory(data: SessionData | undefined, role?: Role): ModelMessage[];
54
+ /**
55
+ * Find trailing `tool_call` entries on the active path that were never
56
+ * settled — no matching `tool_result` (paired by `toolCallId`, falling back
57
+ * to tool name) and no subsequent `error` entry for the same tool.
58
+ *
59
+ * A dangling call means a model turn died (crash/abort) between recording
60
+ * the call and recording its outcome. Left in place it produces an
61
+ * assistant `tool_use` with no `tool_result` on resume, which providers
62
+ * reject — the repair path appends synthetic interrupted outcomes for
63
+ * exactly the entries returned here.
64
+ *
65
+ * Conservative by construction: only the window after the last turn
66
+ * boundary (user prompt / assistant message / result / compaction / signal)
67
+ * is examined, so historical, already-settled turns are never re-judged.
68
+ * Both the resume-repair and the submission terminalization derive the
69
+ * dangling set through this single function so they can never disagree.
70
+ */
71
+ export declare function findTrailingDanglingToolCalls(path: SessionEntry[]): SessionEntry[];
72
+ /**
73
+ * Trailing `task_start` entries in the same window with no matching
74
+ * `task_end` — a subtask that was in flight when the turn died. These do not
75
+ * corrupt model context (task entries are bookkeeping), but settling them
76
+ * keeps UI/audit state coherent.
77
+ */
78
+ export declare function findTrailingUnfinishedTasks(path: SessionEntry[]): SessionEntry[];
79
+ export declare function renderSignalMessage(data: SignalEntryData): string;
33
80
  //# sourceMappingURL=history.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAElE,eAAO,MAAM,yBAAyB,4iBAA4iB,CAAC;AAEnlB,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAE5C,OAAO;IAMP,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,cAAc;IAI9D;;;;;;OAMG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAUzF;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAWzD,aAAa,IAAI,YAAY,EAAE;IAU/B,mBAAmB,IAAI,YAAY,GAAG,SAAS;IAS/C,mBAAmB,IAAI,YAAY,EAAE;IAgBrC,kBAAkB,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,YAAY,EAAE;CAiChD;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,YAAY,EAAE,CAExG"}
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnF,eAAO,MAAM,yBAAyB,4iBAA4iB,CAAC;AAEnlB,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IACjD,OAAO,CAAC,MAAM,CAAqB;IAEnC,OAAO;IAMP,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,cAAc;IAI9D;;;;;;OAMG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAUzF;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAWzD,aAAa,IAAI,YAAY,EAAE;IAU/B;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO9B;;;;;;;;;;;OAWG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,EAAE;IAQ1E,mBAAmB,IAAI,YAAY,GAAG,SAAS;IAS/C,6GAA6G;IAC7G,6BAA6B,IAAI,YAAY,EAAE;IAI/C,mBAAmB,IAAI,YAAY,EAAE;IAgBrC,kBAAkB,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,YAAY,EAAE;CAiChD;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,YAAY,EAAE,CAExG;AAiBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAiClF;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAqBhF;AAoDD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAYjE"}