@aperant/framework 0.9.0 → 0.11.0

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 (138) hide show
  1. package/CHANGELOG.md +120 -0
  2. package/agents/apt-verifier.md +6 -3
  3. package/dist/cli/commands/catch-up.d.mts +9 -0
  4. package/dist/cli/commands/catch-up.d.mts.map +1 -0
  5. package/dist/cli/commands/catch-up.mjs +64 -0
  6. package/dist/cli/commands/catch-up.mjs.map +1 -0
  7. package/dist/cli/commands/init.d.mts.map +1 -1
  8. package/dist/cli/commands/init.mjs +17 -1
  9. package/dist/cli/commands/init.mjs.map +1 -1
  10. package/dist/cli/commands/pr-review.d.mts +16 -4
  11. package/dist/cli/commands/pr-review.d.mts.map +1 -1
  12. package/dist/cli/commands/pr-review.mjs +30 -11
  13. package/dist/cli/commands/pr-review.mjs.map +1 -1
  14. package/dist/cli/commands/route.d.mts.map +1 -1
  15. package/dist/cli/commands/route.mjs +92 -2
  16. package/dist/cli/commands/route.mjs.map +1 -1
  17. package/dist/cli/commands/validate-evidence.d.mts +1 -1
  18. package/dist/cli/config/share-policy.d.mts.map +1 -1
  19. package/dist/cli/config/share-policy.mjs +1 -0
  20. package/dist/cli/config/share-policy.mjs.map +1 -1
  21. package/dist/cli/config/upgrade-gitignore.d.mts.map +1 -1
  22. package/dist/cli/config/upgrade-gitignore.mjs +1 -0
  23. package/dist/cli/config/upgrade-gitignore.mjs.map +1 -1
  24. package/dist/cli/consistency/parse-review.mjs +5 -3
  25. package/dist/cli/consistency/parse-review.mjs.map +1 -1
  26. package/dist/cli/consistency/rules/r5-verdict-consistency.d.mts.map +1 -1
  27. package/dist/cli/consistency/rules/r5-verdict-consistency.mjs +10 -8
  28. package/dist/cli/consistency/rules/r5-verdict-consistency.mjs.map +1 -1
  29. package/dist/cli/coordination/catch-up.d.mts +26 -0
  30. package/dist/cli/coordination/catch-up.d.mts.map +1 -0
  31. package/dist/cli/coordination/catch-up.mjs +239 -0
  32. package/dist/cli/coordination/catch-up.mjs.map +1 -0
  33. package/dist/cli/coordination/last-seen.d.mts +45 -0
  34. package/dist/cli/coordination/last-seen.d.mts.map +1 -0
  35. package/dist/cli/coordination/last-seen.mjs +128 -0
  36. package/dist/cli/coordination/last-seen.mjs.map +1 -0
  37. package/dist/cli/coordination/store.d.mts +15 -0
  38. package/dist/cli/coordination/store.d.mts.map +1 -1
  39. package/dist/cli/coordination/store.mjs +16 -0
  40. package/dist/cli/coordination/store.mjs.map +1 -1
  41. package/dist/cli/design/frontmatter-schema.d.mts +8 -8
  42. package/dist/cli/dispatch.d.mts.map +1 -1
  43. package/dist/cli/dispatch.mjs +2 -0
  44. package/dist/cli/dispatch.mjs.map +1 -1
  45. package/dist/cli/gate/gates/review-clean.d.mts.map +1 -1
  46. package/dist/cli/gate/gates/review-clean.mjs +4 -2
  47. package/dist/cli/gate/gates/review-clean.mjs.map +1 -1
  48. package/dist/cli/git/default-branch.d.mts +51 -0
  49. package/dist/cli/git/default-branch.d.mts.map +1 -0
  50. package/dist/cli/git/default-branch.mjs +234 -0
  51. package/dist/cli/git/default-branch.mjs.map +1 -0
  52. package/dist/cli/git/identity.d.mts +3 -5
  53. package/dist/cli/git/identity.d.mts.map +1 -1
  54. package/dist/cli/git/identity.mjs +10 -4
  55. package/dist/cli/git/identity.mjs.map +1 -1
  56. package/dist/cli/install/legacy-paths.d.mts.map +1 -1
  57. package/dist/cli/install/legacy-paths.mjs +2 -0
  58. package/dist/cli/install/legacy-paths.mjs.map +1 -1
  59. package/dist/cli/install/mcp-provision.d.mts +26 -0
  60. package/dist/cli/install/mcp-provision.d.mts.map +1 -0
  61. package/dist/cli/install/mcp-provision.mjs +281 -0
  62. package/dist/cli/install/mcp-provision.mjs.map +1 -0
  63. package/dist/cli/install/mcp-server-specs.d.mts +80 -0
  64. package/dist/cli/install/mcp-server-specs.d.mts.map +1 -0
  65. package/dist/cli/install/mcp-server-specs.mjs +102 -0
  66. package/dist/cli/install/mcp-server-specs.mjs.map +1 -0
  67. package/dist/cli/install/runtime-detect.d.mts +1 -0
  68. package/dist/cli/install/runtime-detect.d.mts.map +1 -1
  69. package/dist/cli/install/runtime-detect.mjs +5 -0
  70. package/dist/cli/install/runtime-detect.mjs.map +1 -1
  71. package/dist/cli/install/toml-merge.d.mts +40 -0
  72. package/dist/cli/install/toml-merge.d.mts.map +1 -0
  73. package/dist/cli/install/toml-merge.mjs +134 -0
  74. package/dist/cli/install/toml-merge.mjs.map +1 -0
  75. package/dist/cli/personas/sidecar.d.mts +1 -1
  76. package/dist/cli/roadmap/lifecycle.d.mts +1 -1
  77. package/dist/cli/roadmap/rollup.d.mts +2 -2
  78. package/dist/cli/util/events-path.d.mts +8 -0
  79. package/dist/cli/util/events-path.d.mts.map +1 -0
  80. package/dist/cli/util/events-path.mjs +23 -0
  81. package/dist/cli/util/events-path.mjs.map +1 -0
  82. package/dist/cli/util/runtime-capabilities.d.mts +30 -0
  83. package/dist/cli/util/runtime-capabilities.d.mts.map +1 -0
  84. package/dist/cli/util/runtime-capabilities.mjs +214 -0
  85. package/dist/cli/util/runtime-capabilities.mjs.map +1 -0
  86. package/dist/cli/verify-proof/audit.d.mts +2 -7
  87. package/dist/cli/verify-proof/audit.d.mts.map +1 -1
  88. package/dist/cli/verify-proof/audit.mjs +11 -17
  89. package/dist/cli/verify-proof/audit.mjs.map +1 -1
  90. package/dist/cli/verify-proof/runtime-detect.d.mts +2 -29
  91. package/dist/cli/verify-proof/runtime-detect.d.mts.map +1 -1
  92. package/dist/cli/verify-proof/runtime-detect.mjs +8 -203
  93. package/dist/cli/verify-proof/runtime-detect.mjs.map +1 -1
  94. package/dist/plugin/.claude-plugin/plugin.json +2 -1
  95. package/dist/plugin/agents/apt-verifier.md +6 -3
  96. package/dist/plugin/skills/apt/SKILL.md +29 -0
  97. package/dist/plugin/skills/apt-catch-up/SKILL.md +79 -0
  98. package/dist/plugin/skills/apt-pr-review/SKILL.md +59 -4
  99. package/dist/plugin/skills/apt-setup/SKILL.md +76 -0
  100. package/dist/plugin/skills/apt-verify/SKILL.md +1 -1
  101. package/dist/plugin/skills/apt-verify-proof/SKILL.md +25 -1
  102. package/drivers/browser/skill/agent-browser/SKILL.md +51 -0
  103. package/drivers/tauri/README.md +107 -0
  104. package/drivers/tauri/driver.mjs +88 -0
  105. package/drivers/tauri/manifest.json +37 -0
  106. package/drivers/tauri/scripts/tauri-mcp.sh +41 -0
  107. package/package.json +138 -138
  108. package/skills/apt/SKILL.md +29 -0
  109. package/skills/apt-catch-up/SKILL.md +79 -0
  110. package/skills/apt-pr-review/SKILL.md +59 -4
  111. package/skills/apt-setup/SKILL.md +76 -0
  112. package/skills/apt-verify/SKILL.md +1 -1
  113. package/skills/apt-verify-proof/SKILL.md +25 -1
  114. package/src/cli/commands/catch-up.mjs +67 -0
  115. package/src/cli/commands/init.mjs +19 -0
  116. package/src/cli/commands/pr-review.mjs +32 -11
  117. package/src/cli/commands/route.mjs +92 -1
  118. package/src/cli/config/share-policy.mjs +1 -0
  119. package/src/cli/config/upgrade-gitignore.mjs +1 -0
  120. package/src/cli/consistency/parse-review.mjs +5 -3
  121. package/src/cli/consistency/rules/r5-verdict-consistency.mjs +14 -9
  122. package/src/cli/coordination/catch-up.mjs +231 -0
  123. package/src/cli/coordination/last-seen.mjs +131 -0
  124. package/src/cli/coordination/store.mjs +18 -0
  125. package/src/cli/dispatch.mjs +2 -0
  126. package/src/cli/gate/gates/review-clean.mjs +4 -2
  127. package/src/cli/git/default-branch.mjs +250 -0
  128. package/src/cli/git/identity.mjs +9 -3
  129. package/src/cli/install/legacy-paths.mjs +2 -0
  130. package/src/cli/install/mcp-provision.mjs +293 -0
  131. package/src/cli/install/mcp-server-specs.mjs +101 -0
  132. package/src/cli/install/runtime-detect.mjs +9 -0
  133. package/src/cli/install/toml-merge.mjs +139 -0
  134. package/src/cli/util/events-path.mjs +24 -0
  135. package/src/cli/util/runtime-capabilities.mjs +216 -0
  136. package/src/cli/verify-proof/audit.mjs +11 -17
  137. package/src/cli/verify-proof/runtime-detect.mjs +11 -204
  138. package/templates/config.json +13 -1
@@ -3,12 +3,13 @@
3
3
  * consistency/rules/r5-verdict-consistency.mjs — R5 (C15).
4
4
  *
5
5
  * Fails when:
6
- * - qa.verdict === 'approved' AND review has >=1 unresolved critical finding
6
+ * - qa.verdict === 'approved' or 'approved-with-notes' AND review has >=1
7
+ * unresolved critical or major finding
7
8
  * - qa.verdict === 'rejected' AND qa has no findings at all AND review has
8
9
  * zero unresolved findings (rejected-without-evidence)
9
10
  *
10
- * `approved-with-notes` is the escape hatch passes regardless of unresolved
11
- * criticals in review.json.
11
+ * `approved-with-notes` no longer escapes unresolved critical or major
12
+ * findings (G42 Phase 1). It still passes for lower-severity issues.
12
13
  *
13
14
  * Severity: error. Stages: verify, ship.
14
15
  */
@@ -24,21 +25,22 @@ const rule = {
24
25
  }
25
26
  const verdict = parsed.qa.verdict ?? 'unknown';
26
27
  const reviewFindings = parsed?.review?.findings ?? [];
27
- const unresolvedCritical = reviewFindings.filter((f) => f.severity === 'critical' && f.status !== 'fixed');
28
- if (verdict === 'approved' && unresolvedCritical.length > 0) {
28
+ const unresolvedBlocking = reviewFindings.filter((f) => (f.severity === 'critical' || f.severity === 'major') && f.status !== 'fixed');
29
+ if ((verdict === 'approved' || verdict === 'approved-with-notes') &&
30
+ unresolvedBlocking.length > 0) {
29
31
  return {
30
32
  status: 'fail',
31
33
  drift: [
32
34
  {
33
35
  verdict,
34
- blockers: unresolvedCritical.map((f) => ({
36
+ blockers: unresolvedBlocking.map((f) => ({
35
37
  id: f.id,
36
38
  title: f.title,
37
39
  })),
38
- reason: 'approved verdict with unresolved critical finding(s)',
40
+ reason: 'approved/approved-with-notes verdict with unresolved critical or major finding(s) (G42 Phase 1)',
39
41
  },
40
42
  ],
41
- reason: `approved verdict contradicts ${unresolvedCritical.length} unresolved critical finding(s)`,
43
+ reason: `approved/approved-with-notes verdict contradicts ${unresolvedBlocking.length} unresolved critical/major finding(s)`,
42
44
  };
43
45
  }
44
46
  if (verdict === 'rejected') {
@@ -1 +1 @@
1
- {"version":3,"file":"r5-verdict-consistency.mjs","sourceRoot":"","sources":["../../../../src/cli/consistency/rules/r5-verdict-consistency.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,MAAM,IAAI,GAAG;IACZ,EAAE,EAAE,wBAAwB;IAC5B,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,wDAAwD;IACrE,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE;QACrB,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;YAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAA;QAC5E,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,IAAI,SAAS,CAAA;QAC9C,MAAM,cAAc,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAA;QACrD,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CACxD,CAAA;QACD,IAAI,OAAO,KAAK,UAAU,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,OAAO;gBACN,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE;oBACN;wBACC,OAAO;wBACP,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BACxC,EAAE,EAAE,CAAC,CAAC,EAAE;4BACR,KAAK,EAAE,CAAC,CAAC,KAAK;yBACd,CAAC,CAAC;wBACH,MAAM,EAAE,sDAAsD;qBAC9D;iBACD;gBACD,MAAM,EAAE,gCAAgC,kBAAkB,CAAC,MAAM,iCAAiC;aAClG,CAAA;QACF,CAAC;QACD,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAA;YAC3C,MAAM,mBAAmB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAA;YAC5E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACrD,OAAO;oBACN,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE;wBACN;4BACC,OAAO;4BACP,QAAQ,EAAE,EAAE;4BACZ,MAAM,EAAE,6CAA6C;yBACrD;qBACD;oBACD,MAAM,EAAE,6CAA6C;iBACrD,CAAA;YACF,CAAC;QACF,CAAC;QACD,OAAO;YACN,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,WAAW,OAAO,qCAAqC;SAC/D,CAAA;IACF,CAAC;CACD,CAAA;AAED,YAAY,CAAC,IAAI,CAAC,CAAA;AAClB,eAAe,IAAI,CAAA"}
1
+ {"version":3,"file":"r5-verdict-consistency.mjs","sourceRoot":"","sources":["../../../../src/cli/consistency/rules/r5-verdict-consistency.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,MAAM,IAAI,GAAG;IACZ,EAAE,EAAE,wBAAwB;IAC5B,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,wDAAwD;IACrE,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE;QACrB,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;YAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAA;QAC5E,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,IAAI,SAAS,CAAA;QAC9C,MAAM,cAAc,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAA;QACrD,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CACpF,CAAA;QACD,IACC,CAAC,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,qBAAqB,CAAC;YAC7D,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAC5B,CAAC;YACF,OAAO;gBACN,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE;oBACN;wBACC,OAAO;wBACP,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BACxC,EAAE,EAAE,CAAC,CAAC,EAAE;4BACR,KAAK,EAAE,CAAC,CAAC,KAAK;yBACd,CAAC,CAAC;wBACH,MAAM,EACL,iGAAiG;qBAClG;iBACD;gBACD,MAAM,EAAE,oDAAoD,kBAAkB,CAAC,MAAM,uCAAuC;aAC5H,CAAA;QACF,CAAC;QACD,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAA;YAC3C,MAAM,mBAAmB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAA;YAC5E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACrD,OAAO;oBACN,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE;wBACN;4BACC,OAAO;4BACP,QAAQ,EAAE,EAAE;4BACZ,MAAM,EAAE,6CAA6C;yBACrD;qBACD;oBACD,MAAM,EAAE,6CAA6C;iBACrD,CAAA;YACF,CAAC;QACF,CAAC;QACD,OAAO;YACN,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,WAAW,OAAO,qCAAqC;SAC/D,CAAA;IACF,CAAC;CACD,CAAA;AAED,YAAY,CAAC,IAAI,CAAC,CAAA;AAClB,eAAe,IAAI,CAAA"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Compose the combined catch-up panel. Returns null when neither half fires.
3
+ *
4
+ * @param {string} projectRoot
5
+ * @param {object} params
6
+ * @param {object} params.config
7
+ * @param {number} params.now epoch ms
8
+ * @param {object|null} params.marker Last-Seen Marker
9
+ * @param {{ branch: string, sha: string }|null} params.defaultBranch
10
+ * @returns {{ welcome_back: object|null, team_digest: object|null }|null}
11
+ *
12
+ * @internal
13
+ */
14
+ export function computeCatchUpPanel(projectRoot: string, { config, now, marker, defaultBranch }?: {
15
+ config: object;
16
+ now: number;
17
+ marker: object | null;
18
+ defaultBranch: {
19
+ branch: string;
20
+ sha: string;
21
+ } | null;
22
+ }): {
23
+ welcome_back: object | null;
24
+ team_digest: object | null;
25
+ } | null;
26
+ //# sourceMappingURL=catch-up.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catch-up.d.mts","sourceRoot":"","sources":["../../../src/cli/coordination/catch-up.mjs"],"names":[],"mappings":"AAuMA;;;;;;;;;;;;GAYG;AACH,iDAVW,MAAM,2CAEd;IAAuB,MAAM,EAArB,MAAM;IACS,GAAG,EAAlB,MAAM;IACc,MAAM,EAA1B,MAAM,GAAC,IAAI;IACkC,aAAa,EAA1D;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAC,IAAI;CAC5C,GAAU;IAAE,YAAY,EAAE,MAAM,GAAC,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,GAAC,IAAI,CAAA;CAAE,GAAC,IAAI,CAsBxE"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * @internal
3
+ * coordination/catch-up.mjs — composes the combined catch-up panel: the
4
+ * Welcome-Back Summary (your own half-finished work, local-only) and the
5
+ * gated Team-Change Digest (what teammates merged while you were away).
6
+ *
7
+ * Composition order is fixed: welcome_back first, then team_digest (LD-10).
8
+ * The renderer (apt/SKILL.md) enforces display order; this module only sets
9
+ * the field order on the returned object.
10
+ *
11
+ * Both halves diff against one Last-Seen Marker:
12
+ * - Welcome-Back fires on a staleness threshold (now - last_run_at), reads
13
+ * only local state.active_tasks, and is ALWAYS-ON regardless of visibility
14
+ * (LD-08/09).
15
+ * - Team-Change Digest fires only when share.visibility is team/oss AND the
16
+ * local default-branch sha has moved since last_main_sha (LD-04/06/07).
17
+ *
18
+ * Returns null when neither half fires. This module is `@internal` — reached
19
+ * via the route.mjs lazy-compute path and the apt-tools catch-up command, not
20
+ * from bin/apt-tools.mjs directly.
21
+ */
22
+ import { existsSync, readFileSync } from 'node:fs';
23
+ import { join } from 'node:path';
24
+ import { resolveSharePolicy } from '../config/share-policy.mjs';
25
+ import { listMergedPullRequests } from '../git/default-branch.mjs';
26
+ import { getGitIdentity } from '../git/identity.mjs';
27
+ import { resolveSharedRoot } from './agent-identity.mjs';
28
+ const HOUR_MS = 60 * 60 * 1000;
29
+ /**
30
+ * Best-available per-task activity timestamp (ms). Prefers an explicit
31
+ * updated_at, then the most recent history entry, then created_at.
32
+ *
33
+ * @param {object} task
34
+ * @returns {number} epoch ms, or 0 when no timestamp is parseable.
35
+ */
36
+ function taskActivityMs(task) {
37
+ const candidates = [];
38
+ if (task?.updated_at)
39
+ candidates.push(Date.parse(task.updated_at));
40
+ if (Array.isArray(task?.history)) {
41
+ for (const h of task.history) {
42
+ if (h?.at)
43
+ candidates.push(Date.parse(h.at));
44
+ }
45
+ }
46
+ if (task?.created_at)
47
+ candidates.push(Date.parse(task.created_at));
48
+ const valid = candidates.filter((n) => Number.isFinite(n));
49
+ return valid.length ? Math.max(...valid) : 0;
50
+ }
51
+ /**
52
+ * A coarse "x ago" relative-time string. Kept dependency-free and stable for
53
+ * tests — granularity is minutes/hours/days.
54
+ *
55
+ * @param {number} deltaMs
56
+ * @returns {string}
57
+ */
58
+ function relativeTime(deltaMs) {
59
+ if (!Number.isFinite(deltaMs) || deltaMs < 0)
60
+ return 'just now';
61
+ const mins = Math.floor(deltaMs / 60000);
62
+ if (mins < 1)
63
+ return 'just now';
64
+ if (mins < 60)
65
+ return `${mins}m ago`;
66
+ const hours = Math.floor(mins / 60);
67
+ if (hours < 24)
68
+ return `${hours}h ago`;
69
+ const days = Math.floor(hours / 24);
70
+ return `${days}d ago`;
71
+ }
72
+ /**
73
+ * Read the first actionable next-step line from a task's CONTINUE note, if one
74
+ * exists at `.aperant/tasks/{taskId}/CONTINUE.md`. Parses the first non-empty
75
+ * item under the `## Next Steps` heading (the pause-note format).
76
+ *
77
+ * @param {string} sharedRoot
78
+ * @param {string} taskId
79
+ * @returns {string|null}
80
+ */
81
+ function readNextStepLine(sharedRoot, taskId) {
82
+ if (!taskId)
83
+ return null;
84
+ const notePath = join(sharedRoot, '.aperant', 'tasks', taskId, 'CONTINUE.md');
85
+ if (!existsSync(notePath))
86
+ return null;
87
+ let text;
88
+ try {
89
+ text = readFileSync(notePath, 'utf-8');
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ const lines = text.split('\n');
95
+ const headingIdx = lines.findIndex((l) => /^##\s+Next Steps\s*$/i.test(l.trim()));
96
+ if (headingIdx === -1)
97
+ return null;
98
+ for (let i = headingIdx + 1; i < lines.length; i++) {
99
+ const raw = lines[i].trim();
100
+ if (raw.startsWith('##'))
101
+ break; // next section
102
+ if (raw.length === 0)
103
+ continue;
104
+ // Strip a leading list marker: "1. ", "- ", "* ".
105
+ const cleaned = raw.replace(/^(\d+\.|[-*])\s+/, '').trim();
106
+ if (cleaned.length > 0)
107
+ return cleaned;
108
+ }
109
+ return null;
110
+ }
111
+ /**
112
+ * Build the Welcome-Back half from local state (LD-08/09). Returns null when
113
+ * the threshold has not elapsed or there is no active task.
114
+ *
115
+ * @param {object} params
116
+ * @param {object} params.config
117
+ * @param {number} params.now epoch ms
118
+ * @param {object|null} params.marker
119
+ * @param {object|null} params.state raw state.json (for active_tasks)
120
+ * @param {string} params.sharedRoot
121
+ * @returns {object|null}
122
+ */
123
+ function buildWelcomeBack({ config, now, marker, state, sharedRoot }) {
124
+ const wb = config?.collaboration?.welcome_back;
125
+ if (wb?.enabled === false)
126
+ return null;
127
+ const lastRunAt = marker?.last_run_at ? Date.parse(marker.last_run_at) : NaN;
128
+ const thresholdHours = Number.isFinite(wb?.threshold_hours) ? wb.threshold_hours : 16;
129
+ // Only fire when we have a baseline AND the gap strictly exceeds the threshold.
130
+ if (!Number.isFinite(lastRunAt))
131
+ return null;
132
+ if (now - lastRunAt <= thresholdHours * HOUR_MS)
133
+ return null;
134
+ const activeTasks = state?.active_tasks && typeof state.active_tasks === 'object' ? state.active_tasks : {};
135
+ const ids = Object.keys(activeTasks);
136
+ if (ids.length === 0)
137
+ return null;
138
+ // Pick the single most-recently-active task.
139
+ let bestId = null;
140
+ let bestMs = -1;
141
+ for (const id of ids) {
142
+ const ms = taskActivityMs(activeTasks[id]);
143
+ if (ms > bestMs) {
144
+ bestMs = ms;
145
+ bestId = id;
146
+ }
147
+ }
148
+ if (!bestId)
149
+ return null;
150
+ const task = activeTasks[bestId];
151
+ const currentSubtask = task?.progress?.current_subtask ?? task?.current_subtask ?? null;
152
+ return {
153
+ task_id: bestId,
154
+ description: task?.description ?? bestId,
155
+ lifecycle_phase: task?.lifecycle_phase ?? null,
156
+ current_subtask: currentSubtask,
157
+ progress: task?.progress ?? null,
158
+ relative_time: bestMs > 0 ? relativeTime(now - bestMs) : null,
159
+ next_step: readNextStepLine(sharedRoot, bestId),
160
+ others_count: Math.max(0, ids.length - 1),
161
+ };
162
+ }
163
+ /**
164
+ * Build the Team-Change Digest half (LD-04/06/07). Returns null when the
165
+ * visibility gate is closed (solo), the digest is disabled, or the
166
+ * default-branch sha has not moved since the marker.
167
+ *
168
+ * @param {object} params
169
+ * @param {string} params.projectRoot
170
+ * @param {object} params.config
171
+ * @param {object|null} params.marker
172
+ * @param {{ branch: string, sha: string }|null} params.defaultBranch
173
+ * @returns {object|null}
174
+ */
175
+ function buildTeamDigest({ projectRoot, config, marker, defaultBranch }) {
176
+ const td = config?.collaboration?.team_digest;
177
+ if (td?.enabled === false)
178
+ return null;
179
+ const visibility = resolveSharePolicy(config).visibility;
180
+ if (visibility !== 'team' && visibility !== 'oss')
181
+ return null;
182
+ if (!defaultBranch?.sha)
183
+ return null;
184
+ // Only fire when main has actually moved since the recorded baseline.
185
+ if (marker?.last_main_sha && marker.last_main_sha === defaultBranch.sha)
186
+ return null;
187
+ const maxEntries = Number.isInteger(td?.max_entries) && td.max_entries > 0 ? td.max_entries : 7;
188
+ const identity = (() => {
189
+ try {
190
+ return getGitIdentity(projectRoot);
191
+ }
192
+ catch {
193
+ return null;
194
+ }
195
+ })();
196
+ const { entries, more_count } = listMergedPullRequests(projectRoot, {
197
+ sinceSha: marker?.last_main_sha || null,
198
+ defaultBranch: defaultBranch.branch,
199
+ currentUserEmail: identity?.email || '',
200
+ maxEntries,
201
+ });
202
+ if (entries.length === 0 && more_count === 0)
203
+ return null;
204
+ return { entries, more_count };
205
+ }
206
+ /**
207
+ * Compose the combined catch-up panel. Returns null when neither half fires.
208
+ *
209
+ * @param {string} projectRoot
210
+ * @param {object} params
211
+ * @param {object} params.config
212
+ * @param {number} params.now epoch ms
213
+ * @param {object|null} params.marker Last-Seen Marker
214
+ * @param {{ branch: string, sha: string }|null} params.defaultBranch
215
+ * @returns {{ welcome_back: object|null, team_digest: object|null }|null}
216
+ *
217
+ * @internal
218
+ */
219
+ export function computeCatchUpPanel(projectRoot, { config, now, marker, defaultBranch } = {}) {
220
+ const sharedRoot = resolveSharedRoot(projectRoot);
221
+ const state = (() => {
222
+ const statePath = join(sharedRoot, '.aperant', 'state.json');
223
+ if (!existsSync(statePath))
224
+ return null;
225
+ try {
226
+ return JSON.parse(readFileSync(statePath, 'utf-8'));
227
+ }
228
+ catch {
229
+ return null;
230
+ }
231
+ })();
232
+ const welcome_back = buildWelcomeBack({ config, now, marker, state, sharedRoot });
233
+ const team_digest = buildTeamDigest({ projectRoot, config, marker, defaultBranch });
234
+ if (!welcome_back && !team_digest)
235
+ return null;
236
+ // Fixed field order: welcome_back first (LD-10).
237
+ return { welcome_back, team_digest };
238
+ }
239
+ //# sourceMappingURL=catch-up.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catch-up.mjs","sourceRoot":"","sources":["../../../src/cli/coordination/catch-up.mjs"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Slug a git email into a filesystem-safe key: lowercase, every run of
3
+ * non-[a-z0-9] characters collapsed to a single '-'.
4
+ *
5
+ * @param {string} email
6
+ * @returns {string}
7
+ */
8
+ export function slugFromEmail(email: string): string;
9
+ /**
10
+ * Read the current user's Last-Seen Marker. Returns null when the git email is
11
+ * absent (no identity → no key) or the file does not yet exist / is malformed.
12
+ *
13
+ * @param {string} projectRoot
14
+ * @returns {{ last_run_at: string|null, last_main_sha: string|null, last_active_task: string|null }|null}
15
+ *
16
+ * @internal
17
+ */
18
+ export function readLastSeen(projectRoot: string): {
19
+ last_run_at: string | null;
20
+ last_main_sha: string | null;
21
+ last_active_task: string | null;
22
+ } | null;
23
+ /**
24
+ * Advance the marker, merging partial fields onto any existing record.
25
+ *
26
+ * Marker-advance semantics (LD-02):
27
+ * - last_run_at is always settable (it measures engagement).
28
+ * - last_main_sha is optional — the caller passes it only AFTER the digest
29
+ * was computed (even when empty). When undefined, the existing sha is kept.
30
+ * - last_active_task is optional — the welcome-back task id, kept otherwise.
31
+ *
32
+ * No-op (returns null) when the git email is absent — there is no key to write.
33
+ *
34
+ * @param {string} projectRoot
35
+ * @param {{ last_run_at?: string, last_main_sha?: string|null, last_active_task?: string|null }} fields
36
+ * @returns {object|null} the written record, or null when there is no identity key.
37
+ *
38
+ * @internal
39
+ */
40
+ export function advanceLastSeen(projectRoot: string, fields?: {
41
+ last_run_at?: string;
42
+ last_main_sha?: string | null;
43
+ last_active_task?: string | null;
44
+ }): object | null;
45
+ //# sourceMappingURL=last-seen.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"last-seen.d.mts","sourceRoot":"","sources":["../../../src/cli/coordination/last-seen.mjs"],"names":[],"mappings":"AAiCA;;;;;;GAMG;AACH,qCAHW,MAAM,GACJ,MAAM,CAOlB;AAgBD;;;;;;;;GAQG;AACH,0CALW,MAAM,GACJ;IAAE,WAAW,EAAE,MAAM,GAAC,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,GAAC,IAAI,CAAC;IAAC,gBAAgB,EAAE,MAAM,GAAC,IAAI,CAAA;CAAE,GAAC,IAAI,CAkBxG;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,6CANW,MAAM,WACN;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAC,IAAI,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,GAAC,IAAI,CAAA;CAAE,GACnF,MAAM,GAAC,IAAI,CA+BvB"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * @internal
3
+ * last-seen.mjs — per-machine, per-git-identity Last-Seen Marker (LD-01).
4
+ *
5
+ * The collaboration catch-up surfaces (Welcome-Back Summary + Team-Change
6
+ * Digest) both diff against one baseline record per human/machine:
7
+ *
8
+ * .aperant/last-seen/{email-slug}.json → { last_run_at, last_main_sha, last_active_task }
9
+ *
10
+ * The slug is derived from the git `user.email` (stable per human/machine),
11
+ * lowercased with every non-[a-z0-9] run collapsed to '-'. The directory is
12
+ * gitignored in the same per-machine ephemeral class as `team-status/` and
13
+ * `events/` (see upgrade-gitignore.mjs / share-policy.mjs).
14
+ *
15
+ * Modeled on team-status.mjs: resolveSharedRoot-based path so the marker lives
16
+ * in the main repo even when called from a worktree; atomicWriteJson +
17
+ * mkdirSync(recursive) for durable writes.
18
+ *
19
+ * This module is `@internal` — consumed only through the CoordinationStore
20
+ * seam (store.readLastSeen / store.advanceLastSeen). Do NOT import it from
21
+ * bin/apt-tools.mjs.
22
+ */
23
+ import { existsSync, mkdirSync, readFileSync } from 'node:fs';
24
+ import { join } from 'node:path';
25
+ import { getGitIdentity } from '../git/identity.mjs';
26
+ import { atomicWriteJson } from '../util/io.mjs';
27
+ import { resolveSharedRoot } from './agent-identity.mjs';
28
+ function lastSeenDir(projectRoot) {
29
+ return join(resolveSharedRoot(projectRoot), '.aperant', 'last-seen');
30
+ }
31
+ /**
32
+ * Slug a git email into a filesystem-safe key: lowercase, every run of
33
+ * non-[a-z0-9] characters collapsed to a single '-'.
34
+ *
35
+ * @param {string} email
36
+ * @returns {string}
37
+ */
38
+ export function slugFromEmail(email) {
39
+ return String(email)
40
+ .toLowerCase()
41
+ .replace(/[^a-z0-9]+/g, '-')
42
+ .replace(/^-+|-+$/g, '');
43
+ }
44
+ function markerPath(projectRoot) {
45
+ const identity = (() => {
46
+ try {
47
+ return getGitIdentity(projectRoot);
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ })();
53
+ if (!identity?.email)
54
+ return null;
55
+ const slug = slugFromEmail(identity.email);
56
+ if (!slug)
57
+ return null;
58
+ return join(lastSeenDir(projectRoot), `${slug}.json`);
59
+ }
60
+ /**
61
+ * Read the current user's Last-Seen Marker. Returns null when the git email is
62
+ * absent (no identity → no key) or the file does not yet exist / is malformed.
63
+ *
64
+ * @param {string} projectRoot
65
+ * @returns {{ last_run_at: string|null, last_main_sha: string|null, last_active_task: string|null }|null}
66
+ *
67
+ * @internal
68
+ */
69
+ export function readLastSeen(projectRoot) {
70
+ const path = markerPath(projectRoot);
71
+ if (!path || !existsSync(path))
72
+ return null;
73
+ try {
74
+ const record = JSON.parse(readFileSync(path, 'utf-8'));
75
+ if (!record || typeof record !== 'object')
76
+ return null;
77
+ return {
78
+ last_run_at: record.last_run_at ?? null,
79
+ last_main_sha: record.last_main_sha ?? null,
80
+ last_active_task: record.last_active_task ?? null,
81
+ };
82
+ }
83
+ catch {
84
+ return null;
85
+ }
86
+ }
87
+ /**
88
+ * Advance the marker, merging partial fields onto any existing record.
89
+ *
90
+ * Marker-advance semantics (LD-02):
91
+ * - last_run_at is always settable (it measures engagement).
92
+ * - last_main_sha is optional — the caller passes it only AFTER the digest
93
+ * was computed (even when empty). When undefined, the existing sha is kept.
94
+ * - last_active_task is optional — the welcome-back task id, kept otherwise.
95
+ *
96
+ * No-op (returns null) when the git email is absent — there is no key to write.
97
+ *
98
+ * @param {string} projectRoot
99
+ * @param {{ last_run_at?: string, last_main_sha?: string|null, last_active_task?: string|null }} fields
100
+ * @returns {object|null} the written record, or null when there is no identity key.
101
+ *
102
+ * @internal
103
+ */
104
+ export function advanceLastSeen(projectRoot, fields = {}) {
105
+ const path = markerPath(projectRoot);
106
+ if (!path)
107
+ return null;
108
+ let existing = {};
109
+ if (existsSync(path)) {
110
+ try {
111
+ existing = JSON.parse(readFileSync(path, 'utf-8')) || {};
112
+ }
113
+ catch {
114
+ existing = {};
115
+ }
116
+ }
117
+ const record = {
118
+ last_run_at: fields.last_run_at !== undefined ? fields.last_run_at : (existing.last_run_at ?? null),
119
+ last_main_sha: fields.last_main_sha !== undefined ? fields.last_main_sha : (existing.last_main_sha ?? null),
120
+ last_active_task: fields.last_active_task !== undefined
121
+ ? fields.last_active_task
122
+ : (existing.last_active_task ?? null),
123
+ };
124
+ mkdirSync(lastSeenDir(projectRoot), { recursive: true });
125
+ atomicWriteJson(path, record);
126
+ return record;
127
+ }
128
+ //# sourceMappingURL=last-seen.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"last-seen.mjs","sourceRoot":"","sources":["../../../src/cli/coordination/last-seen.mjs"],"names":[],"mappings":"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"}
@@ -58,6 +58,21 @@ export function createCoordinationStore(projectRoot: any): {
58
58
  data: any;
59
59
  };
60
60
  } | null;
61
+ /**
62
+ * @internal — LD-01: read the per-machine Last-Seen Marker. Returns
63
+ * null when the git email is absent or the marker has not been written.
64
+ */
65
+ readLastSeen(): {
66
+ last_run_at: string | null;
67
+ last_main_sha: string | null;
68
+ last_active_task: string | null;
69
+ } | null;
70
+ /**
71
+ * @internal — LD-02: advance the Last-Seen Marker. `last_run_at` is
72
+ * always settable; `last_main_sha` / `last_active_task` are optional
73
+ * partial fields merged onto the existing record.
74
+ */
75
+ advanceLastSeen(fields?: {}): object | null;
61
76
  /** @internal */
62
77
  getIdentity(): any;
63
78
  };
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.mts","sourceRoot":"","sources":["../../../src/cli/coordination/store.mjs"],"names":[],"mappings":"AAyCA;;;;;;GAMG;AACH;IAKE,gBAAgB;;IAGhB,sEAAsE;;IAUtE;;;OAGG;;IAWH;;;OAGG;;IAqBH;;;;OAIG;;IAKH,wCAAwC;;IAKxC;;;;OAIG;;IAKH;;;;;;;;;;OAUG;;;;;;;;;;;;;;IAiBH,gBAAgB;;EAKjB"}
1
+ {"version":3,"file":"store.d.mts","sourceRoot":"","sources":["../../../src/cli/coordination/store.mjs"],"names":[],"mappings":"AA0CA;;;;;;GAMG;AACH;IAKE,gBAAgB;;IAGhB,sEAAsE;;IAUtE;;;OAGG;;IAWH;;;OAGG;;IAqBH;;;;OAIG;;IAKH,wCAAwC;;IAKxC;;;;OAIG;;IAKH;;;;;;;;;;OAUG;;;;;;;;;;;;;;IAiBH;;;OAGG;;;;;;IAKH;;;;OAIG;;IAKH,gBAAgB;;EAKjB"}
@@ -32,6 +32,7 @@ import { atomicWriteJson } from '../util/io.mjs';
32
32
  import { getAgentIdentity, resolveSharedRoot } from './agent-identity.mjs';
33
33
  import { appendLifecycleEvent } from './event-log.mjs';
34
34
  import { validateConductorEvent } from './event-schema.mjs';
35
+ import { advanceLastSeen as lastSeenAdvance, readLastSeen as lastSeenRead } from './last-seen.mjs';
35
36
  import { listActive as teamStatusListActive, removeSelf as teamStatusRemoveSelf, upsertSelf as teamStatusUpsertSelf, } from './team-status.mjs';
36
37
  /**
37
38
  * Construct a coordination store bound to a specific project root. The
@@ -134,6 +135,21 @@ export function createCoordinationStore(projectRoot) {
134
135
  return null;
135
136
  }
136
137
  },
138
+ /**
139
+ * @internal — LD-01: read the per-machine Last-Seen Marker. Returns
140
+ * null when the git email is absent or the marker has not been written.
141
+ */
142
+ readLastSeen() {
143
+ return lastSeenRead(projectRoot);
144
+ },
145
+ /**
146
+ * @internal — LD-02: advance the Last-Seen Marker. `last_run_at` is
147
+ * always settable; `last_main_sha` / `last_active_task` are optional
148
+ * partial fields merged onto the existing record.
149
+ */
150
+ advanceLastSeen(fields = {}) {
151
+ return lastSeenAdvance(projectRoot, fields);
152
+ },
137
153
  /** @internal */
138
154
  getIdentity() {
139
155
  return getAgentIdentity(projectRoot);
@@ -1 +1 @@
1
- {"version":3,"file":"store.mjs","sourceRoot":"","sources":["../../../src/cli/coordination/store.mjs"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.mjs","sourceRoot":"","sources":["../../../src/cli/coordination/store.mjs"],"names":[],"mappings":"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"}
@@ -82,21 +82,21 @@ export const TokensSchema: z.ZodObject<{
82
82
  }, z.core.$loose>;
83
83
  export const ComponentsSchema: z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>>;
84
84
  export const AntiPatternCategorySchema: z.ZodEnum<{
85
- content: "content";
86
85
  color: "color";
87
86
  typography: "typography";
88
- layout: "layout";
89
87
  motion: "motion";
88
+ layout: "layout";
89
+ content: "content";
90
90
  interaction: "interaction";
91
91
  }>;
92
92
  export const AntiPatternSchema: z.ZodObject<{
93
93
  id: z.ZodString;
94
94
  category: z.ZodEnum<{
95
- content: "content";
96
95
  color: "color";
97
96
  typography: "typography";
98
- layout: "layout";
99
97
  motion: "motion";
98
+ layout: "layout";
99
+ content: "content";
100
100
  interaction: "interaction";
101
101
  }>;
102
102
  pattern: z.ZodString;
@@ -106,11 +106,11 @@ export const AntiPatternSchema: z.ZodObject<{
106
106
  export const AntiPatternsSchema: z.ZodArray<z.ZodObject<{
107
107
  id: z.ZodString;
108
108
  category: z.ZodEnum<{
109
- content: "content";
110
109
  color: "color";
111
110
  typography: "typography";
112
- layout: "layout";
113
111
  motion: "motion";
112
+ layout: "layout";
113
+ content: "content";
114
114
  interaction: "interaction";
115
115
  }>;
116
116
  pattern: z.ZodString;
@@ -162,11 +162,11 @@ export const DesignFrontmatterSchema: z.ZodObject<{
162
162
  antiPatterns: z.ZodOptional<z.ZodArray<z.ZodObject<{
163
163
  id: z.ZodString;
164
164
  category: z.ZodEnum<{
165
- content: "content";
166
165
  color: "color";
167
166
  typography: "typography";
168
- layout: "layout";
169
167
  motion: "motion";
168
+ layout: "layout";
169
+ content: "content";
170
170
  interaction: "interaction";
171
171
  }>;
172
172
  pattern: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.d.mts","sourceRoot":"","sources":["../../src/cli/dispatch.mjs"],"names":[],"mappings":"AA+GA;;;;;;GAMG;AACH,uCAFa,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CA+DjD;AAMD,gEAAgE;AAChE,uBADW,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAkJ3D"}
1
+ {"version":3,"file":"dispatch.d.mts","sourceRoot":"","sources":["../../src/cli/dispatch.mjs"],"names":[],"mappings":"AAgHA;;;;;;GAMG;AACH,uCAFa,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CA+DjD;AAMD,gEAAgE;AAChE,uBADW,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAmJ3D"}