@desplega.ai/agent-swarm 2.5.1 → 2.5.3
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/dist/{acp-adapter-7g6bpwbk.js → acp-adapter-gr2fcyyj.js} +3 -3
- package/dist/{actions-w8xd014k.js → actions-wv766ghf.js} +18 -18
- package/dist/{amp-adapter-z4qvhacj.js → amp-adapter-speb906t.js} +3 -3
- package/dist/{app-nndcvftq.js → app-ag29n14f.js} +3 -3
- package/dist/{assistant-hjmqyscx.js → assistant-3x8bz3eg.js} +19 -19
- package/dist/{boot-reembed-r8rhf9h8.js → boot-reembed-5b3d2eea.js} +1 -1
- package/dist/{boot-reembed-vwcj2y5d.js → boot-reembed-jsmfrpzf.js} +1 -1
- package/dist/{boot-scrub-sweep-fr9q36ne.js → boot-scrub-sweep-s73gerxy.js} +2 -2
- package/dist/{boot-seeds-9jqwnegq.js → boot-seeds-5zmax2wr.js} +4 -4
- package/dist/{claude-adapter-2f8b85df.js → claude-adapter-hswdnm3t.js} +3 -3
- package/dist/{claude-managed-adapter-gt6pa35d.js → claude-managed-adapter-cvbzj1h6.js} +2 -2
- package/dist/{claude-managed-setup-c3hp36ph.js → claude-managed-setup-3k8m3hhc.js} +2 -2
- package/dist/{claude-sdk-session-05kat8rv.js → claude-sdk-session-fkbyk66x.js} +6905 -6855
- package/dist/{cli-y3zyaee5.js → cli-1fc85mvt.js} +5 -5
- package/dist/{cli-v2g93k4v.js → cli-210xd1f4.js} +4 -4
- package/dist/{cli-sn1vbtg2.js → cli-25j01dpj.js} +3 -3
- package/dist/{cli-n6kmqngw.js → cli-35gtk1p6.js} +1 -1
- package/dist/{cli-r9fy0ddc.js → cli-3ngdk5te.js} +1 -1
- package/dist/{cli-z63a269p.js → cli-40jsnrjm.js} +2 -2
- package/dist/{cli-ba8ne1es.js → cli-4rvr7zfx.js} +10 -0
- package/dist/{cli-qfm6my86.js → cli-502eqv93.js} +1 -1
- package/dist/{cli-xd4eqtr2.js → cli-6n8axjv1.js} +1 -1
- package/dist/{cli-hadv0725.js → cli-8s5wx3nz.js} +2 -2
- package/dist/{cli-z2dv25mf.js → cli-99xgw26r.js} +116 -5
- package/dist/{cli-jpxsrxcb.js → cli-9s05422w.js} +1 -1
- package/dist/{cli-kcsd1ez8.js → cli-aecdcr77.js} +343 -325
- package/dist/{cli-w9etnnxk.js → cli-bf8ma3f1.js} +120 -50
- package/dist/{cli-e9btqw4y.js → cli-ce0ak9ms.js} +18 -13
- package/dist/{cli-nj12tn2c.js → cli-e2ar4bp1.js} +71 -20
- package/dist/{cli-gwcf52gz.js → cli-e8jyq7d8.js} +11 -7
- package/dist/{cli-rngde2jv.js → cli-egjggehm.js} +1 -1
- package/dist/{cli-qfjm4gvt.js → cli-ewm3pwbq.js} +2 -2
- package/dist/{cli-9mm5ade4.js → cli-fsdprwrg.js} +1 -1
- package/dist/{cli-3ee5z0q0.js → cli-fzcn3d87.js} +1 -1
- package/dist/{cli-eym3jg7w.js → cli-gpsz7g88.js} +6 -6
- package/dist/{cli-cwyafhw1.js → cli-hcpj2xqz.js} +1 -1
- package/dist/{cli-j1eghqfm.js → cli-hhxjnjzs.js} +1 -1
- package/dist/{cli-pyy4c9ch.js → cli-jjznk3f7.js} +881 -232
- package/dist/{cli-q9pzwxvk.js → cli-kxawjrxg.js} +222 -37
- package/dist/{cli-rh5smt8t.js → cli-mz9afxxf.js} +14 -3
- package/dist/{cli-mz2ygeyq.js → cli-n45mr7zh.js} +2 -2
- package/dist/{cli-fes51ya2.js → cli-p0rzjkya.js} +2 -2
- package/dist/{cli-3qv8naq8.js → cli-p6zs9h4y.js} +827 -107
- package/dist/{cli-mq7kg1b1.js → cli-p9rafdrb.js} +41 -6
- package/dist/{cli-cah5detr.js → cli-qgf8emrn.js} +5 -5
- package/dist/{cli-2wba1ac9.js → cli-qzme5949.js} +26 -26
- package/dist/{cli-znvq0k3t.js → cli-s49hpn37.js} +2 -2
- package/dist/{cli-xc65x52q.js → cli-s53vp709.js} +1 -1
- package/dist/{cli-0jy85zz4.js → cli-svrj71pg.js} +18 -16
- package/dist/{cli-1dp1zj04.js → cli-vwn81jbs.js} +3 -3
- package/dist/{cli-ajqhxtnz.js → cli-w1zwctj2.js} +1 -1
- package/dist/{cli-22rmcjkg.js → cli-y561h5a9.js} +7 -6
- package/dist/{cli-2jg61wab.js → cli-z21whrrg.js} +15 -15
- package/dist/cli.js +19 -18
- package/dist/{codex-adapter-p4ptwar5.js → codex-adapter-n8ka66vf.js} +2 -2
- package/dist/{codex-session-runner-964c7dnk.js → codex-session-runner-fsebts37.js} +1 -1
- package/dist/{commands-mbvhbrcy.js → commands-t04rt2pc.js} +2 -2
- package/dist/{controller-gnq1k1mf.js → controller-rgna04r2.js} +2 -2
- package/dist/{controllers-connect-6dkm71tg.js → controllers-connect-bqm1rtft.js} +20 -20
- package/dist/{cursor-adapter-yq5xgfcg.js → cursor-adapter-swr2k95y.js} +1 -1
- package/dist/{db-88wcymxt.js → db-24ck09xy.js} +1 -1
- package/dist/{db-af9y8nkf.js → db-a4m7haw0.js} +3 -3
- package/dist/{dispatcher-606ydx5v.js → dispatcher-nwf9ss0q.js} +17 -17
- package/dist/{dsh-adapter-tvhc4k2d.js → dsh-adapter-kpdnhjst.js} +2 -2
- package/dist/{external-channel-y8q5z8z2.js → external-channel-j1e2p34p.js} +2 -2
- package/dist/{grok-adapter-39aha52t.js → grok-adapter-qtjz0whk.js} +4 -4
- package/dist/{handlers-rk9dqech.js → handlers-19xr6dnz.js} +20 -20
- package/dist/{heartbeat-jfe9zfjr.js → heartbeat-vtesda5d.js} +20 -20
- package/dist/{hook-b1mez1m8.js → hook-8wqaszda.js} +1 -1
- package/dist/{hook-ffevzed1.js → hook-b2hhj6rd.js} +1 -1
- package/dist/{http-d5b44f1r.js → http-mxcqhhcs.js} +3020 -2463
- package/dist/{index-5en23s5z.js → index-1r8wfpzs.js} +1 -1
- package/dist/{index-cbxkmfc5.js → index-9pn1pfkf.js} +1 -1
- package/dist/{index-mj46rk9k.js → index-kw2mmat7.js} +20 -20
- package/dist/{index-nq8hhv28.js → index-n1vbvta9.js} +19 -10
- package/dist/{index-6srwvd5b.js → index-p4xfz37z.js} +1 -1
- package/dist/{index-d2qeem97.js → index-spwxjgay.js} +17 -17
- package/dist/{index-4q3vj1yr.js → index-srg522m6.js} +17 -17
- package/dist/{keepalive-wsby1btq.js → keepalive-dsd8rtgx.js} +3 -3
- package/dist/{lead-paa141j6.js → lead-zyerk1x2.js} +30 -30
- package/dist/{maintenance-vnshcyv9.js → maintenance-jqmqwnet.js} +1 -1
- package/dist/{oauth-refresh-sweep-d6sqn5np.js → oauth-refresh-sweep-q2c3bnvm.js} +2 -2
- package/dist/{onboard-nr4xhpzy.js → onboard-w4yd7s8t.js} +2 -2
- package/dist/{opencode-adapter-e56086m1.js → opencode-adapter-9tppvxar.js} +2 -2
- package/dist/{otel-impl-ytn9wyv9.js → otel-impl-f36byzbd.js} +1 -1
- package/dist/{pricing-refresh-pva04zee.js → pricing-refresh-xvak5p4v.js} +3 -3
- package/dist/{rbac-roles-7rc1q3g4.js → rbac-roles-682k2mt5.js} +12 -2
- package/dist/rbac-roles-gfn30fb8.js +26 -0
- package/dist/{render-v2-pyfsg9zk.js → render-v2-hgytz8nn.js} +3 -3
- package/dist/{resume-phj8xhqr.js → resume-2dvq348g.js} +7 -5
- package/dist/{session-access-jzx2z9h5.js → session-access-7f21ekq9.js} +4 -4
- package/dist/{setup-rfg0f0sg.js → setup-epffxtbk.js} +1 -1
- package/dist/{work-objects-44z2yjg8.js → work-objects-xz1a5rqk.js} +20 -20
- package/dist/{worker-zsfqzxhm.js → worker-42t8emjt.js} +30 -30
- package/openapi.json +3163 -2114
- package/package.json +7 -6
- package/src/be/approval-config-question.ts +389 -0
- package/src/be/automation-preflight.ts +37 -3
- package/src/be/db/session-tree.ts +158 -13
- package/src/be/db/session-visibility.ts +31 -0
- package/src/be/db/skill-search.ts +87 -0
- package/src/be/db/tasks/read.ts +47 -7
- package/src/be/db/workflow-runs.ts +54 -7
- package/src/be/db.ts +27 -5
- package/src/be/migrations/233_script_run_session_tokens.sql +8 -0
- package/src/be/migrations/235_chat_relay_defer.sql +86 -0
- package/src/be/migrations/237_session_inbox_cleanup.sql +75 -0
- package/src/be/migrations/239_skills_fts.sql +40 -0
- package/src/be/migrations/240_workflow_run_parent_step_attempt.sql +37 -0
- package/src/be/migrations/241_skills_meta_fts.sql +39 -0
- package/src/be/rbac-roles.ts +138 -0
- package/src/be/scripts/run-credential.ts +64 -0
- package/src/be/scripts/run-saved.ts +3 -2
- package/src/be/swarm-config-guard.ts +23 -0
- package/src/be/users.ts +28 -4
- package/src/extensions/catalog.generated.json +4 -4
- package/src/http/all-routes.ts +1 -0
- package/src/http/approval-requests.ts +254 -43
- package/src/http/config.ts +22 -37
- package/src/http/index.ts +2 -0
- package/src/http/schedules.ts +26 -0
- package/src/http/scripts.ts +2 -2
- package/src/http/sessions.ts +118 -2
- package/src/http/user-roles.ts +173 -0
- package/src/http/users.ts +9 -0
- package/src/http/x.ts +2 -2
- package/src/integrations/chat-sdk/commands.ts +14 -1
- package/src/integrations/chat-sdk/inbound.ts +42 -6
- package/src/integrations/chat-sdk/outbound.ts +35 -10
- package/src/integrations/chat-sdk/reactions.ts +107 -0
- package/src/integrations/chat-sdk/relay.ts +75 -7
- package/src/integrations/chat-sdk/thread-buffer.ts +2 -0
- package/src/integrations/reaction-events.ts +20 -0
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/dsh-adapter.ts +1 -1
- package/src/rbac/legacy-policy.ts +3 -0
- package/src/rbac/permissions.ts +8 -0
- package/src/scheduler/schedule-task.ts +44 -3
- package/src/scheduler/scheduler.ts +4 -4
- package/src/scripts-runtime/loader.ts +8 -1
- package/src/slack/ack.ts +2 -1
- package/src/slack/reaction-shortcode.ts +4 -7
- package/src/tasks/worker-follow-up.ts +30 -0
- package/src/tests/approval-config-question.test.ts +702 -0
- package/src/tests/approval-requests-notifications.test.ts +189 -0
- package/src/tests/chat-sdk-commands.test.ts +12 -0
- package/src/tests/chat-sdk-inbound.test.ts +183 -9
- package/src/tests/chat-sdk-outbound-files.test.ts +9 -2
- package/src/tests/chat-sdk-relay.test.ts +361 -10
- package/src/tests/chat-sdk-tools.test.ts +104 -0
- package/src/tests/docs-index-footprint.test.js +3 -3
- package/src/tests/dsh-adapter.test.ts +1 -1
- package/src/tests/entrypoint-gitlab-credential-helper.test.ts +273 -0
- package/src/tests/extensions-example-comms-adherence-gate.test.ts +321 -12
- package/src/tests/http-users.test.ts +38 -0
- package/src/tests/list-endpoint-slimming.test.ts +33 -0
- package/src/tests/migration-237-session-inbox-cleanup.test.ts +136 -0
- package/src/tests/migration-240-workflow-run-parent-step-attempt.test.ts +55 -0
- package/src/tests/rbac-engine.test.ts +2 -0
- package/src/tests/rbac-roles.test.ts +10 -0
- package/src/tests/schedule-http-triage-tools.test.ts +44 -0
- package/src/tests/script-api-credential.test.ts +173 -0
- package/src/tests/script-connections.test.ts +10 -0
- package/src/tests/script-run-config-scope.test.ts +120 -0
- package/src/tests/script-run-token.test.ts +75 -0
- package/src/tests/scripts-http.test.ts +19 -0
- package/src/tests/sessions-tree.test.ts +410 -1
- package/src/tests/skill-search-long-content.test.ts +193 -0
- package/src/tests/skill-search.test.ts +173 -22
- package/src/tests/user-roles-http.test.ts +204 -0
- package/src/tests/workflow-hitl-dynamic-questions.test.ts +1 -1
- package/src/tests/workflow-sub-workflow.test.ts +538 -1
- package/src/tools/chat-reply.ts +2 -0
- package/src/tools/request-human-input.ts +27 -5
- package/src/tools/schedules/patch-schedule.ts +18 -0
- package/src/tools/schedules/update-schedule.ts +18 -0
- package/src/types.ts +23 -0
- package/src/workflows/approval-notifications.ts +221 -0
- package/src/workflows/checkpoint.ts +69 -35
- package/src/workflows/engine.ts +234 -87
- package/src/workflows/executors/base.ts +6 -0
- package/src/workflows/executors/human-in-the-loop.ts +36 -173
- package/src/workflows/executors/sub-workflow.ts +45 -16
- package/src/workflows/executors/swarm-script.ts +2 -2
- package/src/workflows/recovery.ts +63 -1
- package/src/workflows/resume.ts +60 -21
- package/src/workflows/retry-poller.ts +25 -4
- package/templates/extensions/comms-adherence-gate/README.md +38 -13
- package/templates/extensions/comms-adherence-gate/hooks.ts +272 -69
- package/templates/extensions/comms-adherence-gate/manifest.json +2 -2
- package/templates/schedules/weekly-harness-upgrade-check/content.md +1 -1
- package/templates/skills/code-quality/content.md +1 -1
- package/templates/skills/turso-interaction/content.md +1 -1
- package/templates/skills/workflow-iterate/content.md +8 -1
- package/dist/rbac-roles-ff1ffmec.js +0 -12
- /package/dist/{cli-stxdrqs2.js → cli-avdvgcay.js} +0 -0
- /package/dist/{pi-mono-adapter-tzps8f38.js → pi-mono-adapter-tqsge1ay.js} +0 -0
|
@@ -9,21 +9,21 @@ import {
|
|
|
9
9
|
init_active_sessions,
|
|
10
10
|
getSteeringMessageById2,
|
|
11
11
|
init_db3
|
|
12
|
-
} from "./cli-
|
|
12
|
+
} from "./cli-kxawjrxg.js";
|
|
13
13
|
import {
|
|
14
14
|
getUserGrant2,
|
|
15
15
|
init_rbac_roles
|
|
16
|
-
} from "./cli-
|
|
16
|
+
} from "./cli-99xgw26r.js";
|
|
17
17
|
import {
|
|
18
18
|
findUserById,
|
|
19
19
|
findUserByExternalId,
|
|
20
20
|
init_users
|
|
21
|
-
} from "./cli-
|
|
21
|
+
} from "./cli-e8jyq7d8.js";
|
|
22
22
|
import {
|
|
23
23
|
isRbacEnabled,
|
|
24
24
|
can,
|
|
25
25
|
init_rbac
|
|
26
|
-
} from "./cli-
|
|
26
|
+
} from "./cli-4rvr7zfx.js";
|
|
27
27
|
import {
|
|
28
28
|
init_zod
|
|
29
29
|
} from "./cli-4chz1hye.js";
|
|
@@ -503,7 +503,7 @@ function route(def) {
|
|
|
503
503
|
try {
|
|
504
504
|
const rawBody = def.body ? await parseBody(req, def.maxBodyBytes) : undefined;
|
|
505
505
|
if (def.session && "bodyTaskIds" in def.session) {
|
|
506
|
-
const { bodySessionDenial } = await import("./session-access-
|
|
506
|
+
const { bodySessionDenial } = await import("./session-access-7f21ekq9.js");
|
|
507
507
|
const denial = await bodySessionDenial(req, def.session.bodyTaskIds(rawBody));
|
|
508
508
|
if (denial) {
|
|
509
509
|
jsonError(res, denial, 403);
|
|
@@ -7,20 +7,20 @@ import {
|
|
|
7
7
|
tierConfigKey,
|
|
8
8
|
init_model_tier_keys,
|
|
9
9
|
init_db3
|
|
10
|
-
} from "./cli-
|
|
10
|
+
} from "./cli-kxawjrxg.js";
|
|
11
11
|
import {
|
|
12
12
|
ensureRbacSeedsSynced2,
|
|
13
13
|
init_rbac_roles
|
|
14
|
-
} from "./cli-
|
|
14
|
+
} from "./cli-99xgw26r.js";
|
|
15
15
|
import {
|
|
16
16
|
seedPricingFromModelsDev
|
|
17
|
-
} from "./cli-
|
|
17
|
+
} from "./cli-fsdprwrg.js";
|
|
18
18
|
import {
|
|
19
19
|
MODEL_TIERS,
|
|
20
20
|
DEFAULT_MODEL_TIER_MAP,
|
|
21
21
|
ProviderNameSchema,
|
|
22
22
|
init_types
|
|
23
|
-
} from "./cli-
|
|
23
|
+
} from "./cli-mz9afxxf.js";
|
|
24
24
|
|
|
25
25
|
// src/be/boot-seeds.ts
|
|
26
26
|
init_db3();
|
|
@@ -2,17 +2,17 @@ import {
|
|
|
2
2
|
getKv2,
|
|
3
3
|
upsertKv2,
|
|
4
4
|
init_db3
|
|
5
|
-
} from "./cli-
|
|
5
|
+
} from "./cli-kxawjrxg.js";
|
|
6
6
|
import {
|
|
7
7
|
resolveIdentity,
|
|
8
8
|
recordUnmappedIdentity
|
|
9
|
-
} from "./cli-
|
|
9
|
+
} from "./cli-aecdcr77.js";
|
|
10
10
|
import {
|
|
11
11
|
findUserByExternalId,
|
|
12
12
|
findOrCreateUserByEmail,
|
|
13
13
|
linkIdentity,
|
|
14
14
|
init_users
|
|
15
|
-
} from "./cli-
|
|
15
|
+
} from "./cli-e8jyq7d8.js";
|
|
16
16
|
|
|
17
17
|
// src/slack/enrich.ts
|
|
18
18
|
init_db3();
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
import {
|
|
22
22
|
DEFAULT_MODEL_TIER_MAP,
|
|
23
23
|
init_types
|
|
24
|
-
} from "./cli-
|
|
24
|
+
} from "./cli-mz9afxxf.js";
|
|
25
25
|
import {
|
|
26
26
|
getOpenRouterBaseUrl,
|
|
27
27
|
getOpenRouterAttributionHeaders,
|
|
@@ -66,7 +66,7 @@ function addDshStepUsage(acc, step) {
|
|
|
66
66
|
// src/providers/dsh-adapter.ts
|
|
67
67
|
init_openrouter_base_url();
|
|
68
68
|
init_secret_scrubber();
|
|
69
|
-
var DSH_PACKAGE = "@deepseek-ai/dsh@0.2.1-rc.
|
|
69
|
+
var DSH_PACKAGE = "@deepseek-ai/dsh@0.2.1-rc.3";
|
|
70
70
|
function checkDshCredentials2(env) {
|
|
71
71
|
return env.DEEPSEEK_API_KEY?.trim() || env.OPENROUTER_API_KEY?.trim() ? { ready: true, missing: [], satisfiedBy: "env" } : {
|
|
72
72
|
ready: false,
|
|
@@ -317,10 +317,12 @@ var init_legacy_policy = __esm(() => {
|
|
|
317
317
|
"script.api.update": leadOnly,
|
|
318
318
|
"script.api.rotate": leadOnly,
|
|
319
319
|
"script.api.delete": leadOnly,
|
|
320
|
+
"schedule.deferral.update.any": leadOrResourceOwner,
|
|
320
321
|
"runtime_pool.write": operatorOrUser,
|
|
321
322
|
"runtime_pool.bind": leadOrOperatorOrUser,
|
|
322
323
|
"runtime_controller.write": operatorOrUser,
|
|
323
324
|
"agent.token.manage": operatorOrUser,
|
|
325
|
+
"user.role.manage": operatorOrUser,
|
|
324
326
|
"extension.write": extensionWrite,
|
|
325
327
|
"extension.activate": extensionActivation,
|
|
326
328
|
"extension.install.inline": leadOrOperatorOrUser
|
|
@@ -374,6 +376,10 @@ var init_permissions = __esm(() => {
|
|
|
374
376
|
description: "Mint, rotate, or revoke an agent-bound worker token.",
|
|
375
377
|
namespace: "agent"
|
|
376
378
|
},
|
|
379
|
+
"user.role.manage": {
|
|
380
|
+
description: "Assign or remove a person's RBAC roles.",
|
|
381
|
+
namespace: "user"
|
|
382
|
+
},
|
|
377
383
|
"task.cancel.any": {
|
|
378
384
|
description: "Cancel any task (beyond tasks the caller created).",
|
|
379
385
|
namespace: "task"
|
|
@@ -678,6 +684,10 @@ var init_permissions = __esm(() => {
|
|
|
678
684
|
description: "Delete an external script API endpoint.",
|
|
679
685
|
namespace: "script"
|
|
680
686
|
},
|
|
687
|
+
"schedule.deferral.update.any": {
|
|
688
|
+
description: "Change a defer-task schedule the caller did not create.",
|
|
689
|
+
namespace: "schedule"
|
|
690
|
+
},
|
|
681
691
|
"runtime_pool.write": {
|
|
682
692
|
description: "Create, update, or delete runtime pools (image, provider kind, placement).",
|
|
683
693
|
namespace: "runtime_pool"
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
import {
|
|
19
19
|
applyOpenRouterBaseUrlOverride2,
|
|
20
20
|
buildOpenAICompatibleProviderBlock2
|
|
21
|
-
} from "./cli-
|
|
21
|
+
} from "./cli-avdvgcay.js";
|
|
22
22
|
import {
|
|
23
23
|
fetchInstalledMcpServers
|
|
24
24
|
} from "./cli-bst1vp7e.js";
|
|
@@ -43,7 +43,7 @@ import {
|
|
|
43
43
|
import {
|
|
44
44
|
init_package,
|
|
45
45
|
package_default
|
|
46
|
-
} from "./cli-
|
|
46
|
+
} from "./cli-y561h5a9.js";
|
|
47
47
|
import {
|
|
48
48
|
scrubSecrets,
|
|
49
49
|
init_secret_scrubber
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getDb2,
|
|
3
3
|
getDbClient2,
|
|
4
|
+
invalidateTelemetryUserRole,
|
|
5
|
+
init_telemetry_identity,
|
|
4
6
|
init_db3
|
|
5
|
-
} from "./cli-
|
|
7
|
+
} from "./cli-kxawjrxg.js";
|
|
6
8
|
import {
|
|
7
9
|
PermissionVerbSchema,
|
|
8
10
|
init_rbac
|
|
9
|
-
} from "./cli-
|
|
11
|
+
} from "./cli-4rvr7zfx.js";
|
|
10
12
|
import {
|
|
11
13
|
init_env_flag
|
|
12
14
|
} from "./cli-cebvbc9t.js";
|
|
@@ -15,6 +17,16 @@ import {
|
|
|
15
17
|
} from "./cli-242037k3.js";
|
|
16
18
|
|
|
17
19
|
// src/be/rbac-roles.ts
|
|
20
|
+
function roleRowToUserRole(row) {
|
|
21
|
+
return {
|
|
22
|
+
id: row.id,
|
|
23
|
+
name: row.name,
|
|
24
|
+
description: row.description,
|
|
25
|
+
isBuiltin: row.isBuiltin === 1,
|
|
26
|
+
grantsAll: row.grantsAll === 1,
|
|
27
|
+
createdAt: row.createdAt
|
|
28
|
+
};
|
|
29
|
+
}
|
|
18
30
|
function validateBuiltinVerb(roleName, verb) {
|
|
19
31
|
const parsed = PermissionVerbSchema.safeParse(verb);
|
|
20
32
|
if (!parsed.success) {
|
|
@@ -69,6 +81,88 @@ async function getUserGrant2(userId) {
|
|
|
69
81
|
}
|
|
70
82
|
return { grantsAll: false, verbs };
|
|
71
83
|
}
|
|
84
|
+
async function listUserRoles2(userId) {
|
|
85
|
+
const rows = await getDbClient2().query(`SELECT r.id, r.name, r.description, r.isBuiltin, r.grantsAll, r.createdAt
|
|
86
|
+
FROM principal_roles pr
|
|
87
|
+
JOIN roles r ON r.id = pr.roleId
|
|
88
|
+
WHERE pr.principalType = 'user' AND pr.principalId = ?
|
|
89
|
+
ORDER BY r.name`, [userId]);
|
|
90
|
+
return rows.map(roleRowToUserRole);
|
|
91
|
+
}
|
|
92
|
+
async function listRbacRoles2() {
|
|
93
|
+
const client = getDbClient2();
|
|
94
|
+
const roles = await client.query("SELECT id, name, description, isBuiltin, grantsAll, createdAt FROM roles ORDER BY name");
|
|
95
|
+
const perms = await client.query("SELECT roleId, verb FROM role_permissions ORDER BY verb");
|
|
96
|
+
return roles.map((row) => ({
|
|
97
|
+
...roleRowToUserRole(row),
|
|
98
|
+
primary: PRIMARY_ROLE_NAMES2.includes(row.name),
|
|
99
|
+
verbs: perms.filter((p) => p.roleId === row.id).map((p) => p.verb)
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
async function assertNotLastAdmin2(userId) {
|
|
103
|
+
const client = getDbClient2();
|
|
104
|
+
const self = await client.get(`SELECT COUNT(*) AS n
|
|
105
|
+
FROM users u
|
|
106
|
+
JOIN principal_roles pr ON pr.principalType = 'user' AND pr.principalId = u.id
|
|
107
|
+
JOIN roles r ON r.id = pr.roleId AND r.grantsAll = 1
|
|
108
|
+
WHERE u.status = 'active' AND u.id = ?`, [userId]);
|
|
109
|
+
if ((self?.n ?? 0) === 0)
|
|
110
|
+
return;
|
|
111
|
+
const others = await client.get(`SELECT COUNT(DISTINCT u.id) AS n
|
|
112
|
+
FROM users u
|
|
113
|
+
JOIN principal_roles pr ON pr.principalType = 'user' AND pr.principalId = u.id
|
|
114
|
+
JOIN roles r ON r.id = pr.roleId AND r.grantsAll = 1
|
|
115
|
+
WHERE u.status = 'active' AND u.id <> ?`, [userId]);
|
|
116
|
+
if ((others?.n ?? 0) === 0)
|
|
117
|
+
throw new LastAdminError2;
|
|
118
|
+
}
|
|
119
|
+
async function setUserRoles2(userId, roleNames, actorUserId) {
|
|
120
|
+
const names = [...new Set(roleNames)];
|
|
121
|
+
if (names.filter((name) => PRIMARY_ROLE_NAMES2.includes(name)).length !== 1) {
|
|
122
|
+
throw new InvalidRoleSetError2(`Pick exactly one primary role: ${PRIMARY_ROLE_NAMES2.join(", ")}`);
|
|
123
|
+
}
|
|
124
|
+
return getDbClient2().transaction(async (tx) => {
|
|
125
|
+
const wanted = [];
|
|
126
|
+
for (const name of names) {
|
|
127
|
+
const row = await tx.get("SELECT id, name, grantsAll FROM roles WHERE name = ?", [name]);
|
|
128
|
+
if (!row)
|
|
129
|
+
throw new InvalidRoleSetError2(`Unknown role: ${name}`);
|
|
130
|
+
wanted.push(row);
|
|
131
|
+
}
|
|
132
|
+
const current = await tx.query(`SELECT r.id, r.name, r.grantsAll
|
|
133
|
+
FROM principal_roles pr JOIN roles r ON r.id = pr.roleId
|
|
134
|
+
WHERE pr.principalType = 'user' AND pr.principalId = ?
|
|
135
|
+
ORDER BY r.name`, [userId]);
|
|
136
|
+
const wantsAll = wanted.some((r) => r.grantsAll === 1);
|
|
137
|
+
if (current.some((r) => r.grantsAll === 1) && !wantsAll) {
|
|
138
|
+
const user = await tx.get("SELECT status FROM users WHERE id = ?", [
|
|
139
|
+
userId
|
|
140
|
+
]);
|
|
141
|
+
if (user?.status === "active") {
|
|
142
|
+
const others = await tx.get(`SELECT COUNT(DISTINCT u.id) AS n
|
|
143
|
+
FROM users u
|
|
144
|
+
JOIN principal_roles pr ON pr.principalType = 'user' AND pr.principalId = u.id
|
|
145
|
+
JOIN roles r ON r.id = pr.roleId AND r.grantsAll = 1
|
|
146
|
+
WHERE u.status = 'active' AND u.id <> ?`, [userId]);
|
|
147
|
+
if ((others?.n ?? 0) === 0)
|
|
148
|
+
throw new LastAdminError2;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const wantedIds = new Set(wanted.map((r) => r.id));
|
|
152
|
+
for (const row of current) {
|
|
153
|
+
if (!wantedIds.has(row.id)) {
|
|
154
|
+
await tx.run(`DELETE FROM principal_roles
|
|
155
|
+
WHERE principalType = 'user' AND principalId = ? AND roleId = ?`, [userId, row.id]);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
for (const row of wanted) {
|
|
159
|
+
await tx.run(`INSERT OR IGNORE INTO principal_roles (principalType, principalId, roleId, created_by)
|
|
160
|
+
VALUES ('user', ?, ?, ?)`, [userId, row.id, actorUserId]);
|
|
161
|
+
}
|
|
162
|
+
getDbClient2().afterCommit(() => invalidateTelemetryUserRole(userId));
|
|
163
|
+
return { before: current.map((r) => r.name), after: wanted.map((r) => r.name).sort() };
|
|
164
|
+
});
|
|
165
|
+
}
|
|
72
166
|
function ensureRbacSeedsSynced2(opts) {
|
|
73
167
|
const db = getDb2();
|
|
74
168
|
const desiredVerbsByRoleId = validatedBuiltinVerbSets();
|
|
@@ -145,7 +239,7 @@ function ensureRbacSeedsSynced2(opts) {
|
|
|
145
239
|
}
|
|
146
240
|
return stats;
|
|
147
241
|
}
|
|
148
|
-
var DEFAULT_ROLE_ID = "rbac-role-admin", BUILTIN_ROLES, CREATE_USER_DEFAULT_ROLE_TRIGGER_SQL = `
|
|
242
|
+
var DEFAULT_ROLE_ID = "rbac-role-admin", BUILTIN_ROLES, PRIMARY_ROLE_NAMES2, CREATE_USER_DEFAULT_ROLE_TRIGGER_SQL = `
|
|
149
243
|
CREATE TRIGGER IF NOT EXISTS trg_users_default_role
|
|
150
244
|
AFTER INSERT ON users
|
|
151
245
|
BEGIN
|
|
@@ -153,9 +247,10 @@ BEGIN
|
|
|
153
247
|
SELECT 'user', NEW.id, 'rbac-role-admin'
|
|
154
248
|
WHERE EXISTS (SELECT 1 FROM roles WHERE id = 'rbac-role-admin');
|
|
155
249
|
END;
|
|
156
|
-
`, loggedInvalidGrantVerbs;
|
|
250
|
+
`, loggedInvalidGrantVerbs, InvalidRoleSetError2, LastAdminError2;
|
|
157
251
|
var init_rbac_roles = __esm(() => {
|
|
158
252
|
init_rbac();
|
|
253
|
+
init_telemetry_identity();
|
|
159
254
|
init_env_flag();
|
|
160
255
|
init_db3();
|
|
161
256
|
BUILTIN_ROLES = [
|
|
@@ -183,9 +278,25 @@ var init_rbac_roles = __esm(() => {
|
|
|
183
278
|
"session.share",
|
|
184
279
|
"session.presence"
|
|
185
280
|
]
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
id: "rbac-role-viewer",
|
|
284
|
+
name: "viewer",
|
|
285
|
+
description: "Read-only: no task, approval or script writes.",
|
|
286
|
+
isBuiltin: true,
|
|
287
|
+
grantsAll: false,
|
|
288
|
+
verbs: ["favorite.write.own", "session.presence"]
|
|
186
289
|
}
|
|
187
290
|
];
|
|
291
|
+
PRIMARY_ROLE_NAMES2 = ["admin", "requester", "viewer"];
|
|
188
292
|
loggedInvalidGrantVerbs = new Set;
|
|
293
|
+
InvalidRoleSetError2 = class InvalidRoleSetError2 extends Error {
|
|
294
|
+
};
|
|
295
|
+
LastAdminError2 = class LastAdminError2 extends Error {
|
|
296
|
+
constructor() {
|
|
297
|
+
super("last_admin");
|
|
298
|
+
}
|
|
299
|
+
};
|
|
189
300
|
});
|
|
190
301
|
|
|
191
|
-
export { getUserGrant2, ensureRbacSeedsSynced2, init_rbac_roles };
|
|
302
|
+
export { PRIMARY_ROLE_NAMES2, getUserGrant2, listUserRoles2, listRbacRoles2, InvalidRoleSetError2, LastAdminError2, assertNotLastAdmin2, setUserRoles2, ensureRbacSeedsSynced2, init_rbac_roles };
|