@plurnk/plurnk-service 1.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.
- package/.env.defaults +208 -0
- package/INSTALL.md +69 -0
- package/LICENSE +21 -0
- package/README.md +46 -0
- package/SPEC.md +1511 -0
- package/dist/Paths.d.ts +13 -0
- package/dist/Paths.d.ts.map +1 -0
- package/dist/Paths.js +60 -0
- package/dist/Paths.js.map +1 -0
- package/dist/content/edited-span.d.ts +2 -0
- package/dist/content/edited-span.d.ts.map +1 -0
- package/dist/content/edited-span.js +33 -0
- package/dist/content/edited-span.js.map +1 -0
- package/dist/content/index.d.ts +10 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +11 -0
- package/dist/content/index.js.map +1 -0
- package/dist/content/line-marker.d.ts +15 -0
- package/dist/content/line-marker.d.ts.map +1 -0
- package/dist/content/line-marker.js +21 -0
- package/dist/content/line-marker.js.map +1 -0
- package/dist/content/matcher.d.ts +44 -0
- package/dist/content/matcher.d.ts.map +1 -0
- package/dist/content/matcher.js +126 -0
- package/dist/content/matcher.js.map +1 -0
- package/dist/content/mimetype-binary.d.ts +8 -0
- package/dist/content/mimetype-binary.d.ts.map +1 -0
- package/dist/content/mimetype-binary.js +17 -0
- package/dist/content/mimetype-binary.js.map +1 -0
- package/dist/content/path-mimetype.d.ts +5 -0
- package/dist/content/path-mimetype.d.ts.map +1 -0
- package/dist/content/path-mimetype.js +15 -0
- package/dist/content/path-mimetype.js.map +1 -0
- package/dist/content/read-resolve.d.ts +20 -0
- package/dist/content/read-resolve.d.ts.map +1 -0
- package/dist/content/read-resolve.js +68 -0
- package/dist/content/read-resolve.js.map +1 -0
- package/dist/core/ChannelWrite.d.ts +100 -0
- package/dist/core/ChannelWrite.d.ts.map +1 -0
- package/dist/core/ChannelWrite.js +112 -0
- package/dist/core/ChannelWrite.js.map +1 -0
- package/dist/core/ChannelWrite.sql +84 -0
- package/dist/core/Db.d.ts +14 -0
- package/dist/core/Db.d.ts.map +1 -0
- package/dist/core/Db.js +7 -0
- package/dist/core/Db.js.map +1 -0
- package/dist/core/Dispatcher.d.ts +67 -0
- package/dist/core/Dispatcher.d.ts.map +1 -0
- package/dist/core/Dispatcher.js +1021 -0
- package/dist/core/Dispatcher.js.map +1 -0
- package/dist/core/Engine.d.ts +113 -0
- package/dist/core/Engine.d.ts.map +1 -0
- package/dist/core/Engine.js +1410 -0
- package/dist/core/Engine.js.map +1 -0
- package/dist/core/Engine.sql +538 -0
- package/dist/core/EnvFlags.d.ts +13 -0
- package/dist/core/EnvFlags.d.ts.map +1 -0
- package/dist/core/EnvFlags.js +84 -0
- package/dist/core/EnvFlags.js.map +1 -0
- package/dist/core/ExecutorRegistry.d.ts +45 -0
- package/dist/core/ExecutorRegistry.d.ts.map +1 -0
- package/dist/core/ExecutorRegistry.js +128 -0
- package/dist/core/ExecutorRegistry.js.map +1 -0
- package/dist/core/PacketBuilder.d.ts +67 -0
- package/dist/core/PacketBuilder.d.ts.map +1 -0
- package/dist/core/PacketBuilder.js +524 -0
- package/dist/core/PacketBuilder.js.map +1 -0
- package/dist/core/PluginLoader.d.ts +17 -0
- package/dist/core/PluginLoader.d.ts.map +1 -0
- package/dist/core/PluginLoader.js +97 -0
- package/dist/core/PluginLoader.js.map +1 -0
- package/dist/core/ProposalLifecycle.d.ts +59 -0
- package/dist/core/ProposalLifecycle.d.ts.map +1 -0
- package/dist/core/ProposalLifecycle.js +215 -0
- package/dist/core/ProposalLifecycle.js.map +1 -0
- package/dist/core/ProviderInstantiate.d.ts +9 -0
- package/dist/core/ProviderInstantiate.d.ts.map +1 -0
- package/dist/core/ProviderInstantiate.js +156 -0
- package/dist/core/ProviderInstantiate.js.map +1 -0
- package/dist/core/SchemeRegistry.d.ts +26 -0
- package/dist/core/SchemeRegistry.d.ts.map +1 -0
- package/dist/core/SchemeRegistry.js +205 -0
- package/dist/core/SchemeRegistry.js.map +1 -0
- package/dist/core/StrikeRail.d.ts +28 -0
- package/dist/core/StrikeRail.d.ts.map +1 -0
- package/dist/core/StrikeRail.js +165 -0
- package/dist/core/StrikeRail.js.map +1 -0
- package/dist/core/TelemetryChannel.d.ts +37 -0
- package/dist/core/TelemetryChannel.d.ts.map +1 -0
- package/dist/core/TelemetryChannel.js +77 -0
- package/dist/core/TelemetryChannel.js.map +1 -0
- package/dist/core/TokenGauge.d.ts +16 -0
- package/dist/core/TokenGauge.d.ts.map +1 -0
- package/dist/core/TokenGauge.js +58 -0
- package/dist/core/TokenGauge.js.map +1 -0
- package/dist/core/caps/CapsResolve.d.ts +5 -0
- package/dist/core/caps/CapsResolve.d.ts.map +1 -0
- package/dist/core/caps/CapsResolve.js +13 -0
- package/dist/core/caps/CapsResolve.js.map +1 -0
- package/dist/core/caps/DbChannelCaps.d.ts +16 -0
- package/dist/core/caps/DbChannelCaps.d.ts.map +1 -0
- package/dist/core/caps/DbChannelCaps.js +41 -0
- package/dist/core/caps/DbChannelCaps.js.map +1 -0
- package/dist/core/caps/DbEntryCaps.d.ts +19 -0
- package/dist/core/caps/DbEntryCaps.d.ts.map +1 -0
- package/dist/core/caps/DbEntryCaps.js +28 -0
- package/dist/core/caps/DbEntryCaps.js.map +1 -0
- package/dist/core/caps/DbNotifyCaps.d.ts +8 -0
- package/dist/core/caps/DbNotifyCaps.d.ts.map +1 -0
- package/dist/core/caps/DbNotifyCaps.js +35 -0
- package/dist/core/caps/DbNotifyCaps.js.map +1 -0
- package/dist/core/caps/DbSubscriptionCaps.d.ts +10 -0
- package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -0
- package/dist/core/caps/DbSubscriptionCaps.js +86 -0
- package/dist/core/caps/DbSubscriptionCaps.js.map +1 -0
- package/dist/core/caps/DbTagCaps.d.ts +17 -0
- package/dist/core/caps/DbTagCaps.d.ts.map +1 -0
- package/dist/core/caps/DbTagCaps.js +37 -0
- package/dist/core/caps/DbTagCaps.js.map +1 -0
- package/dist/core/caps/SchemeCtxImpl.d.ts +18 -0
- package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -0
- package/dist/core/caps/SchemeCtxImpl.js +42 -0
- package/dist/core/caps/SchemeCtxImpl.js.map +1 -0
- package/dist/core/env-defaults.d.ts +19 -0
- package/dist/core/env-defaults.d.ts.map +1 -0
- package/dist/core/env-defaults.js +89 -0
- package/dist/core/env-defaults.js.map +1 -0
- package/dist/core/fork.d.ts +6 -0
- package/dist/core/fork.d.ts.map +1 -0
- package/dist/core/fork.js +84 -0
- package/dist/core/fork.js.map +1 -0
- package/dist/core/fork.sql +85 -0
- package/dist/core/git-membership.d.ts +23 -0
- package/dist/core/git-membership.d.ts.map +1 -0
- package/dist/core/git-membership.js +366 -0
- package/dist/core/git-membership.js.map +1 -0
- package/dist/core/git-state.d.ts +15 -0
- package/dist/core/git-state.d.ts.map +1 -0
- package/dist/core/git-state.js +67 -0
- package/dist/core/git-state.js.map +1 -0
- package/dist/core/packet-inject.d.ts +5 -0
- package/dist/core/packet-inject.d.ts.map +1 -0
- package/dist/core/packet-inject.js +48 -0
- package/dist/core/packet-inject.js.map +1 -0
- package/dist/core/packet-wire.d.ts +46 -0
- package/dist/core/packet-wire.d.ts.map +1 -0
- package/dist/core/packet-wire.js +453 -0
- package/dist/core/packet-wire.js.map +1 -0
- package/dist/core/path-decode.d.ts +2 -0
- package/dist/core/path-decode.d.ts.map +1 -0
- package/dist/core/path-decode.js +8 -0
- package/dist/core/path-decode.js.map +1 -0
- package/dist/core/plugin-attribution.d.ts +5 -0
- package/dist/core/plugin-attribution.d.ts.map +1 -0
- package/dist/core/plugin-attribution.js +39 -0
- package/dist/core/plugin-attribution.js.map +1 -0
- package/dist/core/plurnk-uri.d.ts +7 -0
- package/dist/core/plurnk-uri.d.ts.map +1 -0
- package/dist/core/plurnk-uri.js +52 -0
- package/dist/core/plurnk-uri.js.map +1 -0
- package/dist/core/resolveForLoop.d.ts +5 -0
- package/dist/core/resolveForLoop.d.ts.map +1 -0
- package/dist/core/resolveForLoop.js +12 -0
- package/dist/core/resolveForLoop.js.map +1 -0
- package/dist/core/results.d.ts +12 -0
- package/dist/core/results.d.ts.map +1 -0
- package/dist/core/results.js +27 -0
- package/dist/core/results.js.map +1 -0
- package/dist/core/run-cap.d.ts +8 -0
- package/dist/core/run-cap.d.ts.map +1 -0
- package/dist/core/run-cap.js +20 -0
- package/dist/core/run-cap.js.map +1 -0
- package/dist/core/run-ops.sql +43 -0
- package/dist/core/scheme-types.d.ts +45 -0
- package/dist/core/scheme-types.d.ts.map +1 -0
- package/dist/core/scheme-types.js +6 -0
- package/dist/core/scheme-types.js.map +1 -0
- package/dist/core/session-settings.d.ts +23 -0
- package/dist/core/session-settings.d.ts.map +1 -0
- package/dist/core/session-settings.js +55 -0
- package/dist/core/session-settings.js.map +1 -0
- package/dist/core/teaching.d.ts +3 -0
- package/dist/core/teaching.d.ts.map +1 -0
- package/dist/core/teaching.js +13 -0
- package/dist/core/teaching.js.map +1 -0
- package/dist/core/types.d.ts +3 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/digest/Digest.d.ts +20 -0
- package/dist/digest/Digest.d.ts.map +1 -0
- package/dist/digest/Digest.js +451 -0
- package/dist/digest/Digest.js.map +1 -0
- package/dist/digest/Digest.sql +1 -0
- package/dist/digest/digest.sql +55 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/schemes/EffectPolicy.d.ts +6 -0
- package/dist/schemes/EffectPolicy.d.ts.map +1 -0
- package/dist/schemes/EffectPolicy.js +18 -0
- package/dist/schemes/EffectPolicy.js.map +1 -0
- package/dist/schemes/Exec.d.ts +39 -0
- package/dist/schemes/Exec.d.ts.map +1 -0
- package/dist/schemes/Exec.js +510 -0
- package/dist/schemes/Exec.js.map +1 -0
- package/dist/schemes/ExecOutputScheme.d.ts +20 -0
- package/dist/schemes/ExecOutputScheme.d.ts.map +1 -0
- package/dist/schemes/ExecOutputScheme.js +39 -0
- package/dist/schemes/ExecOutputScheme.js.map +1 -0
- package/dist/schemes/File.d.ts +42 -0
- package/dist/schemes/File.d.ts.map +1 -0
- package/dist/schemes/File.js +356 -0
- package/dist/schemes/File.js.map +1 -0
- package/dist/schemes/Known.d.ts +17 -0
- package/dist/schemes/Known.d.ts.map +1 -0
- package/dist/schemes/Known.js +40 -0
- package/dist/schemes/Known.js.map +1 -0
- package/dist/schemes/Log.d.ts +22 -0
- package/dist/schemes/Log.d.ts.map +1 -0
- package/dist/schemes/Log.js +269 -0
- package/dist/schemes/Log.js.map +1 -0
- package/dist/schemes/Log.sql +59 -0
- package/dist/schemes/Plurnk.d.ts +17 -0
- package/dist/schemes/Plurnk.d.ts.map +1 -0
- package/dist/schemes/Plurnk.js +46 -0
- package/dist/schemes/Plurnk.js.map +1 -0
- package/dist/schemes/Run.d.ts +25 -0
- package/dist/schemes/Run.d.ts.map +1 -0
- package/dist/schemes/Run.js +172 -0
- package/dist/schemes/Run.js.map +1 -0
- package/dist/schemes/Skill.d.ts +17 -0
- package/dist/schemes/Skill.d.ts.map +1 -0
- package/dist/schemes/Skill.js +40 -0
- package/dist/schemes/Skill.js.map +1 -0
- package/dist/schemes/Unknown.d.ts +17 -0
- package/dist/schemes/Unknown.d.ts.map +1 -0
- package/dist/schemes/Unknown.js +39 -0
- package/dist/schemes/Unknown.js.map +1 -0
- package/dist/schemes/_entry-chunk.d.ts +11 -0
- package/dist/schemes/_entry-chunk.d.ts.map +1 -0
- package/dist/schemes/_entry-chunk.js +100 -0
- package/dist/schemes/_entry-chunk.js.map +1 -0
- package/dist/schemes/_entry-crud.d.ts +31 -0
- package/dist/schemes/_entry-crud.d.ts.map +1 -0
- package/dist/schemes/_entry-crud.js +77 -0
- package/dist/schemes/_entry-crud.js.map +1 -0
- package/dist/schemes/_entry-crud.sql +101 -0
- package/dist/schemes/_entry-find.d.ts +32 -0
- package/dist/schemes/_entry-find.d.ts.map +1 -0
- package/dist/schemes/_entry-find.js +226 -0
- package/dist/schemes/_entry-find.js.map +1 -0
- package/dist/schemes/_entry-find.sql +54 -0
- package/dist/schemes/_entry-graph.d.ts +16 -0
- package/dist/schemes/_entry-graph.d.ts.map +1 -0
- package/dist/schemes/_entry-graph.js +94 -0
- package/dist/schemes/_entry-graph.js.map +1 -0
- package/dist/schemes/_entry-graph.sql +52 -0
- package/dist/schemes/_entry-manifest.d.ts +25 -0
- package/dist/schemes/_entry-manifest.d.ts.map +1 -0
- package/dist/schemes/_entry-manifest.js +266 -0
- package/dist/schemes/_entry-manifest.js.map +1 -0
- package/dist/schemes/_entry-ops.d.ts +32 -0
- package/dist/schemes/_entry-ops.d.ts.map +1 -0
- package/dist/schemes/_entry-ops.js +216 -0
- package/dist/schemes/_entry-ops.js.map +1 -0
- package/dist/schemes/_entry-ops.sql +31 -0
- package/dist/schemes/_entry-semantic.d.ts +38 -0
- package/dist/schemes/_entry-semantic.d.ts.map +1 -0
- package/dist/schemes/_entry-semantic.js +202 -0
- package/dist/schemes/_entry-semantic.js.map +1 -0
- package/dist/schemes/_entry-semantic.sql +95 -0
- package/dist/schemes/_entry-send.d.ts +11 -0
- package/dist/schemes/_entry-send.d.ts.map +1 -0
- package/dist/schemes/_entry-send.js +66 -0
- package/dist/schemes/_entry-send.js.map +1 -0
- package/dist/schemes/cosine.d.ts +4 -0
- package/dist/schemes/cosine.d.ts.map +1 -0
- package/dist/schemes/cosine.js +9 -0
- package/dist/schemes/cosine.js.map +1 -0
- package/dist/schemes/exec-abort.d.ts +15 -0
- package/dist/schemes/exec-abort.d.ts.map +1 -0
- package/dist/schemes/exec-abort.js +29 -0
- package/dist/schemes/exec-abort.js.map +1 -0
- package/dist/schemes/exec-env.d.ts +5 -0
- package/dist/schemes/exec-env.d.ts.map +1 -0
- package/dist/schemes/exec-env.js +34 -0
- package/dist/schemes/exec-env.js.map +1 -0
- package/dist/server/Daemon.d.ts +244 -0
- package/dist/server/Daemon.d.ts.map +1 -0
- package/dist/server/Daemon.js +1119 -0
- package/dist/server/Daemon.js.map +1 -0
- package/dist/server/client-input.d.ts +11 -0
- package/dist/server/client-input.d.ts.map +1 -0
- package/dist/server/client-input.js +145 -0
- package/dist/server/client-input.js.map +1 -0
- package/dist/server/clientTurn.d.ts +6 -0
- package/dist/server/clientTurn.d.ts.map +1 -0
- package/dist/server/clientTurn.js +23 -0
- package/dist/server/clientTurn.js.map +1 -0
- package/dist/server/clientTurn.sql +10 -0
- package/dist/server/dispatch-as-plurnk.d.ts +7 -0
- package/dist/server/dispatch-as-plurnk.d.ts.map +1 -0
- package/dist/server/dispatch-as-plurnk.js +23 -0
- package/dist/server/dispatch-as-plurnk.js.map +1 -0
- package/dist/server/drain.sql +124 -0
- package/dist/server/envelope.d.ts +53 -0
- package/dist/server/envelope.d.ts.map +1 -0
- package/dist/server/envelope.js +172 -0
- package/dist/server/envelope.js.map +1 -0
- package/dist/server/envelope.sql +76 -0
- package/dist/server/logEntry.d.ts +35 -0
- package/dist/server/logEntry.d.ts.map +1 -0
- package/dist/server/logEntry.js +49 -0
- package/dist/server/logEntry.js.map +1 -0
- package/dist/server/logEntry.sql +10 -0
- package/dist/server/loopDocs.d.ts +6 -0
- package/dist/server/loopDocs.d.ts.map +1 -0
- package/dist/server/loopDocs.js +22 -0
- package/dist/server/loopDocs.js.map +1 -0
- package/dist/server/noProposals.d.ts +6 -0
- package/dist/server/noProposals.d.ts.map +1 -0
- package/dist/server/noProposals.js +37 -0
- package/dist/server/noProposals.js.map +1 -0
- package/dist/server/seam-entry-read.sql +21 -0
- package/dist/server/seam-log-read.sql +21 -0
- package/dist/server/seam-loop.sql +9 -0
- package/dist/server/seam-proposal-list.sql +13 -0
- package/dist/server/version-info.d.ts +14 -0
- package/dist/server/version-info.d.ts.map +1 -0
- package/dist/server/version-info.js +69 -0
- package/dist/server/version-info.js.map +1 -0
- package/dist/server/yolo.d.ts +6 -0
- package/dist/server/yolo.d.ts.map +1 -0
- package/dist/server/yolo.js +64 -0
- package/dist/server/yolo.js.map +1 -0
- package/dist/service.d.ts +6 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +309 -0
- package/dist/service.js.map +1 -0
- package/migrations/0000-00-00.01_schema.sql +500 -0
- package/package.json +86 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { Db } from "./Db.ts";
|
|
2
|
+
import type { LoopFlags } from "./types.ts";
|
|
3
|
+
export type ChannelState = "static" | "active" | "closed" | "errored";
|
|
4
|
+
export interface StreamCoordinate {
|
|
5
|
+
loop_seq: number;
|
|
6
|
+
turn_seq: number;
|
|
7
|
+
sequence: number;
|
|
8
|
+
}
|
|
9
|
+
export interface StreamEventPayload {
|
|
10
|
+
entryId: number;
|
|
11
|
+
target: string;
|
|
12
|
+
channel: string;
|
|
13
|
+
state: ChannelState;
|
|
14
|
+
contentLength: number;
|
|
15
|
+
loop_seq?: number;
|
|
16
|
+
turn_seq?: number;
|
|
17
|
+
sequence?: number;
|
|
18
|
+
mimetype?: string;
|
|
19
|
+
}
|
|
20
|
+
export type StreamEventNotify = (sessionId: number, event: StreamEventPayload) => void;
|
|
21
|
+
export interface WakeRunPayload {
|
|
22
|
+
sessionId: number;
|
|
23
|
+
runId: number;
|
|
24
|
+
entryId: number;
|
|
25
|
+
target: string;
|
|
26
|
+
subscriptionId: number;
|
|
27
|
+
closeStatus: number;
|
|
28
|
+
scheme: string;
|
|
29
|
+
summary: string;
|
|
30
|
+
loop_seq?: number;
|
|
31
|
+
turn_seq?: number;
|
|
32
|
+
sequence?: number;
|
|
33
|
+
}
|
|
34
|
+
export type WakeRunNotify = (payload: WakeRunPayload) => void;
|
|
35
|
+
export type InjectRunNotify = (args: {
|
|
36
|
+
sessionId: number;
|
|
37
|
+
runId: number;
|
|
38
|
+
prompt: string;
|
|
39
|
+
flags?: LoopFlags;
|
|
40
|
+
}) => Promise<{
|
|
41
|
+
action: "injected_next_turn" | "enqueued_new_loop";
|
|
42
|
+
loopId: number;
|
|
43
|
+
}>;
|
|
44
|
+
export type CancelRunNotify = (runId: number) => boolean;
|
|
45
|
+
export interface TelemetryEventPayload {
|
|
46
|
+
loopId: number;
|
|
47
|
+
event: object;
|
|
48
|
+
}
|
|
49
|
+
export type TelemetryEventNotify = (sessionId: number, payload: TelemetryEventPayload) => void;
|
|
50
|
+
export default class ChannelWrite {
|
|
51
|
+
#private;
|
|
52
|
+
static appendToChannel(db: Db, { entryId, channel, chunk, notify, coordinate, mimetype }: {
|
|
53
|
+
entryId: number;
|
|
54
|
+
channel: string;
|
|
55
|
+
chunk: string;
|
|
56
|
+
notify?: StreamEventNotify;
|
|
57
|
+
coordinate?: StreamCoordinate;
|
|
58
|
+
mimetype?: string;
|
|
59
|
+
}): Promise<void>;
|
|
60
|
+
static setChannelState(db: Db, { entryId, channel, state, notify, coordinate }: {
|
|
61
|
+
entryId: number;
|
|
62
|
+
channel: string;
|
|
63
|
+
state: ChannelState;
|
|
64
|
+
notify?: StreamEventNotify;
|
|
65
|
+
coordinate?: StreamCoordinate;
|
|
66
|
+
}): Promise<void>;
|
|
67
|
+
static openSubscription(db: Db, { runId, entryId, scheme, handle, pollSeconds, turnScoped }: {
|
|
68
|
+
runId: number;
|
|
69
|
+
entryId: number;
|
|
70
|
+
scheme: string;
|
|
71
|
+
handle: string;
|
|
72
|
+
pollSeconds?: number | null;
|
|
73
|
+
turnScoped?: boolean;
|
|
74
|
+
}): Promise<number>;
|
|
75
|
+
static closeSubscription(db: Db, { subscriptionId, status }: {
|
|
76
|
+
subscriptionId: number;
|
|
77
|
+
status: number;
|
|
78
|
+
}): Promise<void>;
|
|
79
|
+
static execTerminalStatus(db: Db, { sessionId, pathname }: {
|
|
80
|
+
sessionId: number;
|
|
81
|
+
pathname: string;
|
|
82
|
+
}): Promise<number | null>;
|
|
83
|
+
static findActiveSubscription(db: Db, { runId, entryId }: {
|
|
84
|
+
runId: number;
|
|
85
|
+
entryId: number;
|
|
86
|
+
}): Promise<{
|
|
87
|
+
id: number;
|
|
88
|
+
scheme: string;
|
|
89
|
+
handle: string;
|
|
90
|
+
} | null>;
|
|
91
|
+
static findOpenSubscriptionsForRun(db: Db, runId: number): Promise<Array<{
|
|
92
|
+
id: number;
|
|
93
|
+
scheme: string;
|
|
94
|
+
}>>;
|
|
95
|
+
static findOpenTurnScopedSubscriptionsForRun(db: Db, runId: number): Promise<Array<{
|
|
96
|
+
id: number;
|
|
97
|
+
scheme: string;
|
|
98
|
+
}>>;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=ChannelWrite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChannelWrite.d.ts","sourceRoot":"","sources":["../../src/core/ChannelWrite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// Channel-write helpers for streaming schemes. SPEC §channel-state (channel state),
|
|
2
|
+
// §subscriptions (subscription registry), §notifications (stream/event notification).
|
|
3
|
+
//
|
|
4
|
+
// Schemes import these and call them as their connection lifecycle progresses; the
|
|
5
|
+
// engine has no stream/transaction abstraction (§stream-no-engine-transaction-abstraction).
|
|
6
|
+
// Helpers update entry_channels (content / state) and subscriptions, and emit
|
|
7
|
+
// stream/event notifications scoped to the entry's session via an optional
|
|
8
|
+
// callback the daemon wires in.
|
|
9
|
+
import { renderAddress } from "./plurnk-uri.js";
|
|
10
|
+
export default class ChannelWrite {
|
|
11
|
+
static #channelMeta(db) { return db.channel_meta; }
|
|
12
|
+
static #appendStmt(db) { return db.append_to_channel; }
|
|
13
|
+
static #stateStmt(db) { return db.set_channel_state; }
|
|
14
|
+
static #mimetypeStmt(db) { return db.set_channel_mimetype; }
|
|
15
|
+
static #openSubStmt(db) { return db.open_subscription; }
|
|
16
|
+
static #closeSubStmt(db) { return db.close_subscription; }
|
|
17
|
+
static #findActiveStmt(db) { return db.find_active_subscription; }
|
|
18
|
+
static #openSubsForRunStmt(db) { return db.find_open_subscriptions_for_run; }
|
|
19
|
+
static #execTerminalStmt(db) { return db.find_exec_close_status; }
|
|
20
|
+
// The entry's target URI for stream notifications (#179). A NULL scheme is
|
|
21
|
+
// a filesystem entry (the file scheme stores scheme=NULL), so it decodes to
|
|
22
|
+
// file:///.
|
|
23
|
+
static #targetUri(scheme, pathname) {
|
|
24
|
+
return renderAddress(scheme === null ? "file" : scheme, pathname);
|
|
25
|
+
}
|
|
26
|
+
// A stream chunk accumulates into the channel's content (§chunk-accumulation-chunks-accumulate)
|
|
27
|
+
// and fires a stream/event (§live-updates-stream-event-fires-on-chunk); the log carries the
|
|
28
|
+
// stream's lifecycle, never per-chunk rows (§no-chunk-rows-log-captures-lifecycle-only).
|
|
29
|
+
static async appendToChannel(db, { entryId, channel, chunk, notify, coordinate, mimetype }) {
|
|
30
|
+
const result = await ChannelWrite.#appendStmt(db).run({ chunk, entry_id: entryId, channel });
|
|
31
|
+
if (result.changes === 0)
|
|
32
|
+
return;
|
|
33
|
+
// #226 — a streaming scheme labels the channel with the body's per-call
|
|
34
|
+
// type (http's Content-Type varies per fetch). Conditional UPDATE: only
|
|
35
|
+
// writes when it changed, so labelling every chunk is a steady-state no-op.
|
|
36
|
+
if (mimetype !== undefined)
|
|
37
|
+
await ChannelWrite.#mimetypeStmt(db).run({ mimetype, entry_id: entryId, channel });
|
|
38
|
+
if (notify === undefined)
|
|
39
|
+
return;
|
|
40
|
+
const meta = await ChannelWrite.#channelMeta(db).get({ entry_id: entryId, channel });
|
|
41
|
+
if (meta === undefined)
|
|
42
|
+
return;
|
|
43
|
+
notify(meta.session_id, { entryId, target: ChannelWrite.#targetUri(meta.scheme, meta.pathname), channel, state: meta.state, contentLength: meta.contentLength, mimetype: meta.mimetype, ...coordinate });
|
|
44
|
+
}
|
|
45
|
+
// Schemes drive channel state transitions as their connection lifecycle progresses.
|
|
46
|
+
// §channel-state-schemes-own-state-transitions
|
|
47
|
+
static async setChannelState(db, { entryId, channel, state, notify, coordinate }) {
|
|
48
|
+
const result = await ChannelWrite.#stateStmt(db).run({ state, entry_id: entryId, channel });
|
|
49
|
+
if (result.changes === 0)
|
|
50
|
+
return;
|
|
51
|
+
// §semantic-fts-at-write — a stream's accumulated BODY content becomes keyword-searchable
|
|
52
|
+
// the moment the channel settles (closed/errored), not a pump-pass later. Body only: the
|
|
53
|
+
// FTS row is per-ENTRY (rowid = entry id) and the fusion's keyword half is the body's.
|
|
54
|
+
if ((state === "closed" || state === "errored") && channel === "body") {
|
|
55
|
+
const row = await db.channel_meta.get({ entry_id: entryId, channel });
|
|
56
|
+
if (row !== undefined) {
|
|
57
|
+
const body = await db.read_channel_content.get({ entry_id: entryId, channel });
|
|
58
|
+
if (body !== undefined) {
|
|
59
|
+
await db.fts_delete.run({ entry_id: entryId });
|
|
60
|
+
// §membership-binary-sniff — the same NUL guard as member ingest: a streamed
|
|
61
|
+
// binary (an http READ of an image) must not enter the keyword index.
|
|
62
|
+
const head = body.content.slice(0, 8192);
|
|
63
|
+
if (body.content.length > 0 && !head.includes("\u0000"))
|
|
64
|
+
await db.fts_insert.run({ entry_id: entryId, content: body.content });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (notify === undefined)
|
|
69
|
+
return;
|
|
70
|
+
const meta = await ChannelWrite.#channelMeta(db).get({ entry_id: entryId, channel });
|
|
71
|
+
if (meta === undefined)
|
|
72
|
+
return;
|
|
73
|
+
notify(meta.session_id, { entryId, target: ChannelWrite.#targetUri(meta.scheme, meta.pathname), channel, state: meta.state, contentLength: meta.contentLength, mimetype: meta.mimetype, ...coordinate });
|
|
74
|
+
}
|
|
75
|
+
// The subscription registry — open/find/close — is how a stream's cancellation
|
|
76
|
+
// (SEND[499] / KILL) routes to the right live subscription. §subscriptions-subscription-registry-routes-cancellation
|
|
77
|
+
static async openSubscription(db, { runId, entryId, scheme, handle, pollSeconds, turnScoped }) {
|
|
78
|
+
const row = await ChannelWrite.#openSubStmt(db).get({ run_id: runId, entry_id: entryId, scheme, handle, poll_seconds: pollSeconds ?? null, turn_scoped: turnScoped ? 1 : 0 });
|
|
79
|
+
if (row === undefined)
|
|
80
|
+
throw new Error("openSubscription: INSERT ... RETURNING produced no row");
|
|
81
|
+
return row.id;
|
|
82
|
+
}
|
|
83
|
+
static async closeSubscription(db, { subscriptionId, status }) {
|
|
84
|
+
await ChannelWrite.#closeSubStmt(db).run({ status, subscription_id: subscriptionId });
|
|
85
|
+
}
|
|
86
|
+
// Terminal close_status of a finished exec stream, by coordinate pathname —
|
|
87
|
+
// the KILL-on-a-non-running-exec lookup (Exec.kill). null = no closed
|
|
88
|
+
// subscription for that coordinate (unknown exec).
|
|
89
|
+
static async execTerminalStatus(db, { sessionId, pathname }) {
|
|
90
|
+
const row = await ChannelWrite.#execTerminalStmt(db).get({ session_id: sessionId, pathname });
|
|
91
|
+
return row?.close_status ?? null;
|
|
92
|
+
}
|
|
93
|
+
static async findActiveSubscription(db, { runId, entryId }) {
|
|
94
|
+
const row = await ChannelWrite.#findActiveStmt(db).get({ run_id: runId, entry_id: entryId });
|
|
95
|
+
return row ?? null;
|
|
96
|
+
}
|
|
97
|
+
// The run's still-open subscriptions — the registry-routed reap
|
|
98
|
+
// (§run-lifecycle-total-reap). A cancel iterates these and aborts each via the
|
|
99
|
+
// owning scheme, so a backgrounded exec is reaped regardless of in-process
|
|
100
|
+
// AbortSignal-listener timing (R1): the registry is the source of truth, the
|
|
101
|
+
// signal an optimization.
|
|
102
|
+
static async findOpenSubscriptionsForRun(db, runId) {
|
|
103
|
+
return ChannelWrite.#openSubsForRunStmt(db).all({ run_id: runId });
|
|
104
|
+
}
|
|
105
|
+
// The run's open turn-scoped (EXEC `<0>`) subscriptions — reaped at the run's next pre-turn so a
|
|
106
|
+
// `<0>` stream never survives into the subsequent turn (§exec-poll). Any open turn-scoped sub at
|
|
107
|
+
// pre-turn is necessarily from a prior turn (the reap runs before this turn's own spawns).
|
|
108
|
+
static async findOpenTurnScopedSubscriptionsForRun(db, runId) {
|
|
109
|
+
return db.find_open_turn_scoped_subscriptions_for_run.all({ run_id: runId });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=ChannelWrite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChannelWrite.js","sourceRoot":"","sources":["../../src/core/ChannelWrite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
-- Channel-write SQL for streaming schemes. SPEC §channel-state + §subscriptions + §notifications.
|
|
2
|
+
|
|
3
|
+
-- PREP: channel_meta
|
|
4
|
+
SELECT e.session_id, e.scheme, e.pathname, ec.state, ec.mimetype, length(ec.content) AS contentLength
|
|
5
|
+
FROM entry_channels ec
|
|
6
|
+
JOIN entries e ON e.id = ec.entry_id
|
|
7
|
+
WHERE ec.entry_id = $entry_id AND ec.name = $channel;
|
|
8
|
+
|
|
9
|
+
-- PREP: append_to_channel
|
|
10
|
+
UPDATE entry_channels
|
|
11
|
+
SET content = content || $chunk
|
|
12
|
+
WHERE entry_id = $entry_id AND name = $channel;
|
|
13
|
+
|
|
14
|
+
-- PREP: set_channel_state
|
|
15
|
+
UPDATE entry_channels
|
|
16
|
+
SET state = $state
|
|
17
|
+
WHERE entry_id = $entry_id AND name = $channel;
|
|
18
|
+
|
|
19
|
+
-- PREP: set_channel_mimetype
|
|
20
|
+
-- A streaming scheme labels the channel with the body's per-call type (#226 —
|
|
21
|
+
-- http's Content-Type varies per fetch). Conditional: only writes when the type
|
|
22
|
+
-- actually changed, so labelling every chunk is a steady-state no-op.
|
|
23
|
+
UPDATE entry_channels
|
|
24
|
+
SET mimetype = $mimetype
|
|
25
|
+
WHERE entry_id = $entry_id AND name = $channel AND mimetype != $mimetype;
|
|
26
|
+
|
|
27
|
+
-- PREP: replace_channel_content
|
|
28
|
+
-- Full content swap for one channel (ChannelCaps.replace). Re-tokenizes at
|
|
29
|
+
-- write (unlike append_to_channel, which defers token count to render).
|
|
30
|
+
UPDATE entry_channels
|
|
31
|
+
SET content = $content, tokens = $tokens
|
|
32
|
+
WHERE entry_id = $entry_id AND name = $channel;
|
|
33
|
+
|
|
34
|
+
-- PREP: open_subscription
|
|
35
|
+
-- turn_scoped COALESCEs to 0 so a caller binding the raw prep without it (an unbounded stream) is
|
|
36
|
+
-- a normal, non-turn-scoped subscription — the column is NOT NULL, so a missing bind would error.
|
|
37
|
+
INSERT INTO subscriptions (run_id, entry_id, scheme, handle, poll_seconds, turn_scoped)
|
|
38
|
+
VALUES ($run_id, $entry_id, $scheme, $handle, $poll_seconds, COALESCE($turn_scoped, 0))
|
|
39
|
+
RETURNING id;
|
|
40
|
+
|
|
41
|
+
-- PREP: close_subscription
|
|
42
|
+
UPDATE subscriptions
|
|
43
|
+
SET closed_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now')
|
|
44
|
+
, close_status = $status
|
|
45
|
+
WHERE id = $subscription_id AND closed_at IS NULL;
|
|
46
|
+
|
|
47
|
+
-- PREP: find_active_subscription
|
|
48
|
+
SELECT id, scheme, handle
|
|
49
|
+
FROM subscriptions
|
|
50
|
+
WHERE run_id = $run_id AND entry_id = $entry_id AND closed_at IS NULL;
|
|
51
|
+
|
|
52
|
+
-- PREP: find_open_subscriptions_for_run
|
|
53
|
+
-- The run's still-open subscriptions — the registry-routed reap (§run-lifecycle-total-reap):
|
|
54
|
+
-- loop.cancel / KILL / shutdown iterate these and abort each via the owning scheme, so a
|
|
55
|
+
-- backgrounded exec is reaped independent of any in-process AbortSignal-listener timing.
|
|
56
|
+
SELECT id, scheme
|
|
57
|
+
FROM subscriptions
|
|
58
|
+
WHERE run_id = $run_id AND closed_at IS NULL;
|
|
59
|
+
|
|
60
|
+
-- PREP: find_open_turn_scoped_subscriptions_for_run
|
|
61
|
+
-- The run's open turn-scoped (EXEC `<0>`) subscriptions — reaped at the run's next pre-turn so a
|
|
62
|
+
-- `<0>` stream never survives into the subsequent turn; its terminal output surfaces born-OPEN
|
|
63
|
+
-- through the same conclusion-delta path as any close (§exec-poll, §exec-stream).
|
|
64
|
+
SELECT id, scheme
|
|
65
|
+
FROM subscriptions
|
|
66
|
+
WHERE run_id = $run_id AND closed_at IS NULL AND turn_scoped = 1;
|
|
67
|
+
|
|
68
|
+
-- PREP: find_exec_close_status
|
|
69
|
+
-- Terminal outcome of a finished exec stream, addressed by its coordinate
|
|
70
|
+
-- pathname — the KILL-on-a-non-running-exec lookup. 499 (aborted) = killed
|
|
71
|
+
-- earlier; any other terminal status = exited naturally; no row = unknown exec.
|
|
72
|
+
SELECT s.close_status
|
|
73
|
+
FROM entries e
|
|
74
|
+
JOIN subscriptions s ON s.entry_id = e.id
|
|
75
|
+
WHERE e.scope = 'session' AND e.session_id = $session_id
|
|
76
|
+
AND e.scheme = 'exec' AND e.pathname = $pathname
|
|
77
|
+
AND s.closed_at IS NOT NULL
|
|
78
|
+
ORDER BY s.closed_at DESC
|
|
79
|
+
LIMIT 1;
|
|
80
|
+
|
|
81
|
+
-- PREP: read_channel_content
|
|
82
|
+
-- §semantic-fts-at-write — a settled stream's accumulated body, read once for the
|
|
83
|
+
-- write-time FTS index.
|
|
84
|
+
SELECT content FROM entry_channels WHERE entry_id = $entry_id AND name = $channel;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface PrepMethod {
|
|
2
|
+
run(params?: object): Promise<{
|
|
3
|
+
changes: number;
|
|
4
|
+
lastInsertRowid: number;
|
|
5
|
+
}>;
|
|
6
|
+
get<T = Record<string, unknown>>(params?: object): Promise<T | undefined>;
|
|
7
|
+
all<T = Record<string, unknown>>(params?: object): Promise<T[]>;
|
|
8
|
+
}
|
|
9
|
+
export type ExecMethod = (params?: object) => Promise<unknown>;
|
|
10
|
+
export type Db = {
|
|
11
|
+
close(): Promise<void>;
|
|
12
|
+
ready(): Promise<unknown>;
|
|
13
|
+
} & Record<string, PrepMethod | ExecMethod>;
|
|
14
|
+
//# sourceMappingURL=Db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../src/core/Db.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACvB,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC1E,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CACnE;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE/D,MAAM,MAAM,EAAE,GAAG;IACb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7B,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC"}
|
package/dist/core/Db.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Permissive structural type for SqlRite-managed database handles. SqlRite
|
|
2
|
+
// generates statement-named accessors at runtime (`db.<prep_name>.run/.get/.all`
|
|
3
|
+
// per `-- PREP:` blocks in .sql files). `npm run build:types` from
|
|
4
|
+
// @possumtech/sqlrite produces precise codegen; this alias is the manual
|
|
5
|
+
// fallback typing until that's wired into the build.
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=Db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Db.js","sourceRoot":"","sources":["../../src/core/Db.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,iFAAiF;AACjF,mEAAmE;AACnE,yEAAyE;AACzE,qDAAqD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { PlurnkStatement } from "@plurnk/plurnk-grammar";
|
|
2
|
+
import type { Mimetypes } from "@plurnk/plurnk-mimetypes";
|
|
3
|
+
import type { Db } from "./Db.ts";
|
|
4
|
+
import type SchemeRegistry from "./SchemeRegistry.ts";
|
|
5
|
+
import type ExecutorRegistry from "./ExecutorRegistry.ts";
|
|
6
|
+
import type TelemetryChannel from "./TelemetryChannel.ts";
|
|
7
|
+
import type ProposalLifecycle from "./ProposalLifecycle.ts";
|
|
8
|
+
import type { WriterTier } from "./scheme-types.ts";
|
|
9
|
+
import type { StreamEventNotify, WakeRunNotify, InjectRunNotify, CancelRunNotify } from "./ChannelWrite.ts";
|
|
10
|
+
export type DispatchContext = {
|
|
11
|
+
statement: PlurnkStatement;
|
|
12
|
+
sessionId: number;
|
|
13
|
+
runId: number;
|
|
14
|
+
loopId: number;
|
|
15
|
+
turnId: number;
|
|
16
|
+
sequence: number;
|
|
17
|
+
origin: WriterTier;
|
|
18
|
+
onDispatch?: (logEntryId: number) => void;
|
|
19
|
+
gauge?: {
|
|
20
|
+
tokenizerId: string;
|
|
21
|
+
exact: boolean;
|
|
22
|
+
count: (text: string) => Promise<number>;
|
|
23
|
+
};
|
|
24
|
+
turnParseErrors?: number;
|
|
25
|
+
};
|
|
26
|
+
export type DispatchResult = {
|
|
27
|
+
status: number;
|
|
28
|
+
attrs?: object;
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
};
|
|
31
|
+
export default class Dispatcher {
|
|
32
|
+
#private;
|
|
33
|
+
constructor({ db, schemes, mimetypes, tokenize, telemetry, proposals, executors, loopSignal, streamEventNotify, wakeRunNotify, injectRun, cancelRun, parkDeadlines, joinTargets }: {
|
|
34
|
+
db: Db;
|
|
35
|
+
schemes: SchemeRegistry;
|
|
36
|
+
mimetypes: Mimetypes;
|
|
37
|
+
tokenize: (text: string) => number;
|
|
38
|
+
telemetry: TelemetryChannel;
|
|
39
|
+
proposals: ProposalLifecycle;
|
|
40
|
+
executors: () => ExecutorRegistry | undefined;
|
|
41
|
+
loopSignal: (loopId: number) => AbortSignal | undefined;
|
|
42
|
+
streamEventNotify?: StreamEventNotify;
|
|
43
|
+
wakeRunNotify?: WakeRunNotify;
|
|
44
|
+
injectRun?: InjectRunNotify;
|
|
45
|
+
cancelRun?: CancelRunNotify;
|
|
46
|
+
parkDeadlines?: Map<number, number>;
|
|
47
|
+
joinTargets?: Set<number>;
|
|
48
|
+
});
|
|
49
|
+
dispatch(context: DispatchContext): Promise<DispatchResult>;
|
|
50
|
+
look(context: {
|
|
51
|
+
statement: PlurnkStatement;
|
|
52
|
+
sessionId: number;
|
|
53
|
+
runId: number;
|
|
54
|
+
loopId: number;
|
|
55
|
+
origin?: WriterTier;
|
|
56
|
+
}): Promise<DispatchResult>;
|
|
57
|
+
writeModelEntry({ verbatim, runId, loopId, turnId, sequence, folded, origin }: {
|
|
58
|
+
verbatim: string;
|
|
59
|
+
runId: number;
|
|
60
|
+
loopId: number;
|
|
61
|
+
turnId: number;
|
|
62
|
+
sequence: number;
|
|
63
|
+
folded: boolean;
|
|
64
|
+
origin?: WriterTier;
|
|
65
|
+
}): Promise<number>;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=Dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dispatcher.d.ts","sourceRoot":"","sources":["../../src/core/Dispatcher.ts"],"names":[],"mappings":"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"}
|