@plurnk/plurnk-web 1.0.0 → 1.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/README.md +11 -11
- package/SPEC.md +26 -26
- package/ai.plurnk/assets.json +27 -27
- package/ai.plurnk/dist/assets/{index-DgGvOprn.css → index-B4w6iDKw.css} +1 -1
- package/ai.plurnk/dist/assets/index-B4w6iDKw.css.br +0 -0
- package/ai.plurnk/dist/assets/index-B4w6iDKw.css.gz +0 -0
- package/ai.plurnk/dist/assets/{index-DQK23MMn.js → index-CGRGblLU.js} +2 -2
- package/ai.plurnk/dist/assets/index-CGRGblLU.js.br +0 -0
- package/ai.plurnk/dist/assets/index-CGRGblLU.js.gz +0 -0
- package/ai.plurnk/dist/assets/{overview-IkhWTlh2.js → overview-DEhW9HUG.js} +1 -1
- package/ai.plurnk/dist/assets/overview-DEhW9HUG.js.br +0 -0
- package/ai.plurnk/dist/assets/overview-DEhW9HUG.js.gz +0 -0
- package/ai.plurnk/dist/assets/{session-BgePzPYk.js → session-BcdGbgAa.js} +3 -3
- package/ai.plurnk/dist/assets/session-BcdGbgAa.js.br +0 -0
- package/ai.plurnk/dist/assets/session-BcdGbgAa.js.gz +0 -0
- package/ai.plurnk/dist/assets/{session-agent-DWERfauE.js → session-agent-DwY8S586.js} +4 -4
- package/ai.plurnk/dist/assets/session-agent-DwY8S586.js.br +0 -0
- package/ai.plurnk/dist/assets/session-agent-DwY8S586.js.gz +0 -0
- package/ai.plurnk/dist/assets/{src-BdHyjaXT.js → src-Du01yeMu.js} +1 -1
- package/ai.plurnk/dist/assets/src-Du01yeMu.js.br +0 -0
- package/ai.plurnk/dist/assets/src-J2qT9xpv.js +6 -0
- package/ai.plurnk/dist/assets/src-J2qT9xpv.js.br +0 -0
- package/ai.plurnk/dist/assets/src-J2qT9xpv.js.gz +0 -0
- package/ai.plurnk/dist/index.html +2 -2
- package/ai.plurnk/dist/vendor/DEPENDENCIES-LICENSE.txt +1 -1
- package/ai.plurnk/dist/vendor/DEPENDENCIES-LICENSE.txt.br +0 -0
- package/ai.plurnk/dist/vendor/DEPENDENCIES-LICENSE.txt.gz +0 -0
- package/package.json +4 -4
- package/plugin.json +1 -1
- package/ai.plurnk/dist/assets/index-DQK23MMn.js.br +0 -0
- package/ai.plurnk/dist/assets/index-DQK23MMn.js.gz +0 -0
- package/ai.plurnk/dist/assets/index-DgGvOprn.css.br +0 -0
- package/ai.plurnk/dist/assets/index-DgGvOprn.css.gz +0 -0
- package/ai.plurnk/dist/assets/overview-IkhWTlh2.js.br +0 -0
- package/ai.plurnk/dist/assets/overview-IkhWTlh2.js.gz +0 -0
- package/ai.plurnk/dist/assets/session-BgePzPYk.js.br +0 -0
- package/ai.plurnk/dist/assets/session-BgePzPYk.js.gz +0 -0
- package/ai.plurnk/dist/assets/session-agent-DWERfauE.js.br +0 -0
- package/ai.plurnk/dist/assets/session-agent-DWERfauE.js.gz +0 -0
- package/ai.plurnk/dist/assets/src-BdHyjaXT.js.br +0 -0
- package/ai.plurnk/dist/assets/src-Vt7-ppeC.js +0 -6
- package/ai.plurnk/dist/assets/src-Vt7-ppeC.js.br +0 -0
- package/ai.plurnk/dist/assets/src-Vt7-ppeC.js.gz +0 -0
package/README.md
CHANGED
|
@@ -100,7 +100,7 @@ Connection failure stops observation and marks the displayed values as stale;
|
|
|
100
100
|
use **Reconnect** or, after revocation, **Sign in**. Reconnect preserves the current
|
|
101
101
|
draft without resubmitting it; full page reloads do not persist drafts.
|
|
102
102
|
No automatic work retries occur.
|
|
103
|
-
Context occupancy/capacity, pending input, preparation, indexing and the daemon's
|
|
103
|
+
Context occupancy/capacity, pending input, preparation, indexing and the daemon's `wait`
|
|
104
104
|
countdown appear only when relevant. The countdown is an observation deadline, not
|
|
105
105
|
a promise of completion. A collapsed session-count disclosure opens the live
|
|
106
106
|
descendant tree; no empty tree or metadata inventory occupies the page.
|
|
@@ -115,7 +115,7 @@ semantics and accessible names. These observations survive reconnects on the sam
|
|
|
115
115
|
reloads; they are not replies or a complete activity history.
|
|
116
116
|
Operations show their glyph and aside above the addressed selection, returned count
|
|
117
117
|
and any failure. An immediate receipt completes that summary rather than adding
|
|
118
|
-
another article. Authored bodies appear below it;
|
|
118
|
+
another article. Authored bodies appear below it; `read` results are not fetched
|
|
119
119
|
automatically. Reasoning stays collapsed until opened. Fetched bodies are literal text and are never added
|
|
120
120
|
to client-uploaded conversation history or saved in browser storage.
|
|
121
121
|
|
|
@@ -168,18 +168,18 @@ Content and calls are direct semantic entries with accessible names and
|
|
|
168
168
|
presentation-relevant metadata, not nested protocol inspectors. Bodies use native
|
|
169
169
|
disclosures: user messages and delivered replies start open; notes, tool evidence
|
|
170
170
|
and completed reasoning start closed. Headers, diagnostics and operation details
|
|
171
|
-
remain visible. Opening a body does not start work or add
|
|
171
|
+
remain visible. Opening a body does not start work or add `read` receipt readback.
|
|
172
172
|
Markdown is sanitized, raw
|
|
173
|
-
HTML stays text and images become links.
|
|
174
|
-
|
|
173
|
+
HTML stays text and images become links. `send` bodies use that same Markdown renderer;
|
|
174
|
+
`note`, reasoning and ordinary operation evidence remain literal preformatted text.
|
|
175
175
|
Long lines wrap and settled entries grow with their content; explicit code, tables,
|
|
176
176
|
formulas and diagrams scroll locally when wider than the viewport.
|
|
177
|
-
|
|
177
|
+
`note` retains attribution semantics without an enclosing assistant
|
|
178
178
|
article, a duplicate arguments view or a body copy in attributes.
|
|
179
179
|
The ACP client owns live messages; archival pages are read-only presentation. Neither
|
|
180
180
|
is saved in browser storage.
|
|
181
181
|
|
|
182
|
-
Markdown footnotes use native reference and back-links within each rich message or
|
|
182
|
+
Markdown footnotes use native reference and back-links within each rich message or `send`.
|
|
183
183
|
Repeated references retain separate return links; definitions never leak between
|
|
184
184
|
messages. Code and unresolved references remain readable source.
|
|
185
185
|
|
|
@@ -207,7 +207,7 @@ remain native HTML; live session status and conversation require JavaScript.
|
|
|
207
207
|
|
|
208
208
|
## Install
|
|
209
209
|
|
|
210
|
-
Requires Node.js 26+ and Plurnk service 5.
|
|
210
|
+
Requires Node.js 26+ and Plurnk service 5.3+ with its module-client credential and
|
|
211
211
|
workspace-label APIs
|
|
212
212
|
([credential authority](https://github.com/plurnk/plurnk-service/blob/main/plurnk-core/SPEC.md),
|
|
213
213
|
including sign-in inventory, shared browser/module revocation, password-only login,
|
|
@@ -225,7 +225,7 @@ To build and verify a candidate archive from source:
|
|
|
225
225
|
npm ci --no-audit --no-fund
|
|
226
226
|
npm run test:candidate -- /path/to/packed-platform-packages
|
|
227
227
|
npm pack
|
|
228
|
-
npm install --no-audit --no-fund /path/to/plurnk-plurnk-web-1.
|
|
228
|
+
npm install --no-audit --no-fund /path/to/plurnk-plurnk-web-1.1.0.tgz
|
|
229
229
|
```
|
|
230
230
|
|
|
231
231
|
Restart that daemon and visit its root URL, normally `http://localhost:1066/`.
|
|
@@ -292,7 +292,7 @@ cancellation, approval and question interruption and rediscovery,
|
|
|
292
292
|
shutdown and the real browser sign-in/access-token lifecycle. Held directory and OAuth
|
|
293
293
|
requests verify that module shutdown settles admitted work before releasing resources.
|
|
294
294
|
Cross-client prompt
|
|
295
|
-
delivery, exact
|
|
295
|
+
delivery, exact `read` operands and real command stdout/stderr results are compared live and after
|
|
296
296
|
refresh through the client's messages, without custom-row reconstruction. Standard success,
|
|
297
297
|
cancellation, failure and reported token usage are checked separately. No ACP traffic is
|
|
298
298
|
mocked and no client-owned replay cache hides differences from the daemon's history.
|
|
@@ -300,7 +300,7 @@ Stream journeys also exercise silent executors, never-written channels, explicit
|
|
|
300
300
|
authenticated output inspection, completion during absence, cancellation and nonzero exit.
|
|
301
301
|
Browser journeys also check console warnings/errors and uncaught exceptions;
|
|
302
302
|
deliberately tested failures require explicit diagnostic expectations.
|
|
303
|
-
Adversarial content checks exercise rich-text roles,
|
|
303
|
+
Adversarial content checks exercise rich-text roles, `note` bodies, literal tool data,
|
|
304
304
|
streaming and replay against the production content policy in all three engines.
|
|
305
305
|
|
|
306
306
|
`web/index.html` and `web/app.js` are the document and browser entry point.
|
package/SPEC.md
CHANGED
|
@@ -337,7 +337,7 @@ flow at the end of `<main>` and submits cleanly.
|
|
|
337
337
|
| Boundary | Representation |
|
|
338
338
|
|---|---|
|
|
339
339
|
| Membership | Every shown `origin: model` session (`archived_at: null`) appears once, regardless of owner, lifecycle or name spelling. Non-model bookkeeping sessions have no directory row or session page; their direct page URL returns 404. This is presentation, not an access policy for daemon APIs. |
|
|
340
|
-
| Roots | Shown model sessions with `parentSessionId: null` form the primary list. Sessions with a delivered reply (`
|
|
340
|
+
| Roots | Shown model sessions with `parentSessionId: null` form the primary list. Sessions with a delivered reply (`done` or `fail`) order first by most recent delivered reply (`reply.id` descending); sessions with no delivered reply follow in daemon order. On `/`, roots span all non-archived workspaces. |
|
|
341
341
|
| Children | Immediate model children nest beneath their actual model parent, ordered by most recent delivered reply (`reply.id` descending) with no-reply siblings following in daemon order. |
|
|
342
342
|
| Card identity | Two lines: a named ant link to the session, its lifecycle glyph, optional actual parent followed by `>`, and the session name; then a folder/cloud marker and a real link to its workspace. Model parents are links; bookkeeping parents are escaped text, never fabricated session destinations. Folder presence comes from `project_root`, not the workspace name. Kind and permission owner do not become visible metadata rows. |
|
|
343
343
|
| Lifecycle | Project the supplied lifecycle with the same glyph vocabulary as the session statusline; the icon has a literal accessible name/title. With JavaScript, the ACP `session/list` overview subscription keeps lifecycle, card order, membership and workspace labels live in place. |
|
|
@@ -418,7 +418,7 @@ submission and explicit cancellation belong to {§web-session-input}.
|
|
|
418
418
|
| Document | A body-level footer contains status above the composer. Center two wrapping groups: automatic approval/model/effort, then the remaining statistics with cost last. Each group fits the available width; a long model route can occupy its own row above statistics. No repeated workspace/session identity or metadata inventory. Each field has an accessible name independent of CSS-generated glyphs and separators. The SDK retains full state; the DOM is not a second dataset. |
|
|
419
419
|
| Visibility | Hide the status row without reserving space unless the session is queued, running or parked, focus is within the footer, or its model/effort selector is open. Keep it present through pointer activation of its controls. An unknown lifecycle still supplies no status row. Composer and connection feedback remain independent. Native focus/disclosure state and existing lifecycle attributes own visibility through CSS, without another JavaScript state or timer. |
|
|
420
420
|
| Session | `plurnk.status` supplies lifecycle and resolved model/effort. Show the alias, otherwise provider/model, with supplied effort and no decorative model glyph; retain the full route and effort source in its description. A null model says “No model”; absent effort uses a neutral placeholder so its selector remains reachable. Completed lifecycle has no visible indicator or reserved space; other supplied states retain theirs. Page-local automatic approval uses a native toggle button: pressed with 🔥 when enabled, unpressed with 🐹 for manual review. Its stable accessible name is “Automatic approval”; CSS supplies the glyph. It shares `/yolo` behavior under {§web-session-commands}, without submitting the draft or adding a command-history entry. Descendant counts and pending gates follow {§web-session-descendants}; neither changes the bound session's lifecycle. No provider fallback. |
|
|
421
|
-
| Clocks | Elapsed follows {§web-session-observer}, not the browser session, and is omitted without a claim timestamp.
|
|
421
|
+
| Clocks | Elapsed follows {§web-session-observer}, not the browser session, and is omitted without a claim timestamp. `wait` shows whole seconds remaining, rounded up and clamped to zero, with the supplied deadline on its native time element. A null deadline clears it. Expiry neither changes lifecycle nor claims completion or resumption. Both clocks repaint only while connected or awaiting input, and freeze when delivery is unavailable. |
|
|
422
422
|
| Context | Root `budget` supplies context occupancy/capacity. Show only percentage/capacity (for example, `11%/650k`) when both values are known and capacity is positive; descriptions retain exact supplied values. Curation stays in SDK state, without a document projection. Unknown input clears the field, never retains an older snapshot or substitutes accounting totals or model configuration. |
|
|
423
423
|
| Accounting | Show daemon cumulative session-and-descendant input/output tokens and USD cost, never a page-local ledger. Cost is the last list item in document order. Tokens use compact notation; cost uses four fractional digits, with a nonzero amount below display precision shown as less than that precision, never zero. Missing totals show `?`; a supplied known subtotal may precede `+ ?` but never becomes a total. Accessible descriptions retain exact reported values and distinguish partial from complete evidence. No summing, estimated prices or inferred token partitions; formatting never mutates SDK state. |
|
|
424
424
|
| Workspace activity | Show current preparation phase and family/alias, and indexing phase with the supplied percentage when present. Retain the indexing message as a description, without reconstructing progress or printing the full activity record. Empty preparation and null activity clear their fields. These are workspace facts, not session lifecycle or conversation messages; a session terminal alone does not clear them. |
|
|
@@ -450,7 +450,7 @@ submission and explicit cancellation belong to {§web-session-input}.
|
|
|
450
450
|
|---|---|
|
|
451
451
|
| Intake | The current ACP client supplies `tool_call_update` client-facing log rows and `agent_message_chunk` text emitted outside operations via `_meta.plurnk`. They remain separate from conversation messages, reasoning previews, diagnostics, approvals and lifecycle. Unknown sessionUpdate families are ignored. Invalid identity or displayed fields fail at intake, not as empty activity. |
|
|
452
452
|
| Document | A native “Observed activity” disclosure contains an unnumbered `ul` list of articles using {§web-operation-summary} and {§web-card-disclosure}, with the authored body as literal text and, when supplied, a collapsed reasoning disclosure. These observations start collapsed, including outside text; they are evidence, not delivered replies. Its accessible name identifies operation, session, coordinate and result state. Relevant identity, origin, coordinate, state, status and attribution live on the entry as scalar attributes. Outside text is literal content with accessible “Outside operations” attribution and coordinate, never an assistant answer or a copy in data attributes. No inferred names, session tree, heading parsing or executable markup. |
|
|
453
|
-
| Duplication | Ambient rows use their session and row IDs plus supplied subagent attribution; outside text uses its coordinate plus attribution. Repeated delivery updates that entry in first-observation order. Unchanged evidence preserves its nodes and inspected bodies. Deduplication and reference-render bookkeeping stay in JavaScript, not DOM storage. Changed references replace only their inspection outlets. The `_plurnk`
|
|
453
|
+
| Duplication | Ambient rows use their session and row IDs plus supplied subagent attribution; outside text uses its coordinate plus attribution. Repeated delivery updates that entry in first-observation order. Unchanged evidence preserves its nodes and inspected bodies. Deduplication and reference-render bookkeeping stay in JavaScript, not DOM storage. Changed references replace only their inspection outlets. The `_plurnk` `read` row with `attrs.kind=emission` is omitted because its announced operations already have their own conversation representation; rejected emissions and other ambient rows are not suppressed. |
|
|
454
454
|
| Content | Operation summaries do not fetch receipt bodies. Referenced reasoning uses {§web-result-bodies} and stays unread until its disclosure is opened and visible. Fetches never add text to future conversation uploads. |
|
|
455
455
|
| Retention | Observations belong to this page, not a durable history. Delivery changes and reconnects retain them; reload starts with only what the daemon supplies again. Do not reconstruct past ambient/outside events from messages, poll for them, persist them in browser storage or imply unseen activity was absent. Disconnection retains visibly stale evidence under {§web-session-observer}; neither events nor browser departure cancel or complete work. |
|
|
456
456
|
|
|
@@ -458,7 +458,7 @@ submission and explicit cancellation belong to {§web-session-input}.
|
|
|
458
458
|
|
|
459
459
|
| Boundary | Contract |
|
|
460
460
|
|---|---|
|
|
461
|
-
| Boundary | The session page has no open-stream inventory or progress ledger. `status.streams` stays in client state; channel-progress updates create no document projection. Session lifecycle,
|
|
461
|
+
| Boundary | The session page has no open-stream inventory or progress ledger. `status.streams` stays in client state; channel-progress updates create no document projection. Session lifecycle, `wait` and conversation receipts retain their own presentation. |
|
|
462
462
|
| Document | A native “Observed stream outcomes” disclosure lists conclusions received on this page. It is absent from presentation when empty. All supplied values are literal text; unchanged outcomes retain their disclosures and inspected output. |
|
|
463
463
|
| Outcomes | A `terminal_update` carrying `_meta.plurnk.result` is separately retained as a page-local observed outcome: resource, producer, supplied summary and Problem details. Result status and supplied exit code classify the entry, and a supplied exit code is shown; the full result is not dumped into markup. Deduplication remains in JavaScript. Identical repeated conclusions reuse the disclosure. Channel closure, command exit and session outcome are distinct. Reconnection retains observed outcomes; reload does not reconstruct them from conversation history. |
|
|
464
464
|
| Inspection | A native Read output control makes one explicit public `entry.read` management action (`_plurnk/action`) for that target and the page's immutable session. Acquire fresh same-origin credentials; declare no tools or control claim and upload no conversation. Validate the public `EntryReadResult`. Render every returned channel's exact text, state, MIME type and code-point length as a labelled output snapshot, never Markdown or executable content. The control remains available for an explicit refresh. |
|
|
@@ -549,12 +549,12 @@ capability, persistence or execution policy. Client commands require no inferenc
|
|
|
549
549
|
| Boundary | Contract |
|
|
550
550
|
|---|---|
|
|
551
551
|
| Authority | The session ACP client's ordered `messages` collection is the sole live transcript. Read-only daemon history pages join its display under {§web-session-history}, never its collection or request input. No custom-row reconstruction, browser persistence or second event reducer. Observation submits no input and never answers a tool call; authored input follows {§web-session-input}. |
|
|
552
|
-
| Identity | Project message content and each assistant call in supplied chronology, with archival joins under {§web-session-history}, then supplied call order, grouped by loop (`_meta.plurnk.loopSeq` or coordinate prefix, defaulting to `1`) into initially open loop disclosures (`Loop <sequence>`). Within a loop, user prompts, assistant/system/developer prose, and `
|
|
552
|
+
| Identity | Project message content and each assistant call in supplied chronology, with archival joins under {§web-session-history}, then supplied call order, grouped by loop (`_meta.plurnk.loopSeq` or coordinate prefix, defaulting to `1`) into initially open loop disclosures (`Loop <sequence>`). Within a loop, user prompts, assistant/system/developer prose, and `send`, `done` and `fail` replies are non-folding article entries; a `done` or `fail` whose `repliedTo` resolves a mid-loop prompt (any prompt after the loop's opening prompt) nests inside that prompt's article, while `send` and loop-level completions remain at the loop level. Contiguous runs of working operations (non-reply calls, results and reasoning) between loop-level entries group into an initially closed operations disclosure whose summary tallies each operation kind in appearance order (`[glyph]/op # · ...`). When the latest loop has not concluded with a loop-level `done` or `fail` and its latest unretired `todo` (`plan_update` or `todo` body) has open items, a non-folding `Open tasks` article (`data-loop-plan`) at the tail of the loop lists only those pending items (`☐`), and is removed when no open items remain, `plan_removed` or `kill` retires the plan, or the loop concludes. Content precedes calls within a message; a call-only message has no empty enclosing article. Each entry retains its message ID and, for calls, call ID. Snapshots replace live membership and order; streaming changes update existing entries. Unchanged bodies, selection and native disclosure state survive updates and passive reconnections. Rendered-node lookup comes from the DOM; the renderer's per-outlet last-render cache avoids replacing unchanged content, but holds no separate message collection. A page reload reads fresh authority state, not browser history. |
|
|
553
553
|
| User and assistant | Content-first semantic articles, with accessible names identifying role and supplied author/subagent attribution, without redundant visible headers. Text is rendered as Markdown. Calls retain their containing message's identity and attribution without duplicating its envelope in the DOM. Empty content does not imply a fabricated answer. |
|
|
554
554
|
| Reasoning | Apply {§web-session-reasoning}. Nonempty standard reasoning content is literal preformatted text in a collapsed disclosure; negotiated empty messages have no visible row until their body reference arrives. |
|
|
555
555
|
| Calls and results | Confirmed Plurnk operations use {§web-operation-summary}. Their immediate result (correlated by call ID, without its own Plurnk row metadata) completes the call's existing entry rather than creating another article. Results with their own row metadata remain distinct observations or replies; they never inherit the invocation's operands. Generic calls/results retain supplied chronology and accessible identity without guessing a Plurnk contract; late archival receipts join under {§web-session-history}. Standard tool errors remain visible. |
|
|
556
|
-
| Working notes |
|
|
557
|
-
| Delivered replies |
|
|
556
|
+
| Working notes | `note` calls follow {§web-working-notes}; they remain calls, not answers or provider reasoning. |
|
|
557
|
+
| Delivered replies | `send`, `done` and `fail` bodies use the same sanitized Markdown renderer as assistant prose. A tool result attributed to a `send`, `done` or `fail` row is the delivered reply itself, not an operation receipt; render its complete content without unwrapping JSON-shaped replies as metadata. Other authored operation bodies remain literal preformatted text. |
|
|
558
558
|
| Other messages | System/developer messages use the same accessible article boundary. Text and supported document parts retain their original order. Unmapped structured payloads stay in JavaScript; do not serialize them into the document. No inline media player or attachment service. Supplied subagent invocation IDs identify attribution, never mistaken for the parent's output. |
|
|
559
559
|
| Semantics | Entry attributes carry only identity, role, attribution, operation/category and result state relevant to presentation or interaction. Text lives in content nodes, not duplicate data attributes. Structured protocol metadata remains in JavaScript, not attributes or generic JSON disclosures. Accessible naming is independent of visible labels and decorative glyphs. Native structure and controls supply meaning and behavior; CSS alone owns arrangement and decoration. An empty body stays empty; do not invent visible labels or controls to fill it. |
|
|
560
560
|
| Layout | Native unnumbered `ul` lists, loop and operation-run disclosures, and content articles, preserving client order and authored Markdown list semantics, with card body disclosure under {§web-card-disclosure}. No wrapper solely to reproduce protocol nesting, duplicate session heading, chat bubbles, application classes or virtual-DOM framework. Literal content wraps under {§web-content-reflow}; explicit code, tables, formulas and diagrams scroll locally when too wide. |
|
|
@@ -565,19 +565,19 @@ capability, persistence or execution policy. Client commands require no inferenc
|
|
|
565
565
|
| Boundary | Contract |
|
|
566
566
|
|---|---|
|
|
567
567
|
| Order | The always-visible header or summary contains the heading (decorative glyph and authored aside), optional diagnostic, then optional operation operands/counts. Omit absent regions. A diagnostic never replaces authored intent. The body follows these regions. |
|
|
568
|
-
| Interaction | Working operations, observed activity and diagnostics with a nonempty body use native `details/summary`; the existing summary is its control, without a synthetic “View body” label. With no body there is no disclosure. User prompts, assistant/system/developer prose, and `
|
|
568
|
+
| Interaction | Working operations, observed activity and diagnostics with a nonempty body use native `details/summary`; the existing summary is its control, without a synthetic “View body” label. With no body there is no disclosure. User prompts, assistant/system/developer prose, and `send`, `done` and `fail` replies render directly in their article without an individual card disclosure. Summary and header fields use phrasing content; CSS arranges their rows. Accessible names identify the card or operation-run tally independently of glyphs and include visible diagnostics. |
|
|
569
569
|
| Spacing | Retain Pico card padding and spacing between body paragraphs, without an extra trailing disclosure/content margin or an empty body strip below a header-only card. Multiline summaries retain ordinary line spacing; their chevron stays beside the first row, not on an additional empty row. |
|
|
570
|
-
| Defaults | Loop disclosures start open. Contiguous operation-run disclosures and working-operation card disclosures (including
|
|
570
|
+
| Defaults | Loop disclosures start open. Contiguous operation-run disclosures and working-operation card disclosures (including `note`, `edit`, ordinary tool evidence, observed activity and completed reasoning) start closed. Each disclosure is independent, never an exclusive accordion. Live reasoning retains its visible bounded preview under {§web-session-reasoning}. |
|
|
571
571
|
| Continuity | Set the initial open state only when creating a disclosure. Surviving disclosures retain the reader's choice across content updates, receipt arrival, paging, replay and reconnect. Preserve unchanged body nodes and selection. No click controller, preference store or body copy in attributes. |
|
|
572
|
-
| Boundaries | Disclosure changes visibility, not content policy or lifecycle. Literal text and sanitized Markdown keep their existing owners. Referenced bodies load only when visible under {§web-result-bodies}; operation summaries do not gain
|
|
572
|
+
| Boundaries | Disclosure changes visibility, not content policy or lifecycle. Literal text and sanitized Markdown keep their existing owners. Referenced bodies load only when visible under {§web-result-bodies}; operation summaries do not gain `read` receipt readback. |
|
|
573
573
|
|
|
574
574
|
## §web-conversation-surfaces Conversation backgrounds
|
|
575
575
|
|
|
576
576
|
| Entry | Surface |
|
|
577
577
|
|---|---|
|
|
578
|
-
| User content, including incoming messages annotated as
|
|
579
|
-
| Assistant prose and confirmed
|
|
580
|
-
| Other conversation entries, including assistant tool calls,
|
|
578
|
+
| User content, including incoming messages annotated as `send`, `done` or `fail` | Distinguishable green tint derived from the active Pico theme with an explicit tinted border; user authorship takes precedence over operation metadata. |
|
|
579
|
+
| Assistant prose and confirmed `send`, `done` and `fail` bodies, including delivered tool-role replies | Ordinary Pico card surface. |
|
|
580
|
+
| Other conversation entries, including assistant tool calls, `note` and reasoning; live reasoning preview | Neutral muted slate sectioning surface derived from Pico's theme tokens. |
|
|
581
581
|
|
|
582
582
|
Existing role and operation attributes select the category in CSS; no additional
|
|
583
583
|
markup, presentation field or JavaScript classification. An operation's header
|
|
@@ -590,9 +590,9 @@ color. Non-conversation cards retain their existing Pico presentation.
|
|
|
590
590
|
|---|---|
|
|
591
591
|
| Structure | One article follows {§web-card-disclosure}: glyph and authored aside, optional diagnostic, then supplied operands and returned count, all visible independently of its body. Omit absent fields and empty rows. These are semantic rows, not fixed-width lines; long content may wrap. Runtime names remain visible beside their generic glyph. |
|
|
592
592
|
| Identity | An accessible article name identifies the operation and attribution independently of CSS. Glyphs are CSS-generated from operation/signal attributes, never body text or HTML icons. Authored asides stay visible beside the glyph. |
|
|
593
|
-
| Operands | Use the adapter's authored `target.raw`, `lineMarker.marks` and `matcher.raw`.
|
|
594
|
-
| Result |
|
|
595
|
-
| Content | Authored bodies retain {§web-working-notes} and {§web-conversation-content}, with disclosure under {§web-card-disclosure}. The shared summary does not display or fetch receipt bodies, including
|
|
593
|
+
| Operands | Use the adapter's authored `target.raw`, `lineMarker.marks` and `matcher.raw`. `copy`/`move` preserve source/destination order and each operand's own scope/pattern. Without an authored target, the operation's own receipt path or row address may identify its resource. Never parse a heading, substitute a causal source or borrow another row's operands. Semantic field spans contain literal text, not duplicate field values in attributes. |
|
|
594
|
+
| Result | `read` counts supplied `lineOrdinals`, otherwise its inclusive returned range; `find` counts its inclusive returned range, otherwise its supplied total. Do not count or fetch body text to infer a result size. Show supplied failure title/detail and recovery, standard tool errors, and a no-content diagnostic when supplied; do not print successful status numbers or receipt JSON. |
|
|
595
|
+
| Content | Authored bodies retain {§web-working-notes} and {§web-conversation-content}, with disclosure under {§web-card-disclosure}. The shared summary does not display or fetch receipt bodies, including `read` results. Operation-specific readback and previews are separate behavior, not inferred from this summary. |
|
|
596
596
|
| Continuity | Derive the summary from the live collection and read-only pages under {§web-session-history}. Receipt arrival updates summary fields without replacing an unchanged authored body or its selection. Later observations keep their own identity and result state. |
|
|
597
597
|
|
|
598
598
|
## §web-session-history Read-only conversation pages
|
|
@@ -633,20 +633,20 @@ color. Non-conversation cards retain their existing Pico presentation.
|
|
|
633
633
|
|---|---|
|
|
634
634
|
| Markdown | Marked parses ordinary text, code, links, lists and tables. Raw HTML is escaped. Authored images become links rather than automatic network requests. Tables have native figure containers. Mermaid follows {§web-diagram-content}; no syntax highlighter or embedded application is implied. Malformed fences follow the parser's ordinary Markdown semantics, without operation-style recovery or inferred intent. Math follows {§web-math-content}; footnotes follow {§web-footnote-content}. |
|
|
635
635
|
| DOM admission | DOMPurify sanitizes the generated HTML into a fragment before insertion. Only Markdown presentation elements and their necessary attributes are admitted; no application data attributes, authored IDs, styles, scripts, forms, frames, SVG or active controls. Generated footnote anchors and accessible labels are presentation, not permission to interpret authored HTML. GFM task checkboxes remain disabled. Links use the sanitizer's URI checks; no model-supplied HTML bypasses sanitization. |
|
|
636
|
-
| Literal content |
|
|
636
|
+
| Literal content | `note`, reasoning and ordinary operation evidence enter template-owned `pre` elements as text nodes, never Markdown or HTML. Whitespace, entities and tag-shaped strings stay literal; content cannot close its container or create elements. `pre` supplies semantics, not sanitization. No escaping-and-reparsing filter or body copy in attributes. |
|
|
637
637
|
| Ownership | Markdown owns only its content outlet. OTM owns message structure and scoped application state; rendered content cannot become an OTM binding or mutate navigation, credentials or controls. Sanitized fragments are inserted directly; only recognized math and diagram outlets receive their bounded enhancements. |
|
|
638
|
-
| Continuity | The same admission boundary applies to every rich-text message and
|
|
638
|
+
| Continuity | The same admission boundary applies to every rich-text message and `send` body, including partial updates and replay. Message identities, author/category labels, call arguments, errors and structured payloads remain data, never markup. Rendering performs no model-directed navigation or resource request; ordinary links require user activation. |
|
|
639
639
|
| Build | Parser and sanitizer are bundled only with the session entry and include their licenses. The allowed Markdown elements participate in CSS pruning so production preserves their Pico presentation. Math code and its vendor stylesheet load only when a recognized formula occurs; fonts are requested by the renderer's CSS when needed. Only recognized Mermaid blocks request server compilation. Renderer-owned selectors survive pruning. All assets and licenses are locally packaged. |
|
|
640
640
|
|
|
641
641
|
## §web-working-notes Inspectable working material
|
|
642
642
|
|
|
643
|
-
A standard call whose `name` and `_meta.plurnk.op` are both `
|
|
643
|
+
A standard call whose `name` and `_meta.plurnk.op` are both `note`
|
|
644
644
|
presents its string `body` as literal text in a `pre` inside one direct list entry's
|
|
645
645
|
article. No Markdown interpretation or `code` semantics are implied.
|
|
646
|
-
`data-plurnk-type="
|
|
646
|
+
`data-plurnk-type="note"` identifies the operation, and any supplied `aside`
|
|
647
647
|
renders in the shared operation header under {§web-operation-summary}. Synthesized
|
|
648
|
-
`
|
|
649
|
-
suppressed so `
|
|
648
|
+
`kill` distillation `note` rows carrying `_meta.plurnk.attrs.distilled` are
|
|
649
|
+
suppressed so `kill` owns its authored distillation body without a duplicate row.
|
|
650
650
|
No enclosing assistant article, nested call list or arguments copy is added. Its
|
|
651
651
|
literal body uses the initially collapsed disclosure under {§web-card-disclosure}.
|
|
652
652
|
Incomplete JSON, non-object arguments or non-string bodies supply no body;
|
|
@@ -666,8 +666,8 @@ name or content. This presentation adds no conversation store or protocol role.
|
|
|
666
666
|
|---|---|
|
|
667
667
|
| Interpretation | The locally bundled `marked-footnote` extension parses references and definitions. Marked's public renderers supply presentation; no parser fork, token rewriting or post-render anchor repair. Undefined references and incomplete syntax follow the library and remain readable. Code retains ordinary Markdown boundaries. |
|
|
668
668
|
| Presentation | Superscript reference links lead to a native ordered list labelled Footnotes. Each definition has a back-link for every occurrence, with accessible reference labels. Fragment navigation is native; no scrolling handler or application action. |
|
|
669
|
-
| Identity | Each rich message body and
|
|
670
|
-
| Admission | Definition bodies pass through the same Markdown renderer and sanitizer as ordinary prose, including nested Markdown and math. Raw HTML remains text. Footnote labels cannot create IDs, controls or bindings.
|
|
669
|
+
| Identity | Each rich message body and `send` call has its own anchor namespace, derived from its SDK identity. Definition and occurrence coordinates come from the extension, never arbitrary source-label concatenation. Distinct outlets cannot collide, including when a message and a call have the same ID. Identical content and identity reproduce identical anchors after streaming or replay; no persistent footnote registry or cross-message definition lookup. |
|
|
670
|
+
| Admission | Definition bodies pass through the same Markdown renderer and sanitizer as ordinary prose, including nested Markdown and math. Raw HTML remains text. Footnote labels cannot create IDs, controls or bindings. `note`, reasoning and ordinary operation evidence remain literal. |
|
|
671
671
|
| Continuity | Parsing state is confined to one body render. Partial updates cannot borrow definitions from earlier renders or other bodies. Unchanged bodies preserve their nodes, selection and native disclosure state under {§web-session-conversation}. Reflow follows {§web-content-reflow}. |
|
|
672
672
|
|
|
673
673
|
## §web-math-content Native mathematics
|
|
@@ -687,7 +687,7 @@ name or content. This presentation adds no conversation store or protocol role.
|
|
|
687
687
|
| Interpretation | The web module compiles source through Ondine's public Node compiler under {§web-diagram-service}. Supported syntax belongs to the pinned compiler, not a second parser or a promise of complete Mermaid conformance. Preserve authored direction and intrinsic dimensions; use standalone appearance, not an application theme system. No browser compiler, DOM-dependent runtime or headless browser. |
|
|
688
688
|
| Image boundary | Generated SVG becomes a data-URI source of a native `img` in a document-owned OTM template. Never insert SVG markup into the application DOM or an embedded document. Native SVG image restrictions prevent scripts and external resource loading, including renderer font imports; the application CSP is unchanged. Authored Markdown images and raw SVG receive no new permission. |
|
|
689
689
|
| Source and failure | Source remains readable while compilation is pending. A successful image has an accessible label and an adjacent native source disclosure. Unsupported syntax, HTTP or rendering/decoding failure retains the source with a concise local diagnostic and the returned diagnostic or original error available as its title. A page compiles one diagram at a time, so any number of diagrams stays within {§web-diagram-service}'s admission. A refusal for capacity or time (429, 408, 503) or a lost request also offers a native Retry button that queues the same source again; other failures are final. No rewriting, alternate renderer or automatic retry. |
|
|
690
|
-
| Continuity | Detached outlets cannot publish a late image into a newer message. Unchanged bodies retain their image and native source-disclosure state. A rendered diagram is static presentation, not an interactive link or control; the image/source boundary applies to every rich-text message and
|
|
690
|
+
| Continuity | Detached outlets cannot publish a late image into a newer message. Unchanged bodies retain their image and native source-disclosure state. A rendered diagram is static presentation, not an interactive link or control; the image/source boundary applies to every rich-text message and `send` body. `note` and reasoning cannot initiate diagram compilation. |
|
|
691
691
|
| Viewport | Keep intrinsic diagram dimensions and browser zoom. Wide images scroll inside their own viewport without shrinking labels or widening the whole page; source remains selectable text. |
|
|
692
692
|
|
|
693
693
|
Reference: [SVG image restrictions](https://developer.mozilla.org/en-US/docs/Web/SVG/Guides/SVG_as_an_image#restrictions).
|
|
@@ -800,7 +800,7 @@ storage even when storage is denied. No language picker or additional locale is
|
|
|
800
800
|
| Images | Same-origin and data-URI images, including Pico's embedded SVG controls. This permission does not extend to scripts, styles or connections. |
|
|
801
801
|
| Other directives | Default same-origin; no objects, base URL changes or framing. Forms submit to the same origin. |
|
|
802
802
|
| Browser gate | Capture console warnings/errors and uncaught exceptions from document, authentication, directory, SDK and actual session journeys. Healthy paths produce none. Negative cases assert their specific expected diagnostics; no blanket filtering of CSP or SDK errors. |
|
|
803
|
-
| Content checks | Adversarial compiled-renderer tests exercise HTML/SVG, executable URL schemes, application-binding injection, literal fields, streaming and replay in Chromium and Firefox. Assert preserved application structure, inert rejected links, no model-directed requests or new browsing contexts, and clean diagnostics. Math additionally exercises untrusted extensions, macro isolation and delayed rendering. A packed authenticated session receives hostile
|
|
803
|
+
| Content checks | Adversarial compiled-renderer tests exercise HTML/SVG, executable URL schemes, application-binding injection, literal fields, streaming and replay in Chromium and Firefox. Assert preserved application structure, inert rejected links, no model-directed requests or new browsing contexts, and clean diagnostics. Math additionally exercises untrusted extensions, macro isolation and delayed rendering. A packed authenticated session receives hostile `note` and answer bodies through real SDK delivery and refresh. These checks verify concrete cases, not a claim of exhaustive security assurance. |
|
|
804
804
|
|
|
805
805
|
## §web-contract-checks Specification gate
|
|
806
806
|
|
package/ai.plurnk/assets.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
[
|
|
2
2
|
[
|
|
3
|
-
"/assets/index-
|
|
4
|
-
"assets/index-
|
|
3
|
+
"/assets/index-B4w6iDKw.css",
|
|
4
|
+
"assets/index-B4w6iDKw.css",
|
|
5
5
|
"text/css",
|
|
6
6
|
{
|
|
7
|
-
"br": "assets/index-
|
|
8
|
-
"gzip": "assets/index-
|
|
7
|
+
"br": "assets/index-B4w6iDKw.css.br",
|
|
8
|
+
"gzip": "assets/index-B4w6iDKw.css.gz"
|
|
9
9
|
}
|
|
10
10
|
],
|
|
11
11
|
[
|
|
12
|
-
"/assets/index-
|
|
13
|
-
"assets/index-
|
|
12
|
+
"/assets/index-CGRGblLU.js",
|
|
13
|
+
"assets/index-CGRGblLU.js",
|
|
14
14
|
"text/javascript",
|
|
15
15
|
{
|
|
16
|
-
"br": "assets/index-
|
|
17
|
-
"gzip": "assets/index-
|
|
16
|
+
"br": "assets/index-CGRGblLU.js.br",
|
|
17
|
+
"gzip": "assets/index-CGRGblLU.js.gz"
|
|
18
18
|
}
|
|
19
19
|
],
|
|
20
20
|
[
|
|
@@ -36,12 +36,12 @@
|
|
|
36
36
|
}
|
|
37
37
|
],
|
|
38
38
|
[
|
|
39
|
-
"/assets/overview-
|
|
40
|
-
"assets/overview-
|
|
39
|
+
"/assets/overview-DEhW9HUG.js",
|
|
40
|
+
"assets/overview-DEhW9HUG.js",
|
|
41
41
|
"text/javascript",
|
|
42
42
|
{
|
|
43
|
-
"br": "assets/overview-
|
|
44
|
-
"gzip": "assets/overview-
|
|
43
|
+
"br": "assets/overview-DEhW9HUG.js.br",
|
|
44
|
+
"gzip": "assets/overview-DEhW9HUG.js.gz"
|
|
45
45
|
}
|
|
46
46
|
],
|
|
47
47
|
[
|
|
@@ -54,38 +54,38 @@
|
|
|
54
54
|
}
|
|
55
55
|
],
|
|
56
56
|
[
|
|
57
|
-
"/assets/session-agent-
|
|
58
|
-
"assets/session-agent-
|
|
57
|
+
"/assets/session-agent-DwY8S586.js",
|
|
58
|
+
"assets/session-agent-DwY8S586.js",
|
|
59
59
|
"text/javascript",
|
|
60
60
|
{
|
|
61
|
-
"br": "assets/session-agent-
|
|
62
|
-
"gzip": "assets/session-agent-
|
|
61
|
+
"br": "assets/session-agent-DwY8S586.js.br",
|
|
62
|
+
"gzip": "assets/session-agent-DwY8S586.js.gz"
|
|
63
63
|
}
|
|
64
64
|
],
|
|
65
65
|
[
|
|
66
|
-
"/assets/session-
|
|
67
|
-
"assets/session-
|
|
66
|
+
"/assets/session-BcdGbgAa.js",
|
|
67
|
+
"assets/session-BcdGbgAa.js",
|
|
68
68
|
"text/javascript",
|
|
69
69
|
{
|
|
70
|
-
"br": "assets/session-
|
|
71
|
-
"gzip": "assets/session-
|
|
70
|
+
"br": "assets/session-BcdGbgAa.js.br",
|
|
71
|
+
"gzip": "assets/session-BcdGbgAa.js.gz"
|
|
72
72
|
}
|
|
73
73
|
],
|
|
74
74
|
[
|
|
75
|
-
"/assets/src-
|
|
76
|
-
"assets/src-
|
|
75
|
+
"/assets/src-Du01yeMu.js",
|
|
76
|
+
"assets/src-Du01yeMu.js",
|
|
77
77
|
"text/javascript",
|
|
78
78
|
{
|
|
79
|
-
"br": "assets/src-
|
|
79
|
+
"br": "assets/src-Du01yeMu.js.br"
|
|
80
80
|
}
|
|
81
81
|
],
|
|
82
82
|
[
|
|
83
|
-
"/assets/src-
|
|
84
|
-
"assets/src-
|
|
83
|
+
"/assets/src-J2qT9xpv.js",
|
|
84
|
+
"assets/src-J2qT9xpv.js",
|
|
85
85
|
"text/javascript",
|
|
86
86
|
{
|
|
87
|
-
"br": "assets/src-
|
|
88
|
-
"gzip": "assets/src-
|
|
87
|
+
"br": "assets/src-J2qT9xpv.js.br",
|
|
88
|
+
"gzip": "assets/src-J2qT9xpv.js.gz"
|
|
89
89
|
}
|
|
90
90
|
],
|
|
91
91
|
[
|