@ai-ecoverse/slicc-spectrum 1.103.1 → 1.103.3
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 +14 -10
- package/dist/slicc-dummy.js +77 -1
- package/dist/slicc-dummy.js.map +2 -2
- package/dist/slicc-ui.js +351 -247
- package/dist/slicc-ui.js.map +4 -4
- package/dist/types/app/ansi.d.ts +8 -1
- package/dist/types/app/messages.d.ts +3 -1
- package/dist/types/dummy/vault.d.ts +2 -1
- package/dist/types/dummy.d.ts +1 -1
- package/dist/types/model/types.d.ts +14 -1
- package/package.json +8 -8
package/README.md
CHANGED
|
@@ -259,6 +259,7 @@ Every row has up to two lines, aligned to the top under the name, starting with
|
|
|
259
259
|
A cone with scoops has a ribbon line below: one segment per scoop, coloured by status at 3:1 or more on every row background, then its scoops in words, naming only the busy ones, as in "2 scoops · 1 waiting" ("2 scoops" when all are idle).
|
|
260
260
|
Its `aria-description` sums up every status, as in "2 scoops: 1 working, 1 idle".
|
|
261
261
|
Rows without scoops or errors have no empty ribbon or error line.
|
|
262
|
+
With no agents while the agent port's `starting()` returns a line, the panel says "The agent shows up here once it starts." (`[data-empty="starting"]`, subdued) and has no **New cone**; the line goes, and New cone comes back, once an agent arrives or the line clears.
|
|
262
263
|
The drop or delete button sits in its own column on the row's right edge, under the context fill, so the title ellipsizes before it and the focus ring stays whole; it shows on hover, on keyboard focus of the row, when <kbd>Tab</kbd> from the selected row reaches it, and always on touch, and it hides again once a pointer that clicked it leaves.
|
|
263
264
|
The selected row has an accent bar on its inline-start edge.
|
|
264
265
|
Under forced colors, the dots, segments, unread circle and selection bar keep `CanvasText`, `Highlight` and `HighlightText`.
|
|
@@ -277,7 +278,7 @@ User messages (with attachments and a quiet timestamp, `time.when`, by that rule
|
|
|
277
278
|
A lick with a body is a `details.lick` whose head (`summary.lick-head`, with a quiet chevron that turns when open) toggles it with a click, <kbd>Enter</kbd> or <kbd>Space</kbd>; clicking the body doesn't close it.
|
|
278
279
|
A reply's tool calls are the steps of its response status (`swc-response-status[slot=status]`, `data-id` the reply's), at the top of the reply: one `swc-response-status-step` per call (`id` `run-` and the call's id, `data-tool`, `data-status`, `data-kind`, and `data-id` the message the call came from), labelled with the tool and its `title`, `active` while it runs, `complete` when done and `stopped` when it failed or was cancelled, which its label says in words (" · Failed", " · Cancelled").
|
|
279
280
|
The status keeps `data-action="open-cluster"` and each step `data-action="open-run"` with `data-target` the call's id: clicking the host from script opens it, as the old strip's buttons did, and opening a step opens its status too.
|
|
280
|
-
A step whose call has anything to show labels itself with a button (`.run-toggle`, `aria-expanded`, `aria-controls`) that opens the call under the step's row, at the full width of the column and indented to the step's text, in our own region (`.run-detail#detail-` and the call's id, `role="listitem"`, `hidden` while closed, `data-target` the call's id), not in Spectrum's 340 px description; the step carries `data-open` while it's open. The region is the call: its input (a shell command after `$`), an edit's `diff` shown as a diff view, its output, both kept on their lines and scrolling sideways rather than wrapping, with its ANSI styles shown (bold, dim, italic, underline, inverse, and the 16, 256 and truecolor foregrounds and backgrounds; the 16 foregrounds come from `--slicc-terminal-color-0` to `-15` when an embedder sets them, else the terminal panel's light tokens, which adapt in dark (so a card in dark uses Spectrum's colors, not the panel's VS Code ones); the 16 backgrounds are Spectrum's subtle tints under the default text, black a solid grey under the lightest grey, so text keeps 4.5:1; a 256 or truecolor background
|
|
281
|
+
A step whose call has anything to show labels itself with a button (`.run-toggle`, `aria-expanded`, `aria-controls`) that opens the call under the step's row, at the full width of the column and indented to the step's text, in our own region (`.run-detail#detail-` and the call's id, `role="listitem"`, `hidden` while closed, `data-target` the call's id), not in Spectrum's 340 px description; the step carries `data-open` while it's open. The region is the call: its input (a shell command after `$`), an edit's `diff` shown as a diff view, its output, both kept on their lines and scrolling sideways rather than wrapping, with its ANSI styles shown (bold, dim, italic, underline, inverse, and the 16, 256 and truecolor foregrounds and backgrounds; the 16 foregrounds come from `--slicc-terminal-color-0` to `-15` when an embedder sets them, else the terminal panel's light tokens, which adapt in dark (so a card in dark uses Spectrum's colors, not the panel's VS Code ones); the 16 backgrounds are Spectrum's subtle tints under the default text, black a solid grey under the lightest grey, so text keeps 4.5:1; a 256 or truecolor background shows as a tint, blended toward the card (12% in light, 25% in dark), and one too close to the card to see, such as white on a light card, gets a grey tint toward the card's text instead; a 256 or truecolor foreground keeps its hue but moves toward black or white until it has 4.5:1 on the card or its tint, and other text on such a tint takes the card's text colour under the same floor; the card and its text colour are read once for light and once for dark, so the colours follow the theme through `light-dark()`, and a chat that can't read them (outside the Spectrum theme, where it shows the colours as sent) tries again only when it reconnects or the theme changes; dim subdues default text and turns a bright color into its normal one) and every other escape stripped, a partial escape at the end of streamed output waiting for the rest (the model still sees the raw bytes, and a copy gets the text without escapes), an `image`, such as a screenshot, an optional `meta` such as a timeout, the time a joined call ran ("Ran at 16:12", `.ran`, by the two-minute rule), and its `notes` (`{ severity, text }`, such as "Exited with code 5" or "Full output in /tmp/…") as lines under the output, `li[data-note][data-severity]`: `error` with an alert icon in the negative colour, `warn` with an alert icon and `info` with an info icon, both subdued.
|
|
281
282
|
The status's header is always one line: while the reply streams or the agent works on the run, it is `active`, with the running call (or the last one) as its label and that call's kind as its loader, and each label stays for at least a second before the next one replaces it, so streamed arguments don't make it flicker; a reply without calls shows "Generating response" only until its first text or visible thinking.
|
|
282
283
|
Done, the status stays as `complete`, also when a call never left `running` (the step stays `active`): one call reads as its tool and `title`, more as the model's label for them or, until there is one, a count of the two most common kinds and the rest, such as "3 commands, 1 read" or "5 commands, 4 agent steps and 9 more", led by any failures ("1 failed, 1 cancelled · "), so the one-line header never cuts them off; a stopped reply says so.
|
|
283
284
|
Every call of a reply is in its one status, above its text; a later reply with text starts a new run, while a standalone tool message or a reply with only tool calls, streaming or done, joins the status of the run before it on the same day (hidden thinking and source links don't count as text), so a turn never collapses when its calls finish and past messages never move down.
|
|
@@ -307,7 +308,7 @@ Between the header and the transcript, a `<slicc-notices>` shows the model's not
|
|
|
307
308
|
On a follower without Control, or while the agent port's `readOnly()` returns a line, a note (`p[data-follow="watch"]`, that line first, else the follow-based one) takes the composer's place, the header shows the model's name instead of the pickers and New conversation, and there's no suggested follow-up.
|
|
308
309
|
An empty chat says "No messages yet.
|
|
309
310
|
Ask sliccy something." with the agent's name, and only "No messages yet." while watch-only.
|
|
310
|
-
While the agent port's `starting()` returns a line, the chat has no empty state (`[data-empty]`): the embedder's notice says what's going on.
|
|
311
|
+
While the agent port's `starting()` returns a line, the chat has no empty state (`[data-empty]`): the embedder's notice says what's going on, and the header, with no agent yet, shows a neutral "Starting…" light (`[data-starting]`) instead of "No agent".
|
|
311
312
|
With the model's `seat` set, the chat is a guest's page: the header shows only the cone's name (`[data-seat-cone]`) and its status, with no pickers, meter or New conversation; the guest's own messages (`origin` `guest` whose `seat` is the seat's `id`, or, without a `seat`, whose `from` is its `label`) read as the reader's own, with no name, while other guests keep "From {label}" and the host's messages read "From the host"; an open question or a permission request takes the normal card border, without its buttons, form or countdown, and stays in the log (no `data-pending`), and says "The host answers this."
|
|
312
313
|
(`[data-host-answers]`, subdued); once answered, it shows the answer as everyone sees it; a reviewed guest message's outcome (a notice titled "It was approved.", "Nobody approved this in time.", "It was declined." or "It was withdrawn.", with the message as its text) reads as the quoted message, cut to one line, then the outcome (`.marker[data-ended]`); an approved one shows only "It was approved.", since the delivered message follows right after it; inline sprinkles inert with "View only on this device", error cards have no action and there's no suggested follow-up; the models aren't settled, and files can't be dropped.
|
|
313
314
|
An empty guest chat says "No messages yet.
|
|
@@ -341,7 +342,7 @@ The message box.
|
|
|
341
342
|
`/` completes commands (`/clear`, `/compact`, `/model`, `/thinking`, `/scoop`, `/stop`, `/freeze` when the port can freeze, `/theme`) and their arguments, `@` mentions agents and files.
|
|
342
343
|
Attach from the computer, from SLICC's files, a browser screenshot or a shared secret (with a `vault.put`, the popup takes the value too, checks it like Settings › Secrets, puts it in the vault and attaches the name, showing errors inline and clearing the field; an empty value shares a name the vault already has, and a new value for one asks before it replaces it; while the vault is away (`availability()` `connecting` or `waiting`) or locked, it takes no value and says so; without one, it attaches the name and says to add the value in Settings › Secrets), or paste and drop files (25 MB each; a dropped folder, told apart by its drag entry, becomes a “Folders can’t be attached” chip, and a file that can't be read a “Could not read the file” chip, instead of an attachment).
|
|
343
344
|
<kbd>Esc</kbd> in the `+` menu closes it, from any item, and puts focus back on `+`; it goes no further, so it doesn't also stop a reply.
|
|
344
|
-
Queued messages wait above it, to send now or drop; a steer the agent still holds (`mode: 'steer'`, `li.queued[data-mode=steer]`) reads "Sends at the next step" and can only be dropped.
|
|
345
|
+
Queued messages wait above it in a dashed box (`--swc-neutral-visual-color`, 3:1 or more against the composer in both themes), to send now or drop; a steer the agent still holds (`mode: 'steer'`, `li.queued[data-mode=steer]`) reads "Sends at the next step" and can only be dropped.
|
|
345
346
|
Model and thinking pickers.
|
|
346
347
|
Where the browser has speech recognition, the `+` menu ends with **Enable push to talk** (`settings.pushToTalk`, optional and off by default), a checkable item (`menuitemcheckbox`, `aria-checked`) described as "Hold Alt+M to dictate", which stays open when toggled; Settings has the same switch.
|
|
347
348
|
While it is on, holding <kbd>Alt</kbd>+<kbd>M</kbd> in the field (by `code`, so <kbd>Option</kbd>+<kbd>M</kbd> on a Mac types no µ; not with Ctrl, ⌘ or Shift, nor during IME composition) dictates into it, the field's description ends with "hold Alt+M to dictate", and releasing either key, or leaving the window, stops it.
|
|
@@ -387,7 +388,7 @@ One file (`path`), highlighted, with its pending change and a link to the diff.
|
|
|
387
388
|
|
|
388
389
|
#### `<slicc-changes>`
|
|
389
390
|
|
|
390
|
-
Pending changes with their author.
|
|
391
|
+
Pending changes with their author, by name, which follows `agents` so an agent that arrives later replaces its id (also in `<slicc-diff-panel>`'s bar).
|
|
391
392
|
Opens the diff, accepts or reverts one change or all of them (**Accept all** and **Revert all** are `data-action="accept-all"` and `data-action="revert-all"`).
|
|
392
393
|
While watch-only (`watchOnly()`: a follower without Control, or the agent port's `readOnly()`), the list and the diffs stay but no Accept or Revert shows: a subdued "Watch only" (`[data-watch-note]`, plain text, not a live region) stands where Accept all and Revert all were, and a revert confirmed after that is dropped.
|
|
393
394
|
With nothing pending it says "No pending changes.
|
|
@@ -467,7 +468,7 @@ The secrets, sorted by name (`li[data-secret][data-state]`, with `[data-rules]`,
|
|
|
467
468
|
Locked, every form (Add secret, Replace value, Import, Export) says "Unlock the vault first" (`p[data-locked]`) next to the vault's own small **Unlock** button (`slicc-vault-button[data-action=unlock]`) and disables its submit; once unlocked, the form stays open with what was typed and its submit enables.
|
|
468
469
|
Vault errors show their message, EACCES as "Unlock the vault first" and ENOTSUP as "This arrives with a later vault version".
|
|
469
470
|
Each action shows only when the port has its method.
|
|
470
|
-
Then **Rules SLICC refused** (`[data-refused]`), where the rules live (`[data-policy]`) and **Activity** (`ol.audit li[data-seq][data-type]`; an entry with `uid` and `tag` both `null` reads "by you", a `refresh` entry "Refreshed automatically" (with the sign-in it used), an `endpoints` entry (vault-originated, no "by …") one part per field it carries: (1.91.0's `EndpointsEntry` had a required `purged` with `url`; no vault wrote it before 1.13.0, so the shape was corrected rather than kept, with `purged` optional and `host` replacing `url`) `purged` "Removed custom model URLs an agent set, automatically: {provider name} at {host}, …. Only you can set a model URL now, in Settings › Accounts" (the provider's name from `settings.accounts()`, else its id), `adopted` "Kept the MCP servers your tokens use, automatically: {server} at {host}, …", `pinned` "{name} pinned to {host} automatically, on first use" with **Unpin** (`data-action=unpin`, calling the vault port's optional `unpin([name])`; disabled while the vault is locked; a failure shows in the row as `[data-error=unpin]`, in the same words as other vault failures; it's hidden once a newer `unpinned` entry for that name is in the log), and `unpinned` "{name} unpinned from {host}; the next use pins it again", an `mcp` entry "Sent to the MCP server SERVER at DOMAIN" with its request and exit, and a policy entry lists its changes, its warning and, when accepted, how to change the file back; **Only reveals to programs**, `data-action="reveals"`, and **Show older**, `data-action="older"`).
|
|
471
|
+
Then **Rules SLICC refused** (`[data-refused]`), where the rules live (`[data-policy]`) and **Activity** (`ol.audit li[data-seq][data-type]`; an entry with `uid` and `tag` both `null` reads "by you", a `refresh` entry "Refreshed automatically" (with the sign-in it used), an `endpoints` entry (vault-originated, no "by …") one part per field it carries: (1.91.0's `EndpointsEntry` had a required `purged` with `url`; no vault wrote it before 1.13.0, so the shape was corrected rather than kept, with `purged` optional and `host` replacing `url`) `purged` "Removed custom model URLs an agent set, automatically: {provider name} at {host}, …. Only you can set a model URL now, in Settings › Accounts" (the provider's name from `settings.accounts()`, else its id), `adopted` "Kept the MCP servers your tokens use, automatically: {server} at {host}, …", `pinned` "{name} pinned to {host} automatically, on first use" with **Unpin** (`data-action=unpin`, calling the vault port's optional `unpin([name])`; disabled while the vault is locked; a failure shows in the row as `[data-error=unpin]`, in the same words as other vault failures; it's hidden once a newer `unpinned` entry for that name is in the log), and `unpinned` "{name} unpinned from {host}; the next use pins it again", an `mcp` entry "Sent to the MCP server SERVER at DOMAIN" with its request and exit, a `session` entry (a value the vault handed the kernel for a verified TLS session, vault 1.15.0) "Sent over {HTTP/1.1, SMTP or Postgres} to {domain}:{port}, {trusted by public roots, or trusted by its pinned anchor}, through {exit}" (no trust part when an older entry has no `verifiedBy` or a newer vault sends one spectrum doesn't know; a protocol it doesn't know reads as its raw name), and a policy entry lists its changes, its warning and, when accepted, how to change the file back; **Only reveals to programs**, `data-action="reveals"`, and **Show older**, `data-action="older"`).
|
|
471
472
|
The section's `data-vault` is `locked`, `unlocked` or `loading`.
|
|
472
473
|
A popup the browser blocked shows how to allow it (`[data-popup=blocked]`).
|
|
473
474
|
Widened-rule notices aren't shown.
|
|
@@ -1069,8 +1070,8 @@ Like slicc-agent's snapshot, the dummy's vitals are the budget, Spend, Active ag
|
|
|
1069
1070
|
`createDummyModel({ asks: 'long' })` (`?asks=long`) adds a pending sudo request with that seven-line command to kitchen-sink (`k-long`).
|
|
1070
1071
|
Decisions are recorded in `model.approvals.decisions`, and `model.approvals.end(id, reason)` ends a request.
|
|
1071
1072
|
|
|
1072
|
-
`createDummyModel({ vault: 'empty' | 'secrets' | 'policy' | 'locked' | 'request' | 'backup' | 'waiting' | 'purged' | 'endpoints-fail' | 'off' })` (`?vault=` on `/ui/`, off by default; `notice` is kept as another name for `policy`) adds an invented vault: no secrets yet; five secrets (an API key, a jerk lease from pier-nuc revealed to `pier publish`, a Tide Mail sign-in, one without a rule and a removed one) with an activity log that pages back once; the same with a refused rule and a policy change in the log; locked before the first unlock, with a waiting request from docs-pass; unlocked with a `fnox set` request for `TIDE_STATION_TOKEN`; the secrets with a due backup reminder; or a vault that hasn't answered yet (`model.vault.arrive()` brings it); Cloudflare's Account ID and AI Gateway ID and Azure's endpoint carry `vaultSetting`s; the dummy vault keeps `settings` on its records, logs each `settings` call in `model.vault.settingsCalls`, and refuses a setting whose value starts with `bad` (“The vault refused {KEY}. Check that value and try again.”). `endpoints-fail` is the secrets with an `endpoints` that refuses (an MCP URL with “The vault refused {url} for this token. Check the server's address, then try again.”, a model URL with “The vault refused that endpoint. Check the address and try again.”). The dummy vault records each `endpoints` change in `model.vault.endpointChanges`.
|
|
1073
|
-
`purged` is `secrets` plus two `endpoints` audit entries: one with `purged` and `adopted`, and one `pinned` (`DOCS_MCP_TOKEN` on docs.example) that Unpin turns into an `unpinned` entry; `vaultPurged` and `vaultPinned` are exported.
|
|
1073
|
+
`createDummyModel({ vault: 'empty' | 'secrets' | 'policy' | 'locked' | 'request' | 'backup' | 'waiting' | 'purged' | 'session' | 'endpoints-fail' | 'off' })` (`?vault=` on `/ui/`, off by default; `notice` is kept as another name for `policy`) adds an invented vault: no secrets yet; five secrets (an API key, a jerk lease from pier-nuc revealed to `pier publish`, a Tide Mail sign-in, one without a rule and a removed one) with an activity log that pages back once; the same with a refused rule and a policy change in the log; locked before the first unlock, with a waiting request from docs-pass; unlocked with a `fnox set` request for `TIDE_STATION_TOKEN`; the secrets with a due backup reminder; or a vault that hasn't answered yet (`model.vault.arrive()` brings it); Cloudflare's Account ID and AI Gateway ID and Azure's endpoint carry `vaultSetting`s; the dummy vault keeps `settings` on its records, logs each `settings` call in `model.vault.settingsCalls`, and refuses a setting whose value starts with `bad` (“The vault refused {KEY}. Check that value and try again.”). `endpoints-fail` is the secrets with an `endpoints` that refuses (an MCP URL with “The vault refused {url} for this token. Check the server's address, then try again.”, a model URL with “The vault refused that endpoint. Check the address and try again.”). The dummy vault records each `endpoints` change in `model.vault.endpointChanges`.
|
|
1074
|
+
`purged` is `secrets` plus two `endpoints` audit entries: one with `purged` and `adopted`, and one `pinned` (`DOCS_MCP_TOKEN` on docs.example) that Unpin turns into an `unpinned` entry; `vaultPurged` and `vaultPinned` are exported. `session` is `secrets` plus three `session` audit entries (`vaultSessions`, exported): SMTP trusted by public roots, Postgres trusted by a pinned anchor through pier-nuc, and HTTP/1.1 with no `verifiedBy`.
|
|
1074
1075
|
It implements every op with the vault's checks, and keeps only names: `model.vault.puts` records `{ name, request? }`, `cancelled` the cancelled requests, `imports` each import's kind, size and pick, and `exported` the exports.
|
|
1075
1076
|
Import offers five invented candidates (one replaces a secret, one is a model key, one is refused with a reason that the done stage repeats; KeePass adds a `_2` duplicate), six answers ENOTSUP, page ops are recorded with `uid: null, tag: null`, and value ops while locked answer EACCES.
|
|
1076
1077
|
`model.vault.fail(code, message)` makes the next op fail.
|
|
@@ -1160,10 +1161,13 @@ The test page is served cross-origin isolated (COOP/COEP), as slicc-kernel requi
|
|
|
1160
1161
|
`test/integration/kernel-ui.test.mjs` boots `<slicc-app>` on the kernel model (`/kernel-ui/`): a command in the terminal, its file in the tree, an edit in a file tab read back in the terminal, a second terminal, and a reload.
|
|
1161
1162
|
`test/integration/ui.test.mjs` covers the shell, the layout (moving, closing, floating, reopening and reloading), streaming a reply with a tool call, stopping it, switching themes and the keyboard, and saves screenshots to `artifacts/ui/`.
|
|
1162
1163
|
|
|
1163
|
-
The Biome, TypeScript, lefthook, Renovate and CI configuration comes from [slicc-shared-web](https://github.com/ai-ecoverse/slicc-shared-web), which also provides the `slicc-lint-comments`, `slicc-no-unit-tests` and `slicc-diff-cover` commands used by `npm run lint` and the pre-commit hook.
|
|
1164
|
+
The Biome, TypeScript, lefthook, Renovate and CI configuration comes from [slicc-shared-web](https://github.com/ai-ecoverse/slicc-shared-web), which also provides the `slicc-lint`, `slicc-lint-comments`, `slicc-agents-md`, `slicc-no-unit-tests`, `slicc-unit-cover` and `slicc-diff-cover` commands used by `npm run lint` and the pre-commit hook.
|
|
1164
1165
|
|
|
1165
|
-
Unit tests live in `test/unit/`, which is gitignored.
|
|
1166
|
-
The pre-commit hook runs them in Node against happy-dom under monocart and fails the commit unless the staged lines in `src/` are fully covered (`slicc-diff-cover`, which runs `diff-cover --fail-under 100` and needs [uv](https://docs.astral.sh/uv/)).
|
|
1166
|
+
Unit tests live in `test/unit/`, which is gitignored: each change brings fresh unit tests for its own lines, and they are never committed or kept.
|
|
1167
|
+
The pre-commit hook runs them in Node against happy-dom under monocart and fails the commit unless the staged lines in `src/` are fully covered (`slicc-unit-cover` runs the unit tests the change reaches, then `slicc-diff-cover`, which runs `diff-cover --fail-under 100` and needs [uv](https://docs.astral.sh/uv/)).
|
|
1168
|
+
`npm run test:unit` uses this repo's `mcr.config.mjs`, which extends shared-web's, preloads `unit-setup.mjs` into every test process, and picks the untested `src/` files with a function instead of the glob `**/*.{js,mjs,ts}`.
|
|
1169
|
+
`unit-setup.mjs` registers happy-dom's globals and turns `.css`, `.shtml` and `dockview-core/css` imports into text modules, as the build does, so a fresh unit test can import any module in `src/`.
|
|
1170
|
+
The glob's `**` skips dot directories, so in a checkout under one (a bb worktree in `~/.bb/`) untested files were left out of the report and the hook passed on lines no unit test ran.
|
|
1167
1171
|
|
|
1168
1172
|
## Design review
|
|
1169
1173
|
|
package/dist/slicc-dummy.js
CHANGED
|
@@ -1279,6 +1279,26 @@ function colours() {
|
|
|
1279
1279
|
{ type: "text", text: "Printed it in **color**." }
|
|
1280
1280
|
];
|
|
1281
1281
|
}
|
|
1282
|
+
var extendedOutput = [
|
|
1283
|
+
"cube \x1B[38;5;16m16\x1B[0m \x1B[38;5;21m21\x1B[0m \x1B[38;5;46m46\x1B[0m \x1B[38;5;196m196\x1B[0m \x1B[38;5;226m226\x1B[0m \x1B[38;5;231m231\x1B[0m \x1B[38;5;244m244\x1B[0m\n",
|
|
1284
|
+
"rgb \x1B[38;2;20;20;20mslate\x1B[0m \x1B[38;2;0;120;255mharbor\x1B[0m \x1B[38;2;255;140;0mbuoy\x1B[0m \x1B[38;2;240;240;240mfog\x1B[0m\n",
|
|
1285
|
+
"tint \x1B[48;5;231m 231 \x1B[0m \x1B[48;5;226m 226 \x1B[0m \x1B[48;5;16m 16 \x1B[0m \x1B[48;5;21m 21 \x1B[0m \x1B[48;2;255;255;0m beacon \x1B[0m \x1B[48;2;0;0;139m deep \x1B[0m\n",
|
|
1286
|
+
"both \x1B[38;5;226;48;5;231m flare \x1B[0m \x1B[38;2;20;20;20;48;2;255;255;0m pier \x1B[0m \x1B[7;38;5;196m alarm \x1B[0m\n"
|
|
1287
|
+
].join("");
|
|
1288
|
+
function extendedColours() {
|
|
1289
|
+
return [
|
|
1290
|
+
{
|
|
1291
|
+
type: "tool",
|
|
1292
|
+
name: "bash",
|
|
1293
|
+
title: "Print 256 and truecolor",
|
|
1294
|
+
input: "./swatch --256 --truecolor",
|
|
1295
|
+
output: extendedOutput,
|
|
1296
|
+
paths: [],
|
|
1297
|
+
ticks: 20
|
|
1298
|
+
},
|
|
1299
|
+
{ type: "text", text: "Printed the **256** and **truecolor** swatches." }
|
|
1300
|
+
];
|
|
1301
|
+
}
|
|
1282
1302
|
function edit() {
|
|
1283
1303
|
return [
|
|
1284
1304
|
{
|
|
@@ -1680,6 +1700,7 @@ function script(prompt, attachments = []) {
|
|
|
1680
1700
|
if (/\b(ask|choose|decide)\b/.test(text)) return { steps: ask(), suggestion };
|
|
1681
1701
|
if (/\b(debug|investigate)\b/.test(text)) return { steps: investigate(), suggestion };
|
|
1682
1702
|
if (/\b(search|grep)\b/.test(text)) return { steps: search(), suggestion };
|
|
1703
|
+
if (/\b(256|truecolou?r)\b/.test(text)) return { steps: extendedColours(), suggestion };
|
|
1683
1704
|
if (/\bcolou?rs?\b/.test(text)) return { steps: colours(), suggestion };
|
|
1684
1705
|
if (/\btests?\b/.test(text)) return { steps: test(), suggestion };
|
|
1685
1706
|
if (/\b(fix|edit|add|change)\b/.test(text)) return { steps: edit(), suggestion };
|
|
@@ -6176,6 +6197,59 @@ function vaultPinned(now2 = Date.now()) {
|
|
|
6176
6197
|
pinned: { name: "DOCS_MCP_TOKEN", server: "docs", host: "docs.example" }
|
|
6177
6198
|
};
|
|
6178
6199
|
}
|
|
6200
|
+
function vaultSessions(now2 = Date.now()) {
|
|
6201
|
+
const who = { uid: 1e3, tag: "cone" };
|
|
6202
|
+
return [
|
|
6203
|
+
{
|
|
6204
|
+
...who,
|
|
6205
|
+
type: "session",
|
|
6206
|
+
seq: 15,
|
|
6207
|
+
id: "audit-15",
|
|
6208
|
+
at: now2 - minute3,
|
|
6209
|
+
name: "TIDE_MAIL",
|
|
6210
|
+
session: "kernel-session-tide-0015",
|
|
6211
|
+
domain: "mail.tide.example",
|
|
6212
|
+
port: 587,
|
|
6213
|
+
protocol: "smtp",
|
|
6214
|
+
position: "auth-plain",
|
|
6215
|
+
rule: 2,
|
|
6216
|
+
verifiedBy: "roots",
|
|
6217
|
+
exit: "proxy"
|
|
6218
|
+
},
|
|
6219
|
+
{
|
|
6220
|
+
...who,
|
|
6221
|
+
type: "session",
|
|
6222
|
+
seq: 14,
|
|
6223
|
+
id: "audit-14",
|
|
6224
|
+
at: now2 - 2 * minute3,
|
|
6225
|
+
name: "REEF_DEPLOY_KEY",
|
|
6226
|
+
session: "kernel-session-reef-0014",
|
|
6227
|
+
domain: "db.reef.example",
|
|
6228
|
+
port: 5432,
|
|
6229
|
+
protocol: "pg",
|
|
6230
|
+
position: "scram-sha-256",
|
|
6231
|
+
rule: 3,
|
|
6232
|
+
verifiedBy: "anchored",
|
|
6233
|
+
anchor: "q83vEjRWeJA=",
|
|
6234
|
+
exit: "device:link-pier"
|
|
6235
|
+
},
|
|
6236
|
+
{
|
|
6237
|
+
...who,
|
|
6238
|
+
type: "session",
|
|
6239
|
+
seq: 13,
|
|
6240
|
+
id: "audit-13",
|
|
6241
|
+
at: now2 - 3 * minute3,
|
|
6242
|
+
name: "HARBOR_API_KEY",
|
|
6243
|
+
session: "kernel-session-harbor-0013",
|
|
6244
|
+
domain: "quay.harbor.example",
|
|
6245
|
+
port: 8443,
|
|
6246
|
+
protocol: "http1",
|
|
6247
|
+
position: "header:authorization",
|
|
6248
|
+
rule: 1,
|
|
6249
|
+
exit: "tailscale"
|
|
6250
|
+
}
|
|
6251
|
+
];
|
|
6252
|
+
}
|
|
6179
6253
|
function vaultPolicy(now2 = Date.now()) {
|
|
6180
6254
|
return {
|
|
6181
6255
|
type: "policy",
|
|
@@ -6268,6 +6342,7 @@ function vaultFixtures(scenario, now2 = Date.now()) {
|
|
|
6268
6342
|
audit: empty ? [] : [
|
|
6269
6343
|
...policy ? [vaultPolicy(now2)] : [],
|
|
6270
6344
|
...scenario === "purged" ? [vaultPinned(now2), vaultPurged(now2)] : [],
|
|
6345
|
+
...scenario === "session" ? vaultSessions(now2) : [],
|
|
6271
6346
|
...vaultAudit(now2)
|
|
6272
6347
|
],
|
|
6273
6348
|
auditMore: !empty,
|
|
@@ -6891,6 +6966,7 @@ export {
|
|
|
6891
6966
|
vaultPolicy,
|
|
6892
6967
|
vaultPurged,
|
|
6893
6968
|
vaultRefused,
|
|
6894
|
-
vaultSecrets
|
|
6969
|
+
vaultSecrets,
|
|
6970
|
+
vaultSessions
|
|
6895
6971
|
};
|
|
6896
6972
|
//# sourceMappingURL=slicc-dummy.js.map
|