@plurnk/plurnk-service 0.1.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/LICENSE +21 -0
- package/README.md +54 -0
- package/SPEC.md +1045 -0
- package/bin/plurnk-service.js +111 -0
- package/dist/core/ChannelWrite.d.ts +40 -0
- package/dist/core/ChannelWrite.d.ts.map +1 -0
- package/dist/core/ChannelWrite.js +49 -0
- package/dist/core/ChannelWrite.js.map +1 -0
- package/dist/core/Db.d.ts +14 -0
- package/dist/core/Db.d.ts.map +1 -0
- package/dist/core/Db.js +7 -0
- package/dist/core/Db.js.map +1 -0
- package/dist/core/Engine.d.ts +107 -0
- package/dist/core/Engine.d.ts.map +1 -0
- package/dist/core/Engine.js +937 -0
- package/dist/core/Engine.js.map +1 -0
- package/dist/core/EnvFlags.d.ts +10 -0
- package/dist/core/EnvFlags.d.ts.map +1 -0
- package/dist/core/EnvFlags.js +82 -0
- package/dist/core/EnvFlags.js.map +1 -0
- package/dist/core/Migrator.d.ts +19 -0
- package/dist/core/Migrator.d.ts.map +1 -0
- package/dist/core/Migrator.js +55 -0
- package/dist/core/Migrator.js.map +1 -0
- package/dist/core/PluginLoader.d.ts +14 -0
- package/dist/core/PluginLoader.d.ts.map +1 -0
- package/dist/core/PluginLoader.js +100 -0
- package/dist/core/PluginLoader.js.map +1 -0
- package/dist/core/ProviderRegistry.d.ts +42 -0
- package/dist/core/ProviderRegistry.d.ts.map +1 -0
- package/dist/core/ProviderRegistry.js +72 -0
- package/dist/core/ProviderRegistry.js.map +1 -0
- package/dist/core/SchemeRegistry.d.ts +13 -0
- package/dist/core/SchemeRegistry.d.ts.map +1 -0
- package/dist/core/SchemeRegistry.js +50 -0
- package/dist/core/SchemeRegistry.js.map +1 -0
- package/dist/core/scheme-types.d.ts +37 -0
- package/dist/core/scheme-types.d.ts.map +1 -0
- package/dist/core/scheme-types.js +9 -0
- package/dist/core/scheme-types.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/Mock.d.ts +43 -0
- package/dist/providers/Mock.d.ts.map +1 -0
- package/dist/providers/Mock.js +36 -0
- package/dist/providers/Mock.js.map +1 -0
- package/dist/schemes/Exec.d.ts +5 -0
- package/dist/schemes/Exec.d.ts.map +1 -0
- package/dist/schemes/Exec.js +20 -0
- package/dist/schemes/Exec.js.map +1 -0
- package/dist/schemes/File.d.ts +35 -0
- package/dist/schemes/File.d.ts.map +1 -0
- package/dist/schemes/File.js +149 -0
- package/dist/schemes/File.js.map +1 -0
- package/dist/schemes/Known.d.ts +19 -0
- package/dist/schemes/Known.d.ts.map +1 -0
- package/dist/schemes/Known.js +44 -0
- package/dist/schemes/Known.js.map +1 -0
- package/dist/schemes/Log.d.ts +13 -0
- package/dist/schemes/Log.d.ts.map +1 -0
- package/dist/schemes/Log.js +38 -0
- package/dist/schemes/Log.js.map +1 -0
- package/dist/schemes/Plurnk.d.ts +5 -0
- package/dist/schemes/Plurnk.d.ts.map +1 -0
- package/dist/schemes/Plurnk.js +15 -0
- package/dist/schemes/Plurnk.js.map +1 -0
- package/dist/schemes/Skill.d.ts +19 -0
- package/dist/schemes/Skill.d.ts.map +1 -0
- package/dist/schemes/Skill.js +46 -0
- package/dist/schemes/Skill.js.map +1 -0
- package/dist/schemes/Unknown.d.ts +19 -0
- package/dist/schemes/Unknown.d.ts.map +1 -0
- package/dist/schemes/Unknown.js +44 -0
- package/dist/schemes/Unknown.js.map +1 -0
- package/dist/schemes/_entry-crud.d.ts +24 -0
- package/dist/schemes/_entry-crud.d.ts.map +1 -0
- package/dist/schemes/_entry-crud.js +56 -0
- package/dist/schemes/_entry-crud.js.map +1 -0
- package/dist/schemes/_entry-find.d.ts +10 -0
- package/dist/schemes/_entry-find.d.ts.map +1 -0
- package/dist/schemes/_entry-find.js +41 -0
- package/dist/schemes/_entry-find.js.map +1 -0
- package/dist/schemes/_entry-ops.d.ts +21 -0
- package/dist/schemes/_entry-ops.d.ts.map +1 -0
- package/dist/schemes/_entry-ops.js +146 -0
- package/dist/schemes/_entry-ops.js.map +1 -0
- package/dist/schemes/_entry-send.d.ts +8 -0
- package/dist/schemes/_entry-send.d.ts.map +1 -0
- package/dist/schemes/_entry-send.js +56 -0
- package/dist/schemes/_entry-send.js.map +1 -0
- package/dist/server/ClientConnection.d.ts +22 -0
- package/dist/server/ClientConnection.d.ts.map +1 -0
- package/dist/server/ClientConnection.js +120 -0
- package/dist/server/ClientConnection.js.map +1 -0
- package/dist/server/Daemon.d.ts +43 -0
- package/dist/server/Daemon.d.ts.map +1 -0
- package/dist/server/Daemon.js +252 -0
- package/dist/server/Daemon.js.map +1 -0
- package/dist/server/MethodRegistry.d.ts +56 -0
- package/dist/server/MethodRegistry.d.ts.map +1 -0
- package/dist/server/MethodRegistry.js +55 -0
- package/dist/server/MethodRegistry.js.map +1 -0
- package/dist/server/clientTurn.d.ts +3 -0
- package/dist/server/clientTurn.d.ts.map +1 -0
- package/dist/server/clientTurn.js +22 -0
- package/dist/server/clientTurn.js.map +1 -0
- package/dist/server/dsl.d.ts +47 -0
- package/dist/server/dsl.d.ts.map +1 -0
- package/dist/server/dsl.js +117 -0
- package/dist/server/dsl.js.map +1 -0
- package/dist/server/envelope.d.ts +44 -0
- package/dist/server/envelope.d.ts.map +1 -0
- package/dist/server/envelope.js +113 -0
- package/dist/server/envelope.js.map +1 -0
- package/dist/server/logEntry.d.ts +30 -0
- package/dist/server/logEntry.d.ts.map +1 -0
- package/dist/server/logEntry.js +43 -0
- package/dist/server/logEntry.js.map +1 -0
- package/dist/server/methods/_dispatchAsClient.d.ts +8 -0
- package/dist/server/methods/_dispatchAsClient.d.ts.map +1 -0
- package/dist/server/methods/_dispatchAsClient.js +31 -0
- package/dist/server/methods/_dispatchAsClient.js.map +1 -0
- package/dist/server/methods/discover.d.ts +3 -0
- package/dist/server/methods/discover.d.ts.map +1 -0
- package/dist/server/methods/discover.js +7 -0
- package/dist/server/methods/discover.js.map +1 -0
- package/dist/server/methods/entry_read.d.ts +3 -0
- package/dist/server/methods/entry_read.d.ts.map +1 -0
- package/dist/server/methods/entry_read.js +56 -0
- package/dist/server/methods/entry_read.js.map +1 -0
- package/dist/server/methods/log_read.d.ts +3 -0
- package/dist/server/methods/log_read.d.ts.map +1 -0
- package/dist/server/methods/log_read.js +39 -0
- package/dist/server/methods/log_read.js.map +1 -0
- package/dist/server/methods/loop_resolve.d.ts +3 -0
- package/dist/server/methods/loop_resolve.d.ts.map +1 -0
- package/dist/server/methods/loop_resolve.js +45 -0
- package/dist/server/methods/loop_resolve.js.map +1 -0
- package/dist/server/methods/loop_run.d.ts +3 -0
- package/dist/server/methods/loop_run.d.ts.map +1 -0
- package/dist/server/methods/loop_run.js +112 -0
- package/dist/server/methods/loop_run.js.map +1 -0
- package/dist/server/methods/op_copy.d.ts +3 -0
- package/dist/server/methods/op_copy.d.ts.map +1 -0
- package/dist/server/methods/op_copy.js +24 -0
- package/dist/server/methods/op_copy.js.map +1 -0
- package/dist/server/methods/op_dispatch.d.ts +3 -0
- package/dist/server/methods/op_dispatch.d.ts.map +1 -0
- package/dist/server/methods/op_dispatch.js +17 -0
- package/dist/server/methods/op_dispatch.js.map +1 -0
- package/dist/server/methods/op_edit.d.ts +3 -0
- package/dist/server/methods/op_edit.d.ts.map +1 -0
- package/dist/server/methods/op_edit.js +22 -0
- package/dist/server/methods/op_edit.js.map +1 -0
- package/dist/server/methods/op_exec.d.ts +3 -0
- package/dist/server/methods/op_exec.d.ts.map +1 -0
- package/dist/server/methods/op_exec.js +19 -0
- package/dist/server/methods/op_exec.js.map +1 -0
- package/dist/server/methods/op_find.d.ts +3 -0
- package/dist/server/methods/op_find.d.ts.map +1 -0
- package/dist/server/methods/op_find.js +22 -0
- package/dist/server/methods/op_find.js.map +1 -0
- package/dist/server/methods/op_hide.d.ts +3 -0
- package/dist/server/methods/op_hide.d.ts.map +1 -0
- package/dist/server/methods/op_hide.js +22 -0
- package/dist/server/methods/op_hide.js.map +1 -0
- package/dist/server/methods/op_move.d.ts +3 -0
- package/dist/server/methods/op_move.d.ts.map +1 -0
- package/dist/server/methods/op_move.js +22 -0
- package/dist/server/methods/op_move.js.map +1 -0
- package/dist/server/methods/op_parse.d.ts +3 -0
- package/dist/server/methods/op_parse.d.ts.map +1 -0
- package/dist/server/methods/op_parse.js +23 -0
- package/dist/server/methods/op_parse.js.map +1 -0
- package/dist/server/methods/op_read.d.ts +3 -0
- package/dist/server/methods/op_read.d.ts.map +1 -0
- package/dist/server/methods/op_read.js +22 -0
- package/dist/server/methods/op_read.js.map +1 -0
- package/dist/server/methods/op_send.d.ts +3 -0
- package/dist/server/methods/op_send.d.ts.map +1 -0
- package/dist/server/methods/op_send.js +21 -0
- package/dist/server/methods/op_send.js.map +1 -0
- package/dist/server/methods/op_show.d.ts +3 -0
- package/dist/server/methods/op_show.d.ts.map +1 -0
- package/dist/server/methods/op_show.js +22 -0
- package/dist/server/methods/op_show.js.map +1 -0
- package/dist/server/methods/ping.d.ts +3 -0
- package/dist/server/methods/ping.d.ts.map +1 -0
- package/dist/server/methods/ping.js +7 -0
- package/dist/server/methods/ping.js.map +1 -0
- package/dist/server/methods/providers_list.d.ts +3 -0
- package/dist/server/methods/providers_list.d.ts.map +1 -0
- package/dist/server/methods/providers_list.js +19 -0
- package/dist/server/methods/providers_list.js.map +1 -0
- package/dist/server/methods/session_attach.d.ts +3 -0
- package/dist/server/methods/session_attach.d.ts.map +1 -0
- package/dist/server/methods/session_attach.js +42 -0
- package/dist/server/methods/session_attach.js.map +1 -0
- package/dist/server/methods/session_create.d.ts +3 -0
- package/dist/server/methods/session_create.d.ts.map +1 -0
- package/dist/server/methods/session_create.js +53 -0
- package/dist/server/methods/session_create.js.map +1 -0
- package/dist/server/methods/session_list.d.ts +3 -0
- package/dist/server/methods/session_list.d.ts.map +1 -0
- package/dist/server/methods/session_list.js +8 -0
- package/dist/server/methods/session_list.js.map +1 -0
- package/dist/server/methods/session_runs.d.ts +3 -0
- package/dist/server/methods/session_runs.d.ts.map +1 -0
- package/dist/server/methods/session_runs.js +18 -0
- package/dist/server/methods/session_runs.js.map +1 -0
- package/dist/server/methods/session_set_persona.d.ts +3 -0
- package/dist/server/methods/session_set_persona.d.ts.map +1 -0
- package/dist/server/methods/session_set_persona.js +27 -0
- package/dist/server/methods/session_set_persona.js.map +1 -0
- package/dist/server/methods/session_set_root.d.ts +3 -0
- package/dist/server/methods/session_set_root.d.ts.map +1 -0
- package/dist/server/methods/session_set_root.js +33 -0
- package/dist/server/methods/session_set_root.js.map +1 -0
- package/dist/server/yolo.d.ts +4 -0
- package/dist/server/yolo.d.ts.map +1 -0
- package/dist/server/yolo.js +48 -0
- package/dist/server/yolo.js.map +1 -0
- package/migrations/001_sessions.sql +11 -0
- package/migrations/002_runs.sql +16 -0
- package/migrations/003_loops.sql +12 -0
- package/migrations/004_turns.sql +18 -0
- package/migrations/005_entries.sql +44 -0
- package/migrations/006_log_entries.sql +51 -0
- package/migrations/007_visibility.sql +10 -0
- package/migrations/008_schemes_providers.sql +25 -0
- package/migrations/009_cost_rollups.sql +44 -0
- package/migrations/010_subscriptions.sql +36 -0
- package/migrations/011_turn_call_metadata.sql +7 -0
- package/migrations/012_proposal_lifecycle.sql +22 -0
- package/migrations/013_log_entries_lifecycle_columns.sql +22 -0
- package/migrations/014_loop_flags.sql +9 -0
- package/migrations/015_sessions_project_root.sql +6 -0
- package/migrations/016_persona_columns.sql +11 -0
- package/package.json +66 -0
- package/persona.md +1 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { parseArgs } from "node:util";
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
import SqlRite from "@possumtech/sqlrite";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { dirname, resolve } from "node:path";
|
|
8
|
+
import Daemon from "../src/server/Daemon.ts";
|
|
9
|
+
import { parseEnvExample, formatFlagsHelp } from "../src/core/EnvFlags.ts";
|
|
10
|
+
import { loadActiveProvider, resolveActiveAlias } from "../src/core/ProviderRegistry.ts";
|
|
11
|
+
|
|
12
|
+
const die = (code, message) => {
|
|
13
|
+
process.stderr.write(`${message}\n`);
|
|
14
|
+
process.exit(code);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const projectRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
18
|
+
|
|
19
|
+
// Env cascade: .env.example (shipped defaults) < .env (project) < .env.<config> (--config)
|
|
20
|
+
// < shell. process.loadEnvFile is set-if-unset, so loading in low→high precedence
|
|
21
|
+
// order yields the right effective env.
|
|
22
|
+
const configFlagIndex = process.argv.findIndex((a) => a === "--config" || a.startsWith("--config="));
|
|
23
|
+
const configFile = (() => {
|
|
24
|
+
if (configFlagIndex === -1) return null;
|
|
25
|
+
const arg = process.argv[configFlagIndex];
|
|
26
|
+
if (arg.includes("=")) return arg.slice(arg.indexOf("=") + 1);
|
|
27
|
+
return process.argv[configFlagIndex + 1] ?? null;
|
|
28
|
+
})();
|
|
29
|
+
|
|
30
|
+
const loadEnv = (path, required) => {
|
|
31
|
+
if (existsSync(path)) {
|
|
32
|
+
try { process.loadEnvFile(path); }
|
|
33
|
+
catch (cause) { die(64, `failed to load ${path}: ${cause instanceof Error ? cause.message : String(cause)}`); }
|
|
34
|
+
} else if (required) {
|
|
35
|
+
die(64, `--config: ${path} does not exist`);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// Highest precedence loads FIRST (set-if-unset semantics: first write wins).
|
|
40
|
+
if (configFile !== null) loadEnv(configFile, true);
|
|
41
|
+
loadEnv(".env", false);
|
|
42
|
+
loadEnv(resolve(projectRoot, ".env.example"), false);
|
|
43
|
+
|
|
44
|
+
const flagDescriptors = await parseEnvExample(resolve(projectRoot, ".env.example"));
|
|
45
|
+
const flagOptions = {};
|
|
46
|
+
for (const f of flagDescriptors) {
|
|
47
|
+
flagOptions[f.flagName.replace(/^--/, "")] = { type: "string" };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const USAGE = `usage: plurnk-service [options] [migrate]
|
|
51
|
+
|
|
52
|
+
${formatFlagsHelp(flagDescriptors)}
|
|
53
|
+
|
|
54
|
+
--config=<path> layer additional env from <path>
|
|
55
|
+
-h, --help show this help
|
|
56
|
+
`;
|
|
57
|
+
|
|
58
|
+
const openDb = async (dbPath) => SqlRite.open({
|
|
59
|
+
path: dbPath,
|
|
60
|
+
dir: [resolve(projectRoot, "migrations"), resolve(projectRoot, "src")],
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const migrate = async () => {
|
|
64
|
+
const db = await openDb(process.env.PLURNK_DB_PATH);
|
|
65
|
+
try { process.stdout.write(`migrated: ${process.env.PLURNK_DB_PATH}\n`); }
|
|
66
|
+
finally { await db.close(); }
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const start = async () => {
|
|
70
|
+
const dbPath = process.env.PLURNK_DB_PATH;
|
|
71
|
+
const host = process.env.PLURNK_HOST;
|
|
72
|
+
const port = Number(process.env.PLURNK_PORT);
|
|
73
|
+
|
|
74
|
+
const db = await openDb(dbPath);
|
|
75
|
+
const alias = resolveActiveAlias();
|
|
76
|
+
const provider = alias === null ? null : await loadActiveProvider();
|
|
77
|
+
const daemon = new Daemon({ db, provider });
|
|
78
|
+
const addr = await daemon.start({ host, port });
|
|
79
|
+
const aliasStr = alias === null ? "no model" : `${alias.alias}=${alias.provider}/${alias.model}`;
|
|
80
|
+
process.stdout.write(`plurnk-service ws://${addr.host}:${addr.port} db=${dbPath} ${aliasStr}\n`);
|
|
81
|
+
|
|
82
|
+
const shutdown = async () => { await daemon.stop(); await db.close(); process.exit(0); };
|
|
83
|
+
process.on("SIGINT", shutdown);
|
|
84
|
+
process.on("SIGTERM", shutdown);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const { positionals, values } = parseArgs({
|
|
88
|
+
allowPositionals: true,
|
|
89
|
+
strict: false,
|
|
90
|
+
options: { help: { type: "boolean", short: "h" }, config: { type: "string" }, ...flagOptions },
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
for (const f of flagDescriptors) {
|
|
94
|
+
const key = f.flagName.replace(/^--/, "");
|
|
95
|
+
if (typeof values[key] === "string") process.env[f.envName] = values[key];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (values.help) { process.stdout.write(USAGE); process.exit(0); }
|
|
99
|
+
|
|
100
|
+
const dispatch = { migrate, start };
|
|
101
|
+
const subcommand = positionals[0] ?? "start";
|
|
102
|
+
const handler = dispatch[subcommand];
|
|
103
|
+
if (handler === undefined) die(64, `unknown subcommand: ${subcommand}\n\n${USAGE}`);
|
|
104
|
+
if (positionals.length > 1) die(64, `unexpected arguments: ${positionals.slice(1).join(" ")}`);
|
|
105
|
+
|
|
106
|
+
try { await handler(); }
|
|
107
|
+
catch (cause) {
|
|
108
|
+
process.stderr.write(`${subcommand}: ${cause instanceof Error ? cause.message : String(cause)}\n`);
|
|
109
|
+
if (cause instanceof Error && cause.cause) process.stderr.write(` cause: ${cause.cause instanceof Error ? cause.cause.message : String(cause.cause)}\n`);
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Db } from "./Db.ts";
|
|
2
|
+
export type ChannelState = "static" | "active" | "closed" | "errored";
|
|
3
|
+
export interface StreamEventPayload {
|
|
4
|
+
entryId: number;
|
|
5
|
+
channel: string;
|
|
6
|
+
state: ChannelState;
|
|
7
|
+
contentLength: number;
|
|
8
|
+
}
|
|
9
|
+
export type StreamEventNotify = (sessionId: number, event: StreamEventPayload) => void;
|
|
10
|
+
export declare const appendToChannel: (db: Db, { entryId, channel, chunk, notify }: {
|
|
11
|
+
entryId: number;
|
|
12
|
+
channel: string;
|
|
13
|
+
chunk: string;
|
|
14
|
+
notify?: StreamEventNotify;
|
|
15
|
+
}) => Promise<void>;
|
|
16
|
+
export declare const setChannelState: (db: Db, { entryId, channel, state, notify }: {
|
|
17
|
+
entryId: number;
|
|
18
|
+
channel: string;
|
|
19
|
+
state: ChannelState;
|
|
20
|
+
notify?: StreamEventNotify;
|
|
21
|
+
}) => Promise<void>;
|
|
22
|
+
export declare const openSubscription: (db: Db, { runId, entryId, scheme, handle }: {
|
|
23
|
+
runId: number;
|
|
24
|
+
entryId: number;
|
|
25
|
+
scheme: string;
|
|
26
|
+
handle: string;
|
|
27
|
+
}) => Promise<number>;
|
|
28
|
+
export declare const closeSubscription: (db: Db, { subscriptionId, status }: {
|
|
29
|
+
subscriptionId: number;
|
|
30
|
+
status: number;
|
|
31
|
+
}) => Promise<void>;
|
|
32
|
+
export declare const findActiveSubscription: (db: Db, { runId, entryId }: {
|
|
33
|
+
runId: number;
|
|
34
|
+
entryId: number;
|
|
35
|
+
}) => Promise<{
|
|
36
|
+
id: number;
|
|
37
|
+
scheme: string;
|
|
38
|
+
handle: string;
|
|
39
|
+
} | null>;
|
|
40
|
+
//# sourceMappingURL=ChannelWrite.d.ts.map
|
|
@@ -0,0 +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;AAevF,eAAO,MAAM,eAAe,GACxB,IAAI,EAAE,EACN,qCAAqC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,KACrH,OAAO,CAAC,IAAI,CAOd,CAAC;AAEF,eAAO,MAAM,eAAe,GACxB,IAAI,EAAE,EACN,qCAAqC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC;IAAC,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,KAC3H,OAAO,CAAC,IAAI,CAOd,CAAC;AAEF,eAAO,MAAM,gBAAgB,GACzB,IAAI,EAAE,EACN,oCAAoC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,KACvG,OAAO,CAAC,MAAM,CAIhB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC1B,IAAI,EAAE,EACN,4BAA4B;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,KACvE,OAAO,CAAC,IAAI,CAEd,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAC/B,IAAI,EAAE,EACN,oBAAoB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,KACvD,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAG/D,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Channel-write helpers for streaming schemes. SPEC §5.6 (channel state),
|
|
2
|
+
// §7.1 (subscription registry), §13.6 (stream/event notification).
|
|
3
|
+
//
|
|
4
|
+
// Schemes import these and call them as their connection lifecycle progresses.
|
|
5
|
+
// Helpers update entry_channels (content / state) and subscriptions, and emit
|
|
6
|
+
// stream/event notifications scoped to the entry's session via an optional
|
|
7
|
+
// callback the daemon wires in.
|
|
8
|
+
const channelMeta = (db) => db.channel_meta;
|
|
9
|
+
const appendStmt = (db) => db.append_to_channel;
|
|
10
|
+
const stateStmt = (db) => db.set_channel_state;
|
|
11
|
+
const openSubStmt = (db) => db.open_subscription;
|
|
12
|
+
const closeSubStmt = (db) => db.close_subscription;
|
|
13
|
+
const findActiveStmt = (db) => db.find_active_subscription;
|
|
14
|
+
export const appendToChannel = async (db, { entryId, channel, chunk, notify }) => {
|
|
15
|
+
const result = await appendStmt(db).run({ chunk, entry_id: entryId, channel });
|
|
16
|
+
if (result.changes === 0)
|
|
17
|
+
return;
|
|
18
|
+
if (notify === undefined)
|
|
19
|
+
return;
|
|
20
|
+
const meta = await channelMeta(db).get({ entry_id: entryId, channel });
|
|
21
|
+
if (meta === undefined)
|
|
22
|
+
return;
|
|
23
|
+
notify(meta.session_id, { entryId, channel, state: meta.state, contentLength: meta.contentLength });
|
|
24
|
+
};
|
|
25
|
+
export const setChannelState = async (db, { entryId, channel, state, notify }) => {
|
|
26
|
+
const result = await stateStmt(db).run({ state, entry_id: entryId, channel });
|
|
27
|
+
if (result.changes === 0)
|
|
28
|
+
return;
|
|
29
|
+
if (notify === undefined)
|
|
30
|
+
return;
|
|
31
|
+
const meta = await channelMeta(db).get({ entry_id: entryId, channel });
|
|
32
|
+
if (meta === undefined)
|
|
33
|
+
return;
|
|
34
|
+
notify(meta.session_id, { entryId, channel, state: meta.state, contentLength: meta.contentLength });
|
|
35
|
+
};
|
|
36
|
+
export const openSubscription = async (db, { runId, entryId, scheme, handle }) => {
|
|
37
|
+
const row = await openSubStmt(db).get({ run_id: runId, entry_id: entryId, scheme, handle });
|
|
38
|
+
if (row === undefined)
|
|
39
|
+
throw new Error("openSubscription: INSERT ... RETURNING produced no row");
|
|
40
|
+
return row.id;
|
|
41
|
+
};
|
|
42
|
+
export const closeSubscription = async (db, { subscriptionId, status }) => {
|
|
43
|
+
await closeSubStmt(db).run({ status, subscription_id: subscriptionId });
|
|
44
|
+
};
|
|
45
|
+
export const findActiveSubscription = async (db, { runId, entryId }) => {
|
|
46
|
+
const row = await findActiveStmt(db).get({ run_id: runId, entry_id: entryId });
|
|
47
|
+
return row ?? null;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=ChannelWrite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChannelWrite.js","sourceRoot":"","sources":["../../src/core/ChannelWrite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface PrepMethod {
|
|
2
|
+
run(params?: object): Promise<{
|
|
3
|
+
changes: number;
|
|
4
|
+
lastInsertRowid: number;
|
|
5
|
+
}>;
|
|
6
|
+
get<T = Record<string, unknown>>(params?: object): Promise<T | undefined>;
|
|
7
|
+
all<T = Record<string, unknown>>(params?: object): Promise<T[]>;
|
|
8
|
+
}
|
|
9
|
+
export type ExecMethod = (params?: object) => Promise<unknown>;
|
|
10
|
+
export type Db = {
|
|
11
|
+
close(): Promise<void>;
|
|
12
|
+
ready(): Promise<unknown>;
|
|
13
|
+
} & Record<string, PrepMethod | ExecMethod>;
|
|
14
|
+
//# sourceMappingURL=Db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../src/core/Db.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACvB,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC1E,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CACnE;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE/D,MAAM,MAAM,EAAE,GAAG;IACb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7B,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC"}
|
package/dist/core/Db.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Permissive structural type for SqlRite-managed database handles. SqlRite
|
|
2
|
+
// generates statement-named accessors at runtime (`db.<prep_name>.run/.get/.all`
|
|
3
|
+
// per `-- PREP:` blocks in .sql files). `npm run build:types` from
|
|
4
|
+
// @possumtech/sqlrite produces precise codegen; this alias is the manual
|
|
5
|
+
// fallback typing until that's wired into the build.
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=Db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Db.js","sourceRoot":"","sources":["../../src/core/Db.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,iFAAiF;AACjF,mEAAmE;AACnE,yEAAyE;AACzE,qDAAqD"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { PlurnkStatement } from "@plurnk/plurnk-grammar";
|
|
2
|
+
import type SchemeRegistry from "./SchemeRegistry.ts";
|
|
3
|
+
import { Mimetypes } from "@plurnk/plurnk-mimetypes";
|
|
4
|
+
import type { Db } from "./Db.ts";
|
|
5
|
+
import type { LoopFlags } from "./scheme-types.ts";
|
|
6
|
+
type Origin = "model" | "client" | "system" | "plugin";
|
|
7
|
+
type ChatMessage = {
|
|
8
|
+
role: "system" | "user" | "assistant";
|
|
9
|
+
content: string;
|
|
10
|
+
};
|
|
11
|
+
import type { Provider } from "./ProviderRegistry.ts";
|
|
12
|
+
type DispatchContext = {
|
|
13
|
+
statement: PlurnkStatement;
|
|
14
|
+
sessionId: number;
|
|
15
|
+
runId: number;
|
|
16
|
+
loopId: number;
|
|
17
|
+
turnId: number;
|
|
18
|
+
actionIndex: number;
|
|
19
|
+
origin: Origin;
|
|
20
|
+
onDispatch?: (logEntryId: number) => void;
|
|
21
|
+
};
|
|
22
|
+
type DispatchResult = {
|
|
23
|
+
status: number;
|
|
24
|
+
attrs?: object;
|
|
25
|
+
[key: string]: unknown;
|
|
26
|
+
};
|
|
27
|
+
export type ProposalDecision = "accept" | "reject" | "cancel";
|
|
28
|
+
export interface ProposalResolution {
|
|
29
|
+
decision: ProposalDecision;
|
|
30
|
+
body?: string;
|
|
31
|
+
outcome?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ProposalPendingEvent {
|
|
34
|
+
logEntryId: number;
|
|
35
|
+
sessionId: number;
|
|
36
|
+
runId: number;
|
|
37
|
+
loopId: number;
|
|
38
|
+
turnId: number;
|
|
39
|
+
op: string;
|
|
40
|
+
target: {
|
|
41
|
+
scheme: string | null;
|
|
42
|
+
pathname: string | null;
|
|
43
|
+
};
|
|
44
|
+
body: string;
|
|
45
|
+
attrs: object;
|
|
46
|
+
flags: LoopFlags;
|
|
47
|
+
}
|
|
48
|
+
export declare const fingerprintTurn: (ops: ReadonlyArray<PlurnkStatement>) => string;
|
|
49
|
+
export declare const detectCycle: (history: ReadonlyArray<string>, minCycles: number, maxCyclePeriod: number) => {
|
|
50
|
+
detected: false;
|
|
51
|
+
} | {
|
|
52
|
+
detected: true;
|
|
53
|
+
period: number;
|
|
54
|
+
cycles: number;
|
|
55
|
+
};
|
|
56
|
+
export default class Engine {
|
|
57
|
+
#private;
|
|
58
|
+
constructor({ db, schemes, mimetypes }: {
|
|
59
|
+
db: Db;
|
|
60
|
+
schemes: SchemeRegistry;
|
|
61
|
+
mimetypes?: Mimetypes;
|
|
62
|
+
});
|
|
63
|
+
runLoop({ provider, messages, persona, sessionId, runId, loopId, maxTurns, maxStrikes, minCycles, maxCyclePeriod, origin, signal, onDispatch, }: {
|
|
64
|
+
provider: Provider;
|
|
65
|
+
messages: ChatMessage[];
|
|
66
|
+
persona?: string;
|
|
67
|
+
sessionId: number;
|
|
68
|
+
runId: number;
|
|
69
|
+
loopId: number;
|
|
70
|
+
maxTurns?: number;
|
|
71
|
+
maxStrikes?: number;
|
|
72
|
+
minCycles?: number;
|
|
73
|
+
maxCyclePeriod?: number;
|
|
74
|
+
origin?: Origin;
|
|
75
|
+
signal?: AbortSignal;
|
|
76
|
+
onDispatch?: (logEntryId: number) => void;
|
|
77
|
+
}): Promise<{
|
|
78
|
+
turnIds: number[];
|
|
79
|
+
finalStatus: number;
|
|
80
|
+
hitMaxTurns: boolean;
|
|
81
|
+
reason: "max_turns" | "strike_threshold" | "external" | null;
|
|
82
|
+
}>;
|
|
83
|
+
runTurn({ provider, messages, persona, sessionId, runId, loopId, origin, signal, onDispatch, turnNumber, maxTurns, }: {
|
|
84
|
+
provider: Provider;
|
|
85
|
+
messages: ChatMessage[];
|
|
86
|
+
persona?: string;
|
|
87
|
+
sessionId: number;
|
|
88
|
+
runId: number;
|
|
89
|
+
loopId: number;
|
|
90
|
+
origin?: Origin;
|
|
91
|
+
signal?: AbortSignal;
|
|
92
|
+
onDispatch?: (logEntryId: number) => void;
|
|
93
|
+
turnNumber?: number;
|
|
94
|
+
maxTurns?: number;
|
|
95
|
+
}): Promise<{
|
|
96
|
+
turnId: number;
|
|
97
|
+
status: number;
|
|
98
|
+
statuses: number[];
|
|
99
|
+
fingerprint: string;
|
|
100
|
+
}>;
|
|
101
|
+
dispatch(context: DispatchContext): Promise<DispatchResult>;
|
|
102
|
+
resolveProposal(logEntryId: number, resolution: ProposalResolution): void;
|
|
103
|
+
pendingProposalIds(): number[];
|
|
104
|
+
onProposalPending(listener: (event: ProposalPendingEvent) => void): void;
|
|
105
|
+
}
|
|
106
|
+
export {};
|
|
107
|
+
//# sourceMappingURL=Engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../../src/core/Engine.ts"],"names":[],"mappings":"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"}
|