@plurnk/plurnk-service 1.21.0 → 1.22.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 (249) hide show
  1. package/.env.defaults +15 -6
  2. package/INSTALL.md +2 -2
  3. package/README.md +1 -1
  4. package/SPEC.md +329 -228
  5. package/dist/build-info.json +1 -1
  6. package/dist/content/edit-receipt.js +4 -3
  7. package/dist/content/edit-receipt.js.map +1 -1
  8. package/dist/content/index.d.ts +2 -7
  9. package/dist/content/index.d.ts.map +1 -1
  10. package/dist/content/index.js +2 -5
  11. package/dist/content/index.js.map +1 -1
  12. package/dist/content/line-anchors.d.ts.map +1 -1
  13. package/dist/content/line-anchors.js +46 -15
  14. package/dist/content/line-anchors.js.map +1 -1
  15. package/dist/content/line-marker.d.ts +1 -0
  16. package/dist/content/line-marker.d.ts.map +1 -1
  17. package/dist/content/line-marker.js +2 -0
  18. package/dist/content/line-marker.js.map +1 -1
  19. package/dist/content/matcher.d.ts +1 -1
  20. package/dist/content/matcher.d.ts.map +1 -1
  21. package/dist/content/matcher.js +7 -9
  22. package/dist/content/matcher.js.map +1 -1
  23. package/dist/content/pattern-edits.d.ts +6 -0
  24. package/dist/content/pattern-edits.d.ts.map +1 -1
  25. package/dist/content/pattern-edits.js +14 -0
  26. package/dist/content/pattern-edits.js.map +1 -1
  27. package/dist/content/read-projector.d.ts.map +1 -1
  28. package/dist/content/read-projector.js +2 -1
  29. package/dist/content/read-projector.js.map +1 -1
  30. package/dist/content/scope-format.d.ts +2 -2
  31. package/dist/content/scope-format.d.ts.map +1 -1
  32. package/dist/content/scope-format.js.map +1 -1
  33. package/dist/core/AdmittedTurnExecutor.d.ts.map +1 -1
  34. package/dist/core/AdmittedTurnExecutor.js +5 -2
  35. package/dist/core/AdmittedTurnExecutor.js.map +1 -1
  36. package/dist/core/DataStatementRunner.js +1 -1
  37. package/dist/core/DataStatementRunner.js.map +1 -1
  38. package/dist/core/Dispatcher.d.ts.map +1 -1
  39. package/dist/core/Dispatcher.js +1 -0
  40. package/dist/core/Dispatcher.js.map +1 -1
  41. package/dist/core/Dispatcher.sql +1 -1
  42. package/dist/core/EditMutations.js +4 -4
  43. package/dist/core/EditMutations.js.map +1 -1
  44. package/dist/core/EditSequence.d.ts.map +1 -1
  45. package/dist/core/EditSequence.js +2 -1
  46. package/dist/core/EditSequence.js.map +1 -1
  47. package/dist/core/Engine.d.ts +4 -1
  48. package/dist/core/Engine.d.ts.map +1 -1
  49. package/dist/core/Engine.js +7 -2
  50. package/dist/core/Engine.js.map +1 -1
  51. package/dist/core/ExecutorRegistry.d.ts +1 -0
  52. package/dist/core/ExecutorRegistry.d.ts.map +1 -1
  53. package/dist/core/ExecutorRegistry.js +4 -0
  54. package/dist/core/ExecutorRegistry.js.map +1 -1
  55. package/dist/core/FabricatedLog.d.ts +8 -0
  56. package/dist/core/FabricatedLog.d.ts.map +1 -0
  57. package/dist/core/FabricatedLog.js +16 -0
  58. package/dist/core/FabricatedLog.js.map +1 -0
  59. package/dist/core/KnownToxins.d.ts +0 -1
  60. package/dist/core/KnownToxins.d.ts.map +1 -1
  61. package/dist/core/KnownToxins.js +3 -12
  62. package/dist/core/KnownToxins.js.map +1 -1
  63. package/dist/core/LogBody.d.ts.map +1 -1
  64. package/dist/core/LogBody.js +3 -2
  65. package/dist/core/LogBody.js.map +1 -1
  66. package/dist/core/LogVisibility.d.ts +3 -1
  67. package/dist/core/LogVisibility.d.ts.map +1 -1
  68. package/dist/core/LogVisibility.js +30 -16
  69. package/dist/core/LogVisibility.js.map +1 -1
  70. package/dist/core/LoopDriver.d.ts.map +1 -1
  71. package/dist/core/LoopDriver.js +2 -3
  72. package/dist/core/LoopDriver.js.map +1 -1
  73. package/dist/core/LoopOutcome.d.ts +0 -1
  74. package/dist/core/LoopOutcome.d.ts.map +1 -1
  75. package/dist/core/LoopOutcome.js +1 -1
  76. package/dist/core/LoopOutcome.js.map +1 -1
  77. package/dist/core/OutsideEvent.d.ts +10 -0
  78. package/dist/core/OutsideEvent.d.ts.map +1 -0
  79. package/dist/core/OutsideEvent.js +5 -0
  80. package/dist/core/OutsideEvent.js.map +1 -0
  81. package/dist/core/PacketBuilder.js +2 -2
  82. package/dist/core/PacketBuilder.js.map +1 -1
  83. package/dist/core/PatternSelection.d.ts +1 -1
  84. package/dist/core/PatternSelection.d.ts.map +1 -1
  85. package/dist/core/PatternSelection.js +8 -6
  86. package/dist/core/PatternSelection.js.map +1 -1
  87. package/dist/core/ProposalLifecycle.d.ts.map +1 -1
  88. package/dist/core/ProposalLifecycle.js +2 -4
  89. package/dist/core/ProposalLifecycle.js.map +1 -1
  90. package/dist/core/ProviderInstantiate.d.ts +4 -4
  91. package/dist/core/ProviderInstantiate.d.ts.map +1 -1
  92. package/dist/core/ProviderInstantiate.js +24 -25
  93. package/dist/core/ProviderInstantiate.js.map +1 -1
  94. package/dist/core/ProviderRecovery.d.ts +1 -1
  95. package/dist/core/ProviderRecovery.d.ts.map +1 -1
  96. package/dist/core/ProviderRecovery.js +3 -1
  97. package/dist/core/ProviderRecovery.js.map +1 -1
  98. package/dist/core/ResourceSelector.js +1 -1
  99. package/dist/core/ResourceSelector.js.map +1 -1
  100. package/dist/core/StoredPacket.d.ts +1 -1
  101. package/dist/core/StoredPacket.d.ts.map +1 -1
  102. package/dist/core/StoredPacket.js +6 -15
  103. package/dist/core/StoredPacket.js.map +1 -1
  104. package/dist/core/StrikeRail.d.ts +2 -0
  105. package/dist/core/StrikeRail.d.ts.map +1 -1
  106. package/dist/core/StrikeRail.js +7 -1
  107. package/dist/core/StrikeRail.js.map +1 -1
  108. package/dist/core/Turn.d.ts +1 -1
  109. package/dist/core/Turn.d.ts.map +1 -1
  110. package/dist/core/Turn.js.map +1 -1
  111. package/dist/core/TurnDispositionHandler.d.ts.map +1 -1
  112. package/dist/core/TurnDispositionHandler.js +1 -4
  113. package/dist/core/TurnDispositionHandler.js.map +1 -1
  114. package/dist/core/TurnMaterialization.d.ts.map +1 -1
  115. package/dist/core/TurnMaterialization.js +5 -7
  116. package/dist/core/TurnMaterialization.js.map +1 -1
  117. package/dist/core/TurnRunner.d.ts +5 -1
  118. package/dist/core/TurnRunner.d.ts.map +1 -1
  119. package/dist/core/TurnRunner.js +108 -23
  120. package/dist/core/TurnRunner.js.map +1 -1
  121. package/dist/core/WorkerControlHandler.d.ts.map +1 -1
  122. package/dist/core/WorkerControlHandler.js +6 -1
  123. package/dist/core/WorkerControlHandler.js.map +1 -1
  124. package/dist/core/WorkerName.sql +2 -2
  125. package/dist/core/attachments.d.ts +0 -3
  126. package/dist/core/attachments.d.ts.map +1 -1
  127. package/dist/core/attachments.js +3 -3
  128. package/dist/core/attachments.js.map +1 -1
  129. package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -1
  130. package/dist/core/caps/DbSubscriptionCaps.js +1 -2
  131. package/dist/core/caps/DbSubscriptionCaps.js.map +1 -1
  132. package/dist/core/fork.sql +2 -2
  133. package/dist/core/packet-wire.d.ts +1 -2
  134. package/dist/core/packet-wire.d.ts.map +1 -1
  135. package/dist/core/packet-wire.js +51 -54
  136. package/dist/core/packet-wire.js.map +1 -1
  137. package/dist/core/plurnk-uri.d.ts +0 -1
  138. package/dist/core/plurnk-uri.d.ts.map +1 -1
  139. package/dist/core/plurnk-uri.js +1 -1
  140. package/dist/core/plurnk-uri.js.map +1 -1
  141. package/dist/core/worker-ops.sql +1 -1
  142. package/dist/digest/Digest.d.ts.map +1 -1
  143. package/dist/digest/Digest.js +33 -60
  144. package/dist/digest/Digest.js.map +1 -1
  145. package/dist/digest/DigestEvidence.d.ts +9 -0
  146. package/dist/digest/DigestEvidence.d.ts.map +1 -0
  147. package/dist/digest/DigestEvidence.js +52 -0
  148. package/dist/digest/DigestEvidence.js.map +1 -0
  149. package/dist/digest/DigestRender.d.ts +1 -1
  150. package/dist/digest/DigestRender.d.ts.map +1 -1
  151. package/dist/digest/DigestRender.js +115 -66
  152. package/dist/digest/DigestRender.js.map +1 -1
  153. package/dist/digest/DigestRequiem.d.ts.map +1 -1
  154. package/dist/digest/DigestRequiem.js +56 -47
  155. package/dist/digest/DigestRequiem.js.map +1 -1
  156. package/dist/digest/digest-paths.d.ts.map +1 -1
  157. package/dist/digest/digest-paths.js +5 -14
  158. package/dist/digest/digest-paths.js.map +1 -1
  159. package/dist/digest/digest-rows.d.ts +10 -9
  160. package/dist/digest/digest-rows.d.ts.map +1 -1
  161. package/dist/digest/digest.sql +15 -11
  162. package/dist/schemes/EffectPolicy.js +1 -1
  163. package/dist/schemes/EffectPolicy.js.map +1 -1
  164. package/dist/schemes/Exec.d.ts.map +1 -1
  165. package/dist/schemes/Exec.js +26 -6
  166. package/dist/schemes/Exec.js.map +1 -1
  167. package/dist/schemes/ExecScratch.d.ts +10 -0
  168. package/dist/schemes/ExecScratch.d.ts.map +1 -0
  169. package/dist/schemes/ExecScratch.js +43 -0
  170. package/dist/schemes/ExecScratch.js.map +1 -0
  171. package/dist/schemes/File.d.ts.map +1 -1
  172. package/dist/schemes/File.js +39 -5
  173. package/dist/schemes/File.js.map +1 -1
  174. package/dist/schemes/Log.d.ts.map +1 -1
  175. package/dist/schemes/Log.js +5 -4
  176. package/dist/schemes/Log.js.map +1 -1
  177. package/dist/schemes/TurnSource.js +2 -2
  178. package/dist/schemes/TurnSource.js.map +1 -1
  179. package/dist/schemes/Worker.d.ts.map +1 -1
  180. package/dist/schemes/Worker.js +6 -3
  181. package/dist/schemes/Worker.js.map +1 -1
  182. package/dist/schemes/_entry-crud.d.ts.map +1 -1
  183. package/dist/schemes/_entry-crud.js +2 -3
  184. package/dist/schemes/_entry-crud.js.map +1 -1
  185. package/dist/schemes/_entry-find.d.ts.map +1 -1
  186. package/dist/schemes/_entry-find.js +2 -1
  187. package/dist/schemes/_entry-find.js.map +1 -1
  188. package/dist/schemes/_entry-fts.d.ts +1 -0
  189. package/dist/schemes/_entry-fts.d.ts.map +1 -1
  190. package/dist/schemes/_entry-fts.js +34 -2
  191. package/dist/schemes/_entry-fts.js.map +1 -1
  192. package/dist/schemes/_entry-ops.d.ts.map +1 -1
  193. package/dist/schemes/_entry-ops.js +3 -2
  194. package/dist/schemes/_entry-ops.js.map +1 -1
  195. package/dist/schemes/_path-scope.d.ts.map +1 -1
  196. package/dist/schemes/_path-scope.js +2 -3
  197. package/dist/schemes/_path-scope.js.map +1 -1
  198. package/dist/server/Daemon.d.ts +25 -13
  199. package/dist/server/Daemon.d.ts.map +1 -1
  200. package/dist/server/Daemon.js +89 -58
  201. package/dist/server/Daemon.js.map +1 -1
  202. package/dist/server/DrainSupervisor.d.ts +3 -3
  203. package/dist/server/DrainSupervisor.d.ts.map +1 -1
  204. package/dist/server/DrainSupervisor.js +3 -3
  205. package/dist/server/DrainSupervisor.js.map +1 -1
  206. package/dist/server/EnvFunctionality.d.ts +0 -1
  207. package/dist/server/EnvFunctionality.d.ts.map +1 -1
  208. package/dist/server/EnvFunctionality.js +1 -1
  209. package/dist/server/EnvFunctionality.js.map +1 -1
  210. package/dist/server/MembersFunctionality.d.ts +0 -9
  211. package/dist/server/MembersFunctionality.d.ts.map +1 -1
  212. package/dist/server/WorkerModelResolver.d.ts +8 -8
  213. package/dist/server/WorkerModelResolver.d.ts.map +1 -1
  214. package/dist/server/WorkerModelResolver.js +46 -45
  215. package/dist/server/WorkerModelResolver.js.map +1 -1
  216. package/dist/server/client-input.d.ts +1 -0
  217. package/dist/server/client-input.d.ts.map +1 -1
  218. package/dist/server/client-input.js +7 -0
  219. package/dist/server/client-input.js.map +1 -1
  220. package/dist/server/drain.sql +6 -6
  221. package/dist/server/envelope.sql +6 -6
  222. package/dist/server/loopDocs.js +1 -1
  223. package/dist/server/loopDocs.js.map +1 -1
  224. package/dist/server/model-catalog.js +2 -2
  225. package/dist/server/model-catalog.js.map +1 -1
  226. package/dist/server/model-route.d.ts +2 -2
  227. package/dist/server/model-route.d.ts.map +1 -1
  228. package/dist/server/model-route.js +5 -5
  229. package/dist/server/model-route.js.map +1 -1
  230. package/dist/service.d.ts.map +1 -1
  231. package/dist/service.js +41 -6
  232. package/dist/service.js.map +1 -1
  233. package/dist/share/Share.d.ts +15 -0
  234. package/dist/share/Share.d.ts.map +1 -0
  235. package/dist/share/Share.js +106 -0
  236. package/dist/share/Share.js.map +1 -0
  237. package/dist/share/share.sql +6 -0
  238. package/migrations/001_workspaces.sql +2 -2
  239. package/migrations/002_workers.sql +4 -6
  240. package/migrations/003_loops.sql +2 -2
  241. package/migrations/004_inference.sql +2 -2
  242. package/migrations/005_entries.sql +2 -2
  243. package/migrations/006_log.sql +2 -2
  244. package/migrations/007_subscriptions.sql +2 -2
  245. package/migrations/008_interactions.sql +2 -2
  246. package/migrations/009_effort.sql +7 -0
  247. package/migrations/010_outside_text.sql +41 -0
  248. package/migrations/011_settled.sql +133 -0
  249. package/package.json +42 -37
@@ -0,0 +1,133 @@
1
+ -- MIGRATE: 11 settled
2
+ -- Released in 1.22.0 and frozen ({§db-migrations}): a shape change is the next MIGRATE version, never an edit here.
3
+ -- #883: two guards are redeclared so each invariant is stated once in SQL ({§validation-topology}).
4
+ -- No table is rebuilt: `subscriptions` is the parent of `subscription_publications` (ON DELETE
5
+ -- CASCADE, itself the parent of `log_entries.subscription_publication_id`), and a DROP TABLE
6
+ -- under the foreign keys sqlrite keeps on inside the migration transaction would perform the
7
+ -- implicit delete that cascades through both. A guard is shape ({§db-schema-baseline}), so its
8
+ -- redeclaration is DROP then CREATE here, verbatim but for the rule.
9
+ --
10
+ -- The settled-result invariant, in words: a settled result is a JSON object whose integer
11
+ -- `status` is 200..599 and never 202; below 400 it carries no `problem`; at 400 and above it
12
+ -- carries a `problem` object whose integer `status` equals the result's and whose `type`,
13
+ -- `title` and `detail` are non-empty strings. Chapter 5 states it as the CHECK
14
+ -- `entry_channel_producer_result_contract` over `producer_result` (where NULL is the implicit
15
+ -- 200); chapter 7's `subscriptions_result_contract_update` stated a weaker rule over
16
+ -- `close_result` (no 202 exclusion, no `type`/`title`/`detail`). Both tables store the result as
17
+ -- JSON text, so the expression below is chapter 5's text with `NEW.close_result` in place of
18
+ -- `producer_result`; the one shape difference is that `subscriptions` stores the status beside
19
+ -- the JSON, so the guard also asserts `$.status = NEW.close_status`, and NULL is "not settled"
20
+ -- (the all-null arm), never an implicit 200.
21
+ DROP TRIGGER IF EXISTS subscriptions_result_contract_update;
22
+ CREATE TRIGGER IF NOT EXISTS subscriptions_result_contract_update
23
+ BEFORE UPDATE OF closed_at, close_status, close_result, channel_results ON subscriptions
24
+ WHEN NOT (
25
+ (NEW.closed_at IS NULL AND NEW.close_status IS NULL AND NEW.close_result IS NULL AND NEW.channel_results IS NULL)
26
+ OR (
27
+ NEW.closed_at IS NOT NULL
28
+ AND NEW.close_status IS NOT NULL
29
+ AND NEW.close_result IS NOT NULL
30
+ AND NEW.channel_results IS NOT NULL
31
+ AND json_valid(NEW.channel_results)
32
+ AND json_type(NEW.channel_results) = 'object'
33
+ AND CASE
34
+ WHEN NOT json_valid(NEW.close_result) THEN 0
35
+ ELSE
36
+ json_type(NEW.close_result) IS 'object'
37
+ AND json_type(NEW.close_result, '$.status') IS 'integer'
38
+ AND json_extract(NEW.close_result, '$.status') BETWEEN 200 AND 599
39
+ AND json_extract(NEW.close_result, '$.status') != 202
40
+ AND json_extract(NEW.close_result, '$.status') = NEW.close_status
41
+ AND CASE
42
+ WHEN json_extract(NEW.close_result, '$.status') < 400 THEN
43
+ json_type(NEW.close_result, '$.problem') IS NULL
44
+ ELSE
45
+ json_type(NEW.close_result, '$.problem') IS 'object'
46
+ AND json_type(NEW.close_result, '$.problem.status') IS 'integer'
47
+ AND json_extract(NEW.close_result, '$.problem.status')
48
+ = json_extract(NEW.close_result, '$.status')
49
+ AND json_type(NEW.close_result, '$.problem.type') IS 'text'
50
+ AND length(json_extract(NEW.close_result, '$.problem.type')) > 0
51
+ AND json_type(NEW.close_result, '$.problem.title') IS 'text'
52
+ AND length(json_extract(NEW.close_result, '$.problem.title')) > 0
53
+ AND json_type(NEW.close_result, '$.problem.detail') IS 'text'
54
+ AND length(json_extract(NEW.close_result, '$.problem.detail')) > 0
55
+ END
56
+ END
57
+ )
58
+ )
59
+ BEGIN
60
+ SELECT RAISE(ABORT, 'subscription terminal result violates the operation-result contract');
61
+ END;
62
+
63
+ -- {§logical-line-count}: `entry_channels.lines` mirrors `TextCoordinates.lineCount`, which breaks a
64
+ -- line on LF, on CRLF and on a lone CR; chapter 5's write path counted LF only. The exact count
65
+ -- is the number of line breaks — LF count plus lone-CR count, where lone CR = CR count − CRLF
66
+ -- count — plus one for a final line the content does not terminate:
67
+ -- length(c) - length(replace(c, char(10), ''))
68
+ -- + length(c) - length(replace(c, char(13), ''))
69
+ -- - (length(c) - length(replace(c, char(13) || char(10), ''))) / 2
70
+ -- + CASE WHEN substr(c, -1) IN (char(10), char(13)) THEN 0 ELSE 1 END
71
+ -- and empty content has no line. The view's INSTEAD OF write path is redeclared with that
72
+ -- expression; every other line is chapter 5's.
73
+ DROP TRIGGER IF EXISTS entry_channels_insert;
74
+ CREATE TRIGGER IF NOT EXISTS entry_channels_insert
75
+ INSTEAD OF INSERT ON entry_channels
76
+ BEGIN
77
+ SELECT RAISE(ABORT, 'a channel requires content') WHERE NEW.content IS NULL;
78
+ SELECT RAISE(ABORT, 'content_hash does not match content')
79
+ WHERE NEW.content_hash IS NOT NULL AND NEW.content_hash IS NOT sha256(NEW.content);
80
+ INSERT INTO contents (hash, content)
81
+ SELECT COALESCE(NEW.content_hash, sha256(NEW.content)), NEW.content
82
+ WHERE COALESCE(NEW.state, 'static') <> 'active'
83
+ ON CONFLICT (hash) DO NOTHING;
84
+ INSERT INTO entry_channel_rows (entry_id, name, content_id, buffer, mimetype, weight, lines, deep_hash, state, producer_result)
85
+ VALUES (
86
+ NEW.entry_id, NEW.name,
87
+ CASE WHEN COALESCE(NEW.state, 'static') <> 'active'
88
+ THEN (SELECT id FROM contents WHERE hash = COALESCE(NEW.content_hash, sha256(NEW.content))) END,
89
+ CASE WHEN COALESCE(NEW.state, 'static') = 'active' THEN NEW.content END,
90
+ NEW.mimetype, COALESCE(NEW.weight, 0),
91
+ CASE WHEN length(NEW.content) = 0 THEN 0
92
+ ELSE length(NEW.content) - length(replace(NEW.content, char(10), ''))
93
+ + length(NEW.content) - length(replace(NEW.content, char(13), ''))
94
+ - (length(NEW.content) - length(replace(NEW.content, char(13) || char(10), ''))) / 2
95
+ + CASE WHEN substr(NEW.content, -1) IN (char(10), char(13)) THEN 0 ELSE 1 END END,
96
+ NEW.deep_hash, COALESCE(NEW.state, 'static'), NEW.producer_result
97
+ );
98
+ END;
99
+
100
+ DROP TRIGGER IF EXISTS entry_channels_update;
101
+ CREATE TRIGGER IF NOT EXISTS entry_channels_update
102
+ INSTEAD OF UPDATE ON entry_channels
103
+ BEGIN
104
+ SELECT RAISE(ABORT, 'a channel is addressed by (entry_id, name)')
105
+ WHERE NEW.entry_id IS NOT OLD.entry_id OR NEW.name IS NOT OLD.name;
106
+ SELECT RAISE(ABORT, 'a channel requires content') WHERE NEW.content IS NULL;
107
+ SELECT RAISE(ABORT, 'content_hash does not match content')
108
+ WHERE NEW.content_hash IS NOT NULL AND NEW.content_hash IS NOT OLD.content_hash
109
+ AND NEW.content_hash IS NOT sha256(NEW.content);
110
+ INSERT INTO contents (hash, content)
111
+ SELECT sha256(NEW.content), NEW.content
112
+ WHERE NEW.state <> 'active' AND (NEW.content IS NOT OLD.content OR OLD.state = 'active')
113
+ ON CONFLICT (hash) DO NOTHING;
114
+ UPDATE entry_channel_rows
115
+ SET content_id = CASE WHEN NEW.state <> 'active'
116
+ THEN (SELECT id FROM contents WHERE hash = sha256(NEW.content)) END,
117
+ buffer = CASE WHEN NEW.state = 'active' THEN NEW.content END,
118
+ lines = CASE WHEN length(NEW.content) = 0 THEN 0
119
+ ELSE length(NEW.content) - length(replace(NEW.content, char(10), ''))
120
+ + length(NEW.content) - length(replace(NEW.content, char(13), ''))
121
+ - (length(NEW.content) - length(replace(NEW.content, char(13) || char(10), ''))) / 2
122
+ + CASE WHEN substr(NEW.content, -1) IN (char(10), char(13)) THEN 0 ELSE 1 END END
123
+ WHERE entry_id = OLD.entry_id AND name = OLD.name
124
+ AND (NEW.content IS NOT OLD.content OR (NEW.state = 'active') IS NOT (OLD.state = 'active'));
125
+ UPDATE entry_channel_rows
126
+ SET mimetype = NEW.mimetype, weight = NEW.weight, state = NEW.state, producer_result = NEW.producer_result
127
+ WHERE entry_id = OLD.entry_id AND name = OLD.name
128
+ AND (NEW.mimetype IS NOT OLD.mimetype OR NEW.weight IS NOT OLD.weight
129
+ OR NEW.state IS NOT OLD.state OR NEW.producer_result IS NOT OLD.producer_result);
130
+ UPDATE entry_channel_rows
131
+ SET deep_hash = NEW.deep_hash
132
+ WHERE entry_id = OLD.entry_id AND name = OLD.name AND NEW.deep_hash IS NOT OLD.deep_hash;
133
+ END;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plurnk/plurnk-service",
3
- "version": "1.21.0",
3
+ "version": "1.22.0",
4
4
  "description": "Plurnk agent runtime — the server / engine / core. Implements the @plurnk/plurnk-contracts contract.",
5
5
  "keywords": [
6
6
  "plurnk",
@@ -25,6 +25,10 @@
25
25
  "types": "./dist/digest/Digest.d.ts",
26
26
  "default": "./dist/digest/Digest.js"
27
27
  },
28
+ "./share": {
29
+ "types": "./dist/share/Share.d.ts",
30
+ "default": "./dist/share/Share.js"
31
+ },
28
32
  "./package.json": "./package.json"
29
33
  },
30
34
  "bin": {
@@ -61,7 +65,7 @@
61
65
  "fixture:demo": "node --conditions=plurnk-dev test/demo/_fixture.ts",
62
66
  "test": "npm run test:lint && npm run test:unit && npm run test:intg",
63
67
  "digest:missing": "node --conditions=plurnk-dev bin/digest-missing.ts",
64
- "dev:digest": "node --conditions=plurnk-dev bin/digest.ts",
68
+ "share": "node --conditions=plurnk-dev src/service.ts share",
65
69
  "build:clean": "rm -rf dist",
66
70
  "build:dist": "tsc -p tsconfig.build.json",
67
71
  "build:sql": "node --conditions=plurnk-dev scripts/copy-sql.mjs",
@@ -86,24 +90,24 @@
86
90
  "@opentelemetry/resources": "^2.11.0",
87
91
  "@opentelemetry/sdk-metrics": "^2.11.0",
88
92
  "@opentelemetry/sdk-trace-base": "^2.11.0",
89
- "@plurnk/plurnk-a2a": "1.21.0",
90
- "@plurnk/plurnk-agui": "1.21.0",
91
- "@plurnk/plurnk-contracts": "1.21.0",
92
- "@plurnk/plurnk-parser": "1.21.0",
93
- "@plurnk/plurnk-schedule": "1.21.0",
94
- "@plurnk/plurnk-execs": "1.21.0",
95
- "@plurnk/plurnk-execs-common": "1.21.0",
96
- "@plurnk/plurnk-execs-jq": "1.21.0",
97
- "@plurnk/plurnk-execs-sqlite": "1.21.0",
98
- "@plurnk/plurnk-hooks": "1.21.0",
99
- "@plurnk/plurnk-mcp": "1.21.0",
100
- "@plurnk/plurnk-meta": "1.21.0",
101
- "@plurnk/plurnk-agent-skills": "1.21.0",
102
- "@plurnk/plurnk-mimetypes": "1.21.0",
103
- "@plurnk/plurnk-mimetypes-application-ipynb": "1.21.0",
104
- "@plurnk/plurnk-mimetypes-application-json": "1.21.0",
105
- "@plurnk/plurnk-mimetypes-application-jsonl": "1.21.0",
106
- "@plurnk/plurnk-mimetypes-application-xml": "1.21.0",
93
+ "@plurnk/plurnk-a2a": "1.22.0",
94
+ "@plurnk/plurnk-agui": "1.22.0",
95
+ "@plurnk/plurnk-contracts": "1.22.0",
96
+ "@plurnk/plurnk-parser": "1.22.0",
97
+ "@plurnk/plurnk-schedule": "1.22.0",
98
+ "@plurnk/plurnk-execs": "1.22.0",
99
+ "@plurnk/plurnk-execs-common": "1.22.0",
100
+ "@plurnk/plurnk-execs-jq": "1.22.0",
101
+ "@plurnk/plurnk-execs-sqlite": "1.22.0",
102
+ "@plurnk/plurnk-hooks": "1.22.0",
103
+ "@plurnk/plurnk-mcp": "1.22.0",
104
+ "@plurnk/plurnk-meta": "1.22.0",
105
+ "@plurnk/plurnk-agent-skills": "1.22.0",
106
+ "@plurnk/plurnk-mimetypes": "1.22.0",
107
+ "@plurnk/plurnk-mimetypes-application-ipynb": "1.22.0",
108
+ "@plurnk/plurnk-mimetypes-application-json": "1.22.0",
109
+ "@plurnk/plurnk-mimetypes-application-jsonl": "1.22.0",
110
+ "@plurnk/plurnk-mimetypes-application-xml": "1.22.0",
107
111
  "@plurnk/plurnk-mimetypes-grammar-bash": "1.16.2",
108
112
  "@plurnk/plurnk-mimetypes-grammar-c": "1.16.2",
109
113
  "@plurnk/plurnk-mimetypes-grammar-cpp": "1.16.2",
@@ -130,29 +134,30 @@
130
134
  "@plurnk/plurnk-mimetypes-grammar-typescript": "1.16.2",
131
135
  "@plurnk/plurnk-mimetypes-grammar-yaml": "1.16.2",
132
136
  "@plurnk/plurnk-mimetypes-grammar-zig": "1.16.2",
133
- "@plurnk/plurnk-mimetypes-application-pdf": "1.21.0",
134
- "@plurnk/plurnk-mimetypes-image": "1.21.0",
135
- "@plurnk/plurnk-mimetypes-audio": "1.21.0",
136
- "@plurnk/plurnk-mimetypes-text-csv": "1.21.0",
137
- "@plurnk/plurnk-mimetypes-text-diff": "1.21.0",
138
- "@plurnk/plurnk-mimetypes-text-dotenv": "1.21.0",
139
- "@plurnk/plurnk-mimetypes-text-html": "1.21.0",
140
- "@plurnk/plurnk-mimetypes-text-ini": "1.21.0",
141
- "@plurnk/plurnk-mimetypes-text-markdown": "1.21.0",
142
- "@plurnk/plurnk-mimetypes-text-plain": "1.21.0",
143
- "@plurnk/plurnk-models": "1.21.0",
144
- "@plurnk/plurnk-providers": "1.21.0",
145
- "@plurnk/plurnk-schemes": "1.21.0",
146
- "@plurnk/plurnk-schemes-http": "1.21.0",
137
+ "@plurnk/plurnk-mimetypes-application-pdf": "1.22.0",
138
+ "@plurnk/plurnk-mimetypes-image": "1.22.0",
139
+ "@plurnk/plurnk-mimetypes-audio": "1.22.0",
140
+ "@plurnk/plurnk-mimetypes-text-csv": "1.22.0",
141
+ "@plurnk/plurnk-mimetypes-text-diff": "1.22.0",
142
+ "@plurnk/plurnk-mimetypes-text-dotenv": "1.22.0",
143
+ "@plurnk/plurnk-mimetypes-text-html": "1.22.0",
144
+ "@plurnk/plurnk-mimetypes-text-ini": "1.22.0",
145
+ "@plurnk/plurnk-mimetypes-text-markdown": "1.22.0",
146
+ "@plurnk/plurnk-mimetypes-text-plain": "1.22.0",
147
+ "@plurnk/plurnk-models": "1.22.0",
148
+ "@plurnk/plurnk-providers": "1.22.0",
149
+ "@plurnk/plurnk-schemes": "1.22.0",
150
+ "@plurnk/plurnk-schemes-http": "1.22.0",
147
151
  "@plurnk/plurnk-schemes-http-tavily": "^1.19.1",
148
152
  "@possumtech/sqlrite": "^6.5.3",
149
- "diff": "^9.0.0",
150
- "yaml": "^2.9.0"
153
+ "diff": "^9.0.0"
151
154
  },
152
155
  "devDependencies": {
156
+ "@a2a-js/sdk": "1.2.1",
153
157
  "@modelcontextprotocol/server": "2.0.0",
154
158
  "@opentelemetry/core": "^2.11.0",
155
- "@types/diff": "^7.0.2"
159
+ "marked": "^18.0.14",
160
+ "zod": "4.6.5"
156
161
  },
157
162
  "homepage": "https://github.com/plurnk/plurnk-service/tree/main/plurnk-core#readme",
158
163
  "bugs": {