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 +14 -4
- package/dist/channels.d.ts +12 -2
- package/dist/channels.js +19 -6
- package/dist/channels.js.map +1 -1
- package/dist/factory-routes.d.ts +16 -1
- package/dist/factory-routes.js +144 -36
- package/dist/factory-routes.js.map +1 -1
- package/dist/factory.d.ts +53 -1
- package/dist/factory.js +137 -17
- package/dist/factory.js.map +1 -1
- package/dist/groups.d.ts +10 -10
- package/dist/groups.js +12 -10
- package/dist/groups.js.map +1 -1
- package/dist/kinship.d.ts +11 -1
- package/dist/kinship.js +13 -1
- package/dist/kinship.js.map +1 -1
- package/dist/route-guards.d.ts +106 -0
- package/dist/route-guards.js +99 -0
- package/dist/route-guards.js.map +1 -0
- package/dist/server.js +204 -24
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
- package/public/index.html +63 -13
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
|
|
313
|
-
secrets it declares, plus any vault name its code reads
|
|
314
|
-
|
|
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)
|
|
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?}`;
|
package/dist/channels.d.ts
CHANGED
|
@@ -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
|
|
215
|
-
|
|
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
|
-
|
|
268
|
-
|
|
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
|
}
|
package/dist/channels.js.map
CHANGED
|
@@ -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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"}
|
package/dist/factory-routes.d.ts
CHANGED
|
@@ -12,7 +12,22 @@ export interface FactoryDeps {
|
|
|
12
12
|
id: string | null;
|
|
13
13
|
profile: string | null;
|
|
14
14
|
};
|
|
15
|
-
|
|
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;
|
package/dist/factory-routes.js
CHANGED
|
@@ -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
|
|
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)} (${
|
|
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
|
-
|
|
132
|
-
|
|
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
|
|
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(), {
|
|
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 &&
|
|
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
|
-
|
|
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 (
|
|
383
|
-
accept(root(), s.id, { group
|
|
384
|
-
deps.audit({ action: "accept", skill: s.name, release: rel.n, tree: rel.tree, group:
|
|
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
|
|
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
|
|
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 (!
|
|
459
|
-
|
|
460
|
-
|
|
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
|
-
|
|
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
|
|
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 });
|