@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,132 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { parseArgs } from "node:util";
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { dirname, resolve } from "node:path";
|
|
7
|
+
import SqlRite from "@possumtech/sqlrite";
|
|
8
|
+
import type { Db } from "../src/core/Db.ts";
|
|
9
|
+
import Daemon from "../src/server/Daemon.ts";
|
|
10
|
+
import EnvFlags from "../src/core/EnvFlags.ts";
|
|
11
|
+
import ProviderInstantiate from "../src/core/ProviderInstantiate.ts";
|
|
12
|
+
import { resolveActiveAlias } from "@plurnk/plurnk-providers";
|
|
13
|
+
|
|
14
|
+
export default class Cli {
|
|
15
|
+
static #projectRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
16
|
+
|
|
17
|
+
static #die(code: number, message: string): never {
|
|
18
|
+
process.stderr.write(`${message}\n`);
|
|
19
|
+
process.exit(code);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
static #loadEnv(path: string, required: boolean): void {
|
|
23
|
+
if (existsSync(path)) {
|
|
24
|
+
try { process.loadEnvFile(path); }
|
|
25
|
+
catch (cause) { Cli.#die(64, `failed to load ${path}: ${cause instanceof Error ? cause.message : String(cause)}`); }
|
|
26
|
+
} else if (required) {
|
|
27
|
+
Cli.#die(64, `--config: ${path} does not exist`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// The .env cascade always populates these from .env.example, so absence is
|
|
32
|
+
// a broken config, not a runtime branch — fail hard rather than `?? ""`.
|
|
33
|
+
static #requireEnv(name: string): string {
|
|
34
|
+
const value = process.env[name];
|
|
35
|
+
if (value === undefined || value.length === 0) Cli.#die(78, `missing required env ${name} (declare it in .env.example)`);
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static async #openDb(dbPath: string): Promise<Db> {
|
|
40
|
+
const db = await SqlRite.open({
|
|
41
|
+
path: dbPath,
|
|
42
|
+
dir: [resolve(Cli.#projectRoot, "migrations"), resolve(Cli.#projectRoot, "src")],
|
|
43
|
+
});
|
|
44
|
+
return db as unknown as Db;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
static async #migrate(): Promise<void> {
|
|
48
|
+
const dbPath = Cli.#requireEnv("PLURNK_DB_PATH");
|
|
49
|
+
const db = await Cli.#openDb(dbPath);
|
|
50
|
+
try { process.stdout.write(`migrated: ${dbPath}\n`); }
|
|
51
|
+
finally { await db.close(); }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
static async #start(): Promise<void> {
|
|
55
|
+
const dbPath = Cli.#requireEnv("PLURNK_DB_PATH");
|
|
56
|
+
const host = Cli.#requireEnv("PLURNK_HOST");
|
|
57
|
+
const port = Number(Cli.#requireEnv("PLURNK_PORT"));
|
|
58
|
+
|
|
59
|
+
const db = await Cli.#openDb(dbPath);
|
|
60
|
+
const alias = resolveActiveAlias();
|
|
61
|
+
const provider = alias === null ? null : await ProviderInstantiate.loadActiveProvider();
|
|
62
|
+
const daemon = new Daemon({ db, provider });
|
|
63
|
+
const addr = await daemon.start({ host, port });
|
|
64
|
+
const aliasStr = alias === null ? "no model" : `${alias.alias}=${alias.provider}/${alias.model}`;
|
|
65
|
+
process.stdout.write(`plurnk-service ws://${addr.host}:${addr.port} db=${dbPath} ${aliasStr}\n`);
|
|
66
|
+
|
|
67
|
+
const shutdown = async (): Promise<void> => { await daemon.stop(); await db.close(); process.exit(0); };
|
|
68
|
+
process.on("SIGINT", shutdown);
|
|
69
|
+
process.on("SIGTERM", shutdown);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
static async main(): Promise<void> {
|
|
73
|
+
// Env cascade: .env.example (shipped defaults) < .env (project) <
|
|
74
|
+
// .env.<config> (--config) < shell. process.loadEnvFile is set-if-unset,
|
|
75
|
+
// so loading in low→high precedence order yields the right effective env
|
|
76
|
+
// (highest precedence loads FIRST — first write wins).
|
|
77
|
+
const configFlagIndex = process.argv.findIndex((a) => a === "--config" || a.startsWith("--config="));
|
|
78
|
+
const configFile = ((): string | null => {
|
|
79
|
+
if (configFlagIndex === -1) return null;
|
|
80
|
+
const arg = process.argv[configFlagIndex];
|
|
81
|
+
if (arg.includes("=")) return arg.slice(arg.indexOf("=") + 1);
|
|
82
|
+
return process.argv[configFlagIndex + 1] ?? null;
|
|
83
|
+
})();
|
|
84
|
+
|
|
85
|
+
if (configFile !== null) Cli.#loadEnv(configFile, true);
|
|
86
|
+
Cli.#loadEnv(".env", false);
|
|
87
|
+
Cli.#loadEnv(resolve(Cli.#projectRoot, ".env.example"), false);
|
|
88
|
+
|
|
89
|
+
const flagDescriptors = await EnvFlags.parseEnvExample(resolve(Cli.#projectRoot, ".env.example"));
|
|
90
|
+
const flagOptions: Record<string, { type: "string" }> = {};
|
|
91
|
+
for (const f of flagDescriptors) {
|
|
92
|
+
flagOptions[f.flagName.replace(/^--/, "")] = { type: "string" };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const usage = `usage: plurnk-service [options] [migrate]
|
|
96
|
+
|
|
97
|
+
${EnvFlags.formatFlagsHelp(flagDescriptors)}
|
|
98
|
+
|
|
99
|
+
--config=<path> layer additional env from <path>
|
|
100
|
+
-h, --help show this help
|
|
101
|
+
`;
|
|
102
|
+
|
|
103
|
+
const { positionals, values } = parseArgs({
|
|
104
|
+
allowPositionals: true,
|
|
105
|
+
strict: false,
|
|
106
|
+
options: { help: { type: "boolean", short: "h" }, config: { type: "string" }, ...flagOptions },
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
for (const f of flagDescriptors) {
|
|
110
|
+
const key = f.flagName.replace(/^--/, "");
|
|
111
|
+
const v = values[key];
|
|
112
|
+
if (typeof v === "string") process.env[f.envName] = v;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (values.help) { process.stdout.write(usage); process.exit(0); }
|
|
116
|
+
|
|
117
|
+
const dispatch: Record<string, () => Promise<void>> = { migrate: Cli.#migrate, start: Cli.#start };
|
|
118
|
+
const subcommand = typeof positionals[0] === "string" ? positionals[0] : "start";
|
|
119
|
+
const handler = dispatch[subcommand];
|
|
120
|
+
if (handler === undefined) Cli.#die(64, `unknown subcommand: ${subcommand}\n\n${usage}`);
|
|
121
|
+
if (positionals.length > 1) Cli.#die(64, `unexpected arguments: ${positionals.slice(1).join(" ")}`);
|
|
122
|
+
|
|
123
|
+
try { await handler(); }
|
|
124
|
+
catch (cause) {
|
|
125
|
+
process.stderr.write(`${subcommand}: ${cause instanceof Error ? cause.message : String(cause)}\n`);
|
|
126
|
+
if (cause instanceof Error && cause.cause) process.stderr.write(` cause: ${cause.cause instanceof Error ? cause.cause.message : String(cause.cause)}\n`);
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
await Cli.main();
|
package/dist/Paths.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Paths.d.ts","sourceRoot":"","sources":["../src/Paths.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,OAAO,OAAO,KAAK;;IAItB,MAAM,CAAC,UAAU,SAA8C;IAC/D,MAAM,CAAC,kBAAkB,SAA6C;IAKtE,MAAM,CAAC,cAAc,SAAkC;IAIvD,MAAM,CAAC,mBAAmB,SAAuC;CAuBpE"}
|
package/dist/Paths.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Package-relative paths to non-code artifacts.
|
|
2
|
+
//
|
|
3
|
+
// `migrations` ships in this package's tarball.
|
|
4
|
+
// `instructionsSystem` resolves to `plurnk.md` IN THE GRAMMAR PACKAGE — single
|
|
5
|
+
// source of truth lives upstream. Plurnk-service doesn't carry its own copy;
|
|
6
|
+
// the grammar agent owns the prose.
|
|
7
|
+
//
|
|
8
|
+
// Lives at src/ (one level above the package root, like the index barrel that
|
|
9
|
+
// re-exports it) so `..` resolves to PACKAGE_ROOT.
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
|
+
import { dirname, resolve } from "node:path";
|
|
12
|
+
export default class Paths {
|
|
13
|
+
static #PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
14
|
+
static #GRAMMAR_ROOT = dirname(fileURLToPath(import.meta.resolve("@plurnk/plurnk-grammar/package.json")));
|
|
15
|
+
static migrations = resolve(Paths.#PACKAGE_ROOT, "migrations");
|
|
16
|
+
static instructionsSystem = resolve(Paths.#GRAMMAR_ROOT, "plurnk.md");
|
|
17
|
+
// packet.system.persona DEFAULT. Cascade at packet-build time is
|
|
18
|
+
// loops.persona > runs.persona > sessions.persona > this file
|
|
19
|
+
// RPC overrides on loop.run / session.attach / session.create populate
|
|
20
|
+
// the three persistence layers; this file is the final fallback.
|
|
21
|
+
static defaultPersona = Paths.#resolveDefaultPersona();
|
|
22
|
+
// packet.user.system_requirements DEFAULT. Static contract appended at
|
|
23
|
+
// the end of the user packet — names rules the model has to honor that
|
|
24
|
+
// the grammar block doesn't cover (e.g. "loop concludes with SEND[200]").
|
|
25
|
+
static defaultRequirements = Paths.#resolveDefaultRequirements();
|
|
26
|
+
// Resolve the default persona file path: PLURNK_PERSONA env (absolute or
|
|
27
|
+
// relative-to-package-root) → `persona.md` in package root as the
|
|
28
|
+
// hardcoded fallback. The env var lets operators point at a custom
|
|
29
|
+
// persona without forking the file in PACKAGE_ROOT.
|
|
30
|
+
static #resolveDefaultPersona() {
|
|
31
|
+
const env = process.env.PLURNK_PERSONA;
|
|
32
|
+
if (typeof env === "string" && env.length > 0) {
|
|
33
|
+
return resolve(Paths.#PACKAGE_ROOT, env);
|
|
34
|
+
}
|
|
35
|
+
return resolve(Paths.#PACKAGE_ROOT, "persona.md");
|
|
36
|
+
}
|
|
37
|
+
// Same shape as #resolveDefaultPersona: `PLURNK_REQUIREMENTS` env (absolute
|
|
38
|
+
// or relative-to-package-root) overrides the in-package `requirements.md`.
|
|
39
|
+
static #resolveDefaultRequirements() {
|
|
40
|
+
const env = process.env.PLURNK_REQUIREMENTS;
|
|
41
|
+
if (typeof env === "string" && env.length > 0) {
|
|
42
|
+
return resolve(Paths.#PACKAGE_ROOT, env);
|
|
43
|
+
}
|
|
44
|
+
return resolve(Paths.#PACKAGE_ROOT, "requirements.md");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=Paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Paths.js","sourceRoot":"","sources":["../src/Paths.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,EAAE;AACF,gDAAgD;AAChD,+EAA+E;AAC/E,6EAA6E;AAC7E,oCAAoC;AACpC,EAAE;AACF,8EAA8E;AAC9E,mDAAmD;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,KAAK;IACtB,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9E,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,CAAC,CAAC;IAE1G,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC/D,MAAM,CAAC,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACtE,iEAAiE;IACjE,gEAAgE;IAChE,uEAAuE;IACvE,iEAAiE;IACjE,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC,sBAAsB,EAAE,CAAC;IACvD,uEAAuE;IACvE,uEAAuE;IACvE,0EAA0E;IAC1E,MAAM,CAAC,mBAAmB,GAAG,KAAK,CAAC,2BAA2B,EAAE,CAAC;IAEjE,yEAAyE;IACzE,kEAAkE;IAClE,mEAAmE;IACnE,oDAAoD;IACpD,MAAM,CAAC,sBAAsB;QACzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACvC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,OAAO,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,CAAC,2BAA2B;QAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAC5C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,OAAO,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IAC3D,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { default as MimetypeBinary } from "./mimetype-binary.ts";
|
|
2
|
+
export { default as LineMarkerOps } from "./line-marker.ts";
|
|
3
|
+
export type { EditResult as LineEditResult, JsonSliceResult, SliceResult } from "./line-marker.ts";
|
|
4
|
+
export { default as PathMimetype } from "./path-mimetype.ts";
|
|
5
|
+
export { default as Matcher } from "./matcher.ts";
|
|
6
|
+
export type { MatchResult } from "./matcher.ts";
|
|
7
|
+
export { default as ReadResolve } from "./read-resolve.ts";
|
|
8
|
+
export type { ReadSliceResult } from "./read-resolve.ts";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC5D,YAAY,EAAE,UAAU,IAAI,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEnG,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Transport-agnostic content primitives — matching, <L> slicing, mimetype
|
|
2
|
+
// classification, path→mimetype. Uniform across every scheme and mimetype;
|
|
3
|
+
// folded in from the former @plurnk/plurnk-schemes daughter, which was
|
|
4
|
+
// misnamed: this is service-level content logic, not protocol-specific.
|
|
5
|
+
export { default as MimetypeBinary } from "./mimetype-binary.js";
|
|
6
|
+
export { default as LineMarkerOps } from "./line-marker.js";
|
|
7
|
+
export { default as PathMimetype } from "./path-mimetype.js";
|
|
8
|
+
export { default as Matcher } from "./matcher.js";
|
|
9
|
+
export { default as ReadResolve } from "./read-resolve.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,2EAA2E;AAC3E,uEAAuE;AACvE,wEAAwE;AAExE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG5D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { LineMarker } from "@plurnk/plurnk-grammar";
|
|
2
|
+
export interface SliceResult {
|
|
3
|
+
status: number;
|
|
4
|
+
text?: string;
|
|
5
|
+
startLine?: number;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface JsonSliceResult {
|
|
9
|
+
status: number;
|
|
10
|
+
body?: string;
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface EditResult {
|
|
14
|
+
status: number;
|
|
15
|
+
result?: string;
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
export default class LineMarkerOps {
|
|
19
|
+
#private;
|
|
20
|
+
static sliceLines(content: string, marker: LineMarker): SliceResult;
|
|
21
|
+
static sliceJsonItems(content: string, marker: LineMarker): JsonSliceResult;
|
|
22
|
+
static applyJsonItemEdit(content: string, marker: LineMarker, body: string): EditResult;
|
|
23
|
+
static sliceLinesRaw(content: string, marker: LineMarker): SliceResult;
|
|
24
|
+
static applyLineMarkerEdit(content: string, marker: LineMarker, body: string): EditResult;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=line-marker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-marker.d.ts","sourceRoot":"","sources":["../../src/content/line-marker.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAQzD,MAAM,WAAW,WAAW;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AAClG,MAAM,WAAW,eAAe;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AAClF,MAAM,WAAW,UAAU;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AAE/E,MAAM,CAAC,OAAO,OAAO,aAAa;;IAoC9B,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,WAAW;IA+BnE,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,eAAe;IAgI3E,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU;IAsBvF,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,WAAW;IAiBtE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU;CAkB5F"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
// `<L>` line-marker semantics (plurnk.md §`<L>`):
|
|
2
|
+
//
|
|
3
|
+
// <N> selects position N (1-indexed)
|
|
4
|
+
// <N,M> selects positions N..M inclusive
|
|
5
|
+
// <0> sentinel: before position 1 (EDIT prepend)
|
|
6
|
+
// <-1> sentinel: after the last position (EDIT append)
|
|
7
|
+
// <1,-1> every position (in range context, -1 normalizes to last line)
|
|
8
|
+
//
|
|
9
|
+
// "N and M are signed integers" — but plurnk.md only documents <0> and
|
|
10
|
+
// <-1> as defined sentinels. Other negatives (<-2>, <-3>) are not
|
|
11
|
+
// specified and rejected as 416. Within a range, -1 as the M endpoint
|
|
12
|
+
// means "include through the last line" (so <1,-1> is whole content).
|
|
13
|
+
export default class LineMarkerOps {
|
|
14
|
+
static #splitLines(content) {
|
|
15
|
+
const trailingNewline = content.endsWith("\n");
|
|
16
|
+
if (content === "")
|
|
17
|
+
return { lines: [], trailingNewline: false };
|
|
18
|
+
const lines = content.split("\n");
|
|
19
|
+
if (trailingNewline)
|
|
20
|
+
lines.pop();
|
|
21
|
+
return { lines, trailingNewline };
|
|
22
|
+
}
|
|
23
|
+
static #normalize(marker, totalLines) {
|
|
24
|
+
const { first, last } = marker;
|
|
25
|
+
if (last === null) {
|
|
26
|
+
if (first === 0)
|
|
27
|
+
return { kind: "before-first", start: 0, end: 0 };
|
|
28
|
+
if (first === -1)
|
|
29
|
+
return { kind: "after-last", start: 0, end: 0 };
|
|
30
|
+
if (first > 0 && first <= totalLines)
|
|
31
|
+
return { kind: "range", start: first, end: first };
|
|
32
|
+
return { error: `line ${first} out of range (1..${totalLines})` };
|
|
33
|
+
}
|
|
34
|
+
let n = first;
|
|
35
|
+
let m = last;
|
|
36
|
+
if (n === 0)
|
|
37
|
+
n = 1;
|
|
38
|
+
if (m === -1)
|
|
39
|
+
m = totalLines;
|
|
40
|
+
if (n < 1 || n > totalLines)
|
|
41
|
+
return { error: `range start ${first} out of range (1..${totalLines})` };
|
|
42
|
+
if (m < 1 || m > totalLines)
|
|
43
|
+
return { error: `range end ${last} out of range (1..${totalLines})` };
|
|
44
|
+
if (n > m)
|
|
45
|
+
return { error: `range start ${first} > end ${last}` };
|
|
46
|
+
return { kind: "range", start: n, end: m };
|
|
47
|
+
}
|
|
48
|
+
// READ a line range. Returns the raw selected lines (no `N:\t` prefix)
|
|
49
|
+
// plus the 1-indexed position of the first selected line. The render
|
|
50
|
+
// layer adds `N:\t` per plurnk.md ("READ output prefixes every line with
|
|
51
|
+
// line numbers, N:\t") starting from `startLine` — keeps numbering as a
|
|
52
|
+
// presentation concern, prevents double-prefixing when the same content
|
|
53
|
+
// passes through the log render.
|
|
54
|
+
//
|
|
55
|
+
// Sentinel positions <0> and <-1> select no content (they're insertion
|
|
56
|
+
// points, not lines) → status 200 with empty text.
|
|
57
|
+
static sliceLines(content, marker) {
|
|
58
|
+
const { lines } = LineMarkerOps.#splitLines(content);
|
|
59
|
+
const norm = LineMarkerOps.#normalize(marker, lines.length);
|
|
60
|
+
if ("error" in norm)
|
|
61
|
+
return { status: 416, error: norm.error };
|
|
62
|
+
if (norm.kind !== "range")
|
|
63
|
+
return { status: 200, text: "", startLine: undefined };
|
|
64
|
+
const selected = lines.slice(norm.start - 1, norm.end);
|
|
65
|
+
return { status: 200, text: selected.join("\n"), startLine: norm.start };
|
|
66
|
+
}
|
|
67
|
+
// Structural `<L>` slice for JSON sources (plurnk-grammar 0.13.0).
|
|
68
|
+
// "On structured entries, <L> addresses item index, not line number."
|
|
69
|
+
// Every JSON value becomes a list of top-level items:
|
|
70
|
+
// array `[a, b, c]` → items are the array elements
|
|
71
|
+
// object `{k1: v1, ...}` → items are key-value pairs (as single-key objects)
|
|
72
|
+
// scalar `"hello"` / 42 → item is the scalar itself (length-1 list)
|
|
73
|
+
// `<L>` indexes into that list (1-indexed). Result is always a JSON array.
|
|
74
|
+
// Sentinels `<0>` / `<-1>` are insertion points — empty `[]` for READ.
|
|
75
|
+
// Out-of-range positions return 416. Matches the uniform "always JSON
|
|
76
|
+
// array out" shape we settled for matcher results.
|
|
77
|
+
static #jsonValueToItems(parsed) {
|
|
78
|
+
if (Array.isArray(parsed))
|
|
79
|
+
return parsed;
|
|
80
|
+
if (parsed !== null && typeof parsed === "object") {
|
|
81
|
+
// Object items are single-key {key: value} wrappers, in insertion
|
|
82
|
+
// order. Object.entries preserves spec-guaranteed iteration order
|
|
83
|
+
// for string keys.
|
|
84
|
+
return Object.entries(parsed).map(([k, v]) => ({ [k]: v }));
|
|
85
|
+
}
|
|
86
|
+
// Scalar (string, number, boolean, null): a length-1 list of itself.
|
|
87
|
+
return [parsed];
|
|
88
|
+
}
|
|
89
|
+
static sliceJsonItems(content, marker) {
|
|
90
|
+
let parsed;
|
|
91
|
+
try {
|
|
92
|
+
parsed = JSON.parse(content);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return { status: 400, error: `malformed JSON: ${err instanceof Error ? err.message : String(err)}` };
|
|
96
|
+
}
|
|
97
|
+
const items = LineMarkerOps.#jsonValueToItems(parsed);
|
|
98
|
+
const total = items.length;
|
|
99
|
+
const { first, last } = marker;
|
|
100
|
+
if (last === null) {
|
|
101
|
+
if (first === 0 || first === -1)
|
|
102
|
+
return { status: 200, body: "[]" };
|
|
103
|
+
if (first > 0 && first <= total)
|
|
104
|
+
return { status: 200, body: JSON.stringify([items[first - 1]], null, 2) };
|
|
105
|
+
return { status: 416, error: `item ${first} out of range (1..${total})` };
|
|
106
|
+
}
|
|
107
|
+
let n = first;
|
|
108
|
+
let m = last;
|
|
109
|
+
if (n === 0)
|
|
110
|
+
n = 1;
|
|
111
|
+
if (m === -1)
|
|
112
|
+
m = total;
|
|
113
|
+
if (n < 1 || n > total)
|
|
114
|
+
return { status: 416, error: `range start ${first} out of range (1..${total})` };
|
|
115
|
+
if (m < 1 || m > total)
|
|
116
|
+
return { status: 416, error: `range end ${last} out of range (1..${total})` };
|
|
117
|
+
if (n > m)
|
|
118
|
+
return { status: 416, error: `range start ${first} > end ${last}` };
|
|
119
|
+
return { status: 200, body: JSON.stringify(items.slice(n - 1, m), null, 2) };
|
|
120
|
+
}
|
|
121
|
+
// Structural `<L>` EDIT for JSON sources (plurnk-grammar 0.13.0/0.14.0).
|
|
122
|
+
// Source-shape rules (matches sliceJsonItems' item definition):
|
|
123
|
+
// array → items are elements
|
|
124
|
+
// object → items are key-value pairs (single-key fragments)
|
|
125
|
+
// scalar → length-1 list of itself; grow markers (<0>,<-1>) reject
|
|
126
|
+
//
|
|
127
|
+
// Body shape (Resolution B):
|
|
128
|
+
// body parses as JSON array → those are the items to splice in
|
|
129
|
+
// body parses as non-array JSON → single item to splice in
|
|
130
|
+
// empty body → delete the selection
|
|
131
|
+
// body fails JSON parse → 400 (path-extension declares intent; honor it)
|
|
132
|
+
//
|
|
133
|
+
// Marker semantics (parallel to line-EDIT):
|
|
134
|
+
// <N> replace item N with body item(s)
|
|
135
|
+
// <N,M> replace items N..M with body item(s)
|
|
136
|
+
// <0> prepend body item(s)
|
|
137
|
+
// <-1> append body item(s)
|
|
138
|
+
// <1,-1> replace whole top-level with body item(s); empty body clears
|
|
139
|
+
// Empty body on a sentinel insertion (<0> or <-1>) → no-op.
|
|
140
|
+
static #itemsFromBody(body) {
|
|
141
|
+
if (body === "")
|
|
142
|
+
return { items: [] }; // empty body = delete
|
|
143
|
+
let parsed;
|
|
144
|
+
try {
|
|
145
|
+
parsed = JSON.parse(body);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
return { error: `malformed JSON body: ${err instanceof Error ? err.message : String(err)}` };
|
|
149
|
+
}
|
|
150
|
+
if (Array.isArray(parsed))
|
|
151
|
+
return { items: parsed };
|
|
152
|
+
return { items: [parsed] };
|
|
153
|
+
}
|
|
154
|
+
static #applyJsonArrayEdit(source, marker, items) {
|
|
155
|
+
const total = source.length;
|
|
156
|
+
const { first, last } = marker;
|
|
157
|
+
let result;
|
|
158
|
+
if (last === null) {
|
|
159
|
+
if (first === 0)
|
|
160
|
+
result = [...items, ...source];
|
|
161
|
+
else if (first === -1)
|
|
162
|
+
result = [...source, ...items];
|
|
163
|
+
else if (first > 0 && first <= total)
|
|
164
|
+
result = [...source.slice(0, first - 1), ...items, ...source.slice(first)];
|
|
165
|
+
else
|
|
166
|
+
return { status: 416, error: `position ${first} out of range (1..${total})` };
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
let n = first;
|
|
170
|
+
let m = last;
|
|
171
|
+
if (n === 0)
|
|
172
|
+
n = 1;
|
|
173
|
+
if (m === -1)
|
|
174
|
+
m = total;
|
|
175
|
+
if (total === 0 && (first !== 1 || last !== -1))
|
|
176
|
+
return { status: 416, error: `range on empty array` };
|
|
177
|
+
if (n < 1 || (total > 0 && n > total))
|
|
178
|
+
return { status: 416, error: `range start ${first} out of range (1..${total})` };
|
|
179
|
+
if (m < 1 || (total > 0 && m > total))
|
|
180
|
+
return { status: 416, error: `range end ${last} out of range (1..${total})` };
|
|
181
|
+
if (n > m)
|
|
182
|
+
return { status: 416, error: `range start ${first} > end ${last}` };
|
|
183
|
+
result = [...source.slice(0, n - 1), ...items, ...source.slice(m)];
|
|
184
|
+
}
|
|
185
|
+
return { status: 200, result: JSON.stringify(result, null, 2) };
|
|
186
|
+
}
|
|
187
|
+
static #applyJsonObjectEdit(source, marker, items) {
|
|
188
|
+
// Object items are key-value pairs. Body items must be objects;
|
|
189
|
+
// each object's entries become kv-pairs to splice in. Items that
|
|
190
|
+
// aren't single objects → 400 (model used wrong body shape for an
|
|
191
|
+
// object source).
|
|
192
|
+
const bodyEntries = [];
|
|
193
|
+
for (const item of items) {
|
|
194
|
+
if (item === null || typeof item !== "object" || Array.isArray(item)) {
|
|
195
|
+
return { status: 400, error: "object source requires body items to be JSON objects (key-value pairs)" };
|
|
196
|
+
}
|
|
197
|
+
bodyEntries.push(...Object.entries(item));
|
|
198
|
+
}
|
|
199
|
+
const entries = Object.entries(source);
|
|
200
|
+
const total = entries.length;
|
|
201
|
+
const { first, last } = marker;
|
|
202
|
+
let result;
|
|
203
|
+
if (last === null) {
|
|
204
|
+
if (first === 0)
|
|
205
|
+
result = [...bodyEntries, ...entries];
|
|
206
|
+
else if (first === -1)
|
|
207
|
+
result = [...entries, ...bodyEntries];
|
|
208
|
+
else if (first > 0 && first <= total)
|
|
209
|
+
result = [...entries.slice(0, first - 1), ...bodyEntries, ...entries.slice(first)];
|
|
210
|
+
else
|
|
211
|
+
return { status: 416, error: `position ${first} out of range (1..${total})` };
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
let n = first;
|
|
215
|
+
let m = last;
|
|
216
|
+
if (n === 0)
|
|
217
|
+
n = 1;
|
|
218
|
+
if (m === -1)
|
|
219
|
+
m = total;
|
|
220
|
+
if (total === 0 && (first !== 1 || last !== -1))
|
|
221
|
+
return { status: 416, error: `range on empty object` };
|
|
222
|
+
if (n < 1 || (total > 0 && n > total))
|
|
223
|
+
return { status: 416, error: `range start ${first} out of range (1..${total})` };
|
|
224
|
+
if (m < 1 || (total > 0 && m > total))
|
|
225
|
+
return { status: 416, error: `range end ${last} out of range (1..${total})` };
|
|
226
|
+
if (n > m)
|
|
227
|
+
return { status: 416, error: `range start ${first} > end ${last}` };
|
|
228
|
+
result = [...entries.slice(0, n - 1), ...bodyEntries, ...entries.slice(m)];
|
|
229
|
+
}
|
|
230
|
+
return { status: 200, result: JSON.stringify(Object.fromEntries(result), null, 2) };
|
|
231
|
+
}
|
|
232
|
+
static #applyJsonScalarEdit(source, marker, items) {
|
|
233
|
+
// Scalar source is a length-1 list of itself. Only `<1>` replace
|
|
234
|
+
// works cleanly; grow markers (<0>,<-1>) and ranges that imply
|
|
235
|
+
// growth/delete would require type promotion (scalar → array),
|
|
236
|
+
// which is the kind of implicit magic that bites later. Reject.
|
|
237
|
+
const { first, last } = marker;
|
|
238
|
+
if (last === null && first === 1) {
|
|
239
|
+
if (items.length === 0)
|
|
240
|
+
return { status: 200, result: "null" }; // delete the scalar
|
|
241
|
+
if (items.length === 1)
|
|
242
|
+
return { status: 200, result: JSON.stringify(items[0], null, 2) };
|
|
243
|
+
return { status: 400, error: "scalar source: <1> body must produce 0 or 1 items (no implicit promotion to array)" };
|
|
244
|
+
}
|
|
245
|
+
if (last === -1 && first === 1) {
|
|
246
|
+
// <1,-1> = whole content. Same constraints as <1> for scalars.
|
|
247
|
+
if (items.length === 0)
|
|
248
|
+
return { status: 200, result: "null" };
|
|
249
|
+
if (items.length === 1)
|
|
250
|
+
return { status: 200, result: JSON.stringify(items[0], null, 2) };
|
|
251
|
+
return { status: 400, error: "scalar source: <1,-1> body must produce 0 or 1 items (no implicit promotion to array)" };
|
|
252
|
+
}
|
|
253
|
+
return { status: 400, error: "scalar JSON source: only <1> or <1,-1> markers supported (no implicit promotion to array via grow markers)" };
|
|
254
|
+
}
|
|
255
|
+
static applyJsonItemEdit(content, marker, body) {
|
|
256
|
+
let parsed;
|
|
257
|
+
try {
|
|
258
|
+
parsed = JSON.parse(content);
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
return { status: 400, error: `malformed JSON source: ${err instanceof Error ? err.message : String(err)}` };
|
|
262
|
+
}
|
|
263
|
+
const bodyResult = LineMarkerOps.#itemsFromBody(body);
|
|
264
|
+
if ("error" in bodyResult)
|
|
265
|
+
return { status: 400, error: bodyResult.error };
|
|
266
|
+
const items = bodyResult.items;
|
|
267
|
+
// Empty-body sentinel insertion is a no-op (model accidentally
|
|
268
|
+
// emitted no items at an insertion point).
|
|
269
|
+
if (items.length === 0 && marker.last === null && (marker.first === 0 || marker.first === -1)) {
|
|
270
|
+
return { status: 200, result: content };
|
|
271
|
+
}
|
|
272
|
+
if (Array.isArray(parsed))
|
|
273
|
+
return LineMarkerOps.#applyJsonArrayEdit(parsed, marker, items);
|
|
274
|
+
if (parsed !== null && typeof parsed === "object")
|
|
275
|
+
return LineMarkerOps.#applyJsonObjectEdit(parsed, marker, items);
|
|
276
|
+
return LineMarkerOps.#applyJsonScalarEdit(parsed, marker, items);
|
|
277
|
+
}
|
|
278
|
+
// COPY-style raw line slice. Returns the selected lines verbatim (no line-
|
|
279
|
+
// number prefix), trailing newline appended if any lines were selected.
|
|
280
|
+
// Used for COPY/MOVE `<L>` per SPEC.md §16.9 (source range, symmetric
|
|
281
|
+
// with READ but without the READ-output prefix that's a render concern,
|
|
282
|
+
// not a data concern).
|
|
283
|
+
static sliceLinesRaw(content, marker) {
|
|
284
|
+
const { lines } = LineMarkerOps.#splitLines(content);
|
|
285
|
+
const norm = LineMarkerOps.#normalize(marker, lines.length);
|
|
286
|
+
if ("error" in norm)
|
|
287
|
+
return { status: 416, error: norm.error };
|
|
288
|
+
if (norm.kind !== "range")
|
|
289
|
+
return { status: 200, text: "" };
|
|
290
|
+
const selected = lines.slice(norm.start - 1, norm.end);
|
|
291
|
+
const result = selected.length > 0 ? `${selected.join("\n")}\n` : "";
|
|
292
|
+
return { status: 200, text: result };
|
|
293
|
+
}
|
|
294
|
+
// EDIT applies body at the marker position:
|
|
295
|
+
// <0> prepend body before line 1
|
|
296
|
+
// <-1> append body after the last line
|
|
297
|
+
// <N> replace line N with body
|
|
298
|
+
// <N,M> replace lines N..M with body
|
|
299
|
+
// <1,-1> whole content (replace everything); empty body clears.
|
|
300
|
+
// Empty body with <N>/<N,M> deletes those lines.
|
|
301
|
+
static applyLineMarkerEdit(content, marker, body) {
|
|
302
|
+
const { lines, trailingNewline } = LineMarkerOps.#splitLines(content);
|
|
303
|
+
const norm = LineMarkerOps.#normalize(marker, lines.length);
|
|
304
|
+
if ("error" in norm)
|
|
305
|
+
return { status: 416, error: norm.error };
|
|
306
|
+
const bodyLines = LineMarkerOps.#splitLines(body).lines;
|
|
307
|
+
let newLines;
|
|
308
|
+
if (norm.kind === "before-first") {
|
|
309
|
+
newLines = [...bodyLines, ...lines];
|
|
310
|
+
}
|
|
311
|
+
else if (norm.kind === "after-last") {
|
|
312
|
+
newLines = [...lines, ...bodyLines];
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
newLines = [...lines.slice(0, norm.start - 1), ...bodyLines, ...lines.slice(norm.end)];
|
|
316
|
+
}
|
|
317
|
+
let result = newLines.join("\n");
|
|
318
|
+
if (newLines.length > 0 && trailingNewline)
|
|
319
|
+
result += "\n";
|
|
320
|
+
return { status: 200, result };
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=line-marker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-marker.js","sourceRoot":"","sources":["../../src/content/line-marker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { MatcherBody } from "@plurnk/plurnk-grammar";
|
|
2
|
+
import type { Mimetypes } from "@plurnk/plurnk-mimetypes";
|
|
3
|
+
export interface MatchResult {
|
|
4
|
+
status: number;
|
|
5
|
+
body?: string;
|
|
6
|
+
matches?: number;
|
|
7
|
+
error?: string;
|
|
8
|
+
mimetype?: string;
|
|
9
|
+
reason?: string;
|
|
10
|
+
}
|
|
11
|
+
export default class Matcher {
|
|
12
|
+
#private;
|
|
13
|
+
static matchAgainstContent(body: MatcherBody, content: string, mimetype: string, mimetypes: Mimetypes, baseLine?: number): Promise<MatchResult>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/content/matcher.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,0BAA0B,CAAC;AAMtE,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,CAAC,OAAO,OAAO,OAAO;;WAsBX,mBAAmB,CAC5B,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,QAAQ,GAAE,MAAU,GACrB,OAAO,CAAC,WAAW,CAAC;CAsE1B"}
|