@plurnk/plurnk-service 0.2.0 → 0.4.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 (133) hide show
  1. package/SPEC.md +98 -112
  2. package/dist/core/ChannelWrite.d.ts +10 -0
  3. package/dist/core/ChannelWrite.d.ts.map +1 -1
  4. package/dist/core/ChannelWrite.js.map +1 -1
  5. package/dist/core/Engine.d.ts +10 -2
  6. package/dist/core/Engine.d.ts.map +1 -1
  7. package/dist/core/Engine.js +410 -113
  8. package/dist/core/Engine.js.map +1 -1
  9. package/dist/core/ProviderRegistry.d.ts +1 -1
  10. package/dist/core/ProviderRegistry.d.ts.map +1 -1
  11. package/dist/core/ProviderRegistry.js.map +1 -1
  12. package/dist/core/line-marker.d.ts +23 -0
  13. package/dist/core/line-marker.d.ts.map +1 -0
  14. package/dist/core/line-marker.js +321 -0
  15. package/dist/core/line-marker.js.map +1 -0
  16. package/dist/core/matcher.d.ts +14 -0
  17. package/dist/core/matcher.d.ts.map +1 -0
  18. package/dist/core/matcher.js +195 -0
  19. package/dist/core/matcher.js.map +1 -0
  20. package/dist/core/mimetype-binary.d.ts +6 -0
  21. package/dist/core/mimetype-binary.d.ts.map +1 -0
  22. package/dist/core/mimetype-binary.js +82 -0
  23. package/dist/core/mimetype-binary.js.map +1 -0
  24. package/dist/core/packet-wire.d.ts.map +1 -1
  25. package/dist/core/packet-wire.js +174 -33
  26. package/dist/core/packet-wire.js.map +1 -1
  27. package/dist/core/path-mimetype.d.ts +3 -0
  28. package/dist/core/path-mimetype.d.ts.map +1 -0
  29. package/dist/core/path-mimetype.js +47 -0
  30. package/dist/core/path-mimetype.js.map +1 -0
  31. package/dist/core/scheme-types.d.ts +5 -0
  32. package/dist/core/scheme-types.d.ts.map +1 -1
  33. package/dist/core/scheme-types.js.map +1 -1
  34. package/dist/providers/Mock.d.ts +2 -2
  35. package/dist/providers/Mock.d.ts.map +1 -1
  36. package/dist/providers/Mock.js.map +1 -1
  37. package/dist/schemes/Exec.d.ts +30 -1
  38. package/dist/schemes/Exec.d.ts.map +1 -1
  39. package/dist/schemes/Exec.js +229 -6
  40. package/dist/schemes/Exec.js.map +1 -1
  41. package/dist/schemes/File.d.ts +8 -4
  42. package/dist/schemes/File.d.ts.map +1 -1
  43. package/dist/schemes/File.js +184 -68
  44. package/dist/schemes/File.js.map +1 -1
  45. package/dist/schemes/Known.js +1 -1
  46. package/dist/schemes/Known.js.map +1 -1
  47. package/dist/schemes/Log.d.ts +9 -1
  48. package/dist/schemes/Log.d.ts.map +1 -1
  49. package/dist/schemes/Log.js +120 -19
  50. package/dist/schemes/Log.js.map +1 -1
  51. package/dist/schemes/Plurnk.d.ts +15 -1
  52. package/dist/schemes/Plurnk.d.ts.map +1 -1
  53. package/dist/schemes/Plurnk.js +50 -8
  54. package/dist/schemes/Plurnk.js.map +1 -1
  55. package/dist/schemes/Skill.js +1 -1
  56. package/dist/schemes/Skill.js.map +1 -1
  57. package/dist/schemes/Unknown.js +1 -1
  58. package/dist/schemes/Unknown.js.map +1 -1
  59. package/dist/schemes/_entry-crud.d.ts +5 -3
  60. package/dist/schemes/_entry-crud.d.ts.map +1 -1
  61. package/dist/schemes/_entry-crud.js +1 -0
  62. package/dist/schemes/_entry-crud.js.map +1 -1
  63. package/dist/schemes/_entry-find.d.ts.map +1 -1
  64. package/dist/schemes/_entry-find.js +64 -15
  65. package/dist/schemes/_entry-find.js.map +1 -1
  66. package/dist/schemes/_entry-ops.d.ts +3 -0
  67. package/dist/schemes/_entry-ops.d.ts.map +1 -1
  68. package/dist/schemes/_entry-ops.js +269 -72
  69. package/dist/schemes/_entry-ops.js.map +1 -1
  70. package/dist/schemes/_entry-send.d.ts.map +1 -1
  71. package/dist/schemes/_entry-send.js +14 -7
  72. package/dist/schemes/_entry-send.js.map +1 -1
  73. package/dist/server/ClientConnection.d.ts +3 -2
  74. package/dist/server/ClientConnection.d.ts.map +1 -1
  75. package/dist/server/ClientConnection.js +10 -2
  76. package/dist/server/ClientConnection.js.map +1 -1
  77. package/dist/server/Daemon.d.ts +40 -1
  78. package/dist/server/Daemon.d.ts.map +1 -1
  79. package/dist/server/Daemon.js +319 -1
  80. package/dist/server/Daemon.js.map +1 -1
  81. package/dist/server/MethodRegistry.d.ts +29 -0
  82. package/dist/server/MethodRegistry.d.ts.map +1 -1
  83. package/dist/server/MethodRegistry.js.map +1 -1
  84. package/dist/server/dsl.d.ts +2 -2
  85. package/dist/server/dsl.d.ts.map +1 -1
  86. package/dist/server/dsl.js +10 -10
  87. package/dist/server/dsl.js.map +1 -1
  88. package/dist/server/envelope.d.ts +2 -1
  89. package/dist/server/envelope.d.ts.map +1 -1
  90. package/dist/server/envelope.js +11 -8
  91. package/dist/server/envelope.js.map +1 -1
  92. package/dist/server/logEntry.d.ts +9 -9
  93. package/dist/server/logEntry.d.ts.map +1 -1
  94. package/dist/server/logEntry.js +10 -10
  95. package/dist/server/logEntry.js.map +1 -1
  96. package/dist/server/methods/_dispatchAsClient.d.ts.map +1 -1
  97. package/dist/server/methods/_dispatchAsClient.js +7 -2
  98. package/dist/server/methods/_dispatchAsClient.js.map +1 -1
  99. package/dist/server/methods/entry_read.js +5 -5
  100. package/dist/server/methods/entry_read.js.map +1 -1
  101. package/dist/server/methods/loop_cancel.d.ts +3 -0
  102. package/dist/server/methods/loop_cancel.d.ts.map +1 -0
  103. package/dist/server/methods/loop_cancel.js +27 -0
  104. package/dist/server/methods/loop_cancel.js.map +1 -0
  105. package/dist/server/methods/loop_run.d.ts.map +1 -1
  106. package/dist/server/methods/loop_run.js +53 -49
  107. package/dist/server/methods/loop_run.js.map +1 -1
  108. package/dist/server/methods/op_edit.js +3 -3
  109. package/dist/server/methods/op_edit.js.map +1 -1
  110. package/dist/server/methods/op_hide.js +3 -3
  111. package/dist/server/methods/op_hide.js.map +1 -1
  112. package/dist/server/methods/op_read.js +3 -3
  113. package/dist/server/methods/op_read.js.map +1 -1
  114. package/dist/server/methods/op_show.js +3 -3
  115. package/dist/server/methods/op_show.js.map +1 -1
  116. package/migrations/001_schema.sql +324 -0
  117. package/package.json +19 -12
  118. package/migrations/001_sessions.sql +0 -11
  119. package/migrations/002_runs.sql +0 -16
  120. package/migrations/003_loops.sql +0 -12
  121. package/migrations/004_turns.sql +0 -18
  122. package/migrations/005_entries.sql +0 -44
  123. package/migrations/006_log_entries.sql +0 -51
  124. package/migrations/007_visibility.sql +0 -10
  125. package/migrations/008_schemes_providers.sql +0 -25
  126. package/migrations/009_cost_rollups.sql +0 -44
  127. package/migrations/010_subscriptions.sql +0 -36
  128. package/migrations/011_turn_call_metadata.sql +0 -7
  129. package/migrations/012_proposal_lifecycle.sql +0 -22
  130. package/migrations/013_log_entries_lifecycle_columns.sql +0 -22
  131. package/migrations/014_loop_flags.sql +0 -9
  132. package/migrations/015_sessions_project_root.sql +0 -6
  133. package/migrations/016_persona_columns.sql +0 -11
@@ -1 +1 @@
1
- {"version":3,"file":"op_edit.js","sourceRoot":"","sources":["../../../src/server/methods/op_edit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAS1D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE;QAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAW,CAAC;YACnC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC/G,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC/B,OAAO,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,WAAW,EAAE,yCAAyC;QACtD,MAAM,EAAE;YACJ,IAAI,EAAE,mDAAmD;YACzD,OAAO,EAAE,6CAA6C;YACtD,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,gDAAgD;SAC9D;QACD,YAAY,EAAE,IAAI;KACrB,CAAC,CAAC;AACP,CAAC,CAAC"}
1
+ {"version":3,"file":"op_edit.js","sourceRoot":"","sources":["../../../src/server/methods/op_edit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAS1D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE;QAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAW,CAAC;YACnC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACrH,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC/B,OAAO,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,WAAW,EAAE,yCAAyC;QACtD,MAAM,EAAE;YACJ,MAAM,EAAE,mDAAmD;YAC3D,OAAO,EAAE,6CAA6C;YACtD,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,gDAAgD;SAC9D;QACD,YAAY,EAAE,IAAI;KACrB,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -4,14 +4,14 @@ export const register = (registry) => {
4
4
  registry.registerMethod("op.hide", {
5
5
  handler: async (params, ctx) => {
6
6
  const p = (params ?? {});
7
- if (typeof p.path !== "string" || p.path.length === 0)
8
- throw new Error("op.hide requires params.path: string");
7
+ if (typeof p.target !== "string" || p.target.length === 0)
8
+ throw new Error("op.hide requires params.target: string");
9
9
  const statement = buildHide(p);
10
10
  return dispatchAsClient(ctx, statement);
11
11
  },
12
12
  description: "HIDE — demote an entry from the active index to the archive.",
13
13
  params: {
14
- path: "string — entry path",
14
+ target: "string — entry path",
15
15
  matcher: "string? — body matcher (glob/regex/xpath/jsonpath)",
16
16
  tags: "string[]? — tag filter",
17
17
  lineRange: "LineMarker? — result range",
@@ -1 +1 @@
1
- {"version":3,"file":"op_hide.js","sourceRoot":"","sources":["../../../src/server/methods/op_hide.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAS1D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE;QAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAW,CAAC;YACnC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC/G,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC/B,OAAO,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,WAAW,EAAE,8DAA8D;QAC3E,MAAM,EAAE;YACJ,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,oDAAoD;YAC7D,IAAI,EAAE,wBAAwB;YAC9B,SAAS,EAAE,4BAA4B;SAC1C;QACD,YAAY,EAAE,IAAI;KACrB,CAAC,CAAC;AACP,CAAC,CAAC"}
1
+ {"version":3,"file":"op_hide.js","sourceRoot":"","sources":["../../../src/server/methods/op_hide.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAS1D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE;QAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAW,CAAC;YACnC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACrH,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC/B,OAAO,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,WAAW,EAAE,8DAA8D;QAC3E,MAAM,EAAE;YACJ,MAAM,EAAE,qBAAqB;YAC7B,OAAO,EAAE,oDAAoD;YAC7D,IAAI,EAAE,wBAAwB;YAC9B,SAAS,EAAE,4BAA4B;SAC1C;QACD,YAAY,EAAE,IAAI;KACrB,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -4,14 +4,14 @@ export const register = (registry) => {
4
4
  registry.registerMethod("op.read", {
5
5
  handler: async (params, ctx) => {
6
6
  const p = (params ?? {});
7
- if (typeof p.path !== "string" || p.path.length === 0)
8
- throw new Error("op.read requires params.path: string");
7
+ if (typeof p.target !== "string" || p.target.length === 0)
8
+ throw new Error("op.read requires params.target: string");
9
9
  const statement = buildRead(p);
10
10
  return dispatchAsClient(ctx, statement);
11
11
  },
12
12
  description: "READ — fetch an entry's body or a slice of it.",
13
13
  params: {
14
- path: "string — entry path",
14
+ target: "string — entry path",
15
15
  matcher: "string? — body matcher (glob/regex/xpath/jsonpath; dialect determined by leading chars)",
16
16
  lineRange: "LineMarker? — line range slice",
17
17
  tags: "string[]? — tag filter",
@@ -1 +1 @@
1
- {"version":3,"file":"op_read.js","sourceRoot":"","sources":["../../../src/server/methods/op_read.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAS1D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE;QAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAW,CAAC;YACnC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC/G,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC/B,OAAO,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,WAAW,EAAE,gDAAgD;QAC7D,MAAM,EAAE;YACJ,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,yFAAyF;YAClG,SAAS,EAAE,gCAAgC;YAC3C,IAAI,EAAE,wBAAwB;SACjC;QACD,YAAY,EAAE,IAAI;KACrB,CAAC,CAAC;AACP,CAAC,CAAC"}
1
+ {"version":3,"file":"op_read.js","sourceRoot":"","sources":["../../../src/server/methods/op_read.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAS1D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE;QAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAW,CAAC;YACnC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACrH,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC/B,OAAO,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,WAAW,EAAE,gDAAgD;QAC7D,MAAM,EAAE;YACJ,MAAM,EAAE,qBAAqB;YAC7B,OAAO,EAAE,yFAAyF;YAClG,SAAS,EAAE,gCAAgC;YAC3C,IAAI,EAAE,wBAAwB;SACjC;QACD,YAAY,EAAE,IAAI;KACrB,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -4,14 +4,14 @@ export const register = (registry) => {
4
4
  registry.registerMethod("op.show", {
5
5
  handler: async (params, ctx) => {
6
6
  const p = (params ?? {});
7
- if (typeof p.path !== "string" || p.path.length === 0)
8
- throw new Error("op.show requires params.path: string");
7
+ if (typeof p.target !== "string" || p.target.length === 0)
8
+ throw new Error("op.show requires params.target: string");
9
9
  const statement = buildShow(p);
10
10
  return dispatchAsClient(ctx, statement);
11
11
  },
12
12
  description: "SHOW — promote an entry to the active index.",
13
13
  params: {
14
- path: "string — entry path",
14
+ target: "string — entry path",
15
15
  matcher: "string? — body matcher (glob/regex/xpath/jsonpath)",
16
16
  tags: "string[]? — tag filter",
17
17
  lineRange: "LineMarker? — result range",
@@ -1 +1 @@
1
- {"version":3,"file":"op_show.js","sourceRoot":"","sources":["../../../src/server/methods/op_show.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAS1D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE;QAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAW,CAAC;YACnC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC/G,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC/B,OAAO,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,WAAW,EAAE,8CAA8C;QAC3D,MAAM,EAAE;YACJ,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,oDAAoD;YAC7D,IAAI,EAAE,wBAAwB;YAC9B,SAAS,EAAE,4BAA4B;SAC1C;QACD,YAAY,EAAE,IAAI;KACrB,CAAC,CAAC;AACP,CAAC,CAAC"}
1
+ {"version":3,"file":"op_show.js","sourceRoot":"","sources":["../../../src/server/methods/op_show.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAS1D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACvD,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE;QAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAW,CAAC;YACnC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACrH,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC/B,OAAO,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,WAAW,EAAE,8CAA8C;QAC3D,MAAM,EAAE;YACJ,MAAM,EAAE,qBAAqB;YAC7B,OAAO,EAAE,oDAAoD;YAC7D,IAAI,EAAE,wBAAwB;YAC9B,SAAS,EAAE,4BAA4B;SAC1C;QACD,YAAY,EAAE,IAAI;KACrB,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,324 @@
1
+ -- INIT: sessions
2
+ -- project_root: workspace pointer. NULL = headless (no disk side-effects);
3
+ -- non-null = absolute path to the client's source tree, supplied at
4
+ -- session.create or session.set_root.
5
+ -- persona: head of the persona cascade (loops.persona > runs.persona >
6
+ -- sessions.persona > PATHS.defaultPersona). Nullable; null falls through.
7
+ CREATE TABLE IF NOT EXISTS sessions (
8
+ id INTEGER NOT NULL PRIMARY KEY,
9
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
10
+ name TEXT NOT NULL UNIQUE CHECK (length(name) > 0),
11
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
12
+ cost_pico INTEGER NOT NULL DEFAULT 0 CHECK (cost_pico >= 0),
13
+ scheme_registry_additions TEXT NOT NULL DEFAULT '[]' CHECK (json_valid(scheme_registry_additions)),
14
+ project_root TEXT,
15
+ persona TEXT
16
+ ) STRICT;
17
+
18
+ CREATE INDEX IF NOT EXISTS sessions_created_at ON sessions (created_at);
19
+
20
+ -- INIT: runs
21
+ -- persona: middle of the persona cascade (loops > runs > sessions > default).
22
+ -- Nullable; null falls through to the session level.
23
+ CREATE TABLE IF NOT EXISTS runs (
24
+ id INTEGER NOT NULL PRIMARY KEY,
25
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
26
+ session_id INTEGER NOT NULL,
27
+ name TEXT NOT NULL CHECK (length(name) > 0),
28
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
29
+ parent_run_id INTEGER CHECK (parent_run_id IS NULL OR parent_run_id != id),
30
+ cost_pico INTEGER NOT NULL DEFAULT 0 CHECK (cost_pico >= 0),
31
+ persona TEXT,
32
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,
33
+ FOREIGN KEY (parent_run_id) REFERENCES runs(id) ON DELETE CASCADE
34
+ ) STRICT;
35
+
36
+ CREATE INDEX IF NOT EXISTS runs_session_id_created_at ON runs (session_id, created_at);
37
+ CREATE INDEX IF NOT EXISTS runs_parent_run_id ON runs (parent_run_id);
38
+ CREATE UNIQUE INDEX IF NOT EXISTS runs_session_name ON runs (session_id, name);
39
+
40
+ -- INIT: loops
41
+ -- flags: per-loop runtime flags (yolo, noProposals, noWeb, noInteraction,
42
+ -- mode). JSON column, merged over DEFAULT_LOOP_FLAGS in code so missing
43
+ -- keys read as their defaults. SchemeRegistry.resolveForLoop gates schemes
44
+ -- by manifest affinity (proposes / excludedInAsk / requiresWeb / etc).
45
+ -- persona: head of the cascade (loops > runs > sessions > default).
46
+ CREATE TABLE IF NOT EXISTS loops (
47
+ id INTEGER NOT NULL PRIMARY KEY,
48
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
49
+ run_id INTEGER NOT NULL,
50
+ sequence INTEGER NOT NULL CHECK (sequence >= 1),
51
+ status INTEGER NOT NULL DEFAULT 102 CHECK (status IN (100, 102, 200, 499)),
52
+ prompt TEXT NOT NULL,
53
+ flags TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(flags)),
54
+ persona TEXT,
55
+ FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE
56
+ ) STRICT;
57
+
58
+ CREATE UNIQUE INDEX IF NOT EXISTS loops_run_id_sequence ON loops (run_id, sequence);
59
+
60
+ -- INIT: turns
61
+ -- finish_reason / model: provider-call metadata (plurnk-grammar Turn.json).
62
+ -- Properties of the call, not of the model's emission payload — kept on
63
+ -- the Turn row alongside usage rather than nested into packet.assistant.
64
+ CREATE TABLE IF NOT EXISTS turns (
65
+ id INTEGER NOT NULL PRIMARY KEY,
66
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
67
+ loop_id INTEGER NOT NULL,
68
+ sequence INTEGER NOT NULL CHECK (sequence >= 1),
69
+ timestamp TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
70
+ status INTEGER NOT NULL CHECK (status BETWEEN 100 AND 599),
71
+ usage_prompt INTEGER NOT NULL DEFAULT 0 CHECK (usage_prompt >= 0),
72
+ usage_completion INTEGER NOT NULL DEFAULT 0 CHECK (usage_completion >= 0),
73
+ usage_cached INTEGER NOT NULL DEFAULT 0 CHECK (usage_cached >= 0),
74
+ usage_cost_pico INTEGER NOT NULL DEFAULT 0 CHECK (usage_cost_pico >= 0),
75
+ packet TEXT NOT NULL CHECK (json_valid(packet)),
76
+ finish_reason TEXT,
77
+ model TEXT NOT NULL DEFAULT 'unknown' CHECK (length(model) >= 1),
78
+ FOREIGN KEY (loop_id) REFERENCES loops(id) ON DELETE CASCADE
79
+ ) STRICT;
80
+
81
+ CREATE UNIQUE INDEX IF NOT EXISTS turns_loop_id_sequence ON turns (loop_id, sequence);
82
+ CREATE INDEX IF NOT EXISTS turns_timestamp ON turns (timestamp);
83
+
84
+ -- INIT: entries
85
+ -- The canonical addressable store. (scope, scheme, pathname) is the
86
+ -- identity tuple. scheme is nullable: the `file` scheme is a routing
87
+ -- internal only, never stored here; bare/file paths land with scheme=NULL.
88
+ CREATE TABLE IF NOT EXISTS entries (
89
+ id INTEGER NOT NULL PRIMARY KEY,
90
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
91
+ scope TEXT NOT NULL CHECK (scope IN ('agent', 'session')),
92
+ session_id INTEGER,
93
+ scheme TEXT CHECK (scheme IS NULL OR length(scheme) > 0),
94
+ username TEXT,
95
+ password TEXT,
96
+ hostname TEXT,
97
+ port INTEGER CHECK (port IS NULL OR (port BETWEEN 0 AND 65535)),
98
+ pathname TEXT NOT NULL,
99
+ params TEXT CHECK (params IS NULL OR json_valid(params)),
100
+ attributes TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(attributes)),
101
+ CHECK ((scope = 'agent' AND session_id IS NULL)
102
+ OR (scope = 'session' AND session_id IS NOT NULL)),
103
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
104
+ ) STRICT;
105
+
106
+ CREATE UNIQUE INDEX IF NOT EXISTS entries_agent_identity ON entries (scheme, pathname) WHERE scope = 'agent';
107
+ CREATE UNIQUE INDEX IF NOT EXISTS entries_session_identity ON entries (session_id, scheme, pathname) WHERE scope = 'session';
108
+
109
+ -- The ONE engine-imposed constraint (SPEC §7.8): 100 MiB char-length cap
110
+ -- per channel content body. All other limits are extrinsic.
111
+ CREATE TABLE IF NOT EXISTS entry_channels (
112
+ entry_id INTEGER NOT NULL,
113
+ name TEXT NOT NULL CHECK (length(name) > 0),
114
+ content TEXT NOT NULL CHECK (length(content) <= 104857600),
115
+ mimetype TEXT NOT NULL CHECK (length(mimetype) > 0),
116
+ tokens INTEGER NOT NULL DEFAULT 0 CHECK (tokens >= 0),
117
+ state TEXT NOT NULL DEFAULT 'static' CHECK (state IN ('static', 'active', 'closed', 'errored')),
118
+ PRIMARY KEY (entry_id, name),
119
+ FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
120
+ ) STRICT, WITHOUT ROWID;
121
+
122
+ CREATE TABLE IF NOT EXISTS entry_tags (
123
+ entry_id INTEGER NOT NULL,
124
+ tag TEXT NOT NULL CHECK (length(tag) > 0),
125
+ PRIMARY KEY (entry_id, tag),
126
+ FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
127
+ ) STRICT, WITHOUT ROWID;
128
+
129
+ CREATE INDEX IF NOT EXISTS entry_tags_tag ON entry_tags (tag);
130
+
131
+ -- INIT: log_entries
132
+ -- Chronological event store. sequence is 1-based, scoped to the turn —
133
+ -- resets at each new turn. URI-bit columns are unprefixed (scheme,
134
+ -- pathname, …). state/outcome/attrs carry the proposal lifecycle —
135
+ -- status⊥state: status is the HTTP outcome, state is where in the
136
+ -- lifecycle the entry sits. Most rows write 'resolved' directly;
137
+ -- proposing schemes transition 'proposed' → resolved/failed/cancelled.
138
+ -- indexed: per-row visibility for SHOW/HIDE via the log:// scheme.
139
+ CREATE TABLE IF NOT EXISTS log_entries (
140
+ id INTEGER NOT NULL PRIMARY KEY,
141
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
142
+
143
+ run_id INTEGER NOT NULL,
144
+ loop_id INTEGER NOT NULL,
145
+ turn_id INTEGER NOT NULL,
146
+ sequence INTEGER NOT NULL CHECK (sequence >= 1),
147
+ at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
148
+ origin TEXT NOT NULL CHECK (origin IN ('model', 'client', 'system', 'plugin')),
149
+
150
+ op TEXT NOT NULL CHECK (op IN ('FIND', 'READ', 'EDIT', 'COPY', 'MOVE', 'SHOW', 'HIDE', 'SEND', 'EXEC')),
151
+ suffix TEXT NOT NULL DEFAULT '',
152
+ signal TEXT CHECK (signal IS NULL OR json_valid(signal)),
153
+
154
+ scheme TEXT CHECK (scheme IS NULL OR length(scheme) > 0),
155
+ username TEXT,
156
+ password TEXT,
157
+ hostname TEXT,
158
+ port INTEGER CHECK (port IS NULL OR (port BETWEEN 0 AND 65535)),
159
+ pathname TEXT,
160
+ params TEXT CHECK (params IS NULL OR json_valid(params)),
161
+ fragment TEXT,
162
+
163
+ lineMarker TEXT CHECK (lineMarker IS NULL OR json_valid(lineMarker)),
164
+
165
+ tx TEXT NOT NULL,
166
+ mimetype_tx TEXT NOT NULL CHECK (length(mimetype_tx) > 0),
167
+
168
+ rx TEXT NOT NULL,
169
+ mimetype_rx TEXT NOT NULL CHECK (length(mimetype_rx) > 0),
170
+ status_rx INTEGER NOT NULL CHECK (status_rx BETWEEN 100 AND 599),
171
+
172
+ tokens INTEGER NOT NULL DEFAULT 0 CHECK (tokens >= 0),
173
+
174
+ state TEXT NOT NULL DEFAULT 'resolved'
175
+ CHECK (state IN ('proposed', 'resolved', 'failed', 'cancelled')),
176
+ outcome TEXT,
177
+ attrs TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(attrs)),
178
+
179
+ indexed INTEGER NOT NULL DEFAULT 1 CHECK (indexed IN (0, 1)),
180
+
181
+ FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE,
182
+ FOREIGN KEY (loop_id) REFERENCES loops(id) ON DELETE CASCADE,
183
+ FOREIGN KEY (turn_id) REFERENCES turns(id) ON DELETE CASCADE
184
+ ) STRICT;
185
+
186
+ CREATE UNIQUE INDEX IF NOT EXISTS log_entries_turn_id_sequence ON log_entries (turn_id, sequence);
187
+ CREATE INDEX IF NOT EXISTS log_entries_run_id ON log_entries (run_id);
188
+ CREATE INDEX IF NOT EXISTS log_entries_loop_id ON log_entries (loop_id);
189
+ CREATE INDEX IF NOT EXISTS log_entries_at ON log_entries (at);
190
+
191
+ -- Column-scoped immutability: the original action's identity and target
192
+ -- never change; the proposal lifecycle is allowed to mutate state,
193
+ -- outcome, status_rx, rx, indexed.
194
+ CREATE TRIGGER IF NOT EXISTS log_entries_immutable_core
195
+ BEFORE UPDATE OF
196
+ run_id, loop_id, turn_id, sequence, at, origin,
197
+ op, suffix, signal,
198
+ scheme, username, password, hostname,
199
+ port, pathname, params, fragment,
200
+ lineMarker, tx, mimetype_tx, mimetype_rx, attrs
201
+ ON log_entries
202
+ BEGIN
203
+ SELECT RAISE(ABORT, 'log_entries core fields are immutable; only state/outcome/status_rx/rx/indexed may change');
204
+ END;
205
+
206
+ -- INIT: visibility
207
+ -- Per-(run, entry, channel) visibility for the index. SHOW/HIDE toggle
208
+ -- the indexed bit; render-time queries filter where indexed=1.
209
+ CREATE TABLE IF NOT EXISTS visibility (
210
+ run_id INTEGER NOT NULL,
211
+ entry_id INTEGER NOT NULL,
212
+ channel TEXT NOT NULL CHECK (length(channel) > 0),
213
+ indexed INTEGER NOT NULL DEFAULT 1 CHECK (indexed IN (0, 1)),
214
+ PRIMARY KEY (run_id, entry_id, channel),
215
+ FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE,
216
+ FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
217
+ ) STRICT, WITHOUT ROWID;
218
+
219
+ -- INIT: schemes_providers
220
+ -- Scheme/provider catalog. Schemes are static (registered at boot);
221
+ -- providers carry per-model metadata for cost accounting and selection.
222
+ CREATE TABLE IF NOT EXISTS schemes (
223
+ name TEXT NOT NULL PRIMARY KEY CHECK (length(name) > 0),
224
+ model_visible INTEGER NOT NULL CHECK (model_visible IN (0, 1)),
225
+ category TEXT NOT NULL CHECK (length(category) > 0),
226
+ default_scope TEXT NOT NULL CHECK (default_scope IN ('agent', 'session')),
227
+ default_channel TEXT NOT NULL CHECK (length(default_channel) > 0),
228
+ channel_orientations TEXT CHECK (channel_orientations IS NULL OR json_valid(channel_orientations)),
229
+ writable_by TEXT NOT NULL CHECK (json_valid(writable_by)),
230
+ volatile INTEGER NOT NULL CHECK (volatile IN (0, 1)),
231
+ handler TEXT
232
+ ) STRICT, WITHOUT ROWID;
233
+
234
+ CREATE TABLE IF NOT EXISTS providers (
235
+ id INTEGER NOT NULL PRIMARY KEY,
236
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
237
+ provider TEXT NOT NULL CHECK (length(provider) > 0),
238
+ family TEXT NOT NULL CHECK (length(family) > 0),
239
+ model TEXT NOT NULL CHECK (length(model) > 0),
240
+ contextSize INTEGER NOT NULL CHECK (contextSize >= 1),
241
+ currency TEXT NOT NULL CHECK (length(currency) = 3),
242
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
243
+ ) STRICT;
244
+
245
+ CREATE INDEX IF NOT EXISTS providers_created_at ON providers (created_at);
246
+
247
+ -- INIT: cost_rollups
248
+ -- Triggers maintaining denormalized cost_pico totals on runs and sessions
249
+ -- as turns insert/update. Pure denormalization (textbook trigger use);
250
+ -- no branching state-machine logic lives here.
251
+ CREATE TRIGGER IF NOT EXISTS turns_cost_rollup_insert_run
252
+ AFTER INSERT ON turns
253
+ BEGIN
254
+ UPDATE runs
255
+ SET cost_pico = cost_pico + NEW.usage_cost_pico
256
+ WHERE id = (SELECT run_id FROM loops WHERE id = NEW.loop_id);
257
+ END;
258
+
259
+ CREATE TRIGGER IF NOT EXISTS turns_cost_rollup_insert_session
260
+ AFTER INSERT ON turns
261
+ BEGIN
262
+ UPDATE sessions
263
+ SET cost_pico = cost_pico + NEW.usage_cost_pico
264
+ WHERE id = (
265
+ SELECT r.session_id
266
+ FROM runs r
267
+ JOIN loops l ON l.run_id = r.id
268
+ WHERE l.id = NEW.loop_id
269
+ );
270
+ END;
271
+
272
+ CREATE TRIGGER IF NOT EXISTS turns_cost_rollup_update_run
273
+ AFTER UPDATE OF usage_cost_pico ON turns
274
+ WHEN NEW.usage_cost_pico != OLD.usage_cost_pico
275
+ BEGIN
276
+ UPDATE runs
277
+ SET cost_pico = cost_pico + NEW.usage_cost_pico - OLD.usage_cost_pico
278
+ WHERE id = (SELECT run_id FROM loops WHERE id = NEW.loop_id);
279
+ END;
280
+
281
+ CREATE TRIGGER IF NOT EXISTS turns_cost_rollup_update_session
282
+ AFTER UPDATE OF usage_cost_pico ON turns
283
+ WHEN NEW.usage_cost_pico != OLD.usage_cost_pico
284
+ BEGIN
285
+ UPDATE sessions
286
+ SET cost_pico = cost_pico + NEW.usage_cost_pico - OLD.usage_cost_pico
287
+ WHERE id = (
288
+ SELECT r.session_id
289
+ FROM runs r
290
+ JOIN loops l ON l.run_id = r.id
291
+ WHERE l.id = NEW.loop_id
292
+ );
293
+ END;
294
+
295
+ -- INIT: subscriptions
296
+ -- Subscription registry per SPEC §7.1. Exists ONLY for cancellation
297
+ -- routing (SEND[499] → lookup → scheme teardown). Closed rows persist
298
+ -- for forensics; partial unique index enforces one active subscription
299
+ -- per (run, entry).
300
+ CREATE TABLE IF NOT EXISTS subscriptions (
301
+ id INTEGER NOT NULL PRIMARY KEY,
302
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
303
+ run_id INTEGER NOT NULL,
304
+ entry_id INTEGER NOT NULL,
305
+ scheme TEXT NOT NULL CHECK (length(scheme) > 0),
306
+ handle TEXT NOT NULL CHECK (length(handle) > 0),
307
+ opened_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
308
+ closed_at TEXT,
309
+ close_status INTEGER CHECK (close_status IS NULL OR (close_status BETWEEN 100 AND 599)),
310
+ CHECK ((closed_at IS NULL AND close_status IS NULL)
311
+ OR (closed_at IS NOT NULL AND close_status IS NOT NULL)),
312
+ FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE,
313
+ FOREIGN KEY (entry_id) REFERENCES entries(id) ON DELETE CASCADE
314
+ ) STRICT;
315
+
316
+ CREATE UNIQUE INDEX IF NOT EXISTS subscriptions_active_one_per_entry
317
+ ON subscriptions (run_id, entry_id)
318
+ WHERE closed_at IS NULL;
319
+
320
+ CREATE INDEX IF NOT EXISTS subscriptions_scheme_active
321
+ ON subscriptions (scheme)
322
+ WHERE closed_at IS NULL;
323
+
324
+ CREATE INDEX IF NOT EXISTS subscriptions_opened_at ON subscriptions (opened_at);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plurnk/plurnk-service",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Plurnk agent runtime — the server / engine / core. Implements the @plurnk/plurnk-grammar contract.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -30,29 +30,36 @@
30
30
  },
31
31
  "scripts": {
32
32
  "test:lint": "tsc --noEmit",
33
- "test:unit": "node --test src/**/*.test.ts",
34
- "test:intg": "node --env-file-if-exists=.env --test test/intg/*.test.ts",
35
- "test:live": "node --env-file-if-exists=.env --test test/live/*.test.ts",
36
- "test:demo": "node --env-file-if-exists=.env --test test/demo/*.test.ts",
33
+ "test:unit": "node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --test src/**/*.test.ts",
34
+ "test:intg": "node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --test test/intg/*.test.ts",
35
+ "test:live": "node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --test --test-concurrency=1 test/live/*.test.ts",
36
+ "test:demo": "node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --test --test-concurrency=1 test/demo/*.test.ts",
37
37
  "test:all": "npm run test:lint && npm run test:unit && npm run test:intg && npm run test:demo",
38
38
  "test:digest": "node bin/digest.js",
39
+ "test:clean-tmp": "rm -rf test/intg/.tmp",
39
40
  "dev:digest": "node bin/digest.js",
40
41
  "build:dist": "tsc -p tsconfig.build.json",
41
42
  "build": "npm run build:dist",
42
43
  "prepare": "npm run build"
43
44
  },
44
45
  "dependencies": {
45
- "@plurnk/plurnk-grammar": "^0.7.1",
46
+ "@plurnk/plurnk-grammar": "^0.14.0",
46
47
  "@plurnk/plurnk-mimetypes": "^0.3.1",
47
48
  "@plurnk/plurnk-mimetypes-application-json": "^0.2.0",
49
+ "@plurnk/plurnk-mimetypes-application-pdf": "^0.3.0",
50
+ "@plurnk/plurnk-mimetypes-application-toml": "^0.1.0",
51
+ "@plurnk/plurnk-mimetypes-application-yaml": "^0.1.0",
52
+ "@plurnk/plurnk-mimetypes-text-csv": "^0.1.0",
53
+ "@plurnk/plurnk-mimetypes-text-html": "^0.1.0",
48
54
  "@plurnk/plurnk-mimetypes-text-markdown": "^0.2.0",
49
55
  "@plurnk/plurnk-mimetypes-text-plain": "^0.2.0",
50
- "@plurnk/plurnk-providers-cloudflare": "github:plurnk/plurnk-providers-cloudflare",
51
- "@plurnk/plurnk-providers-google": "github:plurnk/plurnk-providers-google",
52
- "@plurnk/plurnk-providers-ollama": "github:plurnk/plurnk-providers-ollama",
53
- "@plurnk/plurnk-providers-openai": "github:plurnk/plurnk-providers-openai",
54
- "@plurnk/plurnk-providers-openrouter": "github:plurnk/plurnk-providers-openrouter",
55
- "@plurnk/plurnk-providers-xai": "github:plurnk/plurnk-providers-xai",
56
+ "@plurnk/plurnk-mimetypes-text-typescript": "^0.1.0",
57
+ "@plurnk/plurnk-providers-cloudflare": "^0.2.0",
58
+ "@plurnk/plurnk-providers-google": "^0.2.0",
59
+ "@plurnk/plurnk-providers-ollama": "^0.2.0",
60
+ "@plurnk/plurnk-providers-openai": "^0.2.0",
61
+ "@plurnk/plurnk-providers-openrouter": "^0.2.0",
62
+ "@plurnk/plurnk-providers-xai": "^0.2.0",
56
63
  "@possumtech/sqlrite": "^3.1.0",
57
64
  "diff": "^7.0.0",
58
65
  "ws": "^8.20.1"
@@ -1,11 +0,0 @@
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);
@@ -1,16 +0,0 @@
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);
@@ -1,12 +0,0 @@
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);
@@ -1,18 +0,0 @@
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);
@@ -1,44 +0,0 @@
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);
@@ -1,51 +0,0 @@
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;
@@ -1,10 +0,0 @@
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;