@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.
Files changed (197) hide show
  1. package/dist/{acp-adapter-7g6bpwbk.js → acp-adapter-gr2fcyyj.js} +3 -3
  2. package/dist/{actions-w8xd014k.js → actions-wv766ghf.js} +18 -18
  3. package/dist/{amp-adapter-z4qvhacj.js → amp-adapter-speb906t.js} +3 -3
  4. package/dist/{app-nndcvftq.js → app-ag29n14f.js} +3 -3
  5. package/dist/{assistant-hjmqyscx.js → assistant-3x8bz3eg.js} +19 -19
  6. package/dist/{boot-reembed-r8rhf9h8.js → boot-reembed-5b3d2eea.js} +1 -1
  7. package/dist/{boot-reembed-vwcj2y5d.js → boot-reembed-jsmfrpzf.js} +1 -1
  8. package/dist/{boot-scrub-sweep-fr9q36ne.js → boot-scrub-sweep-s73gerxy.js} +2 -2
  9. package/dist/{boot-seeds-9jqwnegq.js → boot-seeds-5zmax2wr.js} +4 -4
  10. package/dist/{claude-adapter-2f8b85df.js → claude-adapter-hswdnm3t.js} +3 -3
  11. package/dist/{claude-managed-adapter-gt6pa35d.js → claude-managed-adapter-cvbzj1h6.js} +2 -2
  12. package/dist/{claude-managed-setup-c3hp36ph.js → claude-managed-setup-3k8m3hhc.js} +2 -2
  13. package/dist/{claude-sdk-session-05kat8rv.js → claude-sdk-session-fkbyk66x.js} +6905 -6855
  14. package/dist/{cli-y3zyaee5.js → cli-1fc85mvt.js} +5 -5
  15. package/dist/{cli-v2g93k4v.js → cli-210xd1f4.js} +4 -4
  16. package/dist/{cli-sn1vbtg2.js → cli-25j01dpj.js} +3 -3
  17. package/dist/{cli-n6kmqngw.js → cli-35gtk1p6.js} +1 -1
  18. package/dist/{cli-r9fy0ddc.js → cli-3ngdk5te.js} +1 -1
  19. package/dist/{cli-z63a269p.js → cli-40jsnrjm.js} +2 -2
  20. package/dist/{cli-ba8ne1es.js → cli-4rvr7zfx.js} +10 -0
  21. package/dist/{cli-qfm6my86.js → cli-502eqv93.js} +1 -1
  22. package/dist/{cli-xd4eqtr2.js → cli-6n8axjv1.js} +1 -1
  23. package/dist/{cli-hadv0725.js → cli-8s5wx3nz.js} +2 -2
  24. package/dist/{cli-z2dv25mf.js → cli-99xgw26r.js} +116 -5
  25. package/dist/{cli-jpxsrxcb.js → cli-9s05422w.js} +1 -1
  26. package/dist/{cli-kcsd1ez8.js → cli-aecdcr77.js} +343 -325
  27. package/dist/{cli-w9etnnxk.js → cli-bf8ma3f1.js} +120 -50
  28. package/dist/{cli-e9btqw4y.js → cli-ce0ak9ms.js} +18 -13
  29. package/dist/{cli-nj12tn2c.js → cli-e2ar4bp1.js} +71 -20
  30. package/dist/{cli-gwcf52gz.js → cli-e8jyq7d8.js} +11 -7
  31. package/dist/{cli-rngde2jv.js → cli-egjggehm.js} +1 -1
  32. package/dist/{cli-qfjm4gvt.js → cli-ewm3pwbq.js} +2 -2
  33. package/dist/{cli-9mm5ade4.js → cli-fsdprwrg.js} +1 -1
  34. package/dist/{cli-3ee5z0q0.js → cli-fzcn3d87.js} +1 -1
  35. package/dist/{cli-eym3jg7w.js → cli-gpsz7g88.js} +6 -6
  36. package/dist/{cli-cwyafhw1.js → cli-hcpj2xqz.js} +1 -1
  37. package/dist/{cli-j1eghqfm.js → cli-hhxjnjzs.js} +1 -1
  38. package/dist/{cli-pyy4c9ch.js → cli-jjznk3f7.js} +881 -232
  39. package/dist/{cli-q9pzwxvk.js → cli-kxawjrxg.js} +222 -37
  40. package/dist/{cli-rh5smt8t.js → cli-mz9afxxf.js} +14 -3
  41. package/dist/{cli-mz2ygeyq.js → cli-n45mr7zh.js} +2 -2
  42. package/dist/{cli-fes51ya2.js → cli-p0rzjkya.js} +2 -2
  43. package/dist/{cli-3qv8naq8.js → cli-p6zs9h4y.js} +827 -107
  44. package/dist/{cli-mq7kg1b1.js → cli-p9rafdrb.js} +41 -6
  45. package/dist/{cli-cah5detr.js → cli-qgf8emrn.js} +5 -5
  46. package/dist/{cli-2wba1ac9.js → cli-qzme5949.js} +26 -26
  47. package/dist/{cli-znvq0k3t.js → cli-s49hpn37.js} +2 -2
  48. package/dist/{cli-xc65x52q.js → cli-s53vp709.js} +1 -1
  49. package/dist/{cli-0jy85zz4.js → cli-svrj71pg.js} +18 -16
  50. package/dist/{cli-1dp1zj04.js → cli-vwn81jbs.js} +3 -3
  51. package/dist/{cli-ajqhxtnz.js → cli-w1zwctj2.js} +1 -1
  52. package/dist/{cli-22rmcjkg.js → cli-y561h5a9.js} +7 -6
  53. package/dist/{cli-2jg61wab.js → cli-z21whrrg.js} +15 -15
  54. package/dist/cli.js +19 -18
  55. package/dist/{codex-adapter-p4ptwar5.js → codex-adapter-n8ka66vf.js} +2 -2
  56. package/dist/{codex-session-runner-964c7dnk.js → codex-session-runner-fsebts37.js} +1 -1
  57. package/dist/{commands-mbvhbrcy.js → commands-t04rt2pc.js} +2 -2
  58. package/dist/{controller-gnq1k1mf.js → controller-rgna04r2.js} +2 -2
  59. package/dist/{controllers-connect-6dkm71tg.js → controllers-connect-bqm1rtft.js} +20 -20
  60. package/dist/{cursor-adapter-yq5xgfcg.js → cursor-adapter-swr2k95y.js} +1 -1
  61. package/dist/{db-88wcymxt.js → db-24ck09xy.js} +1 -1
  62. package/dist/{db-af9y8nkf.js → db-a4m7haw0.js} +3 -3
  63. package/dist/{dispatcher-606ydx5v.js → dispatcher-nwf9ss0q.js} +17 -17
  64. package/dist/{dsh-adapter-tvhc4k2d.js → dsh-adapter-kpdnhjst.js} +2 -2
  65. package/dist/{external-channel-y8q5z8z2.js → external-channel-j1e2p34p.js} +2 -2
  66. package/dist/{grok-adapter-39aha52t.js → grok-adapter-qtjz0whk.js} +4 -4
  67. package/dist/{handlers-rk9dqech.js → handlers-19xr6dnz.js} +20 -20
  68. package/dist/{heartbeat-jfe9zfjr.js → heartbeat-vtesda5d.js} +20 -20
  69. package/dist/{hook-b1mez1m8.js → hook-8wqaszda.js} +1 -1
  70. package/dist/{hook-ffevzed1.js → hook-b2hhj6rd.js} +1 -1
  71. package/dist/{http-d5b44f1r.js → http-mxcqhhcs.js} +3020 -2463
  72. package/dist/{index-5en23s5z.js → index-1r8wfpzs.js} +1 -1
  73. package/dist/{index-cbxkmfc5.js → index-9pn1pfkf.js} +1 -1
  74. package/dist/{index-mj46rk9k.js → index-kw2mmat7.js} +20 -20
  75. package/dist/{index-nq8hhv28.js → index-n1vbvta9.js} +19 -10
  76. package/dist/{index-6srwvd5b.js → index-p4xfz37z.js} +1 -1
  77. package/dist/{index-d2qeem97.js → index-spwxjgay.js} +17 -17
  78. package/dist/{index-4q3vj1yr.js → index-srg522m6.js} +17 -17
  79. package/dist/{keepalive-wsby1btq.js → keepalive-dsd8rtgx.js} +3 -3
  80. package/dist/{lead-paa141j6.js → lead-zyerk1x2.js} +30 -30
  81. package/dist/{maintenance-vnshcyv9.js → maintenance-jqmqwnet.js} +1 -1
  82. package/dist/{oauth-refresh-sweep-d6sqn5np.js → oauth-refresh-sweep-q2c3bnvm.js} +2 -2
  83. package/dist/{onboard-nr4xhpzy.js → onboard-w4yd7s8t.js} +2 -2
  84. package/dist/{opencode-adapter-e56086m1.js → opencode-adapter-9tppvxar.js} +2 -2
  85. package/dist/{otel-impl-ytn9wyv9.js → otel-impl-f36byzbd.js} +1 -1
  86. package/dist/{pricing-refresh-pva04zee.js → pricing-refresh-xvak5p4v.js} +3 -3
  87. package/dist/{rbac-roles-7rc1q3g4.js → rbac-roles-682k2mt5.js} +12 -2
  88. package/dist/rbac-roles-gfn30fb8.js +26 -0
  89. package/dist/{render-v2-pyfsg9zk.js → render-v2-hgytz8nn.js} +3 -3
  90. package/dist/{resume-phj8xhqr.js → resume-2dvq348g.js} +7 -5
  91. package/dist/{session-access-jzx2z9h5.js → session-access-7f21ekq9.js} +4 -4
  92. package/dist/{setup-rfg0f0sg.js → setup-epffxtbk.js} +1 -1
  93. package/dist/{work-objects-44z2yjg8.js → work-objects-xz1a5rqk.js} +20 -20
  94. package/dist/{worker-zsfqzxhm.js → worker-42t8emjt.js} +30 -30
  95. package/openapi.json +3163 -2114
  96. package/package.json +7 -6
  97. package/src/be/approval-config-question.ts +389 -0
  98. package/src/be/automation-preflight.ts +37 -3
  99. package/src/be/db/session-tree.ts +158 -13
  100. package/src/be/db/session-visibility.ts +31 -0
  101. package/src/be/db/skill-search.ts +87 -0
  102. package/src/be/db/tasks/read.ts +47 -7
  103. package/src/be/db/workflow-runs.ts +54 -7
  104. package/src/be/db.ts +27 -5
  105. package/src/be/migrations/233_script_run_session_tokens.sql +8 -0
  106. package/src/be/migrations/235_chat_relay_defer.sql +86 -0
  107. package/src/be/migrations/237_session_inbox_cleanup.sql +75 -0
  108. package/src/be/migrations/239_skills_fts.sql +40 -0
  109. package/src/be/migrations/240_workflow_run_parent_step_attempt.sql +37 -0
  110. package/src/be/migrations/241_skills_meta_fts.sql +39 -0
  111. package/src/be/rbac-roles.ts +138 -0
  112. package/src/be/scripts/run-credential.ts +64 -0
  113. package/src/be/scripts/run-saved.ts +3 -2
  114. package/src/be/swarm-config-guard.ts +23 -0
  115. package/src/be/users.ts +28 -4
  116. package/src/extensions/catalog.generated.json +4 -4
  117. package/src/http/all-routes.ts +1 -0
  118. package/src/http/approval-requests.ts +254 -43
  119. package/src/http/config.ts +22 -37
  120. package/src/http/index.ts +2 -0
  121. package/src/http/schedules.ts +26 -0
  122. package/src/http/scripts.ts +2 -2
  123. package/src/http/sessions.ts +118 -2
  124. package/src/http/user-roles.ts +173 -0
  125. package/src/http/users.ts +9 -0
  126. package/src/http/x.ts +2 -2
  127. package/src/integrations/chat-sdk/commands.ts +14 -1
  128. package/src/integrations/chat-sdk/inbound.ts +42 -6
  129. package/src/integrations/chat-sdk/outbound.ts +35 -10
  130. package/src/integrations/chat-sdk/reactions.ts +107 -0
  131. package/src/integrations/chat-sdk/relay.ts +75 -7
  132. package/src/integrations/chat-sdk/thread-buffer.ts +2 -0
  133. package/src/integrations/reaction-events.ts +20 -0
  134. package/src/providers/amp-adapter.ts +1 -1
  135. package/src/providers/dsh-adapter.ts +1 -1
  136. package/src/rbac/legacy-policy.ts +3 -0
  137. package/src/rbac/permissions.ts +8 -0
  138. package/src/scheduler/schedule-task.ts +44 -3
  139. package/src/scheduler/scheduler.ts +4 -4
  140. package/src/scripts-runtime/loader.ts +8 -1
  141. package/src/slack/ack.ts +2 -1
  142. package/src/slack/reaction-shortcode.ts +4 -7
  143. package/src/tasks/worker-follow-up.ts +30 -0
  144. package/src/tests/approval-config-question.test.ts +702 -0
  145. package/src/tests/approval-requests-notifications.test.ts +189 -0
  146. package/src/tests/chat-sdk-commands.test.ts +12 -0
  147. package/src/tests/chat-sdk-inbound.test.ts +183 -9
  148. package/src/tests/chat-sdk-outbound-files.test.ts +9 -2
  149. package/src/tests/chat-sdk-relay.test.ts +361 -10
  150. package/src/tests/chat-sdk-tools.test.ts +104 -0
  151. package/src/tests/docs-index-footprint.test.js +3 -3
  152. package/src/tests/dsh-adapter.test.ts +1 -1
  153. package/src/tests/entrypoint-gitlab-credential-helper.test.ts +273 -0
  154. package/src/tests/extensions-example-comms-adherence-gate.test.ts +321 -12
  155. package/src/tests/http-users.test.ts +38 -0
  156. package/src/tests/list-endpoint-slimming.test.ts +33 -0
  157. package/src/tests/migration-237-session-inbox-cleanup.test.ts +136 -0
  158. package/src/tests/migration-240-workflow-run-parent-step-attempt.test.ts +55 -0
  159. package/src/tests/rbac-engine.test.ts +2 -0
  160. package/src/tests/rbac-roles.test.ts +10 -0
  161. package/src/tests/schedule-http-triage-tools.test.ts +44 -0
  162. package/src/tests/script-api-credential.test.ts +173 -0
  163. package/src/tests/script-connections.test.ts +10 -0
  164. package/src/tests/script-run-config-scope.test.ts +120 -0
  165. package/src/tests/script-run-token.test.ts +75 -0
  166. package/src/tests/scripts-http.test.ts +19 -0
  167. package/src/tests/sessions-tree.test.ts +410 -1
  168. package/src/tests/skill-search-long-content.test.ts +193 -0
  169. package/src/tests/skill-search.test.ts +173 -22
  170. package/src/tests/user-roles-http.test.ts +204 -0
  171. package/src/tests/workflow-hitl-dynamic-questions.test.ts +1 -1
  172. package/src/tests/workflow-sub-workflow.test.ts +538 -1
  173. package/src/tools/chat-reply.ts +2 -0
  174. package/src/tools/request-human-input.ts +27 -5
  175. package/src/tools/schedules/patch-schedule.ts +18 -0
  176. package/src/tools/schedules/update-schedule.ts +18 -0
  177. package/src/types.ts +23 -0
  178. package/src/workflows/approval-notifications.ts +221 -0
  179. package/src/workflows/checkpoint.ts +69 -35
  180. package/src/workflows/engine.ts +234 -87
  181. package/src/workflows/executors/base.ts +6 -0
  182. package/src/workflows/executors/human-in-the-loop.ts +36 -173
  183. package/src/workflows/executors/sub-workflow.ts +45 -16
  184. package/src/workflows/executors/swarm-script.ts +2 -2
  185. package/src/workflows/recovery.ts +63 -1
  186. package/src/workflows/resume.ts +60 -21
  187. package/src/workflows/retry-poller.ts +25 -4
  188. package/templates/extensions/comms-adherence-gate/README.md +38 -13
  189. package/templates/extensions/comms-adherence-gate/hooks.ts +272 -69
  190. package/templates/extensions/comms-adherence-gate/manifest.json +2 -2
  191. package/templates/schedules/weekly-harness-upgrade-check/content.md +1 -1
  192. package/templates/skills/code-quality/content.md +1 -1
  193. package/templates/skills/turso-interaction/content.md +1 -1
  194. package/templates/skills/workflow-iterate/content.md +8 -1
  195. package/dist/rbac-roles-ff1ffmec.js +0 -12
  196. /package/dist/{cli-stxdrqs2.js → cli-avdvgcay.js} +0 -0
  197. /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-q9pzwxvk.js";
12
+ } from "./cli-kxawjrxg.js";
13
13
  import {
14
14
  getUserGrant2,
15
15
  init_rbac_roles
16
- } from "./cli-z2dv25mf.js";
16
+ } from "./cli-99xgw26r.js";
17
17
  import {
18
18
  findUserById,
19
19
  findUserByExternalId,
20
20
  init_users
21
- } from "./cli-gwcf52gz.js";
21
+ } from "./cli-e8jyq7d8.js";
22
22
  import {
23
23
  isRbacEnabled,
24
24
  can,
25
25
  init_rbac
26
- } from "./cli-ba8ne1es.js";
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-jzx2z9h5.js");
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-q9pzwxvk.js";
10
+ } from "./cli-kxawjrxg.js";
11
11
  import {
12
12
  ensureRbacSeedsSynced2,
13
13
  init_rbac_roles
14
- } from "./cli-z2dv25mf.js";
14
+ } from "./cli-99xgw26r.js";
15
15
  import {
16
16
  seedPricingFromModelsDev
17
- } from "./cli-9mm5ade4.js";
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-rh5smt8t.js";
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-q9pzwxvk.js";
5
+ } from "./cli-kxawjrxg.js";
6
6
  import {
7
7
  resolveIdentity,
8
8
  recordUnmappedIdentity
9
- } from "./cli-kcsd1ez8.js";
9
+ } from "./cli-aecdcr77.js";
10
10
  import {
11
11
  findUserByExternalId,
12
12
  findOrCreateUserByEmail,
13
13
  linkIdentity,
14
14
  init_users
15
- } from "./cli-gwcf52gz.js";
15
+ } from "./cli-e8jyq7d8.js";
16
16
 
17
17
  // src/slack/enrich.ts
18
18
  init_db3();
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Anthropic
3
- } from "./cli-3qv8naq8.js";
3
+ } from "./cli-p6zs9h4y.js";
4
4
  import {
5
5
  checkToolLoop
6
6
  } from "./cli-0726awxw.js";
@@ -6,7 +6,7 @@ import {
6
6
  getResolvedConfig2,
7
7
  getAllUsers2,
8
8
  init_db3
9
- } from "./cli-q9pzwxvk.js";
9
+ } from "./cli-kxawjrxg.js";
10
10
  import {
11
11
  scrubSecrets,
12
12
  init_secret_scrubber
@@ -21,7 +21,7 @@ import {
21
21
  import {
22
22
  DEFAULT_MODEL_TIER_MAP,
23
23
  init_types
24
- } from "./cli-rh5smt8t.js";
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.2";
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"
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  init_package,
3
3
  package_default
4
- } from "./cli-22rmcjkg.js";
4
+ } from "./cli-y561h5a9.js";
5
5
 
6
6
  // src/commands/shared/client-config.ts
7
7
  init_package();
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  RuntimeProviderKindSchema,
3
3
  init_types
4
- } from "./cli-rh5smt8t.js";
4
+ } from "./cli-mz9afxxf.js";
5
5
  import {
6
6
  init_zod
7
7
  } from "./cli-4chz1hye.js";
@@ -18,7 +18,7 @@ import {
18
18
  import {
19
19
  applyOpenRouterBaseUrlOverride2,
20
20
  buildOpenAICompatibleProviderBlock2
21
- } from "./cli-stxdrqs2.js";
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-22rmcjkg.js";
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-q9pzwxvk.js";
7
+ } from "./cli-kxawjrxg.js";
6
8
  import {
7
9
  PermissionVerbSchema,
8
10
  init_rbac
9
- } from "./cli-ba8ne1es.js";
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 };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DEFAULT_MODEL_TIER_MAP,
3
3
  init_types
4
- } from "./cli-rh5smt8t.js";
4
+ } from "./cli-mz9afxxf.js";
5
5
 
6
6
  // src/utils/amp-models.ts
7
7
  init_types();