wicked-crew 0.7.10 → 0.7.12

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 (61) hide show
  1. package/dist/api/delivery-index.d.ts +21 -0
  2. package/dist/api/delivery-index.d.ts.map +1 -1
  3. package/dist/api/delivery-index.js +35 -0
  4. package/dist/api/delivery-index.js.map +1 -1
  5. package/dist/api/group-index.d.ts +59 -0
  6. package/dist/api/group-index.d.ts.map +1 -0
  7. package/dist/api/group-index.js +100 -0
  8. package/dist/api/group-index.js.map +1 -0
  9. package/dist/api/post-hoc-deliver.d.ts +27 -0
  10. package/dist/api/post-hoc-deliver.d.ts.map +1 -1
  11. package/dist/api/post-hoc-deliver.js +54 -0
  12. package/dist/api/post-hoc-deliver.js.map +1 -1
  13. package/dist/api/retry-index.d.ts +6 -0
  14. package/dist/api/retry-index.d.ts.map +1 -1
  15. package/dist/api/retry-index.js +13 -6
  16. package/dist/api/retry-index.js.map +1 -1
  17. package/dist/api/routes.d.ts +55 -2
  18. package/dist/api/routes.d.ts.map +1 -1
  19. package/dist/api/routes.js +188 -17
  20. package/dist/api/routes.js.map +1 -1
  21. package/dist/api/seat-health.d.ts +11 -0
  22. package/dist/api/seat-health.d.ts.map +1 -1
  23. package/dist/api/seat-health.js +23 -0
  24. package/dist/api/seat-health.js.map +1 -1
  25. package/dist/api/server.d.ts.map +1 -1
  26. package/dist/api/server.js +19 -5
  27. package/dist/api/server.js.map +1 -1
  28. package/dist/api/testing.d.ts.map +1 -1
  29. package/dist/api/testing.js +11 -27
  30. package/dist/api/testing.js.map +1 -1
  31. package/dist/campaigns/rollup.d.ts +39 -0
  32. package/dist/campaigns/rollup.d.ts.map +1 -0
  33. package/dist/campaigns/rollup.js +84 -0
  34. package/dist/campaigns/rollup.js.map +1 -0
  35. package/dist/campaigns/routes.d.ts +10 -3
  36. package/dist/campaigns/routes.d.ts.map +1 -1
  37. package/dist/campaigns/routes.js +27 -5
  38. package/dist/campaigns/routes.js.map +1 -1
  39. package/dist/cli/index.js +13 -2
  40. package/dist/cli/index.js.map +1 -1
  41. package/dist/core/adapter.d.ts +0 -12
  42. package/dist/core/adapter.d.ts.map +1 -1
  43. package/dist/core/adapter.js +0 -14
  44. package/dist/core/adapter.js.map +1 -1
  45. package/dist/core/daemon-signal-log.d.ts +44 -0
  46. package/dist/core/daemon-signal-log.d.ts.map +1 -0
  47. package/dist/core/daemon-signal-log.js +57 -0
  48. package/dist/core/daemon-signal-log.js.map +1 -0
  49. package/dist/core/deliver.d.ts +20 -3
  50. package/dist/core/deliver.d.ts.map +1 -1
  51. package/dist/core/deliver.js +82 -9
  52. package/dist/core/deliver.js.map +1 -1
  53. package/dist/studio/assets/{index-gtE6scX0.js → index-DuU8RZg9.js} +95 -95
  54. package/dist/studio/index.html +1 -1
  55. package/dist/studio/testid-inventory.json +47 -17
  56. package/endpoint-manifest.json +4 -3
  57. package/package.json +3 -3
  58. package/dist/campaigns/worktrees.d.ts +0 -39
  59. package/dist/campaigns/worktrees.d.ts.map +0 -1
  60. package/dist/campaigns/worktrees.js +0 -95
  61. package/dist/campaigns/worktrees.js.map +0 -1
@@ -9,7 +9,7 @@
9
9
  <!-- The two faces of DES-VISION-001 §2.8: Inter (the --font-sans token names it;
10
10
  the legacy Archivo load was reconciled away in slice 3) + JetBrains Mono. -->
11
11
  <link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap" rel="stylesheet" />
12
- <script type="module" crossorigin src="/assets/index-gtE6scX0.js"></script>
12
+ <script type="module" crossorigin src="/assets/index-DuU8RZg9.js"></script>
13
13
  <link rel="stylesheet" crossorigin href="/assets/index-BmmNnS2d.css">
14
14
  </head>
15
15
  <body>
@@ -8,11 +8,11 @@
8
8
  "Entry kinds: `static` values appear verbatim in the DOM; `dynamic` are template-literal testids with each ${expr} normalised to '*'; `computed` carry the raw JSX expression — dynamic/computed resolve only against a live DOM."
9
9
  ],
10
10
  "version": 1,
11
- "studioVersion": "0.4.9",
11
+ "studioVersion": "0.4.10",
12
12
  "counts": {
13
13
  "files": 117,
14
- "occurrences": 942,
15
- "static": 806,
14
+ "occurrences": 947,
15
+ "static": 811,
16
16
  "dynamic": 43,
17
17
  "computed": 6
18
18
  },
@@ -529,12 +529,36 @@
529
529
  "src/components/CampaignsPage.tsx"
530
530
  ]
531
531
  },
532
+ {
533
+ "testId": "campaign-card-delivery",
534
+ "files": [
535
+ "src/components/CampaignsPage.tsx"
536
+ ]
537
+ },
538
+ {
539
+ "testId": "campaign-card-narration",
540
+ "files": [
541
+ "src/components/CampaignsPage.tsx"
542
+ ]
543
+ },
544
+ {
545
+ "testId": "campaign-card-pr",
546
+ "files": [
547
+ "src/components/CampaignsPage.tsx"
548
+ ]
549
+ },
532
550
  {
533
551
  "testId": "campaign-card-progress",
534
552
  "files": [
535
553
  "src/components/CampaignsPage.tsx"
536
554
  ]
537
555
  },
556
+ {
557
+ "testId": "campaign-card-run",
558
+ "files": [
559
+ "src/components/CampaignsPage.tsx"
560
+ ]
561
+ },
538
562
  {
539
563
  "testId": "campaign-card-split",
540
564
  "files": [
@@ -542,9 +566,9 @@
542
566
  ]
543
567
  },
544
568
  {
545
- "testId": "campaign-cost-cell",
569
+ "testId": "campaign-card-stranded",
546
570
  "files": [
547
- "src/components/CampaignScoreboard.tsx"
571
+ "src/components/CampaignsPage.tsx"
548
572
  ]
549
573
  },
550
574
  {
@@ -601,18 +625,6 @@
601
625
  "src/components/CampaignScoreboard.tsx"
602
626
  ]
603
627
  },
604
- {
605
- "testId": "campaign-pending-node",
606
- "files": [
607
- "src/components/CampaignScoreboard.tsx"
608
- ]
609
- },
610
- {
611
- "testId": "campaign-pending-nodes",
612
- "files": [
613
- "src/components/CampaignScoreboard.tsx"
614
- ]
615
- },
616
628
  {
617
629
  "testId": "campaign-progress",
618
630
  "files": [
@@ -1787,6 +1799,24 @@
1787
1799
  "src/components/RepoGraphModal.tsx"
1788
1800
  ]
1789
1801
  },
1802
+ {
1803
+ "testId": "group-attach",
1804
+ "files": [
1805
+ "src/components/ChatInput.tsx"
1806
+ ]
1807
+ },
1808
+ {
1809
+ "testId": "group-label-input",
1810
+ "files": [
1811
+ "src/components/ChatInput.tsx"
1812
+ ]
1813
+ },
1814
+ {
1815
+ "testId": "group-pill",
1816
+ "files": [
1817
+ "src/components/ChatInput.tsx"
1818
+ ]
1819
+ },
1790
1820
  {
1791
1821
  "testId": "guidance-open",
1792
1822
  "files": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "apiTypesVersion": "0.18.0",
3
+ "apiTypesVersion": "0.19.0",
4
4
  "endpoints": [
5
5
  {
6
6
  "method": "GET",
@@ -13,7 +13,7 @@
13
13
  "method": "GET",
14
14
  "path": "/api/v1/campaigns",
15
15
  "requestType": null,
16
- "responseType": "{ campaigns: Campaign[] }",
16
+ "responseType": "CampaignsListResponse",
17
17
  "statusCodes": [
18
18
  200,
19
19
  501
@@ -545,7 +545,8 @@
545
545
  201,
546
546
  400,
547
547
  404,
548
- 409
548
+ 409,
549
+ 501
549
550
  ]
550
551
  },
551
552
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wicked-crew",
3
- "version": "0.7.10",
3
+ "version": "0.7.12",
4
4
  "description": "wicked-crew daemon — thin REST+WS bridge to the wicked-core engine via wicked-core-ts",
5
5
  "repository": {
6
6
  "type": "git",
@@ -37,7 +37,7 @@
37
37
  "fastify": "^5.0.0",
38
38
  "pi-acp": "^0.0.32",
39
39
  "wicked-bus": "^2.3.1",
40
- "wicked-core-ts": "^0.7.7",
40
+ "wicked-core-ts": "^0.7.9",
41
41
  "wicked-ledger": "^0.4.0",
42
42
  "zod": "^3.23.0"
43
43
  },
@@ -51,7 +51,7 @@
51
51
  "undici": "^6.28.0",
52
52
  "vitest": "^3.2.6",
53
53
  "wicked-crew-api-types": "*",
54
- "wicked-studio": "^0.4.9"
54
+ "wicked-studio": "^0.4.10"
55
55
  },
56
56
  "engines": {
57
57
  "node": ">=22.0.0"
@@ -1,39 +0,0 @@
1
- /**
2
- * Pre-provisioned campaign-node worktrees — the daemon-side workaround for an ENGINE defect
3
- * (found while landing crew#390): the engine names every run's worktree branch
4
- * `wicked/{run_id}` VERBATIM (`wicked-core src/repo.rs create_worktree`), and a campaign node's
5
- * run id is `{campaign}:{node}:a{attempt}` — a string git REFUSES as a branch name (':' is
6
- * illegal in a ref). Every repo-scoped campaign node therefore fails at dispatch with
7
- * "git worktree add failed: … is not a valid branch name" before a single unit runs, on every
8
- * released engine.
9
- *
10
- * The workaround rides the same function's DOCUMENTED contract: `create_worktree` is
11
- * "idempotent for a genuine resume: a live worktree already at the path is reused". So the
12
- * daemon creates each node's worktree FIRST — at the engine's own layout
13
- * (`<repo_root>/wicked-worktrees/<run_id>`, the crew#276 non-dotted root every engine this
14
- * daemon can install uses: `wicked-core-ts` floor ^0.7.6) — on a branch-SAFE name
15
- * (`wicked/<run_id with ':' → '-'>`), and the engine's dispatch finds and reuses it instead of
16
- * minting the illegal branch. When the engine later sanitizes its branch names natively, these
17
- * pre-created worktrees keep reading as the same legitimate resume state.
18
- *
19
- * Fail-closed and atomic-ish: provisioning happens BEFORE the campaign launches, so a git
20
- * failure aborts the whole request with nothing scheduled; the returned rollback lets the
21
- * caller reclaim the worktrees when the launch itself is then refused. NOTE: the run-id path
22
- * carries ':' — legal on macOS/Linux, ILLEGAL on Windows filesystems — so callers must keep a
23
- * non-campaign fallback on win32 (the recon route does).
24
- */
25
- /** One node's provisioning target: the engine-derived run id and its repo's root checkout. */
26
- export interface WorktreeTarget {
27
- runId: string;
28
- repoRoot: string;
29
- }
30
- /** The branch-safe spelling of a campaign-node run id (':' is illegal in a git ref). */
31
- export declare function branchSafe(runId: string): string;
32
- /**
33
- * Create one live worktree per target at the engine's layout, on a branch-safe branch.
34
- * Throws (after removing whatever it already created) when any `git worktree add` refuses —
35
- * the caller aborts the launch with nothing scheduled. Returns a best-effort rollback for the
36
- * caller's own abort paths (e.g. the engine then refusing the campaign def).
37
- */
38
- export declare function provisionCampaignWorktrees(targets: WorktreeTarget[]): Promise<() => Promise<void>>;
39
- //# sourceMappingURL=worktrees.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worktrees.d.ts","sourceRoot":"","sources":["../../src/campaigns/worktrees.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAMH,8FAA8F;AAC9F,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAsBD;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,cAAc,EAAE,GACxB,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAoC9B"}
@@ -1,95 +0,0 @@
1
- /**
2
- * Pre-provisioned campaign-node worktrees — the daemon-side workaround for an ENGINE defect
3
- * (found while landing crew#390): the engine names every run's worktree branch
4
- * `wicked/{run_id}` VERBATIM (`wicked-core src/repo.rs create_worktree`), and a campaign node's
5
- * run id is `{campaign}:{node}:a{attempt}` — a string git REFUSES as a branch name (':' is
6
- * illegal in a ref). Every repo-scoped campaign node therefore fails at dispatch with
7
- * "git worktree add failed: … is not a valid branch name" before a single unit runs, on every
8
- * released engine.
9
- *
10
- * The workaround rides the same function's DOCUMENTED contract: `create_worktree` is
11
- * "idempotent for a genuine resume: a live worktree already at the path is reused". So the
12
- * daemon creates each node's worktree FIRST — at the engine's own layout
13
- * (`<repo_root>/wicked-worktrees/<run_id>`, the crew#276 non-dotted root every engine this
14
- * daemon can install uses: `wicked-core-ts` floor ^0.7.6) — on a branch-SAFE name
15
- * (`wicked/<run_id with ':' → '-'>`), and the engine's dispatch finds and reuses it instead of
16
- * minting the illegal branch. When the engine later sanitizes its branch names natively, these
17
- * pre-created worktrees keep reading as the same legitimate resume state.
18
- *
19
- * Fail-closed and atomic-ish: provisioning happens BEFORE the campaign launches, so a git
20
- * failure aborts the whole request with nothing scheduled; the returned rollback lets the
21
- * caller reclaim the worktrees when the launch itself is then refused. NOTE: the run-id path
22
- * carries ':' — legal on macOS/Linux, ILLEGAL on Windows filesystems — so callers must keep a
23
- * non-campaign fallback on win32 (the recon route does).
24
- */
25
- import { join } from 'node:path';
26
- import { mkdir, readFile, writeFile } from 'node:fs/promises';
27
- import { execCapped } from '../core/exec.js';
28
- /** The branch-safe spelling of a campaign-node run id (':' is illegal in a git ref). */
29
- export function branchSafe(runId) {
30
- return runId.replaceAll(':', '-');
31
- }
32
- async function git(repoRoot, args) {
33
- await execCapped('git', ['-C', repoRoot, ...args], { windowsHide: true });
34
- }
35
- /** Mirror of the engine's `ensure_worktrees_excluded` (repo-local `.git/info/exclude`) — the
36
- * engine only writes it on the mint path, which the reuse contract skips. Best-effort. */
37
- async function ensureExcluded(repoRoot) {
38
- const ENTRY = 'wicked-worktrees/';
39
- const exclude = join(repoRoot, '.git', 'info', 'exclude');
40
- try {
41
- const existing = await readFile(exclude, 'utf8').catch(() => '');
42
- if (existing.split('\n').some((l) => l.trim() === ENTRY))
43
- return;
44
- const body = existing === '' || existing.endsWith('\n') ? existing : `${existing}\n`;
45
- await mkdir(join(repoRoot, '.git', 'info'), { recursive: true });
46
- await writeFile(exclude, `${body}${ENTRY}\n`, 'utf8');
47
- }
48
- catch {
49
- /* cosmetic — a dirty `git status` in the parent checkout, never a failed run */
50
- }
51
- }
52
- /**
53
- * Create one live worktree per target at the engine's layout, on a branch-safe branch.
54
- * Throws (after removing whatever it already created) when any `git worktree add` refuses —
55
- * the caller aborts the launch with nothing scheduled. Returns a best-effort rollback for the
56
- * caller's own abort paths (e.g. the engine then refusing the campaign def).
57
- */
58
- export async function provisionCampaignWorktrees(targets) {
59
- const created = [];
60
- const rollback = async () => {
61
- for (const t of created) {
62
- const wt = join(t.repoRoot, 'wicked-worktrees', t.runId);
63
- // Forced remove is correct here: the run never started, so there is no work to preserve.
64
- await execCapped('git', ['-C', t.repoRoot, 'worktree', 'remove', '--force', wt], {
65
- windowsHide: true,
66
- }).catch(() => { });
67
- await execCapped('git', ['-C', t.repoRoot, 'branch', '-D', `wicked/${branchSafe(t.runId)}`], {
68
- windowsHide: true,
69
- }).catch(() => { });
70
- }
71
- };
72
- for (const t of targets) {
73
- const wt = join(t.repoRoot, 'wicked-worktrees', t.runId);
74
- const branch = `wicked/${branchSafe(t.runId)}`;
75
- try {
76
- await mkdir(join(t.repoRoot, 'wicked-worktrees'), { recursive: true });
77
- try {
78
- await git(t.repoRoot, ['worktree', 'add', wt, '-b', branch]);
79
- }
80
- catch {
81
- // The engine's own retry idiom: a stale branch from a prior attempt blocks `-b` — reuse it.
82
- await git(t.repoRoot, ['worktree', 'add', wt, branch]);
83
- }
84
- await ensureExcluded(t.repoRoot);
85
- created.push(t);
86
- }
87
- catch (err) {
88
- await rollback();
89
- throw new Error(`pre-provisioning the campaign worktree for run '${t.runId}' failed in ` +
90
- `'${t.repoRoot}': ${err instanceof Error ? err.message : String(err)}`);
91
- }
92
- }
93
- return rollback;
94
- }
95
- //# sourceMappingURL=worktrees.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worktrees.js","sourceRoot":"","sources":["../../src/campaigns/worktrees.ts"],"names":[],"mappings":"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"}