shadok-ai 0.17.24 → 0.17.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -309,9 +309,12 @@ Enter to skip; you can add it later from the web UI).
309
309
  with **Run on a schedule…**. An agent can also be born with it, from the
310
310
  new-agent dialog or with `pilotctl spawn --skill`. Agents report problems
311
311
  with `factory.mjs feedback`.
312
- - **Secrets travel by name.** A saved skill gives the agents running it the
313
- secrets it declares, plus any vault name its code reads; the panel and the
314
- Save message name them. A save or push holding a vault value is refused.
312
+ - **Secrets travel by name, and only once you approve them.** A saved skill
313
+ asks for the secrets it declares, plus any vault name its code reads. Save
314
+ (or giving it to an agent of another group) lists those names and asks you
315
+ to approve them; agents receive only the names you approved. A save or push
316
+ holding a vault value is refused, and so is a push carrying a symlink or a
317
+ submodule.
315
318
  - **Also:** import from `~/.claude/skills`, make a variant, archive.
316
319
  - Design: `docs/superpowers/specs/2026-10-29-skill-factory-design.md`.
317
320
  - **Diff panel** — what an agent actually changed, against its base.
@@ -1122,7 +1125,14 @@ or door that caused it; names only, never a value; filters `secret`, `action`,
1122
1125
  `{pending, reason}`: whether this instance's lead agent is being started
1123
1126
  right now), `/version`, `/autoupdate`,
1124
1127
  `/update-channel` (POST `{channel}` — `alpha` or `beta`), `/permission-mode`, `/tweak/prepare` (POST — clone/refresh shadok-ai's own source,
1125
- returns the cwd to start the tweak agent in), `/media/<name>` (GET — serves a
1128
+ returns the cwd to start the tweak agent in). The instance-wide writes —
1129
+ `/autoupdate`, `/update-channel`, `/permission-mode`, `POST /ledger`, a bare
1130
+ `POST /restart-all`, the Claude sign-in (`POST /auth/login`, `/auth/code`,
1131
+ `DELETE /auth/login`), `PUT /title`, `PUT /theme`, `/tweak/prepare` and
1132
+ `DELETE /profiles` — are **admin only, from the browser**; a member sees those
1133
+ controls disabled. `PUT /profiles` is admin only on a multi-tenant instance
1134
+ (profiles are global there), and `POST /restart-all {sessions:[…]}` stays open,
1135
+ narrowed to the agents the caller may drive. Also `/media/<name>` (GET — serves a
1126
1136
  pasted/dropped or Telegram attachment back for inline display; sandboxed, basename
1127
1137
  only), and the sign-in group: `/auth` (GET
1128
1138
  — `{loggedIn, email?, subscriptionType?, tokenExpiresAt?, accessExpiresAt?, backend?, backendModel?}`;
@@ -211,8 +211,18 @@ export declare function channelForTelegram(chatId: number, threadId?: number): C
211
211
  * agent jumped home. An omitted key therefore keeps the stored value — omit,
212
212
  * never null-by-omission (invariant 1); an explicit null still ungroups.
213
213
  */
214
- export declare function mergeChannels(stored: Channel[], clientList: Channel[], liveIds: Set<string>): Channel[];
215
- export declare function mergeClientChannels(clientList: Channel[], liveIds: Set<string>): Channel[];
214
+ export declare function mergeChannels(stored: Channel[], clientList: Channel[], liveIds: Set<string>,
215
+ /**
216
+ * Can the CALLER see this stored row? `GET /channels` filters by group, so a
217
+ * member's tab never holds another group's rows — and its routine PUT used to
218
+ * ERASE every one of them that was dormant (not live, not Telegram-bound):
219
+ * their keys died with the row and the group binding was lost. A row the
220
+ * caller cannot see is now preserved untouched, and a client row naming it is
221
+ * ignored, so a caller can neither drop nor rename what it cannot see.
222
+ * Omitted → every row is visible (mono-tenant, internal callers).
223
+ */
224
+ canSee?: (c: Channel) => boolean): Channel[];
225
+ export declare function mergeClientChannels(clientList: Channel[], liveIds: Set<string>, canSee?: (c: Channel) => boolean): Channel[];
216
226
  /**
217
227
  * Coerce whatever is on disk (or in a PUT body) into typed Groups. Legacy rows
218
228
  * were cosmetic tab groups (`{id:number, name, collapsed, order}`); they become
package/dist/channels.js CHANGED
@@ -221,7 +221,17 @@ export function channelForTelegram(chatId, threadId) {
221
221
  * agent jumped home. An omitted key therefore keeps the stored value — omit,
222
222
  * never null-by-omission (invariant 1); an explicit null still ungroups.
223
223
  */
224
- export function mergeChannels(stored, clientList, liveIds) {
224
+ export function mergeChannels(stored, clientList, liveIds,
225
+ /**
226
+ * Can the CALLER see this stored row? `GET /channels` filters by group, so a
227
+ * member's tab never holds another group's rows — and its routine PUT used to
228
+ * ERASE every one of them that was dormant (not live, not Telegram-bound):
229
+ * their keys died with the row and the group binding was lost. A row the
230
+ * caller cannot see is now preserved untouched, and a client row naming it is
231
+ * ignored, so a caller can neither drop nor rename what it cannot see.
232
+ * Omitted → every row is visible (mono-tenant, internal callers).
233
+ */
234
+ canSee = () => true) {
225
235
  const byId = new Map(stored.map((c) => [c.sessionId, c]));
226
236
  const result = [];
227
237
  const seen = new Set();
@@ -230,8 +240,10 @@ export function mergeChannels(stored, clientList, liveIds) {
230
240
  continue;
231
241
  if (seen.has(c.sessionId))
232
242
  continue; // the client sent the same agent twice → write it once
233
- seen.add(c.sessionId);
234
243
  const prev = byId.get(c.sessionId);
244
+ if (prev && !canSee(prev))
245
+ continue; // not theirs to write: kept below, untouched
246
+ seen.add(c.sessionId);
235
247
  if (!prev) {
236
248
  // A brand-new row the client just created. `group` is SERVER_OWNED and
237
249
  // drives a privilege drop to that group's OS user on resume, so a client
@@ -264,8 +276,9 @@ export function mergeChannels(stored, clientList, liveIds) {
264
276
  for (const c of stored) {
265
277
  if (seen.has(c.sessionId))
266
278
  continue;
267
- if (liveIds.has(c.sessionId) || c.telegram)
268
- result.push(c); // never erase live/Telegram
279
+ // never erase live/Telegram, nor a row the caller cannot even see
280
+ if (liveIds.has(c.sessionId) || c.telegram || !canSee(c))
281
+ result.push(c);
269
282
  }
270
283
  // The main channel — a GROUP's General topic (no threadId) — is always named
271
284
  // "general", server-authoritative so a stale client can't rename it. A DM
@@ -283,8 +296,8 @@ export function mergeChannels(stored, clientList, liveIds) {
283
296
  }
284
297
  return result;
285
298
  }
286
- export function mergeClientChannels(clientList, liveIds) {
287
- const result = mergeChannels(loadChannels(), clientList, liveIds);
299
+ export function mergeClientChannels(clientList, liveIds, canSee) {
300
+ const result = mergeChannels(loadChannels(), clientList, liveIds, canSee);
288
301
  saveChannels(result);
289
302
  return result;
290
303
  }
@@ -1 +1 @@
1
- {"version":3,"file":"channels.js","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channels.js","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,22 @@ export interface FactoryDeps {
12
12
  id: string | null;
13
13
  profile: string | null;
14
14
  };
15
- vault(): Record<string, string>;
15
+ /**
16
+ * The vault the scan compares against, as the CALLER's group sees it (an
17
+ * agent: its channel's group; a person: the group they spawn in). Main's
18
+ * vault for everyone made the scan an oracle on secrets of other groups.
19
+ */
20
+ vault(req: Request): Record<string, string>;
21
+ /** May this request drive (and so attach to / list) that agent? Mono-tenant: yes. */
22
+ mayDrive(req: Request, sessionId: string): boolean;
23
+ /** The group an agent's acceptances are keyed by (mono-tenant: always `main`). */
24
+ agentGroup(sessionId: string): string;
25
+ /** The group a PERSON accepts for by default (mono-tenant: `main`). */
26
+ personGroup(req: Request): string;
27
+ /** May this request accept on behalf of `group`? (it is one of theirs, or public) */
28
+ mayActForGroup(req: Request, group: string): boolean;
29
+ /** A cockpit group id (or null) → the group acceptances are keyed by. */
30
+ tenantGroup(groupId: string | null): string;
16
31
  loadChannels(): Channel[];
17
32
  upsertChannel(patch: Partial<Channel> & {
18
33
  sessionId: string;
@@ -19,7 +19,7 @@ import fs from "node:fs";
19
19
  import path from "node:path";
20
20
  import express from "express";
21
21
  import os from "node:os";
22
- import { accept, addFeedback, adoptable, adoptSkill, closeFeedback, duplicateSkill, bundleOf, createSkill, cutRelease, deleteSkill, diff, FactoryError, factoryRoot, findSkill, headCommit, listTree, loadRegistry, log, MAIN_GROUP, prepareWorkspace, readFile, scopeError, groupsScope, runStats, updateMeta, cleanTags, scopeVisibleTo, slugify, receivePush, saveFile, scanMain, unreleased, } from "./factory.js";
22
+ import { accept, acceptanceFor, acceptedAnywhere, approvalFrom, pushVerdict, addFeedback, adoptable, adoptSkill, closeFeedback, duplicateSkill, bundleOf, createSkill, cutRelease, deleteSkill, diff, FactoryError, factoryRoot, findSkill, headCommit, listTree, loadRegistry, log, MAIN_GROUP, prepareWorkspace, readFile, scopeError, groupsScope, runStats, updateMeta, cleanTags, scopeVisibleTo, slugify, receivePush, saveFile, scanMain, unreleased, } from "./factory.js";
23
23
  import { parseManifest } from "./factory-scan.js";
24
24
  import { SKILLSMITH_PROFILE_NAME } from "./profiles.js";
25
25
  export { SKILLSMITH_PROFILE_NAME };
@@ -37,7 +37,7 @@ function fail(res, e) {
37
37
  export function mountFactory(app, deps) {
38
38
  const root = () => factoryRoot();
39
39
  /** The card as the panel shows it: registry + live facts (head, bindings, where attached). */
40
- const view = (s, channels, vaultNames, stats) => {
40
+ const view = (s, channels, vaultNames, stats, group) => {
41
41
  const head = headCommit(root(), s.id);
42
42
  const manifest = parseManifest(readFile(root(), s.id, "shadok-skill.json")).manifest;
43
43
  const required = manifest.requires?.secrets ?? [];
@@ -46,7 +46,7 @@ export function mountFactory(app, deps) {
46
46
  head,
47
47
  unreleased: unreleased(s, head),
48
48
  bindings: required.map((name) => ({ name, bound: vaultNames.has(name) })),
49
- latestAccepted: latestAccepted(s)?.n ?? null,
49
+ latestAccepted: latestAccepted(s, group)?.n ?? null,
50
50
  attachedTo: channels
51
51
  .filter((c) => c.skills?.some((a) => a.skill === s.id))
52
52
  .map((c) => {
@@ -63,7 +63,7 @@ export function mountFactory(app, deps) {
63
63
  // What THIS agent gets: each granted secret, present in the vault or not.
64
64
  secrets: (rel?.secrets ?? []).map((n) => ({ name: n, bound: vaultNames.has(n), detected: !!rel?.detectedSecrets?.includes(n) })),
65
65
  mcp: (rel?.mcp ?? []).map((n) => ({ name: n, present: mcpHave.has(n) })),
66
- update: (latestAccepted(s)?.n ?? 0) > release ? latestAccepted(s).n : null,
66
+ update: (latestAccepted(s, deps.agentGroup(c.sessionId))?.n ?? 0) > release ? latestAccepted(s, deps.agentGroup(c.sessionId)).n : null,
67
67
  };
68
68
  }),
69
69
  feedback: (s.feedback ?? []).slice().reverse(),
@@ -72,19 +72,56 @@ export function mountFactory(app, deps) {
72
72
  lastRun: stats.last[s.name] ?? null,
73
73
  };
74
74
  };
75
- const latestAccepted = (s) => [...s.releases].reverse().find((r) => s.acceptances.some((a) => a.group === MAIN_GROUP && a.release === r.n && a.tree === r.tree));
75
+ const latestAccepted = (s, group) => [...s.releases].reverse().find((r) => !!acceptanceFor(s, r, group));
76
76
  const by = (req) => {
77
77
  const agent = deps.callerOf(req);
78
78
  if (agent.id)
79
- return `agent:${agent.profile ?? "no profile"}/${agent.id.slice(0, 8)} (${MAIN_GROUP})`;
79
+ return `agent:${agent.profile ?? "no profile"}/${agent.id.slice(0, 8)} (${deps.agentGroup(agent.id)})`;
80
80
  return deps.personName(req) ?? "cockpit";
81
81
  };
82
+ /**
83
+ * Does this request carry a MACHINE credential — an agent's session key (as a
84
+ * header or the `key` body field `callerOf` also reads) or a peer token? A
85
+ * browser never sends one, and an agent can forge an `Origin` header with
86
+ * curl, so the same-origin check alone does not prove a person is clicking.
87
+ * Checked on presence, not validity: a person has no reason to send either.
88
+ */
89
+ const machine = (req) => !!req.headers["x-shadok-session-key"] ||
90
+ !!req.headers["x-shadok-peer"] ||
91
+ (!Buffer.isBuffer(req.body) && typeof req.body?.key === "string") ||
92
+ !!deps.callerOf(req).id;
93
+ /** A PERSON's click: same-origin browser AND no agent/peer credential. */
82
94
  const browser = (req, res) => {
83
- if (deps.requestFromBrowser(req))
95
+ if (deps.requestFromBrowser(req) && !machine(req))
84
96
  return true;
85
97
  res.status(403).json({ error: "same-origin browser only — a person does this, not an agent" });
86
98
  return false;
87
99
  };
100
+ /**
101
+ * The secrets a release asks for must be approved by the person, by name,
102
+ * before an acceptance grants them. Returns the approved list, or answers 409
103
+ * with `needsApproval` (the names to show) and returns null.
104
+ */
105
+ const approval = (rel, raw, res) => {
106
+ const ok = approvalFrom(rel, raw);
107
+ if (ok !== undefined)
108
+ return ok;
109
+ res.status(409).json({
110
+ error: `v${rel.n} asks for vault secrets (${rel.secrets.join(", ")}) — approve them by name to grant them`,
111
+ needsApproval: rel.secrets,
112
+ });
113
+ return null;
114
+ };
115
+ /** The group a person accepts for: the one asked (if theirs), else their default. */
116
+ const acceptGroup = (req, res) => {
117
+ const asked = typeof req.body?.group === "string" && req.body.group.trim() ? req.body.group.trim() : null;
118
+ const g = asked ?? deps.personGroup(req);
119
+ if (!deps.mayActForGroup(req, g)) {
120
+ res.status(403).json({ error: `you cannot accept for ${g}` });
121
+ return null;
122
+ }
123
+ return g;
124
+ };
88
125
  /**
89
126
  * Who is asking, for scope: a person (by account) or an agent (by its key —
90
127
  * its group and creator). A "just me" skill is invisible to everyone else: it
@@ -128,15 +165,19 @@ export function mountFactory(app, deps) {
128
165
  return stored;
129
166
  };
130
167
  app.get("/factory/skills", (req, res) => {
131
- const channels = deps.loadChannels();
132
- const names = new Set(Object.keys(deps.vault()));
168
+ // Only the agents this caller may drive: the list carries names, groups,
169
+ // creators and schedule prompts of every agent it names.
170
+ const channels = deps.loadChannels().filter((c) => deps.mayDrive(req, c.sessionId));
171
+ const names = new Set(Object.keys(deps.vault(req)));
172
+ const agent = deps.callerOf(req);
173
+ const group = agent.id ? deps.agentGroup(agent.id) : deps.personGroup(req);
133
174
  res.json({
134
- group: MAIN_GROUP,
175
+ group,
135
176
  me: deps.personName(req),
136
177
  groups: deps.groups().map((g) => ({ id: g.id, name: g.name ?? `group ${g.id}`, icon: g.icon ?? "" })),
137
178
  skills: (() => {
138
179
  const stats = runStats(root(), Date.now() - 7 * 86_400_000);
139
- return loadRegistry(root()).skills.filter((s) => canSee(req, s)).map((s) => view(s, channels, names, stats));
180
+ return loadRegistry(root()).skills.filter((s) => canSee(req, s)).map((s) => view(s, channels, names, stats, group));
140
181
  })(),
141
182
  agents: channels.map((c) => ({
142
183
  sessionId: c.sessionId,
@@ -164,7 +205,10 @@ export function mountFactory(app, deps) {
164
205
  i++;
165
206
  name = `${name}-${i}`;
166
207
  }
167
- const s = createSkill(root(), { name, title, description: req.body?.description, by: by(req), owner: ownerFrom(req, req.body?.scope) });
208
+ const s = createSkill(root(), {
209
+ name, title, description: req.body?.description, by: by(req), owner: ownerFrom(req, req.body?.scope),
210
+ editors: [deps.personGroup(req)],
211
+ });
168
212
  if (req.body?.tags)
169
213
  updateMeta(root(), s.id, { tags: cleanTags(req.body.tags) });
170
214
  deps.audit({ action: "create", skill: s.name, by: by(req) });
@@ -190,7 +234,7 @@ export function mountFactory(app, deps) {
190
234
  const patch = {};
191
235
  if (b.scope !== undefined) {
192
236
  const me = deps.personName(req) ?? "admin";
193
- if (s.createdBy !== me && !s.owner.startsWith(`user:${me}`) && !deps.requireAdmin(req, res, "change who a shared skill is shared with"))
237
+ if (s.createdBy !== me && s.owner !== `user:${me}` && !deps.requireAdmin(req, res, "change who a shared skill is shared with"))
194
238
  return;
195
239
  patch.owner = ownerFrom(req, b.scope);
196
240
  }
@@ -211,15 +255,15 @@ export function mountFactory(app, deps) {
211
255
  }
212
256
  });
213
257
  app.delete("/factory/skills/:id", (req, res) => {
258
+ // A person's act either way: an agent's key IS the bootstrap admin, so the
259
+ // admin check alone would let any agent delete a shared skill.
260
+ if (!browser(req, res))
261
+ return;
214
262
  const s = skillOr404(req, res);
215
263
  if (!s)
216
264
  return;
217
265
  // Yours: you delete it. Shared (a group's, the organisation's): an admin.
218
- if (s.owner.startsWith("user:")) {
219
- if (!browser(req, res))
220
- return;
221
- }
222
- else if (!deps.requireAdmin(req, res, "delete a shared factory skill"))
266
+ if (!s.owner.startsWith("user:") && !deps.requireAdmin(req, res, "delete a shared factory skill"))
223
267
  return;
224
268
  const attached = deps.loadChannels().filter((c) => c.skills?.some((a) => a.skill === s.id));
225
269
  if (attached.length && req.query.force !== "1")
@@ -288,7 +332,7 @@ export function mountFactory(app, deps) {
288
332
  content: b.delete === true ? null : typeof b.content === "string" ? b.content : "",
289
333
  base: typeof b.base === "string" ? b.base : null,
290
334
  by: by(req),
291
- secrets: secretsOf(deps.vault()),
335
+ secrets: secretsOf(deps.vault(req)),
292
336
  });
293
337
  deps.audit({ action: "save", skill: s.name, path: b.path, by: by(req) });
294
338
  res.json({ ok: true, ...out });
@@ -314,6 +358,9 @@ export function mountFactory(app, deps) {
314
358
  try {
315
359
  const asked = typeof req.body?.group === "string" && req.body.group.trim() ? req.body.group.trim() : null;
316
360
  const at = deps.workspaceFor(req, asked);
361
+ const why = pushVerdict(s, { group: deps.tenantGroup(at.group), createdBy: deps.personName(req) });
362
+ if (why)
363
+ throw new FactoryError(`${why} — a Skillsmith started there could not push`, 403);
317
364
  res.json({ cwd: prepareWorkspace(root(), s.id, at.home, at.user), profile: SKILLSMITH_PROFILE_NAME, name: s.name, group: at.group });
318
365
  }
319
366
  catch (e) {
@@ -325,7 +372,7 @@ export function mountFactory(app, deps) {
325
372
  if (!s)
326
373
  return;
327
374
  try {
328
- res.json(scanMain(root(), s.id, secretsOf(deps.vault())));
375
+ res.json(scanMain(root(), s.id, secretsOf(deps.vault(req))));
329
376
  }
330
377
  catch (e) {
331
378
  fail(res, e);
@@ -354,10 +401,14 @@ export function mountFactory(app, deps) {
354
401
  const s = skillOr404(req, res);
355
402
  if (!s)
356
403
  return;
404
+ const ch = deps.loadChannels().find((c) => c.sessionId === caller.id);
405
+ const why = pushVerdict(s, { group: deps.agentGroup(caller.id), createdBy: ch?.createdBy ?? null });
406
+ if (why)
407
+ return res.status(403).json({ error: why });
357
408
  if (!Buffer.isBuffer(req.body) || !req.body.length)
358
409
  return res.status(400).json({ error: "empty bundle" });
359
410
  try {
360
- const out = receivePush(root(), s.id, req.body, { by: by(req), secrets: secretsOf(deps.vault()) });
411
+ const out = receivePush(root(), s.id, req.body, { by: by(req), secrets: secretsOf(deps.vault(req)) });
361
412
  deps.audit({ action: "push", skill: s.name, commits: out.commits, by: by(req) });
362
413
  res.json({ ok: true, ...out });
363
414
  }
@@ -375,13 +426,26 @@ export function mountFactory(app, deps) {
375
426
  const s = skillOr404(req, res);
376
427
  if (!s)
377
428
  return;
429
+ const group = req.body?.accept === true ? acceptGroup(req, res) : null;
430
+ if (req.body?.accept === true && !group)
431
+ return;
378
432
  try {
379
- const rel = cutRelease(root(), s.id, { by: by(req), note: req.body?.note, secrets: secretsOf(deps.vault()) });
433
+ // The approval is asked BEFORE the release is cut, from what it would
434
+ // ask for: a 409 after cutting would leave a retry facing "already this
435
+ // exact content".
436
+ let approved = null;
437
+ if (group) {
438
+ const would = scanMain(root(), s.id, secretsOf(deps.vault(req))).secrets;
439
+ approved = approval({ n: (s.releases[s.releases.length - 1]?.n ?? 0) + 1, secrets: would }, req.body?.approveSecrets, res);
440
+ if (!approved)
441
+ return;
442
+ }
443
+ const rel = cutRelease(root(), s.id, { by: by(req), note: req.body?.note, secrets: secretsOf(deps.vault(req)) });
380
444
  deps.audit({ action: "release", skill: s.name, release: rel.n, tree: rel.tree, by: by(req) });
381
445
  // "Release and accept" in one click: the releaser is a person of the group.
382
- if (req.body?.accept === true) {
383
- accept(root(), s.id, { group: MAIN_GROUP, release: rel.n, by: by(req) });
384
- deps.audit({ action: "accept", skill: s.name, release: rel.n, tree: rel.tree, group: MAIN_GROUP, by: by(req) });
446
+ if (group && approved) {
447
+ accept(root(), s.id, { group, release: rel.n, by: by(req), secrets: approved });
448
+ deps.audit({ action: "accept", skill: s.name, release: rel.n, tree: rel.tree, group, secrets: approved, by: by(req) });
385
449
  }
386
450
  res.json({ release: rel });
387
451
  }
@@ -395,9 +459,18 @@ export function mountFactory(app, deps) {
395
459
  const s = skillOr404(req, res);
396
460
  if (!s)
397
461
  return;
462
+ const group = acceptGroup(req, res);
463
+ if (!group)
464
+ return;
465
+ const rel = s.releases.find((r) => r.n === Number(req.body?.release));
466
+ if (!rel)
467
+ return res.status(404).json({ error: `no release v${req.body?.release}` });
468
+ const approved = approval(rel, req.body?.approveSecrets, res);
469
+ if (!approved)
470
+ return;
398
471
  try {
399
- const a = accept(root(), s.id, { group: MAIN_GROUP, release: Number(req.body?.release), by: by(req) });
400
- deps.audit({ action: "accept", skill: s.name, release: a.release, tree: a.tree, group: a.group, by: by(req) });
472
+ const a = accept(root(), s.id, { group, release: rel.n, by: by(req), secrets: approved });
473
+ deps.audit({ action: "accept", skill: s.name, release: a.release, tree: a.tree, group: a.group, secrets: approved, by: by(req) });
401
474
  res.json({ acceptance: a });
402
475
  }
403
476
  catch (e) {
@@ -418,13 +491,17 @@ export function mountFactory(app, deps) {
418
491
  const rel = s.releases.find((r) => r.n === Number(req.body?.release));
419
492
  if (!rel)
420
493
  return res.status(404).json({ error: "no such release" });
421
- if (!s.acceptances.some((a) => a.group === MAIN_GROUP && a.release === rel.n && a.tree === rel.tree))
494
+ if (!acceptedAnywhere(s, rel))
422
495
  return res.status(409).json({ error: `v${rel.n} has not been accepted yet` });
423
496
  const out = [];
497
+ // Only agents this person may drive, and only where v<N> is accepted for
498
+ // THEIR group: another group's agent is that group's people's decision.
424
499
  for (const c of deps.loadChannels()) {
425
500
  const cur = c.skills?.find((a) => a.skill === s.id);
426
501
  if (!cur || cur.release >= rel.n)
427
502
  continue;
503
+ if (!deps.mayDrive(req, c.sessionId) || !acceptanceFor(s, rel, deps.agentGroup(c.sessionId)))
504
+ continue;
428
505
  deps.upsertChannel({ sessionId: c.sessionId, skills: c.skills.map((a) => (a.skill === s.id ? { ...a, release: rel.n } : a)) });
429
506
  deps.onAttachmentsChanged(c.sessionId);
430
507
  out.push({ name: c.name ?? c.sessionId.slice(0, 8), result: deps.reloadIfIdle(c.sessionId) });
@@ -447,23 +524,35 @@ export function mountFactory(app, deps) {
447
524
  const s = skillOr404(req, res);
448
525
  if (!s)
449
526
  return;
527
+ const group = acceptGroup(req, res);
528
+ if (!group)
529
+ return;
450
530
  try {
451
531
  const last = s.releases[s.releases.length - 1];
452
532
  const head = headCommit(root(), s.id);
453
533
  const rel = last && head && last.commit === head
454
534
  ? last
455
- : cutRelease(root(), s.id, { by: by(req), secrets: secretsOf(deps.vault()) });
535
+ : cutRelease(root(), s.id, { by: by(req), secrets: secretsOf(deps.vault(req)) });
456
536
  if (rel !== last)
457
537
  deps.audit({ action: "release", skill: s.name, release: rel.n, tree: rel.tree, by: by(req) });
458
- if (!s.acceptances.some((a) => a.group === MAIN_GROUP && a.release === rel.n && a.tree === rel.tree)) {
459
- accept(root(), s.id, { group: MAIN_GROUP, release: rel.n, by: by(req) });
460
- deps.audit({ action: "accept", skill: s.name, release: rel.n, tree: rel.tree, group: MAIN_GROUP, by: by(req) });
538
+ if (!acceptanceFor(findSkill(root(), s.id), rel, group)) {
539
+ // The release is cut (a retry reuses it); what it may RECEIVE waits for
540
+ // the person to approve each secret name it asks for.
541
+ const approved = approval(rel, req.body?.approveSecrets, res);
542
+ if (!approved)
543
+ return;
544
+ accept(root(), s.id, { group, release: rel.n, by: by(req), secrets: approved });
545
+ deps.audit({ action: "accept", skill: s.name, release: rel.n, tree: rel.tree, group, secrets: approved, by: by(req) });
461
546
  }
462
547
  const updated = [];
463
548
  for (const c of deps.loadChannels()) {
464
549
  const cur = c.skills?.find((a) => a.skill === s.id);
465
550
  if (!cur || cur.release === rel.n)
466
551
  continue;
552
+ // Never move an agent this person may not drive, nor one of a group
553
+ // that did not accept this release (it would be dropped at its spawn).
554
+ if (!deps.mayDrive(req, c.sessionId) || deps.agentGroup(c.sessionId) !== group)
555
+ continue;
467
556
  deps.upsertChannel({ sessionId: c.sessionId, skills: c.skills.map((a) => (a.skill === s.id ? { ...a, release: rel.n } : a)) });
468
557
  deps.onAttachmentsChanged(c.sessionId);
469
558
  updated.push({ name: c.name ?? c.sessionId.slice(0, 8), result: deps.reloadIfIdle(c.sessionId) });
@@ -520,7 +609,7 @@ export function mountFactory(app, deps) {
520
609
  const release = req.body?.release != null ? Number(req.body.release) : s.releases[s.releases.length - 1]?.n;
521
610
  const name = typeof req.body?.name === "string" && req.body.name.trim() ? req.body.name.trim() : slugify(String(req.body?.title ?? ""));
522
611
  const d = duplicateSkill(root(), s.id, {
523
- name, release, description: req.body?.description, by: by(req),
612
+ name, release, description: req.body?.description, by: by(req), editors: [deps.personGroup(req)],
524
613
  ...(req.body?.scope ? { owner: ownerFrom(req, req.body.scope) } : {}),
525
614
  });
526
615
  deps.audit({ action: "duplicate", skill: d.name, origin: d.origin, by: by(req) });
@@ -544,8 +633,9 @@ export function mountFactory(app, deps) {
544
633
  dir: String(req.body?.dir ?? ""),
545
634
  name: typeof req.body?.name === "string" && req.body.name.trim() ? req.body.name.trim() : undefined,
546
635
  by: by(req),
547
- secrets: secretsOf(deps.vault()),
636
+ secrets: secretsOf(deps.vault(req)),
548
637
  owner: ownerFrom(req, req.body?.scope ?? "me"),
638
+ editors: [deps.personGroup(req)],
549
639
  });
550
640
  deps.audit({ action: "adopt", skill: s.name, origin: s.origin, by: by(req) });
551
641
  res.json({ skill: s });
@@ -565,7 +655,9 @@ export function mountFactory(app, deps) {
565
655
  return;
566
656
  const sessionId = String(req.body?.sessionId ?? "");
567
657
  const ch = deps.loadChannels().find((c) => c.sessionId === sessionId);
568
- if (!ch)
658
+ // An agent this person may not drive does not exist for them (404, not 403:
659
+ // its id is no confirmation of anything).
660
+ if (!ch || !deps.mayDrive(req, sessionId))
569
661
  return res.status(404).json({ error: "no such agent" });
570
662
  const s = findSkill(root(), String(req.body?.skill ?? ""));
571
663
  if (!s || !canSee(req, s))
@@ -574,12 +666,28 @@ export function mountFactory(app, deps) {
574
666
  if (release !== null && s.archived)
575
667
  return res.status(409).json({ error: "this skill is archived: unarchive it first" });
576
668
  const rest = (ch.skills ?? []).filter((a) => a.skill !== s.id);
669
+ const group = deps.agentGroup(sessionId);
577
670
  if (release !== null) {
578
671
  const rel = s.releases.find((r) => r.n === release);
579
672
  if (!rel)
580
673
  return res.status(404).json({ error: `no release v${release}` });
581
- if (!s.acceptances.some((a) => a.group === MAIN_GROUP && a.release === rel.n && a.tree === rel.tree))
674
+ if (!acceptedAnywhere(s, rel))
582
675
  return res.status(409).json({ error: `v${rel.n} has not been accepted yet — review and accept it first` });
676
+ // Accepted for ANOTHER group: this person may drive the target, so they
677
+ // are a person of its group, and attaching is their acceptance — with
678
+ // the secrets approved by name, like any acceptance.
679
+ if (!acceptanceFor(s, rel, group)) {
680
+ const approved = approval(rel, req.body?.approveSecrets, res);
681
+ if (!approved)
682
+ return;
683
+ try {
684
+ accept(root(), s.id, { group, release: rel.n, by: by(req), secrets: approved });
685
+ }
686
+ catch (e) {
687
+ return fail(res, e);
688
+ }
689
+ deps.audit({ action: "accept", skill: s.name, release: rel.n, tree: rel.tree, group, secrets: approved, by: by(req) });
690
+ }
583
691
  rest.push({ skill: s.id, release: rel.n });
584
692
  }
585
693
  deps.upsertChannel({ sessionId, skills: rest });