aegis-desktop 1.0.0 → 1.0.2

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.
Files changed (96) hide show
  1. package/bin/aegis.js +5 -0
  2. package/lib/auto.js +5 -0
  3. package/lib/avatar/companion.js +5 -0
  4. package/lib/avatar/cosmetics.js +5 -0
  5. package/lib/avatar/events.js +5 -0
  6. package/lib/avatar/holder-turn.js +5 -0
  7. package/lib/avatar/holders.js +5 -0
  8. package/lib/avatar/identity.js +5 -0
  9. package/lib/avatar/level.js +5 -0
  10. package/lib/avatar/mirror.js +5 -0
  11. package/lib/avatar/persona.js +5 -0
  12. package/lib/avatar/profile.js +5 -0
  13. package/lib/avatar/register.js +5 -0
  14. package/lib/avatar/store.js +5 -0
  15. package/lib/avatar/tiers.js +5 -0
  16. package/lib/avatar/transfer.js +5 -0
  17. package/lib/avatar/turn.js +5 -0
  18. package/lib/avatar/voice.js +5 -0
  19. package/lib/avatar/xp.js +5 -0
  20. package/lib/deep-link.js +5 -0
  21. package/lib/fingerprint.js +5 -0
  22. package/lib/local/aegis-seal.mjs +5 -0
  23. package/lib/local/agents.js +5 -0
  24. package/lib/local/autonomous.js +5 -0
  25. package/lib/local/context.js +5 -0
  26. package/lib/local/covenant.js +5 -0
  27. package/lib/local/engine.js +129 -0
  28. package/lib/local/entitlement.js +5 -0
  29. package/lib/local/git-scope.js +5 -0
  30. package/lib/local/local.js +5 -0
  31. package/lib/local/prompt.js +5 -0
  32. package/lib/local/queue.js +5 -0
  33. package/lib/local/session-rounds.js +5 -0
  34. package/lib/local/shell.js +88 -9
  35. package/lib/local/telemetry.js +5 -0
  36. package/lib/local/tools.js +13 -6
  37. package/lib/local/turn-guard.js +5 -0
  38. package/lib/local/worktree-lock.js +5 -0
  39. package/lib/provider-key-mirror.js +5 -0
  40. package/lib/quick-launcher.js +5 -0
  41. package/lib/settings.js +5 -0
  42. package/lib/sync/memory-queue.js +5 -0
  43. package/lib/sync/persist-gate.js +5 -0
  44. package/lib/sync/sessions.js +5 -0
  45. package/lib/window-state.js +5 -0
  46. package/main.js +34 -0
  47. package/package.json +1 -1
  48. package/preload.js +14 -0
  49. package/renderer/app.js +111 -0
  50. package/renderer/avatar/assemble.js +5 -0
  51. package/renderer/avatar/avatar.css +7 -0
  52. package/renderer/avatar/avatar.js +5 -0
  53. package/renderer/avatar/cards.js +5 -0
  54. package/renderer/avatar/hud.js +5 -0
  55. package/renderer/avatar/machine.js +5 -0
  56. package/renderer/avatar/pane.js +5 -0
  57. package/renderer/avatar/parts.js +5 -0
  58. package/renderer/budget.js +5 -0
  59. package/renderer/diff.js +5 -0
  60. package/renderer/diffview.js +5 -0
  61. package/renderer/fingerprint.css +7 -0
  62. package/renderer/fingerprint.js +5 -0
  63. package/renderer/fonts/fonts.css +7 -0
  64. package/renderer/index.html +7 -0
  65. package/renderer/markdown.js +5 -0
  66. package/renderer/quick.css +7 -0
  67. package/renderer/quick.html +7 -0
  68. package/renderer/quick.js +5 -0
  69. package/renderer/stream-policy.js +5 -0
  70. package/renderer/style.css +7 -0
  71. package/renderer/transcript-view.js +5 -0
  72. package/renderer/usage.js +5 -0
  73. package/vendor/aegis.js +5 -0
  74. package/vendor/agent-gate.mjs +23 -0
  75. package/vendor/attest.js +5 -0
  76. package/vendor/authorship-key.js +5 -0
  77. package/vendor/auto-provision.js +5 -0
  78. package/vendor/brain-catalog.js +5 -0
  79. package/vendor/byok-catalog.js +5 -0
  80. package/vendor/credentials.js +5 -0
  81. package/vendor/device-fingerprint.js +5 -0
  82. package/vendor/env-file.js +5 -0
  83. package/vendor/fingerprint.js +5 -0
  84. package/vendor/foreign-memory.js +5 -0
  85. package/vendor/hooks.js +5 -0
  86. package/vendor/model-discovery.js +332 -0
  87. package/vendor/platform.js +5 -0
  88. package/vendor/prefs.js +5 -0
  89. package/vendor/presence-constants.js +5 -0
  90. package/vendor/presence.js +5 -0
  91. package/vendor/record-vault.js +5 -0
  92. package/vendor/session-store.js +5 -0
  93. package/vendor/topup.js +5 -0
  94. package/vendor/touch.js +5 -0
  95. package/vendor/update.js +5 -0
  96. package/vendor/user-models.js +5 -0
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -816,12 +821,14 @@ function execOneShot({ command, cwd, timeout, maxBuffer } = {}) {
816
821
  return new Promise((resolve) => {
817
822
  const limit = Math.min(Number(maxBuffer) || EXEC_MAX_BUFFER, EXEC_MAX_BUFFER);
818
823
  const ms = Math.min(Number(timeout) || EXEC_TIMEOUT_DEFAULT, EXEC_TIMEOUT_CAP);
819
- // Shell to run `exec` in: cmd.exe on Windows, a PROBED POSIX sh/bash
820
- // elsewhere. The choice, the platform seam that makes its win32 half
821
- // testable on Linux and the fish/csh/nu refusal all live in
822
- // client/platform.js + shell.js (Phase 30.1/30.3) — there is no second copy
823
- // of that decision here, and an unverifiable shell is REPORTED rather than
824
- // used.
824
+ // Shell to run `exec` in: PowerShell on Windows (both the persistent
825
+ // session AND the one-shot path — they must agree, or a session that dies
826
+ // mid-turn silently switches the quoting contract; see shell.js
827
+ // resolveSessionShell), a PROBED POSIX sh/bash elsewhere. The choice, the
828
+ // platform seam that makes its win32 half testable on Linux and the
829
+ // fish/csh/nu refusal all live in client/platform.js + shell.js (Phase
830
+ // 30.1/30.3) — there is no second copy of that decision here, and an
831
+ // unverifiable shell is REPORTED rather than used.
825
832
  const spec = shells.oneShotShellSpec();
826
833
  if (!spec.ok) {
827
834
  resolve(fail(spec.error));
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
package/lib/settings.js CHANGED
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
package/main.js CHANGED
@@ -1,4 +1,9 @@
1
1
  #!/usr/bin/env node
2
+ // SPDX-License-Identifier: AGPL-3.0-or-later
3
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
4
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
5
+ // Conveying a modified copy, or running one as a network service, owes the
6
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
2
7
  /**
3
8
  * AEGIS Desktop — thin Electron main shell (host 2).
4
9
  *
@@ -1604,6 +1609,21 @@ function createModelDispatch(engine, { env = process.env, settings } = {}) {
1604
1609
  engine.addUserModel(payload && payload.provider, payload && payload.model),
1605
1610
  'userModels.remove': (payload) =>
1606
1611
  engine.removeUserModel(payload && payload.provider, payload && payload.model),
1612
+ // Ask the provider's OWN API which models its key reaches — the end of
1613
+ // "type the vendor's model id from memory". The key stays in the main
1614
+ // process: the renderer passes a provider id and gets back ids, never a
1615
+ // credential, which is the same posture as the provider CRUD above.
1616
+ //
1617
+ // `userModels.addAll` is the bulk write the list makes possible (`/model-add
1618
+ // <provider> '*'` in the CLI): a batch where one refused row does not abort
1619
+ // the rest, and where the counts are returned so the row can say what
1620
+ // actually happened.
1621
+ 'userModels.discover': (payload) => engine.discoverModels(payload && payload.provider),
1622
+ 'userModels.addAll': (payload) =>
1623
+ engine.addUserModels(payload && payload.provider, payload && payload.ids),
1624
+ 'userModels.canDiscover': (payload) =>
1625
+ Boolean(engine.canDiscoverModels(payload && payload.provider)),
1626
+ 'userModels.discoverable': () => engine.discoverableProviders(),
1607
1627
  // Persisting memory ("sync finished turns to cloud memory automatically").
1608
1628
  // Reserved namespace, so it is invisible to the provider CRUD above — but
1609
1629
  // unlike a provider it IS reachable deliberately, through these two. The
@@ -3821,6 +3841,20 @@ function bootstrap() {
3821
3841
  // again.
3822
3842
  const result = await autoProvision.autoProvisionApiKey(aegis, credentials);
3823
3843
  if (result.key) settings.setAegisKey(result.key);
3844
+ else {
3845
+ // Swallowing this was how a machine could sit keyless — and therefore
3846
+ // absent from the admin panel's user list AND its presence card —
3847
+ // with no trace anywhere: the app just opened in its normal
3848
+ // signed-out state, and the next launch retried with the same
3849
+ // invisible outcome. The server now logs every registration attempt;
3850
+ // this closes the other half so one launch is diagnosable. A 429 here
3851
+ // is not fatal (aegis1 creates the account and withholds the trial),
3852
+ // so it must read as "retry", not as a broken install.
3853
+ const reason =
3854
+ (result.error && (result.error.status || result.error.message || String(result.error))) ||
3855
+ 'no key returned';
3856
+ console.warn(`auto-provision: no account key from register-device (${reason})`);
3857
+ }
3824
3858
  }
3825
3859
  }
3826
3860
  // ── presence beacon ───────────────────────────────────────────────────
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "aegis-desktop",
3
3
  "productName": "AEGIS Desktop",
4
- "version": "1.0.0",
4
+ "version": "1.0.2",
5
5
  "description": "Thin Electron host for AEGIS — a local chat UI over the shared client/aegis.js transport. Ships transport + UI only; engine logic stays server-side.",
6
6
  "author": {
7
7
  "name": "AEGIS Code",
package/preload.js CHANGED
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -360,6 +365,15 @@ const models = {
360
365
  get: () => invokeModel('userModels.get'),
361
366
  add: (provider, model) => invokeModel('userModels.add', { provider, model }),
362
367
  remove: (provider, model) => invokeModel('userModels.remove', { provider, model }),
368
+ // Discovery: the renderer names a provider, the MAIN process resolves the
369
+ // key and asks the vendor's list API. No key crosses this bridge in either
370
+ // direction — `discover` returns ids (or an error string to print) and
371
+ // `addAll` returns counts, so a compromised renderer cannot read a
372
+ // credential out of the discovery path.
373
+ discover: (provider) => invokeModel('userModels.discover', { provider }),
374
+ addAll: (provider, ids) => invokeModel('userModels.addAll', { provider, ids }),
375
+ canDiscover: (provider) => invokeModel('userModels.canDiscover', { provider }),
376
+ discoverable: () => invokeModel('userModels.discoverable'),
363
377
  },
364
378
  cancel: (sessionId) => invokeModel('cancel', { sessionId }),
365
379
  // Tool-call approval gate: the renderer's approval card calls this to
package/renderer/app.js CHANGED
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -4372,7 +4377,113 @@ async function renderUserModelRows(byokProviderIds) {
4372
4377
  }
4373
4378
  });
4374
4379
  actions.appendChild(addBtn);
4380
+
4381
+ // ── ask the provider, instead of the user's memory ─────────────────────
4382
+ //
4383
+ // The row above is only usable if the user already knows the vendor's model
4384
+ // id — which is the release-lag problem handed to the user rather than
4385
+ // solved (client/byok-catalog.js exists precisely because someone had to copy
4386
+ // Anthropic's list by hand and re-verify it). This button asks the provider's
4387
+ // own API through the main process. The key never crosses the bridge: the
4388
+ // renderer sends a provider id and gets ids (or an error string) back.
4389
+ //
4390
+ // Everything here is best-effort and reported in the hint line: no key, an
4391
+ // unreachable vendor and a reply this client cannot parse all leave the
4392
+ // manual path above working, which is the path a bad day must not remove.
4393
+ const discoverBtn = document.createElement('button');
4394
+ discoverBtn.type = 'button';
4395
+ discoverBtn.className = 'ghost-btn';
4396
+ discoverBtn.id = 'user-model-discover';
4397
+ discoverBtn.textContent = 'List from provider';
4398
+ actions.appendChild(discoverBtn);
4399
+
4400
+ const discovered = document.createElement('div');
4401
+ discovered.className = 'setting-status';
4402
+ discovered.id = 'user-model-discovered';
4403
+ // `hidden`, not `style.display`: the element is hidden until a provider has
4404
+ // answered, and the attribute is the DOM's own way to say that — no layout
4405
+ // coupling, and the row builder stays testable without a CSS engine.
4406
+ discovered.hidden = true;
4407
+
4408
+ discoverBtn.addEventListener('click', async () => {
4409
+ const provider = providerInput.value.trim();
4410
+ if (!provider) {
4411
+ els.settingsHint.textContent = 'type a provider id first (the CLI\'s /byok lists them).';
4412
+ return;
4413
+ }
4414
+ if (typeof models.userModels.discover !== 'function') {
4415
+ els.settingsHint.textContent = 'this build cannot ask a provider — type the model id.';
4416
+ return;
4417
+ }
4418
+ els.settingsHint.textContent = `asking ${provider}…`;
4419
+ discovered.hidden = true;
4420
+ discovered.textContent = '';
4421
+ let res;
4422
+ try {
4423
+ res = await models.userModels.discover(provider);
4424
+ } catch (err) {
4425
+ els.settingsHint.textContent = `${err && err.message ? err.message : err}`;
4426
+ return;
4427
+ }
4428
+ if (!res || !res.ok) {
4429
+ // The error string is the discovery module's own sentence ("the vendor
4430
+ // refused the key (HTTP 401)"); printing it verbatim is the point, since
4431
+ // the fix differs per cause and guessing here would mislead.
4432
+ els.settingsHint.textContent = `${provider}: ${(res && res.error) || 'no answer'}`;
4433
+ return;
4434
+ }
4435
+ els.settingsHint.textContent =
4436
+ `${res.provider} serves ${res.count} chat model id(s) — pick one and Add model, or add them all.`;
4437
+ const select = document.createElement('select');
4438
+ select.className = 'setting-input';
4439
+ select.id = 'user-model-discovered-list';
4440
+ for (const id of res.ids) {
4441
+ const opt = document.createElement('option');
4442
+ opt.value = id;
4443
+ // Marking what is already offered saves the user diffing two lists by
4444
+ // eye; the CLI's /model-discover prints the same marks.
4445
+ opt.textContent = res.declared && res.declared.includes(id) ? `${id} — declared` : id;
4446
+ select.appendChild(opt);
4447
+ }
4448
+ select.addEventListener('change', () => { modelInput.value = select.value; });
4449
+ if (res.ids.length) {
4450
+ modelInput.value = res.ids[0];
4451
+ discovered.appendChild(select);
4452
+ const addAll = document.createElement('button');
4453
+ addAll.type = 'button';
4454
+ addAll.className = 'ghost-btn';
4455
+ addAll.id = 'user-model-add-all';
4456
+ addAll.textContent = `Add all ${res.count}`;
4457
+ addAll.addEventListener('click', async () => {
4458
+ els.settingsHint.textContent = `adding ${res.count}…`;
4459
+ try {
4460
+ const bulk = await models.userModels.addAll(res.provider, res.ids);
4461
+ els.settingsHint.textContent =
4462
+ `added ${bulk.added} of ${res.ids.length}` +
4463
+ (bulk.already && bulk.already.length ? ` (${bulk.already.length} were already declared)` : '') +
4464
+ (bulk.failed && bulk.failed.length ? ` — ${bulk.failed.length} refused` : '') + '.';
4465
+ await loadSettings();
4466
+ await loadModels(els.classSelect.value);
4467
+ } catch (err) {
4468
+ els.settingsHint.textContent = `${err && err.message ? err.message : err}`;
4469
+ }
4470
+ });
4471
+ discovered.appendChild(addAll);
4472
+ } else {
4473
+ discovered.textContent = 'the vendor answered with no chat models — type an id above.';
4474
+ }
4475
+ if (res.others && res.others.length) {
4476
+ const rest = document.createElement('div');
4477
+ // Named, never hidden: an id left out because it is an embedding model is
4478
+ // a fact the user is owed, and a silent filter is how a list looks short
4479
+ // for a reason nobody can see.
4480
+ rest.textContent = `${res.others.length} non-chat id(s) left out: ${res.others.slice(0, 6).join(', ')}`;
4481
+ discovered.appendChild(rest);
4482
+ }
4483
+ discovered.hidden = false;
4484
+ });
4375
4485
  addRow.appendChild(actions);
4486
+ addRow.appendChild(discovered);
4376
4487
 
4377
4488
  const hint = document.createElement('div');
4378
4489
  hint.className = 'setting-status';
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,10 @@
1
+ /*
2
+ * SPDX-License-Identifier: AGPL-3.0-or-later
3
+ * Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
4
+ * AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
5
+ * Conveying a modified copy, or running one as a network service, owes the
6
+ * corresponding source under this licence (§5/§13) — see LICENSING.md.
7
+ */
1
8
  /* avatar.css — the avatar's presentation layer.
2
9
  *
3
10
  * Motion is CSS only, and it is the ONE thing in this phase that can be turned
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
package/renderer/diff.js CHANGED
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,10 @@
1
+ /*
2
+ * SPDX-License-Identifier: AGPL-3.0-or-later
3
+ * Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
4
+ * AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
5
+ * Conveying a modified copy, or running one as a network service, owes the
6
+ * corresponding source under this licence (§5/§13) — see LICENSING.md.
7
+ */
1
8
  /* ---------------------------------------------------------- φ(α) panel
2
9
  The panel reuses the memory inspector's sheet (.memory-overlay /
3
10
  .memory-panel, style.css:483+) so the two overlays are the same object to the
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,10 @@
1
+ /*
2
+ * SPDX-License-Identifier: AGPL-3.0-or-later
3
+ * Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
4
+ * AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
5
+ * Conveying a modified copy, or running one as a network service, owes the
6
+ * corresponding source under this licence (§5/§13) — see LICENSING.md.
7
+ */
1
8
  /* Vendored webfonts — DO NOT EDIT BY HAND.
2
9
  *
3
10
  * Generated by desktop/scripts/bundle-fonts.mjs from the Google Fonts CSS for
@@ -1,4 +1,11 @@
1
1
  <!doctype html>
2
+ <!--
3
+ * SPDX-License-Identifier: AGPL-3.0-or-later
4
+ * Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
5
+ * AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
6
+ * Conveying a modified copy, or running one as a network service, owes the
7
+ * corresponding source under this licence (§5/§13) — see LICENSING.md.
8
+ -->
2
9
  <html lang="en">
3
10
  <head>
4
11
  <meta charset="utf-8" />
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,10 @@
1
+ /*
2
+ * SPDX-License-Identifier: AGPL-3.0-or-later
3
+ * Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
4
+ * AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
5
+ * Conveying a modified copy, or running one as a network service, owes the
6
+ * corresponding source under this licence (§5/§13) — see LICENSING.md.
7
+ */
1
8
  :root {
2
9
  --bg: #0d1117;
3
10
  --surface: #12161e;
@@ -1,4 +1,11 @@
1
1
  <!doctype html>
2
+ <!--
3
+ * SPDX-License-Identifier: AGPL-3.0-or-later
4
+ * Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
5
+ * AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
6
+ * Conveying a modified copy, or running one as a network service, owes the
7
+ * corresponding source under this licence (§5/§13) — see LICENSING.md.
8
+ -->
2
9
  <html lang="en">
3
10
  <head>
4
11
  <meta charset="utf-8" />
package/renderer/quick.js CHANGED
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
@@ -1,3 +1,10 @@
1
+ /*
2
+ * SPDX-License-Identifier: AGPL-3.0-or-later
3
+ * Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
4
+ * AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
5
+ * Conveying a modified copy, or running one as a network service, owes the
6
+ * corresponding source under this licence (§5/§13) — see LICENSING.md.
7
+ */
1
8
  :root {
2
9
  --bg: #0a0e14;
3
10
  --surface: #12161e;
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
package/renderer/usage.js CHANGED
@@ -1,3 +1,8 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
3
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
4
+ // Conveying a modified copy, or running one as a network service, owes the
5
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
1
6
  'use strict';
2
7
 
3
8
  /**
package/vendor/aegis.js CHANGED
@@ -1,4 +1,9 @@
1
1
  #!/usr/bin/env node
2
+ // SPDX-License-Identifier: AGPL-3.0-or-later
3
+ // Copyright (C) 2026 Niklas Borneklint — AEGIS Code (aegiscode) / Aegiscloud.
4
+ // AEGIS Code (aegiscode) — source: https://github.com/aegisinfo/aegiscode-plugin
5
+ // Conveying a modified copy, or running one as a network service, owes the
6
+ // corresponding source under this licence (§5/§13) — see LICENSING.md.
2
7
  /**
3
8
  * AEGIS thin client — zero-dependency transport to aegiscloud.org.
4
9
  *
@@ -306,6 +306,29 @@ const WRITEISH_BASH = [
306
306
  // `node --test` is deliberately NOT a hit.
307
307
  /\b(python[0-9.]*|perl)\s+-c\b/, /\b(python[0-9.]*|perl)\s+-e\b/,
308
308
  /\bnode\b[^|;]*\s(?:-e|--eval)\b/, /\b(sh|bash|zsh|dash)\s+-c\b/,
309
+
310
+ // Archive extraction overwrites arbitrary paths in bulk with none of the
311
+ // markers above: `tar -x`, `unzip`, `7z x/e` never mention `cp`/`mv`/a `>`.
312
+ // Found probing this list by hand on 2026-10-12 — none of these tripped it.
313
+ // Kept in step with aegiscodex-dev/src/repoguard.js, which carries the same list.
314
+ /\btar\b[^|;]*(?:-[A-Za-z]*x[A-Za-z]*\b|--extract\b)/,
315
+ /\bunzip\b/, /\b7z[ar]?\s+[xe]\b/,
316
+
317
+ // Download-straight-to-file: the write is the whole point, but the marker
318
+ // is a flag shared with nothing else (`-o`/`-O`/`--output`), not a bare tool
319
+ // name, so it is scoped to the specific tool that owns that flag.
320
+ /\bcurl\b[^|;]*\s-{1,2}(?:o|O|output|remote-name)\b/,
321
+ /\bwget\b[^|;]*\s-{1,2}(?:O|output-document)\b/,
322
+
323
+ // Bulk copy/sync — functionally `cp -r` under a different name.
324
+ /\brsync\b/,
325
+
326
+ // `-out`/`-o`/`--output` on the specific tools that use it to write a file,
327
+ // each scoped to its own tool name so an unrelated `-o` (e.g. `ls -o`) on
328
+ // some other command is not a false hit.
329
+ /\bopenssl\b[^|;]*\s-out\b/,
330
+ /\bgpg2?\b[^|;]*\s-{1,2}(?:o|output)\b/,
331
+ /\bbase64\b[^|;]*\s-{1,2}(?:o|output)\b/,
309
332
  ];
310
333
 
311
334
  /** Path-shaped tokens in a command line. Deliberately over-eager: see bashTargets. */