@ai-ecoverse/slicc-spectrum 1.99.3 → 1.100.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 +6 -2
- package/dist/slicc-dummy.js +83 -2
- package/dist/slicc-dummy.js.map +3 -3
- package/dist/slicc-ui.js +327 -130
- package/dist/slicc-ui.js.map +3 -3
- package/dist/types/app/markdown.d.ts +5 -1
- package/dist/types/app/updates.d.ts +11 -1
- package/dist/types/model/types.d.ts +7 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -472,6 +472,8 @@ It closes, clearing the field, when the request leaves `waiting` or while the va
|
|
|
472
472
|
#### `<slicc-updates>`
|
|
473
473
|
|
|
474
474
|
Install / Update: component states, version changes, last checks, download and link counts, action buttons, failures with Retry, and collapsible install logs behind a quiet chevron, which stay open across a layout switch.
|
|
475
|
+
A row with a pending version change (`from → to`, or a package's `version → offered`) and release notes shows a What’s new disclosure after the row's actions (in package rows, after the command chips), next to the Install log, `details[data-releases]` with `summary[data-action="whats-new"]`, which stays open across a layout switch like the log. It lists every release after the installed version up to the new one, newest first, each as `.release[data-version]` with its version linking to the release page (`a[data-action="release-notes"]`, named "Kernel 1.13.0 release notes") and its notes rendered as markdown in strict mode (`markdown(text, { strict: true })`: raw HTML tags are dropped and their text kept as plain text, only `https:` links stay links, and an image becomes a link with its alt text, so nothing loads; the notes' headings sit one level under the release's, through `level`). Notes over 8 KB (8,192 characters) per release are cut at the last line break before that, with "…" and a Read the full notes link (`[data-cut]`, named "Read the full notes for Kernel 1.13.0"); a release whose `url` isn't `https:` shows its version as plain text. The `<!-- cert-verify -->` block is dropped, and a block that starts with "certified" shows as a subtle Certified badge (`[data-certified]`); a heading line naming the version is dropped too, since the link already shows it. Without notes in the range there is no disclosure.
|
|
476
|
+
An up-to-date row (no pending change) links its installed release with Release notes next to the version; an installed optional package without one links its npm page instead (`a[data-action="npm-page"]`, named "npm page for Biome 2.2.4"). Pins and additions in Your packages show no link. Every link opens in a new tab.
|
|
475
477
|
An install shows one bar for update rows and package rows alike: it fills 0–50% while downloading and 50–100% while linking (`value` against `max-value="100"`). While the row runs it never goes back, not when pnpm's total grows and not when progress drops out between passes. While a download reports `bytes` with a total above 0, the first half fills by bytes and the value label reads "10.0 MB of 40.0 MB". Otherwise, and always while linking, the label falls back to the phase's "n of m" count. The bar starts at 0 again once the row settles.
|
|
476
478
|
Opens at boot until the agent is ready without failures.
|
|
477
479
|
Background updates stay in the header's update status; new failures reopen the panel, and after a reload into a boot that isn't ready yet such a panel closes once the agent is ready.
|
|
@@ -486,8 +488,8 @@ What agents remember, grouped by section: search, filter by scope and tag, expan
|
|
|
486
488
|
The scope picker starts on **Everyone** (`*`), which lists every memory with its scope on it (`.scope[data-scope]`); `global` reads **Shared** whatever the port calls it, and the cones and roles follow.
|
|
487
489
|
The count (“N of M memories”) counts the memories in the picked scope.
|
|
488
490
|
With a search or tag filter that hides everything it says “No memories match.”, otherwise “No memories yet.”, “No shared memories yet.” or “No memories for {scope} yet.”
|
|
489
|
-
Each memory is a row (`li.row[data-id]`, divided from the next by a rule) with one structure open or closed: the title line (`.head`, the disclosure button) keeps its chevron, title and marks where they are, and the text below it (`.content`) shows two lines closed and grows into the full text in place when the row opens, so opening only adds height below. It stays open across a layout switch. Open rows (`data-open`) take no fill, so nothing reads as selected; the chevron turns down. Height and chevron move like Spectrum's accordion (`--swc-animation-duration-100`, ease in and out), and not at all under `prefers-reduced-motion`. A click on a closed row's text opens it too.
|
|
490
|
-
An open row ends in an action row at the trailing end
|
|
491
|
+
Each memory is a row (`li.row[data-id]`, divided from the next by one straight hairline, a square-ended `--swc-border-width-100` rule in the neutral border colour that spans the row, even where the row's hover fill is rounded) with one structure open or closed: the title line (`.head`, the disclosure button) keeps its chevron, title and marks where they are, and the text below it (`.content`) shows two whole lines closed (the clamp leaves room for one paragraph gap, so a second paragraph's first line is never half cut and doesn't move when the row opens) and grows into the full text in place when the row opens, so opening only adds height below. It stays open across a layout switch. Open rows (`data-open`) take no fill, so nothing reads as selected; the chevron turns down. Height and chevron move like Spectrum's accordion (`--swc-animation-duration-100`, ease in and out), and not at all under `prefers-reduced-motion`. A click on a closed row's text opens it too.
|
|
492
|
+
An open row ends in an action row: first its tag and scope in words next to their icons (`.meta [data-label=tag]`, `[data-label=scope]`, such as “Project” and “harbor only”), since touch has no tooltips, while a closed row shows only the icons; the open row hides its title-line tag and scope icons (`visibility: hidden`, so the title keeps its place) instead of showing them twice; then at the trailing end **Edit** and **Forget** (`data-action="edit"`, `data-action="forget"`), Forget in the negative content colour and asking first with the destructive confirm.
|
|
491
493
|
At the end of the title line, small icons (`.mark`, `role="img"` with an `aria-label` and a tooltip) carry the metadata: the tag (`.tag[data-tag]`: User a file with a person, Feedback a comment, Project a briefcase), “From MEMORY.md” for free text outside an entry (`.from`), and under Everyone the scope (`.scope[data-scope]`: Shared a group of people, a cone a person, a role a person with a gear, labelled “Shared” or “{name} only”).
|
|
492
494
|
The tag is left out where the list already says it: under a section heading that names it (Projects, User, Feedback) and while the tag filter picks it.
|
|
493
495
|
Below 560 px of panel width, the search takes its own line over the two pickers.
|
|
@@ -807,6 +809,7 @@ Use `queued` for a row that waits for another component before it starts; it rea
|
|
|
807
809
|
Use `starting` for an installed row that is only starting up: it reads "Starting" without a checked line, and the header shows a neutral "Starting" only when nothing is failed, updating or ready.
|
|
808
810
|
A `failed` row with an installed `from` version reads "Update failed".
|
|
809
811
|
`act(id, action)` resolves when dispatched or rejects with a displayed error; actions are `retry`, `update-now`, `restart-agent` and `reload`.
|
|
812
|
+
A row's and a package's optional `releases` (`UpdateRelease[]`) lists the GitHub releases the embedder knows for it, each with its `version`, the release page `url` and optional `notes` (the release body, semantic-release markdown as GitHub returns it). Send every release after the installed version up to the new one, so the panel can show the whole range, plus the installed one for its link; spectrum orders them by version and never fetches them itself. Leave it out, or leave out `notes`, when there's nothing to show.
|
|
810
813
|
Missing ports preserve existing adapters and report disconnected information in the panel.
|
|
811
814
|
Optional `packages()` returns `PackageItem` rows for optional tools, each with a short catalog `id`, its npm `package` (shown in the name's tooltip and at the top of its Install log), `label`, a one-sentence `description`, the `commands` it provides, `requires` (other package ids, read as "Uses Python" while it's installed, or "Installs Python too" on a row that isn't installed yet; an installed row leaves out a requirement that isn't installed, since its warning says so), optional `notes` (short plain-text lines shown muted under the row, such as "1 untested dependency: …"; leave it out when there's nothing to say), optional `warnings` (lines with an alert icon, `data-warnings`, such as "Needs Python, which isn't installed.
|
|
812
815
|
Install Python again to use it."; the dummy adds that one when a required package is removed), `state` (`available`, `queued`, `installing`, `installed`, `outdated`, `updating`, `removing` or `failed`), the installed `version`, the `offered` version and its `size` in bytes, `progress` (`InstallProgress`, or `null` for an indeterminate bar), `error`, `actions` (`install`, `update`, `remove`, `retry`, `unpin`) and an optional `log`.
|
|
@@ -960,6 +963,7 @@ Pass only the surfaces a follower has to `<slicc-app>` (agents, chat, terminal a
|
|
|
960
963
|
|
|
961
964
|
The dummy supports `createDummyModel({ updates: 'boot' | 'starting' | 'current' | 'available' | 'restart' | 'failure' })`, also selectable with `?updates=` on `/ui/`.
|
|
962
965
|
Fixtures stay stable for inspection; `model.updates.setScenario('current')` completes boot.
|
|
966
|
+
The dummy's kernel offers three releases from 1.12.0 to 1.13.0, two of them certified, the agent one release to 0.25.0, and the syntax grammars only their installed release; its uv package offers two releases, Python links its release and the other installed packages their npm pages.
|
|
963
967
|
Dummy Update now and Retry simulate download and link progress, and a dummy package install reports half its `size` in bytes on the way; Restart agent and Reload only change fixture state, never restart a real process or reload the browser.
|
|
964
968
|
`createDummyModel({ packages: 'mixed' | 'empty' | 'fail' | 'user' | 'elsewhere' | 'off' })` (or `?packages=` on `/ui/`, off by default) adds invented optional packages in every state: Install and Retry finish after a short wait and install missing requirements too, `fail` makes them fail, `user` adds a pinned agent-kit and two additions (one with a warning) that Unpin and Remove take out of the list, `elsewhere` has git installed for cone with pnpm and TypeScript there at an older version, whose Update keeps it in place, and Biome both from the panel and for cone, whose Remove leaves cone's copy, and removing Python while uv is installed asks through the `confirm` option (the `/ui/` page passes spectrum's `confirm`).
|
|
965
969
|
`updateFixtures`, `packageFixtures` and `DummyUpdates` are exported from `/dummy`.
|
package/dist/slicc-dummy.js
CHANGED
|
@@ -4944,6 +4944,65 @@ var DummyTray = class extends Emitter {
|
|
|
4944
4944
|
|
|
4945
4945
|
// src/dummy/updates.ts
|
|
4946
4946
|
var checkedAt = Date.UTC(2026, 9, 8, 8, 42);
|
|
4947
|
+
var tag = (repo, version, notes2) => ({
|
|
4948
|
+
version,
|
|
4949
|
+
url: `https://github.com/harbor-demo/${repo}/releases/tag/v${version}`,
|
|
4950
|
+
...notes2 ? { notes: notes2 } : {}
|
|
4951
|
+
});
|
|
4952
|
+
var certified = (name2, version) => `
|
|
4953
|
+
|
|
4954
|
+
<!-- cert-verify -->
|
|
4955
|
+
certified @harbor/${name2}@${version} sha256=0f3c9a1e (covers ${version}; downstream: PASS)
|
|
4956
|
+
<!-- /cert-verify -->
|
|
4957
|
+
`;
|
|
4958
|
+
var notes = (repo, version, sections) => `# [${version}](https://github.com/harbor-demo/${repo}/compare/v${version}) (2026-10-07)
|
|
4959
|
+
|
|
4960
|
+
${sections}`;
|
|
4961
|
+
var releaseFixtures = {
|
|
4962
|
+
kernel: [
|
|
4963
|
+
tag(
|
|
4964
|
+
"harbor-kernel",
|
|
4965
|
+
"1.13.0",
|
|
4966
|
+
notes(
|
|
4967
|
+
"harbor-kernel",
|
|
4968
|
+
"1.13.0",
|
|
4969
|
+
"### Features\n\n* **fs:** watch a folder and get one event per batch of changes\n* **jobs:** `wait -n` returns the first job that finishes"
|
|
4970
|
+
) + certified("harbor-kernel", "1.13.0")
|
|
4971
|
+
),
|
|
4972
|
+
tag(
|
|
4973
|
+
"harbor-kernel",
|
|
4974
|
+
"1.12.2",
|
|
4975
|
+
notes(
|
|
4976
|
+
"harbor-kernel",
|
|
4977
|
+
"1.12.2",
|
|
4978
|
+
"### Bug Fixes\n\n* **net:** a slow DNS answer no longer stalls the next request"
|
|
4979
|
+
) + certified("harbor-kernel", "1.12.2")
|
|
4980
|
+
),
|
|
4981
|
+
tag(
|
|
4982
|
+
"harbor-kernel",
|
|
4983
|
+
"1.12.1",
|
|
4984
|
+
notes(
|
|
4985
|
+
"harbor-kernel",
|
|
4986
|
+
"1.12.1",
|
|
4987
|
+
"### Bug Fixes\n\n* **tty:** resizing a terminal mid-line keeps the cursor on its column"
|
|
4988
|
+
)
|
|
4989
|
+
),
|
|
4990
|
+
tag("harbor-kernel", "1.12.0")
|
|
4991
|
+
],
|
|
4992
|
+
agent: [
|
|
4993
|
+
tag(
|
|
4994
|
+
"harbor-agent",
|
|
4995
|
+
"0.25.0",
|
|
4996
|
+
notes(
|
|
4997
|
+
"harbor-agent",
|
|
4998
|
+
"0.25.0",
|
|
4999
|
+
"### Features\n\n* **tools:** the agent can read a tide table from a CSV file\n\n### Bug Fixes\n\n* **chat:** a long answer keeps its code blocks intact when it is cut"
|
|
5000
|
+
)
|
|
5001
|
+
),
|
|
5002
|
+
tag("harbor-agent", "0.24.0")
|
|
5003
|
+
],
|
|
5004
|
+
grammars: [tag("harbor-grammars", "4.5.0")]
|
|
5005
|
+
};
|
|
4947
5006
|
function updateFixtures(scenario) {
|
|
4948
5007
|
const components = [
|
|
4949
5008
|
["bios", "BIOS packages", "0.8.2"],
|
|
@@ -4963,7 +5022,8 @@ function updateFixtures(scenario) {
|
|
|
4963
5022
|
to: version,
|
|
4964
5023
|
checkedAt,
|
|
4965
5024
|
error: null,
|
|
4966
|
-
actions: []
|
|
5025
|
+
actions: [],
|
|
5026
|
+
...releaseFixtures[kind] ? { releases: releaseFixtures[kind] } : {}
|
|
4967
5027
|
}));
|
|
4968
5028
|
const agent = items[2];
|
|
4969
5029
|
if (scenario === "boot") {
|
|
@@ -5118,7 +5178,28 @@ function packageFixtures(scenario) {
|
|
|
5118
5178
|
notes: ["1 untested dependency: @harbor/wasi-sockets@0.4.2-1"],
|
|
5119
5179
|
actions: ["remove"]
|
|
5120
5180
|
});
|
|
5121
|
-
patch("
|
|
5181
|
+
patch("python", {
|
|
5182
|
+
releases: [
|
|
5183
|
+
{ version: "3.13.1", url: "https://github.com/harbor-demo/python-wasm/releases/tag/v3.13.1" }
|
|
5184
|
+
]
|
|
5185
|
+
});
|
|
5186
|
+
patch("uv", {
|
|
5187
|
+
state: "outdated",
|
|
5188
|
+
version: "0.8.1",
|
|
5189
|
+
actions: ["update", "remove"],
|
|
5190
|
+
releases: [
|
|
5191
|
+
{
|
|
5192
|
+
version: "0.9.2",
|
|
5193
|
+
url: "https://github.com/harbor-demo/uv-wasm/releases/tag/v0.9.2",
|
|
5194
|
+
notes: "## 0.9.2\n\n### Bug Fixes\n\n* `uv run` finds the project in a parent folder again"
|
|
5195
|
+
},
|
|
5196
|
+
{
|
|
5197
|
+
version: "0.9.0",
|
|
5198
|
+
url: "https://github.com/harbor-demo/uv-wasm/releases/tag/v0.9.0",
|
|
5199
|
+
notes: "## 0.9.0\n\n### Features\n\n* `uv add` keeps the comments in `pyproject.toml`"
|
|
5200
|
+
}
|
|
5201
|
+
]
|
|
5202
|
+
});
|
|
5122
5203
|
patch("esbuild", {
|
|
5123
5204
|
state: "installing",
|
|
5124
5205
|
actions: [],
|