@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,47 @@
1
+ import type { LineMarker, PlurnkStatement } from "@plurnk/plurnk-grammar";
2
+ export declare const parseSingleStatement: (text: string) => PlurnkStatement;
3
+ export declare const parseAllStatements: (text: string) => PlurnkStatement[];
4
+ interface OpWithMatcher {
5
+ path: string;
6
+ matcher?: string;
7
+ tags?: string[];
8
+ lineRange?: LineMarker;
9
+ }
10
+ interface OpEditParams {
11
+ path: string;
12
+ content?: string;
13
+ tags?: string[];
14
+ lineRange?: LineMarker;
15
+ }
16
+ interface OpCopyMoveParams {
17
+ source: string;
18
+ destination?: string;
19
+ tags?: string[];
20
+ lineRange?: LineMarker;
21
+ }
22
+ interface OpSendParams {
23
+ status: number;
24
+ recipient?: string;
25
+ body?: string;
26
+ }
27
+ interface OpExecParams {
28
+ cwd?: string;
29
+ runtime?: string;
30
+ command?: string;
31
+ }
32
+ export declare const buildEdit: (p: OpEditParams) => PlurnkStatement;
33
+ export declare const buildRead: (p: OpWithMatcher) => PlurnkStatement;
34
+ export declare const buildFind: (p: {
35
+ scope: string;
36
+ matcher?: string;
37
+ tags?: string[];
38
+ lineRange?: LineMarker;
39
+ }) => PlurnkStatement;
40
+ export declare const buildShow: (p: OpWithMatcher) => PlurnkStatement;
41
+ export declare const buildHide: (p: OpWithMatcher) => PlurnkStatement;
42
+ export declare const buildCopy: (p: OpCopyMoveParams) => PlurnkStatement;
43
+ export declare const buildMove: (p: OpCopyMoveParams) => PlurnkStatement;
44
+ export declare const buildSend: (p: OpSendParams) => PlurnkStatement;
45
+ export declare const buildExec: (p: OpExecParams) => PlurnkStatement;
46
+ export {};
47
+ //# sourceMappingURL=dsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl.d.ts","sourceRoot":"","sources":["../../src/server/dsl.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAoC1E,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,KAAG,eAMnD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,eAAe,EAKhE,CAAC;AAIF,UAAU,aAAa;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,UAAU,CAAC;CAC1B;AAED,UAAU,YAAY;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,UAAU,CAAC;CAC1B;AAED,UAAU,gBAAgB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,UAAU,CAAC;CAC1B;AAED,UAAU,YAAY;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,YAAY;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,GAAI,GAAG,YAAY,KAAG,eAMzC,CAAC;AAEJ,eAAO,MAAM,SAAS,GAAI,GAAG,aAAa,KAAG,eAM1C,CAAC;AAEJ,eAAO,MAAM,SAAS,GAAI,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,UAAU,CAAA;CAAE,KAAG,eAMzG,CAAC;AAEJ,eAAO,MAAM,SAAS,GAAI,GAAG,aAAa,KAAG,eAM1C,CAAC;AAEJ,eAAO,MAAM,SAAS,GAAI,GAAG,aAAa,KAAG,eAM1C,CAAC;AAEJ,eAAO,MAAM,SAAS,GAAI,GAAG,gBAAgB,KAAG,eAS/C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,GAAG,gBAAgB,KAAG,eAM7C,CAAC;AAEJ,eAAO,MAAM,SAAS,GAAI,GAAG,YAAY,KAAG,eAMzC,CAAC;AAEJ,eAAO,MAAM,SAAS,GAAI,GAAG,YAAY,KAAG,eAMzC,CAAC"}
@@ -0,0 +1,117 @@
1
+ // DSL helpers — clean-shape params → HEREDOC → PlurnkStatement.
2
+ //
3
+ // Per the "Speak in DSL, not plumbing" Standing Rule: every op.* RPC method
4
+ // constructs a HEREDOC string from clean-shape params and parses it via the
5
+ // canonical grammar. This guarantees the resulting PlurnkStatement is
6
+ // IDENTICAL in shape to what the model would emit, including all
7
+ // scheme-specific path parsing rules (grammar 0.3.0+).
8
+ //
9
+ // The path-parser helper would let us bypass HEREDOC construction; tracked
10
+ // in plurnk-grammar issue #7.
11
+ import { PlurnkParser } from "@plurnk/plurnk-grammar";
12
+ // Random suffix per call. Collision space is 2^32 against the user's body
13
+ // content; vanishingly unlikely for any reasonable input.
14
+ const randomSuffix = () => Math.floor(Math.random() * 0xFFFFFFFF).toString(16).padStart(8, "0");
15
+ const formatTags = (tags) => {
16
+ if (tags === undefined || tags.length === 0)
17
+ return "";
18
+ return `[${tags.join(",")}]`;
19
+ };
20
+ const formatLineMarker = (lm) => {
21
+ if (lm === undefined || lm === null)
22
+ return "";
23
+ if (lm.last === null || lm.last === lm.first)
24
+ return `<${lm.first}>`;
25
+ return `<${lm.first}-${lm.last}>`;
26
+ };
27
+ const formatPath = (path) => {
28
+ if (path === undefined)
29
+ return "";
30
+ return `(${path})`;
31
+ };
32
+ // Build a HEREDOC statement string. `signal` is the raw signal payload —
33
+ // CSV tags `[a,b,c]` for most ops, a single number for SEND (`[200]`),
34
+ // a single runtime tag for EXEC (`[node]`).
35
+ const buildHeredoc = ({ op, suffix, signal, path, lineMarker, body, }) => `<<${op}${suffix}${signal}${path}${lineMarker}:${body}:${op}${suffix}`;
36
+ export const parseSingleStatement = (text) => {
37
+ const result = PlurnkParser.parse(text);
38
+ for (const item of result.items) {
39
+ if (item.kind === "statement")
40
+ return item.statement;
41
+ }
42
+ throw new Error(`expected a parsed statement, got none from: ${text}`);
43
+ };
44
+ export const parseAllStatements = (text) => {
45
+ const result = PlurnkParser.parse(text);
46
+ return result.items
47
+ .filter((i) => i.kind === "statement")
48
+ .map((i) => i.statement);
49
+ };
50
+ export const buildEdit = (p) => parseSingleStatement(buildHeredoc({
51
+ op: "EDIT", suffix: randomSuffix(),
52
+ signal: formatTags(p.tags),
53
+ path: formatPath(p.path),
54
+ lineMarker: formatLineMarker(p.lineRange),
55
+ body: p.content ?? "",
56
+ }));
57
+ export const buildRead = (p) => parseSingleStatement(buildHeredoc({
58
+ op: "READ", suffix: randomSuffix(),
59
+ signal: formatTags(p.tags),
60
+ path: formatPath(p.path),
61
+ lineMarker: formatLineMarker(p.lineRange),
62
+ body: p.matcher ?? "",
63
+ }));
64
+ export const buildFind = (p) => parseSingleStatement(buildHeredoc({
65
+ op: "FIND", suffix: randomSuffix(),
66
+ signal: formatTags(p.tags),
67
+ path: formatPath(p.scope),
68
+ lineMarker: formatLineMarker(p.lineRange),
69
+ body: p.matcher ?? "",
70
+ }));
71
+ export const buildShow = (p) => parseSingleStatement(buildHeredoc({
72
+ op: "SHOW", suffix: randomSuffix(),
73
+ signal: formatTags(p.tags),
74
+ path: formatPath(p.path),
75
+ lineMarker: formatLineMarker(p.lineRange),
76
+ body: p.matcher ?? "",
77
+ }));
78
+ export const buildHide = (p) => parseSingleStatement(buildHeredoc({
79
+ op: "HIDE", suffix: randomSuffix(),
80
+ signal: formatTags(p.tags),
81
+ path: formatPath(p.path),
82
+ lineMarker: formatLineMarker(p.lineRange),
83
+ body: p.matcher ?? "",
84
+ }));
85
+ export const buildCopy = (p) => {
86
+ if (p.destination === undefined)
87
+ throw new Error("op.copy requires destination");
88
+ return parseSingleStatement(buildHeredoc({
89
+ op: "COPY", suffix: randomSuffix(),
90
+ signal: formatTags(p.tags),
91
+ path: formatPath(p.source),
92
+ lineMarker: formatLineMarker(p.lineRange),
93
+ body: p.destination,
94
+ }));
95
+ };
96
+ export const buildMove = (p) => parseSingleStatement(buildHeredoc({
97
+ op: "MOVE", suffix: randomSuffix(),
98
+ signal: formatTags(p.tags),
99
+ path: formatPath(p.source),
100
+ lineMarker: formatLineMarker(p.lineRange),
101
+ body: p.destination ?? "",
102
+ }));
103
+ export const buildSend = (p) => parseSingleStatement(buildHeredoc({
104
+ op: "SEND", suffix: randomSuffix(),
105
+ signal: `[${p.status}]`,
106
+ path: p.recipient !== undefined ? formatPath(p.recipient) : "",
107
+ lineMarker: "",
108
+ body: p.body ?? "",
109
+ }));
110
+ export const buildExec = (p) => parseSingleStatement(buildHeredoc({
111
+ op: "EXEC", suffix: randomSuffix(),
112
+ signal: p.runtime !== undefined ? `[${p.runtime}]` : "",
113
+ path: p.cwd !== undefined ? formatPath(p.cwd) : "",
114
+ lineMarker: "",
115
+ body: p.command ?? "",
116
+ }));
117
+ //# sourceMappingURL=dsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl.js","sourceRoot":"","sources":["../../src/server/dsl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { Db } from "../core/Db.ts";
2
+ export interface SessionRow {
3
+ id: number;
4
+ name: string;
5
+ project_root: string | null;
6
+ persona: string | null;
7
+ created_at: string;
8
+ cost_pico: number;
9
+ }
10
+ export interface RunRow {
11
+ id: number;
12
+ name: string;
13
+ created_at: string;
14
+ cost_pico: number;
15
+ }
16
+ export interface ClientEnvelope {
17
+ sessionId: number;
18
+ sessionName: string;
19
+ projectRoot: string | null;
20
+ sessionPersona: string | null;
21
+ runId: number;
22
+ runName: string;
23
+ runPersona: string | null;
24
+ clientLoopId: number;
25
+ }
26
+ export declare const generateSessionName: () => string;
27
+ export declare const generateRunName: () => string;
28
+ export declare const createClientEnvelope: (db: Db, opts?: {
29
+ name?: string;
30
+ prefix?: string;
31
+ projectRoot?: string | null;
32
+ persona?: string | null;
33
+ }) => Promise<ClientEnvelope>;
34
+ export declare const attachToSession: (db: Db, sessionId: number, opts?: {
35
+ runId?: number;
36
+ runName?: string;
37
+ persona?: string | null;
38
+ }) => Promise<ClientEnvelope>;
39
+ export declare const listRunsForSession: (db: Db, sessionId: number) => Promise<RunRow[]>;
40
+ export declare const closeClientLoop: (db: Db, loopId: number, status: 200 | 499) => Promise<void>;
41
+ export declare const listSessions: (db: Db) => Promise<SessionRow[]>;
42
+ export declare const updateSessionProjectRoot: (db: Db, sessionId: number, projectRoot: string | null) => Promise<string | null>;
43
+ export declare const updateSessionPersona: (db: Db, sessionId: number, persona: string | null) => Promise<string | null>;
44
+ //# sourceMappingURL=envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/server/envelope.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,eAAe,CAAC;AAEpD,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACxB;AAWD,eAAO,MAAM,mBAAmB,QAAO,MAA2B,CAAC;AACnE,eAAO,MAAM,eAAe,QAAO,MAAuB,CAAC;AAE3D,eAAO,MAAM,oBAAoB,GAAU,IAAI,EAAE,EAAE,OAAM;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,KAAG,OAAO,CAAC,cAAc,CAiB9K,CAAC;AAgCF,eAAO,MAAM,eAAe,GAAU,IAAI,EAAE,EAAE,WAAW,MAAM,EAAE,OAAM;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,KAAG,OAAO,CAAC,cAAc,CAYjK,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAU,IAAI,EAAE,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,MAAM,EAAE,CAEpF,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,IAAI,EAAE,EAAE,QAAQ,MAAM,EAAE,QAAQ,GAAG,GAAG,GAAG,KAAG,OAAO,CAAC,IAAI,CAE7F,CAAC;AAEF,eAAO,MAAM,YAAY,GAAU,IAAI,EAAE,KAAG,OAAO,CAAC,UAAU,EAAE,CAE/D,CAAC;AAIF,eAAO,MAAM,wBAAwB,GAAU,IAAI,EAAE,EAAE,WAAW,MAAM,EAAE,aAAa,MAAM,GAAG,IAAI,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAI3H,CAAC;AAIF,eAAO,MAAM,oBAAoB,GAAU,IAAI,EAAE,EAAE,WAAW,MAAM,EAAE,SAAS,MAAM,GAAG,IAAI,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAInH,CAAC"}
@@ -0,0 +1,113 @@
1
+ // Envelope lifecycle helpers for client connections. SPEC §13.7.
2
+ //
3
+ // Every connected client gets a (session, run, client-loop) envelope. Either
4
+ // the client picks the session explicitly (session.create / session.attach)
5
+ // or the daemon auto-creates one on first requiresInit RPC. In both cases
6
+ // the daemon opens a NEW run within the session and a NEW client loop within
7
+ // that run; the client loop closes on disconnect.
8
+ // Grammar 0.5.0 (#10): Session and Run carry user-renameable string names.
9
+ // Defaults are `session-{unixtime}` and `run-{unixtime}`; random suffix avoids
10
+ // collisions when two creations land in the same second.
11
+ const tsName = (prefix) => {
12
+ const ts = Math.floor(Date.now() / 1000);
13
+ const rand = Math.floor(Math.random() * 0xFFFFFF).toString(36).padStart(4, "0");
14
+ return `${prefix}-${ts}-${rand}`;
15
+ };
16
+ export const generateSessionName = () => tsName("session");
17
+ export const generateRunName = () => tsName("run");
18
+ export const createClientEnvelope = async (db, opts = {}) => {
19
+ const name = opts.name ?? tsName(opts.prefix ?? "session");
20
+ const projectRoot = opts.projectRoot ?? null;
21
+ const persona = opts.persona ?? null;
22
+ const session = await db.envelope_insert_session.get({ name, project_root: projectRoot, persona });
23
+ if (session === undefined)
24
+ throw new Error("createClientEnvelope: session insert returned no row");
25
+ const runName = generateRunName();
26
+ const run = await db.envelope_insert_run.get({ session_id: session.id, name: runName, persona: null });
27
+ if (run === undefined)
28
+ throw new Error("createClientEnvelope: run insert returned no row");
29
+ const loop = await db.envelope_insert_client_loop.get({ run_id: run.id });
30
+ if (loop === undefined)
31
+ throw new Error("createClientEnvelope: loop insert returned no row");
32
+ return {
33
+ sessionId: session.id, sessionName: session.name,
34
+ projectRoot: session.project_root, sessionPersona: session.persona,
35
+ runId: run.id, runName: run.name, runPersona: run.persona,
36
+ clientLoopId: loop.id,
37
+ };
38
+ };
39
+ // Resolve the run inside a session. Three modes:
40
+ // - opts.runId given: lookup by id, verify session ownership (else throw).
41
+ // - opts.runName given: lookup by (sessionId, name); reuse if found, create otherwise.
42
+ // - neither: create a new run with an auto-generated name (current behavior).
43
+ // `runId` and `runName` are alternatives — passing both throws (use one).
44
+ // persona handling: only set when creating a NEW run. Reusing an existing
45
+ // run (by runId or by runName matching an existing row) carries forward
46
+ // whatever persona was stored on that row — overrides target NEW runs.
47
+ const resolveRun = async (db, sessionId, opts) => {
48
+ if (opts.runId !== undefined && opts.runName !== undefined) {
49
+ throw new Error("attachToSession: pass runId OR runName, not both");
50
+ }
51
+ if (opts.runId !== undefined) {
52
+ const existing = await db.envelope_get_run_by_id.get({ id: opts.runId });
53
+ if (existing === undefined)
54
+ throw new Error(`run ${opts.runId} not found`);
55
+ if (existing.session_id !== sessionId)
56
+ throw new Error(`run ${opts.runId} belongs to session ${existing.session_id}, not ${sessionId}`);
57
+ return { id: existing.id, name: existing.name, persona: existing.persona };
58
+ }
59
+ if (opts.runName !== undefined) {
60
+ const existing = await db.envelope_get_run_by_name.get({ session_id: sessionId, name: opts.runName });
61
+ if (existing !== undefined)
62
+ return existing;
63
+ const created = await db.envelope_insert_run.get({ session_id: sessionId, name: opts.runName, persona: opts.persona ?? null });
64
+ if (created === undefined)
65
+ throw new Error("resolveRun: run insert returned no row");
66
+ return created;
67
+ }
68
+ const created = await db.envelope_insert_run.get({ session_id: sessionId, name: generateRunName(), persona: opts.persona ?? null });
69
+ if (created === undefined)
70
+ throw new Error("resolveRun: run insert returned no row");
71
+ return created;
72
+ };
73
+ export const attachToSession = async (db, sessionId, opts = {}) => {
74
+ const session = await db.envelope_get_session.get({ id: sessionId });
75
+ if (session === undefined)
76
+ throw new Error(`session ${sessionId} not found`);
77
+ const run = await resolveRun(db, session.id, opts);
78
+ const loop = await db.envelope_insert_client_loop.get({ run_id: run.id });
79
+ if (loop === undefined)
80
+ throw new Error("attachToSession: loop insert returned no row");
81
+ return {
82
+ sessionId: session.id, sessionName: session.name,
83
+ projectRoot: session.project_root, sessionPersona: session.persona,
84
+ runId: run.id, runName: run.name, runPersona: run.persona,
85
+ clientLoopId: loop.id,
86
+ };
87
+ };
88
+ export const listRunsForSession = async (db, sessionId) => {
89
+ return await db.envelope_list_runs_for_session.all({ session_id: sessionId });
90
+ };
91
+ export const closeClientLoop = async (db, loopId, status) => {
92
+ await db.envelope_close_client_loop.run({ status, loop_id: loopId });
93
+ };
94
+ export const listSessions = async (db) => {
95
+ return await db.envelope_list_sessions.all();
96
+ };
97
+ // Updates sessions.project_root for an existing session and returns the new
98
+ // value. Throws if the session does not exist. Used by session.set_root (F.1).
99
+ export const updateSessionProjectRoot = async (db, sessionId, projectRoot) => {
100
+ const row = await db.envelope_update_session_project_root.get({ id: sessionId, project_root: projectRoot });
101
+ if (row === undefined)
102
+ throw new Error(`session ${sessionId} not found`);
103
+ return row.project_root;
104
+ };
105
+ // Updates sessions.persona. Mirrors updateSessionProjectRoot. Used by
106
+ // session.set_persona (issue #150).
107
+ export const updateSessionPersona = async (db, sessionId, persona) => {
108
+ const row = await db.envelope_update_session_persona.get({ id: sessionId, persona });
109
+ if (row === undefined)
110
+ throw new Error(`session ${sessionId} not found`);
111
+ return row.persona;
112
+ };
113
+ //# sourceMappingURL=envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/server/envelope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Db } from "../core/Db.ts";
2
+ export interface LogEntryWire {
3
+ id: number;
4
+ run_id: number;
5
+ loop_id: number;
6
+ turn_id: number;
7
+ action_index: number;
8
+ at: string;
9
+ origin: string;
10
+ op: string;
11
+ suffix: string;
12
+ signal: unknown;
13
+ target_scheme: string | null;
14
+ target_username: string | null;
15
+ target_password: string | null;
16
+ target_hostname: string | null;
17
+ target_port: number | null;
18
+ target_pathname: string | null;
19
+ target_params: unknown;
20
+ target_fragment: string | null;
21
+ lineMarker: unknown;
22
+ tx: unknown;
23
+ mimetype_tx: string;
24
+ rx: unknown;
25
+ mimetype_rx: string;
26
+ status_rx: number;
27
+ tokens: number;
28
+ }
29
+ export declare const fetchLogEntry: (db: Db, id: number) => Promise<LogEntryWire>;
30
+ //# sourceMappingURL=logEntry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logEntry.d.ts","sourceRoot":"","sources":["../../src/server/logEntry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,eAAe,CAAC;AAEpD,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAClB;AAQD,eAAO,MAAM,aAAa,GAAU,IAAI,EAAE,EAAE,IAAI,MAAM,KAAG,OAAO,CAAC,YAAY,CA8B5E,CAAC"}
@@ -0,0 +1,43 @@
1
+ // Hydrate a log_entries row for the wire. Re-parses JSON-encoded columns
2
+ // (signal, target_params, lineMarker, tx, rx) so the client receives
3
+ // structured values, not opaque strings.
4
+ const parseJsonOrNull = (v) => {
5
+ if (v === null || v === undefined)
6
+ return null;
7
+ if (typeof v !== "string")
8
+ return v;
9
+ return JSON.parse(v);
10
+ };
11
+ export const fetchLogEntry = async (db, id) => {
12
+ const row = await db.log_entry_by_id.get({ id });
13
+ if (row === undefined)
14
+ throw new Error(`log_entries row ${id} not found`);
15
+ return {
16
+ id: row.id,
17
+ run_id: row.run_id,
18
+ loop_id: row.loop_id,
19
+ turn_id: row.turn_id,
20
+ action_index: row.action_index,
21
+ at: row.at,
22
+ origin: row.origin,
23
+ op: row.op,
24
+ suffix: row.suffix,
25
+ signal: parseJsonOrNull(row.signal),
26
+ target_scheme: row.target_scheme,
27
+ target_username: row.target_username,
28
+ target_password: row.target_password,
29
+ target_hostname: row.target_hostname,
30
+ target_port: row.target_port,
31
+ target_pathname: row.target_pathname,
32
+ target_params: parseJsonOrNull(row.target_params),
33
+ target_fragment: row.target_fragment,
34
+ lineMarker: parseJsonOrNull(row.lineMarker),
35
+ tx: parseJsonOrNull(row.tx),
36
+ mimetype_tx: row.mimetype_tx,
37
+ rx: parseJsonOrNull(row.rx),
38
+ mimetype_rx: row.mimetype_rx,
39
+ status_rx: row.status_rx,
40
+ tokens: row.tokens,
41
+ };
42
+ };
43
+ //# sourceMappingURL=logEntry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logEntry.js","sourceRoot":"","sources":["../../src/server/logEntry.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,qEAAqE;AACrE,yCAAyC;AAgCzC,MAAM,eAAe,GAAG,CAAC,CAAU,EAAW,EAAE;IAC5C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,EAAM,EAAE,EAAU,EAAyB,EAAE;IAC7E,MAAM,GAAG,GAAG,MAAO,EAAE,CAAC,eAA8B,CAAC,GAAG,CAA0B,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1F,IAAI,GAAG,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;IAC1E,OAAO;QACH,EAAE,EAAE,GAAG,CAAC,EAAY;QACpB,MAAM,EAAE,GAAG,CAAC,MAAgB;QAC5B,OAAO,EAAE,GAAG,CAAC,OAAiB;QAC9B,OAAO,EAAE,GAAG,CAAC,OAAiB;QAC9B,YAAY,EAAE,GAAG,CAAC,YAAsB;QACxC,EAAE,EAAE,GAAG,CAAC,EAAY;QACpB,MAAM,EAAE,GAAG,CAAC,MAAgB;QAC5B,EAAE,EAAE,GAAG,CAAC,EAAY;QACpB,MAAM,EAAE,GAAG,CAAC,MAAgB;QAC5B,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;QACnC,aAAa,EAAE,GAAG,CAAC,aAA8B;QACjD,eAAe,EAAE,GAAG,CAAC,eAAgC;QACrD,eAAe,EAAE,GAAG,CAAC,eAAgC;QACrD,eAAe,EAAE,GAAG,CAAC,eAAgC;QACrD,WAAW,EAAE,GAAG,CAAC,WAA4B;QAC7C,eAAe,EAAE,GAAG,CAAC,eAAgC;QACrD,aAAa,EAAE,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC;QACjD,eAAe,EAAE,GAAG,CAAC,eAAgC;QACrD,UAAU,EAAE,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC;QAC3C,EAAE,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,WAAW,EAAE,GAAG,CAAC,WAAqB;QACtC,EAAE,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,WAAW,EAAE,GAAG,CAAC,WAAqB;QACtC,SAAS,EAAE,GAAG,CAAC,SAAmB;QAClC,MAAM,EAAE,GAAG,CAAC,MAAgB;KAC/B,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { PlurnkStatement } from "@plurnk/plurnk-grammar";
2
+ import type { HandlerContext } from "../MethodRegistry.ts";
3
+ export interface DispatchAsClientResult {
4
+ status: number;
5
+ [key: string]: unknown;
6
+ }
7
+ export declare const dispatchAsClient: (ctx: HandlerContext, statement: PlurnkStatement) => Promise<DispatchAsClientResult>;
8
+ //# sourceMappingURL=_dispatchAsClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_dispatchAsClient.d.ts","sourceRoot":"","sources":["../../../src/server/methods/_dispatchAsClient.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D,MAAM,WAAW,sBAAsB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,gBAAgB,GAAU,KAAK,cAAc,EAAE,WAAW,eAAe,KAAG,OAAO,CAAC,sBAAsB,CAsBtH,CAAC"}
@@ -0,0 +1,31 @@
1
+ // Shared dispatch helper used by every op.* RPC method. Wraps a parsed
2
+ // PlurnkStatement in a client-origin turn inside the connection's client
3
+ // loop, dispatches via Engine.dispatch, fires the log/entry notification
4
+ // to all clients attached to the same session, and returns the dispatch
5
+ // result for the RPC response.
6
+ import { insertClientTurn } from "../clientTurn.js";
7
+ import { fetchLogEntry } from "../logEntry.js";
8
+ export const dispatchAsClient = async (ctx, statement) => {
9
+ if (ctx.session === null) {
10
+ throw new Error("dispatchAsClient requires an attached session");
11
+ }
12
+ const { sessionId, runId, clientLoopId } = ctx.session;
13
+ const turnId = await insertClientTurn(ctx.db, clientLoopId);
14
+ const result = await ctx.engine.dispatch({
15
+ statement,
16
+ sessionId,
17
+ runId,
18
+ loopId: clientLoopId,
19
+ turnId,
20
+ actionIndex: 0,
21
+ origin: "client",
22
+ onDispatch: (logEntryId) => {
23
+ void (async () => {
24
+ const entry = await fetchLogEntry(ctx.db, logEntryId);
25
+ ctx.notify({ sessionId }, "log/entry", { entry });
26
+ })();
27
+ },
28
+ });
29
+ return result;
30
+ };
31
+ //# sourceMappingURL=_dispatchAsClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_dispatchAsClient.js","sourceRoot":"","sources":["../../../src/server/methods/_dispatchAsClient.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yEAAyE;AACzE,yEAAyE;AACzE,wEAAwE;AACxE,+BAA+B;AAI/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAO/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,GAAmB,EAAE,SAA0B,EAAmC,EAAE;IACvH,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;QACrC,SAAS;QACT,SAAS;QACT,KAAK;QACL,MAAM,EAAE,YAAY;QACpB,MAAM;QACN,WAAW,EAAE,CAAC;QACd,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,CAAC,UAAU,EAAE,EAAE;YACvB,KAAK,CAAC,KAAK,IAAI,EAAE;gBACb,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;gBACtD,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACtD,CAAC,CAAC,EAAE,CAAC;QACT,CAAC;KACJ,CAAC,CAAC;IACH,OAAO,MAAgC,CAAC;AAC5C,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type MethodRegistry from "../MethodRegistry.ts";
2
+ export declare const register: (registry: MethodRegistry) => void;
3
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/server/methods/discover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAEvD,eAAO,MAAM,QAAQ,GAAI,UAAU,cAAc,KAAG,IAKnD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const register = (registry) => {
2
+ registry.registerMethod("discover", {
3
+ handler: async (_params, ctx) => ctx.registry.catalog(),
4
+ description: "Returns the protocol version plus the method and notification catalog.",
5
+ });
6
+ };
7
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/server/methods/discover.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE;QAChC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE;QACvD,WAAW,EAAE,wEAAwE;KACxF,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=entry_read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry_read.d.ts","sourceRoot":"","sources":["../../../src/server/methods/entry_read.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAiDvD,eAAO,MAAM,QAAQ,GAAI,UAAU,cAAc,KAAG,IAsBnD,CAAC"}
@@ -0,0 +1,56 @@
1
+ // entry.read — return the full entry shape (all channels + tags + metadata)
2
+ // for a given path. SPEC §13.5.
3
+ const parsePath = (s) => {
4
+ const m = s.match(/^([a-z][a-z0-9+.-]*):\/\/(.*)$/);
5
+ if (m === null)
6
+ return null;
7
+ return { scheme: m[1], pathname: m[2].split("#")[0] };
8
+ };
9
+ const fetchEntry = async (db, sessionId, scheme, pathname) => {
10
+ const row = await db.entry_read_lookup.get({
11
+ session_id: sessionId, scheme, pathname,
12
+ });
13
+ if (row === undefined)
14
+ return null;
15
+ const channelRows = await db.entry_read_channels.all({ entry_id: row.id });
16
+ const channels = {};
17
+ for (const c of channelRows) {
18
+ channels[c.name] = { content: c.content, mimetype: c.mimetype, tokens: c.tokens, state: c.state };
19
+ }
20
+ const tagRows = await db.crud_read_tags.all({ entry_id: row.id });
21
+ return {
22
+ id: row.id,
23
+ scope: row.scope,
24
+ sessionId: row.session_id,
25
+ scheme: row.scheme,
26
+ pathname: row.pathname,
27
+ channels,
28
+ tags: tagRows.map((t) => t.tag),
29
+ };
30
+ };
31
+ export const register = (registry) => {
32
+ registry.registerMethod("entry.read", {
33
+ handler: async (params, ctx) => {
34
+ const p = (params ?? {});
35
+ if (typeof p.path !== "string" || p.path.length === 0)
36
+ throw new Error("entry.read requires params.path: string");
37
+ const parsed = parsePath(p.path);
38
+ if (parsed === null)
39
+ throw new Error(`entry.read: path must be URL-shaped (scheme://pathname); got: ${p.path}`);
40
+ const sessionId = p.sessionId ?? ctx.session?.sessionId;
41
+ if (sessionId === undefined)
42
+ throw new Error("entry.read requires a sessionId (either via params or session attach)");
43
+ const entry = await fetchEntry(ctx.db, sessionId, parsed.scheme, parsed.pathname);
44
+ if (entry === null)
45
+ return { status: 404, entry: null };
46
+ return { status: 200, entry };
47
+ },
48
+ description: "Read the full entry shape (channels + tags + metadata) at the given path.",
49
+ params: {
50
+ path: "string — entry path (URL-shaped: scheme://pathname)",
51
+ sessionId: "number? — defaults to the connection's attached session",
52
+ },
53
+ requiresInit: true,
54
+ });
55
+ };
56
+ //# sourceMappingURL=entry_read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry_read.js","sourceRoot":"","sources":["../../../src/server/methods/entry_read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type MethodRegistry from "../MethodRegistry.ts";
2
+ export declare const register: (registry: MethodRegistry) => void;
3
+ //# sourceMappingURL=log_read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log_read.d.ts","sourceRoot":"","sources":["../../../src/server/methods/log_read.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AA6BvD,eAAO,MAAM,QAAQ,GAAI,UAAU,cAAc,KAAG,IAiBnD,CAAC"}
@@ -0,0 +1,39 @@
1
+ // log.read — return recent log entries filterable by loop / turn / since-id,
2
+ // scoped to the connection's attached session. SPEC §13.5.
3
+ import { fetchLogEntry } from "../logEntry.js";
4
+ const DEFAULT_LIMIT = 100;
5
+ const MAX_LIMIT = 1000;
6
+ const fetchLogEntries = async (db, runId, filters) => {
7
+ const limit = Math.min(typeof filters.limit === "number" ? filters.limit : DEFAULT_LIMIT, MAX_LIMIT);
8
+ const rows = await db.log_read_recent_ids.all({
9
+ run_id: runId,
10
+ loop_id: typeof filters.loopId === "number" ? filters.loopId : null,
11
+ turn_id: typeof filters.turnId === "number" ? filters.turnId : null,
12
+ since_id: typeof filters.sinceId === "number" ? filters.sinceId : null,
13
+ limit,
14
+ });
15
+ const entries = [];
16
+ for (const r of rows)
17
+ entries.push(await fetchLogEntry(db, r.id));
18
+ return entries;
19
+ };
20
+ export const register = (registry) => {
21
+ registry.registerMethod("log.read", {
22
+ handler: async (params, ctx) => {
23
+ if (ctx.session === null)
24
+ throw new Error("log.read requires an attached session");
25
+ const p = (params ?? {});
26
+ const entries = await fetchLogEntries(ctx.db, ctx.session.runId, p);
27
+ return { status: 200, entries };
28
+ },
29
+ description: "Read recent log entries from the attached session, optionally filtered.",
30
+ params: {
31
+ loopId: "number? — filter to one loop",
32
+ turnId: "number? — filter to one turn (within whatever loop)",
33
+ sinceId: "number? — return entries with id > sinceId (for incremental fetch)",
34
+ limit: "number? — max entries to return (default 100, max 1000)",
35
+ },
36
+ requiresInit: true,
37
+ });
38
+ };
39
+ //# sourceMappingURL=log_read.js.map