@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,16 +1,21 @@
1
+ import { createPatch } from "diff";
2
+ import { isBinaryMimetype, isJsonMimetype, TEXT_PRIMITIVE_MIMETYPE } from "../core/mimetype-binary.js";
3
+ import { sliceLines, sliceJsonItems, applyLineMarkerEdit, applyJsonItemEdit } from "../core/line-marker.js";
4
+ import { matchAgainstContent } from "../core/matcher.js";
5
+ import { resolveEntryMimetype } from "../core/path-mimetype.js";
1
6
  const pathnameOf = (statement) => {
2
- const path = statement.path;
3
- if (path === null)
7
+ const t = statement.target;
8
+ if (t === null)
4
9
  throw new Error("unreachable");
5
- if (path.kind === "url")
6
- return path.pathname;
7
- return path.raw;
10
+ if (t.kind === "url")
11
+ return t.pathname;
12
+ return t.raw;
8
13
  };
9
14
  const fragmentOf = (statement) => {
10
- const path = statement.path;
11
- if (path === null || path.kind !== "url")
15
+ const t = statement.target;
16
+ if (t === null || t.kind !== "url")
12
17
  return null;
13
- return path.fragment;
18
+ return t.fragment;
14
19
  };
15
20
  const resolveChannel = (fragment, channels, defaultChannel) => {
16
21
  const target = fragment ?? defaultChannel;
@@ -19,10 +24,8 @@ const resolveChannel = (fragment, channels, defaultChannel) => {
19
24
  return target;
20
25
  };
21
26
  export const editSessionEntry = async (statement, ctx, manifest) => {
22
- if (statement.path === null)
27
+ if (statement.target === null)
23
28
  return { status: 400, entryId: null, channel: null };
24
- if (statement.lineMarker !== null)
25
- return { status: 501, entryId: null, channel: null };
26
29
  const { db, sessionId, runId } = ctx;
27
30
  const { name: scheme, channels, defaultChannel } = manifest;
28
31
  const fragment = fragmentOf(statement);
@@ -35,6 +38,52 @@ export const editSessionEntry = async (statement, ctx, manifest) => {
35
38
  if (existing === undefined && fragment !== null) {
36
39
  return { status: 404, entryId: null, channel: targetChannel };
37
40
  }
41
+ // Effective mimetype for this entry. Per plurnk-grammar 0.14.0:
42
+ // "Path suffix declares mimetype; absent suffix defers to scheme default."
43
+ // `known://users.json` → application/json (extension wins).
44
+ // `known://users` → text/markdown (scheme manifest default).
45
+ const channelManifestDefault = channels[targetChannel];
46
+ const effectiveMimetype = await resolveEntryMimetype(pathname, channelManifestDefault, ctx.mimetypes);
47
+ // 415 on binary entries (per AGENTS.md "Resolved ambiguities" §2).
48
+ if (existing !== undefined) {
49
+ const channel = await db.ops_read_channel.get({
50
+ session_id: sessionId, scheme, pathname, channel: targetChannel,
51
+ });
52
+ if (channel !== undefined && isBinaryMimetype(channel.mimetype)) {
53
+ return { status: 415, entryId: existing.id, channel: targetChannel };
54
+ }
55
+ }
56
+ if (isBinaryMimetype(effectiveMimetype)) {
57
+ return { status: 415, entryId: existing?.id ?? null, channel: targetChannel };
58
+ }
59
+ const body = statement.body ?? "";
60
+ // Read current content unconditionally for diff generation (M.12 —
61
+ // surface diff in EDIT response so wrong-marker mistakes are visible).
62
+ let originalContent = "";
63
+ if (existing !== undefined) {
64
+ const channel = await db.ops_read_channel.get({
65
+ session_id: sessionId, scheme, pathname, channel: targetChannel,
66
+ });
67
+ originalContent = channel?.content ?? "";
68
+ }
69
+ // `<L>` line marker EDIT semantics. Dispatch on effective mimetype:
70
+ // JSON → applyJsonItemEdit (structural item edit, plurnk-grammar 0.13.0);
71
+ // otherwise → applyLineMarkerEdit (line edit, original semantics).
72
+ // On a non-existent entry, body becomes the content regardless of marker
73
+ // (per "Resolved ambiguities" §3 — sentinels/positions only apply to
74
+ // existing content).
75
+ let newContent;
76
+ if (statement.lineMarker !== null && existing !== undefined) {
77
+ const result = isJsonMimetype(effectiveMimetype)
78
+ ? applyJsonItemEdit(originalContent, statement.lineMarker, body)
79
+ : applyLineMarkerEdit(originalContent, statement.lineMarker, body);
80
+ if (result.status !== 200)
81
+ return { status: result.status, entryId: existing.id, channel: targetChannel };
82
+ newContent = result.result ?? "";
83
+ }
84
+ else {
85
+ newContent = body;
86
+ }
38
87
  let entryId;
39
88
  let createdNow;
40
89
  if (existing === undefined) {
@@ -48,41 +97,26 @@ export const editSessionEntry = async (statement, ctx, manifest) => {
48
97
  entryId = existing.id;
49
98
  createdNow = false;
50
99
  }
51
- const body = statement.body ?? "";
52
- const upsertChannel = db.ops_upsert_channel;
53
- const writeVisibility = db.crud_write_visibility;
54
- if (fragment === null) {
55
- // Default-channel EDIT — write target channel + preview companion.
56
- await upsertChannel.run({ entry_id: entryId, name: targetChannel, content: body, mimetype: channels[targetChannel] });
57
- await writeVisibility.run({ run_id: runId, entry_id: entryId, channel: targetChannel });
58
- if ("preview" in channels && targetChannel !== "preview") {
59
- // v0: preview is a verbatim copy of body. MimetypeHandler.preview()
60
- // will refine this in a later PR (per SPEC §5.1).
61
- await upsertChannel.run({ entry_id: entryId, name: "preview", content: body, mimetype: channels.preview });
62
- await writeVisibility.run({ run_id: runId, entry_id: entryId, channel: "preview" });
63
- }
64
- }
65
- else {
66
- // Fragment-targeted EDIT — write only that channel.
67
- await upsertChannel.run({ entry_id: entryId, name: targetChannel, content: body, mimetype: channels[targetChannel] });
68
- await writeVisibility.run({ run_id: runId, entry_id: entryId, channel: targetChannel });
69
- }
100
+ await db.ops_upsert_channel.run({ entry_id: entryId, name: targetChannel, content: newContent, mimetype: effectiveMimetype });
101
+ await db.crud_write_visibility.run({ run_id: runId, entry_id: entryId, channel: targetChannel });
70
102
  if (Array.isArray(statement.signal)) {
71
103
  for (const tag of statement.signal) {
72
104
  await db.crud_write_tag.run({ entry_id: entryId, tag });
73
105
  }
74
106
  }
75
- return { status: createdNow ? 201 : 200, entryId, channel: targetChannel };
107
+ // M.12 diff: surface what actually changed so model sees the result
108
+ // of its EDIT without a follow-up READ. Skip if content is identical
109
+ // (no-op edit). Path-format string is just the entry's URI for the
110
+ // model's correlation; consumers (digest, intg) parse the unified
111
+ // diff body.
112
+ const diff = originalContent !== newContent
113
+ ? createPatch(`${scheme}://${pathname}`, originalContent, newContent, "current", "proposed")
114
+ : undefined;
115
+ return { status: createdNow ? 201 : 200, entryId, channel: targetChannel, diff };
76
116
  };
77
117
  export const readSessionEntry = async (statement, ctx, manifest) => {
78
- if (statement.path === null)
118
+ if (statement.target === null)
79
119
  return { status: 400, content: null, mimetype: null, channel: null };
80
- if (statement.lineMarker !== null)
81
- return { status: 501, content: null, mimetype: null, channel: null };
82
- if (statement.body !== null)
83
- return { status: 501, content: null, mimetype: null, channel: null };
84
- if (Array.isArray(statement.signal) && statement.signal.length > 0)
85
- return { status: 501, content: null, mimetype: null, channel: null };
86
120
  const { db, sessionId } = ctx;
87
121
  const { name: scheme, channels, defaultChannel } = manifest;
88
122
  const fragment = fragmentOf(statement);
@@ -95,51 +129,214 @@ export const readSessionEntry = async (statement, ctx, manifest) => {
95
129
  });
96
130
  if (row === undefined)
97
131
  return { status: 404, content: null, mimetype: null, channel: targetChannel };
98
- return { status: 200, content: row.content, mimetype: row.mimetype, channel: targetChannel };
132
+ if (isBinaryMimetype(row.mimetype)) {
133
+ return { status: 415, content: null, mimetype: row.mimetype, channel: targetChannel };
134
+ }
135
+ // `[tag]` filter: entry must have ALL requested tags. Mismatch = 404
136
+ // (entry doesn't match the tag-scoped READ).
137
+ if (Array.isArray(statement.signal) && statement.signal.length > 0) {
138
+ const entry = await db.crud_find_session_entry.get({ session_id: sessionId, scheme, pathname });
139
+ if (entry === undefined)
140
+ return { status: 404, content: null, mimetype: null, channel: targetChannel };
141
+ const tagRows = await db.crud_read_tags.all({ entry_id: entry.id });
142
+ const have = new Set(tagRows.map((r) => r.tag));
143
+ for (const want of statement.signal) {
144
+ if (!have.has(want))
145
+ return { status: 404, content: null, mimetype: null, channel: targetChannel };
146
+ }
147
+ }
148
+ // `<L>` scopes; body matches within the scope. Slot order in plurnk.md
149
+ // is `<L>?:body?`, so the natural composition is slice-then-match.
150
+ // `<L>` dispatches on source mimetype (plurnk-grammar 0.13.0):
151
+ // line-navigable (text/markdown, source) → sliceLines (line index)
152
+ // JSON → sliceJsonItems (item index)
153
+ // XML/HTML → sliceLines (defer XML structural)
154
+ let workingContent = row.content;
155
+ let workingStart = 1;
156
+ let workingMimetypeForSlice = TEXT_PRIMITIVE_MIMETYPE;
157
+ if (statement.lineMarker !== null) {
158
+ if (isJsonMimetype(row.mimetype)) {
159
+ const sliced = sliceJsonItems(row.content, statement.lineMarker);
160
+ if (sliced.status !== 200)
161
+ return { status: sliced.status, content: null, mimetype: row.mimetype, channel: targetChannel };
162
+ workingContent = sliced.body ?? "[]";
163
+ workingStart = null;
164
+ workingMimetypeForSlice = "application/json";
165
+ }
166
+ else {
167
+ const sliced = sliceLines(row.content, statement.lineMarker);
168
+ if (sliced.status !== 200)
169
+ return { status: sliced.status, content: null, mimetype: row.mimetype, channel: targetChannel };
170
+ workingContent = sliced.text ?? "";
171
+ workingStart = sliced.startLine ?? null;
172
+ }
173
+ }
174
+ if (statement.body !== null) {
175
+ const matched = matchAgainstContent(statement.body, workingContent, row.mimetype, workingStart ?? 1);
176
+ if (matched.status === 204) {
177
+ return { status: 204, content: "", mimetype: "application/json", channel: targetChannel, startLine: null, matches: 0 };
178
+ }
179
+ if (matched.status !== 200)
180
+ return { status: matched.status, content: null, mimetype: row.mimetype, channel: targetChannel };
181
+ // Matcher result body is a pretty-printed JSON array of per-match
182
+ // rows {line, matched, matching?}; mimetype is JSON regardless of
183
+ // source. startLine=null because line info is denormalized into
184
+ // each row (no parallel array needed).
185
+ return { status: 200, content: matched.body ?? "[]", mimetype: "application/json", channel: targetChannel, startLine: null, matches: matched.matches };
186
+ }
187
+ if (statement.lineMarker !== null) {
188
+ // `<L>` slice mimetype follows the source family:
189
+ // line-navigable source → text/markdown (text primitive)
190
+ // JSON source → application/json (preserve structure for compose)
191
+ // Workspace `<L>` empty case (sentinel <0>/<-1>) is 204.
192
+ // For JSON sources sliceJsonItems returns body="[]" on sentinels;
193
+ // we treat empty array as 204 here for shape consistency.
194
+ const isEmptyJsonArray = workingMimetypeForSlice === "application/json" && workingContent === "[]";
195
+ if (workingContent === "" || isEmptyJsonArray) {
196
+ return { status: 204, content: "", mimetype: workingMimetypeForSlice, channel: targetChannel, startLine: null };
197
+ }
198
+ return { status: 200, content: workingContent, mimetype: workingMimetypeForSlice, channel: targetChannel, startLine: workingStart };
199
+ }
200
+ if (row.content === "") {
201
+ return { status: 204, content: "", mimetype: row.mimetype, channel: targetChannel, startLine: null };
202
+ }
203
+ return { status: 200, content: row.content, mimetype: row.mimetype, channel: targetChannel, startLine: 1 };
204
+ };
205
+ // Paginate a list of items per a `<L>` results marker. Sentinels <0> and
206
+ // <-1> select empty (insertion points have no result content).
207
+ const paginateResults = (items, marker) => {
208
+ const total = items.length;
209
+ const { first, last } = marker;
210
+ if (last === null) {
211
+ if (first === 0 || first === -1)
212
+ return { status: 200, items: [] };
213
+ if (first > 0 && first <= total)
214
+ return { status: 200, items: [items[first - 1]] };
215
+ return { status: 416 };
216
+ }
217
+ let n = first;
218
+ let m = last;
219
+ if (n === 0)
220
+ n = 1;
221
+ if (m === -1)
222
+ m = total;
223
+ if (n < 1 || n > total)
224
+ return { status: 416 };
225
+ if (m < 1 || m > total)
226
+ return { status: 416 };
227
+ if (n > m)
228
+ return { status: 416 };
229
+ return { status: 200, items: items.slice(n - 1, m) };
99
230
  };
100
231
  const setSessionEntryVisibility = async (statement, ctx, manifest, target) => {
101
- if (statement.path === null)
232
+ if (statement.target === null)
102
233
  return { status: 400 };
103
- if (statement.lineMarker !== null)
104
- return { status: 501 };
105
- if (statement.body !== null)
106
- return { status: 501 };
107
- if (Array.isArray(statement.signal) && statement.signal.length > 0)
108
- return { status: 501 };
109
234
  const { db, sessionId, runId } = ctx;
110
235
  const { name: scheme, channels, defaultChannel } = manifest;
111
236
  const fragment = fragmentOf(statement);
112
- const pathname = pathnameOf(statement);
113
- const entry = await db.crud_find_session_entry.get({ session_id: sessionId, scheme, pathname });
114
- if (entry === undefined)
115
- return { status: 404 };
116
- const upsertVis = db.ops_upsert_visibility;
117
- if (fragment === null) {
118
- // Fragment-less SHOW/HIDE flip every channel of the entry.
119
- const existing = await db.ops_list_visibility_for_entry.all({
120
- run_id: runId, entry_id: entry.id,
237
+ const isMultiEntry = statement.body !== null
238
+ || (Array.isArray(statement.signal) && statement.signal.length > 0)
239
+ || statement.lineMarker !== null;
240
+ if (!isMultiEntry) {
241
+ // Single-entry path: exact pathname lookup.
242
+ const pathname = pathnameOf(statement);
243
+ const entry = await db.crud_find_session_entry.get({ session_id: sessionId, scheme, pathname });
244
+ if (entry === undefined)
245
+ return { status: 404 };
246
+ const upsertVis = db.ops_upsert_visibility;
247
+ if (fragment === null) {
248
+ const existing = await db.ops_list_visibility_for_entry.all({
249
+ run_id: runId, entry_id: entry.id,
250
+ });
251
+ const existingByName = new Map(existing.map((r) => [r.channel, r.indexed]));
252
+ let changed = 0;
253
+ for (const channelName of Object.keys(channels)) {
254
+ if (existingByName.get(channelName) === target)
255
+ continue;
256
+ await upsertVis.run({ run_id: runId, entry_id: entry.id, channel: channelName, indexed: target });
257
+ changed += 1;
258
+ }
259
+ return { status: changed === 0 ? 304 : 200 };
260
+ }
261
+ const targetChannel = resolveChannel(fragment, channels, defaultChannel);
262
+ if (targetChannel === null)
263
+ return { status: 400 };
264
+ const current = await db.ops_get_visibility_for_channel.get({
265
+ run_id: runId, entry_id: entry.id, channel: targetChannel,
121
266
  });
122
- const existingByName = new Map(existing.map((r) => [r.channel, r.indexed]));
123
- let changed = 0;
124
- for (const channelName of Object.keys(channels)) {
125
- if (existingByName.get(channelName) === target)
126
- continue;
127
- await upsertVis.run({ run_id: runId, entry_id: entry.id, channel: channelName, indexed: target });
128
- changed += 1;
267
+ if (current?.indexed === target)
268
+ return { status: 304 };
269
+ await upsertVis.run({ run_id: runId, entry_id: entry.id, channel: targetChannel, indexed: target });
270
+ return { status: 200 };
271
+ }
272
+ // Multi-entry path: target is treated as a pathname GLOB scope. Body
273
+ // matcher (glob/regex) further filters by pathname; xpath/jsonpath
274
+ // would filter by content (501 pending plurnk-mimetypes#3). Tag
275
+ // signal filters by tag. <L> paginates the matched results.
276
+ let regexFilter = null;
277
+ let pathnameGlob = null;
278
+ if (statement.body !== null) {
279
+ if (statement.body.dialect === "glob") {
280
+ pathnameGlob = statement.body.raw;
281
+ }
282
+ else if (statement.body.dialect === "regex") {
283
+ try {
284
+ regexFilter = new RegExp(statement.body.pattern, statement.body.flags);
285
+ }
286
+ catch {
287
+ return { status: 400 };
288
+ }
289
+ }
290
+ else {
291
+ return { status: 501 };
129
292
  }
130
- return { status: changed === 0 ? 304 : 200 };
131
293
  }
132
- // Fragment-targeted SHOW/HIDE — flip only that channel.
133
- const targetChannel = resolveChannel(fragment, channels, defaultChannel);
134
- if (targetChannel === null)
135
- return { status: 400 };
136
- const current = await db.ops_get_visibility_for_channel.get({
137
- run_id: runId, entry_id: entry.id, channel: targetChannel,
294
+ const scopePathname = pathnameOf(statement);
295
+ const scopeGlob = scopePathname.length > 0 ? `${scopePathname}*` : null;
296
+ const tags = Array.isArray(statement.signal) ? statement.signal : [];
297
+ const tagsParam = tags.length > 0 ? JSON.stringify(tags) : "[]";
298
+ const rows = await db.find_session_entries.all({
299
+ session_id: sessionId, scheme,
300
+ scope_pathname: scopeGlob,
301
+ pathname_pattern: pathnameGlob,
302
+ tags: tagsParam,
138
303
  });
139
- if (current?.indexed === target)
304
+ let pathnames = rows.map((r) => r.pathname);
305
+ if (regexFilter !== null)
306
+ pathnames = pathnames.filter((p) => regexFilter.test(p));
307
+ if (statement.lineMarker !== null) {
308
+ const page = paginateResults(pathnames, statement.lineMarker);
309
+ if (page.status !== 200)
310
+ return { status: page.status };
311
+ pathnames = page.items ?? [];
312
+ }
313
+ if (pathnames.length === 0)
140
314
  return { status: 304 };
141
- await upsertVis.run({ run_id: runId, entry_id: entry.id, channel: targetChannel, indexed: target });
142
- return { status: 200 };
315
+ // Resolve fragment to a target channel (applies uniformly across matches).
316
+ let scopeChannel = null;
317
+ if (fragment !== null) {
318
+ scopeChannel = resolveChannel(fragment, channels, defaultChannel);
319
+ if (scopeChannel === null)
320
+ return { status: 400 };
321
+ }
322
+ const upsertVis = db.ops_upsert_visibility;
323
+ let changed = 0;
324
+ for (const p of pathnames) {
325
+ const e = await db.crud_find_session_entry.get({ session_id: sessionId, scheme, pathname: p });
326
+ if (e === undefined)
327
+ continue;
328
+ const channelsToFlip = scopeChannel !== null ? [scopeChannel] : Object.keys(channels);
329
+ for (const channelName of channelsToFlip) {
330
+ const current = await db.ops_get_visibility_for_channel.get({
331
+ run_id: runId, entry_id: e.id, channel: channelName,
332
+ });
333
+ if (current?.indexed === target)
334
+ continue;
335
+ await upsertVis.run({ run_id: runId, entry_id: e.id, channel: channelName, indexed: target });
336
+ changed += 1;
337
+ }
338
+ }
339
+ return { status: changed === 0 ? 304 : 200 };
143
340
  };
144
341
  export const showSessionEntry = async (statement, ctx, manifest) => setSessionEntryVisibility(statement, ctx, manifest, 1);
145
342
  export const hideSessionEntry = async (statement, ctx, manifest) => setSessionEntryVisibility(statement, ctx, manifest, 0);
@@ -1 +1 @@
1
- {"version":3,"file":"_entry-ops.js","sourceRoot":"","sources":["../../src/schemes/_entry-ops.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"_entry-ops.js","sourceRoot":"","sources":["../../src/schemes/_entry-ops.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"_entry-send.d.ts","sourceRoot":"","sources":["../../src/schemes/_entry-send.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAInE,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAeD,eAAO,MAAM,kBAAkB,GAAU,WAAW,aAAa,EAAE,KAAK,mBAAmB,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,UAAU,CAiC/H,CAAC"}
1
+ {"version":3,"file":"_entry-send.d.ts","sourceRoot":"","sources":["../../src/schemes/_entry-send.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAInE,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAeD,eAAO,MAAM,kBAAkB,GAAU,WAAW,aAAa,EAAE,KAAK,mBAAmB,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,UAAU,CAuC/H,CAAC"}
@@ -4,7 +4,7 @@
4
4
  import { deleteEntry } from "./_entry-crud.js";
5
5
  import { findActiveSubscription } from "../core/ChannelWrite.js";
6
6
  const pathnameOf = (statement) => {
7
- const path = statement.path;
7
+ const path = statement.target;
8
8
  if (path === null)
9
9
  return null;
10
10
  if (path.kind === "url")
@@ -12,25 +12,32 @@ const pathnameOf = (statement) => {
12
12
  return path.raw;
13
13
  };
14
14
  const fragmentOf = (statement) => {
15
- const path = statement.path;
15
+ const path = statement.target;
16
16
  if (path === null || path.kind !== "url")
17
17
  return null;
18
18
  return path.fragment;
19
19
  };
20
20
  export const sendToSessionEntry = async (statement, ctx, scheme) => {
21
- if (statement.path === null)
21
+ if (statement.target === null)
22
22
  return { status: 400, error: "directed SEND requires a path" };
23
23
  const status = statement.signal;
24
24
  if (status === null)
25
25
  return { status: 400, error: "SEND requires a numeric status code" };
26
- // SEND[410] Gone — delete the targeted resource (SPEC §3.5).
26
+ // SEND[410] Gone — delete the targeted resource (SPEC §3.5). With a
27
+ // #fragment, deletes just that channel; without, deletes the whole entry.
27
28
  if (status === 410) {
28
- if (fragmentOf(statement) !== null) {
29
- return { status: 400, error: "channel-level deletion (SEND[410] with #fragment) not yet supported" };
30
- }
31
29
  const pathname = pathnameOf(statement);
32
30
  if (pathname === null)
33
31
  return { status: 400 };
32
+ const fragment = fragmentOf(statement);
33
+ if (fragment !== null) {
34
+ const { db, sessionId } = ctx;
35
+ const entry = await db.crud_find_session_entry.get({ session_id: sessionId, scheme, pathname });
36
+ if (entry === undefined)
37
+ return { status: 404 };
38
+ const deleted = await db.crud_delete_channel.get({ entry_id: entry.id, name: fragment });
39
+ return { status: deleted === undefined ? 404 : 200 };
40
+ }
34
41
  const result = await deleteEntry(pathname, ctx, scheme);
35
42
  return { status: result.status };
36
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"_entry-send.js","sourceRoot":"","sources":["../../src/schemes/_entry-send.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"_entry-send.js","sourceRoot":"","sources":["../../src/schemes/_entry-send.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { WebSocket } from "ws";
2
2
  import type Engine from "../core/Engine.ts";
3
3
  import type MethodRegistry from "./MethodRegistry.ts";
4
- import type { NotifyTarget, Provider } from "./MethodRegistry.ts";
4
+ import type { DaemonSurface, NotifyTarget, Provider } from "./MethodRegistry.ts";
5
5
  import type { Db } from "../core/Db.ts";
6
6
  import type { ClientEnvelope } from "./envelope.ts";
7
7
  export interface ClientConnectionOptions {
@@ -10,11 +10,12 @@ export interface ClientConnectionOptions {
10
10
  db: Db;
11
11
  engine: Engine;
12
12
  provider: Provider | null;
13
+ daemon: DaemonSurface;
13
14
  broadcast: (target: NotifyTarget, from: ClientConnection, method: string, params?: unknown) => void;
14
15
  }
15
16
  export default class ClientConnection {
16
17
  #private;
17
- constructor({ ws, registry, db, engine, provider, broadcast }: ClientConnectionOptions);
18
+ constructor({ ws, registry, db, engine, provider, daemon, broadcast }: ClientConnectionOptions);
18
19
  get session(): ClientEnvelope | null;
19
20
  sendNotification(method: string, params?: unknown): void;
20
21
  close(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"ClientConnection.d.ts","sourceRoot":"","sources":["../../src/server/ClientConnection.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAkB,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AA+BpD,MAAM,WAAW,uBAAuB;IACpC,EAAE,EAAE,SAAS,CAAC;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,EAAE,EAAE,EAAE,CAAC;IACP,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACvG;AAED,MAAM,CAAC,OAAO,OAAO,gBAAgB;;gBASrB,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,uBAAuB;IAUtF,IAAI,OAAO,IAAI,cAAc,GAAG,IAAI,CAEnC;IAED,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;IAMxD,KAAK,IAAI,IAAI;CAmFhB"}
1
+ {"version":3,"file":"ClientConnection.d.ts","sourceRoot":"","sources":["../../src/server/ClientConnection.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAkB,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AA+BpD,MAAM,WAAW,uBAAuB;IACpC,EAAE,EAAE,SAAS,CAAC;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,EAAE,EAAE,EAAE,CAAC;IACP,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACvG;AAED,MAAM,CAAC,OAAO,OAAO,gBAAgB;;gBAUrB,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,uBAAuB;IAW9F,IAAI,OAAO,IAAI,cAAc,GAAG,IAAI,CAEnC;IAED,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;IAMxD,KAAK,IAAI,IAAI;CAyFhB"}
@@ -17,14 +17,16 @@ export default class ClientConnection {
17
17
  #db;
18
18
  #engine;
19
19
  #provider;
20
+ #daemon;
20
21
  #broadcast;
21
22
  #session = null;
22
- constructor({ ws, registry, db, engine, provider, broadcast }) {
23
+ constructor({ ws, registry, db, engine, provider, daemon, broadcast }) {
23
24
  this.#ws = ws;
24
25
  this.#registry = registry;
25
26
  this.#db = db;
26
27
  this.#engine = engine;
27
28
  this.#provider = provider;
29
+ this.#daemon = daemon;
28
30
  this.#broadcast = broadcast;
29
31
  this.#ws.on("message", (data) => this.#handleMessage(data));
30
32
  }
@@ -39,7 +41,12 @@ export default class ClientConnection {
39
41
  }
40
42
  close() {
41
43
  if (this.#session !== null) {
42
- void closeClientLoop(this.#db, this.#session.clientLoopId, 200);
44
+ // Only close the loop if one was actually allocated. A
45
+ // connection that only ran loop.run never spawned a client
46
+ // loop and has nothing to clean up here.
47
+ if (this.#session.clientLoopId !== null) {
48
+ void closeClientLoop(this.#db, this.#session.clientLoopId, 200);
49
+ }
43
50
  this.#session = null;
44
51
  }
45
52
  if (this.#ws.readyState === 1)
@@ -88,6 +95,7 @@ export default class ClientConnection {
88
95
  db: this.#db,
89
96
  engine: this.#engine,
90
97
  provider: this.#provider,
98
+ daemon: this.#daemon,
91
99
  session: this.#session,
92
100
  attachSession: (envelope) => {
93
101
  if (this.#session !== null) {
@@ -1 +1 @@
1
- {"version":3,"file":"ClientConnection.js","sourceRoot":"","sources":["../../src/server/ClientConnection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ClientConnection.js","sourceRoot":"","sources":["../../src/server/ClientConnection.ts"],"names":[],"mappings":"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"}