@prismer/runtime 1.9.24 → 2.0.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,208 @@
1
1
  # Changelog — @prismer/runtime
2
2
 
3
+ ## Unreleased
4
+
5
+ ## v2.0.1 — 2026-05-21 — Skill multi-file manifest protocol (§A.7 Phase 1) + URL asset fetch
6
+
7
+ Coordinated v2.0.1 patch release. `/VERSION` → 2.0.1. Internal preview only;
8
+ open-source npm publish deferred.
9
+
10
+ ### Added — Multi-file Skill Manifest protocol (agentskills.io 合规)
11
+
12
+ `src/daemon/skill-sync.ts` extended for the §A.7 multi-file manifest
13
+ protocol. Existing single-file callers stay functional via dual-write on
14
+ cloud side.
15
+
16
+ - **New wire shape**: cloud `/api/im/skills/installed` now returns
17
+ `skill.contentManifest` (JSON `files[]`) + `skill.contentManifestRevision`
18
+ (merkle). Daemon parses files[], per-file writes to
19
+ `<skillsRoot>/<slug>/<path>`, per-file sha256 verifies, computes merkle,
20
+ acks back to cloud.
21
+ - **`computeMerkle(files)`** export — sha256 of sorted `"path:sha256\n"`
22
+ lines. Same formula the cloud uses, so
23
+ `IMAgentSkill.installedRevision == manifestRevision` after ack.
24
+ - **Hybrid inline/url storage** — files ≤ 100 KB inline as base64;
25
+ > threshold goes to S3 presigned URL (env-overridable via
26
+ `PRISMER_SKILL_INLINE_THRESHOLD_BYTES`).
27
+ - **Path traversal guard** — `isSafeRelativePath` rejects `..`, absolute
28
+ paths, symlink-escaping joins. Double-checked at the writeFile call site.
29
+ - **Legacy single-file fallback** — when cloud row has `contentManifest=null`
30
+ (pre-migration 400), daemon synthesises a single-file manifest
31
+ `[{path:"SKILL.md", sha256: sha256(content)}]` and acks the same merkle
32
+ the cloud computes (cloud side aligned in this release too).
33
+
34
+ ### Added — `AssetCache.getOrFetchUrl()` — public URL fetch with SSRF + size + redirect guards
35
+
36
+ `src/asset-cache.ts` new helper mirrors `getOrFetch` shape but takes a URL.
37
+ Hash computed after download; cache-key = sha256 of body bytes.
38
+
39
+ - **SSRF guard**: DNS-resolves host before each hop, rejects loopback /
40
+ RFC1918 / link-local / cloud-metadata IPv4 + IPv6 ULA/link-local.
41
+ Cross-host redirects re-validate before following.
42
+ - **Manual redirect chain** — max 3 hops; refuses loops.
43
+ - **Hard timeout** — default 15 s, override via env
44
+ `PRISMER_URL_FETCH_TIMEOUT_MS`.
45
+ - **Streaming read with abort-at-limit** — default 5 MiB, override via env
46
+ `PRISMER_URL_FETCH_MAX_BYTES`. Truncated bodies are NOT cached.
47
+ - Non-2xx throws; caller surfaces an `error` observation.
48
+
49
+ ### Tests
50
+
51
+ - 11 new `test/skill-sync-multifile.test.ts` (mocked cloud, real file
52
+ writes to tmpdir, sha256 + merkle verification).
53
+ - Runtime vitest 362/362 PASS.
54
+
55
+ ## v2.0.0 — 2026-05-19 — `prismer` daemon bin retained + Skill Gate GA
56
+
57
+ Coordinated v2.0.0 GA. `/VERSION` (single source of truth) → 2.0.0 via
58
+ `sdk/build/version.sh`. The headline bin-split was resolved by keeping
59
+ `@prismer/runtime` on `bin: { prismer }` (daemon priority is higher than
60
+ SDK, so the daemon claims the canonical name) and renaming `@prismer/sdk`
61
+ to `bin: { cloud }` instead.
62
+
63
+ ### Changed — **Binary retained: `bin: prismer`** (daemon priority decision, 2026-05-19)
64
+
65
+ - `package.json` `bin` keeps mapping `prismer` → `./dist/cli.js`. `@prismer/sdk`
66
+ renamed its binary to `cloud` (see `@prismer/sdk` CHANGELOG). The two bins
67
+ now coexist — sandbox image install order no longer creates conflicts.
68
+ - Executable shim at `src/bin/prismer.ts`. Tsup emits to `dist/cli.js`;
69
+ package.json bin maps it to `prismer`.
70
+ - `cli/index.ts`: `new Command('prismer')` (unchanged from v1.x); `--help`
71
+ and parse errors report `Usage: prismer [options]`.
72
+ - Help text + error prefixes + cookbook references stay on `prismer` across
73
+ `src/cli/*`, `src/cli/commands/*`, `src/config.ts`, `src/daemon-id.ts`,
74
+ `src/pair.ts`, `src/index.ts`. (An intermediate Session-3 commit had
75
+ temporarily renamed these to a daemon-suffixed form; reverted before GA
76
+ per user direction.)
77
+ - See `docs/release200/02-v20-daemon-runtime-plan.md` §CLI 边界更新 for the
78
+ rationale (fixes v1.x sandbox-image bin clobber bug that caused the v2.0
79
+ Built-in skill Kanban scheduling regression).
80
+
81
+ ### Changed — **VERSION sync**
82
+
83
+ - `cli/index.ts` `VERSION` literal synced from 1.9.7 → 2.0.0. Now sourced
84
+ from `/VERSION` via `sdk/build/version.sh`.
85
+
86
+ ### Added — **Skill Gate foundation (v2.0 GA gate)**
87
+
88
+ The Skill Gate (cloud `/skills/ack` round-trip + dispatch-time skill sync
89
+ + `SkillLoader` per-adapter) was incrementally landed across 1.9.x cuts.
90
+ v2.0 promotes it to GA. Recap of the components carried by this release:
91
+
92
+ - **SkillSyncManager** (`daemon/skill-sync.ts`): reconciles
93
+ `agent.skills.list` ↔ local `~/.prismer/agents/<id>/skills/`,
94
+ writes `SKILL.md` to disk, replies `skills.ack` once content is durable.
95
+ - **SkillLoader SPI**: adapters can opt into per-dispatch skill payload
96
+ composition. Hermes + OpenClaw implement; Codex + claude-code are no-ops
97
+ in 2.0 (skill sync still writes files to disk for those, but the
98
+ dispatch-time injection is gated by adapter capability).
99
+ - **v2.0 Skill Gate scope**: dispatch-time skill payload coverage validated
100
+ for `hermes` + `openclaw` only. `codex` + `claude-code` skill sync remains
101
+ a file-write no-op pending adapter framework support (tracked v2.1+).
102
+ - Live-gate evidence: `dev-loop.sh skill-live-gate` /
103
+ `scripts/sandbox/e2e/skill-agent-dispatch-live.ts` capture 21 Built-in +
104
+ 1 magic-marker skill in `POST /v1/runs.instructions` (~31 KB payload).
105
+ See `docs/release200/evidence/05-live-dispatch-gate-2026-05-19.md`.
106
+
107
+ ### Added — **Origin Adapter framework** (promoted from "Unreleased")
108
+
109
+ `daemon/asset/origin/` — daemon-side asset producers behind a uniform
110
+ OriginAdapter SPI (doc 26 §4 Phase 2). Foundation for the v2.0 `assets` +
111
+ `ingest` Built-in skills.
112
+
113
+ - **SPI** (`spi.ts`): `OriginAdapter` interface with
114
+ `kind: 'upload' | 'drop-folder' | 'agent-gen'`,
115
+ `observe / identifySource / fetch` decomposition. Identification stays
116
+ separate from byte fetch so the outbox can dedupe before paying read cost.
117
+ - **Outbox** (`outbox.ts`): SQLite-backed pending-upload queue mirroring
118
+ `daemon/memory/outbox.ts` shape — Zod validation → dead-letter,
119
+ `idempotencyKey = sha256(originKind|wid|sourceRef|observedAt)` UNIQUE,
120
+ `claimNext()` transactional, `recordFailure(maxAttempts)` auto-spills to
121
+ dead-letter. Restart-resume-friendly.
122
+ - **Drop-folder adapter** (`drop-folder.ts`): polls
123
+ `~/.prismer/workspaces/<wid>/drop/` (1 s tick, recursive), enqueues
124
+ observations, moves files to `uploaded/` on success and `upload-failed/`
125
+ on persistent failure.
126
+ - **Agent-gen adapter** (`agent-gen.ts`): synchronous
127
+ `handleAssetWrite(body, { cloud })` for the `POST /local/asset/write` RPC.
128
+ - **Web-upload adapter** (`web-upload.ts`): cloud-side marker class for SPI
129
+ symmetry.
130
+ - **Upload runner** (`upload-runner.ts`): generic worker draining the
131
+ outbox; `onUploadSuccess` / `onUploadFailure` hooks per adapter.
132
+ - **`POST /local/asset/write` route** (`local-server.ts`): wires
133
+ `onAssetWrite` sink alongside `onDispatch` / `attachMemory`. Returns
134
+ `{ assetId, contentHash, prismerUri }`. 400 / 502 / 501 error contract.
135
+
136
+ ### Added — **memory-curation skill** (promoted from "Unreleased")
137
+
138
+ - **Codex adapter** (`adapters/codex/index.ts`): `buildCodexPrompt()`
139
+ extracted as pure function; injects `MEMORY_CURATION_SKILL_TEXT` as
140
+ system-prompt preamble (Codex has no native skill framework).
141
+ - **Embedded skill module** (`src/skills/memory-curation.ts`): regenerated
142
+ from canonical `sdk/prismer-cloud/skill/memory-curation.md` via
143
+ `scripts/regenerate-memory-curation-skill.cjs`.
144
+
145
+ ### Added — **CLI hardening pass** (promoted from "Unreleased")
146
+
147
+ Audit of the 16-verb CLI surface. No new daemon behavior; existing commands
148
+ now fail closed and emit consistent JSON.
149
+
150
+ - **`prismer config (path|show|set)`** — inspect or edit `~/.prismer/config.toml`.
151
+ `show` redacts the api_key by default; `--reveal` prints clear text.
152
+ `set cloud_api_base <url>` runs through `normalizeCloudUrl`,
153
+ `set api_key sk-…` validates the key format.
154
+ - **`prismer setup --check`** — dry-run mode. Validates `--cloud`, prints
155
+ the would-be config target and api-key source, returns without touching
156
+ disk. JSON: `{ok:true, check:true, mode, cloud, …}`.
157
+ - **Default `--cloud` URL is `https://prismer.cloud`** (was
158
+ `https://cloud.prismer.dev`). Visible in `setup --help` / `pair --help`.
159
+ - **Stable error codes** on every CLI exit path so JSON consumers can
160
+ branch on `error.code` (e.g. `invalid_cloud_url`, `config_missing`,
161
+ `task_create_failed`).
162
+
163
+ ### Fixed — **CLI hardening pass** (promoted from "Unreleased")
164
+
165
+ - **`--json` was dead code on every subcommand.** `applyCommonFlags`
166
+ stripped `--json` from argv before commander parsed per-command options,
167
+ so JSON branches silently no-op'd (e.g. `prismer status --json` exit 0
168
+ with no body). Now `--json` is kept in argv and declared on every
169
+ printing subcommand.
170
+ - **`prismer setup --cloud 0.0.0.0:3000` accepted bare host:port and
171
+ exploded with raw Zod JSON.** `normalizeCloudUrl()` now auto-prefixes
172
+ `http://` for bare host shapes and rejects everything else with a
173
+ single-line error.
174
+ - **`exitWithError` is JSON-aware.** Emits
175
+ `{ok:false, error:{code, message}}` to stdout when UI is in JSON mode.
176
+ Every action handler goes through a `runAction(fn, { code })` wrapper.
177
+ - **Daemon ignored application-level `AUTH_FAILED`.** The runner now
178
+ detects `AUTH_FAILED` / `AUTH_REQUIRED` / `auth_invalid` payload codes,
179
+ emits `auth-failed`, and `daemon run` clears the pid file + exits 2.
180
+ - **`memory stats` returned exit 0 when the gateway was unavailable** even
181
+ though `delete` and `sync` exited 1 in the same condition. Now consistent.
182
+ - **`task create` printed `(0): fetch failed`.** Network errors now render
183
+ as `(network error): …` so the `0` HTTP status doesn't leak.
184
+ - **`daemon restart` dropped `--port` / `--foreground` / `--no-local-server`
185
+ on the floor.** Restart now forwards the flags through to `start`.
186
+ - **`daemon logs --tail` read the entire log file into memory.** Now seeks
187
+ from the end in 64 KiB chunks.
188
+
189
+ ### Tests
190
+
191
+ - Origin Adapter framework: 44 new vitest assertions across 8 new test files
192
+ (`origin-spi`, `origin-outbox`, `origin-drop-folder`, `origin-agent-gen`,
193
+ `local-server-asset-write`, `origin-web-upload`,
194
+ `skill-memory-curation-sync`, `codex-adapter-skill-injection`).
195
+ - Acceptance criteria covered: doc 26 §5 L2-T1 (100-burst, dead-letter=0),
196
+ L2-T2 (restart resume), L2-T3 (RPC sync return).
197
+ - Total runtime suite: 192 → 234 passing, 0 failures.
198
+
199
+ ### Cookbook
200
+
201
+ - `docs/cookbook/m-asset-origin-drop-folder.md`
202
+ - `docs/cookbook/m-asset-origin-agent-gen.md`
203
+
204
+ ---
205
+
3
206
  ## v1.9.7 — 2026-05-12 — Device capacity fix + setup daemon auto-start
4
207
 
5
208
  ### Fixed
@@ -56,116 +259,6 @@ CEO authorization data layer, and runtime version hygiene.
56
259
 
57
260
  ---
58
261
 
59
- ## Unreleased — Origin Adapter framework + memory-curation skill
60
-
61
- Doc 26 §4 Phase 2 + doc 27 rev 5 §3. Daemon-side asset producers behind a
62
- uniform OriginAdapter SPI; agent-driven memory curation guidance loaded into
63
- the four host adapters.
64
-
65
- ### Added — **Origin Adapter framework** (`daemon/asset/origin/`)
66
- - **SPI** (`spi.ts`): `OriginAdapter` interface with `kind: 'upload' | 'drop-folder' | 'agent-gen'`, `observe / identifySource / fetch` decomposition. Identification stays separate from byte fetch so the outbox can dedupe before paying read cost.
67
- - **Outbox** (`outbox.ts`): SQLite-backed pending-upload queue mirroring `daemon/memory/outbox.ts` shape — Zod validation → dead-letter, `idempotencyKey = sha256(originKind|wid|sourceRef|observedAt)` UNIQUE, `claimNext()` transactional, `recordFailure(maxAttempts)` auto-spills to dead-letter. Restart-resume-friendly (rows persist across daemon process death).
68
- - **Drop-folder adapter** (`drop-folder.ts`): polls `~/.prismer/workspaces/<wid>/drop/` (1s tick, recursive), enqueues observations, on success moves files to `uploaded/`, on persistent failure to `upload-failed/`. Mime detected by extension.
69
- - **Agent-gen adapter** (`agent-gen.ts`): synchronous handler `handleAssetWrite(body, { cloud })` for the new `POST /local/asset/write` RPC. Daemon writes under owner identity; `sourceAgentImUserId` is a passenger metadata field (decoupled from auth — no dependency on Line B B1 POST permission alignment).
70
- - **Web-upload adapter** (`web-upload.ts`): cloud-side marker class for SPI symmetry. Throws if invoked daemon-side; the actual upload is the cloud `POST /api/im/assets` handler.
71
- - **Upload runner** (`upload-runner.ts`): generic worker draining the outbox, dispatching to adapters by `originKind`. Hooks `onUploadSuccess` / `onUploadFailure` on the adapter (drop-folder uses these for the uploaded/upload-failed file moves).
72
- - **`POST /local/asset/write` route** (`local-server.ts`): wires `onAssetWrite` sink alongside `onDispatch` / `attachMemory`. Returns `{ assetId, contentHash, prismerUri: 'prismer://workspace/<wid>/asset/<contentHash>' }`. 400/502/501 error contract.
73
-
74
- ### Added — **memory-curation skill** (doc 27 rev 5 §3)
75
- - **Codex adapter** (`adapters/codex/index.ts`): `buildCodexPrompt()` extracted as pure function; injects `MEMORY_CURATION_SKILL_TEXT` as system-prompt preamble (Codex has no native skill framework).
76
- - **Embedded skill module** (`src/skills/memory-curation.ts`): regenerated from canonical `sdk/prismer-cloud/skill/memory-curation.md` via `scripts/regenerate-memory-curation-skill.cjs` (also handles the openclaw / Python / CC plugin copies).
77
-
78
- ### Tests
79
- - 44 new vitest assertions across 8 new test files: `origin-spi`, `origin-outbox`, `origin-drop-folder`, `origin-agent-gen`, `local-server-asset-write`, `origin-web-upload`, `skill-memory-curation-sync`, `codex-adapter-skill-injection`.
80
- - Acceptance criteria covered: doc 26 §5 L2-T1 (100-burst, dead-letter=0), L2-T2 (restart resume), L2-T3 (RPC sync return).
81
- - Total runtime suite: 192 → 234 passing, 0 failures.
82
-
83
- ### Cookbook
84
- - `docs/cookbook/m-asset-origin-drop-folder.md`
85
- - `docs/cookbook/m-asset-origin-agent-gen.md`
86
-
87
- ### Phase staging — what this PR does NOT yet wire
88
- - **Daemon `runner.ts` does not yet construct `OriginOutbox` / `DropFolderAdapter` / `UploadRunner`.** The SPI + handlers ship here; the runner-level wiring + a concrete `CloudUploadClient` (FormData wrapper around the existing `CloudClient`) land in a follow-up PR alongside the rest of doc 26 §4 Phase 2 production-enable work.
89
- - `POST /local/asset/write` returns **501 `asset_write_unavailable`** in production until that PR wires the `onAssetWrite` sink on `LocalServer`.
90
- - Acceptance criteria (L2-T1, L2-T2, L2-T3) are validated against `fakeCloud` in unit tests; an end-to-end cookbook run against the live `POST /api/im/assets` handler is part of the follow-up.
91
-
92
- ---
93
-
94
- ## Unreleased — CLI hardening pass
95
-
96
- User-reported "大量空洞" — full audit of the 16-verb CLI surface. No new daemon
97
- behavior; existing commands now fail closed and emit consistent JSON when
98
- `--json` is set.
99
-
100
- ### Fixed
101
-
102
- - **`--json` was dead code on every subcommand.** `applyCommonFlags` stripped
103
- `--json` from argv before commander parsed per-command options, so
104
- `if (opts.json) printJson(...)` branches in setup/status/workspace/sandbox/
105
- asset/cookbook/chat never fired. UI mode was set, but the pretty branches
106
- silently no-op'd in JSON mode and stdout came out empty (e.g.
107
- `prismer status --json` exit 0 with no body). Now we keep `--json` in argv
108
- and declare it on every subcommand that prints — empty-output paths are gone.
109
- - **`prismer setup --cloud 0.0.0.0:3000` accepted bare host:port and exploded
110
- with raw Zod JSON six stack frames later.** `normalizeCloudUrl()` now
111
- auto-prefixes `http://` for bare host shapes and rejects everything else
112
- with a single-line error. The same helper is wired into `pair`, `setup`,
113
- and `config set cloud_api_base`.
114
- - **`exitWithError` is JSON-aware.** When the UI is in JSON mode it emits
115
- `{ok:false, error:{code, message}}` to stdout (with stable codes like
116
- `invalid_cloud_url`, `config_missing`, `task_create_failed`) instead of
117
- the pretty `Error: …` line. Every action handler now goes through a
118
- `runAction(fn, { code })` wrapper that catches throws — including the
119
- `loadConfig()` "Config not found" throw that previously bubbled to
120
- commander's default handler with a `prismer:` prefix.
121
- - **Daemon ignored application-level `AUTH_FAILED`.** Cloud sends an
122
- application error frame (not WS close 4001) when the post-handshake API
123
- key lookup fails; the runner only logged it and stayed alive forever with
124
- a stale pid file. Now the runner detects `AUTH_FAILED` / `AUTH_REQUIRED`
125
- / `auth_invalid` payload codes, emits `auth-failed`, and `daemon run`'s
126
- handler stops the runner, clears the pid file, and exits 2.
127
- - **`memory stats` returned exit 0 when the gateway was unavailable** even
128
- though `delete` and `sync` both exit 1 in the same condition. All five
129
- memory subcommands now consistently set `process.exitCode = 1` when the
130
- gateway is missing.
131
- - **`task create` printed `(0): fetch failed`.** Network errors now render
132
- as `(network error): …` so the `0` HTTP status doesn't leak.
133
- - **`daemon restart` dropped `--port` / `--foreground` / `--no-local-server`
134
- on the floor.** Restart now forwards the flags through to `start`.
135
- - **`daemon logs --tail` read the entire log file into memory.** Now seeks
136
- from the end in 64 KiB chunks until enough newlines are collected — works
137
- on the multi-MB logs that long-lived hosts accumulate.
138
- - **`--no-start` was a redundant declaration** of commander's automatic
139
- `--no-X` negation; removed.
140
-
141
- ### Added
142
-
143
- - **`prismer config (path|show|set)`** — inspect or edit
144
- `~/.prismer/config.toml` without hand-editing TOML. `show` redacts the
145
- api_key by default; `--reveal` prints clear text. `set cloud_api_base
146
- <url>` runs through `normalizeCloudUrl`, `set api_key sk-…` validates
147
- the key format.
148
- - **`prismer setup --check`** — dry-run mode. Validates `--cloud`, prints
149
- the would-be config target and api-key source, and returns without
150
- touching disk. JSON-friendly: `{ok:true, check:true, mode, cloud, …}`.
151
- - **Default `--cloud` URL is `https://prismer.cloud`** (was
152
- `https://cloud.prismer.dev`). The default is now visible in
153
- `setup --help` / `pair --help`.
154
- - **Stable error codes** on every CLI exit path so JSON consumers can
155
- branch on `error.code` rather than parsing `error.message`.
156
-
157
- ### Internal
158
-
159
- - New `src/cli/util.ts` helpers: `DEFAULT_CLOUD_BASE_URL`,
160
- `normalizeCloudUrl(input)`, `runAction(fn, { code, sanitize })`, and the
161
- JSON-aware `exitWithError(message, { code, exitCode, details })`.
162
- - `applyCommonFlags` now keeps `--json` in argv (only `--quiet`,
163
- `--no-color`, `--color` are still stripped). Every subcommand that
164
- prints JSON now declares `.option('--json', …)` so commander parses it
165
- consistently; pure-text commands (`daemon stop`, `pair`, `banner`,
166
- `adapter install / remove`) declare `--json` as a passthrough so
167
- `prismer --json daemon stop` doesn't error.
168
-
169
262
  ## v1.9.3 — 2026-05-07 — Hosted agents + Hermes long-running + 16-verb CLI
170
263
 
171
264
  First published cut of `@prismer/runtime`. The runtime is the TS-only daemon that hosts Prismer agents on a user's Mac (under `launchd`) or inside a sandbox pod (as PID 1). One binary, one WebSocket to cloud, four in-process adapters, local SQLite mirror.
package/README.md CHANGED
@@ -20,7 +20,7 @@ What the daemon-mode installer does:
20
20
 
21
21
  1. Detects OS / arch (Darwin or Linux x64/arm64; Windows requires WSL2).
22
22
  2. Installs Node.js via `fnm` under `$HOME/.local/share/fnm` if absent (no Homebrew, no sudo).
23
- 3. Strict-pins `@prismer/runtime@1.9.3` (no caret) and installs globally via npm.
23
+ 3. Strict-pins `@prismer/runtime@2.0.0` (no caret) and installs globally via npm.
24
24
  4. Scaffolds `~/.prismer/{adapters,workspace,logs,bin}`.
25
25
  5. Writes `~/Library/LaunchAgents/com.prismer.daemon.plist` (label `com.prismer.daemon`, `KeepAlive=true`, `RunAtLoad=true`, `ProgramArguments` includes `--foreground`), then `bootout` + `bootstrap` to load it.
26
26
  6. Auto-runs `prismer adapter install <name>` for each adapter passed via `--adapters`.
@@ -32,7 +32,7 @@ Installer flags: `-y/--yes`, `--no-setup`, `-v/--verbose`, `--local <dir>` (inst
32
32
  ### npm (manual)
33
33
 
34
34
  ```sh
35
- npm install -g @prismer/runtime@1.9.3
35
+ npm install -g @prismer/runtime@2.0.0
36
36
  prismer pair --device-name "$(hostname)"
37
37
  prismer daemon start
38
38
  ```
@@ -54,7 +54,7 @@ The container daemon binds `:7878` (controller proxy target) instead of the desk
54
54
 
55
55
  ## CLI reference (16 verbs)
56
56
 
57
- `VERSION = '1.9.3'`. Each verb is a `commander` subcommand under `src/cli/commands/`. Output is JSON (`--json`) or human-friendly ANSI by default.
57
+ `VERSION = '2.0.0'`. Each verb is a `commander` subcommand under `src/cli/commands/`. Output is JSON (`--json`) or human-friendly ANSI by default.
58
58
 
59
59
  ### Lifecycle
60
60
 
@@ -405,17 +405,17 @@ shell = "bash"
405
405
 
406
406
  ## Troubleshooting
407
407
 
408
- - **LaunchAgent respawn loop after install** — the plist must include `--foreground` in `ProgramArguments`. v1.9.3 installs do this automatically; if you're upgrading from 1.8.x re-run `curl -fsSL https://prismer.cloud/install.sh | sh -s -- --component=daemon` (the installer does `bootout` + `bootstrap` to reload).
408
+ - **LaunchAgent respawn loop after install** — the plist must include `--foreground` in `ProgramArguments`. v2.0.0 installs do this automatically; if you're upgrading from 1.8.x re-run `curl -fsSL https://prismer.cloud/install.sh | sh -s -- --component=daemon` (the installer does `bootout` + `bootstrap` to reload).
409
409
  - **Daemon shows "waiting for ~/.prismer/config.toml"** — that's expected behavior pre-pair. Run `prismer pair` (or `prismer setup sk-prismer-...`) and the daemon snaps to attention within 5s.
410
410
  - **Cloud unreachable** — `prismer status` will print the failing base URL. Common causes: stale `cloud_api_base` after a tenant move (run `prismer setup --force <new-key> --cloud <url>`), or the API key was rotated (mint a new one with `prismer setup --token <jwt>`).
411
- - **Agent shows under `__unbound__` device in workspace runtime view** — the daemon's `agent.host.declare` is not stamping `daemonId`. Confirm you're on `@prismer/runtime@1.9.3` (the `daemonId` payload field landed in 1.9.3).
412
- - **`claude --print` runs report "no stdin data received in 3s"** — fixed in 1.9.3 (`stdio: ['ignore', 'pipe', 'pipe']`). Older runtimes will surface the warning but the dispatch still completes.
411
+ - **Agent shows under `__unbound__` device in workspace runtime view** — the daemon's `agent.host.declare` is not stamping `daemonId`. Confirm you're on `@prismer/runtime@2.0.0` (the `daemonId` payload field is required as of v2.0.0).
412
+ - **`claude --print` runs report "no stdin data received in 3s"** — fixed in v2.0.0 (`stdio: ['ignore', 'pipe', 'pipe']`). Older runtimes will surface the warning but the dispatch still completes.
413
413
  - **Tasks dispatch but `@`-mention messages never reach the agent** — cloud-side `SHADOW_JOIN_FAILED` rollback. The runtime's `agent.host.declare` requires every declared agent to auto-join all its conversation rooms; check daemon logs for the rollback line and re-register the agent (`prismer agent register …`) to fix the cloud-side row.
414
414
  - **Stuck task that never replies** — the 60s reaper aborts and replies `{ok:false, error.code:'daemon_task_timeout'}` after `max(timeoutMs, 5min)`. Cloud will mark the task `failed` accordingly. Inspect via `prismer task get <id>`.
415
415
 
416
416
  ## Versioning
417
417
 
418
- > See [CHANGELOG.md](./CHANGELOG.md). Current: **v1.9.3** (2026-05-07).
418
+ > See [CHANGELOG.md](./CHANGELOG.md). Current: **v2.0.0** (2026-05-19).
419
419
 
420
420
  ## License
421
421