@plurnk/plurnk-service 0.7.0 → 0.9.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.
- package/SPEC.md +116 -83
- package/bin/plurnk-service.ts +132 -0
- package/dist/Paths.d.ts +8 -0
- package/dist/Paths.d.ts.map +1 -0
- package/dist/Paths.js +47 -0
- package/dist/Paths.js.map +1 -0
- package/dist/content/index.d.ts +9 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +10 -0
- package/dist/content/index.js.map +1 -0
- package/dist/content/line-marker.d.ts +26 -0
- package/dist/content/line-marker.d.ts.map +1 -0
- package/dist/content/line-marker.js +323 -0
- package/dist/content/line-marker.js.map +1 -0
- package/dist/content/matcher.d.ts +15 -0
- package/dist/content/matcher.d.ts.map +1 -0
- package/dist/content/matcher.js +112 -0
- package/dist/content/matcher.js.map +1 -0
- package/dist/content/mimetype-binary.d.ts +9 -0
- package/dist/content/mimetype-binary.d.ts.map +1 -0
- package/dist/content/mimetype-binary.js +86 -0
- package/dist/content/mimetype-binary.js.map +1 -0
- package/dist/content/path-mimetype.d.ts +6 -0
- package/dist/content/path-mimetype.d.ts.map +1 -0
- package/dist/content/path-mimetype.js +49 -0
- package/dist/content/path-mimetype.js.map +1 -0
- package/dist/content/read-resolve.d.ts +20 -0
- package/dist/content/read-resolve.d.ts.map +1 -0
- package/dist/content/read-resolve.js +60 -0
- package/dist/content/read-resolve.js.map +1 -0
- package/dist/core/ChannelWrite.d.ts +35 -30
- package/dist/core/ChannelWrite.d.ts.map +1 -1
- package/dist/core/ChannelWrite.js +49 -41
- package/dist/core/ChannelWrite.js.map +1 -1
- package/dist/core/Engine.d.ts +16 -10
- package/dist/core/Engine.d.ts.map +1 -1
- package/dist/core/Engine.js +309 -115
- package/dist/core/Engine.js.map +1 -1
- package/dist/core/EnvFlags.d.ts +6 -3
- package/dist/core/EnvFlags.d.ts.map +1 -1
- package/dist/core/EnvFlags.js +62 -60
- package/dist/core/EnvFlags.js.map +1 -1
- package/dist/core/ExecutorRegistry.d.ts +26 -0
- package/dist/core/ExecutorRegistry.d.ts.map +1 -0
- package/dist/core/ExecutorRegistry.js +99 -0
- package/dist/core/ExecutorRegistry.js.map +1 -0
- package/dist/core/PluginLoader.d.ts +6 -3
- package/dist/core/PluginLoader.d.ts.map +1 -1
- package/dist/core/PluginLoader.js +77 -73
- package/dist/core/PluginLoader.js.map +1 -1
- package/dist/core/ProviderInstantiate.d.ts +4 -2
- package/dist/core/ProviderInstantiate.d.ts.map +1 -1
- package/dist/core/ProviderInstantiate.js +23 -22
- package/dist/core/ProviderInstantiate.js.map +1 -1
- package/dist/core/SchemeRegistry.d.ts +1 -1
- package/dist/core/SchemeRegistry.d.ts.map +1 -1
- package/dist/core/SchemeRegistry.js +3 -3
- package/dist/core/SchemeRegistry.js.map +1 -1
- package/dist/core/git-membership.d.ts +8 -0
- package/dist/core/git-membership.d.ts.map +1 -0
- package/dist/core/git-membership.js +125 -0
- package/dist/core/git-membership.js.map +1 -0
- package/dist/core/packet-wire.d.ts +47 -6
- package/dist/core/packet-wire.d.ts.map +1 -1
- package/dist/core/packet-wire.js +376 -312
- package/dist/core/packet-wire.js.map +1 -1
- package/dist/core/resolveForLoop.d.ts +16 -0
- package/dist/core/resolveForLoop.d.ts.map +1 -0
- package/dist/core/resolveForLoop.js +34 -0
- package/dist/core/resolveForLoop.js.map +1 -0
- package/dist/core/results.d.ts +40 -0
- package/dist/core/results.d.ts.map +1 -0
- package/dist/core/results.js +52 -0
- package/dist/core/results.js.map +1 -0
- package/dist/core/scheme-types.d.ts +7 -4
- package/dist/core/scheme-types.d.ts.map +1 -1
- package/dist/core/scheme-types.js +4 -4
- package/dist/core/scheme-types.js.map +1 -1
- package/dist/core/types.d.ts +26 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +17 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +1 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -43
- package/dist/index.js.map +1 -1
- package/dist/schemes/EffectPolicy.d.ts +6 -0
- package/dist/schemes/EffectPolicy.d.ts.map +1 -0
- package/dist/schemes/EffectPolicy.js +18 -0
- package/dist/schemes/EffectPolicy.js.map +1 -0
- package/dist/schemes/Exec.d.ts +1 -0
- package/dist/schemes/Exec.d.ts.map +1 -1
- package/dist/schemes/Exec.js +86 -45
- package/dist/schemes/Exec.js.map +1 -1
- package/dist/schemes/File.d.ts +0 -1
- package/dist/schemes/File.d.ts.map +1 -1
- package/dist/schemes/File.js +32 -69
- package/dist/schemes/File.js.map +1 -1
- package/dist/schemes/Known.d.ts.map +1 -1
- package/dist/schemes/Known.js +13 -13
- package/dist/schemes/Known.js.map +1 -1
- package/dist/schemes/Log.d.ts.map +1 -1
- package/dist/schemes/Log.js +8 -52
- package/dist/schemes/Log.js.map +1 -1
- package/dist/schemes/Plurnk.d.ts.map +1 -1
- package/dist/schemes/Plurnk.js +13 -13
- package/dist/schemes/Plurnk.js.map +1 -1
- package/dist/schemes/Skill.d.ts.map +1 -1
- package/dist/schemes/Skill.js +13 -13
- package/dist/schemes/Skill.js.map +1 -1
- package/dist/schemes/Unknown.d.ts.map +1 -1
- package/dist/schemes/Unknown.js +13 -13
- package/dist/schemes/Unknown.js.map +1 -1
- package/dist/schemes/_entry-crud.d.ts +5 -3
- package/dist/schemes/_entry-crud.d.ts.map +1 -1
- package/dist/schemes/_entry-crud.js +55 -50
- package/dist/schemes/_entry-crud.js.map +1 -1
- package/dist/schemes/_entry-find.d.ts +10 -3
- package/dist/schemes/_entry-find.d.ts.map +1 -1
- package/dist/schemes/_entry-find.js +99 -77
- package/dist/schemes/_entry-find.js.map +1 -1
- package/dist/schemes/_entry-manifest.d.ts +6 -0
- package/dist/schemes/_entry-manifest.d.ts.map +1 -0
- package/dist/schemes/_entry-manifest.js +45 -0
- package/dist/schemes/_entry-manifest.js.map +1 -0
- package/dist/schemes/_entry-ops.d.ts +7 -4
- package/dist/schemes/_entry-ops.d.ts.map +1 -1
- package/dist/schemes/_entry-ops.js +198 -316
- package/dist/schemes/_entry-ops.js.map +1 -1
- package/dist/schemes/_entry-send.d.ts +4 -1
- package/dist/schemes/_entry-send.d.ts.map +1 -1
- package/dist/schemes/_entry-send.js +57 -55
- package/dist/schemes/_entry-send.js.map +1 -1
- package/dist/server/ClientConnection.js +3 -3
- package/dist/server/ClientConnection.js.map +1 -1
- package/dist/server/Daemon.d.ts +5 -5
- package/dist/server/Daemon.d.ts.map +1 -1
- package/dist/server/Daemon.js +234 -176
- package/dist/server/Daemon.js.map +1 -1
- package/dist/server/clientTurn.d.ts +4 -1
- package/dist/server/clientTurn.d.ts.map +1 -1
- package/dist/server/clientTurn.js +19 -17
- package/dist/server/clientTurn.js.map +1 -1
- package/dist/server/dsl.d.ts +19 -16
- package/dist/server/dsl.d.ts.map +1 -1
- package/dist/server/dsl.js +127 -105
- package/dist/server/dsl.js.map +1 -1
- package/dist/server/envelope.d.ts +22 -19
- package/dist/server/envelope.d.ts.map +1 -1
- package/dist/server/envelope.js +116 -102
- package/dist/server/envelope.js.map +1 -1
- package/dist/server/logEntry.d.ts +4 -1
- package/dist/server/logEntry.d.ts.map +1 -1
- package/dist/server/logEntry.js +41 -39
- package/dist/server/logEntry.js.map +1 -1
- package/dist/server/methods/_dispatchAsClient.d.ts +3 -1
- package/dist/server/methods/_dispatchAsClient.d.ts.map +1 -1
- package/dist/server/methods/_dispatchAsClient.js +31 -29
- package/dist/server/methods/_dispatchAsClient.js.map +1 -1
- package/dist/server/methods/discover.d.ts +3 -1
- package/dist/server/methods/discover.d.ts.map +1 -1
- package/dist/server/methods/discover.js +8 -6
- package/dist/server/methods/discover.js.map +1 -1
- package/dist/server/methods/entry_read.d.ts +4 -1
- package/dist/server/methods/entry_read.d.ts.map +1 -1
- package/dist/server/methods/entry_read.js +54 -52
- package/dist/server/methods/entry_read.js.map +1 -1
- package/dist/server/methods/log_read.d.ts +4 -1
- package/dist/server/methods/log_read.d.ts.map +1 -1
- package/dist/server/methods/log_read.js +38 -36
- package/dist/server/methods/log_read.js.map +1 -1
- package/dist/server/methods/loop_cancel.d.ts +3 -1
- package/dist/server/methods/loop_cancel.d.ts.map +1 -1
- package/dist/server/methods/loop_cancel.js +19 -17
- package/dist/server/methods/loop_cancel.js.map +1 -1
- package/dist/server/methods/loop_resolve.d.ts +3 -1
- package/dist/server/methods/loop_resolve.d.ts.map +1 -1
- package/dist/server/methods/loop_resolve.js +42 -40
- package/dist/server/methods/loop_resolve.js.map +1 -1
- package/dist/server/methods/loop_run.d.ts +3 -1
- package/dist/server/methods/loop_run.d.ts.map +1 -1
- package/dist/server/methods/loop_run.js +104 -102
- package/dist/server/methods/loop_run.js.map +1 -1
- package/dist/server/methods/op_copy.d.ts +3 -1
- package/dist/server/methods/op_copy.d.ts.map +1 -1
- package/dist/server/methods/op_copy.js +25 -23
- package/dist/server/methods/op_copy.js.map +1 -1
- package/dist/server/methods/op_dispatch.d.ts +3 -1
- package/dist/server/methods/op_dispatch.d.ts.map +1 -1
- package/dist/server/methods/op_dispatch.js +18 -16
- package/dist/server/methods/op_dispatch.js.map +1 -1
- package/dist/server/methods/op_edit.d.ts +3 -1
- package/dist/server/methods/op_edit.d.ts.map +1 -1
- package/dist/server/methods/op_edit.js +23 -21
- package/dist/server/methods/op_edit.js.map +1 -1
- package/dist/server/methods/op_exec.d.ts +3 -1
- package/dist/server/methods/op_exec.d.ts.map +1 -1
- package/dist/server/methods/op_exec.js +20 -18
- package/dist/server/methods/op_exec.js.map +1 -1
- package/dist/server/methods/op_find.d.ts +3 -1
- package/dist/server/methods/op_find.d.ts.map +1 -1
- package/dist/server/methods/op_find.js +23 -21
- package/dist/server/methods/op_find.js.map +1 -1
- package/dist/server/methods/op_hide.d.ts +3 -1
- package/dist/server/methods/op_hide.d.ts.map +1 -1
- package/dist/server/methods/op_hide.js +23 -21
- package/dist/server/methods/op_hide.js.map +1 -1
- package/dist/server/methods/op_move.d.ts +3 -1
- package/dist/server/methods/op_move.d.ts.map +1 -1
- package/dist/server/methods/op_move.js +23 -21
- package/dist/server/methods/op_move.js.map +1 -1
- package/dist/server/methods/op_parse.d.ts +3 -1
- package/dist/server/methods/op_parse.d.ts.map +1 -1
- package/dist/server/methods/op_parse.js +24 -22
- package/dist/server/methods/op_parse.js.map +1 -1
- package/dist/server/methods/op_read.d.ts +3 -1
- package/dist/server/methods/op_read.d.ts.map +1 -1
- package/dist/server/methods/op_read.js +23 -21
- package/dist/server/methods/op_read.js.map +1 -1
- package/dist/server/methods/op_send.d.ts +3 -1
- package/dist/server/methods/op_send.d.ts.map +1 -1
- package/dist/server/methods/op_send.js +22 -20
- package/dist/server/methods/op_send.js.map +1 -1
- package/dist/server/methods/op_show.d.ts +3 -1
- package/dist/server/methods/op_show.d.ts.map +1 -1
- package/dist/server/methods/op_show.js +23 -21
- package/dist/server/methods/op_show.js.map +1 -1
- package/dist/server/methods/ping.d.ts +3 -1
- package/dist/server/methods/ping.d.ts.map +1 -1
- package/dist/server/methods/ping.js +8 -6
- package/dist/server/methods/ping.js.map +1 -1
- package/dist/server/methods/providers_list.d.ts +3 -1
- package/dist/server/methods/providers_list.d.ts.map +1 -1
- package/dist/server/methods/providers_list.js +19 -17
- package/dist/server/methods/providers_list.js.map +1 -1
- package/dist/server/methods/session_attach.d.ts +3 -1
- package/dist/server/methods/session_attach.d.ts.map +1 -1
- package/dist/server/methods/session_attach.js +43 -41
- package/dist/server/methods/session_attach.js.map +1 -1
- package/dist/server/methods/session_create.d.ts +3 -1
- package/dist/server/methods/session_create.d.ts.map +1 -1
- package/dist/server/methods/session_create.js +51 -49
- package/dist/server/methods/session_create.js.map +1 -1
- package/dist/server/methods/session_list.d.ts +3 -1
- package/dist/server/methods/session_list.d.ts.map +1 -1
- package/dist/server/methods/session_list.js +9 -7
- package/dist/server/methods/session_list.js.map +1 -1
- package/dist/server/methods/session_runs.d.ts +3 -1
- package/dist/server/methods/session_runs.d.ts.map +1 -1
- package/dist/server/methods/session_runs.js +19 -17
- package/dist/server/methods/session_runs.js.map +1 -1
- package/dist/server/methods/session_set_persona.d.ts +3 -1
- package/dist/server/methods/session_set_persona.d.ts.map +1 -1
- package/dist/server/methods/session_set_persona.js +28 -26
- package/dist/server/methods/session_set_persona.js.map +1 -1
- package/dist/server/methods/session_set_root.d.ts +3 -1
- package/dist/server/methods/session_set_root.d.ts.map +1 -1
- package/dist/server/methods/session_set_root.js +31 -29
- package/dist/server/methods/session_set_root.js.map +1 -1
- package/dist/server/noProposals.d.ts +6 -0
- package/dist/server/noProposals.d.ts.map +1 -0
- package/dist/server/noProposals.js +37 -0
- package/dist/server/noProposals.js.map +1 -0
- package/dist/server/yolo.d.ts +3 -1
- package/dist/server/yolo.d.ts.map +1 -1
- package/dist/server/yolo.js +15 -13
- package/dist/server/yolo.js.map +1 -1
- package/package.json +71 -32
- package/bin/plurnk-service.js +0 -112
- /package/migrations/{001_schema.sql → 0000-00-00.01_schema.sql} +0 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// Body-matcher filtering. plurnk-service owns the filtering: the mimetypes
|
|
2
|
+
// daughter PROJECTS every entry (process() → deepJson + deepXml, for ANY source
|
|
3
|
+
// type); we FILTER here by running the matcher's dialect against the right
|
|
4
|
+
// channel:
|
|
5
|
+
//
|
|
6
|
+
// glob / regex → the raw default content (line filter; daughter primitives)
|
|
7
|
+
// jsonpath → deepJson (daughter's queryJsonpathObject)
|
|
8
|
+
// xpath → deepXml (our own xpath engine — the daughter exports no
|
|
9
|
+
// xpath primitive; we own the xml dependency)
|
|
10
|
+
//
|
|
11
|
+
// Cross-dialect (xpath over a JSON doc, jsonpath over an XML doc) works because
|
|
12
|
+
// process() yields BOTH projections for any type. Matches render as the
|
|
13
|
+
// model-facing `<source-line>:\t<value>` form, the same as a READ slice.
|
|
14
|
+
//
|
|
15
|
+
// Status: 200 = matches; 204 = matcher applied, zero results; 400 = malformed
|
|
16
|
+
// matcher expression; 203 = source unparseable for its mimetype → raw bytes as
|
|
17
|
+
// text so the model can fall back to regex/visual parsing (SPEC §16.1).
|
|
18
|
+
import { queryGlob, queryRegex, queryJsonpathObject } from "@plurnk/plurnk-mimetypes";
|
|
19
|
+
import { DOMParser } from "@xmldom/xmldom";
|
|
20
|
+
import { select } from "xpath";
|
|
21
|
+
import MimetypeBinary from "./mimetype-binary.js";
|
|
22
|
+
export default class Matcher {
|
|
23
|
+
// Render matches as the model-facing line-numbered form `<source-line>:\t<value>`,
|
|
24
|
+
// one match per line — the same N:\t convention READ emits. Value is bare for a
|
|
25
|
+
// single-line string, JSON-encoded otherwise so the one-match-per-line invariant
|
|
26
|
+
// holds and `<L>` can still page the result set.
|
|
27
|
+
static #renderValue(v) {
|
|
28
|
+
return typeof v === "string" && !v.includes("\n") ? v : JSON.stringify(v);
|
|
29
|
+
}
|
|
30
|
+
static #renderMatches(matches) {
|
|
31
|
+
return matches.map((m) => `${m.line}:\t${Matcher.#renderValue(m.matched)}`).join("\n");
|
|
32
|
+
}
|
|
33
|
+
// Apply an `<L>`-slice baseLine offset to per-match line numbers — match lines
|
|
34
|
+
// are relative to the content received; when matching inside a slice they shift
|
|
35
|
+
// back to original-source coordinates.
|
|
36
|
+
static #shiftLines(matches, baseLine) {
|
|
37
|
+
if (baseLine === 1)
|
|
38
|
+
return [...matches];
|
|
39
|
+
const offset = baseLine - 1;
|
|
40
|
+
return matches.map((m) => ({ ...m, line: m.line + offset }));
|
|
41
|
+
}
|
|
42
|
+
static async matchAgainstContent(body, content, mimetype, mimetypes, baseLine = 1) {
|
|
43
|
+
if (body.dialect === "rag") {
|
|
44
|
+
// Semantic similarity (grammar 0.21.0: `~query`, top-K via <L>). A
|
|
45
|
+
// service-side feature needing its own embedding/vector design — the
|
|
46
|
+
// resolution mechanism is ours, not the grammar's to prescribe. Parked.
|
|
47
|
+
return { status: 501, error: "rag matcher not yet implemented (semantic similarity — parked, needs its own embedding/vector design)" };
|
|
48
|
+
}
|
|
49
|
+
let matches;
|
|
50
|
+
if (body.dialect === "glob") {
|
|
51
|
+
matches = queryGlob(content, body.raw);
|
|
52
|
+
}
|
|
53
|
+
else if (body.dialect === "regex") {
|
|
54
|
+
matches = queryRegex(content, body.pattern, body.flags);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// Structural dialects query a projected channel, not the raw text.
|
|
58
|
+
let deepJson;
|
|
59
|
+
let deepXml;
|
|
60
|
+
try {
|
|
61
|
+
({ deepJson, deepXml } = await mimetypes.process({ content, hint: mimetype }));
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
// The SOURCE couldn't be parsed for its mimetype → 203 soft fallback:
|
|
65
|
+
// hand back the raw bytes as text so the model can regex/visual-parse.
|
|
66
|
+
return {
|
|
67
|
+
status: 203,
|
|
68
|
+
body: content,
|
|
69
|
+
mimetype: MimetypeBinary.TEXT_PRIMITIVE_MIMETYPE,
|
|
70
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
matches = body.dialect === "jsonpath"
|
|
75
|
+
? queryJsonpathObject(deepJson, body.raw)
|
|
76
|
+
: Matcher.#queryXpath(deepXml, body.raw);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
// A throw from the QUERY is a malformed matcher expression the grammar
|
|
80
|
+
// didn't catch (model-facing → 400, not a system 500).
|
|
81
|
+
return { status: 400, error: err instanceof Error ? err.message : String(err) };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (matches.length === 0)
|
|
85
|
+
return { status: 204, matches: 0 };
|
|
86
|
+
const adjusted = Matcher.#shiftLines(matches, baseLine);
|
|
87
|
+
return { status: 200, body: Matcher.#renderMatches(adjusted), matches: adjusted.length };
|
|
88
|
+
}
|
|
89
|
+
// XPath over the daughter's deepXml projection — our own engine. An element
|
|
90
|
+
// node renders as its XML serialization, a text/attribute node its value. Line
|
|
91
|
+
// comes from the matched node's `line` attr (its parent's, for `text()`),
|
|
92
|
+
// defaulting to 1 where the projection carries no source lines (JSON's deepXml).
|
|
93
|
+
// The projection's inline `line`/`endLine` bookkeeping currently pollutes
|
|
94
|
+
// element serialization (and is invalid XML on a content-attr collision) — the
|
|
95
|
+
// daughter's to fix (plurnk-mimetypes#12), not ours to strip.
|
|
96
|
+
static #queryXpath(deepXml, expression) {
|
|
97
|
+
const doc = new DOMParser().parseFromString(deepXml, "text/xml");
|
|
98
|
+
const selected = select(expression, doc);
|
|
99
|
+
const nodes = Array.isArray(selected) ? selected : [selected];
|
|
100
|
+
return nodes.map((node) => {
|
|
101
|
+
const el = node;
|
|
102
|
+
const line = el.getAttribute?.("line") ?? el.parentNode?.getAttribute?.("line");
|
|
103
|
+
const matched = el.nodeType === 1 ? String(node) : el.nodeValue ?? String(node);
|
|
104
|
+
return {
|
|
105
|
+
line: line !== undefined && line !== null ? Number(line) : 1,
|
|
106
|
+
matched,
|
|
107
|
+
matching: expression,
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/content/matcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export default class MimetypeBinary {
|
|
2
|
+
#private;
|
|
3
|
+
static TEXT_PRIMITIVE_MIMETYPE: string;
|
|
4
|
+
static isBinaryMimetype(mimetype: string): boolean;
|
|
5
|
+
static isJsonMimetype(mimetype: string): boolean;
|
|
6
|
+
static isLineNavigableMimetype(mimetype: string): boolean;
|
|
7
|
+
static normalizeAutoTextMimetype(mimetype: string | null | undefined): string;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=mimetype-binary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mimetype-binary.d.ts","sourceRoot":"","sources":["../../src/content/mimetype-binary.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,OAAO,OAAO,cAAc;;IA8B/B,MAAM,CAAC,uBAAuB,SAAmB;IAEjD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAclD,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIhD,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAWzD,MAAM,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM;CAMhF"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// Mimetype classifiers used at op-handler boundaries.
|
|
2
|
+
//
|
|
3
|
+
// `isBinaryMimetype` — enforces 415 on binary entries for READ/EDIT/
|
|
4
|
+
// SHOW/HIDE (SPEC.md §16.9 — binary entries → 415).
|
|
5
|
+
//
|
|
6
|
+
// `isLineNavigableMimetype` — decides whether the render layer prefixes
|
|
7
|
+
// each line with `N:\t` on READ output. Line-oriented mimetypes (text,
|
|
8
|
+
// markdown, source code, line-aligned configs) get `N:\t`. Tree-oriented
|
|
9
|
+
// mimetypes (JSON, XML, HTML) don't — line numbers would conflict with
|
|
10
|
+
// the structural navigation those formats use (jsonpath, xpath).
|
|
11
|
+
//
|
|
12
|
+
// Local heuristic until @plurnk/plurnk-mimetypes exposes per-mimetype
|
|
13
|
+
// metadata via its public API (HandlerInfo flags exist at registry
|
|
14
|
+
// level; not queryable per-mimetype yet — see plurnk-mimetypes#3).
|
|
15
|
+
export default class MimetypeBinary {
|
|
16
|
+
static #TEXT_APPLICATION_MIMETYPES = new Set([
|
|
17
|
+
"application/json",
|
|
18
|
+
"application/yaml",
|
|
19
|
+
"application/toml",
|
|
20
|
+
"application/xml",
|
|
21
|
+
"application/javascript",
|
|
22
|
+
"application/typescript",
|
|
23
|
+
"application/sql",
|
|
24
|
+
]);
|
|
25
|
+
// Mimetypes that are structurally tree-navigated rather than line-
|
|
26
|
+
// navigated. READ output of these doesn't get `N:\t` prefixes.
|
|
27
|
+
static #TREE_NAVIGABLE_MIMETYPES = new Set([
|
|
28
|
+
"application/json",
|
|
29
|
+
"application/xml",
|
|
30
|
+
"text/html",
|
|
31
|
+
]);
|
|
32
|
+
// Text primitive for the agent contract: text/markdown is the default
|
|
33
|
+
// text mimetype anywhere plurnk-service auto-derives a text result.
|
|
34
|
+
// text/plain is reserved for explicit scheme-manifest declarations
|
|
35
|
+
// (exec subprocess streams) and client-set entries. Rationale: markdown
|
|
36
|
+
// is a strict superset of plain text — any plain text is valid markdown
|
|
37
|
+
// — so the agent gets markdown-aware processing capability for free,
|
|
38
|
+
// and never needs to decide "is this markdown enough to mark as
|
|
39
|
+
// markdown?"
|
|
40
|
+
//
|
|
41
|
+
// Use this at any consumer-side auto-derivation point (file scheme
|
|
42
|
+
// extension fallback, log rx wrap, etc.) to normalize text/plain → text/markdown.
|
|
43
|
+
static TEXT_PRIMITIVE_MIMETYPE = "text/markdown";
|
|
44
|
+
static isBinaryMimetype(mimetype) {
|
|
45
|
+
if (mimetype.length === 0)
|
|
46
|
+
return false;
|
|
47
|
+
const slash = mimetype.indexOf("/");
|
|
48
|
+
if (slash === -1)
|
|
49
|
+
return true;
|
|
50
|
+
const type = mimetype.slice(0, slash);
|
|
51
|
+
if (type === "text")
|
|
52
|
+
return false;
|
|
53
|
+
if (MimetypeBinary.#TEXT_APPLICATION_MIMETYPES.has(mimetype))
|
|
54
|
+
return false;
|
|
55
|
+
if (mimetype.endsWith("+json") || mimetype.endsWith("+xml") || mimetype.endsWith("+yaml"))
|
|
56
|
+
return false;
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
// JSON-family check — used by `<L>` dispatch to pick structural slicer
|
|
60
|
+
// (sliceJsonItems) over line slicer (sliceLines) for JSON sources.
|
|
61
|
+
// Matches application/json plus +json suffix variants per RFC 6839.
|
|
62
|
+
static isJsonMimetype(mimetype) {
|
|
63
|
+
return mimetype === "application/json" || mimetype.endsWith("+json");
|
|
64
|
+
}
|
|
65
|
+
static isLineNavigableMimetype(mimetype) {
|
|
66
|
+
if (mimetype.length === 0)
|
|
67
|
+
return false;
|
|
68
|
+
if (MimetypeBinary.isBinaryMimetype(mimetype))
|
|
69
|
+
return false;
|
|
70
|
+
if (MimetypeBinary.#TREE_NAVIGABLE_MIMETYPES.has(mimetype))
|
|
71
|
+
return false;
|
|
72
|
+
if (mimetype.endsWith("+json") || mimetype.endsWith("+xml"))
|
|
73
|
+
return false;
|
|
74
|
+
// Everything text-ish that isn't tree-shaped is line-navigable.
|
|
75
|
+
// text/plain, text/markdown, text/csv, text/javascript, text/typescript,
|
|
76
|
+
// application/yaml, application/toml, application/javascript, etc.
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
static normalizeAutoTextMimetype(mimetype) {
|
|
80
|
+
if (mimetype === null || mimetype === undefined || mimetype === "" || mimetype === "text/plain") {
|
|
81
|
+
return MimetypeBinary.TEXT_PRIMITIVE_MIMETYPE;
|
|
82
|
+
}
|
|
83
|
+
return mimetype;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=mimetype-binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mimetype-binary.js","sourceRoot":"","sources":["../../src/content/mimetype-binary.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,qEAAqE;AACrE,oDAAoD;AACpD,EAAE;AACF,wEAAwE;AACxE,uEAAuE;AACvE,yEAAyE;AACzE,uEAAuE;AACvE,iEAAiE;AACjE,EAAE;AACF,sEAAsE;AACtE,mEAAmE;AACnE,mEAAmE;AAEnE,MAAM,CAAC,OAAO,OAAO,cAAc;IAC/B,MAAM,CAAC,2BAA2B,GAAwB,IAAI,GAAG,CAAC;QAC9D,kBAAkB;QAClB,kBAAkB;QAClB,kBAAkB;QAClB,iBAAiB;QACjB,wBAAwB;QACxB,wBAAwB;QACxB,iBAAiB;KACpB,CAAC,CAAC;IAEH,mEAAmE;IACnE,+DAA+D;IAC/D,MAAM,CAAC,yBAAyB,GAAwB,IAAI,GAAG,CAAC;QAC5D,kBAAkB;QAClB,iBAAiB;QACjB,WAAW;KACd,CAAC,CAAC;IAEH,sEAAsE;IACtE,oEAAoE;IACpE,mEAAmE;IACnE,wEAAwE;IACxE,wEAAwE;IACxE,qEAAqE;IACrE,gEAAgE;IAChE,aAAa;IACb,EAAE;IACF,mEAAmE;IACnE,kFAAkF;IAClF,MAAM,CAAC,uBAAuB,GAAG,eAAe,CAAC;IAEjD,MAAM,CAAC,gBAAgB,CAAC,QAAgB;QACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QAClC,IAAI,cAAc,CAAC,2BAA2B,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3E,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QACxG,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,uEAAuE;IACvE,mEAAmE;IACnE,oEAAoE;IACpE,MAAM,CAAC,cAAc,CAAC,QAAgB;QAClC,OAAO,QAAQ,KAAK,kBAAkB,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,CAAC,uBAAuB,CAAC,QAAgB;QAC3C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QAC5D,IAAI,cAAc,CAAC,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QACzE,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1E,gEAAgE;QAChE,yEAAyE;QACzE,mEAAmE;QACnE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,yBAAyB,CAAC,QAAmC;QAChE,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC9F,OAAO,cAAc,CAAC,uBAAuB,CAAC;QAClD,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Mimetypes } from "@plurnk/plurnk-mimetypes";
|
|
2
|
+
export default class PathMimetype {
|
|
3
|
+
#private;
|
|
4
|
+
static resolveEntryMimetype(pathname: string, schemeDefault: string, mimetypes: Mimetypes | undefined): Promise<string>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=path-mimetype.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-mimetype.d.ts","sourceRoot":"","sources":["../../src/content/path-mimetype.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAG1D,MAAM,CAAC,OAAO,OAAO,YAAY;;WAiBhB,oBAAoB,CAC7B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,SAAS,GAAG,SAAS,GACjC,OAAO,CAAC,MAAM,CAAC;CAQrB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Path-extension mimetype resolver for entry schemes per plurnk-grammar
|
|
2
|
+
// 0.14.0 §Paths: "Path suffix (`.json`, `.md`, `.txt`, etc.) declares
|
|
3
|
+
// mimetype; absent suffix defers to scheme default."
|
|
4
|
+
//
|
|
5
|
+
// Plurnk-service implements this uniformly across entry schemes: a
|
|
6
|
+
// pathname's extension drives the effective mimetype (via the sibling
|
|
7
|
+
// Mimetypes detect service), and the scheme manifest's channel default
|
|
8
|
+
// is the fallback when no extension is present.
|
|
9
|
+
//
|
|
10
|
+
// This makes structural ops (`<L>` item-index, matcher dialect dispatch)
|
|
11
|
+
// fire correctly without content-sniffing: a model writing JSON to
|
|
12
|
+
// `known://users.json` opts into JSON treatment via the `.json` suffix,
|
|
13
|
+
// while `known://notes` (no suffix) stays at Known's default of
|
|
14
|
+
// `text/markdown`.
|
|
15
|
+
//
|
|
16
|
+
// Consistent across:
|
|
17
|
+
// - known://users.json → application/json
|
|
18
|
+
// - known://notes.md → text/markdown
|
|
19
|
+
// - known://config.yaml → application/yaml
|
|
20
|
+
// - known://users → scheme default (text/markdown for Known)
|
|
21
|
+
import MimetypeBinary from "./mimetype-binary.js";
|
|
22
|
+
export default class PathMimetype {
|
|
23
|
+
// Extract the suffix (everything after the last dot in the last segment)
|
|
24
|
+
// from a pathname. Empty if no dot in the last segment.
|
|
25
|
+
static #extractExtension(pathname) {
|
|
26
|
+
const lastSlash = pathname.lastIndexOf("/");
|
|
27
|
+
const lastSegment = lastSlash === -1 ? pathname : pathname.slice(lastSlash + 1);
|
|
28
|
+
const lastDot = lastSegment.lastIndexOf(".");
|
|
29
|
+
if (lastDot <= 0)
|
|
30
|
+
return ""; // leading-dot files (".env") aren't an extension
|
|
31
|
+
return lastSegment.slice(lastDot); // includes the leading "."
|
|
32
|
+
}
|
|
33
|
+
// Resolve a pathname → effective mimetype.
|
|
34
|
+
// 1. If the pathname has an extension, query Mimetypes.detect({ ext })
|
|
35
|
+
// and use what comes back (normalized via the text-primitive rule —
|
|
36
|
+
// text/plain → text/markdown).
|
|
37
|
+
// 2. Otherwise (no extension or no Mimetypes service), fall back to
|
|
38
|
+
// `schemeDefault` (typically the scheme manifest's channel default).
|
|
39
|
+
static async resolveEntryMimetype(pathname, schemeDefault, mimetypes) {
|
|
40
|
+
const ext = PathMimetype.#extractExtension(pathname);
|
|
41
|
+
if (ext.length > 0 && mimetypes !== undefined) {
|
|
42
|
+
const detected = await mimetypes.detect({ ext });
|
|
43
|
+
if (detected !== null)
|
|
44
|
+
return MimetypeBinary.normalizeAutoTextMimetype(detected);
|
|
45
|
+
}
|
|
46
|
+
return schemeDefault;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=path-mimetype.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-mimetype.js","sourceRoot":"","sources":["../../src/content/path-mimetype.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,sEAAsE;AACtE,qDAAqD;AACrD,EAAE;AACF,mEAAmE;AACnE,sEAAsE;AACtE,uEAAuE;AACvE,gDAAgD;AAChD,EAAE;AACF,yEAAyE;AACzE,mEAAmE;AACnE,wEAAwE;AACxE,gEAAgE;AAChE,mBAAmB;AACnB,EAAE;AACF,qBAAqB;AACrB,gDAAgD;AAChD,6CAA6C;AAC7C,gDAAgD;AAChD,wEAAwE;AAGxE,OAAO,cAAc,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,OAAO,OAAO,YAAY;IAC7B,yEAAyE;IACzE,wDAAwD;IACxD,MAAM,CAAC,iBAAiB,CAAC,QAAgB;QACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,OAAO,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC,CAAE,iDAAiD;QAC/E,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAE,2BAA2B;IACnE,CAAC;IAED,2CAA2C;IAC3C,uEAAuE;IACvE,uEAAuE;IACvE,kCAAkC;IAClC,oEAAoE;IACpE,wEAAwE;IACxE,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAC7B,QAAgB,EAChB,aAAqB,EACrB,SAAgC;QAEhC,MAAM,GAAG,GAAG,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YACjD,IAAI,QAAQ,KAAK,IAAI;gBAAE,OAAO,cAAc,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QACrF,CAAC;QACD,OAAO,aAAa,CAAC;IACzB,CAAC;CACJ"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { LineMarker, MatcherBody } from "@plurnk/plurnk-grammar";
|
|
2
|
+
import type { Mimetypes } from "@plurnk/plurnk-mimetypes";
|
|
3
|
+
export interface ReadSliceResult {
|
|
4
|
+
status: number;
|
|
5
|
+
content: string | null;
|
|
6
|
+
mimetype: string;
|
|
7
|
+
startLine?: number | null;
|
|
8
|
+
matches?: number;
|
|
9
|
+
reason?: string;
|
|
10
|
+
}
|
|
11
|
+
export default class ReadResolve {
|
|
12
|
+
static resolve(opts: {
|
|
13
|
+
content: string;
|
|
14
|
+
mimetype: string;
|
|
15
|
+
lineMarker: LineMarker | null;
|
|
16
|
+
body: MatcherBody | null;
|
|
17
|
+
mimetypes: Mimetypes | undefined;
|
|
18
|
+
}): Promise<ReadSliceResult>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=read-resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-resolve.d.ts","sourceRoot":"","sources":["../../src/content/read-resolve.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAK1D,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,CAAC,OAAO,OAAO,WAAW;WACf,OAAO,CAAC,IAAI,EAAE;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;QAC9B,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;QACzB,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;KACpC,GAAG,OAAO,CAAC,eAAe,CAAC;CA2C/B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Shared READ slice→match resolution for entry-bearing schemes (Known/Skill/
|
|
2
|
+
// Unknown/Exec/Plurnk via `_entry-ops`), plus `Log` and `File`. `<L>` scopes,
|
|
3
|
+
// the body matches within the scope: slice-then-match (plurnk.md slot order
|
|
4
|
+
// `<L>?:body?`). `<L>` dispatches on source mimetype — JSON → item index
|
|
5
|
+
// (sliceJsonItems), line-navigable → line index (sliceLines). Callers bind their
|
|
6
|
+
// own (content, mimetype) and wrap the result (e.g. `_entry-ops` adds `channel`).
|
|
7
|
+
import LineMarkerOps from "./line-marker.js";
|
|
8
|
+
import Matcher from "./matcher.js";
|
|
9
|
+
import MimetypeBinary from "./mimetype-binary.js";
|
|
10
|
+
export default class ReadResolve {
|
|
11
|
+
static async resolve(opts) {
|
|
12
|
+
const { content, mimetype, lineMarker, body, mimetypes } = opts;
|
|
13
|
+
let workingContent = content;
|
|
14
|
+
let workingStart = 1;
|
|
15
|
+
let workingMimetypeForSlice = MimetypeBinary.TEXT_PRIMITIVE_MIMETYPE;
|
|
16
|
+
if (lineMarker !== null) {
|
|
17
|
+
if (MimetypeBinary.isJsonMimetype(mimetype)) {
|
|
18
|
+
const sliced = LineMarkerOps.sliceJsonItems(content, lineMarker);
|
|
19
|
+
if (sliced.status !== 200)
|
|
20
|
+
return { status: sliced.status, content: null, mimetype };
|
|
21
|
+
workingContent = sliced.body ?? "[]";
|
|
22
|
+
workingStart = null;
|
|
23
|
+
workingMimetypeForSlice = "application/json";
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const sliced = LineMarkerOps.sliceLines(content, lineMarker);
|
|
27
|
+
if (sliced.status !== 200)
|
|
28
|
+
return { status: sliced.status, content: null, mimetype };
|
|
29
|
+
workingContent = sliced.text ?? "";
|
|
30
|
+
workingStart = sliced.startLine ?? null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (body !== null) {
|
|
34
|
+
if (mimetypes === undefined)
|
|
35
|
+
return { status: 500, content: null, mimetype };
|
|
36
|
+
const matched = await Matcher.matchAgainstContent(body, workingContent, mimetype, mimetypes, workingStart ?? 1);
|
|
37
|
+
if (matched.status === 204)
|
|
38
|
+
return { status: 204, content: "", mimetype: "text/markdown", startLine: null, matches: 0 };
|
|
39
|
+
if (matched.status === 203) {
|
|
40
|
+
// Dialect-parse-failure fallback: raw source as text/markdown; reason surfaces why.
|
|
41
|
+
return { status: 203, content: matched.body ?? "", mimetype: matched.mimetype ?? "text/markdown", startLine: 1, reason: matched.reason };
|
|
42
|
+
}
|
|
43
|
+
if (matched.status !== 200)
|
|
44
|
+
return { status: matched.status, content: null, mimetype };
|
|
45
|
+
return { status: 200, content: matched.body ?? "", mimetype: "text/markdown", startLine: null, matches: matched.matches };
|
|
46
|
+
}
|
|
47
|
+
if (lineMarker !== null) {
|
|
48
|
+
// `<L>` slice mimetype follows the source family: line-navigable → text/markdown,
|
|
49
|
+
// JSON → application/json (structure preserved for compose). Empty / `[]` → 204.
|
|
50
|
+
const isEmptyJsonArray = workingMimetypeForSlice === "application/json" && workingContent === "[]";
|
|
51
|
+
if (workingContent === "" || isEmptyJsonArray)
|
|
52
|
+
return { status: 204, content: "", mimetype: workingMimetypeForSlice, startLine: null };
|
|
53
|
+
return { status: 200, content: workingContent, mimetype: workingMimetypeForSlice, startLine: workingStart };
|
|
54
|
+
}
|
|
55
|
+
if (content === "")
|
|
56
|
+
return { status: 204, content: "", mimetype, startLine: null };
|
|
57
|
+
return { status: 200, content, mimetype, startLine: 1 };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=read-resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-resolve.js","sourceRoot":"","sources":["../../src/content/read-resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import type { Db } from "./Db.ts";
|
|
|
2
2
|
export type ChannelState = "static" | "active" | "closed" | "errored";
|
|
3
3
|
export interface StreamEventPayload {
|
|
4
4
|
entryId: number;
|
|
5
|
+
target: string;
|
|
5
6
|
channel: string;
|
|
6
7
|
state: ChannelState;
|
|
7
8
|
contentLength: number;
|
|
@@ -11,6 +12,7 @@ export interface WakeRunPayload {
|
|
|
11
12
|
sessionId: number;
|
|
12
13
|
runId: number;
|
|
13
14
|
entryId: number;
|
|
15
|
+
target: string;
|
|
14
16
|
subscriptionId: number;
|
|
15
17
|
closeStatus: number;
|
|
16
18
|
scheme: string;
|
|
@@ -22,34 +24,37 @@ export interface TelemetryEventPayload {
|
|
|
22
24
|
event: object;
|
|
23
25
|
}
|
|
24
26
|
export type TelemetryEventNotify = (sessionId: number, payload: TelemetryEventPayload) => void;
|
|
25
|
-
export
|
|
26
|
-
|
|
27
|
-
channel:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
channel:
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
entryId:
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
status:
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
entryId:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
27
|
+
export default class ChannelWrite {
|
|
28
|
+
#private;
|
|
29
|
+
static appendToChannel(db: Db, { entryId, channel, chunk, notify }: {
|
|
30
|
+
entryId: number;
|
|
31
|
+
channel: string;
|
|
32
|
+
chunk: string;
|
|
33
|
+
notify?: StreamEventNotify;
|
|
34
|
+
}): Promise<void>;
|
|
35
|
+
static setChannelState(db: Db, { entryId, channel, state, notify }: {
|
|
36
|
+
entryId: number;
|
|
37
|
+
channel: string;
|
|
38
|
+
state: ChannelState;
|
|
39
|
+
notify?: StreamEventNotify;
|
|
40
|
+
}): Promise<void>;
|
|
41
|
+
static openSubscription(db: Db, { runId, entryId, scheme, handle }: {
|
|
42
|
+
runId: number;
|
|
43
|
+
entryId: number;
|
|
44
|
+
scheme: string;
|
|
45
|
+
handle: string;
|
|
46
|
+
}): Promise<number>;
|
|
47
|
+
static closeSubscription(db: Db, { subscriptionId, status }: {
|
|
48
|
+
subscriptionId: number;
|
|
49
|
+
status: number;
|
|
50
|
+
}): Promise<void>;
|
|
51
|
+
static findActiveSubscription(db: Db, { runId, entryId }: {
|
|
52
|
+
runId: number;
|
|
53
|
+
entryId: number;
|
|
54
|
+
}): Promise<{
|
|
55
|
+
id: number;
|
|
56
|
+
scheme: string;
|
|
57
|
+
handle: string;
|
|
58
|
+
} | null>;
|
|
59
|
+
}
|
|
55
60
|
//# sourceMappingURL=ChannelWrite.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelWrite.d.ts","sourceRoot":"","sources":["../../src/core/ChannelWrite.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,SAAS,CAAC;AAE9C,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtE,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAQvF,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;AAQ9D,MAAM,WAAW,qBAAqB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ChannelWrite.d.ts","sourceRoot":"","sources":["../../src/core/ChannelWrite.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,SAAS,CAAC;AAE9C,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtE,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAQvF,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;AAQ9D,MAAM,WAAW,qBAAqB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAU/F,MAAM,CAAC,OAAO,OAAO,YAAY;;WAehB,eAAe,CACxB,EAAE,EAAE,EAAE,EACN,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,iBAAiB,CAAA;KAAE,GACrH,OAAO,CAAC,IAAI,CAAC;WASH,eAAe,CACxB,EAAE,EAAE,EAAE,EACN,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,YAAY,CAAC;QAAC,MAAM,CAAC,EAAE,iBAAiB,CAAA;KAAE,GAC3H,OAAO,CAAC,IAAI,CAAC;WASH,gBAAgB,CACzB,EAAE,EAAE,EAAE,EACN,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GACvG,OAAO,CAAC,MAAM,CAAC;WAML,iBAAiB,CAC1B,EAAE,EAAE,EAAE,EACN,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GACvE,OAAO,CAAC,IAAI,CAAC;WAIH,sBAAsB,CAC/B,EAAE,EAAE,EAAE,EACN,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAIpE"}
|
|
@@ -5,45 +5,53 @@
|
|
|
5
5
|
// Helpers update entry_channels (content / state) and subscriptions, and emit
|
|
6
6
|
// stream/event notifications scoped to the entry's session via an optional
|
|
7
7
|
// callback the daemon wires in.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
8
|
+
export default class ChannelWrite {
|
|
9
|
+
static #channelMeta(db) { return db.channel_meta; }
|
|
10
|
+
static #appendStmt(db) { return db.append_to_channel; }
|
|
11
|
+
static #stateStmt(db) { return db.set_channel_state; }
|
|
12
|
+
static #openSubStmt(db) { return db.open_subscription; }
|
|
13
|
+
static #closeSubStmt(db) { return db.close_subscription; }
|
|
14
|
+
static #findActiveStmt(db) { return db.find_active_subscription; }
|
|
15
|
+
// The entry's target URI for stream notifications (#179). A NULL scheme is
|
|
16
|
+
// a filesystem entry (the file scheme stores scheme=NULL), so it decodes to
|
|
17
|
+
// file://.
|
|
18
|
+
static #targetUri(scheme, pathname) {
|
|
19
|
+
return `${scheme === null ? "file" : scheme}://${pathname}`;
|
|
20
|
+
}
|
|
21
|
+
static async appendToChannel(db, { entryId, channel, chunk, notify }) {
|
|
22
|
+
const result = await ChannelWrite.#appendStmt(db).run({ chunk, entry_id: entryId, channel });
|
|
23
|
+
if (result.changes === 0)
|
|
24
|
+
return;
|
|
25
|
+
if (notify === undefined)
|
|
26
|
+
return;
|
|
27
|
+
const meta = await ChannelWrite.#channelMeta(db).get({ entry_id: entryId, channel });
|
|
28
|
+
if (meta === undefined)
|
|
29
|
+
return;
|
|
30
|
+
notify(meta.session_id, { entryId, target: ChannelWrite.#targetUri(meta.scheme, meta.pathname), channel, state: meta.state, contentLength: meta.contentLength });
|
|
31
|
+
}
|
|
32
|
+
static async setChannelState(db, { entryId, channel, state, notify }) {
|
|
33
|
+
const result = await ChannelWrite.#stateStmt(db).run({ state, entry_id: entryId, channel });
|
|
34
|
+
if (result.changes === 0)
|
|
35
|
+
return;
|
|
36
|
+
if (notify === undefined)
|
|
37
|
+
return;
|
|
38
|
+
const meta = await ChannelWrite.#channelMeta(db).get({ entry_id: entryId, channel });
|
|
39
|
+
if (meta === undefined)
|
|
40
|
+
return;
|
|
41
|
+
notify(meta.session_id, { entryId, target: ChannelWrite.#targetUri(meta.scheme, meta.pathname), channel, state: meta.state, contentLength: meta.contentLength });
|
|
42
|
+
}
|
|
43
|
+
static async openSubscription(db, { runId, entryId, scheme, handle }) {
|
|
44
|
+
const row = await ChannelWrite.#openSubStmt(db).get({ run_id: runId, entry_id: entryId, scheme, handle });
|
|
45
|
+
if (row === undefined)
|
|
46
|
+
throw new Error("openSubscription: INSERT ... RETURNING produced no row");
|
|
47
|
+
return row.id;
|
|
48
|
+
}
|
|
49
|
+
static async closeSubscription(db, { subscriptionId, status }) {
|
|
50
|
+
await ChannelWrite.#closeSubStmt(db).run({ status, subscription_id: subscriptionId });
|
|
51
|
+
}
|
|
52
|
+
static async findActiveSubscription(db, { runId, entryId }) {
|
|
53
|
+
const row = await ChannelWrite.#findActiveStmt(db).get({ run_id: runId, entry_id: entryId });
|
|
54
|
+
return row ?? null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
49
57
|
//# sourceMappingURL=ChannelWrite.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelWrite.js","sourceRoot":"","sources":["../../src/core/ChannelWrite.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,mEAAmE;AACnE,EAAE;AACF,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,gCAAgC;
|
|
1
|
+
{"version":3,"file":"ChannelWrite.js","sourceRoot":"","sources":["../../src/core/ChannelWrite.ts"],"names":[],"mappings":"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"}
|