@songsid/agend 2.3.0-beta.4 → 2.3.0-beta.6

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 (68) hide show
  1. package/dist/agent-file-read.d.ts +4 -1
  2. package/dist/agent-file-read.js +129 -16
  3. package/dist/agent-file-read.js.map +1 -1
  4. package/dist/authority/web-authority.d.ts +100 -0
  5. package/dist/authority/web-authority.js +130 -0
  6. package/dist/authority/web-authority.js.map +1 -0
  7. package/dist/channel/mcp-tools.js +1 -1
  8. package/dist/channel/mcp-tools.js.map +1 -1
  9. package/dist/config-validator.js +19 -1
  10. package/dist/config-validator.js.map +1 -1
  11. package/dist/daemon.js +5 -5
  12. package/dist/daemon.js.map +1 -1
  13. package/dist/delivery-outbox.d.ts +2 -0
  14. package/dist/delivery-outbox.js.map +1 -1
  15. package/dist/fleet-manager.d.ts +56 -0
  16. package/dist/fleet-manager.js +86 -10
  17. package/dist/fleet-manager.js.map +1 -1
  18. package/dist/general-knowledge/skills/web-appearance/SKILL.md +28 -11
  19. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +7 -3
  20. package/dist/human-delivery-receipts.d.ts +10 -1
  21. package/dist/human-delivery-receipts.js +24 -8
  22. package/dist/human-delivery-receipts.js.map +1 -1
  23. package/dist/outbound-schemas.d.ts +3 -3
  24. package/dist/reply-buttons-controller.d.ts +2 -0
  25. package/dist/reply-buttons-controller.js +2 -2
  26. package/dist/reply-buttons-controller.js.map +1 -1
  27. package/dist/settings-api.d.ts +9 -0
  28. package/dist/settings-api.js +76 -2
  29. package/dist/settings-api.js.map +1 -1
  30. package/dist/settings-change.js +66 -0
  31. package/dist/settings-change.js.map +1 -1
  32. package/dist/settings-effect.js +8 -1
  33. package/dist/settings-effect.js.map +1 -1
  34. package/dist/types.d.ts +12 -0
  35. package/dist/ui/chat-strings.js +4 -2
  36. package/dist/ui/panel-chat.js +15 -6
  37. package/dist/ui/panel-fleet.js +4 -1
  38. package/dist/ui/panel-settings.js +2 -0
  39. package/dist/ui/settings-catalog.js +4 -1
  40. package/dist/ui/settings-guests.js +117 -0
  41. package/dist/ui/settings-strings.js +22 -0
  42. package/dist/ui/shared/app-i18n.js +2 -0
  43. package/dist/ui/shared/app-prefs.js +3 -3
  44. package/dist/ui/shared/app-shell.js +36 -6
  45. package/dist/ui/shared/app-store.js +14 -0
  46. package/dist/ui/shared/app.css +32 -8
  47. package/dist/ui/shared/app.js +21 -14
  48. package/dist/ui/shared/instance-nav.js +8 -5
  49. package/dist/web-api.d.ts +16 -1
  50. package/dist/web-api.js +37 -10
  51. package/dist/web-api.js.map +1 -1
  52. package/dist/web-effect-upload.js +1 -1
  53. package/dist/web-effect-upload.js.map +1 -1
  54. package/dist/web-identity-color.d.ts +1 -1
  55. package/dist/web-identity-color.js +2 -2
  56. package/dist/web-identity-color.js.map +1 -1
  57. package/dist/web-prefs.js +1 -1
  58. package/dist/web-prefs.js.map +1 -1
  59. package/dist/web-returning-device.d.ts +2 -0
  60. package/dist/web-returning-device.js +11 -0
  61. package/dist/web-returning-device.js.map +1 -1
  62. package/dist/web-session.d.ts +7 -0
  63. package/dist/web-session.js +17 -0
  64. package/dist/web-session.js.map +1 -1
  65. package/dist/web-settings-patch.d.ts +25 -2
  66. package/dist/web-settings-patch.js +96 -1
  67. package/dist/web-settings-patch.js.map +1 -1
  68. package/package.json +1 -1
@@ -9,10 +9,13 @@ export interface AgentFileContext {
9
9
  workspace: string | undefined;
10
10
  stateDir: string;
11
11
  instance?: string;
12
+ /** Daemon launch config, never a tool argument. CLI resolves its record from fleet.yaml. */
13
+ configuredWorkspace?: string;
12
14
  }
13
- /** Shared by file reads, effect-directory admission and generated-file writes. No inferred cwd ownership. */
15
+ /** Shared by reads, effect-directory admission and generated writes. No ownership inferred from the shell cwd. */
14
16
  export declare function agentFileScope(opts: AgentFileContext): Promise<{
15
17
  workspace: string;
18
+ managedState: boolean;
16
19
  stateBlocked(path: string): boolean;
17
20
  }>;
18
21
  export declare function readAgentFile(file: unknown, opts: AgentFileContext & {
@@ -2,7 +2,7 @@
2
2
  * #1629: reading a file an agent names for an upload (set_web_theme_asset, and later effects, widgets and mods), on the
3
3
  * agent's side — the daemon — so the fleet never opens a workspace path (first design §4: tool handlers neither fork
4
4
  * nor read outside their own state). The file must be in the agent's own working directory, not a symlink, a regular
5
- * file within the size limit, and outside AgEnD state except for this caller's own workspace; what is read is that
5
+ * file within the size limit, and outside AgEnD state except for this caller's admitted managed asset area; what is read is that
6
6
  * open file. The caller identity comes from the daemon/CLI context, never a tool argument.
7
7
  *
8
8
  * The open never waits (#1887 review): O_NONBLOCK, so a regular file replaced by a FIFO between the lstat and the
@@ -10,10 +10,27 @@
10
10
  * a writer. O_NOCTTY, so a terminal device swapped in is never made the controlling terminal.
11
11
  */
12
12
  import { constants as fsConstants } from "node:fs";
13
- import { lstat, open, realpath, stat } from "node:fs/promises";
14
- import { isAbsolute, resolve, sep } from "node:path";
13
+ import { lstat, open, readFile, realpath, stat } from "node:fs/promises";
14
+ import { isAbsolute, relative, resolve, sep } from "node:path";
15
+ import { homedir } from "node:os";
15
16
  const under = (path, root) => path === root || path.startsWith(root.endsWith(sep) ? root : root + sep);
16
- /** Shared by file reads, effect-directory admission and generated-file writes. No inferred cwd ownership. */
17
+ const plainCaller = (name) => typeof name === "string" && name.length > 0 && name !== "." && name !== ".." && !/[/\\\u0000-\u001f\u007f]/.test(name);
18
+ // These names are private even inside an admitted staging directory. A staging area is not a credential store.
19
+ const sensitiveNames = [
20
+ "instances", "credential-profiles", "inbox", "chat-logs", "web-files", "web-chat.json", "cx", "kiro-v3", "cli-env", "access",
21
+ "web.token", "view.token", "web-sessions", "sessions", "session-env", "projects", "file-history", "shell-snapshots", "backups", "todos", "statsig", "ide",
22
+ "claude.md", "agents.md", "mcp-config.json", "claude-settings.json", "credentials.json", "opencode.json", "opencode.jsonc",
23
+ "config.toml", "settings.json", "settings.local.json", "auth.json", "history.jsonl", "agent.token", "session-id", "session-id.backend",
24
+ "fleet.yaml", "classicbot.yaml", "web-sessions.json", "web-devices.json", "web-prefs.json", "web-effects.json", "web-mods.json",
25
+ "web-themes.json", "web-effect-profiles.json", "kiro-engine-ledger.json", "cache-codex-rollouts.json", "settings-apply-jobs.json",
26
+ "cancel-buttons.json", "forged-envelope-reports.json", "upgrade-notices.json", "fleet.lock", "fleet.pid", "fleet.log", "daemon.log",
27
+ "restart-audit.log", "tunnel.lease", "service-plan.json", "update-in-progress.json", "self-restart.json", "setup-complete.json",
28
+ ];
29
+ const sensitivePart = (part) => (part.startsWith(".") && part !== ".agend") || sensitiveNames.some(name => part.toLowerCase() === name || part.toLowerCase().startsWith(name + ".") || part.toLowerCase().startsWith(name + "-"))
30
+ || /\.(?:db|sqlite|sqlite3)(?:[.-]|$)/i.test(part) || /\.(?:token|pem|key)(?:[.-]|$)/i.test(part);
31
+ const reservedStateRoots = new Set(["workspaces", "kiro-identity", "operator", "model-catalog", "profiles", "preview-tunnel", "bin", "web-effects", "web-mods", "web-themes", "web-owner-css", "cards", "avatars", "cache", "web-files"]);
32
+ const staging = ["web-assets", "web-effects", ".agend/appearance", ".agend/mods"];
33
+ /** Shared by reads, effect-directory admission and generated writes. No ownership inferred from the shell cwd. */
17
34
  export async function agentFileScope(opts) {
18
35
  const workspace = await realpath(opts.workspace);
19
36
  const states = [resolve(opts.stateDir)];
@@ -23,19 +40,113 @@ export async function agentFileScope(opts) {
23
40
  states.push(state);
24
41
  }
25
42
  catch { /* absent state has no exception */ }
26
- let own;
27
- const caller = opts.instance;
28
- if (state && typeof caller === "string" && caller.length > 0 && caller !== "." && caller !== ".." && !/[/\\\u0000-\u001f\u007f]/.test(caller)) {
29
- const expected = resolve(state, "workspaces", caller);
43
+ const managedState = states.some(root => under(workspace, root) || under(resolve(opts.workspace), root));
44
+ let own, classic = false;
45
+ if (state && managedState && plainCaller(opts.instance)) {
46
+ // Unlike loadFleetConfig this reads no defaults that create directories or initialize repositories.
47
+ // A malformed/unreadable roster cannot prove exclusive ownership and refuses all in-state reads.
48
+ let fleet, rosterRead = false;
30
49
  try {
31
- const actual = await realpath(expected);
32
- // A symlink named after this caller cannot turn another workspace or protected state into its own.
33
- if (actual === expected)
34
- own = actual;
50
+ const text = await readFile(resolve(state, "fleet.yaml"), "utf8");
51
+ const { default: yaml } = await import("js-yaml");
52
+ rosterRead = true;
53
+ fleet = yaml.load(text);
54
+ }
55
+ catch (err) {
56
+ if (err.code !== "ENOENT")
57
+ throw err;
58
+ }
59
+ if (rosterRead && (!fleet || typeof fleet !== "object" || Array.isArray(fleet)))
60
+ throw new Error("invalid fleet configuration");
61
+ const rows = fleet && typeof fleet === "object" && !Array.isArray(fleet)
62
+ ? fleet.instances : undefined;
63
+ if (rows !== undefined && (!rows || typeof rows !== "object" || Array.isArray(rows)))
64
+ throw new Error("invalid instance roster");
65
+ const roster = (rows ?? {});
66
+ const defaults = fleet?.defaults ?? {};
67
+ if (typeof defaults !== "object" || Array.isArray(defaults))
68
+ throw new Error("invalid fleet defaults");
69
+ const configured = (name, row) => {
70
+ if (!row || typeof row !== "object" || Array.isArray(row))
71
+ throw new Error("invalid instance record");
72
+ // The loader merges defaults first, skips undefined overrides, then falls back on a falsy cwd.
73
+ // Only records in fleet.instances inherit these defaults; dynamic Classic instances do not.
74
+ const raw = row.working_directory === undefined ? defaults.working_directory : row.working_directory;
75
+ if (raw && (typeof raw !== "string" || !raw.trim()))
76
+ throw new Error("unknown working directory");
77
+ const path = raw ? resolve(raw.replace(/^~(?=\/|$)/, homedir())) : resolve(state, "workspaces", name);
78
+ // Permit an alias of the state root, never an alias of an individual managed directory.
79
+ return under(path, states[0]) ? resolve(state, relative(states[0], path)) : path;
80
+ };
81
+ const hasRecord = Object.hasOwn(roster, opts.instance);
82
+ const row = roster[opts.instance];
83
+ const expected = hasRecord ? configured(opts.instance, row) : resolve(state, "workspaces", opts.instance);
84
+ const launchMatches = !opts.configuredWorkspace || configured(opts.instance, { working_directory: opts.configuredWorkspace }) === expected;
85
+ const standard = resolve(state, "workspaces", opts.instance);
86
+ const parts = relative(state, expected).split(sep);
87
+ const reserved = expected === state || !under(expected, state) || parts.some(part => part.startsWith(".") || sensitivePart(part))
88
+ || (reservedStateRoots.has(parts[0]) && !(parts[0] === "workspaces" && under(expected, standard)));
89
+ if (launchMatches && !reserved && under(workspace, expected)) {
90
+ let exclusive = true;
91
+ for (const [name, peer] of Object.entries(roster)) {
92
+ if (name === opts.instance)
93
+ continue;
94
+ if (!plainCaller(name))
95
+ throw new Error("invalid instance name");
96
+ const named = configured(name, peer);
97
+ let actual = named;
98
+ try {
99
+ actual = await realpath(named);
100
+ }
101
+ catch (err) {
102
+ if (err.code !== "ENOENT")
103
+ throw err;
104
+ }
105
+ if (under(actual, expected) || under(expected, actual))
106
+ exclusive = false;
107
+ }
108
+ try {
109
+ // A symlink named General (or one of its ancestors) cannot authorize another directory.
110
+ if (exclusive && await realpath(expected) === expected) {
111
+ own = expected;
112
+ classic = expected === standard;
113
+ }
114
+ }
115
+ catch { /* no readable, canonical managed directory: no exception */ }
35
116
  }
36
- catch { /* missing/unreadable caller workspace never widens state access */ }
37
117
  }
38
- return { workspace, stateBlocked: path => states.some(root => under(path, root)) && !(own && under(path, own)) };
118
+ const areas = [];
119
+ if (own && !classic)
120
+ for (const dir of staging) {
121
+ const expected = resolve(own, dir);
122
+ try {
123
+ if (await realpath(expected) === expected)
124
+ areas.push(expected);
125
+ }
126
+ catch (err) {
127
+ if (err.code === "ENOENT")
128
+ areas.push(expected);
129
+ else
130
+ throw err;
131
+ }
132
+ }
133
+ return { workspace, managedState, stateBlocked: path => {
134
+ if (managedState && !own)
135
+ return true;
136
+ if (state && under(path, states[0]))
137
+ path = resolve(state, relative(states[0], path));
138
+ if (!states.some(root => under(path, root)))
139
+ return false;
140
+ if (!own || !under(path, own))
141
+ return true;
142
+ const rel = relative(own, path), parts = rel.split(sep);
143
+ if (parts.some(sensitivePart))
144
+ return true;
145
+ // .agend is a private namespace; only the two existing generated-output directories are readable.
146
+ if (parts.includes(".agend") && !(parts[0] === ".agend" && ["appearance", "mods"].includes(parts[1] ?? "") && !parts.slice(1).includes(".agend")))
147
+ return true;
148
+ return !classic && !areas.some(area => under(path, area));
149
+ } };
39
150
  }
40
151
  export async function readAgentFile(file, opts) {
41
152
  if (typeof file !== "string" || !file.trim() || file.includes("\0"))
@@ -54,12 +165,14 @@ export async function readAgentFile(file, opts) {
54
165
  const scope = await agentFileScope(opts), ws = scope.workspace;
55
166
  if (!under(real, ws))
56
167
  return { ok: false, reason: "outside your working directory" };
57
- if (scope.stateBlocked(real))
168
+ if (scope.stateBlocked(real) || scope.stateBlocked(path))
58
169
  return { ok: false, reason: "inside the AgEnD state directory" };
59
170
  fh = await open(path, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW | fsConstants.O_NONBLOCK | fsConstants.O_NOCTTY);
60
171
  const st = await fh.stat();
61
172
  if (!st.isFile())
62
173
  return { ok: false, reason: "not a regular file" };
174
+ if (scope.managedState && st.nlink !== 1)
175
+ return { ok: false, reason: "a hard-linked state file" };
63
176
  if (st.size > opts.maxBytes)
64
177
  return { ok: false, reason: `over the size limit (${Math.floor(opts.maxBytes / 1024)} KiB)` };
65
178
  const named = await stat(real);
@@ -100,7 +213,7 @@ export async function writeAgentFile(dir, name, bytes, opts) {
100
213
  try {
101
214
  const scope = await agentFileScope(opts), ws = scope.workspace;
102
215
  // Refused before anything is created (#1890 review: a $HOME working directory got ~/.agend/appearance first).
103
- if (scope.stateBlocked(resolve(ws, dir)))
216
+ if (scope.stateBlocked(resolve(ws, dir)) || scope.stateBlocked(resolve(ws, dir, name)))
104
217
  return { ok: false, reason: "inside the AgEnD state directory" };
105
218
  let at = ws;
106
219
  for (const part of dir.split("/")) {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-file-read.js","sourceRoot":"","sources":["../src/agent-file-read.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-file-read.js","sourceRoot":"","sources":["../src/agent-file-read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * #1939 S1 (observe only): whether a web chat message, command or click carries `web-session` authority — the design's
3
+ * §3 checks, made per request — and the `authority` a human receipt records (§4). Nothing tells an agent to accept it
4
+ * yet: receipts record it and delivery_status returns it, and the instructions still say web grants nothing (S3 changes
5
+ * that). docs/design/1939-verified-web-sessions.md.
6
+ */
7
+ import type { SessionRecord } from "../web-session.js";
8
+ import type { WebConfig } from "../types.js";
9
+ /** Where one request came from (§3.4): `loopback` is this machine naming a loopback host; `lan` is only "not loopback". */
10
+ export type WebPeer = "loopback" | "lan";
11
+ /** The account behind a human receipt, written by AgEnD at admission — nothing in a message can set it (§4). */
12
+ export interface HumanAuthority {
13
+ kind: "platform" | "web-session" | "none";
14
+ /** The platform sender, or the web session's bound account. */
15
+ actor: {
16
+ adapter_id: string;
17
+ user_id: string;
18
+ } | null;
19
+ /** web-session only. `handle` is the opaque one the device list shows. */
20
+ session?: {
21
+ handle: string;
22
+ peer: WebPeer;
23
+ signed_in_at: string;
24
+ age_s: number;
25
+ };
26
+ /** The revocation epoch it was granted under (§10). S1 has no revocation yet: always 0. */
27
+ authority_epoch: number;
28
+ }
29
+ /** Why a web request carries no authority — the first §3 check it failed. */
30
+ export type WebAuthorityRefusal = "public_link" | "not_session" | "not_admin_session" | "token_rotated" | "no_account" | "not_admin" | "other_namespace" | "loopback_only" | "too_old" | "session_changed";
31
+ export interface WebAuthorityResult {
32
+ authority: HumanAuthority;
33
+ refusal: WebAuthorityRefusal | null;
34
+ }
35
+ /** §3.6: ordinary authority lasts at most this long after sign-in (web.verified_authority.max_session_hours). */
36
+ export declare const VERIFIED_SESSION_HOURS: {
37
+ readonly min: 1;
38
+ readonly max: 48;
39
+ readonly default: 48;
40
+ };
41
+ export interface WebAuthorityPolicy {
42
+ loopbackOnly: boolean;
43
+ maxSessionMs: number;
44
+ }
45
+ /** The policy in fleet.yaml; a value the validator refuses never loosens it (a bad number is the 48 h default, clamped). */
46
+ export declare function webAuthorityPolicy(web: WebConfig | undefined): WebAuthorityPolicy;
47
+ /**
48
+ * §3.4, from this request alone: `loopback` only when its TCP peer is a loopback address, its Host names a loopback host,
49
+ * and it carries no forwarding header. It does not prove who sits at the machine (a local proxy that strips forwarding
50
+ * headers looks the same — out of scope). The caller has already ruled out the public link, whose tunnel is local too.
51
+ */
52
+ export declare function classifyWebPeer(req: {
53
+ socket?: {
54
+ remoteAddress?: string | undefined;
55
+ } | null;
56
+ headers: NodeJS.Dict<string | string[]>;
57
+ }): WebPeer;
58
+ export interface WebAuthorityInput {
59
+ /** The cookie session this request authenticated with; null for a header token, a CLI call, or none. */
60
+ session: SessionRecord | null;
61
+ /** The request came over the public link. */
62
+ gateway: boolean;
63
+ peer: WebPeer;
64
+ /** sha256 of the current web token (web-session.ts tokenEpoch); null when there is none. */
65
+ tokenEpoch: string | null;
66
+ /** The adapter that owns the target instance. Absent on arrival, before the body names the instance. */
67
+ target?: {
68
+ adapterId: string | undefined;
69
+ };
70
+ /** adminGate(userId, adapterId) === "ok": in that adapter's access.allowed_users, now. */
71
+ isAdmin: (userId: string, adapterId: string) => boolean;
72
+ policy: WebAuthorityPolicy;
73
+ epoch: number;
74
+ now: number;
75
+ }
76
+ export declare const noAuthority: (epoch: number) => HumanAuthority;
77
+ /** §3: every check, in order, for one request. The first that fails is the refusal; all passing is `web-session`. */
78
+ export declare function evaluateWebAuthority(i: WebAuthorityInput): WebAuthorityResult;
79
+ /**
80
+ * §3: the request qualified when it arrived AND again now that its body is in, under the same session. A request that
81
+ * failed on arrival keeps that refusal; one whose session changed meanwhile carries nothing.
82
+ */
83
+ export declare function confirmAfterBody(arrival: WebAuthorityResult, now: WebAuthorityResult): WebAuthorityResult;
84
+ /** A Discord or Telegram message or click: its sender, from the platform's own event. */
85
+ export declare function platformAuthority(origin: {
86
+ platform: string;
87
+ adapter_id: string | null;
88
+ user_id: string | null;
89
+ }, epoch: number): HumanAuthority;
90
+ /** Exactly the shape this module writes; anything else is not authority. */
91
+ export declare function isHumanAuthority(v: unknown): v is HumanAuthority;
92
+ /**
93
+ * What a stored receipt says (§4). A row written before #1939 has none: from Discord or Telegram it is `platform`, from
94
+ * the web `none` — so nothing accepted before changes meaning. A stored value that is not authority is `none`.
95
+ */
96
+ export declare function receiptAuthority(origin: {
97
+ platform: string;
98
+ adapter_id: string | null;
99
+ user_id: string | null;
100
+ }, stored: string | null): HumanAuthority;
@@ -0,0 +1,130 @@
1
+ import { hostnameOf, LOOPBACK_HOST_NAMES } from "../web-host-guard.js";
2
+ /** §3.6: ordinary authority lasts at most this long after sign-in (web.verified_authority.max_session_hours). */
3
+ export const VERIFIED_SESSION_HOURS = { min: 1, max: 48, default: 48 };
4
+ /** The policy in fleet.yaml; a value the validator refuses never loosens it (a bad number is the 48 h default, clamped). */
5
+ export function webAuthorityPolicy(web) {
6
+ const v = web?.verified_authority;
7
+ const hours = typeof v?.max_session_hours === "number" && Number.isFinite(v.max_session_hours)
8
+ ? Math.min(VERIFIED_SESSION_HOURS.max, Math.max(VERIFIED_SESSION_HOURS.min, v.max_session_hours)) : VERIFIED_SESSION_HOURS.default;
9
+ return { loopbackOnly: v?.loopback_only === true, maxSessionMs: hours * 3_600_000 };
10
+ }
11
+ /** Headers a proxy adds; any one of them makes a request `lan`, whatever its peer address (§3.4). */
12
+ const FORWARDING_HEADERS = ["forwarded", "x-forwarded-for", "x-forwarded-host", "x-real-ip", "cf-connecting-ip", "via"];
13
+ function loopbackAddress(address) {
14
+ if (!address)
15
+ return false;
16
+ const v4 = address.startsWith("::ffff:") ? address.slice(7) : address;
17
+ return address === "::1" || /^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(v4);
18
+ }
19
+ /**
20
+ * §3.4, from this request alone: `loopback` only when its TCP peer is a loopback address, its Host names a loopback host,
21
+ * and it carries no forwarding header. It does not prove who sits at the machine (a local proxy that strips forwarding
22
+ * headers looks the same — out of scope). The caller has already ruled out the public link, whose tunnel is local too.
23
+ */
24
+ export function classifyWebPeer(req) {
25
+ if (!loopbackAddress(req.socket?.remoteAddress))
26
+ return "lan";
27
+ const host = req.headers.host;
28
+ const name = typeof host === "string" ? hostnameOf(host) : null;
29
+ if (!name || !LOOPBACK_HOST_NAMES.includes(name))
30
+ return "lan";
31
+ return FORWARDING_HEADERS.some(h => req.headers[h] !== undefined) ? "lan" : "loopback";
32
+ }
33
+ export const noAuthority = (epoch) => ({ kind: "none", actor: null, authority_epoch: epoch });
34
+ /** §3: every check, in order, for one request. The first that fails is the refusal; all passing is `web-session`. */
35
+ export function evaluateWebAuthority(i) {
36
+ const refuse = (refusal) => ({ authority: noAuthority(i.epoch), refusal });
37
+ const s = i.session;
38
+ if (i.gateway)
39
+ return refuse("public_link");
40
+ if (!s)
41
+ return refuse("not_session");
42
+ if (s.tier !== "admin")
43
+ return refuse("not_admin_session");
44
+ if (s.surface !== "local")
45
+ return refuse("public_link");
46
+ if (!i.tokenEpoch || s.tokenEpoch !== i.tokenEpoch)
47
+ return refuse("token_rotated");
48
+ const owner = s.owner;
49
+ if (!owner?.adapterId || !owner.userId)
50
+ return refuse("no_account");
51
+ if (!i.isAdmin(owner.userId, owner.adapterId))
52
+ return refuse("not_admin");
53
+ if (i.target && i.target.adapterId !== owner.adapterId)
54
+ return refuse("other_namespace");
55
+ if (i.policy.loopbackOnly && i.peer !== "loopback")
56
+ return refuse("loopback_only");
57
+ const age = i.now - s.created;
58
+ if (!(age <= i.policy.maxSessionMs))
59
+ return refuse("too_old");
60
+ return {
61
+ authority: {
62
+ kind: "web-session", actor: { adapter_id: owner.adapterId, user_id: owner.userId },
63
+ session: { handle: s.handle, peer: i.peer, signed_in_at: new Date(s.created).toISOString(), age_s: Math.max(0, Math.floor(age / 1000)) },
64
+ authority_epoch: i.epoch,
65
+ },
66
+ refusal: null,
67
+ };
68
+ }
69
+ /**
70
+ * §3: the request qualified when it arrived AND again now that its body is in, under the same session. A request that
71
+ * failed on arrival keeps that refusal; one whose session changed meanwhile carries nothing.
72
+ */
73
+ export function confirmAfterBody(arrival, now) {
74
+ if (arrival.refusal)
75
+ return { authority: noAuthority(now.authority.authority_epoch), refusal: arrival.refusal };
76
+ if (now.refusal)
77
+ return now;
78
+ if (now.authority.session?.handle !== arrival.authority.session?.handle)
79
+ return { authority: noAuthority(now.authority.authority_epoch), refusal: "session_changed" };
80
+ return now;
81
+ }
82
+ /** A Discord or Telegram message or click: its sender, from the platform's own event. */
83
+ export function platformAuthority(origin, epoch) {
84
+ return origin.platform !== "web" && origin.adapter_id && origin.user_id
85
+ ? { kind: "platform", actor: { adapter_id: origin.adapter_id, user_id: origin.user_id }, authority_epoch: epoch }
86
+ : noAuthority(epoch);
87
+ }
88
+ /** Exactly the shape this module writes; anything else is not authority. */
89
+ export function isHumanAuthority(v) {
90
+ if (!v || typeof v !== "object")
91
+ return false;
92
+ const a = v;
93
+ if (!Number.isSafeInteger(a.authority_epoch) || a.authority_epoch < 0)
94
+ return false;
95
+ const actor = a.actor;
96
+ const actorOk = actor !== null && typeof actor === "object" && typeof actor.adapter_id === "string" && !!actor.adapter_id
97
+ && typeof actor.user_id === "string" && !!actor.user_id;
98
+ if (a.kind === "none")
99
+ return a.actor === null && a.session === undefined;
100
+ if (a.kind === "platform")
101
+ return actorOk && a.session === undefined;
102
+ if (a.kind !== "web-session" || !actorOk)
103
+ return false;
104
+ const s = a.session;
105
+ return !!s && typeof s === "object" && typeof s.handle === "string" && !!s.handle && (s.peer === "loopback" || s.peer === "lan")
106
+ && typeof s.signed_in_at === "string" && Number.isSafeInteger(s.age_s) && s.age_s >= 0;
107
+ }
108
+ /**
109
+ * What a stored receipt says (§4). A row written before #1939 has none: from Discord or Telegram it is `platform`, from
110
+ * the web `none` — so nothing accepted before changes meaning. A stored value that is not authority is `none`.
111
+ */
112
+ export function receiptAuthority(origin, stored) {
113
+ if (stored === null)
114
+ return platformAuthority(origin, 0);
115
+ let parsed;
116
+ try {
117
+ parsed = JSON.parse(stored);
118
+ }
119
+ catch {
120
+ return noAuthority(0);
121
+ }
122
+ if (!isHumanAuthority(parsed))
123
+ return noAuthority(0);
124
+ // Web traffic is never platform authority, and platform traffic never web-session (§4).
125
+ const crossed = parsed.kind === "platform" ? origin.platform === "web" : parsed.kind === "web-session" && origin.platform !== "web";
126
+ if (crossed)
127
+ return noAuthority(parsed.authority_epoch);
128
+ return parsed;
129
+ }
130
+ //# sourceMappingURL=web-authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-authority.js","sourceRoot":"","sources":["../../src/authority/web-authority.ts"],"names":[],"mappings":"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"}
@@ -125,7 +125,7 @@ const DEFS = [
125
125
  ["get_web_settings", schemas.GetWebSettingsArgs,
126
126
  "Settings → Web appearance as it is now, for the user: every setting the page shows in plain words (summary) and as values — the host's (themes shown, identity colours, card sizes, sidebar widget), each agent's own colour and effects, one person's custom CSS and effect slots — the installed and proposed mods, the people whose own settings you may name, and what only the person can do on the page. General, coordinators and full profiles."],
127
127
  ["set_web_settings", schemas.SetWebSettingsArgs,
128
- "Change one Web appearance setting for the user, exactly as the page changes it (the same checks; custom CSS keeps its safe rules): host settings, an agent's colour, custom CSS (save on trial, keep or revert the trial, use an earlier version, off), a proposed mod (review, install with the parts to apply, cancel, dismiss, uninstall), an effect on a chat, an effect slot, or Restore defaults. Returns { ok, ... } or { ok: false, error, detail }. See the web-appearance skill. General, coordinators and full profiles."],
128
+ "Change one Web appearance setting for the user, exactly as the page changes it (the same checks; custom CSS keeps its safe rules): host settings, an agent's colour, an agent's card banner focus, custom CSS (save on trial, keep or revert the trial, use an earlier version, off), a proposed mod (review, install with the parts to apply, cancel, dismiss, uninstall), an effect on a chat, an effect slot, or Restore defaults. Returns { ok, ... } or { ok: false, error, detail }. See the web-appearance skill. General, coordinators and full profiles."],
129
129
  ["get_web_theme", schemas.GetWebThemeArgs,
130
130
  "Your own web theme (how your chat looks in the web dashboard): the current theme, the token defaults it is drawn over, your uploaded pictures, and your limits (changes left, each picture slot's size limits and your picture quota; uploads are not counted). No target: always yours."],
131
131
  ["set_web_theme", schemas.SetWebThemeArgs,
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tools.js","sourceRoot":"","sources":["../../src/channel/mcp-tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-tools.js","sourceRoot":"","sources":["../../src/channel/mcp-tools.ts"],"names":[],"mappings":"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"}
@@ -8,13 +8,14 @@ import { mbText, PUBLIC_LINK_MAX_FILE_BYTES, UPLOAD_LIMITS, UPLOAD_MB_RANGE } fr
8
8
  import { previewOriginProblem } from "./web-preview.js";
9
9
  import { DEFAULT_SESSION_POLICY, GUEST_SESSION_BOUNDS, GUEST_SESSION_POLICY, LOCAL_SESSION_HOURS } from "./web-session.js";
10
10
  import { effectiveAppearanceLimits } from "./web-appearance-limits.js";
11
+ import { VERIFIED_SESSION_HOURS } from "./authority/web-authority.js";
11
12
  import { existsSync } from "node:fs";
12
13
  import { isUnsupportedHomeRef, resolveFileRefPath, systemPromptParts } from "./prompt-file-ref.js";
13
14
  import { isRemovedBackend, removedBackendMessage } from "./backend/removed.js";
14
15
  import { CROSS_INSTANCE_VISIBILITY_MODES, isCrossInstanceVisibility } from "./cross-instance-notice.js";
15
16
  /** Every key `web:` takes (WebConfig, checked both ways at compile time): anything else is a typo or a guess, ignored. */
16
17
  const WEB_KEYS = ["public_link", "echo_to_channel", "usage_panel", "log_tab", "provider_secrets", "allowed_hosts", "view_access",
17
- "notify_login", "session", "preview", "preview_port", "preview_origin", "preview_on_public_link", "themes", "appearance", "upload_max_file_mb", "upload_max_total_mb", "guests"];
18
+ "notify_login", "session", "preview", "preview_port", "preview_origin", "preview_on_public_link", "themes", "appearance", "upload_max_file_mb", "upload_max_total_mb", "guests", "verified_authority"];
18
19
  const WEB_KEYS_COMPLETE = true;
19
20
  void WEB_KEYS_COMPLETE;
20
21
  /** Backends the factory can instantiate (keep in sync with backend/factory.ts). */
@@ -461,6 +462,23 @@ export function validateFleetConfig(config) {
461
462
  validateWebSession(config.web.session, err);
462
463
  if (config.web.guests !== undefined)
463
464
  validateWebGuests(config.web.guests, config, err, warn);
465
+ // #1939 S1: the two §3 keys; anything else under it (the switch, the step-up list) arrives with S2 and is ignored now.
466
+ if (config.web.verified_authority !== undefined) {
467
+ const v = config.web.verified_authority;
468
+ if (!isObj(v))
469
+ err("web.verified_authority", "must be a mapping");
470
+ else {
471
+ for (const k of Object.keys(v))
472
+ if (k !== "loopback_only" && k !== "max_session_hours")
473
+ warn(`web.verified_authority.${k}`, "unknown key (known: loopback_only, max_session_hours) — ignored");
474
+ if (v.loopback_only !== undefined && typeof v.loopback_only !== "boolean")
475
+ err("web.verified_authority.loopback_only", "must be a boolean");
476
+ const h = v.max_session_hours;
477
+ if (h !== undefined && (typeof h !== "number" || !Number.isFinite(h) || h < VERIFIED_SESSION_HOURS.min || h > VERIFIED_SESSION_HOURS.max)) {
478
+ err("web.verified_authority.max_session_hours", `must be a number of hours from ${VERIFIED_SESSION_HOURS.min} to ${VERIFIED_SESSION_HOURS.max}`);
479
+ }
480
+ }
481
+ }
464
482
  validateUploadLimits(config.web, warn);
465
483
  if (config.web.allowed_hosts !== undefined) {
466
484
  if (!Array.isArray(config.web.allowed_hosts)) {