Commit Graph
30 Commits
Author SHA1 Message Date
imccyu c1d9f141b9 feat(client): resolve package assets through require.asset so the WebWorker preview can map them 2026-10-20 02:14:33 +08:00
imccyu a7a40f93d9 fix(client-modules): compare host releases before parsing the graph 2026-10-15 01:35:28 +08:00
imccyu 7c9e54b3ef feat(client-modules): prompt to reload when the host release changes 2026-10-14 19:11:22 +08:00
Turtle 015349e4ad fix(client-modules): remove untagged styles of a failed factory 2026-09-30 15:14:59 +08:00
Turtle aa5334f1e0 fix(client-modules): claim only styles a factory injects
Materialization tagged every untagged <style> in the document for the
materializing plugin, so styles inserted later by other owners (Cordis
dynamic plugins, runtime-injecting libraries) were removed when an
unrelated plugin was toggled.
2026-09-30 15:01:51 +08:00
winewill c22b226b18 fix: address review threads on the fatal-diagnostics PR
- Agent Notes: cross-link the new decision with the native fatal recovery
  and fail-loud release notes both ways, rewrite the older note's
  console-retention and dialog-detail facts in place, and state the report's
  actual bounds.
- crash-report: cut the rendered error section at 256 KiB and prune only
  files matching the generated crash-<time>-<source>.log syntax.
- main: backendReady follows the backend state except during shutdown, so a
  failure while tearing down a ready backend still reads as running.
- subprocess-local: the temporary-file-cleaner hint is appended only for
  ENOENT; other codes rely on the appended error.
- client-modules: describeError is module-private; BootModuleRow.url's
  JSDoc names its fallback role.
2026-09-22 18:20:12 +08:00
winewill cafb9b93b4 fix: address adversarial review of the fatal-diagnostics branch
client-modules: a batch that already executed is never requested again,
even when its first importer was a row it did register — every executed
batch URL is remembered and a still-missing row goes straight to its
one-resource URL. The in-process module system test in test-support is
updated to the aggregated arrival message. describeError replaces three
inline non-Error ternaries and is covered.

subprocess-local: the spill path is published only after the exclusive
open succeeds, so a failed open (EEXIST on a planted entry included) can no
longer unlink a path this process did not create; a reporter that throws is
contained and written to stderr; logSpillFailure builds the owner reporter
for both the runtime and the SSH helper so the logging path is exercised
once instead of duplicated. Tests cover the runtime logger, the bare-caller
stderr default, EEXIST, and a throwing reporter.

desktop: a fatal failure during shutdown still writes its report; the
report phase follows the backend state so a failure during a restart is
'startup' again; writeReport is a required recovery operation and the
dialog tests await the write; the shell pid is labelled; the withheld
response-header list states why set-cookie is dropped.

app-boot, READMEs, Agent Note: "never resumes" is restated as control never
returning to the failed operation while the loop runs until release
settles; inspect output is bounded; incident inferences (who removed the
spill directory, which batch failure occurred) are written as inferences.
2026-09-22 14:41:10 +08:00
winewill afde35880f feat(client-modules): recover from a failed batch script and record import errors
One application batch is a single classic script that registers every
package in sequence, requested exactly once during boot. A transient
failure of that one <script> request failed every row in the batch and,
through arriveGraphRow's dependency wait, every row that injects or
requests them; the boot audit then listed each as "import failed (see
console for the import error)" with the real error only in the renderer
console.

Arrival now distinguishes the two failure kinds. A transport failure
(script error event, nothing executed) is retried once on the same URL and
the retry is shared by every row waiting on that batch. A script that
loaded without registering a row is never re-executed, because register()
rejects duplicates and a replay would stop at the first package the
original run did register. Either way each still-missing row then loads its
own one-resource combo URL, which the Host serves for every package. A batch
URL that failed is remembered so later rows skip straight to their
fallback; a one-resource URL is not, so it stays retryable on the next
import as before. Dependency failures are wrapped with the consumer and
dependency names so a cascade reads as a chain.

The module system records the last import() or prefetch() failure per
graph row at the outer operation, so factory execution errors are captured
as well as arrival errors, and clears it on success or invalidation.
assertEntriesActive takes the module system and reports that text per
fiberless entry.
2026-09-22 13:00:13 +08:00
Yichen Yan eeb9b03465 feat(web): serve the shell, API and plugin resources from the document directory 2026-09-17 16:00:15 +08:00
imccyu 7fb4cb4c8e fix(client): version lazy chunks by build generation 2026-09-15 20:45:49 +08:00
imccyu 45c74c5483 fix(client): satisfy chunk loader test lint 2026-09-15 20:45:49 +08:00
imccyu b98d5c8003 test(client): cover lazy chunk loader branches 2026-09-15 20:45:49 +08:00
imccyu b1471fd73c perf(client): load split bundles on demand 2026-09-15 20:45:49 +08:00
imccyu 7f5385bf01 revert(client): remove eager chunk scanning 2026-09-15 20:45:49 +08:00
imccyu d28807e05c fix(client): preserve lazy chunk runtime semantics 2026-09-15 20:45:49 +08:00
imccyu a5c224f9b1 feat(client): lazy-load PDF and terminal runtimes 2026-09-15 20:45:49 +08:00
Yichen Jiang fb0fb48033 feat(web): apply client plugin changes without reloading 2026-09-14 21:47:38 +08:00
imccyu c1504a2aa6 fix(client-modules): resolve the owning Loader instance 2026-09-13 21:27:54 +08:00
imccyu a475a65bed fix(client-test-runtime): isolate client instances 2026-09-13 21:27:53 +08:00
imccyu 83463aa896 feat(client): use bounded plugin combo URLs 2026-08-25 06:43:24 +08:00
lsdsjy 445de0ab3e fix(client-modules): tolerate incomplete source maps 2026-08-24 20:48:13 +08:00
lsdsjy 5bbaf168d9 perf(client-modules): batch startup plugin scripts 2026-08-24 20:48:12 +08:00
imccyu 5549b9add5 fix(client): preload injected module factories 2026-08-24 10:37:06 +08:00
Turtle 6b3e971805 docs: remove implementation narration from prose 2026-08-21 22:22:23 +08:00
imccyu d9ea5da2ff fix(ci): satisfy client script quality gates 2026-08-18 02:07:09 +08:00
imccyu c60f132b9c refactor(client): close module loader bootstrap loop 2026-08-18 01:34:55 +08:00
imccyu 8088d2a6a0 fix(client): harden bootstrap invariants 2026-08-18 01:34:55 +08:00
imccyu 4ad6e28663 fix(client): consume bootstrap handoff queue 2026-08-18 01:34:54 +08:00
imccyu cf603b847f fix(client): complete dynamic module bootstrap 2026-08-18 01:34:53 +08:00
imccyu 7ad54e7791 refactor(client): name the compile face in every client test filename
A test file under packages/client now says which face it covers:
`*.client.spec.{ts,tsx}` and its `*.client.{ts,tsx}` helpers belong to the
Client aggregate, `*.host.spec.ts` to the host aggregate. The carrier's four
node-half specs take the Host suffix.

The two suffixes are mutually exclusive, so each aggregate excludes the
other's and both keep one broad test glob: `exclude` wins over `include`, and
`packages/client/**` no longer has to be excluded wholesale from the host
program with per-file `files` entries carved back out of it. A Host-face spec
that reaches only Host source therefore needs no cross-face project
reference, which the split-project rule rejects.

vitest still discovers every file through `**/*.spec.{ts,tsx}`.
2026-08-12 01:41:40 +08:00