@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,7 @@
1
+ export const register = (registry) => {
2
+ registry.registerMethod("ping", {
3
+ handler: async () => ({}),
4
+ description: "Liveness check. Returns an empty object.",
5
+ });
6
+ };
7
+ //# sourceMappingURL=ping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping.js","sourceRoot":"","sources":["../../../src/server/methods/ping.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE;QAC5B,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACzB,WAAW,EAAE,0CAA0C;KAC1D,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type MethodRegistry from "../MethodRegistry.ts";
2
+ export declare const register: (registry: MethodRegistry) => void;
3
+ //# sourceMappingURL=providers_list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers_list.d.ts","sourceRoot":"","sources":["../../../src/server/methods/providers_list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAGvD,eAAO,MAAM,QAAQ,GAAI,UAAU,cAAc,KAAG,IAgBnD,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { parseAliasesFromEnv, resolveActiveAlias } from "../../core/ProviderRegistry.js";
2
+ export const register = (registry) => {
3
+ registry.registerMethod("providers.list", {
4
+ handler: async () => {
5
+ const aliases = parseAliasesFromEnv();
6
+ const active = resolveActiveAlias();
7
+ return {
8
+ aliases: aliases.map((a) => ({
9
+ alias: a.alias,
10
+ provider: a.provider,
11
+ model: a.model,
12
+ active: active !== null && active.alias === a.alias,
13
+ })),
14
+ };
15
+ },
16
+ description: "List configured model aliases (PLURNK_MODEL_<alias>) and which one is active.",
17
+ });
18
+ };
19
+ //# sourceMappingURL=providers_list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers_list.js","sourceRoot":"","sources":["../../../src/server/methods/providers_list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEzF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,gBAAgB,EAAE;QACtC,OAAO,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;YACpC,OAAO;gBACH,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACzB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,MAAM,EAAE,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;iBACtD,CAAC,CAAC;aACN,CAAC;QACN,CAAC;QACD,WAAW,EAAE,+EAA+E;KAC/F,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type MethodRegistry from "../MethodRegistry.ts";
2
+ export declare const register: (registry: MethodRegistry) => void;
3
+ //# sourceMappingURL=session_attach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session_attach.d.ts","sourceRoot":"","sources":["../../../src/server/methods/session_attach.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAGvD,eAAO,MAAM,QAAQ,GAAI,UAAU,cAAc,KAAG,IAuCnD,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { attachToSession } from "../envelope.js";
2
+ export const register = (registry) => {
3
+ registry.registerMethod("session.attach", {
4
+ handler: async (params, ctx) => {
5
+ if (ctx.session !== null) {
6
+ throw new Error("connection already has a session attached");
7
+ }
8
+ const p = (params ?? {});
9
+ if (typeof p.id !== "number") {
10
+ throw new Error("session.attach requires params.id: number");
11
+ }
12
+ if (p.runId !== undefined && typeof p.runId !== "number") {
13
+ throw new Error("session.attach: runId must be a number");
14
+ }
15
+ if (p.runName !== undefined && (typeof p.runName !== "string" || p.runName.length === 0)) {
16
+ throw new Error("session.attach: runName must be a non-empty string");
17
+ }
18
+ const persona = p.persona ?? null;
19
+ if (persona !== null && typeof persona !== "string") {
20
+ throw new Error("session.attach: persona must be a string or null");
21
+ }
22
+ const envelope = await attachToSession(ctx.db, p.id, { runId: p.runId, runName: p.runName, persona });
23
+ ctx.attachSession(envelope);
24
+ return {
25
+ id: envelope.sessionId,
26
+ name: envelope.sessionName,
27
+ sessionPersona: envelope.sessionPersona,
28
+ runId: envelope.runId,
29
+ runName: envelope.runName,
30
+ runPersona: envelope.runPersona,
31
+ };
32
+ },
33
+ description: "Attach this connection to an existing session. Optionally resume an existing run by id or name; otherwise creates a fresh run. The persona param sets run-level persona ONLY when a new run is created (reusing an existing run preserves its stored persona; use session.set_persona for session-level changes).",
34
+ params: {
35
+ id: "number — session id to attach to",
36
+ runId: "number? — resume the run with this id (must belong to the session)",
37
+ runName: "string? — resume the run with this name within the session; create if absent",
38
+ persona: "string? — run-level persona (text/markdown); applied to a NEWLY created run only",
39
+ },
40
+ });
41
+ };
42
+ //# sourceMappingURL=session_attach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session_attach.js","sourceRoot":"","sources":["../../../src/server/methods/session_attach.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,gBAAgB,EAAE;QACtC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3B,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAA8E,CAAC;YACtG,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC9D,CAAC;YACD,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;gBACvF,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAC1E,CAAC;YACD,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC;YAClC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACxE,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACtG,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC5B,OAAO;gBACH,EAAE,EAAE,QAAQ,CAAC,SAAS;gBACtB,IAAI,EAAE,QAAQ,CAAC,WAAW;gBAC1B,cAAc,EAAE,QAAQ,CAAC,cAAc;gBACvC,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,UAAU,EAAE,QAAQ,CAAC,UAAU;aAClC,CAAC;QACN,CAAC;QACD,WAAW,EAAE,mTAAmT;QAChU,MAAM,EAAE;YACJ,EAAE,EAAE,kCAAkC;YACtC,KAAK,EAAE,oEAAoE;YAC3E,OAAO,EAAE,8EAA8E;YACvF,OAAO,EAAE,kFAAkF;SAC9F;KACJ,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type MethodRegistry from "../MethodRegistry.ts";
2
+ export declare const register: (registry: MethodRegistry) => void;
3
+ //# sourceMappingURL=session_create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session_create.d.ts","sourceRoot":"","sources":["../../../src/server/methods/session_create.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAGvD,eAAO,MAAM,QAAQ,GAAI,UAAU,cAAc,KAAG,IAkDnD,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { isAbsolute } from "node:path";
2
+ import { createClientEnvelope } from "../envelope.js";
3
+ export const register = (registry) => {
4
+ registry.registerMethod("session.create", {
5
+ handler: async (params, ctx) => {
6
+ if (ctx.session !== null) {
7
+ throw new Error("connection already has a session attached");
8
+ }
9
+ const p = (params ?? {});
10
+ const projectRoot = p.projectRoot ?? null;
11
+ if (projectRoot !== null) {
12
+ if (typeof projectRoot !== "string" || projectRoot.length === 0) {
13
+ throw new Error("session.create: projectRoot must be a non-empty string or null");
14
+ }
15
+ if (!isAbsolute(projectRoot)) {
16
+ throw new Error("session.create: projectRoot must be an absolute path");
17
+ }
18
+ }
19
+ const persona = p.persona ?? null;
20
+ if (persona !== null && typeof persona !== "string") {
21
+ throw new Error("session.create: persona must be a string or null");
22
+ }
23
+ const envelope = await createClientEnvelope(ctx.db, { name: p.name, projectRoot, persona });
24
+ ctx.attachSession(envelope);
25
+ ctx.notify("all", "session/created", {
26
+ id: envelope.sessionId,
27
+ name: envelope.sessionName,
28
+ projectRoot: envelope.projectRoot,
29
+ persona: envelope.sessionPersona,
30
+ });
31
+ return {
32
+ id: envelope.sessionId, name: envelope.sessionName,
33
+ projectRoot: envelope.projectRoot, persona: envelope.sessionPersona,
34
+ };
35
+ },
36
+ description: "Create a new session and attach this connection to it. Optionally pin the session to a workspace via projectRoot, and/or set a session-level persona (text/markdown injected into packet.system.persona). Per-run and per-loop overrides may further refine the persona.",
37
+ params: {
38
+ name: "string? — session name (auto-generated if omitted)",
39
+ projectRoot: "string? — absolute path to the client's workspace; null/omitted = headless mode (no disk side-effects on file ops)",
40
+ persona: "string? — session-level persona (text/markdown); cascades as: loops.persona > runs.persona > sessions.persona > PLURNK_PERSONA file",
41
+ },
42
+ });
43
+ registry.registerNotification("session/created", {
44
+ description: "A new session has been created. Broadcast to all connected clients.",
45
+ params: {
46
+ id: "number — session id",
47
+ name: "string — session name",
48
+ projectRoot: "string|null — workspace pointer for the session (null = headless)",
49
+ persona: "string|null — session-level persona override (null = no override at this level)",
50
+ },
51
+ });
52
+ };
53
+ //# sourceMappingURL=session_create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session_create.js","sourceRoot":"","sources":["../../../src/server/methods/session_create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,gBAAgB,EAAE;QACtC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3B,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAA4E,CAAC;YACpG,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC;YAC1C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACvB,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC9D,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;gBACtF,CAAC;gBACD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC3B,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;gBAC5E,CAAC;YACL,CAAC;YACD,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC;YAClC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACxE,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5F,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC5B,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,EAAE;gBACjC,EAAE,EAAE,QAAQ,CAAC,SAAS;gBACtB,IAAI,EAAE,QAAQ,CAAC,WAAW;gBAC1B,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,OAAO,EAAE,QAAQ,CAAC,cAAc;aACnC,CAAC,CAAC;YACH,OAAO;gBACH,EAAE,EAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,WAAW;gBAClD,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,cAAc;aACtE,CAAC;QACN,CAAC;QACD,WAAW,EAAE,0QAA0Q;QACvR,MAAM,EAAE;YACJ,IAAI,EAAE,oDAAoD;YAC1D,WAAW,EAAE,oHAAoH;YACjI,OAAO,EAAE,qIAAqI;SACjJ;KACJ,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,CAAC,iBAAiB,EAAE;QAC7C,WAAW,EAAE,qEAAqE;QAClF,MAAM,EAAE;YACJ,EAAE,EAAE,qBAAqB;YACzB,IAAI,EAAE,uBAAuB;YAC7B,WAAW,EAAE,mEAAmE;YAChF,OAAO,EAAE,iFAAiF;SAC7F;KACJ,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type MethodRegistry from "../MethodRegistry.ts";
2
+ export declare const register: (registry: MethodRegistry) => void;
3
+ //# sourceMappingURL=session_list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session_list.d.ts","sourceRoot":"","sources":["../../../src/server/methods/session_list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAGvD,eAAO,MAAM,QAAQ,GAAI,UAAU,cAAc,KAAG,IAKnD,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { listSessions } from "../envelope.js";
2
+ export const register = (registry) => {
3
+ registry.registerMethod("session.list", {
4
+ handler: async (_params, ctx) => ({ sessions: await listSessions(ctx.db) }),
5
+ description: "List all sessions, most recent first.",
6
+ });
7
+ };
8
+ //# sourceMappingURL=session_list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session_list.js","sourceRoot":"","sources":["../../../src/server/methods/session_list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,cAAc,EAAE;QACpC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3E,WAAW,EAAE,uCAAuC;KACvD,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type MethodRegistry from "../MethodRegistry.ts";
2
+ export declare const register: (registry: MethodRegistry) => void;
3
+ //# sourceMappingURL=session_runs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session_runs.d.ts","sourceRoot":"","sources":["../../../src/server/methods/session_runs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAGvD,eAAO,MAAM,QAAQ,GAAI,UAAU,cAAc,KAAG,IAenD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { listRunsForSession } from "../envelope.js";
2
+ export const register = (registry) => {
3
+ registry.registerMethod("session.runs", {
4
+ handler: async (params, ctx) => {
5
+ const p = (params ?? {});
6
+ const sessionId = p.id ?? ctx.session?.sessionId;
7
+ if (typeof sessionId !== "number") {
8
+ throw new Error("session.runs requires params.id: number (or an attached session)");
9
+ }
10
+ return { runs: await listRunsForSession(ctx.db, sessionId) };
11
+ },
12
+ description: "List runs in a session, most recent first.",
13
+ params: {
14
+ id: "number? — session id; defaults to the attached session",
15
+ },
16
+ });
17
+ };
18
+ //# sourceMappingURL=session_runs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session_runs.js","sourceRoot":"","sources":["../../../src/server/methods/session_runs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,cAAc,EAAE;QACpC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAoB,CAAC;YAC5C,MAAM,SAAS,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC;YACjD,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;YACxF,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC;QACjE,CAAC;QACD,WAAW,EAAE,4CAA4C;QACzD,MAAM,EAAE;YACJ,EAAE,EAAE,wDAAwD;SAC/D;KACJ,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type MethodRegistry from "../MethodRegistry.ts";
2
+ export declare const register: (registry: MethodRegistry) => void;
3
+ //# sourceMappingURL=session_set_persona.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session_set_persona.d.ts","sourceRoot":"","sources":["../../../src/server/methods/session_set_persona.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAGvD,eAAO,MAAM,QAAQ,GAAI,UAAU,cAAc,KAAG,IAwBnD,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { updateSessionPersona } from "../envelope.js";
2
+ export const register = (registry) => {
3
+ registry.registerMethod("session.set_persona", {
4
+ handler: async (params, ctx) => {
5
+ if (ctx.session === null) {
6
+ throw new Error("session.set_persona requires an attached session");
7
+ }
8
+ const p = (params ?? {});
9
+ const persona = p.persona ?? null;
10
+ if (persona !== null && typeof persona !== "string") {
11
+ throw new Error("session.set_persona: persona must be a string or null");
12
+ }
13
+ const updated = await updateSessionPersona(ctx.db, ctx.session.sessionId, persona);
14
+ // Mutate the attached envelope so subsequent handler invocations
15
+ // on this connection observe the new value. ctx.session is the
16
+ // same object reference held in ClientConnection.#session.
17
+ ctx.session.sessionPersona = updated;
18
+ return { id: ctx.session.sessionId, persona: updated };
19
+ },
20
+ description: "Update the session-level persona (text/markdown injected into packet.system.persona when no per-run or per-loop override exists). Pass null to clear the override and fall through to PLURNK_PERSONA file.",
21
+ params: {
22
+ persona: "string|null — session-level persona content; null clears the override",
23
+ },
24
+ requiresInit: true,
25
+ });
26
+ };
27
+ //# sourceMappingURL=session_set_persona.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session_set_persona.js","sourceRoot":"","sources":["../../../src/server/methods/session_set_persona.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,qBAAqB,EAAE;QAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3B,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACxE,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAgC,CAAC;YACxD,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC;YAClC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC7E,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACnF,iEAAiE;YACjE,+DAA+D;YAC/D,2DAA2D;YAC3D,GAAG,CAAC,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC;YACrC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAC3D,CAAC;QACD,WAAW,EAAE,4MAA4M;QACzN,MAAM,EAAE;YACJ,OAAO,EAAE,uEAAuE;SACnF;QACD,YAAY,EAAE,IAAI;KACrB,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type MethodRegistry from "../MethodRegistry.ts";
2
+ export declare const register: (registry: MethodRegistry) => void;
3
+ //# sourceMappingURL=session_set_root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session_set_root.d.ts","sourceRoot":"","sources":["../../../src/server/methods/session_set_root.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAGvD,eAAO,MAAM,QAAQ,GAAI,UAAU,cAAc,KAAG,IA6BnD,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { isAbsolute } from "node:path";
2
+ import { updateSessionProjectRoot } from "../envelope.js";
3
+ export const register = (registry) => {
4
+ registry.registerMethod("session.set_root", {
5
+ handler: async (params, ctx) => {
6
+ if (ctx.session === null) {
7
+ throw new Error("session.set_root requires an attached session");
8
+ }
9
+ const p = (params ?? {});
10
+ const projectRoot = p.projectRoot ?? null;
11
+ if (projectRoot !== null) {
12
+ if (typeof projectRoot !== "string" || projectRoot.length === 0) {
13
+ throw new Error("session.set_root: projectRoot must be a non-empty string or null");
14
+ }
15
+ if (!isAbsolute(projectRoot)) {
16
+ throw new Error("session.set_root: projectRoot must be an absolute path");
17
+ }
18
+ }
19
+ const updated = await updateSessionProjectRoot(ctx.db, ctx.session.sessionId, projectRoot);
20
+ // Mutate the attached envelope so subsequent handler invocations on
21
+ // this connection observe the new value. ctx.session is the same
22
+ // object reference held in ClientConnection.#session.
23
+ ctx.session.projectRoot = updated;
24
+ return { id: ctx.session.sessionId, projectRoot: updated };
25
+ },
26
+ description: "Update the workspace pointer (projectRoot) on the currently-attached session. Pass null to revert to headless mode.",
27
+ params: {
28
+ projectRoot: "string|null — absolute path to the client's workspace; null = headless",
29
+ },
30
+ requiresInit: true,
31
+ });
32
+ };
33
+ //# sourceMappingURL=session_set_root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session_set_root.js","sourceRoot":"","sources":["../../../src/server/methods/session_set_root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,kBAAkB,EAAE;QACxC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3B,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAoC,CAAC;YAC5D,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC;YAC1C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACvB,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC9D,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;gBACxF,CAAC;gBACD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC3B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;gBAC9E,CAAC;YACL,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAC3F,oEAAoE;YACpE,iEAAiE;YACjE,sDAAsD;YACtD,GAAG,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC;YAClC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;QAC/D,CAAC;QACD,WAAW,EAAE,qHAAqH;QAClI,MAAM,EAAE;YACJ,WAAW,EAAE,wEAAwE;SACxF;QACD,YAAY,EAAE,IAAI;KACrB,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type Engine from "../core/Engine.ts";
2
+ import type { Db } from "../core/Db.ts";
3
+ export declare const attachYolo: (engine: Engine, _db: Db) => void;
4
+ //# sourceMappingURL=yolo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yolo.d.ts","sourceRoot":"","sources":["../../src/server/yolo.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAE5C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAExC,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,EAAE,KAAK,EAAE,KAAG,IAUpD,CAAC"}
@@ -0,0 +1,48 @@
1
+ // Server-side YOLO listener — in-tree subscriber to Engine.onProposalPending
2
+ // that auto-accepts proposals when the loop's persisted flags.yolo === true.
3
+ // No client roundtrip; no human approval; no RPC involvement.
4
+ //
5
+ // === Server-side vs client-side YOLO ===
6
+ //
7
+ // These are distinct features. Both have legitimate use cases. Neither
8
+ // replaces the other.
9
+ //
10
+ // Server-side YOLO (this file)
11
+ // - Enabled via loops.flags.yolo = true. RPC opt-in:
12
+ // loop.run({ prompt, flags: { yolo: true } }).
13
+ // - Engine auto-accepts in-process; the client need not be connected.
14
+ // - Use cases: benchmarks (pure model+grammar timing, no RPC roundtrip
15
+ // in the hot loop), CI runs, ad-hoc internal automation, test
16
+ // fixtures. Anywhere "just run and tell me the final state" is the
17
+ // right contract.
18
+ // - Client apps (@plurnk/plurnk CLI / TUI) intentionally do NOT expose
19
+ // this flag — server YOLO is not standard end-user ergonomics.
20
+ //
21
+ // Client-side YOLO (@plurnk/plurnk --yolo / PLURNK_YOLO)
22
+ // - Client receives the loop/proposal notification and immediately
23
+ // sends loop.resolve({decision:"accept", outcome:"client_yolo"}).
24
+ // - The wire roundtrip still happens; the daemon stays unaware that
25
+ // no human reviewed.
26
+ // - Use cases: real users who want "stop bothering me" ergonomics
27
+ // across an interactive session. Documented in client SPEC §6.3.
28
+ //
29
+ // Listener fires BEFORE Engine.#awaitResolution awaits the waiter, so a
30
+ // synchronous resolveProposal here is delivered to the awaiting dispatch
31
+ // without yielding. The loop/proposal broadcast still goes out (listeners
32
+ // fan out independently) — clients in server-YOLO runs may see a brief
33
+ // proposed-then-resolved blink in their UI. The carried event.flags.yolo
34
+ // lets clients suppress review-UI rendering for those entries.
35
+ export const attachYolo = (engine, _db) => {
36
+ engine.onProposalPending((event) => {
37
+ if (!event.flags.yolo)
38
+ return;
39
+ try {
40
+ engine.resolveProposal(event.logEntryId, { decision: "accept" });
41
+ }
42
+ catch {
43
+ // Errors here don't abort dispatch — the proposal stays
44
+ // pending and falls through to the RPC / timeout path.
45
+ }
46
+ });
47
+ };
48
+ //# sourceMappingURL=yolo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yolo.js","sourceRoot":"","sources":["../../src/server/yolo.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,8DAA8D;AAC9D,EAAE;AACF,0CAA0C;AAC1C,EAAE;AACF,uEAAuE;AACvE,sBAAsB;AACtB,EAAE;AACF,iCAAiC;AACjC,yDAAyD;AACzD,qDAAqD;AACrD,0EAA0E;AAC1E,2EAA2E;AAC3E,oEAAoE;AACpE,yEAAyE;AACzE,wBAAwB;AACxB,2EAA2E;AAC3E,qEAAqE;AACrE,EAAE;AACF,2DAA2D;AAC3D,uEAAuE;AACvE,wEAAwE;AACxE,wEAAwE;AACxE,2BAA2B;AAC3B,sEAAsE;AACtE,uEAAuE;AACvE,EAAE;AACF,wEAAwE;AACxE,yEAAyE;AACzE,0EAA0E;AAC1E,uEAAuE;AACvE,yEAAyE;AACzE,+DAA+D;AAM/D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,GAAO,EAAQ,EAAE;IACxD,MAAM,CAAC,iBAAiB,CAAC,CAAC,KAA2B,EAAE,EAAE;QACrD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI;YAAE,OAAO;QAC9B,IAAI,CAAC;YACD,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACL,wDAAwD;YACxD,uDAAuD;QAC3D,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ -- INIT: sessions
2
+ CREATE TABLE IF NOT EXISTS sessions (
3
+ id INTEGER NOT NULL PRIMARY KEY,
4
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
5
+ name TEXT NOT NULL UNIQUE CHECK (length(name) > 0),
6
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
7
+ cost_pico INTEGER NOT NULL DEFAULT 0 CHECK (cost_pico >= 0),
8
+ scheme_registry_additions TEXT NOT NULL DEFAULT '[]' CHECK (json_valid(scheme_registry_additions))
9
+ ) STRICT;
10
+
11
+ CREATE INDEX IF NOT EXISTS sessions_created_at ON sessions (created_at);
@@ -0,0 +1,16 @@
1
+ -- INIT: runs
2
+ CREATE TABLE IF NOT EXISTS runs (
3
+ id INTEGER NOT NULL PRIMARY KEY,
4
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
5
+ session_id INTEGER NOT NULL,
6
+ name TEXT NOT NULL CHECK (length(name) > 0),
7
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
8
+ parent_run_id INTEGER CHECK (parent_run_id IS NULL OR parent_run_id != id),
9
+ cost_pico INTEGER NOT NULL DEFAULT 0 CHECK (cost_pico >= 0),
10
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,
11
+ FOREIGN KEY (parent_run_id) REFERENCES runs(id) ON DELETE CASCADE
12
+ ) STRICT;
13
+
14
+ CREATE INDEX IF NOT EXISTS runs_session_id_created_at ON runs (session_id, created_at);
15
+ CREATE INDEX IF NOT EXISTS runs_parent_run_id ON runs (parent_run_id);
16
+ CREATE UNIQUE INDEX IF NOT EXISTS runs_session_name ON runs (session_id, name);
@@ -0,0 +1,12 @@
1
+ -- INIT: loops
2
+ CREATE TABLE IF NOT EXISTS loops (
3
+ id INTEGER NOT NULL PRIMARY KEY,
4
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
5
+ run_id INTEGER NOT NULL,
6
+ sequence INTEGER NOT NULL CHECK (sequence >= 1),
7
+ status INTEGER NOT NULL DEFAULT 102 CHECK (status IN (102, 200, 499)),
8
+ prompt TEXT NOT NULL,
9
+ FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE
10
+ ) STRICT;
11
+
12
+ CREATE UNIQUE INDEX IF NOT EXISTS loops_run_id_sequence ON loops (run_id, sequence);
@@ -0,0 +1,18 @@
1
+ -- INIT: turns
2
+ CREATE TABLE IF NOT EXISTS turns (
3
+ id INTEGER NOT NULL PRIMARY KEY,
4
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
5
+ loop_id INTEGER NOT NULL,
6
+ sequence INTEGER NOT NULL CHECK (sequence >= 1),
7
+ timestamp TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
8
+ status INTEGER NOT NULL CHECK (status BETWEEN 100 AND 599),
9
+ usage_prompt INTEGER NOT NULL DEFAULT 0 CHECK (usage_prompt >= 0),
10
+ usage_completion INTEGER NOT NULL DEFAULT 0 CHECK (usage_completion >= 0),
11
+ usage_cached INTEGER NOT NULL DEFAULT 0 CHECK (usage_cached >= 0),
12
+ usage_cost_pico INTEGER NOT NULL DEFAULT 0 CHECK (usage_cost_pico >= 0),
13
+ packet TEXT NOT NULL CHECK (json_valid(packet)),
14
+ FOREIGN KEY (loop_id) REFERENCES loops(id) ON DELETE CASCADE
15
+ ) STRICT;
16
+
17
+ CREATE UNIQUE INDEX IF NOT EXISTS turns_loop_id_sequence ON turns (loop_id, sequence);
18
+ CREATE INDEX IF NOT EXISTS turns_timestamp ON turns (timestamp);
@@ -0,0 +1,44 @@
1
+ -- INIT: entries
2
+ CREATE TABLE IF NOT EXISTS entries (
3
+ id INTEGER NOT NULL PRIMARY KEY,
4
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
5
+ scope TEXT NOT NULL CHECK (scope IN ('agent', 'session')),
6
+ session_id INTEGER,
7
+ scheme TEXT CHECK (scheme IS NULL OR length(scheme) > 0),
8
+ username TEXT,
9
+ password TEXT,
10
+ hostname TEXT,
11
+ port INTEGER CHECK (port IS NULL OR (port BETWEEN 0 AND 65535)),
12
+ pathname TEXT NOT NULL,
13
+ params TEXT CHECK (params IS NULL OR json_valid(params)),
14
+ attributes TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(attributes)),
15
+ CHECK ((scope = 'agent' AND session_id IS NULL)
16
+ OR (scope = 'session' AND session_id IS NOT NULL)),
17
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
18
+ ) STRICT;
19
+
20
+ CREATE UNIQUE INDEX IF NOT EXISTS entries_agent_identity ON entries (scheme, pathname) WHERE scope = 'agent';
21
+ CREATE UNIQUE INDEX IF NOT EXISTS entries_session_identity ON entries (session_id, scheme, pathname) WHERE scope = 'session';
22
+
23
+ -- SPEC §7.8: the ONE engine-imposed constraint — 100 MiB char-length cap per
24
+ -- channel content body. All other limits (rate, burst, per-call budget, etc.)
25
+ -- are extrinsic — providers, schemes, and mimetypes own their own constraints.
26
+ CREATE TABLE IF NOT EXISTS entry_channels (
27
+ entry_id INTEGER NOT NULL,
28
+ name TEXT NOT NULL CHECK (length(name) > 0),
29
+ content TEXT NOT NULL CHECK (length(content) <= 104857600),
30
+ mimetype TEXT NOT NULL CHECK (length(mimetype) > 0),
31
+ tokens INTEGER NOT NULL DEFAULT 0 CHECK (tokens >= 0),
32
+ state TEXT NOT NULL DEFAULT 'static' CHECK (state IN ('static', 'active', 'closed', 'errored')),
33
+ PRIMARY KEY (entry_id, name),
34
+ FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
35
+ ) STRICT, WITHOUT ROWID;
36
+
37
+ CREATE TABLE IF NOT EXISTS entry_tags (
38
+ entry_id INTEGER NOT NULL,
39
+ tag TEXT NOT NULL CHECK (length(tag) > 0),
40
+ PRIMARY KEY (entry_id, tag),
41
+ FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
42
+ ) STRICT, WITHOUT ROWID;
43
+
44
+ CREATE INDEX IF NOT EXISTS entry_tags_tag ON entry_tags (tag);
@@ -0,0 +1,51 @@
1
+ -- INIT: log_entries
2
+ CREATE TABLE IF NOT EXISTS log_entries (
3
+ id INTEGER NOT NULL PRIMARY KEY,
4
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
5
+
6
+ run_id INTEGER NOT NULL,
7
+ loop_id INTEGER NOT NULL,
8
+ turn_id INTEGER NOT NULL,
9
+ action_index INTEGER NOT NULL CHECK (action_index >= 0),
10
+ at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
11
+ origin TEXT NOT NULL CHECK (origin IN ('model', 'client', 'system', 'plugin')),
12
+
13
+ op TEXT NOT NULL CHECK (op IN ('FIND', 'READ', 'EDIT', 'COPY', 'MOVE', 'SHOW', 'HIDE', 'SEND', 'EXEC')),
14
+ suffix TEXT NOT NULL DEFAULT '',
15
+ signal TEXT CHECK (signal IS NULL OR json_valid(signal)),
16
+
17
+ target_scheme TEXT CHECK (target_scheme IS NULL OR length(target_scheme) > 0),
18
+ target_username TEXT,
19
+ target_password TEXT,
20
+ target_hostname TEXT,
21
+ target_port INTEGER CHECK (target_port IS NULL OR (target_port BETWEEN 0 AND 65535)),
22
+ target_pathname TEXT,
23
+ target_params TEXT CHECK (target_params IS NULL OR json_valid(target_params)),
24
+ target_fragment TEXT,
25
+
26
+ lineMarker TEXT CHECK (lineMarker IS NULL OR json_valid(lineMarker)),
27
+
28
+ tx TEXT NOT NULL,
29
+ mimetype_tx TEXT NOT NULL CHECK (length(mimetype_tx) > 0),
30
+
31
+ rx TEXT NOT NULL,
32
+ mimetype_rx TEXT NOT NULL CHECK (length(mimetype_rx) > 0),
33
+ status_rx INTEGER NOT NULL CHECK (status_rx BETWEEN 100 AND 599),
34
+
35
+ tokens INTEGER NOT NULL DEFAULT 0 CHECK (tokens >= 0),
36
+
37
+ FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE,
38
+ FOREIGN KEY (loop_id) REFERENCES loops(id) ON DELETE CASCADE,
39
+ FOREIGN KEY (turn_id) REFERENCES turns(id) ON DELETE CASCADE
40
+ ) STRICT;
41
+
42
+ CREATE UNIQUE INDEX IF NOT EXISTS log_entries_turn_id_action_index ON log_entries (turn_id, action_index);
43
+ CREATE INDEX IF NOT EXISTS log_entries_run_id ON log_entries (run_id);
44
+ CREATE INDEX IF NOT EXISTS log_entries_loop_id ON log_entries (loop_id);
45
+ CREATE INDEX IF NOT EXISTS log_entries_at ON log_entries (at);
46
+
47
+ CREATE TRIGGER IF NOT EXISTS log_entries_immutable
48
+ BEFORE UPDATE ON log_entries
49
+ BEGIN
50
+ SELECT RAISE(ABORT, 'log_entries are append-only; INSERT new rows instead of UPDATE');
51
+ END;
@@ -0,0 +1,10 @@
1
+ -- INIT: visibility
2
+ CREATE TABLE IF NOT EXISTS visibility (
3
+ run_id INTEGER NOT NULL,
4
+ entry_id INTEGER NOT NULL,
5
+ channel TEXT NOT NULL CHECK (length(channel) > 0),
6
+ indexed INTEGER NOT NULL DEFAULT 1 CHECK (indexed IN (0, 1)),
7
+ PRIMARY KEY (run_id, entry_id, channel),
8
+ FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE,
9
+ FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
10
+ ) STRICT, WITHOUT ROWID;
@@ -0,0 +1,25 @@
1
+ -- INIT: schemes_providers
2
+ CREATE TABLE IF NOT EXISTS schemes (
3
+ name TEXT NOT NULL PRIMARY KEY CHECK (length(name) > 0),
4
+ model_visible INTEGER NOT NULL CHECK (model_visible IN (0, 1)),
5
+ category TEXT NOT NULL CHECK (length(category) > 0),
6
+ default_scope TEXT NOT NULL CHECK (default_scope IN ('agent', 'session')),
7
+ default_channel TEXT NOT NULL CHECK (length(default_channel) > 0),
8
+ channel_orientations TEXT CHECK (channel_orientations IS NULL OR json_valid(channel_orientations)),
9
+ writable_by TEXT NOT NULL CHECK (json_valid(writable_by)),
10
+ volatile INTEGER NOT NULL CHECK (volatile IN (0, 1)),
11
+ handler TEXT
12
+ ) STRICT, WITHOUT ROWID;
13
+
14
+ CREATE TABLE IF NOT EXISTS providers (
15
+ id INTEGER NOT NULL PRIMARY KEY,
16
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
17
+ provider TEXT NOT NULL CHECK (length(provider) > 0),
18
+ family TEXT NOT NULL CHECK (length(family) > 0),
19
+ model TEXT NOT NULL CHECK (length(model) > 0),
20
+ contextSize INTEGER NOT NULL CHECK (contextSize >= 1),
21
+ currency TEXT NOT NULL CHECK (length(currency) = 3),
22
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
23
+ ) STRICT;
24
+
25
+ CREATE INDEX IF NOT EXISTS providers_created_at ON providers (created_at);