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.
- package/bin/aegis.js +5 -0
- package/lib/auto.js +5 -0
- package/lib/avatar/companion.js +5 -0
- package/lib/avatar/cosmetics.js +5 -0
- package/lib/avatar/events.js +5 -0
- package/lib/avatar/holder-turn.js +5 -0
- package/lib/avatar/holders.js +5 -0
- package/lib/avatar/identity.js +5 -0
- package/lib/avatar/level.js +5 -0
- package/lib/avatar/mirror.js +5 -0
- package/lib/avatar/persona.js +5 -0
- package/lib/avatar/profile.js +5 -0
- package/lib/avatar/register.js +5 -0
- package/lib/avatar/store.js +5 -0
- package/lib/avatar/tiers.js +5 -0
- package/lib/avatar/transfer.js +5 -0
- package/lib/avatar/turn.js +5 -0
- package/lib/avatar/voice.js +5 -0
- package/lib/avatar/xp.js +5 -0
- package/lib/deep-link.js +5 -0
- package/lib/fingerprint.js +5 -0
- package/lib/local/aegis-seal.mjs +5 -0
- package/lib/local/agents.js +5 -0
- package/lib/local/autonomous.js +5 -0
- package/lib/local/context.js +5 -0
- package/lib/local/covenant.js +5 -0
- package/lib/local/engine.js +129 -0
- package/lib/local/entitlement.js +5 -0
- package/lib/local/git-scope.js +5 -0
- package/lib/local/local.js +5 -0
- package/lib/local/prompt.js +5 -0
- package/lib/local/queue.js +5 -0
- package/lib/local/session-rounds.js +5 -0
- package/lib/local/shell.js +88 -9
- package/lib/local/telemetry.js +5 -0
- package/lib/local/tools.js +13 -6
- package/lib/local/turn-guard.js +5 -0
- package/lib/local/worktree-lock.js +5 -0
- package/lib/provider-key-mirror.js +5 -0
- package/lib/quick-launcher.js +5 -0
- package/lib/settings.js +5 -0
- package/lib/sync/memory-queue.js +5 -0
- package/lib/sync/persist-gate.js +5 -0
- package/lib/sync/sessions.js +5 -0
- package/lib/window-state.js +5 -0
- package/main.js +34 -0
- package/package.json +1 -1
- package/preload.js +14 -0
- package/renderer/app.js +111 -0
- package/renderer/avatar/assemble.js +5 -0
- package/renderer/avatar/avatar.css +7 -0
- package/renderer/avatar/avatar.js +5 -0
- package/renderer/avatar/cards.js +5 -0
- package/renderer/avatar/hud.js +5 -0
- package/renderer/avatar/machine.js +5 -0
- package/renderer/avatar/pane.js +5 -0
- package/renderer/avatar/parts.js +5 -0
- package/renderer/budget.js +5 -0
- package/renderer/diff.js +5 -0
- package/renderer/diffview.js +5 -0
- package/renderer/fingerprint.css +7 -0
- package/renderer/fingerprint.js +5 -0
- package/renderer/fonts/fonts.css +7 -0
- package/renderer/index.html +7 -0
- package/renderer/markdown.js +5 -0
- package/renderer/quick.css +7 -0
- package/renderer/quick.html +7 -0
- package/renderer/quick.js +5 -0
- package/renderer/stream-policy.js +5 -0
- package/renderer/style.css +7 -0
- package/renderer/transcript-view.js +5 -0
- package/renderer/usage.js +5 -0
- package/vendor/aegis.js +5 -0
- package/vendor/agent-gate.mjs +23 -0
- package/vendor/attest.js +5 -0
- package/vendor/authorship-key.js +5 -0
- package/vendor/auto-provision.js +5 -0
- package/vendor/brain-catalog.js +5 -0
- package/vendor/byok-catalog.js +5 -0
- package/vendor/credentials.js +5 -0
- package/vendor/device-fingerprint.js +5 -0
- package/vendor/env-file.js +5 -0
- package/vendor/fingerprint.js +5 -0
- package/vendor/foreign-memory.js +5 -0
- package/vendor/hooks.js +5 -0
- package/vendor/model-discovery.js +332 -0
- package/vendor/platform.js +5 -0
- package/vendor/prefs.js +5 -0
- package/vendor/presence-constants.js +5 -0
- package/vendor/presence.js +5 -0
- package/vendor/record-vault.js +5 -0
- package/vendor/session-store.js +5 -0
- package/vendor/topup.js +5 -0
- package/vendor/touch.js +5 -0
- package/vendor/update.js +5 -0
- package/vendor/user-models.js +5 -0
package/lib/local/telemetry.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/lib/local/tools.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
|
/**
|
|
@@ -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:
|
|
820
|
-
//
|
|
821
|
-
//
|
|
822
|
-
//
|
|
823
|
-
//
|
|
824
|
-
//
|
|
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));
|
package/lib/local/turn-guard.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
|
/**
|
package/lib/quick-launcher.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/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
|
/**
|
package/lib/sync/memory-queue.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/lib/sync/persist-gate.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/lib/sync/sessions.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/lib/window-state.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/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.
|
|
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
|
/**
|
package/renderer/avatar/cards.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/renderer/avatar/hud.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
|
/**
|
package/renderer/avatar/pane.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/renderer/avatar/parts.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/renderer/budget.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/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
|
/**
|
package/renderer/diffview.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/renderer/fingerprint.css
CHANGED
|
@@ -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
|
package/renderer/fingerprint.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/renderer/fonts/fonts.css
CHANGED
|
@@ -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
|
package/renderer/index.html
CHANGED
|
@@ -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/markdown.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/renderer/quick.css
CHANGED
|
@@ -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;
|
package/renderer/quick.html
CHANGED
|
@@ -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
|
/**
|
package/renderer/style.css
CHANGED
|
@@ -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
|
*
|
package/vendor/agent-gate.mjs
CHANGED
|
@@ -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. */
|