@rivet-dev/flue 0.0.0-stack-fix-rivetkit-route-all-actor-sqlite-through-envoy-when-local-sqlite-is-not-compiled-pppnpqnl.0cdbf72
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.
- package/README.md +26 -0
- package/dist/agent-coordinator.d.ts +89 -0
- package/dist/agent-coordinator.d.ts.map +1 -0
- package/dist/agent-coordinator.js +346 -0
- package/dist/agent-coordinator.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +3 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +2 -0
- package/dist/internal.js.map +1 -0
- package/dist/registry-ops-async.d.ts +7 -0
- package/dist/registry-ops-async.d.ts.map +1 -0
- package/dist/registry-ops-async.js +12 -0
- package/dist/registry-ops-async.js.map +1 -0
- package/dist/rivet-db.d.ts +7 -0
- package/dist/rivet-db.d.ts.map +1 -0
- package/dist/rivet-db.js +65 -0
- package/dist/rivet-db.js.map +1 -0
- package/dist/run-store-composite.d.ts +3 -0
- package/dist/run-store-composite.d.ts.map +1 -0
- package/dist/run-store-composite.js +43 -0
- package/dist/run-store-composite.js.map +1 -0
- package/dist/runtime.d.ts +8 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +7 -0
- package/dist/runtime.js.map +1 -0
- package/dist/stores/async-db.d.ts +10 -0
- package/dist/stores/async-db.d.ts.map +1 -0
- package/dist/stores/async-db.js +5 -0
- package/dist/stores/async-db.js.map +1 -0
- package/dist/stores/attachment-store.d.ts +4 -0
- package/dist/stores/attachment-store.d.ts.map +1 -0
- package/dist/stores/attachment-store.js +59 -0
- package/dist/stores/attachment-store.js.map +1 -0
- package/dist/stores/constants.d.ts +11 -0
- package/dist/stores/constants.d.ts.map +1 -0
- package/dist/stores/constants.js +11 -0
- package/dist/stores/constants.js.map +1 -0
- package/dist/stores/conversation-stream-store.d.ts +4 -0
- package/dist/stores/conversation-stream-store.d.ts.map +1 -0
- package/dist/stores/conversation-stream-store.js +35 -0
- package/dist/stores/conversation-stream-store.js.map +1 -0
- package/dist/stores/event-stream-store.d.ts +6 -0
- package/dist/stores/event-stream-store.d.ts.map +1 -0
- package/dist/stores/event-stream-store.js +156 -0
- package/dist/stores/event-stream-store.js.map +1 -0
- package/dist/stores/helpers.d.ts +2 -0
- package/dist/stores/helpers.d.ts.map +1 -0
- package/dist/stores/helpers.js +6 -0
- package/dist/stores/helpers.js.map +1 -0
- package/dist/stores/index.d.ts +11 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +23 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/stores/listener-registry.d.ts +6 -0
- package/dist/stores/listener-registry.d.ts.map +1 -0
- package/dist/stores/listener-registry.js +27 -0
- package/dist/stores/listener-registry.js.map +1 -0
- package/dist/stores/run-store.d.ts +4 -0
- package/dist/stores/run-store.d.ts.map +1 -0
- package/dist/stores/run-store.js +117 -0
- package/dist/stores/run-store.js.map +1 -0
- package/dist/stores/schema.d.ts +3 -0
- package/dist/stores/schema.d.ts.map +1 -0
- package/dist/stores/schema.js +241 -0
- package/dist/stores/schema.js.map +1 -0
- package/dist/stores/submission-store.d.ts +4 -0
- package/dist/stores/submission-store.d.ts.map +1 -0
- package/dist/stores/submission-store.js +261 -0
- package/dist/stores/submission-store.js.map +1 -0
- package/dist/target.d.ts +8 -0
- package/dist/target.d.ts.map +1 -0
- package/dist/target.js +420 -0
- package/dist/target.js.map +1 -0
- package/dist/workflow-coordinator.d.ts +71 -0
- package/dist/workflow-coordinator.d.ts.map +1 -0
- package/dist/workflow-coordinator.js +154 -0
- package/dist/workflow-coordinator.js.map +1 -0
- package/package.json +62 -0
package/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# @rivet-dev/flue
|
|
2
|
+
|
|
3
|
+
A [Flue](https://github.com/rivet-dev/flue) target that compiles agents and
|
|
4
|
+
workflows into a [Rivet](https://rivet.dev) Actor application. It provides
|
|
5
|
+
durable sessions, submission recovery, inter-actor `dispatch()`, and Flue
|
|
6
|
+
storage backed by each actor's native SQLite database (`c.db`).
|
|
7
|
+
|
|
8
|
+
```sh
|
|
9
|
+
npm add @rivet-dev/flue
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
// flue.config.ts
|
|
14
|
+
import { defineConfig } from "@flue/cli/config";
|
|
15
|
+
import { rivet } from "@rivet-dev/flue";
|
|
16
|
+
|
|
17
|
+
export default defineConfig({
|
|
18
|
+
target: rivet(),
|
|
19
|
+
});
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Export a RivetKit registry from `actors.ts`. `flue build` then emits a server
|
|
23
|
+
entrypoint that maps every agent and workflow to a durable Rivet Actor.
|
|
24
|
+
|
|
25
|
+
Full documentation, setup, and configuration:
|
|
26
|
+
**https://rivet.dev/docs/integrations/flue**
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { AgentDefinition, AgentExecutionStore, AttachmentStore, ConversationStreamStore, DispatchInput, FlueContextInternal } from '@flue/runtime/adapter-kit';
|
|
2
|
+
import type { DispatchReceipt } from '@flue/runtime';
|
|
3
|
+
import { type AsyncSqlDb } from './stores/index.js';
|
|
4
|
+
export interface RivetAgentActorContext {
|
|
5
|
+
readonly actorId: string;
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly key: readonly string[];
|
|
8
|
+
readonly region: string;
|
|
9
|
+
readonly env?: Record<string, unknown>;
|
|
10
|
+
readonly request?: Request;
|
|
11
|
+
readonly abortSignal: AbortSignal;
|
|
12
|
+
readonly db: AsyncSqlDb;
|
|
13
|
+
readonly schedule?: {
|
|
14
|
+
after(duration: number, action: string, ...args: unknown[]): Promise<void>;
|
|
15
|
+
};
|
|
16
|
+
keepAwake<T>(promise: Promise<T>): Promise<T>;
|
|
17
|
+
}
|
|
18
|
+
interface PreparedCoordinator {
|
|
19
|
+
readonly agentName: string;
|
|
20
|
+
readonly executionStore: AgentExecutionStore;
|
|
21
|
+
readonly conversationStreamStore: ConversationStreamStore;
|
|
22
|
+
readonly attachmentStore: AttachmentStore;
|
|
23
|
+
}
|
|
24
|
+
export interface RivetAgentRuntimeOptions {
|
|
25
|
+
readonly agents: ReadonlyArray<{
|
|
26
|
+
name: string;
|
|
27
|
+
definition: AgentDefinition;
|
|
28
|
+
}>;
|
|
29
|
+
readonly createContext: (options: {
|
|
30
|
+
readonly executionStore: AgentExecutionStore;
|
|
31
|
+
readonly actor: RivetAgentActorContext;
|
|
32
|
+
readonly agentName: string;
|
|
33
|
+
readonly request: Request;
|
|
34
|
+
readonly initialEventIndex?: number;
|
|
35
|
+
readonly dispatchId?: string;
|
|
36
|
+
}) => FlueContextInternal;
|
|
37
|
+
readonly resolveInstanceId?: (actor: RivetAgentActorContext) => string;
|
|
38
|
+
}
|
|
39
|
+
export interface RivetAgentRuntime {
|
|
40
|
+
prepare(options: {
|
|
41
|
+
db: AsyncSqlDb;
|
|
42
|
+
agentName: string;
|
|
43
|
+
notificationScope?: string;
|
|
44
|
+
}): Promise<PreparedCoordinator>;
|
|
45
|
+
attach(actor: RivetAgentActorContext, prepared: PreparedCoordinator): RivetAgentCoordinator;
|
|
46
|
+
onWake(actor: RivetAgentActorContext, inherited?: () => Promise<unknown> | unknown): Promise<void>;
|
|
47
|
+
wakeSubmissions(actor: RivetAgentActorContext): Promise<void>;
|
|
48
|
+
admitDispatch(actor: RivetAgentActorContext, input: DispatchInput): Promise<DispatchReceipt>;
|
|
49
|
+
onRequest(actor: RivetAgentActorContext, request: Request): Promise<Response | null>;
|
|
50
|
+
}
|
|
51
|
+
export declare function createRivetAgentRuntime(options: RivetAgentRuntimeOptions): RivetAgentRuntime;
|
|
52
|
+
export declare class RivetAgentCoordinator {
|
|
53
|
+
private readonly actor;
|
|
54
|
+
private readonly prepared;
|
|
55
|
+
private readonly options;
|
|
56
|
+
private readonly activeAttempts;
|
|
57
|
+
private conversationWriter;
|
|
58
|
+
private conversationWriterCreation;
|
|
59
|
+
private conversationMaterialization;
|
|
60
|
+
private activeControllers;
|
|
61
|
+
constructor(actor: RivetAgentActorContext, prepared: PreparedCoordinator, options: RivetAgentRuntimeOptions, activeAttempts: Set<string>);
|
|
62
|
+
onWake(inherited: () => Promise<unknown> | unknown): Promise<void>;
|
|
63
|
+
wakeSubmissions(): Promise<void>;
|
|
64
|
+
onRequest(request: Request): Promise<Response | null>;
|
|
65
|
+
private routeRequest;
|
|
66
|
+
private get agentName();
|
|
67
|
+
private get executionStore();
|
|
68
|
+
private get submissions();
|
|
69
|
+
private get instanceId();
|
|
70
|
+
private ensureConversationWriter;
|
|
71
|
+
private createContext;
|
|
72
|
+
private createDurableContext;
|
|
73
|
+
private armSubmissionWake;
|
|
74
|
+
private restoreSubmissionWake;
|
|
75
|
+
private reconcileSubmissions;
|
|
76
|
+
private resolveAgent;
|
|
77
|
+
private reconcileInterrupted;
|
|
78
|
+
private startSubmissionAttempt;
|
|
79
|
+
private processSubmissionEntry;
|
|
80
|
+
private startSubmissionReconciliation;
|
|
81
|
+
private materializeSubmissionConversation;
|
|
82
|
+
private admitAttachedSubmission;
|
|
83
|
+
admitDispatch(input: DispatchInput): Promise<DispatchReceipt>;
|
|
84
|
+
private abortInstance;
|
|
85
|
+
private attemptKey;
|
|
86
|
+
private logFailure;
|
|
87
|
+
}
|
|
88
|
+
export {};
|
|
89
|
+
//# sourceMappingURL=agent-coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-coordinator.d.ts","sourceRoot":"","sources":["../src/agent-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import { ConversationRecordWriter, SubmissionAbortedError, agentStreamPath, agentSubmissionDispatchId, assertAgentDispatchAdmissionInput, createDirectAgentSubmissionInput, createDispatchAgentSubmissionInput, createSessionStorageKey, handleAgentAttachmentRead, handleAgentConversationHead, handleAgentConversationRead, handleAgentRequest, materializeAgentSubmissionSession, processSubmission, reconcileInterruptedSubmission, submissionSyntheticRequest, } from '@flue/runtime/adapter-kit';
|
|
2
|
+
import { createAsyncSqlStores, ensureAsyncSqlSchema, } from './stores/index.js';
|
|
3
|
+
const WAKE_ACTION = '__flueWakeAgentSubmissions';
|
|
4
|
+
const WAKE_SECONDS = 30;
|
|
5
|
+
const SUBMISSION_HARNESS_NAME = 'default';
|
|
6
|
+
const SUBMISSION_SESSION_NAME = 'default';
|
|
7
|
+
export function createRivetAgentRuntime(options) {
|
|
8
|
+
const coordinators = new WeakMap();
|
|
9
|
+
const activeAttempts = new Set();
|
|
10
|
+
const get = (actor) => {
|
|
11
|
+
const coordinator = coordinators.get(actor);
|
|
12
|
+
if (!coordinator)
|
|
13
|
+
throw new Error('[flue] Rivet agent coordinator was not initialized.');
|
|
14
|
+
return coordinator;
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
async prepare({ db, agentName, notificationScope }) {
|
|
18
|
+
await ensureAsyncSqlSchema(db);
|
|
19
|
+
const stores = createAsyncSqlStores(db, notificationScope);
|
|
20
|
+
return {
|
|
21
|
+
agentName,
|
|
22
|
+
executionStore: stores.executionStore,
|
|
23
|
+
conversationStreamStore: stores.conversationStreamStore,
|
|
24
|
+
attachmentStore: stores.attachmentStore,
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
attach(actor, prepared) {
|
|
28
|
+
const coordinator = new RivetAgentCoordinator(actor, prepared, options, activeAttempts);
|
|
29
|
+
coordinators.set(actor, coordinator);
|
|
30
|
+
return coordinator;
|
|
31
|
+
},
|
|
32
|
+
onWake: (actor, inherited = () => undefined) => get(actor).onWake(inherited),
|
|
33
|
+
wakeSubmissions: (actor) => get(actor).wakeSubmissions(),
|
|
34
|
+
admitDispatch: (actor, input) => get(actor).admitDispatch(input),
|
|
35
|
+
onRequest: (actor, request) => get(actor).onRequest(request),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export class RivetAgentCoordinator {
|
|
39
|
+
actor;
|
|
40
|
+
prepared;
|
|
41
|
+
options;
|
|
42
|
+
activeAttempts;
|
|
43
|
+
conversationWriter;
|
|
44
|
+
conversationWriterCreation;
|
|
45
|
+
conversationMaterialization = Promise.resolve();
|
|
46
|
+
activeControllers = new Map();
|
|
47
|
+
constructor(actor, prepared, options, activeAttempts) {
|
|
48
|
+
this.actor = actor;
|
|
49
|
+
this.prepared = prepared;
|
|
50
|
+
this.options = options;
|
|
51
|
+
this.activeAttempts = activeAttempts;
|
|
52
|
+
}
|
|
53
|
+
async onWake(inherited) {
|
|
54
|
+
await this.restoreSubmissionWake();
|
|
55
|
+
await inherited();
|
|
56
|
+
await this.reconcileSubmissions({ driverAlreadyArmed: true });
|
|
57
|
+
}
|
|
58
|
+
async wakeSubmissions() {
|
|
59
|
+
if (!(await this.submissions.hasUnsettledSubmissions()))
|
|
60
|
+
return;
|
|
61
|
+
await this.armSubmissionWake();
|
|
62
|
+
await this.reconcileSubmissions({ driverAlreadyArmed: true });
|
|
63
|
+
}
|
|
64
|
+
onRequest(request) {
|
|
65
|
+
return this.routeRequest(request);
|
|
66
|
+
}
|
|
67
|
+
async routeRequest(request) {
|
|
68
|
+
if (isAbortRequest(request, this.agentName, this.instanceId)) {
|
|
69
|
+
return Response.json({ aborted: await this.abortInstance() });
|
|
70
|
+
}
|
|
71
|
+
if (request.method === 'GET' || request.method === 'HEAD') {
|
|
72
|
+
const path = agentStreamPath(this.agentName, this.instanceId);
|
|
73
|
+
const segments = new URL(request.url).pathname.split('/');
|
|
74
|
+
const attachmentId = request.method === 'GET' &&
|
|
75
|
+
segments.at(-2) === 'attachments' &&
|
|
76
|
+
decodeURIComponent(segments.at(-3) ?? '') === this.instanceId &&
|
|
77
|
+
decodeURIComponent(segments.at(-4) ?? '') === this.agentName
|
|
78
|
+
? decodeURIComponent(segments.at(-1) ?? '') : undefined;
|
|
79
|
+
if (attachmentId)
|
|
80
|
+
return handleAgentAttachmentRead({
|
|
81
|
+
conversationStore: this.prepared.conversationStreamStore,
|
|
82
|
+
attachmentStore: this.prepared.attachmentStore,
|
|
83
|
+
path,
|
|
84
|
+
attachmentId,
|
|
85
|
+
});
|
|
86
|
+
if (request.method === 'HEAD') {
|
|
87
|
+
return handleAgentConversationHead(this.prepared.conversationStreamStore, path);
|
|
88
|
+
}
|
|
89
|
+
return handleAgentConversationRead({
|
|
90
|
+
store: this.prepared.conversationStreamStore,
|
|
91
|
+
path,
|
|
92
|
+
request,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return handleAgentRequest({
|
|
96
|
+
request,
|
|
97
|
+
id: this.instanceId,
|
|
98
|
+
agentName: this.agentName,
|
|
99
|
+
admitAttachedSubmission: (message, traceCarrier) => this.admitAttachedSubmission(message, traceCarrier),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
get agentName() { return this.prepared.agentName; }
|
|
103
|
+
get executionStore() { return this.prepared.executionStore; }
|
|
104
|
+
get submissions() { return this.executionStore.submissions; }
|
|
105
|
+
get instanceId() {
|
|
106
|
+
return this.options.resolveInstanceId?.(this.actor) ?? this.actor.key[0] ?? this.actor.actorId;
|
|
107
|
+
}
|
|
108
|
+
async ensureConversationWriter() {
|
|
109
|
+
if (this.conversationWriter && !this.conversationWriter.failed)
|
|
110
|
+
return this.conversationWriter;
|
|
111
|
+
if (!this.conversationWriterCreation) {
|
|
112
|
+
const creation = ConversationRecordWriter.create({
|
|
113
|
+
store: this.prepared.conversationStreamStore,
|
|
114
|
+
path: agentStreamPath(this.agentName, this.instanceId),
|
|
115
|
+
identity: { agentName: this.agentName, instanceId: this.instanceId },
|
|
116
|
+
producerId: this.actor.actorId,
|
|
117
|
+
onFailed: (writer) => {
|
|
118
|
+
if (this.conversationWriter === writer)
|
|
119
|
+
this.conversationWriter = undefined;
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
this.conversationWriterCreation = creation;
|
|
123
|
+
void creation.then((writer) => {
|
|
124
|
+
if (!writer.failed)
|
|
125
|
+
this.conversationWriter = writer;
|
|
126
|
+
if (this.conversationWriterCreation === creation)
|
|
127
|
+
this.conversationWriterCreation = undefined;
|
|
128
|
+
}, () => {
|
|
129
|
+
if (this.conversationWriterCreation === creation)
|
|
130
|
+
this.conversationWriterCreation = undefined;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return this.conversationWriterCreation;
|
|
134
|
+
}
|
|
135
|
+
createContext(request, dispatchId) {
|
|
136
|
+
return this.options.createContext({
|
|
137
|
+
executionStore: this.executionStore,
|
|
138
|
+
actor: this.actor,
|
|
139
|
+
agentName: this.agentName,
|
|
140
|
+
request,
|
|
141
|
+
dispatchId,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
createDurableContext(request, dispatchId) {
|
|
145
|
+
const ctx = this.createContext(request, dispatchId);
|
|
146
|
+
ctx.setConversationWriter?.(this.conversationWriter);
|
|
147
|
+
ctx.setAttachmentStore?.(this.prepared.attachmentStore);
|
|
148
|
+
return ctx;
|
|
149
|
+
}
|
|
150
|
+
armSubmissionWake() {
|
|
151
|
+
return this.actor.schedule?.after(WAKE_SECONDS, WAKE_ACTION) ?? Promise.resolve();
|
|
152
|
+
}
|
|
153
|
+
async restoreSubmissionWake() {
|
|
154
|
+
if (!(await this.submissions.hasUnsettledSubmissions()))
|
|
155
|
+
return false;
|
|
156
|
+
await this.armSubmissionWake();
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
async reconcileSubmissions(options = {}) {
|
|
160
|
+
if (!(await this.submissions.hasUnsettledSubmissions()))
|
|
161
|
+
return false;
|
|
162
|
+
if (!options.driverAlreadyArmed)
|
|
163
|
+
await this.restoreSubmissionWake();
|
|
164
|
+
for (const submission of await this.submissions.listUnreadySubmissions()) {
|
|
165
|
+
const agent = this.resolveAgent(submission.input.agent);
|
|
166
|
+
try {
|
|
167
|
+
await this.materializeSubmissionConversation(submission.input, agent);
|
|
168
|
+
await this.submissions.markSubmissionCanonicalReady(submission.submissionId);
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
this.logFailure(submission, 'materialize_submission', error);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
for (const settlement of await this.submissions.listPendingSubmissionSettlements()) {
|
|
175
|
+
const submission = await this.submissions.getSubmission(settlement.submissionId);
|
|
176
|
+
if (!submission || this.activeAttempts.has(this.attemptKey(submission)))
|
|
177
|
+
continue;
|
|
178
|
+
const writer = await this.ensureConversationWriter();
|
|
179
|
+
const attempt = { submissionId: settlement.submissionId, attemptId: settlement.attemptId };
|
|
180
|
+
const canonical = await writer.getRecord(settlement.recordId);
|
|
181
|
+
if (!canonical)
|
|
182
|
+
await writer.append([settlement.record], { submission: attempt });
|
|
183
|
+
else if (JSON.stringify(canonical) !== JSON.stringify(settlement.record)) {
|
|
184
|
+
throw new Error('[flue] Pending settlement conflicts with its canonical record.');
|
|
185
|
+
}
|
|
186
|
+
await this.submissions.finalizeSubmissionSettlement(attempt, settlement.recordId);
|
|
187
|
+
}
|
|
188
|
+
for (const submission of await this.submissions.listRunningSubmissions()) {
|
|
189
|
+
if (this.activeAttempts.has(this.attemptKey(submission)))
|
|
190
|
+
continue;
|
|
191
|
+
try {
|
|
192
|
+
await this.reconcileInterrupted(submission);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
this.logFailure(submission, 'reconcile_submission', error);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
for (const submission of await this.submissions.listRunnableSubmissions()) {
|
|
199
|
+
const claimed = await this.submissions.claimSubmission({
|
|
200
|
+
submissionId: submission.submissionId,
|
|
201
|
+
attemptId: crypto.randomUUID(),
|
|
202
|
+
ownerId: this.actor.actorId,
|
|
203
|
+
leaseExpiresAt: 0,
|
|
204
|
+
});
|
|
205
|
+
if (claimed)
|
|
206
|
+
this.startSubmissionAttempt(claimed);
|
|
207
|
+
}
|
|
208
|
+
return this.submissions.hasUnsettledSubmissions();
|
|
209
|
+
}
|
|
210
|
+
resolveAgent(name) {
|
|
211
|
+
const agent = this.options.agents.find((record) => record.name === name)?.definition;
|
|
212
|
+
if (!agent)
|
|
213
|
+
throw new Error(`[flue] Agent target "${name}" is unavailable.`);
|
|
214
|
+
return agent;
|
|
215
|
+
}
|
|
216
|
+
async reconcileInterrupted(submission) {
|
|
217
|
+
const writer = await this.ensureConversationWriter();
|
|
218
|
+
const replacement = await reconcileInterruptedSubmission(this.submissions, submission, this.resolveAgent(this.agentName), (dispatchId) => this.createDurableContext(submissionSyntheticRequest(submission.input), dispatchId), { ownerId: this.actor.actorId, leaseExpiresAt: 0 }, writer);
|
|
219
|
+
if (replacement)
|
|
220
|
+
this.startSubmissionAttempt(replacement);
|
|
221
|
+
}
|
|
222
|
+
startSubmissionAttempt(submission) {
|
|
223
|
+
if (submission.status !== 'running' || !submission.attemptId)
|
|
224
|
+
return;
|
|
225
|
+
const key = this.attemptKey(submission);
|
|
226
|
+
if (this.activeAttempts.has(key))
|
|
227
|
+
return;
|
|
228
|
+
this.activeAttempts.add(key);
|
|
229
|
+
const controller = new AbortController();
|
|
230
|
+
this.activeControllers.set(submission.submissionId, controller);
|
|
231
|
+
const attempt = { submissionId: submission.submissionId, attemptId: submission.attemptId };
|
|
232
|
+
const running = Promise.resolve().then(async () => {
|
|
233
|
+
await this.submissions.insertAttemptMarker(attempt);
|
|
234
|
+
await this.processSubmissionEntry(submission, controller.signal);
|
|
235
|
+
});
|
|
236
|
+
void this.actor.keepAwake(running).catch((error) => this.logFailure(submission, 'process_submission', error))
|
|
237
|
+
.finally(() => {
|
|
238
|
+
this.activeAttempts.delete(key);
|
|
239
|
+
this.activeControllers.delete(submission.submissionId);
|
|
240
|
+
void this.submissions.deleteAttemptMarker(attempt).catch(() => { });
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
async processSubmissionEntry(submission, signal) {
|
|
244
|
+
const writer = await this.ensureConversationWriter();
|
|
245
|
+
await processSubmission({
|
|
246
|
+
submissions: this.submissions,
|
|
247
|
+
submission,
|
|
248
|
+
resolveAgent: (name) => this.resolveAgent(name),
|
|
249
|
+
createContext: (dispatchId) => this.createDurableContext(submissionSyntheticRequest(submission.input), dispatchId),
|
|
250
|
+
conversationWriter: writer,
|
|
251
|
+
signal,
|
|
252
|
+
onSettled: () => { this.startSubmissionReconciliation(); },
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
startSubmissionReconciliation() {
|
|
256
|
+
const running = Promise.resolve().then(() => this.reconcileSubmissions({ driverAlreadyArmed: true }));
|
|
257
|
+
void this.actor.keepAwake(running).catch((error) => {
|
|
258
|
+
console.error('[flue:submission-reconciliation]', {
|
|
259
|
+
agentName: this.agentName,
|
|
260
|
+
instanceId: this.instanceId,
|
|
261
|
+
}, error);
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
materializeSubmissionConversation(input, agent) {
|
|
265
|
+
const operation = this.conversationMaterialization.then(async () => {
|
|
266
|
+
await this.ensureConversationWriter();
|
|
267
|
+
const ctx = this.createDurableContext(submissionSyntheticRequest(input), agentSubmissionDispatchId(input));
|
|
268
|
+
await materializeAgentSubmissionSession(ctx, agent, input, this.prepared.attachmentStore);
|
|
269
|
+
});
|
|
270
|
+
this.conversationMaterialization = operation.catch(() => { });
|
|
271
|
+
return operation;
|
|
272
|
+
}
|
|
273
|
+
async admitAttachedSubmission(message, traceCarrier) {
|
|
274
|
+
const input = createDirectAgentSubmissionInput({
|
|
275
|
+
agent: this.agentName,
|
|
276
|
+
id: this.instanceId,
|
|
277
|
+
message,
|
|
278
|
+
traceCarrier,
|
|
279
|
+
});
|
|
280
|
+
const admitted = await this.submissions.admitDirect(input);
|
|
281
|
+
if (admitted.canonicalReadyAt === null) {
|
|
282
|
+
await this.materializeSubmissionConversation(input, this.resolveAgent(this.agentName));
|
|
283
|
+
await this.submissions.markSubmissionCanonicalReady(input.submissionId);
|
|
284
|
+
}
|
|
285
|
+
const offset = (await this.ensureConversationWriter()).offset;
|
|
286
|
+
await this.armSubmissionWake();
|
|
287
|
+
this.startSubmissionReconciliation();
|
|
288
|
+
return { submissionId: input.submissionId, offset };
|
|
289
|
+
}
|
|
290
|
+
async admitDispatch(input) {
|
|
291
|
+
assertAgentDispatchAdmissionInput(input);
|
|
292
|
+
if (input.agent !== this.agentName || input.id !== this.instanceId) {
|
|
293
|
+
throw new Error('[flue] Invalid dispatch target.');
|
|
294
|
+
}
|
|
295
|
+
const agent = this.resolveAgent(this.agentName);
|
|
296
|
+
const admission = await this.submissions.admitDispatch(input);
|
|
297
|
+
if (admission.kind === 'retained_receipt')
|
|
298
|
+
return {
|
|
299
|
+
dispatchId: admission.receipt.submissionId,
|
|
300
|
+
acceptedAt: new Date(admission.receipt.acceptedAt).toISOString(),
|
|
301
|
+
};
|
|
302
|
+
if (admission.kind === 'conflict') {
|
|
303
|
+
throw new Error('[flue] Conflicting dispatch replay.');
|
|
304
|
+
}
|
|
305
|
+
if (admission.submission.canonicalReadyAt === null) {
|
|
306
|
+
await this.materializeSubmissionConversation(createDispatchAgentSubmissionInput(input), agent);
|
|
307
|
+
if (!(await this.submissions.markSubmissionCanonicalReady(input.dispatchId))) {
|
|
308
|
+
throw new Error('[flue] Dispatch disappeared before canonical readiness.');
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
await this.armSubmissionWake();
|
|
312
|
+
this.startSubmissionReconciliation();
|
|
313
|
+
return { dispatchId: admission.submission.submissionId, acceptedAt: input.acceptedAt };
|
|
314
|
+
}
|
|
315
|
+
async abortInstance() {
|
|
316
|
+
const sessionKey = createSessionStorageKey(this.instanceId, SUBMISSION_HARNESS_NAME, SUBMISSION_SESSION_NAME);
|
|
317
|
+
const affected = await this.submissions.requestSessionAbort(sessionKey);
|
|
318
|
+
for (const id of affected)
|
|
319
|
+
this.activeControllers.get(id)?.abort(new SubmissionAbortedError());
|
|
320
|
+
if (affected.length > 0) {
|
|
321
|
+
await this.armSubmissionWake();
|
|
322
|
+
this.startSubmissionReconciliation();
|
|
323
|
+
}
|
|
324
|
+
return affected.length > 0;
|
|
325
|
+
}
|
|
326
|
+
attemptKey(submission) {
|
|
327
|
+
return `${this.actor.actorId}:${submission.attemptId}`;
|
|
328
|
+
}
|
|
329
|
+
logFailure(submission, operation, error) {
|
|
330
|
+
console.error('[flue:submission]', {
|
|
331
|
+
agentName: this.agentName,
|
|
332
|
+
instanceId: this.instanceId,
|
|
333
|
+
submissionId: submission.submissionId,
|
|
334
|
+
operation,
|
|
335
|
+
}, error);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
function isAbortRequest(request, agentName, instanceId) {
|
|
339
|
+
if (request.method !== 'POST')
|
|
340
|
+
return false;
|
|
341
|
+
const segments = new URL(request.url).pathname.split('/');
|
|
342
|
+
return segments.at(-1) === 'abort' &&
|
|
343
|
+
decodeURIComponent(segments.at(-2) ?? '') === instanceId &&
|
|
344
|
+
decodeURIComponent(segments.at(-3) ?? '') === agentName;
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=agent-coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-coordinator.js","sourceRoot":"","sources":["../src/agent-coordinator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,KAAK,EAA2B,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACxC,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/internal.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FlueForwardRunIndex, RunStore } from '@flue/runtime/adapter-kit';
|
|
2
|
+
import { type AsyncSqlDb } from './stores/index.js';
|
|
3
|
+
export interface RivetRegistryOps extends FlueForwardRunIndex {
|
|
4
|
+
readonly runStore: RunStore;
|
|
5
|
+
}
|
|
6
|
+
export declare function createAsyncRegistryOps(db: AsyncSqlDb): Promise<RivetRegistryOps>;
|
|
7
|
+
//# sourceMappingURL=registry-ops-async.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-ops-async.d.ts","sourceRoot":"","sources":["../src/registry-ops-async.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAA6C,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/F,MAAM,WAAW,gBAAiB,SAAQ,mBAAmB;IAC5D,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC5B;AAED,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAStF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createAsyncRunStore, ensureAsyncSqlSchema } from './stores/index.js';
|
|
2
|
+
export async function createAsyncRegistryOps(db) {
|
|
3
|
+
await ensureAsyncSqlSchema(db);
|
|
4
|
+
const runStore = createAsyncRunStore(db);
|
|
5
|
+
return {
|
|
6
|
+
runStore,
|
|
7
|
+
lookupRun: (runId) => runStore.lookupRun(runId),
|
|
8
|
+
getRun: (runId) => runStore.getRun(runId),
|
|
9
|
+
listRuns: (opts) => runStore.listRuns(opts),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=registry-ops-async.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-ops-async.js","sourceRoot":"","sources":["../src/registry-ops-async.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAmB,MAAM,mBAAmB,CAAC;AAM/F,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAAc;IAC1D,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACzC,OAAO;QACN,QAAQ;QACR,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;QAC/C,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;QACzC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;KAC3C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AsyncSqlDb } from './stores/index.js';
|
|
2
|
+
export interface RivetRawDb {
|
|
3
|
+
execute<TRow extends Record<string, unknown> = Record<string, unknown>>(query: string, ...args: unknown[]): Promise<TRow[]>;
|
|
4
|
+
transaction?<T>(callback: (tx: RivetRawDb) => Promise<T> | T): Promise<T>;
|
|
5
|
+
}
|
|
6
|
+
export declare function createRivetAsyncSqlDb(raw: RivetRawDb): AsyncSqlDb;
|
|
7
|
+
//# sourceMappingURL=rivet-db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rivet-db.d.ts","sourceRoot":"","sources":["../src/rivet-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA8B,MAAM,mBAAmB,CAAC;AAEhF,MAAM,WAAW,UAAU;IAC1B,OAAO,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrE,KAAK,EAAE,MAAM,EACb,GAAG,IAAI,EAAE,OAAO,EAAE,GAChB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACnB,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC1E;AAID,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,CAkEjE"}
|
package/dist/rivet-db.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const SAVEPOINT_NAME = '__flue_tx';
|
|
2
|
+
export function createRivetAsyncSqlDb(raw) {
|
|
3
|
+
let tail = Promise.resolve();
|
|
4
|
+
const queryDirect = async (text, params = []) => raw.execute(text, ...params.map(normalizeBinding));
|
|
5
|
+
return {
|
|
6
|
+
async query(text, params = []) {
|
|
7
|
+
// Wait for any in-flight transaction to release the tail, but do not chain
|
|
8
|
+
// onto it: a plain query is a single statement and callers await
|
|
9
|
+
// sequentially over the one connection, so it cannot interleave inside a
|
|
10
|
+
// concurrent transaction's savepoint critical section in practice.
|
|
11
|
+
await tail;
|
|
12
|
+
return queryDirect(text, params);
|
|
13
|
+
},
|
|
14
|
+
async transaction(fn) {
|
|
15
|
+
// Serialize transactions through a promise tail. Rivet runs each actor
|
|
16
|
+
// single-threaded over one persistent SQLite connection, so concurrent
|
|
17
|
+
// callers would otherwise interleave their savepoints on the shared
|
|
18
|
+
// connection and corrupt each other's critical sections.
|
|
19
|
+
//
|
|
20
|
+
// Production Rivet clients expose transaction(), which owns the native
|
|
21
|
+
// writer lease and coordinates with other actor work. The savepoint below
|
|
22
|
+
// is only a fallback for the node:sqlite contract harness. A single fixed
|
|
23
|
+
// name is safe because the tail guarantees no two fallback savepoints are
|
|
24
|
+
// open at once and this design does not support re-entrant transactions.
|
|
25
|
+
const previous = tail;
|
|
26
|
+
let release;
|
|
27
|
+
tail = new Promise((resolve) => {
|
|
28
|
+
release = resolve;
|
|
29
|
+
});
|
|
30
|
+
await previous;
|
|
31
|
+
try {
|
|
32
|
+
if (raw.transaction) {
|
|
33
|
+
return await raw.transaction((tx) => fn({
|
|
34
|
+
query: (text, params = []) => tx.execute(text, ...params.map(normalizeBinding)),
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
// The node:sqlite contract harness only exposes execute(). Use a
|
|
38
|
+
// savepoint there; production Rivet databases take the coordinated
|
|
39
|
+
// transaction() branch above.
|
|
40
|
+
await queryDirect(`SAVEPOINT ${SAVEPOINT_NAME}`);
|
|
41
|
+
try {
|
|
42
|
+
const result = await fn({ query: queryDirect });
|
|
43
|
+
await queryDirect(`RELEASE SAVEPOINT ${SAVEPOINT_NAME}`);
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
// Undo the critical section and discard the savepoint, then
|
|
48
|
+
// always surface the original error. A rollback/release failure
|
|
49
|
+
// here would only mask the real cause; the ambient transaction
|
|
50
|
+
// is torn down by Rivet when the action throws regardless.
|
|
51
|
+
await queryDirect(`ROLLBACK TO SAVEPOINT ${SAVEPOINT_NAME}`).catch(() => { });
|
|
52
|
+
await queryDirect(`RELEASE SAVEPOINT ${SAVEPOINT_NAME}`).catch(() => { });
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
release();
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function normalizeBinding(value) {
|
|
63
|
+
return typeof value === 'boolean' ? (value ? 1 : 0) : value;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=rivet-db.js.map
|