@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,150 @@
1
+ /**
2
+ * Durable submission runner (v2 migration, phase A5).
3
+ *
4
+ * The execution engine over an {@link AgentSubmissionStore}: a claim loop
5
+ * that takes runnable session heads with lease-fenced CAS claims, an
6
+ * executor seam that applies the input to the instance session, and a
7
+ * reconciler that classifies interrupted work after a crash and produces
8
+ * exactly-once observable outcomes — completed work settles, repairable
9
+ * work resumes, unstarted work requeues, exhausted work fails with a
10
+ * terminal advisory. Ported from flue's node agent coordinator +
11
+ * `reconcileInterruptedSubmission`, adapted to the harness session model
12
+ * (SessionEntry DAG; `session.prompt({ submission })` is idempotent by
13
+ * submission id, so re-execution after a crash never double-applies input).
14
+ */
15
+ import type { AgentDispatchAdmission, AgentSubmission, AgentSubmissionStore, SubmissionAttemptRef, SubmissionSettlementObligation } from './submission-store.js';
16
+ import type { AgentSubmissionInput, SubmissionSettledRecord } from './submission-store.js';
17
+ import type { AttachmentStore } from './attachment-store.js';
18
+ import type { DispatchInput, DispatchQueue } from './dispatch.js';
19
+ import type { SubmissionInspection } from './submission-state.js';
20
+ import type { SubmissionTelemetrySink } from './submission-telemetry.js';
21
+ export declare class SubmissionAbortedError extends Error {
22
+ readonly code = "SUBMISSION_ABORTED";
23
+ constructor();
24
+ }
25
+ export declare class SubmissionTimeoutError extends Error {
26
+ readonly code = "SUBMISSION_TIMEOUT";
27
+ constructor();
28
+ }
29
+ export declare class SubmissionRetryExhaustedError extends Error {
30
+ readonly code = "SUBMISSION_RETRY_EXHAUSTED";
31
+ readonly interruptedTools: InterruptedToolCallRef[] | undefined;
32
+ constructor(options: {
33
+ attemptCount: number;
34
+ maxAttempts: number;
35
+ interruptedTools?: InterruptedToolCallRef[];
36
+ });
37
+ }
38
+ export declare class SubmissionInterruptedError extends Error {
39
+ readonly code = "SUBMISSION_INTERRUPTED";
40
+ readonly phase: 'retry_exhausted_before_input' | 'after_input_application';
41
+ constructor(phase: SubmissionInterruptedError['phase'], detail?: string);
42
+ }
43
+ export interface SubmissionInterruption {
44
+ readonly submissionId: string;
45
+ readonly kind: 'dispatch' | 'direct';
46
+ readonly reason: 'interrupted_before_input_marker' | 'interrupted_after_input_application' | 'exhausted_retry_budget' | 'exceeded_timeout' | 'aborted';
47
+ readonly message: string;
48
+ }
49
+ /** A tool call settled with an explicit interrupted-outcome marker at terminalization. */
50
+ export interface InterruptedToolCallRef {
51
+ readonly name: string;
52
+ readonly id?: string;
53
+ }
54
+ export interface SubmissionExecuteOptions {
55
+ readonly attempt: SubmissionAttemptRef;
56
+ /** Aborted for graceful shutdown or a durable abort request. */
57
+ readonly signal: AbortSignal;
58
+ /**
59
+ * Must be invoked at the input-applied boundary (canonical input durable,
60
+ * no provider work started). Throws when the attempt lost ownership — the
61
+ * executor must let that abort the turn.
62
+ */
63
+ readonly onInputApplied: () => Promise<void>;
64
+ }
65
+ /**
66
+ * How the runner touches sessions. `execute` applies the submission's input
67
+ * to the addressed instance session and resolves with the turn result;
68
+ * everything else is store-level and must not require a live agent.
69
+ *
70
+ * Contract requirements:
71
+ * - `execute` must be idempotent by submission id (a resumed attempt whose
72
+ * input entry already exists must not append it again).
73
+ * - `recordTerminal` settles the conversation to a deterministic rest state
74
+ * (unresolved trailing tool calls get explicit interrupted-outcome
75
+ * markers — NEVER re-executed) and appends a terminal advisory.
76
+ * - `appendSettlement` appends the canonical `submission_settled` entry,
77
+ * idempotent by its deterministic record id.
78
+ */
79
+ export interface SubmissionExecutor {
80
+ execute(submission: AgentSubmission, options: SubmissionExecuteOptions): Promise<unknown>;
81
+ inspect(submission: AgentSubmission): Promise<SubmissionInspection>;
82
+ recordTerminal(submission: AgentSubmission, interruption: SubmissionInterruption): Promise<InterruptedToolCallRef[]>;
83
+ appendSettlement(submission: AgentSubmission, obligation: SubmissionSettlementObligation): Promise<void>;
84
+ /** The canonical settlement record for the submission, when one exists. */
85
+ getSettlement(submission: AgentSubmission): Promise<SubmissionSettledRecord | null>;
86
+ }
87
+ export interface SubmissionSettlement {
88
+ readonly outcome: 'completed' | 'failed' | 'aborted';
89
+ readonly result?: unknown;
90
+ readonly error?: string;
91
+ }
92
+ export interface SubmissionRunnerOptions {
93
+ submissions: AgentSubmissionStore;
94
+ executor: SubmissionExecutor;
95
+ /** Validate an admission target before persisting it (e.g. agent exists). */
96
+ validateInput?: (input: AgentSubmissionInput) => Promise<void> | void;
97
+ /**
98
+ * Durable content-addressed attachment storage. When configured, inline
99
+ * base64 attachments are materialized into refs BEFORE admission so the
100
+ * persisted submission payload never carries the bytes. Materialization is
101
+ * deterministic (ids from the submission/dispatch id + index, digests from
102
+ * content), preserving admission idempotency for exact redeliveries.
103
+ */
104
+ attachments?: {
105
+ store: AttachmentStore;
106
+ };
107
+ /**
108
+ * Lifecycle telemetry sink (v2 C4): one event per submission transition
109
+ * (accepted / started / settled), keyed by the stable submission id.
110
+ * Failures are reported through `onError` and never affect execution.
111
+ */
112
+ telemetry?: SubmissionTelemetrySink;
113
+ onSettled?: (submissionId: string, settlement: SubmissionSettlement) => void;
114
+ onError?: (context: string, error: unknown) => void;
115
+ /** Lease renewal cadence for active submissions. Default 10s. */
116
+ heartbeatIntervalMs?: number;
117
+ /** Expired-lease discovery cadence. Default 15s. */
118
+ leaseScanIntervalMs?: number;
119
+ }
120
+ export interface SubmissionRunner {
121
+ /** Durable dispatch admission; processing is asynchronous. */
122
+ admitDispatch(input: DispatchInput): Promise<AgentDispatchAdmission>;
123
+ /** Durable direct-prompt admission; processing is asynchronous. */
124
+ admitDirect(input: AgentSubmissionInput): Promise<AgentSubmission>;
125
+ /**
126
+ * Record a durable abort request for every unsettled submission of the
127
+ * session and abort any attempt running in this process. Returns the
128
+ * affected submission ids (empty when the session was idle).
129
+ */
130
+ requestAbort(storeSessionId: string): Promise<string[]>;
131
+ /** Reconcile interrupted work from a previous process; call once at startup. */
132
+ reconcile(): Promise<void>;
133
+ /** Resolve when the submission settles, with its outcome. */
134
+ waitForSettlement(submissionId: string, options?: {
135
+ pollIntervalMs?: number;
136
+ signal?: AbortSignal;
137
+ }): Promise<SubmissionSettlement>;
138
+ /** Resolve when no active or runnable work remains. */
139
+ waitForIdle(): Promise<void>;
140
+ /** Stop claiming, abort active work at the turn boundary, wait (with timeout). */
141
+ shutdown(timeoutMs?: number): Promise<void>;
142
+ /** Wake the claim loop (new work may be runnable). */
143
+ wake(): void;
144
+ /** A DispatchQueue façade over durable admission. */
145
+ createDispatchQueue(): DispatchQueue;
146
+ }
147
+ export declare function createSubmissionRunner(options: SubmissionRunnerOptions): SubmissionRunner;
148
+ /** Store-session FIFO key of a submission (re-exported convenience). */
149
+ export declare function submissionSessionKey(input: Pick<AgentSubmissionInput, 'agent' | 'id' | 'session'>): string;
150
+ //# sourceMappingURL=submission-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submission-runner.d.ts","sourceRoot":"","sources":["../src/submission-runner.ts"],"names":[],"mappings":"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"}