@plurnk/plurnk-service 0.40.0 → 0.41.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/.env.example ADDED
@@ -0,0 +1,164 @@
1
+ # plurnk-service environment cascade.
2
+ #
3
+ # Override order: `.env.example` < `.env` < `.env.<profile>` < shell < params.
4
+ # Feature-flag bools use `=== "1"` exactly. Never `=== "true"`.
5
+
6
+ # --- Storage ---
7
+ PLURNK_DB_PATH=./plurnk.db
8
+
9
+ # --- Daemon transport ---
10
+ PLURNK_HOST=127.0.0.1
11
+ PLURNK_PORT=3044
12
+
13
+ # --- Model aliases ---
14
+ # PLURNK_MODEL is the active provider for every loop (a client may override per
15
+ # loop via loop.run({alias})). Out of the box it is `plurnk` — the zero-friction
16
+ # default: Plurnk, Inc.'s hosted, grammar-tuned model at model.plurnk.ai, served
17
+ # anonymously with no account on a throttled free tier. Change this one line to
18
+ # use another model; set it empty for no default provider. Prompts on the default
19
+ # route to model.plurnk.ai — see "Plurnk account" below for (optional) creds.
20
+ PLURNK_MODEL=plurnk
21
+
22
+ PLURNK_MODEL_plurnk="plurnk/plurnk"
23
+
24
+ # --- Plurnk account (OPTIONAL) ---
25
+ # Plurnk Service is vendor-agnostic, and connects to (almost) any LLM.
26
+ # Plurnk Service is MIT Licensed and owned by Plurnk Foundation, not Plurnk, Inc.
27
+ # Plurnk, Inc.'s grammar-tuned plurnk.ai model is offered as an optional convenience.
28
+ # You may (OPTIONALLY) obtain free PLURNK_ACCOUNT and PLURNK_KEY variables at https://plurnk.ai.
29
+
30
+ # PLURNK_ACCOUNT="..."
31
+ # PLURNK_KEY="..."
32
+ # The hosted endpoint defaults to https://model.plurnk.ai/v1; override it to self-
33
+ # host the model or point at a mirror — it speaks the llama-server API (same grammar
34
+ # transport) like the local model.
35
+ # PLURNK_BASE_URL="https://model.plurnk.ai/v1"
36
+
37
+ # --- Loop control ---
38
+ # Operator turn ceiling. -1 (default) = no cap (loops end via SEND, budget,
39
+ # strikes, or cycle detection). A positive value is an inviolable hard cap a
40
+ # per-call loop.run({maxTurns}) cannot exceed (min wins).
41
+ PLURNK_MAX_TURNS=-1
42
+ # Per-emission op cap (runaway-loop guard). A client may tighten it per session via
43
+ # session.create settings.maxCommands (min wins); never raise it past this (#232).
44
+ PLURNK_MAX_COMMANDS=99
45
+ PLURNK_RPC_TIMEOUT=30000
46
+ # Post-EXEC breath: after a turn fires a non-inline EXEC whose spawn is still in
47
+ # flight at the turn boundary, wait this many ms before assembling the next packet
48
+ # so a fast exec's output can land in it instead of a turn later. A fixed grace
49
+ # beat, NOT a wait-for-completion (slow execs proceed + surface via the wake path).
50
+ # 0 = off (the model sees fast-exec output a turn late, as today).
51
+ PLURNK_EXEC_WAIT_MS=0
52
+ PLURNK_LOOP_TIMEOUT=86400000
53
+
54
+ # --- Engine rails ---
55
+ PLURNK_MAX_STRIKES=3
56
+ PLURNK_MIN_CYCLES=3
57
+ PLURNK_MAX_CYCLE_PERIOD=4
58
+
59
+ # --- Schemes ---
60
+ # (Workspace root for file ops is per-session — supplied by the client
61
+ # via session.create({projectRoot}) or session.set_root({projectRoot});
62
+ # stored on sessions.project_root. No env-level default.)
63
+
64
+ # --- Git integration ---
65
+ # PLURNK_GIT_ALLOWED — hard ceiling for git membership + integration (repo telemetry,
66
+ # EXEC[git]). =1 permits it (then declared repos + per-session config decide; a client
67
+ # may deny its own session via session.create settings.git:false, #232); =0 flatly
68
+ # denies it service-wide, un-re-enableable (the sandbox/benchmark lockout).
69
+ PLURNK_GIT_ALLOWED=1
70
+ # PLURNK_GIT_AUTO — default repo declaration. =1 auto-declares an implicit `repo` at
71
+ # project_root (no-op when it isn't a git tree); =0 declares nothing — clients add
72
+ # repos explicitly via the `repo` overlay. SPEC §membership forest.
73
+ PLURNK_GIT_AUTO=1
74
+
75
+ # --- Reference docs (auto-READ at turn 0) ---
76
+ # PLURNK_MD_<ALIAS>=<path> materializes <path>'s markdown as a plurnk://<ALIAS>.md
77
+ # entry the model READs at turn 0 — an idiomatic way to inject standing context
78
+ # (an ordinary entry + READ op, not a bespoke packet section). ~ expands to home;
79
+ # relative paths resolve against the package root. A client may add its own docs
80
+ # per session via session.create settings.mdDocs (content, not a path); those UNION
81
+ # with these env docs, keyed by alias — the client wins a collision (#231).
82
+ # Commented out = no docs by default.
83
+ # PLURNK_MD_POLICY=~/.plurnk/AGENTS.md
84
+
85
+ # Turn-0 manifest preview: foist a READ of plurnk://manifest.json into the model's
86
+ # first turn so a run opens with the session catalog, not blank. -1 = the full
87
+ # manifest; N = the first N items (jsonpath slice); 0 = off. The service sets this
88
+ # servicewide default; a client may override it per session via
89
+ # session.create settings.manifestItems, which replaces this value (#231).
90
+ PLURNK_MANIFEST_ITEMS=-1
91
+
92
+ # Session-tier ceiling on CONCURRENT active runs (a run with a non-terminal loop)
93
+ # — the fork-bomb / destabilization brake. -1 = no cap (default); only concurrency
94
+ # is bounded, never lifetime, since sessions persist for months. A spawn/fork past
95
+ # the ceiling fails hard (508 — no queue, no retry); the acting run counts itself.
96
+ PLURNK_SESSION_RUNS_MAX_ACTIVE=-1
97
+
98
+ # --- Providers (universal knobs) ---
99
+ # Reasoning budget (providers 0.2.5+): the single provider reasoning gate. REQUIRED,
100
+ # fail-hard if unset — 0 = native reasoning off (in-DSL PLAN does the reasoning), -1 =
101
+ # adaptive / no cap, N = capped at N tokens. Provider modules translate it per model
102
+ # family (reasoning_effort tiers, budget_tokens). Floor (gemma): 0.
103
+ PLURNK_PROVIDERS_REASONING_BUDGET=0
104
+ #
105
+ # Planning: enable the grammar's <<PLAN:...:PLAN op so the model reasons in-band before
106
+ # acting. A shared universal knob (like PLURNK_FETCH_TIMEOUT below): the service advertises
107
+ # the op in # Plurnk System Tools; the provider reads it too. =1 on, =0 off.
108
+ PLURNK_PLAN=1
109
+ # Service-wide fetch timeout in ms — the universal upper bound on any
110
+ # single outbound request (provider calls, future http:// scheme reads,
111
+ # anything that does network IO). Streamed completions can run long;
112
+ # default 600000 (10 minutes). Provider/scheme modules MAY have their
113
+ # own vendor-specific overrides for narrower defaults, but they honor
114
+ # this as the operator's universal ceiling.
115
+ PLURNK_FETCH_TIMEOUT=600000
116
+ # PLURNK_VERSION_POLL_TTL — how long (ms) discover caches its npm-registry version poll
117
+ # (service + client `latest`) before a background refresh. Best-effort; the poll never
118
+ # blocks discover, and offline/registry-down omits `latest`. ~hourly is plenty. #235
119
+ PLURNK_VERSION_POLL_TTL=3600000
120
+ # Grammar-constrained sampling: SELECTS the GBNF variant the provider constrains
121
+ # every generate() to, so capable backends (llama-server, detected via the
122
+ # /v1/models fingerprint) can only sample valid plurnk DSL; others drop it silently.
123
+ # A bare name (plurnk.gbnf) is a variant shipped by
124
+ # @plurnk/plurnk-grammar; an absolute/relative path is your own. =0 (or empty) disables.
125
+ PLURNK_PROVIDERS_GBNF=plurnk.gbnf
126
+ # Provider retry attempts (providers 0.7+): how many times generate() retries a
127
+ # TRANSIENT failure (429 rate-limit, 5xx/network) with exponential backoff (base 2s
128
+ # is a provider constant — the COUNT is the operator knob). REQUIRED, fail-hard if
129
+ # unset. Terminal errors (auth, quota, model refusal) never retry. 0 = no retries.
130
+ PLURNK_PROVIDER_RETRY_ATTEMPTS=3
131
+ # Override the model's reported context window in tokens. Provider modules
132
+ # normally read this from the model/API; set this to force a specific
133
+ # value (smaller for testing, larger for models that under-report). Unset
134
+ # = trust the provider's default.
135
+ # PLURNK_PROVIDER_CONTEXT_SIZE=
136
+
137
+ # --- Plugins (third-party trust) ---
138
+ # Trust gate over scope-agnostic plugin discovery across the four families
139
+ # (schemes, mimetypes, providers, execs): installed = discoverable, but this
140
+ # decides installed = TRUSTED — once, at the host, not re-answered per family.
141
+ # =0 / empty / unset → OFF: every installed plugin loads (today's behavior, no
142
+ # regression). A value → ON: @plurnk/* is always trusted, plus a comma-separated
143
+ # allowlist of additionally-trusted packages (anything else discovered is skipped
144
+ # with a telemetry note, never a crash). Use 1 (a value naming no real package)
145
+ # for "on, zero third-party". Example: =acme-execs-cobol,@firewolf/firepad
146
+ PLURNK_PLUGINS_TRUSTED_ONLY=0
147
+
148
+ # --- Semantic search (~query chunking) ---
149
+ # Project Semantics tiles each entry into <=window chunks so a large body is fully
150
+ # searchable, not truncated. ACTIVE only when the installed embedder reports its
151
+ # tokenizer; otherwise one whole-entry chunk (today's behavior). Both knobs are read
152
+ # only when chunking is active.
153
+ # Chunk budget in TOKENS. EMPTY (the default) = the installed embedder's reported
154
+ # window — NO model-specific number is assumed, so it scales to whatever embedder you
155
+ # install. Set a positive value ONLY to cap below the window (e.g. to sweep
156
+ # granularity); it is clamped to the window either way.
157
+ PLURNK_SEMANTIC_CHUNK_TOKENS=
158
+ # Overlap fraction [0,1): trailing context re-covered at each chunk boundary so a
159
+ # concept split across a cut still matches in both. ~0.15 is a standard RAG default.
160
+ PLURNK_SEMANTIC_CHUNK_OVERLAP=0.15
161
+
162
+ # --- Diagnostics ---
163
+ PLURNK_DEBUG=0
164
+ PLURNK_LOG_LEVEL=info
package/README.md CHANGED
@@ -6,7 +6,7 @@ Default Provider: [plurnk.ai](https://plurnk.ai).
6
6
  * Plurnk Service is vendor-agnostic, and connects to (almost) any LLM.
7
7
  * Plurnk Service is MIT Licensed and owned by Plurnk Foundation, not Plurnk, Inc.
8
8
  * Plurnk, Inc.'s grammar-tuned [plurnk.ai](https://plurnk.ai) model is offered as an optional convenience.
9
- * You may (OPTIONALLY) obtain PLURNK_ACCOUNT and PLURNK_KEY variables at [plurnk.ai](https://plurnk.ai).
9
+ * You may (OPTIONALLY) obtain free PLURNK_ACCOUNT and PLURNK_KEY variables at [plurnk.ai](https://plurnk.ai).
10
10
 
11
11
  ## Documentation
12
12
 
package/SPEC.md CHANGED
@@ -156,13 +156,13 @@ Server posture: this package is the runtime. User-facing CLI lives in `plurnk` a
156
156
 
157
157
  **One filesystem.** The entries are the session's: `entries.session_id`, never a run. A write by any run is a write to the one filesystem every run reads; there is no per-run entry set. {§machine-processes-one-filesystem}
158
158
 
159
- **One overlay.** Membership — `git ls-files ∪ addignore` with read-only (§membership) — is the session's: `session_constraints.session_id`, never a run. It is workspace *curation*, and the workspace *is* the session; two runs are two conversations about one curated workspace and see the same one. Divergent membership is a different session, never a per-run overlay. {§machine-processes-one-overlay}
159
+ **One overlay.** Membership — `git ls-files ∪ pickhide` with `view` read-only (§membership) — is the session's: `session_constraints.session_id`, never a run. It is workspace *curation*, and the workspace *is* the session; two runs are two conversations about one curated workspace and see the same one. Divergent membership is a different session, never a per-run overlay. {§machine-processes-one-overlay}
160
160
 
161
161
  **A run is its log — and nothing beside.** The run-private state is the log and only the log. *What I am looking at* (OPEN/FOLD) is `log_entries.expanded`, a bit on the run's own rows, toggled by ordinary `log:///` ops — not a second store, and never membership (§open-fold). *What I last saw* needs no shadow either: a run learns its world moved through log entries (§env-delta) — a sibling's write broadcast into its log, an out-of-band disk change detected against the entry's own content and broadcast the same way — never through a per-run snapshot the run cannot see. The log is the whole of a run's memory. {§machine-processes-run-is-its-log}
162
162
 
163
163
  **A run's log is private to packets, not to the session.** Isolation (§actor-boundary) governs what an *actor* sees — its own run, never a sibling's. It does not wall off the *wire*: any connection may read any run's log in its session by id — `log.read({ runId })`, ownership-verified, defaulting to the connection's own run. This is how a conversation client reads the **model** run, where the conversation lives: `loop.run` returns its `modelRunId`, and `session.runs` enumerates a session's runs for a connection that did not drive it live. The read is observation, never packet membership — no actor sees it. {§machine-processes-model-run-readable}
164
164
 
165
- **A run carries its actor.** Each run records its `origin` — `model` (the conversation), `client` (a connection's own run), or `plurnk` (the runtime's self-hosting run) — set once at creation and inherited by a fork. `session.runs` returns it, so a conversation client identifies the model run by its actor, not by parsing a renameable name. {§machine-processes-run-origin}
165
+ **A run carries its actor.** Each run records its `origin` — `model` (the conversation), `client` (a connection's own run), or `plurnk` (the runtime's self-hosting run) — set once at creation and inherited by a fork. `session.runs` returns it, so a conversation client identifies the model run by its actor, not by parsing the name — which is set at instantiation and immutable, never renamed (a run is permanent history, §machine-processes-run-is-its-log). {§machine-processes-run-origin}
166
166
 
167
167
  **Fork — copy the log, share the world.** A fork is a new run in the *same* session (`runs.parent_run_id`, §lifecycle-terms). It copies the **log** — the rows, their fold-state riding along — so the branch inherits everything the parent observed (§env-delta makes a run's timeline self-contained for exactly this) and diverges freely after. {§machine-processes-fork-copies-the-log} It shares the **world** — the one filesystem, the one overlay — live and uncopied, because the run never owned it. {§machine-processes-fork-shares-the-world}
168
168
 
@@ -856,9 +856,10 @@ registry.register("loop.run", {
856
856
  | `session.runs` | `id?: number` | `{ runs: Run[] }` | Lists runs in a session (defaults to attached session); most-recent first. |
857
857
  | `session.prompts` | `id?: number`, `limit?: number` | `{ prompts: string[] }` | A session's prior user prompts (the conversation run's loop seeds), newest-first, capped by `limit` (default 100); defaults to attached session. Lets a client seed up/down recall without log archaeology. |
858
858
  | `session.set_root` | `projectRoot: string \| null` | `{ projectRoot }` | Update the workspace pointer on the attached session. Null reverts to headless. |
859
- | `session.constrain` | `effect: "add" \| "ignore" \| "read-only"`, `glob: string` | `{ effect, glob }` | Add a workspace membership constraint (§membership overlay): `add` admits files git misses, `ignore` drops tracked matches, `read-only` admits for read but refuses edits. Immediate. |
860
- | `session.unconstrain` | `effect: "add" \| "ignore" \| "read-only"`, `glob: string` | `{ effect, glob }` | Remove a membership constraint — the inverse of `session.constrain`. Immediate. |
859
+ | `session.constrain` | `effect: "pick" \| "hide" \| "view" \| "repo"`, `glob: string` | `{ effect, glob }` | Add a workspace membership constraint (§membership overlay): `pick` admits a file git misses (the sole source when git is absent), `hide` drops a tracked match, `view` admits a member read-only (refused at the edit gate), `repo` declares a git repo folder anywhere so its members join the manifest. Immediate. |
860
+ | `session.unconstrain` | `effect: "pick" \| "hide" \| "view" \| "repo"`, `glob: string` | `{ effect, glob }` | Remove a membership constraint (the `drop` verb) — the inverse of `session.constrain`. Immediate. |
861
861
  | `session.constraints` | none | `{ constraints }` | List the attached session's membership constraints. |
862
+ | `session.members` | none | `{ members: [{ path, effect }], hidden }` | Resolve each project file's membership effect — `members` tagged `member`/`view` plus the `hide`-excluded `hidden` — so a client signs file visibility (member / read-only / ignored) without reimplementing the overlay glob-matching (§membership-resolved-effects). |
862
863
 
863
864
  **Re-binding.** `session.create` and `session.attach` may be called on a connection that already has a session attached — the connection switches in place, releasing the prior client loop (closed at 200). No reconnect needed to change session or run. {§methods-rebind}
864
865
 
@@ -1,5 +1,5 @@
1
1
  import type { Db } from "./Db.ts";
2
2
  export default class Fork {
3
- static fork(db: Db, parentRunId: number): Promise<number>;
3
+ static fork(db: Db, parentRunId: number, name?: string): Promise<number>;
4
4
  }
5
5
  //# sourceMappingURL=fork.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fork.d.ts","sourceRoot":"","sources":["../../src/core/fork.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,SAAS,CAAC;AAE9C,MAAM,CAAC,OAAO,OAAO,IAAI;WACR,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAqClE"}
1
+ {"version":3,"file":"fork.d.ts","sourceRoot":"","sources":["../../src/core/fork.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,SAAS,CAAC;AAE9C,MAAM,CAAC,OAAO,OAAO,IAAI;WACR,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAsCjF"}
package/dist/core/fork.js CHANGED
@@ -7,12 +7,13 @@
7
7
  // copied, because a run never owned them. The §env-delta reconciliation snapshot is
8
8
  // not copied either; the branch first-sights its world like any fresh run.
9
9
  export default class Fork {
10
- static async fork(db, parentRunId) {
10
+ static async fork(db, parentRunId, name) {
11
11
  const parent = await db.fork_get_run.get({ id: parentRunId });
12
12
  if (parent === undefined)
13
13
  throw new Error(`fork: run ${parentRunId} not found`);
14
+ // #248 — name the branch at instantiation (immutable after); default `<parent>-fork`.
14
15
  const branch = await db.fork_insert_run.get({
15
- session_id: parent.session_id, name: `${parent.name}-fork`, parent_run_id: parentRunId, origin: parent.origin,
16
+ session_id: parent.session_id, name: name ?? `${parent.name}-fork`, parent_run_id: parentRunId, origin: parent.origin,
16
17
  });
17
18
  if (branch === undefined)
18
19
  throw new Error("fork: branch run insert returned no row");
@@ -1 +1 @@
1
- {"version":3,"file":"fork.js","sourceRoot":"","sources":["../../src/core/fork.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fork.js","sourceRoot":"","sources":["../../src/core/fork.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"exec-env.d.ts","sourceRoot":"","sources":["../../src/schemes/exec-env.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,OAAO,OAAO,OAAO;;IAOxB,MAAM,CAAC,MAAM,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,UAAU;CAQzE"}
1
+ {"version":3,"file":"exec-env.d.ts","sourceRoot":"","sources":["../../src/schemes/exec-env.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,OAAO,OAAO,OAAO;;IAYxB,MAAM,CAAC,MAAM,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,UAAU;CAQzE"}
@@ -13,7 +13,12 @@
13
13
  // plurnk-execs#8) spawns with the env it is handed.
14
14
  import { STANDARD_PROVIDERS } from "@plurnk/plurnk-providers";
15
15
  export default class ExecEnv {
16
- static #providerKeys = new Set(Object.values(STANDARD_PROVIDERS).map((spec) => spec.apiKeyVar));
16
+ // apiKeyVar is optional (providers 0.9.0): an anonymous provider like `plurnk`
17
+ // has none. It loses no secret here — plurnk's PLURNK_KEY/PLURNK_ACCOUNT creds are
18
+ // already stripped by the PLURNK_ prefix rule below — so drop the empties.
19
+ static #providerKeys = new Set(Object.values(STANDARD_PROVIDERS)
20
+ .map((spec) => spec.apiKeyVar)
21
+ .filter((v) => v !== undefined));
17
22
  // Read at call time (not memoized) so a secret set into process.env after boot is
18
23
  // still scoped out of the next spawn.
19
24
  static scoped(env = process.env) {
@@ -1 +1 @@
1
- {"version":3,"file":"exec-env.js","sourceRoot":"","sources":["../../src/schemes/exec-env.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,qFAAqF;AACrF,oFAAoF;AACpF,8EAA8E;AAC9E,wFAAwF;AACxF,qFAAqF;AACrF,kEAAkE;AAClE,EAAE;AACF,mFAAmF;AACnF,mFAAmF;AACnF,yFAAyF;AACzF,oDAAoD;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,CAAC,OAAO,OAAO,OAAO;IACxB,MAAM,CAAC,aAAa,GAAwB,IAAI,GAAG,CAC/C,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAClE,CAAC;IAEF,kFAAkF;IAClF,sCAAsC;IACtC,MAAM,CAAC,MAAM,CAAC,MAAyB,OAAO,CAAC,GAAG;QAC9C,MAAM,GAAG,GAAsB,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAE,uCAAuC;YACnH,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC"}
1
+ {"version":3,"file":"exec-env.js","sourceRoot":"","sources":["../../src/schemes/exec-env.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,qFAAqF;AACrF,oFAAoF;AACpF,8EAA8E;AAC9E,wFAAwF;AACxF,qFAAqF;AACrF,kEAAkE;AAClE,EAAE;AACF,mFAAmF;AACnF,mFAAmF;AACnF,yFAAyF;AACzF,oDAAoD;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,CAAC,OAAO,OAAO,OAAO;IACxB,+EAA+E;IAC/E,mFAAmF;IACnF,2EAA2E;IAC3E,MAAM,CAAC,aAAa,GAAwB,IAAI,GAAG,CAC/C,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC;SAC5B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CACnD,CAAC;IAEF,kFAAkF;IAClF,sCAAsC;IACtC,MAAM,CAAC,MAAM,CAAC,MAAyB,OAAO,CAAC,GAAG;QAC9C,MAAM,GAAG,GAAsB,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAE,uCAAuC;YACnH,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"run_fork.d.ts","sourceRoot":"","sources":["../../../src/server/methods/run_fork.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAQvD,MAAM,CAAC,OAAO,OAAO,aAAa;IAC9B,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;CA0BlD"}
1
+ {"version":3,"file":"run_fork.d.ts","sourceRoot":"","sources":["../../../src/server/methods/run_fork.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAUvD,MAAM,CAAC,OAAO,OAAO,aAAa;IAC9B,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;CAoClD"}
@@ -5,6 +5,7 @@
5
5
  // conversation); the conversation client (e.g. :AI????) forks it, then reads the
6
6
  // branch via log.read({runId}).
7
7
  import Fork from "../../core/fork.js";
8
+ import Envelope from "../envelope.js";
8
9
  export default class RunForkMethod {
9
10
  static register(registry) {
10
11
  registry.registerMethod("run.fork", {
@@ -12,6 +13,18 @@ export default class RunForkMethod {
12
13
  if (ctx.session === null)
13
14
  throw new Error("run.fork requires an attached session");
14
15
  const p = params;
16
+ // #248 — name at instantiation, immutable after. Mirror session.attach's runName:
17
+ // non-empty + reject reserved; and (runs.name is UNIQUE per session) refuse a taken
18
+ // name up front rather than fail at the insert. No run.rename — names are frozen.
19
+ if (p.name !== undefined) {
20
+ if (typeof p.name !== "string" || p.name.length === 0)
21
+ throw new Error("run.fork: name must be a non-empty string");
22
+ if (Envelope.RESERVED_RUN_NAMES.has(p.name.toLowerCase()))
23
+ throw new Error(`run.fork: name "${p.name}" is reserved`);
24
+ const taken = await ctx.db.envelope_get_run_by_name.get({ session_id: ctx.session.sessionId, name: p.name });
25
+ if (taken !== undefined)
26
+ throw new Error(`run.fork: a run named "${p.name}" already exists — run names are immutable, pick another`);
27
+ }
15
28
  let runId = p.runId;
16
29
  if (runId === undefined) {
17
30
  if (ctx.session.modelRunId === null)
@@ -27,13 +40,14 @@ export default class RunForkMethod {
27
40
  if (owner.session_id !== ctx.session.sessionId)
28
41
  throw new Error(`run.fork: run ${runId} is not in this session`);
29
42
  }
30
- const branchRunId = await Fork.fork(ctx.db, runId);
43
+ const branchRunId = await Fork.fork(ctx.db, runId, p.name);
31
44
  const branch = await ctx.db.envelope_get_run_by_id.get({ id: branchRunId });
32
45
  return { runId: branchRunId, runName: branch?.name ?? null, parentRunId: runId };
33
46
  },
34
- description: "Fork a run — branch its log into a new run in the same session (parent_run_id lineage), sharing the session's world (entries + overlay), copying nothing of it. Defaults to the session's model run (the conversation); an explicit runId forks any run in the session (ownership-checked). Returns the new run's {runId, runName}; a conversation client reads it via log.read({runId}). §machine-processes / #228.",
47
+ description: "Fork a run — branch its log into a new run in the same session (parent_run_id lineage), sharing the session's world (entries + overlay), copying nothing of it. Defaults to the session's model run (the conversation); an explicit runId forks any run in the session (ownership-checked). Optional `name` names the branch at instantiation — immutable after (no rename; a run is permanent history, §machine-processes-run-is-its-log), reserved + taken names rejected (mirrors session.attach); defaults to `<parent>-fork`. Returns the new run's {runId, runName}; a conversation client reads it via log.read({runId}). §machine-processes / #228.",
35
48
  params: {
36
49
  runId: "number? — the run to fork; defaults to the session's current model run (the conversation)",
50
+ name: "string? — name the branched run at instantiation (immutable; reserved/taken names rejected). Defaults to <parent>-fork.",
37
51
  },
38
52
  requiresInit: true,
39
53
  });
@@ -1 +1 @@
1
- {"version":3,"file":"run_fork.js","sourceRoot":"","sources":["../../../src/server/methods/run_fork.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,+EAA+E;AAC/E,kFAAkF;AAClF,4EAA4E;AAC5E,iFAAiF;AACjF,gCAAgC;AAIhC,OAAO,IAAI,MAAM,oBAAoB,CAAC;AAMtC,MAAM,CAAC,OAAO,OAAO,aAAa;IAC9B,MAAM,CAAC,QAAQ,CAAC,QAAwB;QACpC,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE;YAChC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;gBAC3B,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBACnF,MAAM,CAAC,GAAG,MAAgB,CAAC;gBAC3B,IAAI,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBACpB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACtB,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,IAAI;wBAAE,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;oBAChI,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACJ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;wBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;oBACjH,MAAM,KAAK,GAAG,MAAO,GAAG,CAAC,EAAE,CAAC,sBAAqC,CAAC,GAAG,CAAyB,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC7G,IAAI,KAAK,KAAK,SAAS;wBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,YAAY,CAAC,CAAC;oBAC7E,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,CAAC,OAAO,CAAC,SAAS;wBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,yBAAyB,CAAC,CAAC;gBACrH,CAAC;gBACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACnD,MAAM,MAAM,GAAG,MAAO,GAAG,CAAC,EAAE,CAAC,sBAAqC,CAAC,GAAG,CAAmB,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC9G,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;YACrF,CAAC;YACD,WAAW,EAAE,sZAAsZ;YACna,MAAM,EAAE;gBACJ,KAAK,EAAE,2FAA2F;aACrG;YACD,YAAY,EAAE,IAAI;SACrB,CAAC,CAAC;IACP,CAAC;CACJ"}
1
+ {"version":3,"file":"run_fork.js","sourceRoot":"","sources":["../../../src/server/methods/run_fork.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plurnk/plurnk-service",
3
- "version": "0.40.0",
3
+ "version": "0.41.0",
4
4
  "description": "Plurnk agent runtime — the server / engine / core. Implements the @plurnk/plurnk-grammar contract.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -18,6 +18,7 @@
18
18
  "plurnk-service": "./bin/plurnk-service.ts"
19
19
  },
20
20
  "files": [
21
+ ".env.example",
21
22
  "bin/plurnk-service.ts",
22
23
  "dist/**/*",
23
24
  "migrations/**/*.sql",
@@ -46,12 +47,12 @@
46
47
  "dependencies": {
47
48
  "@plurnk/plurnk-execs": "0.4.8",
48
49
  "@plurnk/plurnk-execs-all": "0.1.5",
49
- "@plurnk/plurnk-grammar": "0.56.0",
50
+ "@plurnk/plurnk-grammar": "0.60.0",
50
51
  "@plurnk/plurnk-mimetypes": "0.15.19",
51
52
  "@plurnk/plurnk-mimetypes-embeddings": "0.2.0",
52
- "@plurnk/plurnk-providers": "0.8.0",
53
+ "@plurnk/plurnk-providers": "0.9.0",
53
54
  "@plurnk/plurnk-providers-all": "0.8.0",
54
- "@plurnk/plurnk-schemes": "0.15.0",
55
+ "@plurnk/plurnk-schemes": "0.18.0",
55
56
  "@plurnk/plurnk-schemes-all": "0.1.1",
56
57
  "@possumtech/sqlrite": "5.1.1",
57
58
  "diff": "^9.0.0",