@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,6 +1,51 @@
1
1
  import { readFile, realpath, writeFile } from "node:fs/promises";
2
2
  import { resolve, relative, isAbsolute } from "node:path";
3
3
  import { createPatch } from "diff";
4
+ import { writeEntry } from "./_entry-crud.js";
5
+ import { isBinaryMimetype, isJsonMimetype, normalizeAutoTextMimetype, TEXT_PRIMITIVE_MIMETYPE } from "../core/mimetype-binary.js";
6
+ import { sliceLines, sliceJsonItems, applyLineMarkerEdit, applyJsonItemEdit } from "../core/line-marker.js";
7
+ import { matchAgainstContent } from "../core/matcher.js";
8
+ // Workspace root for file ops is sourced from `sessions.project_root`,
9
+ // supplied by the client at session.create or session.set_root (issue
10
+ // #150 wired the RPC; F.1 added the column). Server doesn't guess —
11
+ // the client owns workspace identity. If a session is headless
12
+ // (project_root=null), file ops fail at 400; the client either supplies
13
+ // a root or the op isn't appropriate for this session.
14
+ const loadSessionRoot = async (db, sessionId) => {
15
+ const row = await db.envelope_get_session.get({ id: sessionId });
16
+ return row?.project_root ?? null;
17
+ };
18
+ // Resolve + workspace-root containment check. Returns the canonical
19
+ // path on success; classified error on absence/traversal. Used by read.
20
+ // Detect mimetype from a file's path. Routes through the Mimetypes service
21
+ // when available; falls back to the text primitive (text/markdown). The
22
+ // `normalizeAutoTextMimetype` wrapper ensures text/plain returned by the
23
+ // service is normalized to text/markdown — plurnk-service never auto-
24
+ // derives text/plain (see mimetype-binary.ts TEXT_PRIMITIVE_MIMETYPE).
25
+ const detectFileMimetype = async (canonical, ctx) => {
26
+ if (ctx.mimetypes !== undefined) {
27
+ const detected = await ctx.mimetypes.detect({ path: canonical });
28
+ return normalizeAutoTextMimetype(detected);
29
+ }
30
+ return TEXT_PRIMITIVE_MIMETYPE;
31
+ };
32
+ const resolveContained = async (pathname, root) => {
33
+ const requested = isAbsolute(pathname) ? pathname : resolve(root, pathname);
34
+ let canonical;
35
+ try {
36
+ canonical = await realpath(requested);
37
+ }
38
+ catch (err) {
39
+ if (err.code === "ENOENT") {
40
+ return { error: "not-found" };
41
+ }
42
+ throw err;
43
+ }
44
+ const rel = relative(root, canonical);
45
+ if (rel.startsWith("..") || isAbsolute(rel))
46
+ return { error: "traversal" };
47
+ return { canonical, root };
48
+ };
4
49
  export default class File {
5
50
  static manifest = {
6
51
  name: "file",
@@ -15,80 +60,92 @@ export default class File {
15
60
  proposes: true, // file writes go through proposal lifecycle (task #42)
16
61
  },
17
62
  };
18
- #workspaceRoot = null;
19
- #resolveWorkspaceRoot() {
20
- if (this.#workspaceRoot !== null)
21
- return this.#workspaceRoot;
22
- const root = process.env.PLURNK_WORKSPACE_ROOT;
23
- if (root === undefined || root === "")
24
- return null;
25
- this.#workspaceRoot = resolve(root);
26
- return this.#workspaceRoot;
27
- }
28
- // Resolve + workspace-root containment check. Returns null on absence;
29
- // throws on traversal escape. Used by both read and edit.
30
- async #resolveContained(pathname) {
31
- const root = this.#resolveWorkspaceRoot();
32
- if (root === null)
33
- return { error: "no-root" };
34
- const requested = isAbsolute(pathname) ? pathname : resolve(root, pathname);
35
- let canonical;
36
- try {
37
- canonical = await realpath(requested);
63
+ async read(statement, ctx) {
64
+ if (statement.target === null)
65
+ return { status: 400, content: null, mimetype: null, error: "READ requires a target path" };
66
+ if (Array.isArray(statement.signal) && statement.signal.length > 0) {
67
+ // file:// entries don't carry tag metadata (tags belong to canonical
68
+ // entries; file entries are disk-truth). A tag-filtered READ on a
69
+ // file path will never match — 404 by definition.
70
+ return { status: 404, content: null, mimetype: null };
38
71
  }
39
- catch (err) {
40
- if (err.code === "ENOENT") {
41
- // For edit, missing target is OK we'll write it. Caller
42
- // distinguishes by checking error === "not-found".
43
- return { error: "not-found" };
44
- }
45
- throw err;
46
- }
47
- const rel = relative(root, canonical);
48
- if (rel.startsWith("..") || isAbsolute(rel))
49
- return { error: "traversal" };
50
- return { canonical, root };
51
- }
52
- async read(statement, _ctx) {
53
- if (statement.path === null)
54
- return { status: 400, content: null, mimetype: null };
55
- if (statement.lineMarker !== null)
56
- return { status: 501, content: null, mimetype: null };
57
- if (statement.body !== null)
58
- return { status: 501, content: null, mimetype: null };
59
- if (Array.isArray(statement.signal) && statement.signal.length > 0)
60
- return { status: 501, content: null, mimetype: null };
61
- const pathname = statement.path.kind === "url" ? statement.path.pathname : statement.path.raw;
62
- const resolved = await this.#resolveContained(pathname);
72
+ const root = await loadSessionRoot(ctx.db, ctx.sessionId);
73
+ if (root === null)
74
+ return { status: 400, content: null, mimetype: null, error: "session has no project_root; cannot READ files" };
75
+ const pathname = statement.target.kind === "url" ? statement.target.pathname : statement.target.raw;
76
+ const resolved = await resolveContained(pathname, root);
63
77
  if ("error" in resolved) {
64
- if (resolved.error === "no-root")
65
- return { status: 400, content: null, mimetype: null };
66
78
  if (resolved.error === "not-found")
67
79
  return { status: 404, content: null, mimetype: null };
68
- return { status: 403, content: null, mimetype: null }; // traversal
80
+ return { status: 403, content: null, mimetype: null };
69
81
  }
82
+ const mimetype = await detectFileMimetype(resolved.canonical, ctx);
83
+ if (isBinaryMimetype(mimetype))
84
+ return { status: 415, content: null, mimetype };
70
85
  const content = await readFile(resolved.canonical, "utf8");
71
- return { status: 200, content, mimetype: "text/plain" };
86
+ // `<L>` scopes; body matches within the scope (slice-then-match).
87
+ // `<L>` dispatches on source mimetype (plurnk-grammar 0.13.0):
88
+ // JSON → sliceJsonItems (item index)
89
+ // line-navigable → sliceLines (line index)
90
+ let workingContent = content;
91
+ let workingStart = 1;
92
+ let workingMimetypeForSlice = TEXT_PRIMITIVE_MIMETYPE;
93
+ if (statement.lineMarker !== null) {
94
+ if (isJsonMimetype(mimetype)) {
95
+ const sliced = sliceJsonItems(content, statement.lineMarker);
96
+ if (sliced.status !== 200)
97
+ return { status: sliced.status, content: null, mimetype };
98
+ workingContent = sliced.body ?? "[]";
99
+ workingStart = null;
100
+ workingMimetypeForSlice = "application/json";
101
+ }
102
+ else {
103
+ const sliced = sliceLines(content, statement.lineMarker);
104
+ if (sliced.status !== 200)
105
+ return { status: sliced.status, content: null, mimetype };
106
+ workingContent = sliced.text ?? "";
107
+ workingStart = sliced.startLine ?? null;
108
+ }
109
+ }
110
+ if (statement.body !== null) {
111
+ const matched = matchAgainstContent(statement.body, workingContent, mimetype, workingStart ?? 1);
112
+ if (matched.status === 204) {
113
+ return { status: 204, content: "", mimetype: "application/json", startLine: null, matches: 0 };
114
+ }
115
+ if (matched.status !== 200)
116
+ return { status: matched.status, content: null, mimetype };
117
+ return { status: 200, content: matched.body ?? "[]", mimetype: "application/json", startLine: null, matches: matched.matches };
118
+ }
119
+ if (statement.lineMarker !== null) {
120
+ const isEmptyJsonArray = workingMimetypeForSlice === "application/json" && workingContent === "[]";
121
+ if (workingContent === "" || isEmptyJsonArray) {
122
+ return { status: 204, content: "", mimetype: workingMimetypeForSlice, startLine: null };
123
+ }
124
+ return { status: 200, content: workingContent, mimetype: workingMimetypeForSlice, startLine: workingStart };
125
+ }
126
+ if (content === "")
127
+ return { status: 204, content: "", mimetype, startLine: null };
128
+ return { status: 200, content, mimetype, startLine: 1 };
72
129
  }
73
130
  // Edit op (task #42 canonical proposal consumer). Returns status=202
74
131
  // with a udiff body for client review + attrs carrying the full patched
75
132
  // content. Engine writes the proposed log entry, pauses dispatch, and
76
133
  // calls applyResolution() (below) after the proposal accepts.
77
- async edit(statement, _ctx) {
78
- if (statement.path === null)
134
+ async edit(statement, ctx) {
135
+ if (statement.target === null)
79
136
  return { status: 400, error: "EDIT requires a path" };
80
- if (statement.lineMarker !== null)
81
- return { status: 501, error: "lineMarker-based edits not yet supported" };
82
- const pathname = statement.path.kind === "url" ? statement.path.pathname : statement.path.raw;
83
- const root = this.#resolveWorkspaceRoot();
84
- if (root === null)
85
- return { status: 400, error: "PLURNK_WORKSPACE_ROOT must be set" };
137
+ const root = await loadSessionRoot(ctx.db, ctx.sessionId);
138
+ if (root === null) {
139
+ return { status: 400, error: "session has no project_root; client must call session.create({projectRoot}) or session.set_root({projectRoot}) before file ops" };
140
+ }
141
+ const pathname = statement.target.kind === "url" ? statement.target.pathname : statement.target.raw;
86
142
  // Containment check (canonical path inside workspace). For edits,
87
143
  // a not-found target is fine — we're proposing to create or
88
144
  // overwrite. Traversal escape is fatal.
89
145
  let canonical;
90
146
  const requested = isAbsolute(pathname) ? pathname : resolve(root, pathname);
91
147
  let original = "";
148
+ let fileExists = true;
92
149
  try {
93
150
  canonical = await realpath(requested);
94
151
  original = await readFile(canonical, "utf8");
@@ -96,17 +153,39 @@ export default class File {
96
153
  catch (err) {
97
154
  if (err.code !== "ENOENT")
98
155
  throw err;
99
- // File doesn't exist — propose to create it.
100
156
  canonical = requested;
157
+ fileExists = false;
101
158
  }
102
- // Re-check containment against the (now-resolved-or-fabricated)
103
- // canonical path. The requested path could resolve to a parent of
104
- // workspace via symlink; reject.
159
+ // Re-check containment against the canonical path. Symlinks could
160
+ // escape workspace; reject.
105
161
  const rel = relative(root, canonical);
106
162
  if (rel.startsWith("..") || isAbsolute(rel)) {
107
163
  return { status: 403, error: "path escapes workspace root" };
108
164
  }
109
- const patched = statement.body ?? "";
165
+ // 415 on binary entries (per AGENTS.md "Resolved ambiguities" §2).
166
+ // Existing file's mimetype takes precedence; for new files, derive
167
+ // from the proposed path so we don't accept binary writes via edit.
168
+ const mimetype = await detectFileMimetype(canonical, ctx);
169
+ if (isBinaryMimetype(mimetype))
170
+ return { status: 415, error: `cannot EDIT binary mimetype \`${mimetype}\`` };
171
+ // `<L>` line marker dispatches on file mimetype: JSON →
172
+ // applyJsonItemEdit (structural item edit); otherwise →
173
+ // applyLineMarkerEdit (line edit). On a non-existent file,
174
+ // body becomes content regardless of marker (per "Resolved
175
+ // ambiguities" §3).
176
+ const body = statement.body ?? "";
177
+ let patched;
178
+ if (statement.lineMarker !== null && fileExists) {
179
+ const result = isJsonMimetype(mimetype)
180
+ ? applyJsonItemEdit(original, statement.lineMarker, body)
181
+ : applyLineMarkerEdit(original, statement.lineMarker, body);
182
+ if (result.status !== 200)
183
+ return { status: result.status, error: result.error };
184
+ patched = result.result ?? "";
185
+ }
186
+ else {
187
+ patched = body;
188
+ }
110
189
  const patch = createPatch(rel, original, patched, "current", "proposed");
111
190
  return {
112
191
  status: 202,
@@ -114,28 +193,38 @@ export default class File {
114
193
  attrs: {
115
194
  path: rel,
116
195
  canonical,
117
- patch, // full udiff (sent to client for render)
118
- patched, // full new content (used by applyResolution)
196
+ patch,
197
+ patched,
119
198
  },
199
+ // Surface the diff at the result level too — the log render
200
+ // emits it for the model to see what changed (M.12).
201
+ diff: original !== patched ? patch : undefined,
120
202
  };
121
203
  }
122
204
  // applyResolution — called by Engine.dispatch after a proposed log
123
- // entry resolves with decision=accept. Reads the attrs that the
124
- // earlier edit() returned and writes the patched content to disk.
125
- // Returns the final outcome that gets stored on the log entry.
126
- async applyResolution(args) {
205
+ // entry resolves with decision=accept. Two responsibilities:
206
+ // 1. Write the patched content to disk.
207
+ // 2. Register an entries+visibility row so the file appears in
208
+ // the next packet's # Plurnk System Index. Without (2), the
209
+ // model has no artifact of completion to read and tends to
210
+ // re-EDIT the same file across turns. The index is what tells
211
+ // the model "your prior work landed."
212
+ async applyResolution(args, ctx) {
127
213
  const { attrs, body } = args;
128
214
  const canonical = attrs.canonical;
215
+ const relPath = attrs.path;
129
216
  const patched = body ?? attrs.patched;
130
217
  if (typeof canonical !== "string" || canonical.length === 0) {
131
218
  return { status: 500, outcome: "applyResolution: missing attrs.canonical" };
132
219
  }
220
+ if (typeof relPath !== "string" || relPath.length === 0) {
221
+ return { status: 500, outcome: "applyResolution: missing attrs.path" };
222
+ }
133
223
  if (typeof patched !== "string") {
134
224
  return { status: 500, outcome: "applyResolution: missing patched content" };
135
225
  }
136
226
  try {
137
227
  await writeFile(canonical, patched, "utf8");
138
- return { status: 200 };
139
228
  }
140
229
  catch (err) {
141
230
  return {
@@ -144,6 +233,33 @@ export default class File {
144
233
  body: err instanceof Error ? err.message : String(err),
145
234
  };
146
235
  }
236
+ // Register the file as an indexed entry so the next packet's
237
+ // # Plurnk System Index shows it under file://<relPath> with
238
+ // the body content visible. mimetype is best-effort by file
239
+ // extension; .md → text/markdown, anything else → text/plain.
240
+ const mimetype = relPath.endsWith(".md") ? "text/markdown" : "text/plain";
241
+ try {
242
+ // scheme=null: the "file" scheme is a routing internal only;
243
+ // never stored. Entries.scheme stays NULL for filesystem rows
244
+ // so render-time bare-path output requires no special case.
245
+ await writeEntry(relPath, {
246
+ channels: { body: { content: patched, mimetype } },
247
+ tags: [],
248
+ }, ctx, null);
249
+ }
250
+ catch (err) {
251
+ // Disk write succeeded; entry registration failed. Surface
252
+ // the write as 200 (file is on disk) but log the failure —
253
+ // index just won't reflect it until next time.
254
+ // (Could harden to roll back the file write; for v0,
255
+ // disk-truth-of-record wins.)
256
+ return {
257
+ status: 200,
258
+ outcome: "indexed_failed",
259
+ body: err instanceof Error ? err.message : String(err),
260
+ };
261
+ }
262
+ return { status: 200 };
147
263
  }
148
264
  }
149
265
  //# sourceMappingURL=File.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"File.js","sourceRoot":"","sources":["../../src/schemes/File.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"File.js","sourceRoot":"","sources":["../../src/schemes/File.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAInC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAClI,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC5G,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAYzD,uEAAuE;AACvE,sEAAsE;AACtE,oEAAoE;AACpE,+DAA+D;AAC/D,wEAAwE;AACxE,uDAAuD;AACvD,MAAM,eAAe,GAAG,KAAK,EAAE,EAAM,EAAE,SAAiB,EAA0B,EAAE;IAChF,MAAM,GAAG,GAAG,MAAO,EAAE,CAAC,oBAAmC,CAAC,GAAG,CAAkC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAClH,OAAO,GAAG,EAAE,YAAY,IAAI,IAAI,CAAC;AACrC,CAAC,CAAC;AAMF,oEAAoE;AACpE,wEAAwE;AACxE,2EAA2E;AAC3E,wEAAwE;AACxE,yEAAyE;AACzE,sEAAsE;AACtE,uEAAuE;AACvE,MAAM,kBAAkB,GAAG,KAAK,EAAE,SAAiB,EAAE,GAAwB,EAAmB,EAAE;IAC9F,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACjE,OAAO,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,uBAAuB,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,KAAK,EAAE,QAAgB,EAAE,IAAY,EAA8B,EAAE;IAC1F,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5E,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACD,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAClC,CAAC;QACD,MAAM,GAAG,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACtC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAC3E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,IAAI;IACrB,MAAM,CAAC,QAAQ,GAAmB;QAC9B,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,EAAE,EAAG,sCAAsC;QACrD,cAAc,EAAE,MAAM;QACtB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC;QACzC,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,IAAI;QAClB,KAAK,EAAE;YACH,QAAQ,EAAE,IAAI,EAAG,uDAAuD;SAC3E;KACJ,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;QAC3H,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjE,qEAAqE;YACrE,kEAAkE;YAClE,kDAAkD;YAClD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC1D,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC;QAElI,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;QACpG,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YACtB,IAAI,QAAQ,CAAC,KAAK,KAAK,WAAW;gBAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC1F,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC1D,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACnE,IAAI,gBAAgB,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAEhF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAE3D,kEAAkE;QAClE,+DAA+D;QAC/D,uCAAuC;QACvC,6CAA6C;QAC7C,IAAI,cAAc,GAAG,OAAO,CAAC;QAC7B,IAAI,YAAY,GAAkB,CAAC,CAAC;QACpC,IAAI,uBAAuB,GAAG,uBAAuB,CAAC;QACtD,IAAI,SAAS,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAChC,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG;oBAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;gBACrF,cAAc,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;gBACrC,YAAY,GAAG,IAAI,CAAC;gBACpB,uBAAuB,GAAG,kBAAkB,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACJ,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;gBACzD,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG;oBAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;gBACrF,cAAc,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACnC,YAAY,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;YAC5C,CAAC;QACL,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC;YACjG,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACzB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YACnG,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YACvF,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QACnI,CAAC;QACD,IAAI,SAAS,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAChC,MAAM,gBAAgB,GAAG,uBAAuB,KAAK,kBAAkB,IAAI,cAAc,KAAK,IAAI,CAAC;YACnG,IAAI,cAAc,KAAK,EAAE,IAAI,gBAAgB,EAAE,CAAC;gBAC5C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,uBAAuB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC5F,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,uBAAuB,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;QAChH,CAAC;QACD,IAAI,OAAO,KAAK,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACnF,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC5D,CAAC;IAED,qEAAqE;IACrE,wEAAwE;IACxE,sEAAsE;IACtE,8DAA8D;IAC9D,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;QAErF,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAChB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,gIAAgI,EAAE,CAAC;QACpK,CAAC;QAED,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;QACpG,kEAAkE;QAClE,4DAA4D;QAC5D,wCAAwC;QACxC,IAAI,SAAiB,CAAC;QACtB,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5E,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,UAAU,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC;YACD,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;YACtC,QAAQ,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;YAChE,SAAS,GAAG,SAAS,CAAC;YACtB,UAAU,GAAG,KAAK,CAAC;QACvB,CAAC;QACD,kEAAkE;QAClE,4BAA4B;QAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;QACjE,CAAC;QAED,mEAAmE;QACnE,mEAAmE;QACnE,oEAAoE;QACpE,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC1D,IAAI,gBAAgB,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,iCAAiC,QAAQ,IAAI,EAAE,CAAC;QAE7G,wDAAwD;QACxD,wDAAwD;QACxD,2DAA2D;QAC3D,2DAA2D;QAC3D,oBAAoB;QACpB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC;QAClC,IAAI,OAAe,CAAC;QACpB,IAAI,SAAS,CAAC,UAAU,KAAK,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC;gBACnC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC;gBACzD,CAAC,CAAC,mBAAmB,CAAC,QAAQ,EAAE,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAChE,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACjF,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAClC,CAAC;aAAM,CAAC;YACJ,OAAO,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QACzE,OAAO;YACH,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,KAAK;YACX,KAAK,EAAE;gBACH,IAAI,EAAE,GAAG;gBACT,SAAS;gBACT,KAAK;gBACL,OAAO;aACV;YACD,4DAA4D;YAC5D,qDAAqD;YACrD,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SACjD,CAAC;IACN,CAAC;IAED,mEAAmE;IACnE,6DAA6D;IAC7D,0CAA0C;IAC1C,iEAAiE;IACjE,iEAAiE;IACjE,gEAAgE;IAChE,mEAAmE;IACnE,2CAA2C;IAC3C,KAAK,CAAC,eAAe,CAAC,IAAe,EAAE,GAAwB;QAC3D,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAClC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC;QACtC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC;QAChF,CAAC;QACD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,qCAAqC,EAAE,CAAC;QAC3E,CAAC;QACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC;QAChF,CAAC;QACD,IAAI,CAAC;YACD,MAAM,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO;gBACH,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,cAAc;gBACvB,IAAI,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACzD,CAAC;QACN,CAAC;QACD,6DAA6D;QAC7D,6DAA6D;QAC7D,4DAA4D;QAC5D,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC;QAC1E,IAAI,CAAC;YACD,6DAA6D;YAC7D,8DAA8D;YAC9D,4DAA4D;YAC5D,MAAM,UAAU,CAAC,OAAO,EAAE;gBACtB,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;gBAClD,IAAI,EAAE,EAAE;aACX,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,2DAA2D;YAC3D,2DAA2D;YAC3D,+CAA+C;YAC/C,qDAAqD;YACrD,8BAA8B;YAC9B,OAAO;gBACH,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,gBAAgB;gBACzB,IAAI,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACzD,CAAC;QACN,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC3B,CAAC"}
@@ -5,7 +5,7 @@ import { findSessionEntries } from "./_entry-find.js";
5
5
  export default class Known {
6
6
  static manifest = {
7
7
  name: "known",
8
- channels: { body: "text/markdown", preview: "text/markdown" },
8
+ channels: { body: "text/markdown" },
9
9
  defaultChannel: "body",
10
10
  category: "data",
11
11
  scope: "session",
@@ -1 +1 @@
1
- {"version":3,"file":"Known.js","sourceRoot":"","sources":["../../src/schemes/Known.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEzG,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtD,MAAM,CAAC,OAAO,OAAO,KAAK;IACtB,MAAM,CAAC,QAAQ,GAAmB;QAC9B,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE;QAC7D,cAAc,EAAE,MAAM;QACtB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC/B,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,IAAI;KACrB,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,OAAO,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,OAAO,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwC,EAAE,GAAwB;QACzE,OAAO,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwC,EAAE,GAAwB;QACzE,OAAO,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,GAAwB;QACtD,OAAO,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,KAAgB,EAAE,GAAwB;QACzE,OAAO,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,GAAwB;QACxD,OAAO,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,OAAO,kBAAkB,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,OAAO,kBAAkB,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC"}
1
+ {"version":3,"file":"Known.js","sourceRoot":"","sources":["../../src/schemes/Known.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEzG,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtD,MAAM,CAAC,OAAO,OAAO,KAAK;IACtB,MAAM,CAAC,QAAQ,GAAmB;QAC9B,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;QACnC,cAAc,EAAE,MAAM;QACtB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC/B,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,IAAI;KACrB,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,OAAO,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,OAAO,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwC,EAAE,GAAwB;QACzE,OAAO,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwC,EAAE,GAAwB;QACzE,OAAO,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,GAAwB;QACtD,OAAO,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,KAAgB,EAAE,GAAwB;QACzE,OAAO,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,GAAwB;QACxD,OAAO,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,OAAO,kBAAkB,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,OAAO,kBAAkB,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC"}
@@ -1,13 +1,21 @@
1
- import type { ReadStatement } from "@plurnk/plurnk-grammar";
1
+ import type { HideStatement, ReadStatement, ShowStatement } from "@plurnk/plurnk-grammar";
2
2
  import type { SchemeManifest, PlurnkSchemeContext } from "../core/scheme-types.ts";
3
3
  type ReadResult = {
4
4
  status: number;
5
5
  content: string | null;
6
6
  mimetype: string | null;
7
+ startLine?: number | null;
8
+ matches?: number | null;
9
+ };
10
+ type ShowHideResult = {
11
+ status: number;
7
12
  };
8
13
  export default class Log {
14
+ #private;
9
15
  static manifest: SchemeManifest;
10
16
  read(statement: ReadStatement, ctx: PlurnkSchemeContext): Promise<ReadResult>;
17
+ show(statement: ShowStatement, ctx: PlurnkSchemeContext): Promise<ShowHideResult>;
18
+ hide(statement: HideStatement, ctx: PlurnkSchemeContext): Promise<ShowHideResult>;
11
19
  }
12
20
  export {};
13
21
  //# sourceMappingURL=Log.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Log.d.ts","sourceRoot":"","sources":["../../src/schemes/Log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnF,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAItF,MAAM,CAAC,OAAO,OAAO,GAAG;IACpB,MAAM,CAAC,QAAQ,EAAE,cAAc,CAS7B;IAEI,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;CA6BtF"}
1
+ {"version":3,"file":"Log.d.ts","sourceRoot":"","sources":["../../src/schemes/Log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE1F,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAKnF,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAC1I,KAAK,cAAc,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAiBzC,MAAM,CAAC,OAAO,OAAO,GAAG;;IACpB,MAAM,CAAC,QAAQ,EAAE,cAAc,CAS7B;IAEI,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;IA0F7E,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;IAIjF,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;CAmB1F"}
@@ -1,4 +1,20 @@
1
- const COORDINATE = /^(\d+)\/(\d+)\/(\d+)$/;
1
+ import { sliceLines, sliceJsonItems } from "../core/line-marker.js";
2
+ import { matchAgainstContent } from "../core/matcher.js";
3
+ import { isJsonMimetype, TEXT_PRIMITIVE_MIMETYPE } from "../core/mimetype-binary.js";
4
+ // log://<loop_seq>/<turn_seq>/<sequence>[/<op>] — the trailing /op segment
5
+ // is wire-rendering self-documentation derived from the row's `op` field;
6
+ // parsing accepts it (or omits it) and identifies the row by coordinate.
7
+ const COORDINATE = /^(\d+)\/(\d+)\/(\d+)(?:\/([A-Z]+))?$/;
8
+ const parseCoordinate = (pathname) => {
9
+ const match = COORDINATE.exec(pathname);
10
+ if (match === null)
11
+ return null;
12
+ return {
13
+ loopSeq: Number(match[1]),
14
+ turnSeq: Number(match[2]),
15
+ sequence: Number(match[3]),
16
+ };
17
+ };
2
18
  export default class Log {
3
19
  static manifest = {
4
20
  name: "log",
@@ -6,33 +22,118 @@ export default class Log {
6
22
  defaultChannel: "",
7
23
  category: "logging",
8
24
  scope: "session",
9
- writableBy: ["system"], // engine-only writes; model & client read
25
+ writableBy: ["system"], // engine-only writes; model & client read + show/hide
10
26
  volatile: false,
11
27
  modelVisible: true,
12
28
  };
13
29
  async read(statement, ctx) {
14
30
  const { db, runId } = ctx;
15
- if (statement.path === null)
31
+ if (statement.target === null)
16
32
  return { status: 400, content: null, mimetype: null };
17
- if (statement.lineMarker !== null)
18
- return { status: 501, content: null, mimetype: null };
19
- if (statement.body !== null)
20
- return { status: 501, content: null, mimetype: null };
21
- if (Array.isArray(statement.signal) && statement.signal.length > 0)
22
- return { status: 501, content: null, mimetype: null };
23
- const pathname = statement.path.kind === "url" ? statement.path.pathname : statement.path.raw;
24
- const match = COORDINATE.exec(pathname);
25
- if (match === null)
33
+ // log:// entries have no tag concept (engine-written events).
34
+ if (Array.isArray(statement.signal) && statement.signal.length > 0) {
35
+ return { status: 404, content: null, mimetype: null };
36
+ }
37
+ const pathname = statement.target.kind === "url" ? statement.target.pathname : statement.target.raw;
38
+ const coord = parseCoordinate(pathname);
39
+ if (coord === null)
26
40
  return { status: 400, content: null, mimetype: null };
27
- const loopSeq = Number(match[1]);
28
- const turnSeq = Number(match[2]);
29
- const actionIndex = Number(match[3]);
30
- const row = await db.log_read_by_coordinate.get({ run_id: runId, loop_seq: loopSeq, turn_seq: turnSeq, action_index: actionIndex });
41
+ const row = await db.log_read_by_coordinate.get({ run_id: runId, loop_seq: coord.loopSeq, turn_seq: coord.turnSeq, sequence: coord.sequence });
31
42
  if (row === undefined)
32
43
  return { status: 404, content: null, mimetype: null };
33
- const target = row.target_scheme !== null ? `${row.target_scheme}://${row.target_pathname ?? ""}` : (row.target_pathname ?? "(no path)");
34
- const summary = `${row.op} ${target}\nstatus: ${row.status_rx}\nresponse: ${row.rx}`;
35
- return { status: 200, content: summary, mimetype: "text/plain" };
44
+ // Unwrap the stored rx (JSON-serialized DispatchResult). The original
45
+ // op's body is at rx.content with its own mimetype at rx.mimetype.
46
+ // Returning rx.content directly (NOT a "EDIT target\nstatus: N\n
47
+ // response: …" summary wrap) is what makes matcher chaining work:
48
+ // `<<READ(log://N/M/K):$[0].matched:READ` then sees the prior op's
49
+ // actual result body and can jsonpath / xpath it cleanly.
50
+ //
51
+ // For ops that don't produce a content body (EDIT/COPY/MOVE/SEND
52
+ // return status+metadata), surface the rx itself as a JSON document
53
+ // so the model can still inspect what happened.
54
+ let underlyingContent;
55
+ let underlyingMimetype;
56
+ try {
57
+ const rx = JSON.parse(row.rx);
58
+ if (typeof rx.content === "string") {
59
+ underlyingContent = rx.content;
60
+ underlyingMimetype = typeof rx.mimetype === "string" ? rx.mimetype : "text/plain";
61
+ }
62
+ else {
63
+ // Non-content op (EDIT/SEND/etc.) — render the whole rx as JSON.
64
+ underlyingContent = JSON.stringify(rx, null, 2);
65
+ underlyingMimetype = "application/json";
66
+ }
67
+ }
68
+ catch {
69
+ underlyingContent = row.rx;
70
+ underlyingMimetype = "text/plain";
71
+ }
72
+ // `<L>` scopes; body matches within the scope (slice-then-match).
73
+ // `<L>` dispatches on the unwrapped rx's mimetype: JSON → sliceJsonItems,
74
+ // line-navigable → sliceLines. This is what makes
75
+ // <<READ(log://N/M/K)<1>::READ pick the first item of a matcher result.
76
+ let workingContent = underlyingContent;
77
+ let workingStart = 1;
78
+ let workingMimetypeForSlice = TEXT_PRIMITIVE_MIMETYPE;
79
+ if (statement.lineMarker !== null) {
80
+ if (isJsonMimetype(underlyingMimetype)) {
81
+ const sliced = sliceJsonItems(underlyingContent, statement.lineMarker);
82
+ if (sliced.status !== 200)
83
+ return { status: sliced.status, content: null, mimetype: underlyingMimetype };
84
+ workingContent = sliced.body ?? "[]";
85
+ workingStart = null;
86
+ workingMimetypeForSlice = "application/json";
87
+ }
88
+ else {
89
+ const sliced = sliceLines(underlyingContent, statement.lineMarker);
90
+ if (sliced.status !== 200)
91
+ return { status: sliced.status, content: null, mimetype: underlyingMimetype };
92
+ workingContent = sliced.text ?? "";
93
+ workingStart = sliced.startLine ?? null;
94
+ }
95
+ }
96
+ if (statement.body !== null) {
97
+ const matched = matchAgainstContent(statement.body, workingContent, underlyingMimetype, workingStart ?? 1);
98
+ if (matched.status === 204) {
99
+ return { status: 204, content: "", mimetype: "application/json", startLine: null, matches: 0 };
100
+ }
101
+ if (matched.status !== 200)
102
+ return { status: matched.status, content: null, mimetype: underlyingMimetype };
103
+ return { status: 200, content: matched.body ?? "[]", mimetype: "application/json", startLine: null, matches: matched.matches };
104
+ }
105
+ if (statement.lineMarker !== null) {
106
+ const isEmptyJsonArray = workingMimetypeForSlice === "application/json" && workingContent === "[]";
107
+ if (workingContent === "" || isEmptyJsonArray) {
108
+ return { status: 204, content: "", mimetype: workingMimetypeForSlice, startLine: null };
109
+ }
110
+ return { status: 200, content: workingContent, mimetype: workingMimetypeForSlice, startLine: workingStart };
111
+ }
112
+ if (underlyingContent === "")
113
+ return { status: 204, content: "", mimetype: underlyingMimetype, startLine: null };
114
+ return { status: 200, content: underlyingContent, mimetype: underlyingMimetype, startLine: 1 };
115
+ }
116
+ async show(statement, ctx) {
117
+ return this.#setIndexed(statement, ctx, 1);
118
+ }
119
+ async hide(statement, ctx) {
120
+ return this.#setIndexed(statement, ctx, 0);
121
+ }
122
+ async #setIndexed(statement, ctx, indexed) {
123
+ if (statement.target === null)
124
+ return { status: 400 };
125
+ if (statement.lineMarker !== null)
126
+ return { status: 501 };
127
+ const { db, runId } = ctx;
128
+ const pathname = statement.target.kind === "url" ? statement.target.pathname : statement.target.raw;
129
+ const coord = parseCoordinate(pathname);
130
+ if (coord === null)
131
+ return { status: 400 };
132
+ const updated = await db.log_set_indexed.get({
133
+ run_id: runId, loop_seq: coord.loopSeq, turn_seq: coord.turnSeq,
134
+ sequence: coord.sequence, indexed,
135
+ });
136
+ return { status: updated === undefined ? 404 : 200 };
36
137
  }
37
138
  }
38
139
  //# sourceMappingURL=Log.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Log.js","sourceRoot":"","sources":["../../src/schemes/Log.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Log.js","sourceRoot":"","sources":["../../src/schemes/Log.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAKrF,2EAA2E;AAC3E,0EAA0E;AAC1E,yEAAyE;AACzE,MAAM,UAAU,GAAG,sCAAsC,CAAC;AAE1D,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAiE,EAAE;IACxG,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO;QACH,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KAC7B,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,GAAG;IACpB,MAAM,CAAC,QAAQ,GAAmB;QAC9B,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,EAAE,EAAG,kDAAkD;QACjE,cAAc,EAAE,EAAE;QAClB,QAAQ,EAAE,SAAS;QACnB,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAG,sDAAsD;QAC/E,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,IAAI;KACrB,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;QAC1B,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACrF,8DAA8D;QAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC1D,CAAC;QAED,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;QACpG,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAE1E,MAAM,GAAG,GAAG,MAAO,EAAE,CAAC,sBAAqC,CAAC,GAAG,CAO5D,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAElG,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAE7E,sEAAsE;QACtE,mEAAmE;QACnE,iEAAiE;QACjE,kEAAkE;QAClE,mEAAmE;QACnE,0DAA0D;QAC1D,EAAE;QACF,iEAAiE;QACjE,oEAAoE;QACpE,gDAAgD;QAChD,IAAI,iBAAyB,CAAC;QAC9B,IAAI,kBAA0B,CAAC;QAC/B,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAA8C,CAAC;YAC3E,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACjC,iBAAiB,GAAG,EAAE,CAAC,OAAO,CAAC;gBAC/B,kBAAkB,GAAG,OAAO,EAAE,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;YACtF,CAAC;iBAAM,CAAC;gBACJ,iEAAiE;gBACjE,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAChD,kBAAkB,GAAG,kBAAkB,CAAC;YAC5C,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,iBAAiB,GAAG,GAAG,CAAC,EAAE,CAAC;YAC3B,kBAAkB,GAAG,YAAY,CAAC;QACtC,CAAC;QAED,kEAAkE;QAClE,0EAA0E;QAC1E,kDAAkD;QAClD,wEAAwE;QACxE,IAAI,cAAc,GAAG,iBAAiB,CAAC;QACvC,IAAI,YAAY,GAAkB,CAAC,CAAC;QACpC,IAAI,uBAAuB,GAAG,uBAAuB,CAAC;QACtD,IAAI,SAAS,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAChC,IAAI,cAAc,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG,cAAc,CAAC,iBAAiB,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;gBACvE,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG;oBAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;gBACzG,cAAc,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;gBACrC,YAAY,GAAG,IAAI,CAAC;gBACpB,uBAAuB,GAAG,kBAAkB,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACJ,MAAM,MAAM,GAAG,UAAU,CAAC,iBAAiB,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;gBACnE,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG;oBAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;gBACzG,cAAc,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACnC,YAAY,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;YAC5C,CAAC;QACL,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC;YAC3G,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACzB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YACnG,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;YAC3G,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QACnI,CAAC;QACD,IAAI,SAAS,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAChC,MAAM,gBAAgB,GAAG,uBAAuB,KAAK,kBAAkB,IAAI,cAAc,KAAK,IAAI,CAAC;YACnG,IAAI,cAAc,KAAK,EAAE,IAAI,gBAAgB,EAAE,CAAC;gBAC5C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,uBAAuB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC5F,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,uBAAuB,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;QAChH,CAAC;QACD,IAAI,iBAAiB,KAAK,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACjH,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAwB;QACzD,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAwC,EAAE,GAAwB,EAAE,OAAc;QAChG,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACtD,IAAI,SAAS,CAAC,UAAU,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAE1D,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;QAC1B,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;QACpG,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAE3C,MAAM,OAAO,GAAG,MAAO,EAAE,CAAC,eAA8B,CAAC,GAAG,CAAiB;YACzE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO;YAC/D,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,OAAO;SACpC,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACzD,CAAC"}