@jaggerxtrm/specialists 3.17.0 → 3.18.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 (246) hide show
  1. package/README.md +268 -134
  2. package/config/mandatory-rules/json-only-final-output.md +13 -0
  3. package/config/mandatory-rules/service-skills-diff-scan-mandatory.md +26 -0
  4. package/config/mandatory-rules/service-skills-gitnexus-triage.md +5 -0
  5. package/config/skills/setup-specialists/SKILL.md +556 -0
  6. package/config/skills/specialists-creator/SKILL.md +132 -4
  7. package/config/skills/specialists-creator/scripts/audit-spec-uniformity.mjs +1 -1
  8. package/config/specialists/bare.specialist.json +3 -3
  9. package/config/specialists/changelog-drafter.specialist.json +5 -4
  10. package/config/specialists/changelog-keeper.specialist.json +7 -6
  11. package/config/specialists/debugger.specialist.json +2 -2
  12. package/config/specialists/executor.specialist.json +2 -2
  13. package/config/specialists/explorer.specialist.json +4 -4
  14. package/config/specialists/memory-processor.specialist.json +3 -3
  15. package/config/specialists/node-coordinator.specialist.json +3 -3
  16. package/config/specialists/obligations-scanner.specialist.json +67 -17
  17. package/config/specialists/overthinker.specialist.json +3 -3
  18. package/config/specialists/planner.specialist.json +4 -4
  19. package/config/specialists/quant-methodologist.specialist.json +145 -0
  20. package/config/specialists/quant-researcher.specialist.json +144 -0
  21. package/config/specialists/researcher.specialist.json +5 -5
  22. package/config/specialists/reviewer.specialist.json +1 -1
  23. package/config/specialists/seconder.specialist.json +2 -2
  24. package/config/specialists/security-auditor.specialist.json +2 -2
  25. package/config/specialists/service-skills-sync.specialist.json +90 -75
  26. package/config/specialists/specialists-creator.specialist.json +4 -4
  27. package/config/specialists/sync-docs.specialist.json +4 -4
  28. package/config/specialists/test-engineer.specialist.json +3 -3
  29. package/config/specialists/test-runner.specialist.json +7 -7
  30. package/config/specialists/transcriber.specialist.json +3 -3
  31. package/config/specialists/xt-merge.specialist.json +4 -4
  32. package/dist/asset-contract.json +21 -2
  33. package/dist/index.js +25704 -16376
  34. package/dist/lib.js +9849 -6147
  35. package/dist/types/cli/console/components.d.ts +83 -0
  36. package/dist/types/cli/console/components.d.ts.map +1 -0
  37. package/dist/types/cli/console/config-source.d.ts +58 -0
  38. package/dist/types/cli/console/config-source.d.ts.map +1 -0
  39. package/dist/types/cli/console/forensic.d.ts +11 -0
  40. package/dist/types/cli/console/forensic.d.ts.map +1 -0
  41. package/dist/types/cli/console/git.d.ts +28 -0
  42. package/dist/types/cli/console/git.d.ts.map +1 -0
  43. package/dist/types/cli/console/help.d.ts +2 -0
  44. package/dist/types/cli/console/help.d.ts.map +1 -0
  45. package/dist/types/cli/console/log.d.ts +13 -0
  46. package/dist/types/cli/console/log.d.ts.map +1 -0
  47. package/dist/types/cli/console/repo-config.d.ts +26 -0
  48. package/dist/types/cli/console/repo-config.d.ts.map +1 -0
  49. package/dist/types/cli/console/repo-discovery.d.ts +12 -0
  50. package/dist/types/cli/console/repo-discovery.d.ts.map +1 -0
  51. package/dist/types/cli/console/runtime.d.ts +12 -0
  52. package/dist/types/cli/console/runtime.d.ts.map +1 -0
  53. package/dist/types/cli/console/subscribe-prototype.d.ts +18 -0
  54. package/dist/types/cli/console/subscribe-prototype.d.ts.map +1 -0
  55. package/dist/types/cli/console/theme.d.ts +91 -0
  56. package/dist/types/cli/console/theme.d.ts.map +1 -0
  57. package/dist/types/cli/console/types.d.ts +231 -0
  58. package/dist/types/cli/console/types.d.ts.map +1 -0
  59. package/dist/types/cli/console/view-model.d.ts +252 -0
  60. package/dist/types/cli/console/view-model.d.ts.map +1 -0
  61. package/dist/types/cli/console.d.ts +2 -0
  62. package/dist/types/cli/console.d.ts.map +1 -0
  63. package/dist/types/cli/db.d.ts.map +1 -1
  64. package/dist/types/cli/doctor.d.ts.map +1 -1
  65. package/dist/types/cli/edit.d.ts.map +1 -1
  66. package/dist/types/cli/epic.d.ts.map +1 -1
  67. package/dist/types/cli/feed.d.ts.map +1 -1
  68. package/dist/types/cli/forensic.d.ts +2 -0
  69. package/dist/types/cli/forensic.d.ts.map +1 -0
  70. package/dist/types/cli/format-helpers.d.ts +4 -2
  71. package/dist/types/cli/format-helpers.d.ts.map +1 -1
  72. package/dist/types/cli/help.d.ts.map +1 -1
  73. package/dist/types/cli/init.d.ts +10 -0
  74. package/dist/types/cli/init.d.ts.map +1 -1
  75. package/dist/types/cli/list.d.ts.map +1 -1
  76. package/dist/types/cli/log.d.ts.map +1 -1
  77. package/dist/types/cli/metrics.d.ts +2 -0
  78. package/dist/types/cli/metrics.d.ts.map +1 -0
  79. package/dist/types/cli/ps.d.ts.map +1 -1
  80. package/dist/types/cli/result.d.ts.map +1 -1
  81. package/dist/types/cli/run.d.ts +1 -0
  82. package/dist/types/cli/run.d.ts.map +1 -1
  83. package/dist/types/cli/script.d.ts +3 -0
  84. package/dist/types/cli/script.d.ts.map +1 -1
  85. package/dist/types/cli/serve.d.ts.map +1 -1
  86. package/dist/types/cli/setup.d.ts +19 -1
  87. package/dist/types/cli/setup.d.ts.map +1 -1
  88. package/dist/types/cli/status.d.ts.map +1 -1
  89. package/dist/types/cli/version-check.d.ts +1 -0
  90. package/dist/types/cli/version-check.d.ts.map +1 -1
  91. package/dist/types/index.d.ts +1 -1
  92. package/dist/types/pi/session.d.ts +11 -1
  93. package/dist/types/pi/session.d.ts.map +1 -1
  94. package/dist/types/server.d.ts +15 -0
  95. package/dist/types/server.d.ts.map +1 -1
  96. package/dist/types/specialist/benchmarks.d.ts +37 -0
  97. package/dist/types/specialist/benchmarks.d.ts.map +1 -0
  98. package/dist/types/specialist/chain-identity.d.ts +7 -1
  99. package/dist/types/specialist/chain-identity.d.ts.map +1 -1
  100. package/dist/types/specialist/control.d.ts.map +1 -1
  101. package/dist/types/specialist/forensic-events.d.ts +138 -0
  102. package/dist/types/specialist/forensic-events.d.ts.map +1 -0
  103. package/dist/types/specialist/forensic-renderer.d.ts +34 -0
  104. package/dist/types/specialist/forensic-renderer.d.ts.map +1 -0
  105. package/dist/types/specialist/git-diff-evidence.d.ts +28 -0
  106. package/dist/types/specialist/git-diff-evidence.d.ts.map +1 -0
  107. package/dist/types/specialist/global-config.d.ts +389 -0
  108. package/dist/types/specialist/global-config.d.ts.map +1 -0
  109. package/dist/types/specialist/launch.d.ts +1 -0
  110. package/dist/types/specialist/launch.d.ts.map +1 -1
  111. package/dist/types/specialist/live-aggregates.d.ts +46 -0
  112. package/dist/types/specialist/live-aggregates.d.ts.map +1 -0
  113. package/dist/types/specialist/loader.d.ts +50 -1
  114. package/dist/types/specialist/loader.d.ts.map +1 -1
  115. package/dist/types/specialist/model-chain.d.ts +7 -0
  116. package/dist/types/specialist/model-chain.d.ts.map +1 -0
  117. package/dist/types/specialist/model-probes.d.ts +28 -0
  118. package/dist/types/specialist/model-probes.d.ts.map +1 -0
  119. package/dist/types/specialist/node-contract.d.ts +18 -18
  120. package/dist/types/specialist/node-supervisor.d.ts.map +1 -1
  121. package/dist/types/specialist/observability-db.d.ts +1 -1
  122. package/dist/types/specialist/observability-db.d.ts.map +1 -1
  123. package/dist/types/specialist/observability-sqlite.d.ts +25 -0
  124. package/dist/types/specialist/observability-sqlite.d.ts.map +1 -1
  125. package/dist/types/specialist/preset-resolver.d.ts +56 -0
  126. package/dist/types/specialist/preset-resolver.d.ts.map +1 -0
  127. package/dist/types/specialist/prometheus-projection.d.ts +25 -0
  128. package/dist/types/specialist/prometheus-projection.d.ts.map +1 -0
  129. package/dist/types/specialist/runner.d.ts +26 -1
  130. package/dist/types/specialist/runner.d.ts.map +1 -1
  131. package/dist/types/specialist/schema.d.ts +163 -54
  132. package/dist/types/specialist/schema.d.ts.map +1 -1
  133. package/dist/types/specialist/script-runner.d.ts +5 -1
  134. package/dist/types/specialist/script-runner.d.ts.map +1 -1
  135. package/dist/types/specialist/snapshot-diff.d.ts +8 -0
  136. package/dist/types/specialist/snapshot-diff.d.ts.map +1 -0
  137. package/dist/types/specialist/source-queue.d.ts +13 -0
  138. package/dist/types/specialist/source-queue.d.ts.map +1 -0
  139. package/dist/types/specialist/supervisor.d.ts +15 -1
  140. package/dist/types/specialist/supervisor.d.ts.map +1 -1
  141. package/dist/types/specialist/timeline-events.d.ts +68 -1
  142. package/dist/types/specialist/timeline-events.d.ts.map +1 -1
  143. package/dist/types/tools/specialist/resume_specialist.tool.d.ts +4 -4
  144. package/dist/types/tools/specialist/specialist_status.tool.d.ts +1 -1
  145. package/dist/types/tools/specialist/steer_specialist.tool.d.ts +4 -4
  146. package/dist/types/tools/specialist/use_specialist.tool.d.ts +16 -16
  147. package/docs/ARCHITECTURE.md +1176 -0
  148. package/docs/TODO.md +9 -0
  149. package/docs/architecture.md +11 -0
  150. package/docs/archive/2026-03-13-bd-decision-context-template-plan.md +96 -0
  151. package/docs/archive/AGENT-HANDOFF.md +351 -0
  152. package/docs/archive/PARITY-ANALYSIS.md +296 -0
  153. package/docs/archive/SPECIALISTS_REFACTOR.md.md +30 -0
  154. package/docs/archive/cc-programmatic.md +216 -0
  155. package/docs/archive/claude-agent-sdk.md +594 -0
  156. package/docs/archive/decision-specialist-directory.md +41 -0
  157. package/docs/archive/discoveries.md +148 -0
  158. package/docs/archive/executor-benchmark-protocol.md +198 -0
  159. package/docs/archive/future-features.md +66 -0
  160. package/docs/archive/gzrx-completion-critique.md +183 -0
  161. package/docs/archive/gzrx-research-notes.md +401 -0
  162. package/docs/archive/gzrx-tool-catalog.md +760 -0
  163. package/docs/archive/iron-review-hardening-qa-chain-substrate.md +322 -0
  164. package/docs/archive/iron-review-hardening.html +1004 -0
  165. package/docs/archive/issuetracking.md +312 -0
  166. package/docs/archive/qa-v3.0.2.md +220 -0
  167. package/docs/archive/restructure.md +231 -0
  168. package/docs/archive/script-specialists.md +1254 -0
  169. package/docs/archive/spec-v3.md +792 -0
  170. package/docs/archive/specialist-stats.md +127 -0
  171. package/docs/archive/specialists-friction-audit.md +1347 -0
  172. package/docs/archive/specialists-runtime-critique.md +170 -0
  173. package/docs/archive/specialists-service-evaluation.md +713 -0
  174. package/docs/archive/specialists-substrate-alignment.md +255 -0
  175. package/docs/archive/substrate-review.md +1288 -0
  176. package/docs/archive/test-writer-specialist.md +254 -0
  177. package/docs/archive/using-specialists-v3-improvements-2026-05-09.md +600 -0
  178. package/docs/archive/xtrm-specialists-analysis.md +314 -0
  179. package/docs/authoring.md +701 -0
  180. package/docs/background-jobs.md +203 -0
  181. package/docs/bare-specialists.md +83 -0
  182. package/docs/benchmarks/executor-benchmark-runner.md +66 -0
  183. package/docs/bootstrap.md +161 -0
  184. package/docs/cli-reference.md +1645 -0
  185. package/docs/deploying-alongside.md +155 -0
  186. package/docs/design/README.md +36 -0
  187. package/docs/design/darth-feedor-migration.md +290 -0
  188. package/docs/design/roadmap/README.md +32 -0
  189. package/docs/design/roadmap/chain-templates/README.md +146 -0
  190. package/docs/design/roadmap/chain-templates/code-quick.formula.json +27 -0
  191. package/docs/design/roadmap/chain-templates/code-standard.formula.json +126 -0
  192. package/docs/design/roadmap/chain-templates/code-with-advisors.formula.json +128 -0
  193. package/docs/design/roadmap/chain-templates/code-with-tests.formula.json +76 -0
  194. package/docs/design/roadmap/chain-templates/debug.formula.json +128 -0
  195. package/docs/design/roadmap/chain-templates/doc-sync.formula.json +28 -0
  196. package/docs/design/roadmap/chain-templates/memory-hygiene.formula.json +27 -0
  197. package/docs/design/roadmap/chain-templates/planning.formula.json +27 -0
  198. package/docs/design/roadmap/chain-templates/premortem.formula.json +26 -0
  199. package/docs/design/roadmap/chain-templates/release-prep.formula.json +36 -0
  200. package/docs/design/roadmap/chain-templates/research-only.formula.json +28 -0
  201. package/docs/design/roadmap/chain-templates/restitch.formula.json +125 -0
  202. package/docs/design/roadmap/chain-templates/security-deep.formula.json +161 -0
  203. package/docs/design/roadmap/chain-templates/test-only.formula.json +52 -0
  204. package/docs/design/roadmap/chain-templates/triage.formula.json +35 -0
  205. package/docs/design/roadmap/history/handoff-from-substrate-design.md +87 -0
  206. package/docs/design/roadmap/history/substrate-reconciliation.md +105 -0
  207. package/docs/design/roadmap/specialists-roadmap.md +1193 -0
  208. package/docs/design/sp-console-subscribe-via-materializer.md +231 -0
  209. package/docs/design/sp-console-tui-mock-v2.html +293 -0
  210. package/docs/design/sp-console-tui-mock.html +120 -0
  211. package/docs/design/sp-console-tui.md +340 -0
  212. package/docs/design/specialist-agentops-suite.md +323 -0
  213. package/docs/design/substrate/channels.md +14 -0
  214. package/docs/design/substrate/devops-platform-engineering-prd.md +446 -0
  215. package/docs/design/substrate/html-design-example.md +339 -0
  216. package/docs/design/xtrm-tiers-architecture.svg +132 -0
  217. package/docs/devops/dependency-verdict-materialization.md +46 -0
  218. package/docs/epic-readiness.md +75 -0
  219. package/docs/examples/mercury-atomic-summarizer.specialist.json +26 -0
  220. package/docs/examples/smoke-echo-text-expected-keys.specialist.json +25 -0
  221. package/docs/examples/smoke-echo.specialist.json +25 -0
  222. package/docs/features.md +1577 -0
  223. package/docs/hooks.md +81 -0
  224. package/docs/installation.md +142 -0
  225. package/docs/manifest.md +184 -0
  226. package/docs/mcp-servers.md +73 -0
  227. package/docs/mcp-tools.md +71 -0
  228. package/docs/nodes.md +231 -0
  229. package/docs/observability-metrics.md +152 -0
  230. package/docs/operator/sp-console-v2-walkthrough.md +410 -0
  231. package/docs/overrides-guide.md +306 -0
  232. package/docs/pi-rpc-boundary.md +118 -0
  233. package/docs/pi-session.md +195 -0
  234. package/docs/release.md +22 -0
  235. package/docs/skills.md +132 -0
  236. package/docs/specialists/handoff-schema.md +181 -0
  237. package/docs/specialists-catalog.md +99 -0
  238. package/docs/specialists-service-install.md +226 -0
  239. package/docs/specialists-service.md +363 -0
  240. package/docs/surface-ownership.md +138 -0
  241. package/docs/upgrade-notes/kan-90-global-user-config.md +114 -0
  242. package/docs/upgrade-notes/kan-91-expanded-overrides.md +261 -0
  243. package/docs/workflow.md +114 -0
  244. package/docs/worktree.md +71 -0
  245. package/docs/worktrees.md +309 -0
  246. package/package.json +6 -3
@@ -0,0 +1,389 @@
1
+ import * as z from 'zod';
2
+ declare const CONFIG_FILENAME = "user.json";
3
+ declare const SPECIALISTS_SUBDIR = "specialists";
4
+ export declare const GLOBAL_USER_CONFIG_DOC = "./overrides-guide.md";
5
+ export type GlobalConfigSource = 'xdg' | 'config-home' | 'legacy';
6
+ export interface GlobalUserConfigPath {
7
+ /** Absolute path to user.json (may not exist yet). */
8
+ path: string;
9
+ /** Whether the resolved path currently exists on disk. */
10
+ exists: boolean;
11
+ /** Which resolution rule produced this path. */
12
+ source: GlobalConfigSource;
13
+ }
14
+ /**
15
+ * Resolve the global user-config path. Resolution order:
16
+ * 1. $XDG_CONFIG_HOME/specialists/user.json -> source: 'xdg'
17
+ * 2. $HOME/.config/specialists/user.json -> source: 'config-home'
18
+ * 3. $HOME/.specialists/user.json (read-only) -> source: 'legacy'
19
+ *
20
+ * When $XDG_CONFIG_HOME is set it always wins (write target).
21
+ * When unset, config-home is the write target; legacy is a read-only
22
+ * fallback surfaced only when config-home is absent but legacy exists.
23
+ */
24
+ export declare function getGlobalUserConfigPath(): GlobalUserConfigPath;
25
+ export declare const GlobalSpecialistOverrideSchema: z.ZodObject<{
26
+ execution: z.ZodObject<{
27
+ model: z.ZodNullable<z.ZodString>;
28
+ fallback_model: z.ZodNullable<z.ZodString>;
29
+ fallback_models: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
30
+ timeout_ms: z.ZodNullable<z.ZodNumber>;
31
+ stall_timeout_ms: z.ZodNullable<z.ZodNumber>;
32
+ interactive: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
33
+ thinking_level: z.ZodNullable<z.ZodEnum<["off", "minimal", "low", "medium", "high", "xhigh"]>>;
34
+ max_retries: z.ZodNullable<z.ZodNumber>;
35
+ prompt_limit_bytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
36
+ stdout_limit_bytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
37
+ extensions: z.ZodOptional<z.ZodObject<{
38
+ serena: z.ZodNullable<z.ZodBoolean>;
39
+ gitnexus: z.ZodNullable<z.ZodBoolean>;
40
+ }, "strict", z.ZodTypeAny, {
41
+ gitnexus: boolean | null;
42
+ serena: boolean | null;
43
+ }, {
44
+ gitnexus: boolean | null;
45
+ serena: boolean | null;
46
+ }>>;
47
+ }, "strict", z.ZodTypeAny, {
48
+ model: string | null;
49
+ fallback_model: string | null;
50
+ timeout_ms: number | null;
51
+ stall_timeout_ms: number | null;
52
+ max_retries: number | null;
53
+ thinking_level: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | null;
54
+ extensions?: {
55
+ gitnexus: boolean | null;
56
+ serena: boolean | null;
57
+ } | undefined;
58
+ fallback_models?: string[] | null | undefined;
59
+ interactive?: boolean | null | undefined;
60
+ stdout_limit_bytes?: number | null | undefined;
61
+ prompt_limit_bytes?: number | null | undefined;
62
+ }, {
63
+ model: string | null;
64
+ fallback_model: string | null;
65
+ timeout_ms: number | null;
66
+ stall_timeout_ms: number | null;
67
+ max_retries: number | null;
68
+ thinking_level: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | null;
69
+ extensions?: {
70
+ gitnexus: boolean | null;
71
+ serena: boolean | null;
72
+ } | undefined;
73
+ fallback_models?: string[] | null | undefined;
74
+ interactive?: boolean | null | undefined;
75
+ stdout_limit_bytes?: number | null | undefined;
76
+ prompt_limit_bytes?: number | null | undefined;
77
+ }>;
78
+ prompt: z.ZodOptional<z.ZodObject<{
79
+ system_prompt_mode: z.ZodNullable<z.ZodEnum<["append", "replace"]>>;
80
+ }, "strict", z.ZodTypeAny, {
81
+ system_prompt_mode: "replace" | "append" | null;
82
+ }, {
83
+ system_prompt_mode: "replace" | "append" | null;
84
+ }>>;
85
+ stall_detection: z.ZodOptional<z.ZodObject<{
86
+ waiting_auto_close_ms: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
87
+ }, "strict", z.ZodTypeAny, {
88
+ waiting_auto_close_ms?: number | null | undefined;
89
+ }, {
90
+ waiting_auto_close_ms?: number | null | undefined;
91
+ }>>;
92
+ beads_write_notes: z.ZodNullable<z.ZodBoolean>;
93
+ notes_mode: z.ZodOptional<z.ZodNullable<z.ZodEnum<["full-trail", "final-only"]>>>;
94
+ output_file: z.ZodOptional<z.ZodNullable<z.ZodString>>;
95
+ skills: z.ZodObject<{
96
+ paths: z.ZodArray<z.ZodString, "many">;
97
+ }, "strict", z.ZodTypeAny, {
98
+ paths: string[];
99
+ }, {
100
+ paths: string[];
101
+ }>;
102
+ }, "strict", z.ZodTypeAny, {
103
+ execution: {
104
+ model: string | null;
105
+ fallback_model: string | null;
106
+ timeout_ms: number | null;
107
+ stall_timeout_ms: number | null;
108
+ max_retries: number | null;
109
+ thinking_level: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | null;
110
+ extensions?: {
111
+ gitnexus: boolean | null;
112
+ serena: boolean | null;
113
+ } | undefined;
114
+ fallback_models?: string[] | null | undefined;
115
+ interactive?: boolean | null | undefined;
116
+ stdout_limit_bytes?: number | null | undefined;
117
+ prompt_limit_bytes?: number | null | undefined;
118
+ };
119
+ skills: {
120
+ paths: string[];
121
+ };
122
+ beads_write_notes: boolean | null;
123
+ prompt?: {
124
+ system_prompt_mode: "replace" | "append" | null;
125
+ } | undefined;
126
+ stall_detection?: {
127
+ waiting_auto_close_ms?: number | null | undefined;
128
+ } | undefined;
129
+ output_file?: string | null | undefined;
130
+ notes_mode?: "full-trail" | "final-only" | null | undefined;
131
+ }, {
132
+ execution: {
133
+ model: string | null;
134
+ fallback_model: string | null;
135
+ timeout_ms: number | null;
136
+ stall_timeout_ms: number | null;
137
+ max_retries: number | null;
138
+ thinking_level: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | null;
139
+ extensions?: {
140
+ gitnexus: boolean | null;
141
+ serena: boolean | null;
142
+ } | undefined;
143
+ fallback_models?: string[] | null | undefined;
144
+ interactive?: boolean | null | undefined;
145
+ stdout_limit_bytes?: number | null | undefined;
146
+ prompt_limit_bytes?: number | null | undefined;
147
+ };
148
+ skills: {
149
+ paths: string[];
150
+ };
151
+ beads_write_notes: boolean | null;
152
+ prompt?: {
153
+ system_prompt_mode: "replace" | "append" | null;
154
+ } | undefined;
155
+ stall_detection?: {
156
+ waiting_auto_close_ms?: number | null | undefined;
157
+ } | undefined;
158
+ output_file?: string | null | undefined;
159
+ notes_mode?: "full-trail" | "final-only" | null | undefined;
160
+ }>;
161
+ export type GlobalSpecialistOverride = z.infer<typeof GlobalSpecialistOverrideSchema>;
162
+ export declare function getGlobalSpecialistOverrideLeafPaths(): readonly string[];
163
+ /** Top-level shape: { "<specialist-name>": GlobalSpecialistOverride }. Underscore keys are metadata sentinels. */
164
+ export declare const GlobalUserConfigSchema: z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodObject<{
165
+ execution: z.ZodObject<{
166
+ model: z.ZodNullable<z.ZodString>;
167
+ fallback_model: z.ZodNullable<z.ZodString>;
168
+ fallback_models: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
169
+ timeout_ms: z.ZodNullable<z.ZodNumber>;
170
+ stall_timeout_ms: z.ZodNullable<z.ZodNumber>;
171
+ interactive: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
172
+ thinking_level: z.ZodNullable<z.ZodEnum<["off", "minimal", "low", "medium", "high", "xhigh"]>>;
173
+ max_retries: z.ZodNullable<z.ZodNumber>;
174
+ prompt_limit_bytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
175
+ stdout_limit_bytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
176
+ extensions: z.ZodOptional<z.ZodObject<{
177
+ serena: z.ZodNullable<z.ZodBoolean>;
178
+ gitnexus: z.ZodNullable<z.ZodBoolean>;
179
+ }, "strict", z.ZodTypeAny, {
180
+ gitnexus: boolean | null;
181
+ serena: boolean | null;
182
+ }, {
183
+ gitnexus: boolean | null;
184
+ serena: boolean | null;
185
+ }>>;
186
+ }, "strict", z.ZodTypeAny, {
187
+ model: string | null;
188
+ fallback_model: string | null;
189
+ timeout_ms: number | null;
190
+ stall_timeout_ms: number | null;
191
+ max_retries: number | null;
192
+ thinking_level: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | null;
193
+ extensions?: {
194
+ gitnexus: boolean | null;
195
+ serena: boolean | null;
196
+ } | undefined;
197
+ fallback_models?: string[] | null | undefined;
198
+ interactive?: boolean | null | undefined;
199
+ stdout_limit_bytes?: number | null | undefined;
200
+ prompt_limit_bytes?: number | null | undefined;
201
+ }, {
202
+ model: string | null;
203
+ fallback_model: string | null;
204
+ timeout_ms: number | null;
205
+ stall_timeout_ms: number | null;
206
+ max_retries: number | null;
207
+ thinking_level: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | null;
208
+ extensions?: {
209
+ gitnexus: boolean | null;
210
+ serena: boolean | null;
211
+ } | undefined;
212
+ fallback_models?: string[] | null | undefined;
213
+ interactive?: boolean | null | undefined;
214
+ stdout_limit_bytes?: number | null | undefined;
215
+ prompt_limit_bytes?: number | null | undefined;
216
+ }>;
217
+ prompt: z.ZodOptional<z.ZodObject<{
218
+ system_prompt_mode: z.ZodNullable<z.ZodEnum<["append", "replace"]>>;
219
+ }, "strict", z.ZodTypeAny, {
220
+ system_prompt_mode: "replace" | "append" | null;
221
+ }, {
222
+ system_prompt_mode: "replace" | "append" | null;
223
+ }>>;
224
+ stall_detection: z.ZodOptional<z.ZodObject<{
225
+ waiting_auto_close_ms: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
226
+ }, "strict", z.ZodTypeAny, {
227
+ waiting_auto_close_ms?: number | null | undefined;
228
+ }, {
229
+ waiting_auto_close_ms?: number | null | undefined;
230
+ }>>;
231
+ beads_write_notes: z.ZodNullable<z.ZodBoolean>;
232
+ notes_mode: z.ZodOptional<z.ZodNullable<z.ZodEnum<["full-trail", "final-only"]>>>;
233
+ output_file: z.ZodOptional<z.ZodNullable<z.ZodString>>;
234
+ skills: z.ZodObject<{
235
+ paths: z.ZodArray<z.ZodString, "many">;
236
+ }, "strict", z.ZodTypeAny, {
237
+ paths: string[];
238
+ }, {
239
+ paths: string[];
240
+ }>;
241
+ }, "strict", z.ZodTypeAny, {
242
+ execution: {
243
+ model: string | null;
244
+ fallback_model: string | null;
245
+ timeout_ms: number | null;
246
+ stall_timeout_ms: number | null;
247
+ max_retries: number | null;
248
+ thinking_level: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | null;
249
+ extensions?: {
250
+ gitnexus: boolean | null;
251
+ serena: boolean | null;
252
+ } | undefined;
253
+ fallback_models?: string[] | null | undefined;
254
+ interactive?: boolean | null | undefined;
255
+ stdout_limit_bytes?: number | null | undefined;
256
+ prompt_limit_bytes?: number | null | undefined;
257
+ };
258
+ skills: {
259
+ paths: string[];
260
+ };
261
+ beads_write_notes: boolean | null;
262
+ prompt?: {
263
+ system_prompt_mode: "replace" | "append" | null;
264
+ } | undefined;
265
+ stall_detection?: {
266
+ waiting_auto_close_ms?: number | null | undefined;
267
+ } | undefined;
268
+ output_file?: string | null | undefined;
269
+ notes_mode?: "full-trail" | "final-only" | null | undefined;
270
+ }, {
271
+ execution: {
272
+ model: string | null;
273
+ fallback_model: string | null;
274
+ timeout_ms: number | null;
275
+ stall_timeout_ms: number | null;
276
+ max_retries: number | null;
277
+ thinking_level: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | null;
278
+ extensions?: {
279
+ gitnexus: boolean | null;
280
+ serena: boolean | null;
281
+ } | undefined;
282
+ fallback_models?: string[] | null | undefined;
283
+ interactive?: boolean | null | undefined;
284
+ stdout_limit_bytes?: number | null | undefined;
285
+ prompt_limit_bytes?: number | null | undefined;
286
+ };
287
+ skills: {
288
+ paths: string[];
289
+ };
290
+ beads_write_notes: boolean | null;
291
+ prompt?: {
292
+ system_prompt_mode: "replace" | "append" | null;
293
+ } | undefined;
294
+ stall_detection?: {
295
+ waiting_auto_close_ms?: number | null | undefined;
296
+ } | undefined;
297
+ output_file?: string | null | undefined;
298
+ notes_mode?: "full-trail" | "final-only" | null | undefined;
299
+ }>>, Record<string, {
300
+ execution: {
301
+ model: string | null;
302
+ fallback_model: string | null;
303
+ timeout_ms: number | null;
304
+ stall_timeout_ms: number | null;
305
+ max_retries: number | null;
306
+ thinking_level: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | null;
307
+ extensions?: {
308
+ gitnexus: boolean | null;
309
+ serena: boolean | null;
310
+ } | undefined;
311
+ fallback_models?: string[] | null | undefined;
312
+ interactive?: boolean | null | undefined;
313
+ stdout_limit_bytes?: number | null | undefined;
314
+ prompt_limit_bytes?: number | null | undefined;
315
+ };
316
+ skills: {
317
+ paths: string[];
318
+ };
319
+ beads_write_notes: boolean | null;
320
+ prompt?: {
321
+ system_prompt_mode: "replace" | "append" | null;
322
+ } | undefined;
323
+ stall_detection?: {
324
+ waiting_auto_close_ms?: number | null | undefined;
325
+ } | undefined;
326
+ output_file?: string | null | undefined;
327
+ notes_mode?: "full-trail" | "final-only" | null | undefined;
328
+ }>, unknown>;
329
+ export type GlobalUserConfig = Record<string, GlobalSpecialistOverride | string> & {
330
+ _doc?: string;
331
+ };
332
+ export interface GlobalConfigValidationResult {
333
+ valid: boolean;
334
+ errors: Array<{
335
+ path: string;
336
+ message: string;
337
+ }>;
338
+ }
339
+ /**
340
+ * Build the override template for a single specialist (all fields defaulted to
341
+ * null / [] = inherit). Used by sp init --global to seed each specialist entry.
342
+ */
343
+ export declare function buildSpecialistOverrideTemplate(): GlobalSpecialistOverride;
344
+ /**
345
+ * Build the full global config template keyed by specialist name.
346
+ * @param specialistNames - every specialist currently visible to SpecialistLoader.list()
347
+ */
348
+ export declare function buildGlobalUserConfigTemplate(specialistNames: ReadonlyArray<string>): GlobalUserConfig;
349
+ export interface GlobalConfigMergeResult {
350
+ config: GlobalUserConfig;
351
+ added: string[];
352
+ extended: string[];
353
+ removed: string[];
354
+ }
355
+ /**
356
+ * Idempotent merge: extend an existing global config with newly-shipped
357
+ * specialists and fill any missing override fields with defaults.
358
+ * NEVER clobbers a user-filled value. Removed specialists STAY in the file.
359
+ *
360
+ * @param existing - parsed existing config (may be empty)
361
+ * @param template - fresh template built from SpecialistLoader.list()
362
+ */
363
+ export declare function mergeGlobalUserConfig(existing: Readonly<Record<string, unknown>>, template: GlobalUserConfig): GlobalConfigMergeResult;
364
+ /**
365
+ * Validate a raw JSON string against the global user-config schema.
366
+ * Returns structured errors; never throws on invalid input.
367
+ */
368
+ export declare function validateGlobalUserConfig(jsonContent: string): GlobalConfigValidationResult;
369
+ /**
370
+ * Read and parse the global user config. Returns null if the file does not
371
+ * exist. Throws on invalid JSON. Callers validating before use should prefer
372
+ * {@link validateGlobalUserConfig}.
373
+ */
374
+ export declare function readGlobalUserConfig(location: GlobalUserConfigPath): GlobalUserConfig | null;
375
+ /**
376
+ * Write the global user config, creating parent directories as needed.
377
+ *
378
+ * Atomic-write semantics: serialize JSON, write to a sibling temp file in
379
+ * the same directory, then renameSync over the destination. POSIX rename
380
+ * is atomic within the same filesystem, so a crash between truncate +
381
+ * write can no longer leave user.json empty or half-written.
382
+ *
383
+ * If the rename fails (e.g. cross-filesystem mount, no permission), fall
384
+ * back to a direct writeFileSync so we still update the file rather than
385
+ * leaving the user without a way to persist their override.
386
+ */
387
+ export declare function writeGlobalUserConfig(location: GlobalUserConfigPath, config: GlobalUserConfig): void;
388
+ export { SPECIALISTS_SUBDIR, CONFIG_FILENAME };
389
+ //# sourceMappingURL=global-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config.d.ts","sourceRoot":"","sources":["../../../src/specialist/global-config.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AASzB,QAAA,MAAM,eAAe,cAAc,CAAC;AACpC,QAAA,MAAM,kBAAkB,gBAAgB,CAAC;AACzC,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAE7D,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,aAAa,GAAG,QAAQ,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAC;IAChB,gDAAgD;IAChD,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,IAAI,oBAAoB,CAoB9D;AAuCD,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQhC,CAAC;AAEZ,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF,wBAAgB,oCAAoC,IAAI,SAAS,MAAM,EAAE,CASxE;AAED,kHAAkH;AAClH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAQlC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAErG,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,wBAAwB,CA6B1E;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,GACrC,gBAAgB,CAMlB;AAmCD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAC3C,QAAQ,EAAE,gBAAgB,GACzB,uBAAuB,CAkCzB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,GAClB,4BAA4B,CA4B9B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,oBAAoB,GAC7B,gBAAgB,GAAG,IAAI,CAIzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAsBN;AAED,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,CAAC"}
@@ -27,6 +27,7 @@ export interface LaunchSpecialistOptions {
27
27
  onMeta?: (meta: {
28
28
  backend: string;
29
29
  model: string;
30
+ sessionId?: string;
30
31
  }) => void;
31
32
  onJobStarted?: (job: {
32
33
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../../src/specialist/launch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQ9C,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,IAAI,EAAE,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/E,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAChE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5D,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyGnF"}
1
+ {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../../src/specialist/launch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQ9C,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,IAAI,EAAE,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/E,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAChE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAChF,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyGnF"}
@@ -0,0 +1,46 @@
1
+ import type { SupervisorStatus } from './supervisor.js';
2
+ export type LiveJobStatus = SupervisorStatus['status'];
3
+ export interface StatusCounts {
4
+ starting: number;
5
+ running: number;
6
+ waiting: number;
7
+ done: number;
8
+ error: number;
9
+ cancelled: number;
10
+ dead: number;
11
+ }
12
+ export interface DistinctContainers {
13
+ epics: number;
14
+ nodes: number;
15
+ worktrees: number;
16
+ chains: number;
17
+ }
18
+ export interface ContextHealth {
19
+ ctxMaxPct: number | undefined;
20
+ ctxAvgPct: number | undefined;
21
+ nearThresholdCount: number;
22
+ criticalCount: number;
23
+ }
24
+ export interface TokenAggregates {
25
+ totalTokens: number;
26
+ promptTokens: number;
27
+ completionTokens: number;
28
+ }
29
+ export interface LiveSnapshot {
30
+ generatedAtMs: number;
31
+ total: number;
32
+ counts: StatusCounts;
33
+ containers: DistinctContainers;
34
+ context: ContextHealth;
35
+ tokens: TokenAggregates;
36
+ }
37
+ export interface AggregateOpts {
38
+ nowMs?: number;
39
+ isDead?: (status: SupervisorStatus) => boolean;
40
+ }
41
+ export declare function aggregateStatusCounts(statuses: ReadonlyArray<SupervisorStatus>, opts?: AggregateOpts): StatusCounts;
42
+ export declare function aggregateDistinctContainers(statuses: ReadonlyArray<SupervisorStatus>): DistinctContainers;
43
+ export declare function aggregateContextHealth(statuses: ReadonlyArray<SupervisorStatus>): ContextHealth;
44
+ export declare function aggregateTokens(statuses: ReadonlyArray<SupervisorStatus>): TokenAggregates;
45
+ export declare function aggregateLiveSnapshot(statuses: ReadonlyArray<SupervisorStatus>, opts?: AggregateOpts): LiveSnapshot;
46
+ //# sourceMappingURL=live-aggregates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-aggregates.d.ts","sourceRoot":"","sources":["../../../src/specialist/live-aggregates.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC;CAChD;AAKD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,aAAa,CAAC,gBAAgB,CAAC,EACzC,IAAI,GAAE,aAAkB,GACvB,YAAY,CAkBd;AAmBD,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,aAAa,CAAC,gBAAgB,CAAC,GACxC,kBAAkB,CAmBpB;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,aAAa,CAAC,gBAAgB,CAAC,GACxC,aAAa,CAWf;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,aAAa,CAAC,gBAAgB,CAAC,GACxC,eAAe,CAYjB;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,aAAa,CAAC,gBAAgB,CAAC,EACzC,IAAI,GAAE,aAAkB,GACvB,YAAY,CASd"}
@@ -1,8 +1,10 @@
1
- import { type ScriptEntry, type Specialist } from './schema.js';
1
+ import { type ScriptEntry, type Specialist, type BlockedFieldWarning } from './schema.js';
2
+ import { type GlobalUserConfigPath } from './global-config.js';
2
3
  export interface StallDetectionConfig {
3
4
  running_silence_warn_ms?: number;
4
5
  running_silence_error_ms?: number;
5
6
  waiting_stale_ms?: number;
7
+ waiting_auto_close_ms?: number | null;
6
8
  tool_duration_warn_ms?: number;
7
9
  }
8
10
  export interface SpecialistSummary {
@@ -10,6 +12,7 @@ export interface SpecialistSummary {
10
12
  description: string;
11
13
  category: string;
12
14
  version: string;
15
+ /** Merged model after layer overrides. Empty string when no layer supplies a model. */
13
16
  model: string;
14
17
  permission_required: 'READ_ONLY' | 'LOW' | 'MEDIUM' | 'HIGH';
15
18
  interactive: boolean;
@@ -29,6 +32,11 @@ export interface SpecialistSummary {
29
32
  staleThresholdDays?: number;
30
33
  stallDetection?: StallDetectionConfig;
31
34
  }
35
+ /** Thrown by SpecialistLoader.get when execution.model is null/empty after all overrides merge. */
36
+ export declare class SpecialistMissingModelError extends Error {
37
+ readonly specialistName: string;
38
+ constructor(specialistName: string);
39
+ }
32
40
  /** Returns STALE, AGED, or OK based on file mtimes vs metadata.updated */
33
41
  export declare function checkStaleness(summary: SpecialistSummary): Promise<'OK' | 'STALE' | 'AGED'>;
34
42
  interface LoaderOptions {
@@ -36,13 +44,54 @@ interface LoaderOptions {
36
44
  }
37
45
  export declare class SpecialistLoader {
38
46
  private cache;
47
+ private blockedFieldWarnings;
39
48
  private projectDir;
40
49
  constructor(options?: LoaderOptions);
50
+ /**
51
+ * Scan dirs in priority order: highest-priority layer FIRST (user → package).
52
+ *
53
+ * KAN-90 three-layer contract:
54
+ * package canonical → ~/.config/specialists/user.json → repo .specialists/user/<name>
55
+ *
56
+ * The repo `.specialists/default/` mirror was retired by commit 31a6421c
57
+ * ("reconcile: empty .specialists/default/ — live-from-package canonical resolves all")
58
+ * and is no longer walked by the loader. Stale `.specialists/default/` files left
59
+ * behind on disk are detected by `drift-detector` and removed by `sp prune-stale-defaults`,
60
+ * but they no longer feed into the merge. The legacy paths `./specialists`,
61
+ * `.claude/specialists`, and `.agent-forge/specialists` are likewise no longer
62
+ * authoritative — they belonged to the same `scope: 'default'` tier.
63
+ */
41
64
  private getScanDirs;
42
65
  private toJson;
43
66
  private resolveSpecialistPath;
67
+ /** Find every layer that has a file for `name`, ordered base-first (package → user). */
68
+ private findLayerHits;
69
+ /**
70
+ * Apply override-allowed fields from `override` onto `base`, in place.
71
+ * `source` controls blocked-field severity ('strip' for global, 'warn' for repo layers).
72
+ * Returns warnings (does NOT mutate the warnings store).
73
+ */
74
+ private applyOverrideFields;
75
+ private resolveOverrideValue;
76
+ /**
77
+ * Build the merged spec for `name`. Single linear pass over the three layers:
78
+ *
79
+ * package canonical → ~/.config/specialists/user.json → repo .specialists/user/<name>
80
+ *
81
+ * findLayerHits returns at most two hits (package + user repo), ordered base-first.
82
+ * Does NOT throw on null model; caller (get) enforces the missing-model error.
83
+ */
84
+ private buildMergedSpec;
85
+ private resolveCanonicalPresetReferences;
44
86
  list(category?: string): Promise<SpecialistSummary[]>;
45
87
  get(name: string): Promise<Specialist>;
88
+ /**
89
+ * Blocked-field warnings collected during the most recent list() or get() calls.
90
+ * Returns all warnings when called without a name; filters to one specialist otherwise.
91
+ */
92
+ getBlockedFieldWarnings(name?: string): BlockedFieldWarning[];
93
+ /** Resolution of the global user-config path. Returns null only if HOME is unset and XDG_CONFIG_HOME is empty. */
94
+ getGlobalLayerPath(): GlobalUserConfigPath | null;
46
95
  invalidateCache(name?: string): void;
47
96
  }
48
97
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/specialist/loader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAmB,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAGjF,MAAM,WAAW,oBAAoB;IACnC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC7D,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IACzE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,yBAAyB,EAAE,MAAM,EAAE,CAAC;IACpC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,cAAc,GAAG,QAAQ,CAAC;IACnF,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC;AAED,0EAA0E;AAC1E,wBAAsB,cAAc,CAClC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,GAAG,OAAO,GAAG,MAAM,CAAC,CAiBlC;AAED,UAAU,aAAa;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,GAAE,aAAkB;IAIvC,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,qBAAqB;IAcvB,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAoDrD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAgC5C,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;CAIrC"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/specialist/loader.ts"],"names":[],"mappings":"AAKA,OAAO,EAQL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,mBAAmB,EACzB,MAAM,aAAa,CAAC;AAErB,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,oBAAoB;IACnC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC7D,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IACzE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,yBAAyB,EAAE,MAAM,EAAE,CAAC;IACpC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,cAAc,GAAG,QAAQ,CAAC;IACnF,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC;AAED,mGAAmG;AACnG,qBAAa,2BAA4B,SAAQ,KAAK;aACxB,cAAc,EAAE,MAAM;gBAAtB,cAAc,EAAE,MAAM;CAQnD;AAED,0EAA0E;AAC1E,wBAAsB,cAAc,CAClC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,GAAG,OAAO,GAAG,MAAM,CAAC,CAiBlC;AAED,UAAU,aAAa;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyBD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,oBAAoB,CAA4C;IACxE,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,GAAE,aAAkB;IAIvC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,qBAAqB;IAc7B,wFAAwF;IACxF,OAAO,CAAC,aAAa;IAgBrB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA2F3B,OAAO,CAAC,oBAAoB;IAU5B;;;;;;;OAOG;YACW,eAAe;IAoE7B,OAAO,CAAC,gCAAgC;IAelC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAgDrD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAkB5C;;;OAGG;IACH,uBAAuB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,EAAE;IAO7D,kHAAkH;IAClH,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;IAQjD,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;CASrC"}
@@ -0,0 +1,7 @@
1
+ export interface ModelChainExecution {
2
+ model: string | null;
3
+ fallback_model?: string | null;
4
+ fallback_models?: readonly string[] | null;
5
+ }
6
+ export declare function resolveModelChain(execution: ModelChainExecution): string[];
7
+ //# sourceMappingURL=model-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-chain.d.ts","sourceRoot":"","sources":["../../../src/specialist/model-chain.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CAC5C;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAI1E"}
@@ -0,0 +1,28 @@
1
+ import { SpecialistLoader } from './loader.js';
2
+ import { runScriptSpecialist, type ScriptGenerateResult, type ScriptRunnerOptions } from './script-runner.js';
3
+ export type ProbeVerdict = 'PASS' | 'PARTIAL' | 'FAIL';
4
+ export interface AgenticFollowthroughMetrics {
5
+ turns_used: number;
6
+ tools_used: number;
7
+ output_length: number;
8
+ files_outside_scope_touched: number;
9
+ premature_agent_end: boolean;
10
+ }
11
+ export interface AgenticFollowthroughResult {
12
+ verdict: ProbeVerdict;
13
+ metrics: AgenticFollowthroughMetrics;
14
+ sample_output: string;
15
+ transcript_path: string;
16
+ }
17
+ export interface AgenticFollowthroughOptions {
18
+ cacheDir?: string;
19
+ timeoutMs?: number;
20
+ runSpecialist?: (input: Parameters<typeof runScriptSpecialist>[0], options: ScriptRunnerOptions) => Promise<ScriptGenerateResult>;
21
+ loader?: SpecialistLoader;
22
+ projectDir?: string;
23
+ now?: Date;
24
+ }
25
+ export declare function runAgenticFollowthroughProbe(model: string, specName: string, opts?: AgenticFollowthroughOptions): Promise<AgenticFollowthroughResult>;
26
+ export declare function getProbeRunDir(model: string, specName: string, cacheDir?: string): string;
27
+ export declare function getProbeCanonicalPath(model: string, specName: string, cacheDir?: string): string;
28
+ //# sourceMappingURL=model-probes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-probes.d.ts","sourceRoot":"","sources":["../../../src/specialist/model-probes.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9G,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,2BAA2B,EAAE,MAAM,CAAC;IACpC,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,2BAA2B,CAAC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClI,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAsBD,wBAAsB,4BAA4B,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,2BAAgC,GAAG,OAAO,CAAC,0BAA0B,CAAC,CA6B/J;AAsFD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAqD,GAAG,MAAM,CAErI;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAqD,GAAG,MAAM,CAG5I"}