@plurnk/plurnk-service 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +54 -0
  3. package/SPEC.md +1045 -0
  4. package/bin/plurnk-service.js +111 -0
  5. package/dist/core/ChannelWrite.d.ts +40 -0
  6. package/dist/core/ChannelWrite.d.ts.map +1 -0
  7. package/dist/core/ChannelWrite.js +49 -0
  8. package/dist/core/ChannelWrite.js.map +1 -0
  9. package/dist/core/Db.d.ts +14 -0
  10. package/dist/core/Db.d.ts.map +1 -0
  11. package/dist/core/Db.js +7 -0
  12. package/dist/core/Db.js.map +1 -0
  13. package/dist/core/Engine.d.ts +107 -0
  14. package/dist/core/Engine.d.ts.map +1 -0
  15. package/dist/core/Engine.js +937 -0
  16. package/dist/core/Engine.js.map +1 -0
  17. package/dist/core/EnvFlags.d.ts +10 -0
  18. package/dist/core/EnvFlags.d.ts.map +1 -0
  19. package/dist/core/EnvFlags.js +82 -0
  20. package/dist/core/EnvFlags.js.map +1 -0
  21. package/dist/core/Migrator.d.ts +19 -0
  22. package/dist/core/Migrator.d.ts.map +1 -0
  23. package/dist/core/Migrator.js +55 -0
  24. package/dist/core/Migrator.js.map +1 -0
  25. package/dist/core/PluginLoader.d.ts +14 -0
  26. package/dist/core/PluginLoader.d.ts.map +1 -0
  27. package/dist/core/PluginLoader.js +100 -0
  28. package/dist/core/PluginLoader.js.map +1 -0
  29. package/dist/core/ProviderRegistry.d.ts +42 -0
  30. package/dist/core/ProviderRegistry.d.ts.map +1 -0
  31. package/dist/core/ProviderRegistry.js +72 -0
  32. package/dist/core/ProviderRegistry.js.map +1 -0
  33. package/dist/core/SchemeRegistry.d.ts +13 -0
  34. package/dist/core/SchemeRegistry.d.ts.map +1 -0
  35. package/dist/core/SchemeRegistry.js +50 -0
  36. package/dist/core/SchemeRegistry.js.map +1 -0
  37. package/dist/core/scheme-types.d.ts +37 -0
  38. package/dist/core/scheme-types.d.ts.map +1 -0
  39. package/dist/core/scheme-types.js +9 -0
  40. package/dist/core/scheme-types.js.map +1 -0
  41. package/dist/index.d.ts +22 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +51 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/providers/Mock.d.ts +43 -0
  46. package/dist/providers/Mock.d.ts.map +1 -0
  47. package/dist/providers/Mock.js +36 -0
  48. package/dist/providers/Mock.js.map +1 -0
  49. package/dist/schemes/Exec.d.ts +5 -0
  50. package/dist/schemes/Exec.d.ts.map +1 -0
  51. package/dist/schemes/Exec.js +20 -0
  52. package/dist/schemes/Exec.js.map +1 -0
  53. package/dist/schemes/File.d.ts +35 -0
  54. package/dist/schemes/File.d.ts.map +1 -0
  55. package/dist/schemes/File.js +149 -0
  56. package/dist/schemes/File.js.map +1 -0
  57. package/dist/schemes/Known.d.ts +19 -0
  58. package/dist/schemes/Known.d.ts.map +1 -0
  59. package/dist/schemes/Known.js +44 -0
  60. package/dist/schemes/Known.js.map +1 -0
  61. package/dist/schemes/Log.d.ts +13 -0
  62. package/dist/schemes/Log.d.ts.map +1 -0
  63. package/dist/schemes/Log.js +38 -0
  64. package/dist/schemes/Log.js.map +1 -0
  65. package/dist/schemes/Plurnk.d.ts +5 -0
  66. package/dist/schemes/Plurnk.d.ts.map +1 -0
  67. package/dist/schemes/Plurnk.js +15 -0
  68. package/dist/schemes/Plurnk.js.map +1 -0
  69. package/dist/schemes/Skill.d.ts +19 -0
  70. package/dist/schemes/Skill.d.ts.map +1 -0
  71. package/dist/schemes/Skill.js +46 -0
  72. package/dist/schemes/Skill.js.map +1 -0
  73. package/dist/schemes/Unknown.d.ts +19 -0
  74. package/dist/schemes/Unknown.d.ts.map +1 -0
  75. package/dist/schemes/Unknown.js +44 -0
  76. package/dist/schemes/Unknown.js.map +1 -0
  77. package/dist/schemes/_entry-crud.d.ts +24 -0
  78. package/dist/schemes/_entry-crud.d.ts.map +1 -0
  79. package/dist/schemes/_entry-crud.js +56 -0
  80. package/dist/schemes/_entry-crud.js.map +1 -0
  81. package/dist/schemes/_entry-find.d.ts +10 -0
  82. package/dist/schemes/_entry-find.d.ts.map +1 -0
  83. package/dist/schemes/_entry-find.js +41 -0
  84. package/dist/schemes/_entry-find.js.map +1 -0
  85. package/dist/schemes/_entry-ops.d.ts +21 -0
  86. package/dist/schemes/_entry-ops.d.ts.map +1 -0
  87. package/dist/schemes/_entry-ops.js +146 -0
  88. package/dist/schemes/_entry-ops.js.map +1 -0
  89. package/dist/schemes/_entry-send.d.ts +8 -0
  90. package/dist/schemes/_entry-send.d.ts.map +1 -0
  91. package/dist/schemes/_entry-send.js +56 -0
  92. package/dist/schemes/_entry-send.js.map +1 -0
  93. package/dist/server/ClientConnection.d.ts +22 -0
  94. package/dist/server/ClientConnection.d.ts.map +1 -0
  95. package/dist/server/ClientConnection.js +120 -0
  96. package/dist/server/ClientConnection.js.map +1 -0
  97. package/dist/server/Daemon.d.ts +43 -0
  98. package/dist/server/Daemon.d.ts.map +1 -0
  99. package/dist/server/Daemon.js +252 -0
  100. package/dist/server/Daemon.js.map +1 -0
  101. package/dist/server/MethodRegistry.d.ts +56 -0
  102. package/dist/server/MethodRegistry.d.ts.map +1 -0
  103. package/dist/server/MethodRegistry.js +55 -0
  104. package/dist/server/MethodRegistry.js.map +1 -0
  105. package/dist/server/clientTurn.d.ts +3 -0
  106. package/dist/server/clientTurn.d.ts.map +1 -0
  107. package/dist/server/clientTurn.js +22 -0
  108. package/dist/server/clientTurn.js.map +1 -0
  109. package/dist/server/dsl.d.ts +47 -0
  110. package/dist/server/dsl.d.ts.map +1 -0
  111. package/dist/server/dsl.js +117 -0
  112. package/dist/server/dsl.js.map +1 -0
  113. package/dist/server/envelope.d.ts +44 -0
  114. package/dist/server/envelope.d.ts.map +1 -0
  115. package/dist/server/envelope.js +113 -0
  116. package/dist/server/envelope.js.map +1 -0
  117. package/dist/server/logEntry.d.ts +30 -0
  118. package/dist/server/logEntry.d.ts.map +1 -0
  119. package/dist/server/logEntry.js +43 -0
  120. package/dist/server/logEntry.js.map +1 -0
  121. package/dist/server/methods/_dispatchAsClient.d.ts +8 -0
  122. package/dist/server/methods/_dispatchAsClient.d.ts.map +1 -0
  123. package/dist/server/methods/_dispatchAsClient.js +31 -0
  124. package/dist/server/methods/_dispatchAsClient.js.map +1 -0
  125. package/dist/server/methods/discover.d.ts +3 -0
  126. package/dist/server/methods/discover.d.ts.map +1 -0
  127. package/dist/server/methods/discover.js +7 -0
  128. package/dist/server/methods/discover.js.map +1 -0
  129. package/dist/server/methods/entry_read.d.ts +3 -0
  130. package/dist/server/methods/entry_read.d.ts.map +1 -0
  131. package/dist/server/methods/entry_read.js +56 -0
  132. package/dist/server/methods/entry_read.js.map +1 -0
  133. package/dist/server/methods/log_read.d.ts +3 -0
  134. package/dist/server/methods/log_read.d.ts.map +1 -0
  135. package/dist/server/methods/log_read.js +39 -0
  136. package/dist/server/methods/log_read.js.map +1 -0
  137. package/dist/server/methods/loop_resolve.d.ts +3 -0
  138. package/dist/server/methods/loop_resolve.d.ts.map +1 -0
  139. package/dist/server/methods/loop_resolve.js +45 -0
  140. package/dist/server/methods/loop_resolve.js.map +1 -0
  141. package/dist/server/methods/loop_run.d.ts +3 -0
  142. package/dist/server/methods/loop_run.d.ts.map +1 -0
  143. package/dist/server/methods/loop_run.js +112 -0
  144. package/dist/server/methods/loop_run.js.map +1 -0
  145. package/dist/server/methods/op_copy.d.ts +3 -0
  146. package/dist/server/methods/op_copy.d.ts.map +1 -0
  147. package/dist/server/methods/op_copy.js +24 -0
  148. package/dist/server/methods/op_copy.js.map +1 -0
  149. package/dist/server/methods/op_dispatch.d.ts +3 -0
  150. package/dist/server/methods/op_dispatch.d.ts.map +1 -0
  151. package/dist/server/methods/op_dispatch.js +17 -0
  152. package/dist/server/methods/op_dispatch.js.map +1 -0
  153. package/dist/server/methods/op_edit.d.ts +3 -0
  154. package/dist/server/methods/op_edit.d.ts.map +1 -0
  155. package/dist/server/methods/op_edit.js +22 -0
  156. package/dist/server/methods/op_edit.js.map +1 -0
  157. package/dist/server/methods/op_exec.d.ts +3 -0
  158. package/dist/server/methods/op_exec.d.ts.map +1 -0
  159. package/dist/server/methods/op_exec.js +19 -0
  160. package/dist/server/methods/op_exec.js.map +1 -0
  161. package/dist/server/methods/op_find.d.ts +3 -0
  162. package/dist/server/methods/op_find.d.ts.map +1 -0
  163. package/dist/server/methods/op_find.js +22 -0
  164. package/dist/server/methods/op_find.js.map +1 -0
  165. package/dist/server/methods/op_hide.d.ts +3 -0
  166. package/dist/server/methods/op_hide.d.ts.map +1 -0
  167. package/dist/server/methods/op_hide.js +22 -0
  168. package/dist/server/methods/op_hide.js.map +1 -0
  169. package/dist/server/methods/op_move.d.ts +3 -0
  170. package/dist/server/methods/op_move.d.ts.map +1 -0
  171. package/dist/server/methods/op_move.js +22 -0
  172. package/dist/server/methods/op_move.js.map +1 -0
  173. package/dist/server/methods/op_parse.d.ts +3 -0
  174. package/dist/server/methods/op_parse.d.ts.map +1 -0
  175. package/dist/server/methods/op_parse.js +23 -0
  176. package/dist/server/methods/op_parse.js.map +1 -0
  177. package/dist/server/methods/op_read.d.ts +3 -0
  178. package/dist/server/methods/op_read.d.ts.map +1 -0
  179. package/dist/server/methods/op_read.js +22 -0
  180. package/dist/server/methods/op_read.js.map +1 -0
  181. package/dist/server/methods/op_send.d.ts +3 -0
  182. package/dist/server/methods/op_send.d.ts.map +1 -0
  183. package/dist/server/methods/op_send.js +21 -0
  184. package/dist/server/methods/op_send.js.map +1 -0
  185. package/dist/server/methods/op_show.d.ts +3 -0
  186. package/dist/server/methods/op_show.d.ts.map +1 -0
  187. package/dist/server/methods/op_show.js +22 -0
  188. package/dist/server/methods/op_show.js.map +1 -0
  189. package/dist/server/methods/ping.d.ts +3 -0
  190. package/dist/server/methods/ping.d.ts.map +1 -0
  191. package/dist/server/methods/ping.js +7 -0
  192. package/dist/server/methods/ping.js.map +1 -0
  193. package/dist/server/methods/providers_list.d.ts +3 -0
  194. package/dist/server/methods/providers_list.d.ts.map +1 -0
  195. package/dist/server/methods/providers_list.js +19 -0
  196. package/dist/server/methods/providers_list.js.map +1 -0
  197. package/dist/server/methods/session_attach.d.ts +3 -0
  198. package/dist/server/methods/session_attach.d.ts.map +1 -0
  199. package/dist/server/methods/session_attach.js +42 -0
  200. package/dist/server/methods/session_attach.js.map +1 -0
  201. package/dist/server/methods/session_create.d.ts +3 -0
  202. package/dist/server/methods/session_create.d.ts.map +1 -0
  203. package/dist/server/methods/session_create.js +53 -0
  204. package/dist/server/methods/session_create.js.map +1 -0
  205. package/dist/server/methods/session_list.d.ts +3 -0
  206. package/dist/server/methods/session_list.d.ts.map +1 -0
  207. package/dist/server/methods/session_list.js +8 -0
  208. package/dist/server/methods/session_list.js.map +1 -0
  209. package/dist/server/methods/session_runs.d.ts +3 -0
  210. package/dist/server/methods/session_runs.d.ts.map +1 -0
  211. package/dist/server/methods/session_runs.js +18 -0
  212. package/dist/server/methods/session_runs.js.map +1 -0
  213. package/dist/server/methods/session_set_persona.d.ts +3 -0
  214. package/dist/server/methods/session_set_persona.d.ts.map +1 -0
  215. package/dist/server/methods/session_set_persona.js +27 -0
  216. package/dist/server/methods/session_set_persona.js.map +1 -0
  217. package/dist/server/methods/session_set_root.d.ts +3 -0
  218. package/dist/server/methods/session_set_root.d.ts.map +1 -0
  219. package/dist/server/methods/session_set_root.js +33 -0
  220. package/dist/server/methods/session_set_root.js.map +1 -0
  221. package/dist/server/yolo.d.ts +4 -0
  222. package/dist/server/yolo.d.ts.map +1 -0
  223. package/dist/server/yolo.js +48 -0
  224. package/dist/server/yolo.js.map +1 -0
  225. package/migrations/001_sessions.sql +11 -0
  226. package/migrations/002_runs.sql +16 -0
  227. package/migrations/003_loops.sql +12 -0
  228. package/migrations/004_turns.sql +18 -0
  229. package/migrations/005_entries.sql +44 -0
  230. package/migrations/006_log_entries.sql +51 -0
  231. package/migrations/007_visibility.sql +10 -0
  232. package/migrations/008_schemes_providers.sql +25 -0
  233. package/migrations/009_cost_rollups.sql +44 -0
  234. package/migrations/010_subscriptions.sql +36 -0
  235. package/migrations/011_turn_call_metadata.sql +7 -0
  236. package/migrations/012_proposal_lifecycle.sql +22 -0
  237. package/migrations/013_log_entries_lifecycle_columns.sql +22 -0
  238. package/migrations/014_loop_flags.sql +9 -0
  239. package/migrations/015_sessions_project_root.sql +6 -0
  240. package/migrations/016_persona_columns.sql +11 -0
  241. package/package.json +66 -0
  242. package/persona.md +1 -0
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { parseArgs } from "node:util";
4
+ import { existsSync } from "node:fs";
5
+ import SqlRite from "@possumtech/sqlrite";
6
+ import { fileURLToPath } from "node:url";
7
+ import { dirname, resolve } from "node:path";
8
+ import Daemon from "../src/server/Daemon.ts";
9
+ import { parseEnvExample, formatFlagsHelp } from "../src/core/EnvFlags.ts";
10
+ import { loadActiveProvider, resolveActiveAlias } from "../src/core/ProviderRegistry.ts";
11
+
12
+ const die = (code, message) => {
13
+ process.stderr.write(`${message}\n`);
14
+ process.exit(code);
15
+ };
16
+
17
+ const projectRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
18
+
19
+ // Env cascade: .env.example (shipped defaults) < .env (project) < .env.<config> (--config)
20
+ // < shell. process.loadEnvFile is set-if-unset, so loading in low→high precedence
21
+ // order yields the right effective env.
22
+ const configFlagIndex = process.argv.findIndex((a) => a === "--config" || a.startsWith("--config="));
23
+ const configFile = (() => {
24
+ if (configFlagIndex === -1) return null;
25
+ const arg = process.argv[configFlagIndex];
26
+ if (arg.includes("=")) return arg.slice(arg.indexOf("=") + 1);
27
+ return process.argv[configFlagIndex + 1] ?? null;
28
+ })();
29
+
30
+ const loadEnv = (path, required) => {
31
+ if (existsSync(path)) {
32
+ try { process.loadEnvFile(path); }
33
+ catch (cause) { die(64, `failed to load ${path}: ${cause instanceof Error ? cause.message : String(cause)}`); }
34
+ } else if (required) {
35
+ die(64, `--config: ${path} does not exist`);
36
+ }
37
+ };
38
+
39
+ // Highest precedence loads FIRST (set-if-unset semantics: first write wins).
40
+ if (configFile !== null) loadEnv(configFile, true);
41
+ loadEnv(".env", false);
42
+ loadEnv(resolve(projectRoot, ".env.example"), false);
43
+
44
+ const flagDescriptors = await parseEnvExample(resolve(projectRoot, ".env.example"));
45
+ const flagOptions = {};
46
+ for (const f of flagDescriptors) {
47
+ flagOptions[f.flagName.replace(/^--/, "")] = { type: "string" };
48
+ }
49
+
50
+ const USAGE = `usage: plurnk-service [options] [migrate]
51
+
52
+ ${formatFlagsHelp(flagDescriptors)}
53
+
54
+ --config=<path> layer additional env from <path>
55
+ -h, --help show this help
56
+ `;
57
+
58
+ const openDb = async (dbPath) => SqlRite.open({
59
+ path: dbPath,
60
+ dir: [resolve(projectRoot, "migrations"), resolve(projectRoot, "src")],
61
+ });
62
+
63
+ const migrate = async () => {
64
+ const db = await openDb(process.env.PLURNK_DB_PATH);
65
+ try { process.stdout.write(`migrated: ${process.env.PLURNK_DB_PATH}\n`); }
66
+ finally { await db.close(); }
67
+ };
68
+
69
+ const start = async () => {
70
+ const dbPath = process.env.PLURNK_DB_PATH;
71
+ const host = process.env.PLURNK_HOST;
72
+ const port = Number(process.env.PLURNK_PORT);
73
+
74
+ const db = await openDb(dbPath);
75
+ const alias = resolveActiveAlias();
76
+ const provider = alias === null ? null : await loadActiveProvider();
77
+ const daemon = new Daemon({ db, provider });
78
+ const addr = await daemon.start({ host, port });
79
+ const aliasStr = alias === null ? "no model" : `${alias.alias}=${alias.provider}/${alias.model}`;
80
+ process.stdout.write(`plurnk-service ws://${addr.host}:${addr.port} db=${dbPath} ${aliasStr}\n`);
81
+
82
+ const shutdown = async () => { await daemon.stop(); await db.close(); process.exit(0); };
83
+ process.on("SIGINT", shutdown);
84
+ process.on("SIGTERM", shutdown);
85
+ };
86
+
87
+ const { positionals, values } = parseArgs({
88
+ allowPositionals: true,
89
+ strict: false,
90
+ options: { help: { type: "boolean", short: "h" }, config: { type: "string" }, ...flagOptions },
91
+ });
92
+
93
+ for (const f of flagDescriptors) {
94
+ const key = f.flagName.replace(/^--/, "");
95
+ if (typeof values[key] === "string") process.env[f.envName] = values[key];
96
+ }
97
+
98
+ if (values.help) { process.stdout.write(USAGE); process.exit(0); }
99
+
100
+ const dispatch = { migrate, start };
101
+ const subcommand = positionals[0] ?? "start";
102
+ const handler = dispatch[subcommand];
103
+ if (handler === undefined) die(64, `unknown subcommand: ${subcommand}\n\n${USAGE}`);
104
+ if (positionals.length > 1) die(64, `unexpected arguments: ${positionals.slice(1).join(" ")}`);
105
+
106
+ try { await handler(); }
107
+ catch (cause) {
108
+ process.stderr.write(`${subcommand}: ${cause instanceof Error ? cause.message : String(cause)}\n`);
109
+ if (cause instanceof Error && cause.cause) process.stderr.write(` cause: ${cause.cause instanceof Error ? cause.cause.message : String(cause.cause)}\n`);
110
+ process.exit(1);
111
+ }
@@ -0,0 +1,40 @@
1
+ import type { Db } from "./Db.ts";
2
+ export type ChannelState = "static" | "active" | "closed" | "errored";
3
+ export interface StreamEventPayload {
4
+ entryId: number;
5
+ channel: string;
6
+ state: ChannelState;
7
+ contentLength: number;
8
+ }
9
+ export type StreamEventNotify = (sessionId: number, event: StreamEventPayload) => void;
10
+ export declare const appendToChannel: (db: Db, { entryId, channel, chunk, notify }: {
11
+ entryId: number;
12
+ channel: string;
13
+ chunk: string;
14
+ notify?: StreamEventNotify;
15
+ }) => Promise<void>;
16
+ export declare const setChannelState: (db: Db, { entryId, channel, state, notify }: {
17
+ entryId: number;
18
+ channel: string;
19
+ state: ChannelState;
20
+ notify?: StreamEventNotify;
21
+ }) => Promise<void>;
22
+ export declare const openSubscription: (db: Db, { runId, entryId, scheme, handle }: {
23
+ runId: number;
24
+ entryId: number;
25
+ scheme: string;
26
+ handle: string;
27
+ }) => Promise<number>;
28
+ export declare const closeSubscription: (db: Db, { subscriptionId, status }: {
29
+ subscriptionId: number;
30
+ status: number;
31
+ }) => Promise<void>;
32
+ export declare const findActiveSubscription: (db: Db, { runId, entryId }: {
33
+ runId: number;
34
+ entryId: number;
35
+ }) => Promise<{
36
+ id: number;
37
+ scheme: string;
38
+ handle: string;
39
+ } | null>;
40
+ //# sourceMappingURL=ChannelWrite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChannelWrite.d.ts","sourceRoot":"","sources":["../../src/core/ChannelWrite.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,SAAS,CAAC;AAE9C,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtE,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAevF,eAAO,MAAM,eAAe,GACxB,IAAI,EAAE,EACN,qCAAqC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,KACrH,OAAO,CAAC,IAAI,CAOd,CAAC;AAEF,eAAO,MAAM,eAAe,GACxB,IAAI,EAAE,EACN,qCAAqC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC;IAAC,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,KAC3H,OAAO,CAAC,IAAI,CAOd,CAAC;AAEF,eAAO,MAAM,gBAAgB,GACzB,IAAI,EAAE,EACN,oCAAoC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,KACvG,OAAO,CAAC,MAAM,CAIhB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC1B,IAAI,EAAE,EACN,4BAA4B;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,KACvE,OAAO,CAAC,IAAI,CAEd,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAC/B,IAAI,EAAE,EACN,oBAAoB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,KACvD,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAG/D,CAAC"}
@@ -0,0 +1,49 @@
1
+ // Channel-write helpers for streaming schemes. SPEC §5.6 (channel state),
2
+ // §7.1 (subscription registry), §13.6 (stream/event notification).
3
+ //
4
+ // Schemes import these and call them as their connection lifecycle progresses.
5
+ // Helpers update entry_channels (content / state) and subscriptions, and emit
6
+ // stream/event notifications scoped to the entry's session via an optional
7
+ // callback the daemon wires in.
8
+ const channelMeta = (db) => db.channel_meta;
9
+ const appendStmt = (db) => db.append_to_channel;
10
+ const stateStmt = (db) => db.set_channel_state;
11
+ const openSubStmt = (db) => db.open_subscription;
12
+ const closeSubStmt = (db) => db.close_subscription;
13
+ const findActiveStmt = (db) => db.find_active_subscription;
14
+ export const appendToChannel = async (db, { entryId, channel, chunk, notify }) => {
15
+ const result = await appendStmt(db).run({ chunk, entry_id: entryId, channel });
16
+ if (result.changes === 0)
17
+ return;
18
+ if (notify === undefined)
19
+ return;
20
+ const meta = await channelMeta(db).get({ entry_id: entryId, channel });
21
+ if (meta === undefined)
22
+ return;
23
+ notify(meta.session_id, { entryId, channel, state: meta.state, contentLength: meta.contentLength });
24
+ };
25
+ export const setChannelState = async (db, { entryId, channel, state, notify }) => {
26
+ const result = await stateStmt(db).run({ state, entry_id: entryId, channel });
27
+ if (result.changes === 0)
28
+ return;
29
+ if (notify === undefined)
30
+ return;
31
+ const meta = await channelMeta(db).get({ entry_id: entryId, channel });
32
+ if (meta === undefined)
33
+ return;
34
+ notify(meta.session_id, { entryId, channel, state: meta.state, contentLength: meta.contentLength });
35
+ };
36
+ export const openSubscription = async (db, { runId, entryId, scheme, handle }) => {
37
+ const row = await openSubStmt(db).get({ run_id: runId, entry_id: entryId, scheme, handle });
38
+ if (row === undefined)
39
+ throw new Error("openSubscription: INSERT ... RETURNING produced no row");
40
+ return row.id;
41
+ };
42
+ export const closeSubscription = async (db, { subscriptionId, status }) => {
43
+ await closeSubStmt(db).run({ status, subscription_id: subscriptionId });
44
+ };
45
+ export const findActiveSubscription = async (db, { runId, entryId }) => {
46
+ const row = await findActiveStmt(db).get({ run_id: runId, entry_id: entryId });
47
+ return row ?? null;
48
+ };
49
+ //# sourceMappingURL=ChannelWrite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChannelWrite.js","sourceRoot":"","sources":["../../src/core/ChannelWrite.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,mEAAmE;AACnE,EAAE;AACF,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,gCAAgC;AAqBhC,MAAM,WAAW,GAAG,CAAC,EAAM,EAAE,EAAE,CAAC,EAAE,CAAC,YAA0B,CAAC;AAC9D,MAAM,UAAU,GAAG,CAAC,EAAM,EAAE,EAAE,CAAC,EAAE,CAAC,iBAA+B,CAAC;AAClE,MAAM,SAAS,GAAG,CAAC,EAAM,EAAE,EAAE,CAAC,EAAE,CAAC,iBAA+B,CAAC;AACjE,MAAM,WAAW,GAAG,CAAC,EAAM,EAAE,EAAE,CAAC,EAAE,CAAC,iBAA+B,CAAC;AACnE,MAAM,YAAY,GAAG,CAAC,EAAM,EAAE,EAAE,CAAC,EAAE,CAAC,kBAAgC,CAAC;AACrE,MAAM,cAAc,GAAG,CAAC,EAAM,EAAE,EAAE,CAAC,EAAE,CAAC,wBAAsC,CAAC;AAE7E,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAChC,EAAM,EACN,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAmF,EACvG,EAAE;IACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/E,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC;QAAE,OAAO;IACjC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO;IACjC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACvF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;AACxG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAChC,EAAM,EACN,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAyF,EAC7G,EAAE;IACf,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9E,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC;QAAE,OAAO;IACjC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO;IACjC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACvF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;AACxG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACjC,EAAM,EACN,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAsE,EACvF,EAAE;IACjB,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAiB,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5G,IAAI,GAAG,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IACjG,OAAO,GAAG,CAAC,EAAE,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAClC,EAAM,EACN,EAAE,cAAc,EAAE,MAAM,EAA8C,EACzD,EAAE;IACf,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC;AAC5E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EACvC,EAAM,EACN,EAAE,KAAK,EAAE,OAAO,EAAsC,EACQ,EAAE;IAChE,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC,GAAG,CAAiD,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/H,OAAO,GAAG,IAAI,IAAI,CAAC;AACvB,CAAC,CAAC"}
@@ -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"}
@@ -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,107 @@
1
+ import type { PlurnkStatement } from "@plurnk/plurnk-grammar";
2
+ import type SchemeRegistry from "./SchemeRegistry.ts";
3
+ import { Mimetypes } from "@plurnk/plurnk-mimetypes";
4
+ import type { Db } from "./Db.ts";
5
+ import type { LoopFlags } from "./scheme-types.ts";
6
+ type Origin = "model" | "client" | "system" | "plugin";
7
+ type ChatMessage = {
8
+ role: "system" | "user" | "assistant";
9
+ content: string;
10
+ };
11
+ import type { Provider } from "./ProviderRegistry.ts";
12
+ type DispatchContext = {
13
+ statement: PlurnkStatement;
14
+ sessionId: number;
15
+ runId: number;
16
+ loopId: number;
17
+ turnId: number;
18
+ actionIndex: number;
19
+ origin: Origin;
20
+ onDispatch?: (logEntryId: number) => void;
21
+ };
22
+ type DispatchResult = {
23
+ status: number;
24
+ attrs?: object;
25
+ [key: string]: unknown;
26
+ };
27
+ export type ProposalDecision = "accept" | "reject" | "cancel";
28
+ export interface ProposalResolution {
29
+ decision: ProposalDecision;
30
+ body?: string;
31
+ outcome?: string;
32
+ }
33
+ export interface ProposalPendingEvent {
34
+ logEntryId: number;
35
+ sessionId: number;
36
+ runId: number;
37
+ loopId: number;
38
+ turnId: number;
39
+ op: string;
40
+ target: {
41
+ scheme: string | null;
42
+ pathname: string | null;
43
+ };
44
+ body: string;
45
+ attrs: object;
46
+ flags: LoopFlags;
47
+ }
48
+ export declare const fingerprintTurn: (ops: ReadonlyArray<PlurnkStatement>) => string;
49
+ export declare const detectCycle: (history: ReadonlyArray<string>, minCycles: number, maxCyclePeriod: number) => {
50
+ detected: false;
51
+ } | {
52
+ detected: true;
53
+ period: number;
54
+ cycles: number;
55
+ };
56
+ export default class Engine {
57
+ #private;
58
+ constructor({ db, schemes, mimetypes }: {
59
+ db: Db;
60
+ schemes: SchemeRegistry;
61
+ mimetypes?: Mimetypes;
62
+ });
63
+ runLoop({ provider, messages, persona, sessionId, runId, loopId, maxTurns, maxStrikes, minCycles, maxCyclePeriod, origin, signal, onDispatch, }: {
64
+ provider: Provider;
65
+ messages: ChatMessage[];
66
+ persona?: string;
67
+ sessionId: number;
68
+ runId: number;
69
+ loopId: number;
70
+ maxTurns?: number;
71
+ maxStrikes?: number;
72
+ minCycles?: number;
73
+ maxCyclePeriod?: number;
74
+ origin?: Origin;
75
+ signal?: AbortSignal;
76
+ onDispatch?: (logEntryId: number) => void;
77
+ }): Promise<{
78
+ turnIds: number[];
79
+ finalStatus: number;
80
+ hitMaxTurns: boolean;
81
+ reason: "max_turns" | "strike_threshold" | "external" | null;
82
+ }>;
83
+ runTurn({ provider, messages, persona, sessionId, runId, loopId, origin, signal, onDispatch, turnNumber, maxTurns, }: {
84
+ provider: Provider;
85
+ messages: ChatMessage[];
86
+ persona?: string;
87
+ sessionId: number;
88
+ runId: number;
89
+ loopId: number;
90
+ origin?: Origin;
91
+ signal?: AbortSignal;
92
+ onDispatch?: (logEntryId: number) => void;
93
+ turnNumber?: number;
94
+ maxTurns?: number;
95
+ }): Promise<{
96
+ turnId: number;
97
+ status: number;
98
+ statuses: number[];
99
+ fingerprint: string;
100
+ }>;
101
+ dispatch(context: DispatchContext): Promise<DispatchResult>;
102
+ resolveProposal(logEntryId: number, resolution: ProposalResolution): void;
103
+ pendingProposalIds(): number[];
104
+ onProposalPending(listener: (event: ProposalPendingEvent) => void): void;
105
+ }
106
+ export {};
107
+ //# sourceMappingURL=Engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../../src/core/Engine.ts"],"names":[],"mappings":"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"}