harness-dispatch 0.5.0 → 0.6.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 (94) hide show
  1. package/CHANGELOG.md +152 -0
  2. package/README.md +5 -2
  3. package/dist/bin.d.ts.map +1 -1
  4. package/dist/bin.js +1 -175
  5. package/dist/bin.js.map +1 -1
  6. package/dist/config/route-fields.d.ts +72 -0
  7. package/dist/config/route-fields.d.ts.map +1 -0
  8. package/dist/config/route-fields.js +128 -0
  9. package/dist/config/route-fields.js.map +1 -0
  10. package/dist/config/validation.js +1 -1
  11. package/dist/config/validation.js.map +1 -1
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +32 -171
  14. package/dist/config.js.map +1 -1
  15. package/dist/configure-yaml.d.ts +23 -0
  16. package/dist/configure-yaml.d.ts.map +1 -0
  17. package/dist/configure-yaml.js +193 -0
  18. package/dist/configure-yaml.js.map +1 -0
  19. package/dist/dispatchers/base.d.ts +3 -0
  20. package/dist/dispatchers/base.d.ts.map +1 -1
  21. package/dist/dispatchers/base.js.map +1 -1
  22. package/dist/dispatchers/generic-cli.d.ts.map +1 -1
  23. package/dist/dispatchers/generic-cli.js +4 -0
  24. package/dist/dispatchers/generic-cli.js.map +1 -1
  25. package/dist/dispatchers/openai-compatible.d.ts.map +1 -1
  26. package/dist/dispatchers/openai-compatible.js +18 -0
  27. package/dist/dispatchers/openai-compatible.js.map +1 -1
  28. package/dist/dispatchers/shared/stream-subprocess.d.ts +11 -0
  29. package/dist/dispatchers/shared/stream-subprocess.d.ts.map +1 -1
  30. package/dist/dispatchers/shared/stream-subprocess.js +57 -35
  31. package/dist/dispatchers/shared/stream-subprocess.js.map +1 -1
  32. package/dist/http/parse.d.ts +64 -0
  33. package/dist/http/parse.d.ts.map +1 -0
  34. package/dist/http/parse.js +230 -0
  35. package/dist/http/parse.js.map +1 -0
  36. package/dist/http/server.d.ts +2 -11
  37. package/dist/http/server.d.ts.map +1 -1
  38. package/dist/http/server.js +26 -232
  39. package/dist/http/server.js.map +1 -1
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +3 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/jobs/context.d.ts +17 -0
  45. package/dist/jobs/context.d.ts.map +1 -0
  46. package/dist/jobs/context.js +84 -0
  47. package/dist/jobs/context.js.map +1 -0
  48. package/dist/jobs/store.d.ts +80 -0
  49. package/dist/jobs/store.d.ts.map +1 -0
  50. package/dist/jobs/store.js +279 -0
  51. package/dist/jobs/store.js.map +1 -0
  52. package/dist/jobs/types.d.ts +135 -0
  53. package/dist/jobs/types.d.ts.map +1 -0
  54. package/dist/jobs/types.js +11 -0
  55. package/dist/jobs/types.js.map +1 -0
  56. package/dist/jobs.d.ts +113 -123
  57. package/dist/jobs.d.ts.map +1 -1
  58. package/dist/jobs.js +314 -309
  59. package/dist/jobs.js.map +1 -1
  60. package/dist/mcp/tool-schemas.d.ts +194 -0
  61. package/dist/mcp/tool-schemas.d.ts.map +1 -0
  62. package/dist/mcp/tool-schemas.js +311 -0
  63. package/dist/mcp/tool-schemas.js.map +1 -0
  64. package/dist/mcp/tools.d.ts +15 -59
  65. package/dist/mcp/tools.d.ts.map +1 -1
  66. package/dist/mcp/tools.js +63 -239
  67. package/dist/mcp/tools.js.map +1 -1
  68. package/dist/quota.d.ts +19 -1
  69. package/dist/quota.d.ts.map +1 -1
  70. package/dist/quota.js +39 -4
  71. package/dist/quota.js.map +1 -1
  72. package/dist/router.d.ts +4 -0
  73. package/dist/router.d.ts.map +1 -1
  74. package/dist/router.js +8 -0
  75. package/dist/router.js.map +1 -1
  76. package/dist/status.d.ts +13 -0
  77. package/dist/status.d.ts.map +1 -1
  78. package/dist/status.js +6 -0
  79. package/dist/status.js.map +1 -1
  80. package/dist/types.d.ts +24 -0
  81. package/dist/types.d.ts.map +1 -1
  82. package/dist/workspace-resolve.d.ts +98 -0
  83. package/dist/workspace-resolve.d.ts.map +1 -0
  84. package/dist/workspace-resolve.js +382 -0
  85. package/dist/workspace-resolve.js.map +1 -0
  86. package/dist/workspaces.d.ts +1 -0
  87. package/dist/workspaces.d.ts.map +1 -1
  88. package/dist/workspaces.js +67 -15
  89. package/dist/workspaces.js.map +1 -1
  90. package/package.json +5 -4
  91. package/dist/dashboard/live.d.ts +0 -49
  92. package/dist/dashboard/live.d.ts.map +0 -1
  93. package/dist/dashboard/live.js +0 -149
  94. package/dist/dashboard/live.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harness-dispatch",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Turn locally installed coding harnesses (Claude Code, Codex, Cursor, Antigravity) and local/remote API endpoints into tools any AI can call, with async job handling for long-running agent work.",
5
5
  "keywords": [
6
6
  "mcp",
@@ -26,13 +26,14 @@
26
26
  }
27
27
  },
28
28
  "bin": {
29
- "harness-dispatch": "./dist/bin.js"
29
+ "harness-dispatch": "dist/bin.js"
30
30
  },
31
31
  "files": [
32
32
  "dist/",
33
33
  "data/",
34
34
  "config.default.yaml",
35
- "README.md"
35
+ "README.md",
36
+ "CHANGELOG.md"
36
37
  ],
37
38
  "engines": {
38
39
  "node": ">=22.22.2"
@@ -90,7 +91,7 @@
90
91
  },
91
92
  "repository": {
92
93
  "type": "git",
93
- "url": "https://github.com/fstubner/harness-dispatch"
94
+ "url": "git+https://github.com/fstubner/harness-dispatch.git"
94
95
  },
95
96
  "bugs": {
96
97
  "url": "https://github.com/fstubner/harness-dispatch/issues"
@@ -1,49 +0,0 @@
1
- /**
2
- * Live dashboard renderer for harness-dispatch.
3
- *
4
- * Pure function `renderDashboard(state)` → ANSI-formatted string. Consumed
5
- * by:
6
- * - legacy dashboard tests.
7
- * - the hidden `dashboard --watch` compatibility alias.
8
- *
9
- * Keeping the renderer pure (no I/O) makes it unit-testable with a simple
10
- * snapshot-style assertion.
11
- */
12
- import type { ServiceConfig } from "../types.js";
13
- export interface BreakerState {
14
- tripped: boolean;
15
- failures: number;
16
- cooldownRemainingSec?: number;
17
- }
18
- export interface QuotaState {
19
- score: number;
20
- remaining?: number | null;
21
- limit?: number | null;
22
- localCallCount?: number;
23
- resetAt?: string;
24
- }
25
- export interface RecentEvent {
26
- kind: "stdout" | "stderr" | "tool_use" | "thinking" | "completion" | "error";
27
- service: string;
28
- at: number;
29
- message: string;
30
- }
31
- export interface DashboardState {
32
- services: Array<{
33
- name: string;
34
- config: ServiceConfig;
35
- reachable: boolean;
36
- }>;
37
- quotas: Record<string, QuotaState | undefined>;
38
- breakers: Record<string, BreakerState | undefined>;
39
- recentEvents: RecentEvent[];
40
- /** Optional "last refreshed at" timestamp. */
41
- generatedAt?: number;
42
- /** If true, the renderer will emit ANSI cursor codes (clear screen + home). */
43
- ansi?: boolean;
44
- }
45
- /**
46
- * Render a dashboard snapshot. Deterministic for a given state.
47
- */
48
- export declare function renderDashboard(state: DashboardState): string;
49
- //# sourceMappingURL=live.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../src/dashboard/live.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;IAC/C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC,CAAC;IACnD,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAuDD;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAkF7D"}
@@ -1,149 +0,0 @@
1
- /**
2
- * Live dashboard renderer for harness-dispatch.
3
- *
4
- * Pure function `renderDashboard(state)` → ANSI-formatted string. Consumed
5
- * by:
6
- * - legacy dashboard tests.
7
- * - the hidden `dashboard --watch` compatibility alias.
8
- *
9
- * Keeping the renderer pure (no I/O) makes it unit-testable with a simple
10
- * snapshot-style assertion.
11
- */
12
- const CLEAR_SCREEN = "\u001b[2J\u001b[H"; // clear + home
13
- const DIM = "\u001b[2m";
14
- const BOLD = "\u001b[1m";
15
- const RESET = "\u001b[0m";
16
- const GREEN = "\u001b[32m";
17
- const RED = "\u001b[31m";
18
- const YELLOW = "\u001b[33m";
19
- function fmtTokens(n) {
20
- if (n === undefined)
21
- return "?";
22
- if (n >= 1_000_000)
23
- return `${(n / 1_000_000).toFixed(1)}M`;
24
- if (n >= 1000)
25
- return `${Math.round(n / 1000)}k`;
26
- return `${n}`;
27
- }
28
- function statusIcon(enabled, reachable, ansi) {
29
- const ok = enabled && reachable;
30
- if (!ansi)
31
- return ok ? "[ok]" : "[--]";
32
- return ok ? `${GREEN}✓${RESET}` : `${RED}✗${RESET}`;
33
- }
34
- function breakerLine(state, ansi) {
35
- if (!state)
36
- return "breaker: closed";
37
- if (state.tripped) {
38
- const cd = state.cooldownRemainingSec ?? 0;
39
- const msg = `breaker: OPEN — ${Math.round(cd)}s until reset`;
40
- return ansi ? `${YELLOW}${msg}${RESET}` : msg;
41
- }
42
- return `breaker: closed (${state.failures} recent failures)`;
43
- }
44
- function quotaLine(q, ansi) {
45
- if (!q)
46
- return "quota: unknown";
47
- if (q.remaining != null && q.limit != null && q.limit > 0) {
48
- const pct = Math.max(0, Math.min(100, Math.round((q.remaining / q.limit) * 100)));
49
- const filled = Math.round(pct / 5);
50
- const bar = "█".repeat(filled) + "░".repeat(Math.max(0, 20 - filled));
51
- const color = ansi ? (pct < 25 ? RED : pct < 60 ? YELLOW : GREEN) : "";
52
- const reset = ansi ? RESET : "";
53
- return `quota: ${color}[${bar}] ${pct}%${reset} (${q.remaining}/${q.limit})`;
54
- }
55
- const pct = Math.round(q.score * 100);
56
- return `quota: ${pct}% assumed available`;
57
- }
58
- function formatTimeAgo(now, at) {
59
- const diff = Math.max(0, now - at);
60
- if (diff < 1000)
61
- return `${diff}ms ago`;
62
- if (diff < 60_000)
63
- return `${Math.round(diff / 1000)}s ago`;
64
- if (diff < 3_600_000)
65
- return `${Math.round(diff / 60_000)}m ago`;
66
- return `${Math.round(diff / 3_600_000)}h ago`;
67
- }
68
- /**
69
- * Render a dashboard snapshot. Deterministic for a given state.
70
- */
71
- export function renderDashboard(state) {
72
- const ansi = state.ansi === true;
73
- const now = state.generatedAt ?? Date.now();
74
- const out = [];
75
- if (ansi)
76
- out.push(CLEAR_SCREEN);
77
- // Header
78
- if (ansi)
79
- out.push(`${BOLD}harness-dispatch — live dashboard${RESET}`);
80
- else
81
- out.push("harness-dispatch — live dashboard");
82
- out.push(ansi
83
- ? `${DIM}refreshed ${new Date(now).toISOString()}${RESET}`
84
- : `refreshed ${new Date(now).toISOString()}`);
85
- out.push("");
86
- // Group services by tier
87
- const byTier = new Map();
88
- for (const svcEntry of state.services) {
89
- const tier = svcEntry.config.tier;
90
- const bucket = byTier.get(tier);
91
- if (bucket)
92
- bucket.push(svcEntry);
93
- else
94
- byTier.set(tier, [svcEntry]);
95
- }
96
- const tierLabels = {
97
- 1: "Tier 1 — Frontier",
98
- 2: "Tier 2 — Strong",
99
- 3: "Tier 3 — Fast/Local",
100
- };
101
- for (const tier of [...byTier.keys()].sort((a, b) => a - b)) {
102
- const label = tierLabels[tier] ?? `Tier ${tier}`;
103
- out.push(`── ${label} ──────────────────────────────`);
104
- out.push("");
105
- for (const svcEntry of byTier.get(tier)) {
106
- const { name, config: svc, reachable } = svcEntry;
107
- out.push(` ${statusIcon(svc.enabled, reachable, ansi)} ${name.toUpperCase()}`);
108
- if (svc.type === "openai_compatible") {
109
- out.push(` connection : HTTP API ${svc.baseUrl ?? "(no base_url)"}`);
110
- }
111
- else {
112
- out.push(` connection : ${svc.command ?? "(no command)"}`);
113
- }
114
- out.push(` limits : output-cap ${fmtTokens(svc.maxOutputTokens)}, context ${fmtTokens(svc.maxInputTokens)}`);
115
- out.push(` ${quotaLine(state.quotas[name], ansi)}`);
116
- out.push(` ${breakerLine(state.breakers[name], ansi)}`);
117
- const calls = state.quotas[name]?.localCallCount ?? 0;
118
- out.push(` calls : ${calls} this session`);
119
- if (!svc.enabled)
120
- out.push(" note : disabled in config");
121
- out.push("");
122
- }
123
- }
124
- // Recent events
125
- if (state.recentEvents.length > 0) {
126
- out.push("── Recent Activity ──────────────────────────");
127
- out.push("");
128
- for (const evt of state.recentEvents.slice(-8)) {
129
- const color = ansi
130
- ? evt.kind === "error"
131
- ? RED
132
- : evt.kind === "completion"
133
- ? GREEN
134
- : DIM
135
- : "";
136
- const reset = ansi ? RESET : "";
137
- const ago = formatTimeAgo(now, evt.at);
138
- const msg = evt.message.length > 80 ? `${evt.message.slice(0, 77)}...` : evt.message;
139
- out.push(` ${color}[${evt.kind}]${reset} ${evt.service}: ${msg} (${ago})`);
140
- }
141
- out.push("");
142
- }
143
- const ready = state.services
144
- .filter((s) => s.config.enabled && s.reachable)
145
- .map((s) => s.name);
146
- out.push(`Ready to route: ${ready.length === 0 ? "none" : ready.join(", ")}`);
147
- return out.join("\n");
148
- }
149
- //# sourceMappingURL=live.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"live.js","sourceRoot":"","sources":["../../src/dashboard/live.ts"],"names":[],"mappings":"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"}