@desplega.ai/agent-swarm 2.4.0 → 2.4.2

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 (239) hide show
  1. package/README.md +1 -1
  2. package/dist/{acp-adapter-kedstxx6.js → acp-adapter-dv7hmx4r.js} +9 -9
  3. package/dist/{actions-vget6r1k.js → actions-51nc1gny.js} +21 -21
  4. package/dist/{amp-adapter-xeb5mktv.js → amp-adapter-abp5tdx8.js} +4 -4
  5. package/dist/{app-mqap8t8m.js → app-9h14qvr6.js} +3 -3
  6. package/dist/{assistant-h0gv97mv.js → assistant-wv1gz3mt.js} +22 -22
  7. package/dist/{boot-reembed-qr8a894z.js → boot-reembed-6yn53ms9.js} +1 -1
  8. package/dist/{boot-reembed-rj85jjhw.js → boot-reembed-7fcka4z5.js} +1 -1
  9. package/dist/{boot-scrub-sweep-eyfvn6v9.js → boot-scrub-sweep-pm1580ax.js} +4 -4
  10. package/dist/{boot-seeds-xs9a8dx1.js → boot-seeds-g5hfc1x8.js} +4 -4
  11. package/dist/{claude-adapter-bm23cye7.js → claude-adapter-gf3kxhf0.js} +9 -9
  12. package/dist/{claude-managed-adapter-1mwrsm9d.js → claude-managed-adapter-h2y889ge.js} +2 -2
  13. package/dist/{claude-managed-setup-gkfgks4j.js → claude-managed-setup-h00hsgtz.js} +2 -2
  14. package/dist/{claude-sdk-session-apb4ypz3.js → claude-sdk-session-s2k1qd8y.js} +13 -13
  15. package/dist/{cli-tj4j2ts4.js → cli-02qm7src.js} +8 -8
  16. package/dist/{cli-1cevz46c.js → cli-0qvtffe9.js} +6 -6
  17. package/dist/{cli-avmqhatn.js → cli-10hhg0km.js} +8 -8
  18. package/dist/{cli-7gh7020n.js → cli-1dmcq2eh.js} +1 -1
  19. package/dist/{cli-kz116kvw.js → cli-239yjk27.js} +7 -7
  20. package/dist/{cli-7ayprxp7.js → cli-2dfbv8qr.js} +8 -0
  21. package/dist/{cli-a49vpbf3.js → cli-5kqnemen.js} +1 -1
  22. package/dist/{cli-x719j3vs.js → cli-5rk36sjf.js} +442 -205
  23. package/dist/{cli-fb6t92v8.js → cli-6x9ma5w5.js} +1 -1
  24. package/dist/{cli-c8fwpgqb.js → cli-7225gwj7.js} +2 -2
  25. package/dist/{cli-5s5hx57y.js → cli-7awf1fp8.js} +1 -1
  26. package/dist/{cli-bn26xbcs.js → cli-8nyhf7za.js} +1 -1
  27. package/dist/{cli-ywyrffff.js → cli-8sxqsbbq.js} +1 -1
  28. package/dist/{cli-rsd7ga7v.js → cli-8zwe9mpk.js} +11 -11
  29. package/dist/{cli-y83zk5sb.js → cli-a0kcty51.js} +4 -4
  30. package/dist/{cli-8b9wvjps.js → cli-a4gvwttf.js} +4 -4
  31. package/dist/{cli-jhp7w1fy.js → cli-a5ebc95n.js} +2 -2
  32. package/dist/{cli-mvg2hf8p.js → cli-ahtpy9kf.js} +14 -7
  33. package/dist/{cli-x1p5dhq2.js → cli-bcj753sq.js} +3 -3
  34. package/dist/{cli-p22zdvnt.js → cli-bn0rewsy.js} +3 -3
  35. package/dist/{cli-p1m2b6gc.js → cli-d2mb5s8a.js} +7 -7
  36. package/dist/{cli-rg7ntypm.js → cli-d3qqdy4c.js} +456 -94
  37. package/dist/{cli-c5sbmw1v.js → cli-d82btycs.js} +94 -15
  38. package/dist/{cli-02vhhssk.js → cli-efaqv1c7.js} +5 -5
  39. package/dist/{cli-vjfpshn3.js → cli-ejs3m1sx.js} +1 -1
  40. package/dist/{cli-kk2r80n5.js → cli-faypxz7q.js} +4 -4
  41. package/dist/{cli-a1esmmee.js → cli-fpmsqq59.js} +7 -2
  42. package/dist/{cli-wrv09v7q.js → cli-ftyypbg5.js} +1 -1
  43. package/dist/{cli-zvze9rbm.js → cli-fyzjmseb.js} +3 -3
  44. package/dist/{cli-8rwvksbc.js → cli-g0hgtz4p.js} +5 -5
  45. package/dist/{cli-nrrg0fvy.js → cli-h38rjv87.js} +133 -12
  46. package/dist/{cli-tg9ksbn8.js → cli-h93c9vb3.js} +2 -2
  47. package/dist/{cli-eqgfs202.js → cli-hqhzg1qq.js} +2 -2
  48. package/dist/{cli-bhwa8rzc.js → cli-hyfw2j1e.js} +13 -12
  49. package/dist/{cli-3wjs22x3.js → cli-j4rqdf2n.js} +2 -2
  50. package/dist/{cli-6ftrrwm1.js → cli-n85dqg6d.js} +5 -5
  51. package/dist/{cli-8cxkw1f5.js → cli-nmqdc2t3.js} +2 -2
  52. package/dist/{cli-4fhyq711.js → cli-nn47d7e8.js} +13 -13
  53. package/dist/{cli-x3en6ct3.js → cli-nwyw3zhg.js} +1 -1
  54. package/dist/{cli-3avfh5az.js → cli-pemywhfq.js} +2 -2
  55. package/dist/{cli-xfe63zx3.js → cli-pkht5hap.js} +2 -2
  56. package/dist/{cli-sppc0cmw.js → cli-pnp2j5zg.js} +2 -2
  57. package/dist/{cli-wk8ccrz6.js → cli-pw7v69vp.js} +2 -2
  58. package/dist/{cli-tgvpmnwz.js → cli-r99kc9yq.js} +5 -5
  59. package/dist/{cli-bfc3k1x5.js → cli-rdyw3mct.js} +9 -9
  60. package/dist/{cli-b80a1100.js → cli-s6vr7r2d.js} +2 -2
  61. package/dist/{cli-zv4vy2b0.js → cli-s95dknxh.js} +1 -1
  62. package/dist/{cli-ttaz6c7m.js → cli-saw9a6f6.js} +6 -5
  63. package/dist/{cli-mz1ezzzh.js → cli-shvfedvm.js} +3 -3
  64. package/dist/{cli-rdr166ht.js → cli-smvcw9z5.js} +1 -1
  65. package/dist/{cli-2rwet3r7.js → cli-sv5gb0yb.js} +1 -1
  66. package/dist/{cli-5ff2sjyt.js → cli-t30yj95q.js} +2 -2
  67. package/dist/{cli-ptkpaqfy.js → cli-wt645v7q.js} +1 -1
  68. package/dist/{cli-f3nx1h8z.js → cli-wxbn3yfx.js} +2 -2
  69. package/dist/{cli-wyrr38xm.js → cli-x5mq1fyq.js} +1 -1
  70. package/dist/{cli-ccn0eybf.js → cli-xbzvet96.js} +6 -6
  71. package/dist/{cli-4mkvwgzr.js → cli-xf234ws8.js} +1 -1
  72. package/dist/{cli-nme7wery.js → cli-y2x52gs2.js} +46 -13
  73. package/dist/{cli-ffbrkh1r.js → cli-y8n5k515.js} +46 -38
  74. package/dist/{cli-ecshf504.js → cli-z4wd2ftv.js} +7 -7
  75. package/dist/{cli-dsgj3e7a.js → cli-zfg9enh9.js} +2 -2
  76. package/dist/{cli-yxqag76b.js → cli-zw88zjba.js} +1 -1
  77. package/dist/cli.js +20 -20
  78. package/dist/{codex-adapter-pp2gq8gr.js → codex-adapter-ttygw382.js} +6 -6
  79. package/dist/{codex-hook-qwzccd64.js → codex-hook-x7nejyrr.js} +7 -4
  80. package/dist/{codex-login-35p4sk85.js → codex-login-m819c41r.js} +1 -1
  81. package/dist/{codex-session-runner-0vzn09t8.js → codex-session-runner-60b58vv3.js} +7 -7
  82. package/dist/{commands-psqhkttb.js → commands-edmdwa4x.js} +2 -2
  83. package/dist/{controller-t20vz2k8.js → controller-m263fg43.js} +4 -4
  84. package/dist/{controllers-connect-gkxmqw9d.js → controllers-connect-5fym8sw1.js} +23 -23
  85. package/dist/{cursor-adapter-3v542qe5.js → cursor-adapter-cz6nm6mj.js} +3 -3
  86. package/dist/{db-nc1rd869.js → db-2y0mgstc.js} +3 -3
  87. package/dist/{db-2xbyenjr.js → db-nn0hcmx5.js} +6 -2
  88. package/dist/{devin-adapter-7egzmt0k.js → devin-adapter-zgqadvnm.js} +1 -1
  89. package/dist/{dispatcher-ewceb8ts.js → dispatcher-0a9wwjcx.js} +20 -20
  90. package/dist/{docker-njavd3fb.js → docker-fkgtr75t.js} +2 -2
  91. package/dist/{dsh-adapter-75xwh78t.js → dsh-adapter-3n3net33.js} +3 -3
  92. package/dist/{e2b-5r6a5jeb.js → e2b-7am6tmq6.js} +2 -2
  93. package/dist/{e2b-pw1nvtmh.js → e2b-thdcxtjd.js} +2 -2
  94. package/dist/{easter-egg-3d-xsc47jwf.js → easter-egg-3d-5cgynaja.js} +1 -1
  95. package/dist/{event-bus-101fenkh.js → event-bus-9vpk8gmq.js} +1 -1
  96. package/dist/{execute-gzmw1mnw.js → execute-t4e6m3rw.js} +1 -1
  97. package/dist/{external-channel-a5dsmxn4.js → external-channel-zhvt95n3.js} +2 -2
  98. package/dist/{grok-adapter-vj88xr23.js → grok-adapter-qnr1hp2y.js} +10 -10
  99. package/dist/handlers-dkcarkd0.js +39 -0
  100. package/dist/{heartbeat-t2m9r3wa.js → heartbeat-gz97r7ac.js} +23 -23
  101. package/dist/{hook-xa677f8r.js → hook-1mmdgjqs.js} +16 -9
  102. package/dist/{hook-8femx1bg.js → hook-x8rthca4.js} +6 -6
  103. package/dist/{http-xpmmq028.js → http-r8f85xr9.js} +274 -160
  104. package/dist/index-5jecgp3n.js +41 -0
  105. package/dist/index-aex0eba9.js +40 -0
  106. package/dist/{index-syztqdt6.js → index-g6tbb6ve.js} +1 -1
  107. package/dist/{index-cdzyfrsp.js → index-smxyk04s.js} +1 -1
  108. package/dist/{index-dg2tmj99.js → index-vzvfqzfj.js} +20 -20
  109. package/dist/{index-s7ckdajq.js → index-y7rbcrc1.js} +10 -10
  110. package/dist/{keepalive-3nr4st3r.js → keepalive-64c0f34c.js} +4 -4
  111. package/dist/lead-b1da0f97.js +78 -0
  112. package/dist/{maintenance-verwpe2c.js → maintenance-mnxpar12.js} +1 -1
  113. package/dist/{oauth-refresh-sweep-9q2t0y3q.js → oauth-refresh-sweep-36hs2v4h.js} +3 -3
  114. package/dist/{onboard-aytqedmq.js → onboard-xes8de61.js} +3 -3
  115. package/dist/{opencode-adapter-f4hryjny.js → opencode-adapter-3s7ax02e.js} +7 -7
  116. package/dist/{otel-impl-hckw4wt1.js → otel-impl-fzc57kcq.js} +2 -2
  117. package/dist/{pi-mono-adapter-hxby0ce1.js → pi-mono-adapter-ytp7gz8b.js} +22 -11
  118. package/dist/{pricing-refresh-5nvme3sm.js → pricing-refresh-1nek2w7b.js} +3 -3
  119. package/dist/{rbac-roles-vbpy21mg.js → rbac-roles-sqefb5hw.js} +2 -2
  120. package/dist/{rbac-roles-pd8c26m1.js → rbac-roles-ttyfaep2.js} +1 -1
  121. package/dist/{render-v2-7nqgvk2q.js → render-v2-vb527jwn.js} +3 -3
  122. package/dist/{resume-b6djcj3c.js → resume-jcdzg1bn.js} +10 -8
  123. package/dist/{runtime-txrxc9za.js → runtime-xe3aqy4x.js} +1 -1
  124. package/dist/{session-access-fc3f9y12.js → session-access-zsp4wsp0.js} +4 -4
  125. package/dist/{setup-n39szm6b.js → setup-1nb2zqd3.js} +1 -1
  126. package/dist/{virtual-modules-wyp2k6z3.js → virtual-modules-4r3zkc20.js} +2 -2
  127. package/dist/{work-objects-jem2fre0.js → work-objects-61w08fwr.js} +23 -23
  128. package/dist/worker-c1e68hpa.js +78 -0
  129. package/dist/{x-8ewt8gxn.js → x-y45mthwn.js} +2 -2
  130. package/openapi.json +491 -52
  131. package/package.json +3 -3
  132. package/src/apps/action-runner.ts +146 -0
  133. package/src/apps/catalog.generated.json +3 -2
  134. package/src/apps/definition.ts +152 -4
  135. package/src/apps/row-store.ts +23 -9
  136. package/src/apps/schema-migrate.ts +14 -6
  137. package/src/apps/script-types.ts +2 -1
  138. package/src/apps/sync.ts +20 -19
  139. package/src/be/db/tasks/read.ts +112 -0
  140. package/src/be/db.ts +16 -4
  141. package/src/be/fleet-benchmark-stats.ts +10 -5
  142. package/src/be/models-catalog.ts +4 -0
  143. package/src/be/onboarding.ts +6 -0
  144. package/src/be/scripts/typecheck.ts +13 -0
  145. package/src/be/swarm-config-guard.ts +25 -1
  146. package/src/be/telemetry-enable.ts +1 -1
  147. package/src/commands/provider-credentials.ts +12 -2
  148. package/src/commands/runner.ts +3 -0
  149. package/src/heartbeat/heartbeat.ts +2 -2
  150. package/src/hooks/codex-hook.ts +6 -2
  151. package/src/hooks/hook.ts +7 -0
  152. package/src/hooks/pr-body-guard.ts +38 -11
  153. package/src/hooks/pr-room-guard.ts +88 -0
  154. package/src/http/agents.ts +1 -0
  155. package/src/http/apps.ts +99 -183
  156. package/src/http/fleet-benchmark.ts +79 -30
  157. package/src/http/global-config.ts +7 -0
  158. package/src/http/ranking.ts +24 -40
  159. package/src/http/status.ts +49 -43
  160. package/src/http/tasks.ts +49 -1
  161. package/src/http/telemetry-ui.ts +1 -1
  162. package/src/http/used-by.ts +55 -19
  163. package/src/http/users.ts +2 -2
  164. package/src/providers/acp-targets.ts +1 -1
  165. package/src/providers/amp-adapter.ts +1 -1
  166. package/src/providers/pi-mono-adapter.ts +15 -0
  167. package/src/providers/reasoning-effort.ts +2 -1
  168. package/src/providers/types.ts +2 -0
  169. package/src/ranking/telemetry-ranking.ts +5 -33
  170. package/src/scripts-runtime/sdk-allowlist.ts +7 -0
  171. package/src/scripts-runtime/types/stdlib.d.ts +31 -0
  172. package/src/scripts-runtime/types/swarm-sdk.d.ts +31 -0
  173. package/src/server.ts +4 -0
  174. package/src/telemetry-context.ts +19 -1
  175. package/src/telemetry-contract/EVENTS.md +42 -8
  176. package/src/telemetry-contract/SOURCE.json +6 -5
  177. package/src/telemetry-contract/catalog.json +225 -5
  178. package/src/telemetry-contract/ranking/fixtures/valid/no-claim.json +10 -0
  179. package/src/telemetry-contract/ranking/listing.v1.schema.json +2 -2
  180. package/src/telemetry-contract/types.gen.ts +225 -27
  181. package/src/telemetry-identity.ts +47 -9
  182. package/src/telemetry-snapshot.ts +9 -1
  183. package/src/telemetry-ui-events.ts +9 -2
  184. package/src/telemetry.ts +29 -6
  185. package/src/tests/app-action-run-tool.test.ts +178 -0
  186. package/src/tests/app-row-tools.test.ts +385 -0
  187. package/src/tests/apps-json-column.test.ts +611 -0
  188. package/src/tests/apps-script-types.test.ts +2 -0
  189. package/src/tests/apps-sync-engine.test.ts +42 -0
  190. package/src/tests/check-pr-body.test.ts +0 -23
  191. package/src/tests/credential-check.test.ts +38 -0
  192. package/src/tests/db-task-read-contract.test.ts +4 -0
  193. package/src/tests/db-task-write-contract.test.ts +2 -0
  194. package/src/tests/docs-index-footprint.test.js +2 -2
  195. package/src/tests/fleet-benchmark.test.ts +122 -2
  196. package/src/tests/http-users.test.ts +62 -1
  197. package/src/tests/model-catalog-table.test.ts +63 -0
  198. package/src/tests/model-profiles-api.test.ts +19 -7
  199. package/src/tests/models-catalog.test.ts +50 -0
  200. package/src/tests/onboarding.test.ts +21 -0
  201. package/src/tests/org-website.test.ts +62 -0
  202. package/src/tests/pi-mono-adapter.test.ts +23 -0
  203. package/src/tests/pr-body-leaks.test.ts +4 -0
  204. package/src/tests/pr-room-guard.test.ts +242 -0
  205. package/src/tests/ranking-listing.test.ts +8 -23
  206. package/src/tests/ranking-route.test.ts +49 -47
  207. package/src/tests/reasoning-effort.test.ts +39 -3
  208. package/src/tests/runner-harness-telemetry-env.test.ts +62 -1
  209. package/src/tests/status.test.ts +158 -9
  210. package/src/tests/swarm-tool-result-gate.test.ts +2 -4
  211. package/src/tests/task-lineage.test.ts +180 -0
  212. package/src/tests/telemetry-context.test.ts +128 -2
  213. package/src/tests/telemetry-init.test.ts +62 -5
  214. package/src/tests/telemetry-ui-route.test.ts +123 -0
  215. package/src/tests/tool-annotations.test.ts +3 -2
  216. package/src/tests/used-by-route.test.ts +144 -10
  217. package/src/tests/user-token-rest-auth.test.ts +38 -0
  218. package/src/tests/workflow-agent-task-retry.test.ts +130 -4
  219. package/src/tests/workflow-wait-recovery.test.ts +116 -4
  220. package/src/tools/app-action-run.ts +63 -0
  221. package/src/tools/app-rows.ts +239 -0
  222. package/src/tools/model-catalog/index.ts +1 -1
  223. package/src/tools/tool-config.ts +8 -0
  224. package/src/tools/utils.ts +1 -1
  225. package/src/tools/workflows/retry-workflow-run.ts +1 -1
  226. package/src/types.ts +17 -0
  227. package/src/utils/company-profile.ts +24 -0
  228. package/src/utils/org-website.ts +58 -21
  229. package/src/workflows/recovery.ts +10 -22
  230. package/src/workflows/resume.ts +16 -0
  231. package/src/workflows/task-step-routing.ts +47 -7
  232. package/templates/skills/apps/SKILL.md +44 -4
  233. package/templates/skills/apps/content.md +44 -4
  234. package/dist/handlers-zbs90bny.js +0 -39
  235. package/dist/index-8pwc1jc8.js +0 -40
  236. package/dist/index-nxa6me0q.js +0 -41
  237. package/dist/lead-td8h2sfn.js +0 -78
  238. package/dist/worker-wr6xgfr2.js +0 -78
  239. package/src/tests/check-ranking-entry.test.ts +0 -146
@@ -115,6 +115,7 @@ function modelToCredKeys(modelStr: string | undefined): string[] | null {
115
115
  if (provider === "openrouter") return ["OPENROUTER_API_KEY"];
116
116
  if (provider === "openai") return ["OPENAI_API_KEY"];
117
117
  if (provider === "google") return ["GOOGLE_API_KEY", "GEMINI_API_KEY"];
118
+ if (provider === "opencode-go") return ["OPENCODE_API_KEY"];
118
119
  // models.json custom providers (`writeSessionModelsJson`). The
119
120
  // runner normalizes key aliases (HELMCODE_API_NAN → NAN_API_KEY), but a
120
121
  // worker without that step (or a boot-time check) may only see the alias.
@@ -145,6 +146,19 @@ function getHarnessDrivableBedrockModels(): Array<{ id: string; name: string }>
145
146
  }
146
147
  }
147
148
 
149
+ /**
150
+ * The `opencode-go` model ids this pi-ai build resolves. models.dev can list
151
+ * ids pi-ai does not know yet, and pi runs its default model for those, so the
152
+ * worker reports this list and the picker offers only these ids.
153
+ */
154
+ export function listPiOpencodeGoModelIds(): string[] {
155
+ try {
156
+ return getModels("opencode-go").map((m) => m.id);
157
+ } catch {
158
+ return [];
159
+ }
160
+ }
161
+
148
162
  /**
149
163
  * Enumerate the Bedrock models that are both invocable by this AWS account and
150
164
  * drivable by the pi-ai Converse harness, and verify the credential chain in
@@ -480,6 +494,7 @@ const PI_RUNTIME_API_KEYS: readonly (readonly [envKey: string, provider: string]
480
494
  ["OPENAI_API_KEY", "openai"],
481
495
  ["GEMINI_API_KEY", "google"],
482
496
  ["GOOGLE_API_KEY", "google"],
497
+ ["OPENCODE_API_KEY", "opencode-go"],
483
498
  // models.json custom providers (the registry). A runtime key beats the
484
499
  // file's `apiKey: "$NAN_API_KEY"`, which pi would otherwise read from the
485
500
  // shared process.env, where a credential pool is still the raw comma list.
@@ -168,7 +168,8 @@ function buildOpencodeReasoningOptions(
168
168
  // qualitative level — translate internally (see "What We're NOT Doing" in
169
169
  // the plan: no numeric budget surface for operators, only this
170
170
  // adapter-internal transport detail).
171
- if (level === "max") return { reasoningEffort: level };
171
+ // Its Anthropic transport reads `effort` into `output_config.effort`.
172
+ if (level === "max") return { effort: level };
172
173
  return { thinking: { type: "enabled", budgetTokens: ANTHROPIC_BUDGET_TOKENS_BY_LEVEL[level] } };
173
174
  }
174
175
  if (providerId === "openrouter") {
@@ -320,6 +320,8 @@ export interface CredStatus {
320
320
  * string signals Bedrock mode with `AWS_REGION` unset (no region fabricated).
321
321
  */
322
322
  bedrockRegion?: string;
323
+ /** Pi-mono only: the `opencode-go` model ids pi-ai resolves. Undefined for other harnesses. */
324
+ opencodeGoModels?: string[];
323
325
  }
324
326
 
325
327
  /**
@@ -23,8 +23,6 @@ export const RANKING_CATEGORIES = Object.keys(RANKING_TAXONOMY) as [
23
23
  keyof typeof RANKING_TAXONOMY,
24
24
  ...(keyof typeof RANKING_TAXONOMY)[],
25
25
  ];
26
- export const RANKING_CLAIM_PATTERN = /^rk_[0-9a-f]{32}$/;
27
-
28
26
  const hostname = z.string().refine((v) => normalizeOrgWebsite(v) === v, "bare hostname");
29
27
  const nullableText = (max: number) => z.string().trim().min(1).max(max).nullable();
30
28
 
@@ -37,7 +35,11 @@ function inCategory(category: string, subcategory: string | null): boolean {
37
35
  export const telemetryRankingV1 = z
38
36
  .strictObject({
39
37
  v: z.literal(1),
40
- claim: z.string().regex(RANKING_CLAIM_PATTERN),
38
+ /** Minted by v2.4.0 for the retired ranking PR. Still parsed, never written; the proxy ignores it. */
39
+ claim: z
40
+ .string()
41
+ .regex(/^rk_[0-9a-f]{32}$/)
42
+ .optional(),
41
43
  name: z.string().trim().min(1).max(60),
42
44
  domain: hostname,
43
45
  category: z.enum(RANKING_CATEGORIES),
@@ -88,12 +90,6 @@ export const rankingFormSchema = z.object({
88
90
  });
89
91
  export type RankingForm = z.infer<typeof rankingFormSchema>;
90
92
 
91
- /** `rk_` + 32 lowercase hex characters from the platform CSPRNG. */
92
- export function mintRankingClaim(): string {
93
- const bytes = crypto.getRandomValues(new Uint8Array(16));
94
- return `rk_${Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("")}`;
95
- }
96
-
97
93
  const blankToNull = (value: string | null | undefined) => value?.trim() || null;
98
94
 
99
95
  /**
@@ -104,7 +100,6 @@ const blankToNull = (value: string | null | undefined) => value?.trim() || null;
104
100
  export function buildListing(
105
101
  identity: OrgIdentityStatus,
106
102
  form: RankingForm,
107
- claim: string,
108
103
  now: Date = new Date(),
109
104
  ): TelemetryRanking {
110
105
  if (!identity.ok || !identity.name || !identity.website) {
@@ -112,7 +107,6 @@ export function buildListing(
112
107
  }
113
108
  const listing = {
114
109
  v: 1 as const,
115
- claim,
116
110
  name: identity.name,
117
111
  domain: identity.website,
118
112
  category: form.category,
@@ -123,25 +117,3 @@ export function buildListing(
123
117
  };
124
118
  return parseTelemetryRanking(JSON.stringify(listing));
125
119
  }
126
-
127
- /** The `community/ranking/<domain>.json` file that approves this install. */
128
- export function rankingEntryFile(listing: Pick<TelemetryRanking, "domain" | "claim">): string {
129
- return `${JSON.stringify({ $schema: "./schema.json", domain: listing.domain, claim: listing.claim }, null, 2)}\n`;
130
- }
131
-
132
- export const RANKING_REPO = "desplega-ai/agent-swarm";
133
-
134
- /** GitHub's "new file" page, prefilled with the entry, as a PR from the admin's fork. */
135
- export function rankingPrUrl(listing: Pick<TelemetryRanking, "domain" | "claim">): string {
136
- const params = new URLSearchParams({
137
- filename: `community/ranking/${listing.domain}.json`,
138
- value: rankingEntryFile(listing),
139
- message: `chore(ranking): add ${listing.domain}`,
140
- });
141
- return `https://github.com/${RANKING_REPO}/new/main?${params.toString()}`;
142
- }
143
-
144
- /** GitHub's delete page for an entry, to leave the ranking for good. */
145
- export function rankingLeaveUrl(domain: string): string {
146
- return `https://github.com/${RANKING_REPO}/delete/main/community/ranking/${domain}.json`;
147
- }
@@ -180,6 +180,13 @@ export const SDK_TOOL_NAME_MAP = {
180
180
  app_list: "app-list",
181
181
  app_patch: "app-patch",
182
182
  app_query: "app-query",
183
+ app_rows_list: "app-rows-list",
184
+ app_row_get: "app-row-get",
185
+ app_row_create: "app-row-create",
186
+ app_rows_create: "app-rows-create",
187
+ app_row_patch: "app-row-patch",
188
+ app_row_delete: "app-row-delete",
189
+ app_rows_delete: "app-rows-delete",
183
190
  app_rollback: "app-rollback",
184
191
  app_sync: "app-sync",
185
192
  app_upsert: "app-upsert",
@@ -658,6 +658,37 @@ declare module "swarm-sdk" {
658
658
  query: string;
659
659
  params?: Record<string, string | number | boolean>;
660
660
  }): Promise<unknown>;
661
+ app_rows_list(args: {
662
+ appId: string;
663
+ model: string;
664
+ equals?: Record<string, string | number | boolean>;
665
+ sort?: `${string}:asc` | `${string}:desc`;
666
+ limit?: number;
667
+ }): Promise<unknown>;
668
+ app_row_get(args: { appId: string; model: string; rowId: string }): Promise<unknown>;
669
+ app_row_create(args: {
670
+ appId: string;
671
+ model: string;
672
+ values: Record<string, unknown>;
673
+ }): Promise<unknown>;
674
+ app_rows_create(args: {
675
+ appId: string;
676
+ model: string;
677
+ rows: Record<string, unknown>[];
678
+ }): Promise<unknown>;
679
+ app_row_patch(args: {
680
+ appId: string;
681
+ model: string;
682
+ rowId: string;
683
+ values: Record<string, unknown>;
684
+ }): Promise<unknown>;
685
+ app_row_delete(args: { appId: string; model: string; rowId: string }): Promise<unknown>;
686
+ app_rows_delete(args: {
687
+ appId: string;
688
+ model: string;
689
+ equals: Record<string, string | number | boolean>;
690
+ limit?: number;
691
+ }): Promise<unknown>;
661
692
  app_rollback(args: {
662
693
  appId: string;
663
694
  version: number;
@@ -640,6 +640,37 @@ declare module "swarm-sdk" {
640
640
  query: string;
641
641
  params?: Record<string, string | number | boolean>;
642
642
  }): Promise<unknown>;
643
+ app_rows_list(args: {
644
+ appId: string;
645
+ model: string;
646
+ equals?: Record<string, string | number | boolean>;
647
+ sort?: `${string}:asc` | `${string}:desc`;
648
+ limit?: number;
649
+ }): Promise<unknown>;
650
+ app_row_get(args: { appId: string; model: string; rowId: string }): Promise<unknown>;
651
+ app_row_create(args: {
652
+ appId: string;
653
+ model: string;
654
+ values: Record<string, unknown>;
655
+ }): Promise<unknown>;
656
+ app_rows_create(args: {
657
+ appId: string;
658
+ model: string;
659
+ rows: Record<string, unknown>[];
660
+ }): Promise<unknown>;
661
+ app_row_patch(args: {
662
+ appId: string;
663
+ model: string;
664
+ rowId: string;
665
+ values: Record<string, unknown>;
666
+ }): Promise<unknown>;
667
+ app_row_delete(args: { appId: string; model: string; rowId: string }): Promise<unknown>;
668
+ app_rows_delete(args: {
669
+ appId: string;
670
+ model: string;
671
+ equals: Record<string, string | number | boolean>;
672
+ limit?: number;
673
+ }): Promise<unknown>;
643
674
  app_rollback(args: {
644
675
  appId: string;
645
676
  version: number;
package/src/server.ts CHANGED
@@ -11,6 +11,7 @@ import { resolveTemplate } from "./prompts/resolver";
11
11
  import { isRbacEnabled } from "./rbac";
12
12
  import { getSlackConfiguration } from "./slack/config";
13
13
  import { registerAcceptSteerTool } from "./tools/accept-steer";
14
+ import { registerAppActionRunTool } from "./tools/app-action-run";
14
15
  import { registerAppDiffTool } from "./tools/app-diff";
15
16
  import { registerAppGetTool } from "./tools/app-get";
16
17
  import { registerAppHistoryTool } from "./tools/app-history";
@@ -18,6 +19,7 @@ import { registerAppListTool } from "./tools/app-list";
18
19
  import { registerAppPatchTool } from "./tools/app-patch";
19
20
  import { registerAppQueryTool } from "./tools/app-query";
20
21
  import { registerAppRollbackTool } from "./tools/app-rollback";
22
+ import { registerAppRowTools } from "./tools/app-rows";
21
23
  import { registerAppSyncTool } from "./tools/app-sync";
22
24
  import { registerAppUpsertTool } from "./tools/app-upsert";
23
25
  import { registerCancelApprovalRequestTool } from "./tools/cancel-approval-request";
@@ -643,6 +645,8 @@ export async function createServer(
643
645
  // Pages capability - DB-backed lightweight artifacts (HTML / JSON specs).
644
646
  if (hasCapability("pages")) {
645
647
  registerAppGetTool(server);
648
+ registerAppRowTools(server);
649
+ registerAppActionRunTool(server);
646
650
  registerAppHistoryTool(server);
647
651
  registerAppDiffTool(server);
648
652
  registerAppListTool(server);
@@ -9,6 +9,12 @@
9
9
  import { createHash, randomBytes } from "node:crypto";
10
10
  import { type EventContext, TRIGGER_SURFACES, type TriggerSurface } from "./telemetry-contract";
11
11
  import catalog from "./telemetry-contract/catalog.json";
12
+ import {
13
+ COMPANY_ACQUISITION_SOURCES,
14
+ COMPANY_TEAM_SIZES,
15
+ COMPANY_USE_CASES,
16
+ USER_FUNCTIONS,
17
+ } from "./utils/company-profile";
12
18
 
13
19
  /** `org_` + 16 lowercase hex (self-host, minted here) or 27 alphanumerics (cloud). Same pattern the proxy enforces. */
14
20
  const ORG_ID_PATTERN = /^org_([0-9a-f]{16}|[A-Za-z0-9]{27})$/;
@@ -97,6 +103,9 @@ export interface ContextInput {
97
103
  installMethod?: string | null;
98
104
  installPreset?: string | null;
99
105
  acquisitionSource?: string | null;
106
+ teamSize?: string | null;
107
+ useCase?: string | null;
108
+ userFunction?: string | null;
100
109
  }
101
110
 
102
111
  /** Build the top-level `context` object of a schema_version 2 event. */
@@ -105,6 +114,11 @@ export function buildContext(input: ContextInput): EventContext {
105
114
  const orgName = input.orgName?.trim();
106
115
  const orgDomain = validOrgDomain(input.orgDomain);
107
116
  const orgWebsite = validOrgDomain(input.orgWebsite);
117
+ const teamSize = COMPANY_TEAM_SIZES.find((value) => value === input.teamSize);
118
+ const useCase = COMPANY_USE_CASES.find((value) => value === input.useCase);
119
+ const userFunction = userId
120
+ ? USER_FUNCTIONS.find((value) => value === input.userFunction)
121
+ : undefined;
108
122
  return {
109
123
  org_id: input.orgId,
110
124
  org_name: orgName ? orgName : null,
@@ -116,10 +130,14 @@ export function buildContext(input: ContextInput): EventContext {
116
130
  swarm_version: input.swarmVersion,
117
131
  install_method: input.installMethod ?? null,
118
132
  install_preset: input.installPreset ?? null,
119
- acquisition_source: input.acquisitionSource ?? null,
133
+ acquisition_source:
134
+ COMPANY_ACQUISITION_SOURCES.find((value) => value === input.acquisitionSource) ?? null,
120
135
  // Optional in the catalog: left out, not null, when unset, so an ingest
121
136
  // that predates the field keeps accepting events from installs without one.
122
137
  ...(orgWebsite ? { org_website: orgWebsite } : {}),
138
+ ...(teamSize ? { team_size: teamSize } : {}),
139
+ ...(useCase ? { use_case: useCase } : {}),
140
+ ...(userFunction ? { user_function: userFunction } : {}),
123
141
  };
124
142
  }
125
143
 
@@ -4,18 +4,48 @@
4
4
 
5
5
  Every event the ingest accepts with `schema_version: 2`. A v2 event that is not listed here, or that sends a property not listed for it, is rejected with a typed 400. `Emitter` is the envelope `source`.
6
6
 
7
+ ## `acquisition_source`
8
+
9
+ How the organization found Agent Swarm.
10
+
11
+ Values: `search`, `github`, `social`, `colleague`, `newsletter`, `event`, `ai_assistant`, `hacker_news`, `other`.
12
+
13
+ ## `notification_moment`
14
+
15
+ Moment that made the Slack Connect invite relevant.
16
+
17
+ Values: `task_failed`, `first_workflow`, `default`.
18
+
7
19
  ## `popup`
8
20
 
9
21
  Dashboard pop-up that a popup.* event is about.
10
22
 
11
23
  Values: `feedback`, `org_name`, `used_by`.
12
24
 
25
+ ## `team_size`
26
+
27
+ Size of the organization team.
28
+
29
+ Values: `1`, `2-10`, `11-50`, `51+`.
30
+
13
31
  ## `trigger_surface`
14
32
 
15
33
  Surface that started a chain of work: agent-swarm's AgentTaskSourceSchema values plus other.
16
34
 
17
35
  Values: `slack`, `ui`, `api`, `mcp`, `github`, `gitlab`, `linear`, `jira`, `agentmail`, `schedule`, `workflow`, `system`, `other`.
18
36
 
37
+ ## `use_case`
38
+
39
+ Primary use of the swarm.
40
+
41
+ Values: `features`, `bugs`, `review`, `ops`, `docs`, `data`.
42
+
43
+ ## `user_function`
44
+
45
+ Job function of a user, separate from the RBAC user_role.
46
+
47
+ Values: `engineer`, `eng_lead`, `founder`, `product`, `ops`, `other`.
48
+
19
49
  ## `agent-fs`
20
50
 
21
51
  | Event | Emitter | Since | Description | Properties |
@@ -44,12 +74,15 @@ Common properties, allowed on every event of this product:
44
74
  | `agent.registered` | api-server | 2026-09-30 | An agent registered or reconnected. | `capabilities` (array, required)<br>`isReconnect` (boolean, required)<br>`role` (string) |
45
75
  | `compaction.triggered` | worker | 2026-09-30 | The harness compacted a session context. | `compactTrigger` (string, required)<br>`contextTotalTokens` (integer, required)<br>`preCompactTokens` (integer, required) |
46
76
  | `feature.used` | ui | 2026-09-30 | A dashboard feature was used. | `feature` (string, required) |
47
- | `fleet_benchmark.viewed` | ui | 2026-10-12 | The fleet benchmark card was shown. | `has_org_name` (boolean, required) |
77
+ | `fleet_benchmark.unlocked` | ui | 2026-10-18 | An admin supplied the company profile fields for the full benchmark. | `fields` (array of website \| team_size \| use_case, required) |
78
+ | `fleet_benchmark.viewed` | ui | 2026-10-12 | The fleet benchmark card was shown. | `has_org_name` (boolean, required)<br>`level` (basic \| full) |
79
+ | `identity.lookup` | ui | 2026-10-18 | A dashboard identity lookup matched an existing user or found no match. | `matched` (boolean, required) |
80
+ | `identity.user_created` | ui | 2026-10-18 | A user created a dashboard identity. Email and personal names stay out of telemetry. | `email_kind` (work \| personal, required)<br>`has_company` (boolean, required)<br>`has_function` (boolean, required)<br>`surface` (identity_modal \| setup, required) |
48
81
  | `integration.connected` | api-server | 2026-09-30 | An integration was connected. | `first_of_type` (boolean, required)<br>`provider` (string)<br>`type` (string, required) |
49
82
  | `lead.captured` | api-server | 2026-09-30 | A consented lead (Teams waitlist or private-beta sign-up). The email stays in feedback_submissions. | `channel` (string, required)<br>`consent` (boolean, required)<br>`submission_id` (string, required) |
50
- | `notification.dismissed` | ui | 2026-09-30 | A notification-centre item was dismissed. | `key` (string, required) |
51
- | `notification.submitted` | ui | 2026-09-30 | A notification-centre item was submitted. | `email_domain` (string)<br>`key` (string, required) |
52
- | `notification.viewed` | ui | 2026-09-30 | A notification-centre item was shown. | `key` (string, required) |
83
+ | `notification.dismissed` | ui | 2026-09-30 | A notification-centre item was dismissed. | `key` (string, required)<br>`moment` (task_failed \| first_workflow \| default) |
84
+ | `notification.submitted` | ui | 2026-09-30 | A notification-centre item was submitted. | `email_domain` (string)<br>`key` (string, required)<br>`moment` (task_failed \| first_workflow \| default)<br>`user_function` (engineer \| eng_lead \| founder \| product \| ops \| other) |
85
+ | `notification.viewed` | ui | 2026-09-30 | A notification-centre item was shown. | `key` (string, required)<br>`moment` (task_failed \| first_workflow \| default) |
53
86
  | `onboarding.completed` | api-server | 2026-09-30 | Onboarding was completed. | `seconds_since_install` (integer)<br>`seconds_since_start` (integer, required) |
54
87
  | `onboarding.dismissed` | api-server | 2026-09-30 | Onboarding was dismissed. | `seconds_since_install` (integer)<br>`seconds_since_start` (integer, required) |
55
88
  | `onboarding.first_task_completed` | api-server | 2026-09-30 | The first task after onboarding completed. | `method` (string)<br>`seconds_since_install` (integer)<br>`seconds_since_start` (integer, required) |
@@ -58,12 +91,12 @@ Common properties, allowed on every event of this product:
58
91
  | `onboarding.step_failed` | api-server | 2026-09-30 | An onboarding step failed. | `error_class` (string, required)<br>`seconds_since_install` (integer)<br>`seconds_since_start` (integer, required)<br>`step` (string, required) |
59
92
  | `onboarding.step_skipped` | api-server | 2026-09-30 | An onboarding step was skipped. | `seconds_since_install` (integer)<br>`seconds_since_start` (integer, required)<br>`step` (string, required) |
60
93
  | `onboarding.step_viewed` | api-server | 2026-09-30 | An onboarding step was shown. | `seconds_since_install` (integer)<br>`seconds_since_start` (integer, required)<br>`step` (string, required) |
61
- | `org.profile_updated` | ui | 2026-10-12 | An admin changed the org profile. Lists which fields changed, never their values. | `fields` (array, required)<br>`surface` (prompt \| setup \| settings, required) |
94
+ | `org.profile_updated` | ui | 2026-10-12 | An admin changed the org profile. Lists which fields changed, never their values. | `fields` (array of name \| website \| team_size \| use_case \| acquisition_source, required)<br>`surface` (enum, required) |
62
95
  | `org.snapshot` | api-server | 2026-09-30 | Daily per-install user and agent counts. Counts only: no names, emails or IDs. | `agents_total` (integer ≥0, required)<br>`users_active_7d` (integer ≥0, required)<br>`users_admin` (integer ≥0, required)<br>`users_linked_github` (integer ≥0, required)<br>`users_linked_gitlab` (integer ≥0, required)<br>`users_linked_jira` (integer ≥0, required)<br>`users_linked_linear` (integer ≥0, required)<br>`users_linked_other` (integer ≥0, required)<br>`users_linked_slack` (integer ≥0, required)<br>`users_suspended` (integer ≥0, required)<br>`users_total` (integer ≥0, required)<br>`users_with_login` (integer ≥0, required) |
63
96
  | `page.viewed` | ui | 2026-09-30 | A dashboard page was viewed. | `route_template` (string, required) |
64
97
  | `popup.dismissed` | ui | 2026-10-12 | A dashboard pop-up was closed without submitting. | `method` (later \| close \| escape, required)<br>`popup` (feedback \| org_name \| used_by, required) |
65
98
  | `popup.shown` | ui | 2026-10-12 | A dashboard pop-up was shown. Telemetry-gated: never sent while telemetry is off. | `popup` (feedback \| org_name \| used_by, required)<br>`trigger` (task_failed \| tasks_completed \| workflow_completed \| quarterly \| missing_org_name, required) |
66
- | `popup.submitted` | ui | 2026-10-12 | A dashboard pop-up was submitted. Content stays out of telemetry: only flags for what was filled. | `has_contact` (boolean, required)<br>`has_message` (boolean, required)<br>`popup` (feedback \| org_name \| used_by, required)<br>`score` (integer ≥0) |
99
+ | `popup.submitted` | ui | 2026-10-12 | A dashboard pop-up was submitted. Content stays out of telemetry: only flags for what was filled. | `answered` (integer ≥0)<br>`has_contact` (boolean, required)<br>`has_message` (boolean, required)<br>`perks` (array of used_by \| slack_connect)<br>`popup` (feedback \| org_name \| used_by, required)<br>`score` (integer ≥0) |
67
100
  | `ranking.opted_in` | api-server | 2026-10-18 | An admin opted the install into the public ranking, or the API rebuilt its listing after an org identity change. | `listing` (string, required) |
68
101
  | `ranking.opted_out` | api-server | 2026-10-18 | The install left the public ranking: the admin turned it off, or the org name or website was cleared or changed. | `domain` (string, required) |
69
102
  | `ranking.usage` | worker | 2026-10-18 | Token usage of one session on an install opted into the public ranking. Sent next to session.cost. | `cacheReadTokens` (integer ≥0)<br>`cacheWriteTokens` (integer ≥0)<br>`inputTokens` (integer ≥0, required)<br>`model` (string)<br>`outputTokens` (integer ≥0, required)<br>`provider` (string)<br>`totalTokens` (integer ≥0, required) |
@@ -77,6 +110,7 @@ Common properties, allowed on every event of this product:
77
110
  | `session.failure` | worker | 2026-09-30 | A session failed. | `agentId` (string, required)<br>`durationMs` (integer, required)<br>`errorCategory` (string, required)<br>`model` (string, required)<br>`provider` (string, required)<br>`taskId` (string, nullable, required)<br>`trigger_surface` (enum, nullable, required)<br>`wasRateLimited` (boolean, required) |
78
111
  | `session.started` | worker | 2026-09-30 | A worker or lead session started. | `agentId` (string, required)<br>`harnessProvider` (string, required)<br>`model` (string)<br>`role` (string, required)<br>`taskId` (string, nullable, required)<br>`trigger_surface` (enum, nullable, required) |
79
112
  | `session.steered` | api-server | 2026-09-30 | A running session received a steering message. | `by_kind` (string, required)<br>`trigger_surface` (enum, nullable, required) |
113
+ | `setup.worker_command_copied` | ui | 2026-10-18 | An admin copied a worker command from the setup health popover. | `harness` (enum, required)<br>`target` (compose \| docker \| kubernetes, required) |
80
114
  | `skill.invoked` | worker | 2026-09-30 | A skill was invoked in a session. | `skill_name` (string, required)<br>`skill_source` (string, required)<br>`trigger_surface` (enum, nullable, required) |
81
115
  | `task.cancelled` | api-server | 2026-09-30 | A task was cancelled. | `agentId` (string)<br>`durationMs` (integer)<br>`previousStatus` (string, required)<br>`taskId` (string, required)<br>`task_source` (enum, required)<br>`trigger_surface` (enum, required) |
82
116
  | `task.claimed` | api-server | 2026-09-30 | An agent claimed a task. | `agentId` (string, required)<br>`taskId` (string, required)<br>`task_source` (enum, required)<br>`trigger_surface` (enum, required) |
@@ -86,9 +120,9 @@ Common properties, allowed on every event of this product:
86
120
  | `task.session_completed` | worker | 2026-09-30 | A worker session for a task finished. | `agentId` (string, required)<br>`durationMs` (integer, required)<br>`exitCode` (integer, required)<br>`harnessVariant` (string)<br>`harnessVersion` (string)<br>`isError` (boolean, required)<br>`model` (string, required)<br>`provider` (string, required)<br>`taskId` (string, nullable, required)<br>`trigger_surface` (enum, nullable, required) |
87
121
  | `task.started` | api-server | 2026-09-30 | A task started running. | `agentId` (string, required)<br>`taskId` (string, required)<br>`task_source` (enum, required)<br>`trigger_surface` (enum, required) |
88
122
  | `task.superseded` | api-server | 2026-09-30 | A task was superseded by another task. | `agentId` (string)<br>`durationMs` (integer)<br>`harnessVariant` (string)<br>`harnessVersion` (string)<br>`provider` (string)<br>`reason` (string, required)<br>`taskId` (string, required)<br>`task_source` (enum, required)<br>`trigger_surface` (enum, required) |
89
- | `telemetry.enabled` | api-server | 2026-10-12 | Telemetry was turned on. Sent once, on the first boot or re-init after opting in. | `via` (banner \| settings \| env, required) |
123
+ | `telemetry.enabled` | api-server | 2026-10-12 | Telemetry was turned on. Sent once, on the first boot or re-init after opting in. | `via` (banner \| settings \| env \| benchmark, required) |
90
124
  | `ui.session_started` | ui | 2026-09-30 | A dashboard session started. | none |
91
- | `used_by.consent_changed` | ui | 2026-10-12 | An admin granted or revoked the "used by" logo consent. The request itself goes to /v1/used-by. | `granted` (boolean, required) |
125
+ | `used_by.consent_changed` | ui | 2026-10-12 | An admin granted or revoked the "used by" logo consent. The request itself goes to /v1/used-by. | `granted` (boolean, required)<br>`has_function` (boolean)<br>`has_quote` (boolean) |
92
126
  | `workflow.completed` | api-server | 2026-09-30 | A workflow run completed. | `durationMs` (integer)<br>`stepsCompleted` (integer, required)<br>`stepsFailed` (integer, required)<br>`workflowId` (string, required) |
93
127
  | `workflow.created` | api-server | 2026-09-30 | A workflow was created. | `nodeCount` (integer, required)<br>`via` (api \| mcp)<br>`workflowId` (string, required) |
94
128
  | `workflow.deleted` | api-server | 2026-09-30 | A workflow was deleted. | `via` (api \| mcp)<br>`workflowId` (string, required) |
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "repo": "desplega-ai/proxy",
3
- "commit": "6260f39827fc57784642b1adc88a43f61d882a6f",
3
+ "commit": "cc593585467a920dcb8731993d092639372dc7af",
4
4
  "files": {
5
- "types.gen.ts": "192c6769164a65b6e804ea088b38de6827d34fac26a7ecaccce881a46e98b1a7",
6
- "catalog.json": "1b2b052f8e43f082e9d6efc2768752d6f194c0cbf0d26ae9c35643cce0e6486c",
7
- "EVENTS.md": "9451da995ef04a049888715f960a1641bbc52fecb3dce97610c3c391bead1faf",
5
+ "types.gen.ts": "aa8a682f1d875515d63cf5bd3fa667dcb06cd851f8b2b798482a4c71cd775444",
6
+ "catalog.json": "595654f288ae2a7cbb265b6b2a72392acc33f5acde365d72829101912525a891",
7
+ "EVENTS.md": "51ee5491c633d684b163d727a369a08b5c1d3f4ba453277d840526449a0bad0c",
8
8
  "ranking/fixtures/expected.json": "6d506546f48d99a089666bed2a4c08752ebb63a029392c76ffd057e9520adc70",
9
9
  "ranking/fixtures/invalid/bad-category.json": "a4c36da6079c36d15e5e8c8e6322fc97b172de015a80a26cee8cab699f666236",
10
10
  "ranking/fixtures/invalid/bad-claim.json": "cee14d465545d057cfb61922301a5119187ba17d70efabb16528a5e305d7b065",
@@ -34,9 +34,10 @@
34
34
  "ranking/fixtures/valid/category-without-subcategory.json": "45c5b872aec232bdcba791e6ba1a7aba698c825f389e194a38e96ad141f56e5a",
35
35
  "ranking/fixtures/valid/full.json": "d6d93c4a6159e814c3f089c69083df700fb19359f127ccd2b71529a058dfe5e9",
36
36
  "ranking/fixtures/valid/minimal.json": "de6629d6ee2c4b67598abfc5ec7f6470a93dd9893b07e6e7c93d018cf5445593",
37
+ "ranking/fixtures/valid/no-claim.json": "fa5c08ec50c1b602f404cf36ce8b1c03d131111379d914699378dd448431cb84",
37
38
  "ranking/fixtures/valid/padded-text.json": "db71248bf83bb1ffb639208ec467a0228e5c37f604299d09838ab25dc61986a3",
38
39
  "ranking/fixtures/valid/unicode-name.json": "01a9d2cc8c5fec128af3eef35bf16696286f28636dac21b9dec107b28fddf743",
39
- "ranking/listing.v1.schema.json": "1895c57075bbb4b0945e1c5daf813d6c4eaccf1f4480cabd6dc0ce2f0d146776",
40
+ "ranking/listing.v1.schema.json": "f839b669abadb25e031515a5cc2abd3aa2024e85e6117cae83133fc9dfbb769d",
40
41
  "ranking/taxonomy.json": "c6abe7e437635c9a3c1a82a3477a8757ba6c0cb7cbeae86c8c3d175fb37f402c"
41
42
  }
42
43
  }