@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.
- package/SPEC.md +98 -112
- package/dist/core/ChannelWrite.d.ts +10 -0
- package/dist/core/ChannelWrite.d.ts.map +1 -1
- package/dist/core/ChannelWrite.js.map +1 -1
- package/dist/core/Engine.d.ts +10 -2
- package/dist/core/Engine.d.ts.map +1 -1
- package/dist/core/Engine.js +410 -113
- package/dist/core/Engine.js.map +1 -1
- package/dist/core/ProviderRegistry.d.ts +1 -1
- package/dist/core/ProviderRegistry.d.ts.map +1 -1
- package/dist/core/ProviderRegistry.js.map +1 -1
- package/dist/core/line-marker.d.ts +23 -0
- package/dist/core/line-marker.d.ts.map +1 -0
- package/dist/core/line-marker.js +321 -0
- package/dist/core/line-marker.js.map +1 -0
- package/dist/core/matcher.d.ts +14 -0
- package/dist/core/matcher.d.ts.map +1 -0
- package/dist/core/matcher.js +195 -0
- package/dist/core/matcher.js.map +1 -0
- package/dist/core/mimetype-binary.d.ts +6 -0
- package/dist/core/mimetype-binary.d.ts.map +1 -0
- package/dist/core/mimetype-binary.js +82 -0
- package/dist/core/mimetype-binary.js.map +1 -0
- package/dist/core/packet-wire.d.ts.map +1 -1
- package/dist/core/packet-wire.js +174 -33
- package/dist/core/packet-wire.js.map +1 -1
- package/dist/core/path-mimetype.d.ts +3 -0
- package/dist/core/path-mimetype.d.ts.map +1 -0
- package/dist/core/path-mimetype.js +47 -0
- package/dist/core/path-mimetype.js.map +1 -0
- package/dist/core/scheme-types.d.ts +5 -0
- package/dist/core/scheme-types.d.ts.map +1 -1
- package/dist/core/scheme-types.js.map +1 -1
- package/dist/providers/Mock.d.ts +2 -2
- package/dist/providers/Mock.d.ts.map +1 -1
- package/dist/providers/Mock.js.map +1 -1
- package/dist/schemes/Exec.d.ts +30 -1
- package/dist/schemes/Exec.d.ts.map +1 -1
- package/dist/schemes/Exec.js +229 -6
- package/dist/schemes/Exec.js.map +1 -1
- package/dist/schemes/File.d.ts +8 -4
- package/dist/schemes/File.d.ts.map +1 -1
- package/dist/schemes/File.js +184 -68
- package/dist/schemes/File.js.map +1 -1
- package/dist/schemes/Known.js +1 -1
- package/dist/schemes/Known.js.map +1 -1
- package/dist/schemes/Log.d.ts +9 -1
- package/dist/schemes/Log.d.ts.map +1 -1
- package/dist/schemes/Log.js +120 -19
- package/dist/schemes/Log.js.map +1 -1
- package/dist/schemes/Plurnk.d.ts +15 -1
- package/dist/schemes/Plurnk.d.ts.map +1 -1
- package/dist/schemes/Plurnk.js +50 -8
- package/dist/schemes/Plurnk.js.map +1 -1
- package/dist/schemes/Skill.js +1 -1
- package/dist/schemes/Skill.js.map +1 -1
- package/dist/schemes/Unknown.js +1 -1
- 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 +1 -0
- package/dist/schemes/_entry-crud.js.map +1 -1
- package/dist/schemes/_entry-find.d.ts.map +1 -1
- package/dist/schemes/_entry-find.js +64 -15
- package/dist/schemes/_entry-find.js.map +1 -1
- package/dist/schemes/_entry-ops.d.ts +3 -0
- package/dist/schemes/_entry-ops.d.ts.map +1 -1
- package/dist/schemes/_entry-ops.js +269 -72
- package/dist/schemes/_entry-ops.js.map +1 -1
- package/dist/schemes/_entry-send.d.ts.map +1 -1
- package/dist/schemes/_entry-send.js +14 -7
- package/dist/schemes/_entry-send.js.map +1 -1
- package/dist/server/ClientConnection.d.ts +3 -2
- package/dist/server/ClientConnection.d.ts.map +1 -1
- package/dist/server/ClientConnection.js +10 -2
- package/dist/server/ClientConnection.js.map +1 -1
- package/dist/server/Daemon.d.ts +40 -1
- package/dist/server/Daemon.d.ts.map +1 -1
- package/dist/server/Daemon.js +319 -1
- package/dist/server/Daemon.js.map +1 -1
- package/dist/server/MethodRegistry.d.ts +29 -0
- package/dist/server/MethodRegistry.d.ts.map +1 -1
- package/dist/server/MethodRegistry.js.map +1 -1
- package/dist/server/dsl.d.ts +2 -2
- package/dist/server/dsl.d.ts.map +1 -1
- package/dist/server/dsl.js +10 -10
- package/dist/server/dsl.js.map +1 -1
- package/dist/server/envelope.d.ts +2 -1
- package/dist/server/envelope.d.ts.map +1 -1
- package/dist/server/envelope.js +11 -8
- package/dist/server/envelope.js.map +1 -1
- package/dist/server/logEntry.d.ts +9 -9
- package/dist/server/logEntry.d.ts.map +1 -1
- package/dist/server/logEntry.js +10 -10
- package/dist/server/logEntry.js.map +1 -1
- package/dist/server/methods/_dispatchAsClient.d.ts.map +1 -1
- package/dist/server/methods/_dispatchAsClient.js +7 -2
- package/dist/server/methods/_dispatchAsClient.js.map +1 -1
- package/dist/server/methods/entry_read.js +5 -5
- package/dist/server/methods/entry_read.js.map +1 -1
- package/dist/server/methods/loop_cancel.d.ts +3 -0
- package/dist/server/methods/loop_cancel.d.ts.map +1 -0
- package/dist/server/methods/loop_cancel.js +27 -0
- package/dist/server/methods/loop_cancel.js.map +1 -0
- package/dist/server/methods/loop_run.d.ts.map +1 -1
- package/dist/server/methods/loop_run.js +53 -49
- package/dist/server/methods/loop_run.js.map +1 -1
- package/dist/server/methods/op_edit.js +3 -3
- package/dist/server/methods/op_edit.js.map +1 -1
- package/dist/server/methods/op_hide.js +3 -3
- package/dist/server/methods/op_hide.js.map +1 -1
- package/dist/server/methods/op_read.js +3 -3
- package/dist/server/methods/op_read.js.map +1 -1
- package/dist/server/methods/op_show.js +3 -3
- package/dist/server/methods/op_show.js.map +1 -1
- package/migrations/001_schema.sql +324 -0
- package/package.json +19 -12
- package/migrations/001_sessions.sql +0 -11
- package/migrations/002_runs.sql +0 -16
- package/migrations/003_loops.sql +0 -12
- package/migrations/004_turns.sql +0 -18
- package/migrations/005_entries.sql +0 -44
- package/migrations/006_log_entries.sql +0 -51
- package/migrations/007_visibility.sql +0 -10
- package/migrations/008_schemes_providers.sql +0 -25
- package/migrations/009_cost_rollups.sql +0 -44
- package/migrations/010_subscriptions.sql +0 -36
- package/migrations/011_turn_call_metadata.sql +0 -7
- package/migrations/012_proposal_lifecycle.sql +0 -22
- package/migrations/013_log_entries_lifecycle_columns.sql +0 -22
- package/migrations/014_loop_flags.sql +0 -9
- package/migrations/015_sessions_project_root.sql +0 -6
- package/migrations/016_persona_columns.sql +0 -11
package/dist/schemes/File.js
CHANGED
|
@@ -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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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 };
|
|
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
|
-
|
|
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,
|
|
78
|
-
if (statement.
|
|
134
|
+
async edit(statement, ctx) {
|
|
135
|
+
if (statement.target === null)
|
|
79
136
|
return { status: 400, error: "EDIT requires a path" };
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
|
103
|
-
//
|
|
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
|
-
|
|
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,
|
|
118
|
-
patched,
|
|
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.
|
|
124
|
-
//
|
|
125
|
-
//
|
|
126
|
-
|
|
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
|
package/dist/schemes/File.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"file":"File.js","sourceRoot":"","sources":["../../src/schemes/File.ts"],"names":[],"mappings":"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"}
|
package/dist/schemes/Known.js
CHANGED
|
@@ -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"
|
|
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
|
|
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"}
|
package/dist/schemes/Log.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/schemes/Log.js
CHANGED
|
@@ -1,4 +1,20 @@
|
|
|
1
|
-
|
|
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.
|
|
31
|
+
if (statement.target === null)
|
|
16
32
|
return { status: 400, content: null, mimetype: null };
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
package/dist/schemes/Log.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Log.js","sourceRoot":"","sources":["../../src/schemes/Log.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Log.js","sourceRoot":"","sources":["../../src/schemes/Log.ts"],"names":[],"mappings":"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"}
|