@kortix/sdk 0.12.8 → 0.13.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.
- package/README.md +3 -6
- package/dist/browser/session-sync/session-sync-registry.d.ts +7 -2
- package/dist/browser/session-sync/session-sync-registry.d.ts.map +1 -1
- package/dist/browser/session-sync/session-sync-registry.js +33 -44
- package/dist/browser/session-sync/session-sync-registry.js.map +1 -1
- package/dist/browser/stores/opencode-compaction-store.d.ts +9 -3
- package/dist/browser/stores/opencode-compaction-store.d.ts.map +1 -1
- package/dist/browser/stores/opencode-compaction-store.js +5 -12
- package/dist/browser/stores/opencode-compaction-store.js.map +1 -1
- package/dist/browser/stores/sandbox-connection-store.d.ts +28 -17
- package/dist/browser/stores/sandbox-connection-store.d.ts.map +1 -1
- package/dist/browser/stores/sandbox-connection-store.js +32 -84
- package/dist/browser/stores/sandbox-connection-store.js.map +1 -1
- package/dist/browser/stores/session-working-store.d.ts +73 -0
- package/dist/browser/stores/session-working-store.d.ts.map +1 -0
- package/dist/browser/stores/session-working-store.js +86 -0
- package/dist/browser/stores/session-working-store.js.map +1 -0
- package/dist/browser/stores/sync-store/types.d.ts +14 -4
- package/dist/browser/stores/sync-store/types.d.ts.map +1 -1
- package/dist/browser/stores/sync-store.d.ts +140 -3
- package/dist/browser/stores/sync-store.d.ts.map +1 -1
- package/dist/browser/stores/sync-store.js +425 -36
- package/dist/browser/stores/sync-store.js.map +1 -1
- package/dist/core/client/kortix.d.ts +102 -1
- package/dist/core/client/kortix.d.ts.map +1 -1
- package/dist/core/client/kortix.js +78 -0
- package/dist/core/client/kortix.js.map +1 -1
- package/dist/core/files/client.d.ts +50 -2
- package/dist/core/files/client.d.ts.map +1 -1
- package/dist/core/files/client.js +253 -44
- package/dist/core/files/client.js.map +1 -1
- package/dist/core/files/types.d.ts +11 -0
- package/dist/core/files/types.d.ts.map +1 -1
- package/dist/core/http/abort-error.d.ts +89 -0
- package/dist/core/http/abort-error.d.ts.map +1 -0
- package/dist/core/http/abort-error.js +190 -0
- package/dist/core/http/abort-error.js.map +1 -0
- package/dist/core/http/api-client.d.ts.map +1 -1
- package/dist/core/http/api-client.js +18 -4
- package/dist/core/http/api-client.js.map +1 -1
- package/dist/core/rest/platform-client/github-app.d.ts +13 -0
- package/dist/core/rest/platform-client/github-app.d.ts.map +1 -1
- package/dist/core/rest/platform-client/github-app.js +2 -0
- package/dist/core/rest/platform-client/github-app.js.map +1 -1
- package/dist/core/rest/platform-client/members.d.ts +10 -64
- package/dist/core/rest/platform-client/members.d.ts.map +1 -1
- package/dist/core/rest/platform-client/members.js +10 -28
- package/dist/core/rest/platform-client/members.js.map +1 -1
- package/dist/core/rest/projects-client/accounts.d.ts +30 -1
- package/dist/core/rest/projects-client/accounts.d.ts.map +1 -1
- package/dist/core/rest/projects-client/accounts.js +1 -1
- package/dist/core/rest/projects-client/accounts.js.map +1 -1
- package/dist/core/rest/projects-client/apps.d.ts +13 -0
- package/dist/core/rest/projects-client/apps.d.ts.map +1 -1
- package/dist/core/rest/projects-client/apps.js.map +1 -1
- package/dist/core/rest/projects-client/assignments.d.ts +114 -0
- package/dist/core/rest/projects-client/assignments.d.ts.map +1 -0
- package/dist/core/rest/projects-client/assignments.js +91 -0
- package/dist/core/rest/projects-client/assignments.js.map +1 -0
- package/dist/core/rest/projects-client/billing.d.ts +10 -1
- package/dist/core/rest/projects-client/billing.d.ts.map +1 -1
- package/dist/core/rest/projects-client/billing.js +11 -2
- package/dist/core/rest/projects-client/billing.js.map +1 -1
- package/dist/core/rest/projects-client/connectors.d.ts +2 -0
- package/dist/core/rest/projects-client/connectors.d.ts.map +1 -1
- package/dist/core/rest/projects-client/connectors.js.map +1 -1
- package/dist/core/rest/projects-client/files.js +2 -2
- package/dist/core/rest/projects-client/files.js.map +1 -1
- package/dist/core/rest/projects-client/gateway.d.ts +51 -0
- package/dist/core/rest/projects-client/gateway.d.ts.map +1 -1
- package/dist/core/rest/projects-client/gateway.js.map +1 -1
- package/dist/core/rest/projects-client/iam.d.ts +51 -3
- package/dist/core/rest/projects-client/iam.d.ts.map +1 -1
- package/dist/core/rest/projects-client/iam.js +18 -1
- package/dist/core/rest/projects-client/iam.js.map +1 -1
- package/dist/core/rest/projects-client/index.d.ts +1 -0
- package/dist/core/rest/projects-client/index.d.ts.map +1 -1
- package/dist/core/rest/projects-client/index.js +1 -0
- package/dist/core/rest/projects-client/index.js.map +1 -1
- package/dist/core/rest/projects-client/projects.d.ts +1 -1
- package/dist/core/rest/projects-client/projects.d.ts.map +1 -1
- package/dist/core/rest/projects-client/projects.js +3 -0
- package/dist/core/rest/projects-client/projects.js.map +1 -1
- package/dist/core/rest/projects-client/secrets.d.ts +11 -0
- package/dist/core/rest/projects-client/secrets.d.ts.map +1 -1
- package/dist/core/rest/projects-client/secrets.js +1 -1
- package/dist/core/rest/projects-client/secrets.js.map +1 -1
- package/dist/core/rest/projects-client/session-costs.d.ts +33 -0
- package/dist/core/rest/projects-client/session-costs.d.ts.map +1 -1
- package/dist/core/rest/projects-client/session-costs.js.map +1 -1
- package/dist/core/rest/projects-client/sessions.d.ts +226 -2
- package/dist/core/rest/projects-client/sessions.d.ts.map +1 -1
- package/dist/core/rest/projects-client/sessions.js +101 -4
- package/dist/core/rest/projects-client/sessions.js.map +1 -1
- package/dist/core/rest/projects-client/shared.d.ts +10 -1
- package/dist/core/rest/projects-client/shared.d.ts.map +1 -1
- package/dist/core/rest/projects-client/shared.js.map +1 -1
- package/dist/core/rest/projects-client/tokens.d.ts +13 -1
- package/dist/core/rest/projects-client/tokens.d.ts.map +1 -1
- package/dist/core/rest/projects-client/tokens.js +7 -2
- package/dist/core/rest/projects-client/tokens.js.map +1 -1
- package/dist/core/rest/projects-client/triggers.d.ts +69 -2
- package/dist/core/rest/projects-client/triggers.d.ts.map +1 -1
- package/dist/core/rest/projects-client/triggers.js +1 -1
- package/dist/core/rest/projects-client/triggers.js.map +1 -1
- package/dist/core/session/compaction.d.ts +98 -0
- package/dist/core/session/compaction.d.ts.map +1 -0
- package/dist/core/session/compaction.js +108 -0
- package/dist/core/session/compaction.js.map +1 -0
- package/dist/core/session/health.d.ts +22 -0
- package/dist/core/session/health.d.ts.map +1 -1
- package/dist/core/session/health.js +31 -5
- package/dist/core/session/health.js.map +1 -1
- package/dist/core/session/index.d.ts +2 -0
- package/dist/core/session/index.d.ts.map +1 -1
- package/dist/core/session/index.js +2 -0
- package/dist/core/session/index.js.map +1 -1
- package/dist/core/session/message-queue.d.ts +79 -15
- package/dist/core/session/message-queue.d.ts.map +1 -1
- package/dist/core/session/message-queue.js +73 -27
- package/dist/core/session/message-queue.js.map +1 -1
- package/dist/core/session/rewind.d.ts +76 -10
- package/dist/core/session/rewind.d.ts.map +1 -1
- package/dist/core/session/rewind.js +68 -11
- package/dist/core/session/rewind.js.map +1 -1
- package/dist/core/session/working.d.ts +241 -0
- package/dist/core/session/working.d.ts.map +1 -0
- package/dist/core/session/working.js +261 -0
- package/dist/core/session/working.js.map +1 -0
- package/dist/core/session-sync/session-sync-controller.d.ts +35 -20
- package/dist/core/session-sync/session-sync-controller.d.ts.map +1 -1
- package/dist/core/session-sync/session-sync-controller.js +48 -115
- package/dist/core/session-sync/session-sync-controller.js.map +1 -1
- package/dist/core/stream/event-stream.d.ts +22 -0
- package/dist/core/stream/event-stream.d.ts.map +1 -1
- package/dist/core/stream/event-stream.js +132 -36
- package/dist/core/stream/event-stream.js.map +1 -1
- package/dist/core/turns/grouping.d.ts +32 -2
- package/dist/core/turns/grouping.d.ts.map +1 -1
- package/dist/core/turns/grouping.js +31 -2
- package/dist/core/turns/grouping.js.map +1 -1
- package/dist/core/turns/index.d.ts +1 -0
- package/dist/core/turns/index.d.ts.map +1 -1
- package/dist/core/turns/index.js +1 -0
- package/dist/core/turns/index.js.map +1 -1
- package/dist/core/turns/open-turn.d.ts +81 -0
- package/dist/core/turns/open-turn.d.ts.map +1 -0
- package/dist/core/turns/open-turn.js +77 -0
- package/dist/core/turns/open-turn.js.map +1 -0
- package/dist/core/turns/state.js +26 -26
- package/dist/core/turns/state.js.map +1 -1
- package/dist/core/turns/types.d.ts +5 -0
- package/dist/core/turns/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/kortix.esm.min.js +25 -25
- package/dist/kortix.global.js +25 -25
- package/dist/node/server.d.ts.map +1 -1
- package/dist/node/server.js +14 -2
- package/dist/node/server.js.map +1 -1
- package/dist/react/index.d.ts +2 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +7 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/initial-session-pin.d.ts +17 -0
- package/dist/react/initial-session-pin.d.ts.map +1 -1
- package/dist/react/initial-session-pin.js +58 -0
- package/dist/react/initial-session-pin.js.map +1 -1
- package/dist/react/opencode.d.ts +6 -2
- package/dist/react/opencode.d.ts.map +1 -1
- package/dist/react/opencode.js +5 -1
- package/dist/react/opencode.js.map +1 -1
- package/dist/react/prefetch-session-start.d.ts +10 -4
- package/dist/react/prefetch-session-start.d.ts.map +1 -1
- package/dist/react/prefetch-session-start.js +10 -4
- package/dist/react/prefetch-session-start.js.map +1 -1
- package/dist/react/query-keys.d.ts +8 -2
- package/dist/react/query-keys.d.ts.map +1 -1
- package/dist/react/query-keys.js +8 -2
- package/dist/react/query-keys.js.map +1 -1
- package/dist/react/session-start-stash.d.ts +25 -0
- package/dist/react/session-start-stash.d.ts.map +1 -1
- package/dist/react/session-start-stash.js +34 -3
- package/dist/react/session-start-stash.js.map +1 -1
- package/dist/react/session-title-sync.d.ts +5 -1
- package/dist/react/session-title-sync.d.ts.map +1 -1
- package/dist/react/session-title-sync.js +16 -4
- package/dist/react/session-title-sync.js.map +1 -1
- package/dist/react/use-can.d.ts +105 -0
- package/dist/react/use-can.d.ts.map +1 -0
- package/dist/react/use-can.js +190 -0
- package/dist/react/use-can.js.map +1 -0
- package/dist/react/use-canonical-opencode-session.d.ts +6 -1
- package/dist/react/use-canonical-opencode-session.d.ts.map +1 -1
- package/dist/react/use-canonical-opencode-session.js +46 -3
- package/dist/react/use-canonical-opencode-session.js.map +1 -1
- package/dist/react/use-opencode-events/handle-event.d.ts +10 -0
- package/dist/react/use-opencode-events/handle-event.d.ts.map +1 -1
- package/dist/react/use-opencode-events/handle-event.js +76 -7
- package/dist/react/use-opencode-events/handle-event.js.map +1 -1
- package/dist/react/use-opencode-events/helpers.d.ts +21 -8
- package/dist/react/use-opencode-events/helpers.d.ts.map +1 -1
- package/dist/react/use-opencode-events/helpers.js +25 -26
- package/dist/react/use-opencode-events/helpers.js.map +1 -1
- package/dist/react/use-opencode-events/index.d.ts.map +1 -1
- package/dist/react/use-opencode-events/index.js +43 -26
- package/dist/react/use-opencode-events/index.js.map +1 -1
- package/dist/react/use-opencode-events/use-event-stream-refs.d.ts.map +1 -1
- package/dist/react/use-opencode-events/use-event-stream-refs.js +66 -3
- package/dist/react/use-opencode-events/use-event-stream-refs.js.map +1 -1
- package/dist/react/use-opencode-local.d.ts +17 -0
- package/dist/react/use-opencode-local.d.ts.map +1 -1
- package/dist/react/use-opencode-local.js +41 -7
- package/dist/react/use-opencode-local.js.map +1 -1
- package/dist/react/use-opencode-sessions/messages.d.ts +101 -1
- package/dist/react/use-opencode-sessions/messages.d.ts.map +1 -1
- package/dist/react/use-opencode-sessions/messages.js +481 -63
- package/dist/react/use-opencode-sessions/messages.js.map +1 -1
- package/dist/react/use-project-apps.d.ts +24 -1
- package/dist/react/use-project-apps.d.ts.map +1 -1
- package/dist/react/use-project-apps.js +5 -3
- package/dist/react/use-project-apps.js.map +1 -1
- package/dist/react/use-runtime-boot-stalled.d.ts +32 -0
- package/dist/react/use-runtime-boot-stalled.d.ts.map +1 -0
- package/dist/react/use-runtime-boot-stalled.js +48 -0
- package/dist/react/use-runtime-boot-stalled.js.map +1 -0
- package/dist/react/use-runtime-reconnect.d.ts +67 -1
- package/dist/react/use-runtime-reconnect.d.ts.map +1 -1
- package/dist/react/use-runtime-reconnect.js +116 -18
- package/dist/react/use-runtime-reconnect.js.map +1 -1
- package/dist/react/use-session-prompts.d.ts +113 -0
- package/dist/react/use-session-prompts.d.ts.map +1 -0
- package/dist/react/use-session-prompts.js +242 -0
- package/dist/react/use-session-prompts.js.map +1 -0
- package/dist/react/use-session-send.d.ts +169 -20
- package/dist/react/use-session-send.d.ts.map +1 -1
- package/dist/react/use-session-send.js +178 -29
- package/dist/react/use-session-send.js.map +1 -1
- package/dist/react/use-session-sync.d.ts +35 -2
- package/dist/react/use-session-sync.d.ts.map +1 -1
- package/dist/react/use-session-sync.js +46 -9
- package/dist/react/use-session-sync.js.map +1 -1
- package/dist/react/use-session-working.d.ts +57 -0
- package/dist/react/use-session-working.d.ts.map +1 -0
- package/dist/react/use-session-working.js +178 -0
- package/dist/react/use-session-working.js.map +1 -0
- package/dist/react/use-session.d.ts +122 -5
- package/dist/react/use-session.d.ts.map +1 -1
- package/dist/react/use-session.js +343 -69
- package/dist/react/use-session.js.map +1 -1
- package/package.json +2 -2
- package/dist/browser/stores/tab-store.d.ts +0 -91
- package/dist/browser/stores/tab-store.d.ts.map +0 -1
- package/dist/browser/stores/tab-store.js +0 -369
- package/dist/browser/stores/tab-store.js.map +0 -1
- package/dist/core/session/send-queue.d.ts +0 -70
- package/dist/core/session/send-queue.d.ts.map +0 -1
- package/dist/core/session/send-queue.js +0 -116
- package/dist/core/session/send-queue.js.map +0 -1
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* One prompt at a time, in the order they were written.
|
|
3
|
-
*
|
|
4
|
-
* Sending while the agent is mid-run used to be fire-and-hope: the prompt went
|
|
5
|
-
* out immediately and whatever the runtime did with it was invisible. The
|
|
6
|
-
* reported symptom was "sending also without upload feels janky while agent is
|
|
7
|
-
* working" — nothing on screen distinguished "waiting its turn" from "lost".
|
|
8
|
-
*
|
|
9
|
-
* This holds a prompt until the session is idle, then dispatches it. Ordering
|
|
10
|
-
* is guaranteed HERE rather than assumed of the server, which matters because
|
|
11
|
-
* the endpoint Kortix currently uses (`/session/{id}/prompt_async`) makes no
|
|
12
|
-
* documented promise about what happens to a prompt that arrives mid-run. The
|
|
13
|
-
* runtime does have a durable native queue (`delivery: 'queue'` on the v2
|
|
14
|
-
* `/api/session/{id}/prompt` route, with `session.next.prompt.admitted` to
|
|
15
|
-
* confirm promotion) — moving to it is the better long-term answer and is
|
|
16
|
-
* tracked separately. Until then the queue lives here, with the one honest
|
|
17
|
-
* caveat that a queue in a tab dies with the tab.
|
|
18
|
-
*
|
|
19
|
-
* Framework-free and timer-free: `isBusy` is injected and draining is driven by
|
|
20
|
-
* the caller telling it the session went idle. Nothing here polls.
|
|
21
|
-
*
|
|
22
|
-
* **Superseded for host use by `./message-queue`.** This module owns dispatch
|
|
23
|
-
* (it holds closures and calls them), which is exactly what a host cannot
|
|
24
|
-
* persist, reorder, or edit — a `dispatch` closure does not survive a page
|
|
25
|
-
* reload. `message-queue.ts` keeps the same one-at-a-time and never-jump-the-
|
|
26
|
-
* line guarantees but expresses them as pure transitions over serializable
|
|
27
|
-
* data, so the queue can be stored, reordered, and rewritten by the user.
|
|
28
|
-
*
|
|
29
|
-
* This module stays exported and tested: it is published API. New host code
|
|
30
|
-
* should reach for `message-queue` instead.
|
|
31
|
-
*/
|
|
32
|
-
/** Where a queued send has got to. Drives the label on the user's bubble. */
|
|
33
|
-
export type SendPhase = 'queued' | 'sending' | 'sent' | 'failed';
|
|
34
|
-
export interface QueuedSend {
|
|
35
|
-
/** The optimistic message this send belongs to. */
|
|
36
|
-
messageId: string;
|
|
37
|
-
/** Actually put it on the wire. Rejects on failure. */
|
|
38
|
-
dispatch: () => Promise<void>;
|
|
39
|
-
}
|
|
40
|
-
export interface SendQueueOptions {
|
|
41
|
-
/** Is the session mid-run right now? */
|
|
42
|
-
isBusy: (sessionId: string) => boolean;
|
|
43
|
-
/** Report a phase change so a host can render it. */
|
|
44
|
-
onPhase?: (sessionId: string, messageId: string, phase: SendPhase) => void;
|
|
45
|
-
}
|
|
46
|
-
export interface SendQueue {
|
|
47
|
-
/**
|
|
48
|
-
* Send now if the session is idle, otherwise hold it.
|
|
49
|
-
*
|
|
50
|
-
* Returns the phase the message entered, so a caller can render without
|
|
51
|
-
* waiting for the `onPhase` callback to come back around.
|
|
52
|
-
*/
|
|
53
|
-
submit: (sessionId: string, item: QueuedSend) => 'queued' | 'sending';
|
|
54
|
-
/**
|
|
55
|
-
* The session finished a run. Dispatch the next held prompt, if any.
|
|
56
|
-
*
|
|
57
|
-
* Called by whatever observes session status — deliberately not a poll, and
|
|
58
|
-
* deliberately not a subscription this module owns, so it stays framework-
|
|
59
|
-
* free and testable without fake timers.
|
|
60
|
-
*/
|
|
61
|
-
drain: (sessionId: string) => void;
|
|
62
|
-
/** Abandon a specific held send (the user discarded it). */
|
|
63
|
-
cancel: (sessionId: string, messageId: string) => boolean;
|
|
64
|
-
/** Abandon everything held for a session (it closed, or was cleared). */
|
|
65
|
-
clear: (sessionId: string) => void;
|
|
66
|
-
/** Message ids still waiting, oldest first. */
|
|
67
|
-
pending: (sessionId: string) => string[];
|
|
68
|
-
}
|
|
69
|
-
export declare function createSendQueue(options: SendQueueOptions): SendQueue;
|
|
70
|
-
//# sourceMappingURL=send-queue.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"send-queue.d.ts","sourceRoot":"","sources":["../../../src/core/session/send-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,6EAA6E;AAC7E,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,qDAAqD;IACrD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;CAC5E;AAED,MAAM,WAAW,SAAS;IACxB;;;;;OAKG;IACH,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,QAAQ,GAAG,SAAS,CAAC;IACtE;;;;;;OAMG;IACH,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,4DAA4D;IAC5D,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IAC1D,yEAAyE;IACzE,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,+CAA+C;IAC/C,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;CAC1C;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAgFpE"}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* One prompt at a time, in the order they were written.
|
|
3
|
-
*
|
|
4
|
-
* Sending while the agent is mid-run used to be fire-and-hope: the prompt went
|
|
5
|
-
* out immediately and whatever the runtime did with it was invisible. The
|
|
6
|
-
* reported symptom was "sending also without upload feels janky while agent is
|
|
7
|
-
* working" — nothing on screen distinguished "waiting its turn" from "lost".
|
|
8
|
-
*
|
|
9
|
-
* This holds a prompt until the session is idle, then dispatches it. Ordering
|
|
10
|
-
* is guaranteed HERE rather than assumed of the server, which matters because
|
|
11
|
-
* the endpoint Kortix currently uses (`/session/{id}/prompt_async`) makes no
|
|
12
|
-
* documented promise about what happens to a prompt that arrives mid-run. The
|
|
13
|
-
* runtime does have a durable native queue (`delivery: 'queue'` on the v2
|
|
14
|
-
* `/api/session/{id}/prompt` route, with `session.next.prompt.admitted` to
|
|
15
|
-
* confirm promotion) — moving to it is the better long-term answer and is
|
|
16
|
-
* tracked separately. Until then the queue lives here, with the one honest
|
|
17
|
-
* caveat that a queue in a tab dies with the tab.
|
|
18
|
-
*
|
|
19
|
-
* Framework-free and timer-free: `isBusy` is injected and draining is driven by
|
|
20
|
-
* the caller telling it the session went idle. Nothing here polls.
|
|
21
|
-
*
|
|
22
|
-
* **Superseded for host use by `./message-queue`.** This module owns dispatch
|
|
23
|
-
* (it holds closures and calls them), which is exactly what a host cannot
|
|
24
|
-
* persist, reorder, or edit — a `dispatch` closure does not survive a page
|
|
25
|
-
* reload. `message-queue.ts` keeps the same one-at-a-time and never-jump-the-
|
|
26
|
-
* line guarantees but expresses them as pure transitions over serializable
|
|
27
|
-
* data, so the queue can be stored, reordered, and rewritten by the user.
|
|
28
|
-
*
|
|
29
|
-
* This module stays exported and tested: it is published API. New host code
|
|
30
|
-
* should reach for `message-queue` instead.
|
|
31
|
-
*/
|
|
32
|
-
export function createSendQueue(options) {
|
|
33
|
-
const { isBusy, onPhase } = options;
|
|
34
|
-
const queues = new Map();
|
|
35
|
-
/** Sessions with a dispatch in flight, so `drain` never doubles up. */
|
|
36
|
-
const inFlight = new Set();
|
|
37
|
-
const phase = (sessionId, messageId, next) => {
|
|
38
|
-
onPhase?.(sessionId, messageId, next);
|
|
39
|
-
};
|
|
40
|
-
const run = (sessionId, item) => {
|
|
41
|
-
inFlight.add(sessionId);
|
|
42
|
-
phase(sessionId, item.messageId, 'sending');
|
|
43
|
-
void item
|
|
44
|
-
.dispatch()
|
|
45
|
-
.then(() => {
|
|
46
|
-
phase(sessionId, item.messageId, 'sent');
|
|
47
|
-
})
|
|
48
|
-
.catch(() => {
|
|
49
|
-
// A failed send must not wedge everything written after it. The
|
|
50
|
-
// message keeps its own `failed` phase (the host offers a retry);
|
|
51
|
-
// the queue moves on.
|
|
52
|
-
phase(sessionId, item.messageId, 'failed');
|
|
53
|
-
})
|
|
54
|
-
.finally(() => {
|
|
55
|
-
inFlight.delete(sessionId);
|
|
56
|
-
// The run this send started has not begun yet — `drain` is driven by
|
|
57
|
-
// the session going idle, and it is about to go busy. Only pull the
|
|
58
|
-
// next item if the session never became busy at all (e.g. the send
|
|
59
|
-
// failed outright), otherwise the idle transition will do it.
|
|
60
|
-
if (!isBusy(sessionId))
|
|
61
|
-
drain(sessionId);
|
|
62
|
-
});
|
|
63
|
-
};
|
|
64
|
-
const drain = (sessionId) => {
|
|
65
|
-
if (inFlight.has(sessionId))
|
|
66
|
-
return;
|
|
67
|
-
if (isBusy(sessionId))
|
|
68
|
-
return;
|
|
69
|
-
const queue = queues.get(sessionId);
|
|
70
|
-
if (!queue || queue.length === 0)
|
|
71
|
-
return;
|
|
72
|
-
const next = queue.shift();
|
|
73
|
-
if (queue.length === 0)
|
|
74
|
-
queues.delete(sessionId);
|
|
75
|
-
if (next)
|
|
76
|
-
run(sessionId, next);
|
|
77
|
-
};
|
|
78
|
-
return {
|
|
79
|
-
submit: (sessionId, item) => {
|
|
80
|
-
if (!isBusy(sessionId) && !inFlight.has(sessionId)) {
|
|
81
|
-
const queue = queues.get(sessionId);
|
|
82
|
-
// Never jump the line: if anything is already waiting, this one waits
|
|
83
|
-
// behind it even though the session happens to be idle this instant.
|
|
84
|
-
if (!queue || queue.length === 0) {
|
|
85
|
-
run(sessionId, item);
|
|
86
|
-
return 'sending';
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
const queue = queues.get(sessionId);
|
|
90
|
-
if (queue)
|
|
91
|
-
queue.push(item);
|
|
92
|
-
else
|
|
93
|
-
queues.set(sessionId, [item]);
|
|
94
|
-
phase(sessionId, item.messageId, 'queued');
|
|
95
|
-
return 'queued';
|
|
96
|
-
},
|
|
97
|
-
drain,
|
|
98
|
-
cancel: (sessionId, messageId) => {
|
|
99
|
-
const queue = queues.get(sessionId);
|
|
100
|
-
if (!queue)
|
|
101
|
-
return false;
|
|
102
|
-
const index = queue.findIndex((q) => q.messageId === messageId);
|
|
103
|
-
if (index === -1)
|
|
104
|
-
return false;
|
|
105
|
-
queue.splice(index, 1);
|
|
106
|
-
if (queue.length === 0)
|
|
107
|
-
queues.delete(sessionId);
|
|
108
|
-
return true;
|
|
109
|
-
},
|
|
110
|
-
clear: (sessionId) => {
|
|
111
|
-
queues.delete(sessionId);
|
|
112
|
-
},
|
|
113
|
-
pending: (sessionId) => (queues.get(sessionId) ?? []).map((q) => q.messageId),
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
//# sourceMappingURL=send-queue.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"send-queue.js","sourceRoot":"","sources":["../../../src/core/session/send-queue.ts"],"names":[],"mappings":"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"}
|