wicked-crew 0.7.39 → 0.7.45
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.
- package/dist/api/audit.d.ts +3 -0
- package/dist/api/audit.d.ts.map +1 -1
- package/dist/api/audit.js +2 -0
- package/dist/api/audit.js.map +1 -1
- package/dist/api/capture.d.ts +149 -0
- package/dist/api/capture.d.ts.map +1 -0
- package/dist/api/capture.js +330 -0
- package/dist/api/capture.js.map +1 -0
- package/dist/api/chat-citations.d.ts +174 -0
- package/dist/api/chat-citations.d.ts.map +1 -0
- package/dist/api/chat-citations.js +528 -0
- package/dist/api/chat-citations.js.map +1 -0
- package/dist/api/chat-scope.d.ts +37 -1
- package/dist/api/chat-scope.d.ts.map +1 -1
- package/dist/api/chat-scope.js +131 -7
- package/dist/api/chat-scope.js.map +1 -1
- package/dist/api/chat-transcripts.d.ts +20 -1
- package/dist/api/chat-transcripts.d.ts.map +1 -1
- package/dist/api/chat-transcripts.js +29 -0
- package/dist/api/chat-transcripts.js.map +1 -1
- package/dist/api/delivery-cache.d.ts +2 -2
- package/dist/api/delivery-freeze.d.ts +66 -0
- package/dist/api/delivery-freeze.d.ts.map +1 -0
- package/dist/api/delivery-freeze.js +104 -0
- package/dist/api/delivery-freeze.js.map +1 -0
- package/dist/api/delivery-index.d.ts +53 -9
- package/dist/api/delivery-index.d.ts.map +1 -1
- package/dist/api/delivery-index.js +115 -22
- package/dist/api/delivery-index.js.map +1 -1
- package/dist/api/demo.d.ts +90 -0
- package/dist/api/demo.d.ts.map +1 -0
- package/dist/api/demo.js +492 -0
- package/dist/api/demo.js.map +1 -0
- package/dist/api/diagnostics.d.ts +64 -1
- package/dist/api/diagnostics.d.ts.map +1 -1
- package/dist/api/diagnostics.js +129 -1
- package/dist/api/diagnostics.js.map +1 -1
- package/dist/api/eval-sample.d.ts +6 -6
- package/dist/api/governance-steering.d.ts +2 -2
- package/dist/api/mcp.d.ts +282 -0
- package/dist/api/mcp.d.ts.map +1 -0
- package/dist/api/mcp.js +521 -0
- package/dist/api/mcp.js.map +1 -0
- package/dist/api/plan-schema.d.ts +56 -0
- package/dist/api/plan-schema.d.ts.map +1 -0
- package/dist/api/plan-schema.js +26 -0
- package/dist/api/plan-schema.js.map +1 -0
- package/dist/api/roster-standing.d.ts +15 -2
- package/dist/api/roster-standing.d.ts.map +1 -1
- package/dist/api/roster-standing.js +55 -3
- package/dist/api/roster-standing.js.map +1 -1
- package/dist/api/routes.d.ts +647 -59
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +906 -146
- package/dist/api/routes.js.map +1 -1
- package/dist/api/run-files.d.ts.map +1 -1
- package/dist/api/run-files.js +31 -2
- package/dist/api/run-files.js.map +1 -1
- package/dist/api/run-liveness.d.ts +41 -0
- package/dist/api/run-liveness.d.ts.map +1 -0
- package/dist/api/run-liveness.js +166 -0
- package/dist/api/run-liveness.js.map +1 -0
- package/dist/api/run-timing-index.d.ts +10 -0
- package/dist/api/run-timing-index.d.ts.map +1 -1
- package/dist/api/run-timing-index.js +24 -0
- package/dist/api/run-timing-index.js.map +1 -1
- package/dist/api/seat-health.d.ts.map +1 -1
- package/dist/api/seat-health.js +20 -4
- package/dist/api/seat-health.js.map +1 -1
- package/dist/api/seat-probe.d.ts +141 -0
- package/dist/api/seat-probe.d.ts.map +1 -0
- package/dist/api/seat-probe.js +257 -0
- package/dist/api/seat-probe.js.map +1 -0
- package/dist/api/seat-record.d.ts +40 -0
- package/dist/api/seat-record.d.ts.map +1 -0
- package/dist/api/seat-record.js +218 -0
- package/dist/api/seat-record.js.map +1 -0
- package/dist/api/seat-signin.d.ts.map +1 -1
- package/dist/api/seat-signin.js +3 -1
- package/dist/api/seat-signin.js.map +1 -1
- package/dist/api/seat-standing.d.ts +24 -4
- package/dist/api/seat-standing.d.ts.map +1 -1
- package/dist/api/seat-standing.js +50 -3
- package/dist/api/seat-standing.js.map +1 -1
- package/dist/api/server.d.ts +34 -48
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +316 -116
- package/dist/api/server.js.map +1 -1
- package/dist/api/skills.d.ts +3 -1
- package/dist/api/skills.d.ts.map +1 -1
- package/dist/api/skills.js +7 -2
- package/dist/api/skills.js.map +1 -1
- package/dist/api/stall-watchdog.d.ts +34 -3
- package/dist/api/stall-watchdog.d.ts.map +1 -1
- package/dist/api/stall-watchdog.js +107 -8
- package/dist/api/stall-watchdog.js.map +1 -1
- package/dist/api/steering-landing.d.ts +6 -6
- package/dist/api/steering-landing.d.ts.map +1 -1
- package/dist/api/steering-landing.js +7 -9
- package/dist/api/steering-landing.js.map +1 -1
- package/dist/api/testing.d.ts +6 -4
- package/dist/api/testing.d.ts.map +1 -1
- package/dist/api/testing.js +82 -47
- package/dist/api/testing.js.map +1 -1
- package/dist/campaign/boot-resume.d.ts +34 -0
- package/dist/campaign/boot-resume.d.ts.map +1 -0
- package/dist/campaign/boot-resume.js +45 -0
- package/dist/campaign/boot-resume.js.map +1 -0
- package/dist/campaigns/rollup.d.ts +4 -1
- package/dist/campaigns/rollup.d.ts.map +1 -1
- package/dist/campaigns/rollup.js +6 -1
- package/dist/campaigns/rollup.js.map +1 -1
- package/dist/campaigns/routes.d.ts +2 -2
- package/dist/cli/bearer.d.ts +27 -1
- package/dist/cli/bearer.d.ts.map +1 -1
- package/dist/cli/bearer.js +62 -2
- package/dist/cli/bearer.js.map +1 -1
- package/dist/cli/governance.d.ts +11 -0
- package/dist/cli/governance.d.ts.map +1 -1
- package/dist/cli/governance.js +8 -2
- package/dist/cli/governance.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +140 -75
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp.d.ts +11 -0
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +40 -9
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/service.d.ts +78 -0
- package/dist/cli/service.d.ts.map +1 -0
- package/dist/cli/service.js +334 -0
- package/dist/cli/service.js.map +1 -0
- package/dist/core/adapter.d.ts +247 -14
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +638 -161
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/bridge-reaper.d.ts +4 -1
- package/dist/core/bridge-reaper.d.ts.map +1 -1
- package/dist/core/bridge-reaper.js +15 -1
- package/dist/core/bridge-reaper.js.map +1 -1
- package/dist/core/bus-notice.d.ts +27 -0
- package/dist/core/bus-notice.d.ts.map +1 -0
- package/dist/core/bus-notice.js +24 -0
- package/dist/core/bus-notice.js.map +1 -0
- package/dist/core/bus.d.ts +99 -0
- package/dist/core/bus.d.ts.map +1 -0
- package/dist/core/bus.js +176 -0
- package/dist/core/bus.js.map +1 -0
- package/dist/core/deliver-exclusions.d.ts +71 -0
- package/dist/core/deliver-exclusions.d.ts.map +1 -0
- package/dist/core/deliver-exclusions.js +110 -0
- package/dist/core/deliver-exclusions.js.map +1 -0
- package/dist/core/deliver-text.d.ts +61 -14
- package/dist/core/deliver-text.d.ts.map +1 -1
- package/dist/core/deliver-text.js +178 -30
- package/dist/core/deliver-text.js.map +1 -1
- package/dist/core/deliver-triage.d.ts +11 -2
- package/dist/core/deliver-triage.d.ts.map +1 -1
- package/dist/core/deliver-triage.js +19 -1
- package/dist/core/deliver-triage.js.map +1 -1
- package/dist/core/deliver.d.ts +161 -3
- package/dist/core/deliver.d.ts.map +1 -1
- package/dist/core/deliver.js +463 -25
- package/dist/core/deliver.js.map +1 -1
- package/dist/core/deliverable-floor.d.ts.map +1 -1
- package/dist/core/deliverable-floor.js +5 -7
- package/dist/core/deliverable-floor.js.map +1 -1
- package/dist/core/engine-bus.d.ts +40 -0
- package/dist/core/engine-bus.d.ts.map +1 -0
- package/dist/core/engine-bus.js +27 -0
- package/dist/core/engine-bus.js.map +1 -0
- package/dist/core/estate-mcp-client.d.ts +87 -5
- package/dist/core/estate-mcp-client.d.ts.map +1 -1
- package/dist/core/estate-mcp-client.js +90 -11
- package/dist/core/estate-mcp-client.js.map +1 -1
- package/dist/core/linked-issues.d.ts +46 -0
- package/dist/core/linked-issues.d.ts.map +1 -0
- package/dist/core/linked-issues.js +123 -0
- package/dist/core/linked-issues.js.map +1 -0
- package/dist/core/run-identity.d.ts +100 -0
- package/dist/core/run-identity.d.ts.map +1 -0
- package/dist/core/run-identity.js +178 -0
- package/dist/core/run-identity.js.map +1 -0
- package/dist/core/shutdown.d.ts +16 -0
- package/dist/core/shutdown.d.ts.map +1 -0
- package/dist/core/shutdown.js +39 -0
- package/dist/core/shutdown.js.map +1 -0
- package/dist/core/types.d.ts +15 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -1
- package/dist/interactive/bridge-pool.d.ts +67 -3
- package/dist/interactive/bridge-pool.d.ts.map +1 -1
- package/dist/interactive/bridge-pool.js +129 -13
- package/dist/interactive/bridge-pool.js.map +1 -1
- package/dist/interactive/bridge-root.d.ts +9 -0
- package/dist/interactive/bridge-root.d.ts.map +1 -1
- package/dist/interactive/bridge-root.js +11 -4
- package/dist/interactive/bridge-root.js.map +1 -1
- package/dist/interactive/chat-events.d.ts +14 -9
- package/dist/interactive/chat-events.d.ts.map +1 -1
- package/dist/interactive/chat-events.js +55 -57
- package/dist/interactive/chat-events.js.map +1 -1
- package/dist/interactive/council-outcome.d.ts +1 -0
- package/dist/interactive/council-outcome.d.ts.map +1 -1
- package/dist/interactive/council-outcome.js +33 -0
- package/dist/interactive/council-outcome.js.map +1 -1
- package/dist/interactive/draft-events.d.ts +36 -17
- package/dist/interactive/draft-events.d.ts.map +1 -1
- package/dist/interactive/draft-events.js +121 -92
- package/dist/interactive/draft-events.js.map +1 -1
- package/dist/interactive/draft-skill.d.ts +59 -0
- package/dist/interactive/draft-skill.d.ts.map +1 -1
- package/dist/interactive/draft-skill.js +233 -0
- package/dist/interactive/draft-skill.js.map +1 -1
- package/dist/interactive/edit-events.d.ts +1 -14
- package/dist/interactive/edit-events.d.ts.map +1 -1
- package/dist/interactive/edit-events.js +37 -70
- package/dist/interactive/edit-events.js.map +1 -1
- package/dist/interactive/proxy-routes.d.ts +2 -2
- package/dist/interactive/proxy-routes.d.ts.map +1 -1
- package/dist/interactive/proxy-routes.js +4 -13
- package/dist/interactive/proxy-routes.js.map +1 -1
- package/dist/interactive/ws-relay.d.ts +9 -10
- package/dist/interactive/ws-relay.d.ts.map +1 -1
- package/dist/interactive/ws-relay.js +23 -50
- package/dist/interactive/ws-relay.js.map +1 -1
- package/dist/mcp/broker.d.ts +88 -0
- package/dist/mcp/broker.d.ts.map +1 -0
- package/dist/mcp/broker.js +307 -0
- package/dist/mcp/broker.js.map +1 -0
- package/dist/mcp/call-records.d.ts +61 -0
- package/dist/mcp/call-records.d.ts.map +1 -0
- package/dist/mcp/call-records.js +135 -0
- package/dist/mcp/call-records.js.map +1 -0
- package/dist/mcp/classify.d.ts +45 -0
- package/dist/mcp/classify.d.ts.map +1 -0
- package/dist/mcp/classify.js +83 -0
- package/dist/mcp/classify.js.map +1 -0
- package/dist/mcp/discovery.d.ts +24 -0
- package/dist/mcp/discovery.d.ts.map +1 -0
- package/dist/mcp/discovery.js +78 -0
- package/dist/mcp/discovery.js.map +1 -0
- package/dist/mcp/invoke.d.ts +36 -0
- package/dist/mcp/invoke.d.ts.map +1 -0
- package/dist/mcp/invoke.js +80 -0
- package/dist/mcp/invoke.js.map +1 -0
- package/dist/mcp/policies.d.ts +110 -0
- package/dist/mcp/policies.d.ts.map +1 -0
- package/dist/mcp/policies.js +400 -0
- package/dist/mcp/policies.js.map +1 -0
- package/dist/mcp/probe.d.ts +66 -0
- package/dist/mcp/probe.d.ts.map +1 -0
- package/dist/mcp/probe.js +116 -0
- package/dist/mcp/probe.js.map +1 -0
- package/dist/mcp/redact.d.ts +34 -0
- package/dist/mcp/redact.d.ts.map +1 -0
- package/dist/mcp/redact.js +84 -0
- package/dist/mcp/redact.js.map +1 -0
- package/dist/mcp/registry-store.d.ts +69 -0
- package/dist/mcp/registry-store.d.ts.map +1 -0
- package/dist/mcp/registry-store.js +82 -0
- package/dist/mcp/registry-store.js.map +1 -0
- package/dist/mcp/registry.d.ts +147 -0
- package/dist/mcp/registry.d.ts.map +1 -0
- package/dist/mcp/registry.js +509 -0
- package/dist/mcp/registry.js.map +1 -0
- package/dist/mcp/rest.d.ts +111 -0
- package/dist/mcp/rest.d.ts.map +1 -0
- package/dist/mcp/rest.js +606 -0
- package/dist/mcp/rest.js.map +1 -0
- package/dist/mcp/secrets.d.ts +66 -0
- package/dist/mcp/secrets.d.ts.map +1 -0
- package/dist/mcp/secrets.js +180 -0
- package/dist/mcp/secrets.js.map +1 -0
- package/dist/mcp/tool-list.d.ts +25 -0
- package/dist/mcp/tool-list.d.ts.map +1 -0
- package/dist/mcp/tool-list.js +62 -0
- package/dist/mcp/tool-list.js.map +1 -0
- package/dist/mcp/upstream-error.d.ts +12 -0
- package/dist/mcp/upstream-error.d.ts.map +1 -0
- package/dist/mcp/upstream-error.js +14 -0
- package/dist/mcp/upstream-error.js.map +1 -0
- package/dist/mcp/usage.d.ts +31 -0
- package/dist/mcp/usage.d.ts.map +1 -0
- package/dist/mcp/usage.js +159 -0
- package/dist/mcp/usage.js.map +1 -0
- package/dist/presets/routes.d.ts +53 -0
- package/dist/presets/routes.d.ts.map +1 -0
- package/dist/presets/routes.js +115 -0
- package/dist/presets/routes.js.map +1 -0
- package/dist/projects/activity.d.ts +6 -18
- package/dist/projects/activity.d.ts.map +1 -1
- package/dist/projects/activity.js +17 -60
- package/dist/projects/activity.js.map +1 -1
- package/dist/projects/events.d.ts +6 -5
- package/dist/projects/events.d.ts.map +1 -1
- package/dist/projects/events.js +33 -58
- package/dist/projects/events.js.map +1 -1
- package/dist/projects/graph.d.ts +11 -0
- package/dist/projects/graph.d.ts.map +1 -1
- package/dist/projects/graph.js +12 -0
- package/dist/projects/graph.js.map +1 -1
- package/dist/projects/routes.d.ts.map +1 -1
- package/dist/projects/routes.js +19 -0
- package/dist/projects/routes.js.map +1 -1
- package/dist/projects/state-home-preflight.d.ts.map +1 -1
- package/dist/projects/state-home-preflight.js +7 -0
- package/dist/projects/state-home-preflight.js.map +1 -1
- package/dist/projects/state-home-registry.d.ts.map +1 -1
- package/dist/projects/state-home-registry.js +9 -1
- package/dist/projects/state-home-registry.js.map +1 -1
- package/dist/qe/acceptance.d.ts +28 -28
- package/dist/qe/acceptance.d.ts.map +1 -1
- package/dist/qe/acceptance.js +60 -61
- package/dist/qe/acceptance.js.map +1 -1
- package/dist/qe/test-sets.d.ts +3 -5
- package/dist/qe/test-sets.d.ts.map +1 -1
- package/dist/qe/test-sets.js +5 -7
- package/dist/qe/test-sets.js.map +1 -1
- package/dist/skills/installed.d.ts +51 -0
- package/dist/skills/installed.d.ts.map +1 -0
- package/dist/skills/installed.js +46 -0
- package/dist/skills/installed.js.map +1 -0
- package/dist/skills/phase-skill-gaps.d.ts +108 -0
- package/dist/skills/phase-skill-gaps.d.ts.map +1 -0
- package/dist/skills/phase-skill-gaps.js +199 -0
- package/dist/skills/phase-skill-gaps.js.map +1 -0
- package/dist/skills/runtime.d.ts +1 -1
- package/dist/skills/runtime.d.ts.map +1 -1
- package/dist/skills/runtime.js +2 -1
- package/dist/skills/runtime.js.map +1 -1
- package/dist/standing-orders/evaluator.d.ts +113 -0
- package/dist/standing-orders/evaluator.d.ts.map +1 -0
- package/dist/standing-orders/evaluator.js +225 -0
- package/dist/standing-orders/evaluator.js.map +1 -0
- package/dist/standing-orders/history.d.ts +58 -0
- package/dist/standing-orders/history.d.ts.map +1 -0
- package/dist/standing-orders/history.js +117 -0
- package/dist/standing-orders/history.js.map +1 -0
- package/dist/standing-orders/parse.d.ts +19 -0
- package/dist/standing-orders/parse.d.ts.map +1 -0
- package/dist/standing-orders/parse.js +75 -0
- package/dist/standing-orders/parse.js.map +1 -0
- package/dist/standing-orders/routes.d.ts +180 -0
- package/dist/standing-orders/routes.d.ts.map +1 -0
- package/dist/standing-orders/routes.js +95 -0
- package/dist/standing-orders/routes.js.map +1 -0
- package/dist/standing-orders/store.d.ts +154 -0
- package/dist/standing-orders/store.d.ts.map +1 -0
- package/dist/standing-orders/store.js +189 -0
- package/dist/standing-orders/store.js.map +1 -0
- package/dist/studio/assets/index-CvV5qITf.css +32 -0
- package/dist/studio/assets/index-jCOy6Ns7.js +568 -0
- package/dist/studio/index.html +3 -3
- package/dist/studio/testid-inventory.json +3307 -897
- package/dist/team/key.d.ts +5 -0
- package/dist/team/key.d.ts.map +1 -0
- package/dist/team/key.js +21 -0
- package/dist/team/key.js.map +1 -0
- package/dist/team/routes.d.ts +196 -0
- package/dist/team/routes.d.ts.map +1 -0
- package/dist/team/routes.js +274 -0
- package/dist/team/routes.js.map +1 -0
- package/dist/team/ws-relay.d.ts +39 -0
- package/dist/team/ws-relay.d.ts.map +1 -0
- package/dist/team/ws-relay.js +63 -0
- package/dist/team/ws-relay.js.map +1 -0
- package/endpoint-manifest.json +502 -6
- package/package.json +6 -6
- package/dist/interactive/demo-events.d.ts +0 -367
- package/dist/interactive/demo-events.d.ts.map +0 -1
- package/dist/interactive/demo-events.js +0 -1293
- package/dist/interactive/demo-events.js.map +0 -1
- package/dist/qe/gate-events.d.ts +0 -113
- package/dist/qe/gate-events.d.ts.map +0 -1
- package/dist/qe/gate-events.js +0 -172
- package/dist/qe/gate-events.js.map +0 -1
- package/dist/studio/assets/index-BRDAN35i.js +0 -548
- package/dist/studio/assets/index-Drfcsy8b.css +0 -32
package/dist/cli/mcp.js
CHANGED
|
@@ -13,26 +13,56 @@
|
|
|
13
13
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
14
14
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
15
15
|
import { z } from 'zod';
|
|
16
|
+
import { missingBearerAdvice, withBearerHeader } from './bearer.js';
|
|
16
17
|
// ─── Crew daemon client ───────────────────────────────────────────────────────
|
|
18
|
+
/** The daemon ANSWERED and refused — distinct from "no daemon there", which is a transport error. */
|
|
19
|
+
export class CrewHttpError extends Error {
|
|
20
|
+
status;
|
|
21
|
+
constructor(message, status) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = 'CrewHttpError';
|
|
24
|
+
this.status = status;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* What to say when the startup health probe fails. A refusal is not unreachability: reporting
|
|
29
|
+
* "Cannot reach daemon" for a 401 is false AND it throws away the bearer advice the refusal
|
|
30
|
+
* carries (#637, codex review of #723).
|
|
31
|
+
*/
|
|
32
|
+
export function probeFailureMessage(err, port) {
|
|
33
|
+
if (err instanceof CrewHttpError) {
|
|
34
|
+
return `[wicked-crew mcp] the daemon at port ${port} answered the health probe with ${err.status}: ${err.message}`;
|
|
35
|
+
}
|
|
36
|
+
return (`[wicked-crew mcp] Cannot reach daemon at port ${port}. ` +
|
|
37
|
+
`Start it first with: wicked-crew serve --port ${port}`);
|
|
38
|
+
}
|
|
17
39
|
class CrewClient {
|
|
18
40
|
base;
|
|
19
41
|
constructor(port) {
|
|
20
42
|
this.base = `http://127.0.0.1:${port}/api/v1`;
|
|
21
43
|
}
|
|
44
|
+
/** The failure for a non-2xx: under a team runtime with no bearer, name the variable (#637). */
|
|
45
|
+
static async failure(verb, path, res) {
|
|
46
|
+
const head = `${verb} ${path} → ${res.status}: ${await res.text()}`;
|
|
47
|
+
const advice = res.status === 401 || res.status === 403 ? missingBearerAdvice() : null;
|
|
48
|
+
return new CrewHttpError(advice === null ? head : `${head}\n${advice}`, res.status);
|
|
49
|
+
}
|
|
22
50
|
async get(path) {
|
|
23
|
-
|
|
51
|
+
// withBearerHeader: these verbs bypassed it entirely, so every one of them 401'd under a team
|
|
52
|
+
// runtime with nothing said about why (#637, same class as the `wicked-crew start` regression).
|
|
53
|
+
const res = await fetch(`${this.base}${path}`, withBearerHeader(undefined));
|
|
24
54
|
if (!res.ok)
|
|
25
|
-
throw
|
|
55
|
+
throw await CrewClient.failure('GET', path, res);
|
|
26
56
|
return res.json();
|
|
27
57
|
}
|
|
28
58
|
async post(path, body) {
|
|
29
|
-
const res = await fetch(`${this.base}${path}`, {
|
|
59
|
+
const res = await fetch(`${this.base}${path}`, withBearerHeader({
|
|
30
60
|
method: 'POST',
|
|
31
61
|
headers: { 'Content-Type': 'application/json' },
|
|
32
62
|
body: JSON.stringify(body),
|
|
33
|
-
});
|
|
63
|
+
}));
|
|
34
64
|
if (!res.ok)
|
|
35
|
-
throw
|
|
65
|
+
throw await CrewClient.failure('POST', path, res);
|
|
36
66
|
return res.json();
|
|
37
67
|
}
|
|
38
68
|
}
|
|
@@ -45,22 +75,23 @@ export async function runMcpServer(port) {
|
|
|
45
75
|
const client = new CrewClient(port);
|
|
46
76
|
// Probe the daemon before advertising ourselves — fail loudly if unreachable.
|
|
47
77
|
// Capture the version from the health response so serverInfo stays in sync with the daemon.
|
|
78
|
+
// `/api/v1/health` IS a protected path (api/auth.ts `isProtectedPath`), so under a team runtime
|
|
79
|
+
// with no bearer this probe gets a 401, not a transport failure — hence probeFailureMessage.
|
|
48
80
|
let daemonVersion = '0.0.0';
|
|
49
81
|
try {
|
|
50
82
|
const health = await client.get('/health');
|
|
51
83
|
if (typeof health.version === 'string')
|
|
52
84
|
daemonVersion = health.version;
|
|
53
85
|
}
|
|
54
|
-
catch {
|
|
55
|
-
throw new Error(
|
|
56
|
-
`Start it first with: wicked-crew serve --port ${port}`);
|
|
86
|
+
catch (err) {
|
|
87
|
+
throw new Error(probeFailureMessage(err, port));
|
|
57
88
|
}
|
|
58
89
|
const server = new McpServer({ name: 'wicked-crew', version: daemonVersion });
|
|
59
90
|
// ── launch_run ─────────────────────────────────────────────────────────────
|
|
60
91
|
server.tool('launch_run', 'Launch a new governed workflow run on the wicked-crew daemon. ' +
|
|
61
92
|
'Returns the run ID which can be used with the other tools.', {
|
|
62
93
|
problem: z.string().min(1).describe('The task description / problem statement for the run'),
|
|
63
|
-
workflow: z.string().optional().describe('Workflow id (e.g. "feature", "bug", "
|
|
94
|
+
workflow: z.string().optional().describe('Workflow id (e.g. "feature", "bug", "domain-extraction"). ' +
|
|
64
95
|
'Use list_workflows to see available ids.'),
|
|
65
96
|
repo: z.string().optional().describe('Registered repo reference (id returned by the daemon registry). ' +
|
|
66
97
|
'Required for workflows that need a code graph.'),
|
package/dist/cli/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/cli/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,iFAAiF;AAEjF,MAAM,UAAU;IACG,IAAI,CAAS;IAE9B,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,oBAAoB,IAAI,SAAS,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/cli/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export declare const SERVICE_LABEL = "com.wickedagile.wicked-crew";
|
|
2
|
+
export declare const SYSTEMD_UNIT_NAME = "wicked-crew.service";
|
|
3
|
+
export declare const INSTALL_SERVICE_FLAG = "--install-service";
|
|
4
|
+
export declare const UNINSTALL_SERVICE_FLAG = "--uninstall-service";
|
|
5
|
+
export type ServicePlatform = 'darwin' | 'linux' | 'other';
|
|
6
|
+
export declare function servicePlatform(platform?: NodeJS.Platform): ServicePlatform;
|
|
7
|
+
/** Where the unit file lives for this platform, or `null` where nothing is automated. */
|
|
8
|
+
export declare function serviceUnitPath(platform: ServicePlatform, home?: string): string | null;
|
|
9
|
+
export interface CapturedEnv {
|
|
10
|
+
env: Record<string, string>;
|
|
11
|
+
/** Names that would have been carried but look like secrets — reported, never written. */
|
|
12
|
+
omitted: string[];
|
|
13
|
+
}
|
|
14
|
+
/** The service environment: the allowlist + every `WICKED_*` variable, minus anything secret-shaped. */
|
|
15
|
+
export declare function captureServiceEnv(source?: NodeJS.ProcessEnv): CapturedEnv;
|
|
16
|
+
export interface ServiceSpec {
|
|
17
|
+
/** Absolute argv: the node binary, the CLI entry, `serve`, and the forwarded serve options. */
|
|
18
|
+
program: string[];
|
|
19
|
+
env: Record<string, string>;
|
|
20
|
+
/** stdout + stderr of the daemon. */
|
|
21
|
+
logPath: string;
|
|
22
|
+
workingDir: string;
|
|
23
|
+
}
|
|
24
|
+
/** The serve options the service re-runs with: argv minus the two service flags. */
|
|
25
|
+
export declare function forwardedServeArgs(argv: string[]): string[];
|
|
26
|
+
export declare function renderPlist(spec: ServiceSpec): string;
|
|
27
|
+
export declare function renderSystemdUnit(spec: ServiceSpec): string;
|
|
28
|
+
/** The daemon log an installed unit writes to — read back from the unit text (`status` names it). */
|
|
29
|
+
export declare function logPathFromUnit(text: string): string | null;
|
|
30
|
+
/** An installed service on this host: its unit path and the log it writes, or `null`. */
|
|
31
|
+
export declare function installedService(platform?: ServicePlatform, home?: string): {
|
|
32
|
+
unitPath: string;
|
|
33
|
+
logPath: string | null;
|
|
34
|
+
} | null;
|
|
35
|
+
/** Printed where nothing is automated (Windows): a Task Scheduler recipe for the same command. */
|
|
36
|
+
export declare function windowsRecipe(spec: ServiceSpec): string;
|
|
37
|
+
export interface CommandResult {
|
|
38
|
+
status: number | null;
|
|
39
|
+
stdout: string;
|
|
40
|
+
stderr: string;
|
|
41
|
+
}
|
|
42
|
+
export type CommandRunner = (cmd: string, args: string[]) => CommandResult;
|
|
43
|
+
export declare const runCommand: CommandRunner;
|
|
44
|
+
export interface ServiceDeps {
|
|
45
|
+
platform: ServicePlatform;
|
|
46
|
+
home: string;
|
|
47
|
+
uid: number;
|
|
48
|
+
run: CommandRunner;
|
|
49
|
+
/** A process already listening on the daemon port (`null` = nothing answering). */
|
|
50
|
+
portHolder: () => Promise<{
|
|
51
|
+
pid: number | null;
|
|
52
|
+
} | null>;
|
|
53
|
+
log: (line: string) => void;
|
|
54
|
+
}
|
|
55
|
+
export interface InstallInput {
|
|
56
|
+
/** The CLI entry the service runs (`process.argv[1]`). */
|
|
57
|
+
cliPath: string;
|
|
58
|
+
nodePath: string;
|
|
59
|
+
serveArgs: string[];
|
|
60
|
+
env: NodeJS.ProcessEnv;
|
|
61
|
+
/** The daemon's state home (the `--db` parent or `~/.wicked-crew`) — the log lands there. */
|
|
62
|
+
stateHome: string;
|
|
63
|
+
port: number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The node binary the unit names. `process.execPath` is the resolved binary (Homebrew:
|
|
67
|
+
* `/opt/homebrew/Cellar/node/<version>/bin/node`), which a node upgrade deletes. When a `node` on
|
|
68
|
+
* the captured PATH resolves to that same binary, name the PATH entry instead (the stable symlink).
|
|
69
|
+
*/
|
|
70
|
+
export declare function stableNodePath(execPath: string, path: string | undefined): string;
|
|
71
|
+
/** `0` on success, `1` on a refusal or a failed service-manager call (the reason is logged). */
|
|
72
|
+
export declare function installService(input: InstallInput, deps: ServiceDeps): Promise<number>;
|
|
73
|
+
/** The pid of the loaded service's running process, or `null` (not loaded, not running, unknown). */
|
|
74
|
+
export declare function runningServicePid(deps: Pick<ServiceDeps, 'platform' | 'uid' | 'run'>): number | null;
|
|
75
|
+
export declare function uninstallService(deps: Pick<ServiceDeps, 'platform' | 'home' | 'uid' | 'run' | 'log'>): number;
|
|
76
|
+
/** The pid listening on a TCP port (lsof; best-effort, `null` when unknown). */
|
|
77
|
+
export declare function listeningPid(port: number, run?: CommandRunner): number | null;
|
|
78
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/cli/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
// `wicked-crew serve --install-service` / `--uninstall-service` — crew#551 (F-RC1-044).
|
|
2
|
+
//
|
|
3
|
+
// A hand-started daemon dies with the machine, and after a reboot the product is simply down. This
|
|
4
|
+
// registers the daemon as a per-user login service so it comes back on its own:
|
|
5
|
+
// - macOS: a LaunchAgent (`~/Library/LaunchAgents/com.wickedagile.wicked-crew.plist`), RunAtLoad +
|
|
6
|
+
// KeepAlive, loaded with `launchctl bootstrap gui/<uid>`.
|
|
7
|
+
// - Linux: a systemd user unit (`~/.config/systemd/user/wicked-crew.service`), Restart=on-failure,
|
|
8
|
+
// enabled with `systemctl --user enable --now`.
|
|
9
|
+
// - anything else: the recipe is printed, nothing is automated.
|
|
10
|
+
//
|
|
11
|
+
// The service environment is captured ONCE at install time from an allowlist — a service manager
|
|
12
|
+
// starts the daemon with a near-empty environment, and the daemon's worker fence for a non-default
|
|
13
|
+
// Claude config dir is derived from ITS OWN `CLAUDE_CONFIG_DIR` (core#403), so that variable must
|
|
14
|
+
// travel with the service. Secrets (names carrying TOKEN/SECRET/PASSWORD/KEY/CREDENTIAL) are NEVER
|
|
15
|
+
// written into the unit file: they are named in the install output, not persisted.
|
|
16
|
+
//
|
|
17
|
+
// Pure renderers + one installer with an injectable command runner, so the unit text and the
|
|
18
|
+
// command sequence are unit-tested without touching the host's service manager.
|
|
19
|
+
import { spawnSync } from 'node:child_process';
|
|
20
|
+
import { existsSync, mkdirSync, readFileSync, realpathSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
21
|
+
import { homedir } from 'node:os';
|
|
22
|
+
import { delimiter, dirname, join } from 'node:path';
|
|
23
|
+
import { childEnvWithBootEstateDb } from '../core/governance-store.js';
|
|
24
|
+
export const SERVICE_LABEL = 'com.wickedagile.wicked-crew';
|
|
25
|
+
export const SYSTEMD_UNIT_NAME = 'wicked-crew.service';
|
|
26
|
+
export const INSTALL_SERVICE_FLAG = '--install-service';
|
|
27
|
+
export const UNINSTALL_SERVICE_FLAG = '--uninstall-service';
|
|
28
|
+
export function servicePlatform(platform = process.platform) {
|
|
29
|
+
return platform === 'darwin' ? 'darwin' : platform === 'linux' ? 'linux' : 'other';
|
|
30
|
+
}
|
|
31
|
+
/** Where the unit file lives for this platform, or `null` where nothing is automated. */
|
|
32
|
+
export function serviceUnitPath(platform, home = homedir()) {
|
|
33
|
+
if (platform === 'darwin')
|
|
34
|
+
return join(home, 'Library', 'LaunchAgents', `${SERVICE_LABEL}.plist`);
|
|
35
|
+
if (platform === 'linux')
|
|
36
|
+
return join(home, '.config', 'systemd', 'user', SYSTEMD_UNIT_NAME);
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
/** Exact names carried into the service environment (besides the `WICKED_*` prefix). */
|
|
40
|
+
const ENV_ALLOW = new Set([
|
|
41
|
+
'PATH',
|
|
42
|
+
'HOME',
|
|
43
|
+
'USER',
|
|
44
|
+
'LANG',
|
|
45
|
+
'LC_ALL',
|
|
46
|
+
'XDG_CONFIG_HOME',
|
|
47
|
+
// core#403: the daemon derives the worker fence for the operator's Claude config dir from its own
|
|
48
|
+
// CLAUDE_CONFIG_DIR — without it a service-managed daemon stops fencing a non-default dir.
|
|
49
|
+
'CLAUDE_CONFIG_DIR',
|
|
50
|
+
'CODEX_HOME',
|
|
51
|
+
'CREW_PORT',
|
|
52
|
+
// The deliver push identity pin (crew#549 / F-RC1-010) — an account NAME, not a credential.
|
|
53
|
+
'GH_ACCOUNT',
|
|
54
|
+
]);
|
|
55
|
+
const SECRET_NAME = /TOKEN|SECRET|PASS|KEY|CREDENTIAL|BEARER|COOKIE|SESSION/i;
|
|
56
|
+
/** A value carrying a credential in URL userinfo (`postgres://user:pass@host/db`). */
|
|
57
|
+
const SECRET_VALUE = /^[a-z][a-z0-9+.-]*:\/\/[^/@\s]*:[^/@\s]*@/i;
|
|
58
|
+
/** The service environment: the allowlist + every `WICKED_*` variable, minus anything secret-shaped. */
|
|
59
|
+
export function captureServiceEnv(source = process.env) {
|
|
60
|
+
const env = {};
|
|
61
|
+
const omitted = [];
|
|
62
|
+
for (const name of Object.keys(source).sort()) {
|
|
63
|
+
const value = source[name];
|
|
64
|
+
if (value === undefined)
|
|
65
|
+
continue;
|
|
66
|
+
const wanted = ENV_ALLOW.has(name) || name.startsWith('WICKED_');
|
|
67
|
+
if (SECRET_NAME.test(name) || (wanted && SECRET_VALUE.test(value))) {
|
|
68
|
+
if (wanted || name === 'GH_TOKEN' || name === 'GITHUB_TOKEN')
|
|
69
|
+
omitted.push(name);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (wanted)
|
|
73
|
+
env[name] = value;
|
|
74
|
+
}
|
|
75
|
+
return { env, omitted };
|
|
76
|
+
}
|
|
77
|
+
/** The serve options the service re-runs with: argv minus the two service flags. */
|
|
78
|
+
export function forwardedServeArgs(argv) {
|
|
79
|
+
return argv.filter((a) => a !== INSTALL_SERVICE_FLAG && a !== UNINSTALL_SERVICE_FLAG);
|
|
80
|
+
}
|
|
81
|
+
function xml(s) {
|
|
82
|
+
return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''');
|
|
83
|
+
}
|
|
84
|
+
export function renderPlist(spec) {
|
|
85
|
+
const args = spec.program.map((a) => ` <string>${xml(a)}</string>`).join('\n');
|
|
86
|
+
const env = Object.entries(spec.env)
|
|
87
|
+
.map(([k, v]) => ` <key>${xml(k)}</key>\n <string>${xml(v)}</string>`)
|
|
88
|
+
.join('\n');
|
|
89
|
+
return [
|
|
90
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
91
|
+
'<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">',
|
|
92
|
+
'<plist version="1.0">',
|
|
93
|
+
'<dict>',
|
|
94
|
+
' <key>Label</key>',
|
|
95
|
+
` <string>${SERVICE_LABEL}</string>`,
|
|
96
|
+
' <key>ProgramArguments</key>',
|
|
97
|
+
' <array>',
|
|
98
|
+
args,
|
|
99
|
+
' </array>',
|
|
100
|
+
' <key>EnvironmentVariables</key>',
|
|
101
|
+
' <dict>',
|
|
102
|
+
env,
|
|
103
|
+
' </dict>',
|
|
104
|
+
' <key>WorkingDirectory</key>',
|
|
105
|
+
` <string>${xml(spec.workingDir)}</string>`,
|
|
106
|
+
' <key>RunAtLoad</key>',
|
|
107
|
+
' <true/>',
|
|
108
|
+
' <key>KeepAlive</key>',
|
|
109
|
+
' <true/>',
|
|
110
|
+
// No `ProcessType: Background`: launchd throttles a Background job's disk I/O, and on a busy
|
|
111
|
+
// host the daemon then took minutes to open its own module files. The default (Standard) is right.
|
|
112
|
+
' <key>StandardOutPath</key>',
|
|
113
|
+
` <string>${xml(spec.logPath)}</string>`,
|
|
114
|
+
' <key>StandardErrorPath</key>',
|
|
115
|
+
` <string>${xml(spec.logPath)}</string>`,
|
|
116
|
+
'</dict>',
|
|
117
|
+
'</plist>',
|
|
118
|
+
'',
|
|
119
|
+
].join('\n');
|
|
120
|
+
}
|
|
121
|
+
/** A systemd-quoted word: double quotes, `\` and `"` escaped, `%` doubled (specifier escape). */
|
|
122
|
+
function sdQuote(s) {
|
|
123
|
+
return `"${s.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/%/g, '%%')}"`;
|
|
124
|
+
}
|
|
125
|
+
export function renderSystemdUnit(spec) {
|
|
126
|
+
return [
|
|
127
|
+
'[Unit]',
|
|
128
|
+
'Description=wicked-crew daemon (governed agent runs + the studio console)',
|
|
129
|
+
'After=network-online.target',
|
|
130
|
+
'',
|
|
131
|
+
'[Service]',
|
|
132
|
+
'Type=simple',
|
|
133
|
+
`ExecStart=${spec.program.map(sdQuote).join(' ')}`,
|
|
134
|
+
`WorkingDirectory=${sdQuote(spec.workingDir)}`,
|
|
135
|
+
...Object.entries(spec.env).map(([k, v]) => `Environment=${sdQuote(`${k}=${v}`)}`),
|
|
136
|
+
// `append:` takes the rest of the line as the path (no quoting); `%` is a specifier, so doubled.
|
|
137
|
+
`StandardOutput=append:${spec.logPath.replace(/%/g, '%%')}`,
|
|
138
|
+
`StandardError=append:${spec.logPath.replace(/%/g, '%%')}`,
|
|
139
|
+
'Restart=on-failure',
|
|
140
|
+
'RestartSec=5',
|
|
141
|
+
'',
|
|
142
|
+
'[Install]',
|
|
143
|
+
'WantedBy=default.target',
|
|
144
|
+
'',
|
|
145
|
+
].join('\n');
|
|
146
|
+
}
|
|
147
|
+
/** The daemon log an installed unit writes to — read back from the unit text (`status` names it). */
|
|
148
|
+
export function logPathFromUnit(text) {
|
|
149
|
+
const plist = /<key>StandardErrorPath<\/key>\s*<string>([^<]*)<\/string>/.exec(text);
|
|
150
|
+
if (plist?.[1] !== undefined) {
|
|
151
|
+
return plist[1].replace(/'/g, "'").replace(/"/g, '"').replace(/>/g, '>').replace(/</g, '<').replace(/&/g, '&');
|
|
152
|
+
}
|
|
153
|
+
const unit = /^StandardError=append:(.+)$/m.exec(text);
|
|
154
|
+
return unit?.[1]?.replace(/%%/g, '%') ?? null;
|
|
155
|
+
}
|
|
156
|
+
/** An installed service on this host: its unit path and the log it writes, or `null`. */
|
|
157
|
+
export function installedService(platform = servicePlatform(), home = homedir()) {
|
|
158
|
+
const unitPath = serviceUnitPath(platform, home);
|
|
159
|
+
if (unitPath === null || !existsSync(unitPath))
|
|
160
|
+
return null;
|
|
161
|
+
let text = '';
|
|
162
|
+
try {
|
|
163
|
+
text = readFileSync(unitPath, 'utf8');
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
/* unreadable unit: still installed */
|
|
167
|
+
}
|
|
168
|
+
return { unitPath, logPath: logPathFromUnit(text) };
|
|
169
|
+
}
|
|
170
|
+
/** Printed where nothing is automated (Windows): a Task Scheduler recipe for the same command. */
|
|
171
|
+
export function windowsRecipe(spec) {
|
|
172
|
+
const cmd = spec.program.map((a) => (/\s/.test(a) ? `"${a}"` : a)).join(' ');
|
|
173
|
+
return [
|
|
174
|
+
'wicked-crew: a login service is not automated on this platform. Register it with Task Scheduler:',
|
|
175
|
+
` schtasks /Create /SC ONLOGON /TN wicked-crew /TR "${cmd.replace(/"/g, '\\"')}" /RL LIMITED`,
|
|
176
|
+
'and set the same environment variables for your user first (setx NAME value).',
|
|
177
|
+
].join('\n');
|
|
178
|
+
}
|
|
179
|
+
export const runCommand = (cmd, args) => {
|
|
180
|
+
const r = spawnSync(cmd, args, { encoding: 'utf8', env: childEnvWithBootEstateDb(process.env) });
|
|
181
|
+
return { status: r.error ? 127 : r.status, stdout: r.stdout ?? '', stderr: r.stderr ?? (r.error?.message ?? '') };
|
|
182
|
+
};
|
|
183
|
+
/**
|
|
184
|
+
* The node binary the unit names. `process.execPath` is the resolved binary (Homebrew:
|
|
185
|
+
* `/opt/homebrew/Cellar/node/<version>/bin/node`), which a node upgrade deletes. When a `node` on
|
|
186
|
+
* the captured PATH resolves to that same binary, name the PATH entry instead (the stable symlink).
|
|
187
|
+
*/
|
|
188
|
+
export function stableNodePath(execPath, path) {
|
|
189
|
+
let target = execPath;
|
|
190
|
+
try {
|
|
191
|
+
target = realpathSync(execPath);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return execPath;
|
|
195
|
+
}
|
|
196
|
+
for (const dir of (path ?? '').split(delimiter)) {
|
|
197
|
+
if (dir === '')
|
|
198
|
+
continue;
|
|
199
|
+
const candidate = join(dir, 'node');
|
|
200
|
+
try {
|
|
201
|
+
if (realpathSync(candidate) === target)
|
|
202
|
+
return candidate;
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
/* not here */
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return execPath;
|
|
209
|
+
}
|
|
210
|
+
/** `0` on success, `1` on a refusal or a failed service-manager call (the reason is logged). */
|
|
211
|
+
export async function installService(input, deps) {
|
|
212
|
+
const unitPath = serviceUnitPath(deps.platform, deps.home);
|
|
213
|
+
let cli = input.cliPath;
|
|
214
|
+
try {
|
|
215
|
+
cli = realpathSync(input.cliPath);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
/* keep as given */
|
|
219
|
+
}
|
|
220
|
+
if (/[\\/]_npx[\\/]/.test(cli)) {
|
|
221
|
+
deps.log('wicked-crew: refusing to install a login service that runs from the npx cache (it is not durable). ' +
|
|
222
|
+
'Install crew first — `npm install -g wicked-crew` — then run `wicked-crew serve --install-service`.');
|
|
223
|
+
return 1;
|
|
224
|
+
}
|
|
225
|
+
const { env, omitted } = captureServiceEnv(input.env);
|
|
226
|
+
const nodePath = stableNodePath(input.nodePath, env['PATH']);
|
|
227
|
+
const logPath = join(input.stateHome, 'daemon-stdout.log');
|
|
228
|
+
const spec = {
|
|
229
|
+
program: [nodePath, cli, 'serve', ...forwardedServeArgs(input.serveArgs)],
|
|
230
|
+
env,
|
|
231
|
+
logPath,
|
|
232
|
+
workingDir: deps.home,
|
|
233
|
+
};
|
|
234
|
+
if (unitPath === null) {
|
|
235
|
+
deps.log(windowsRecipe(spec));
|
|
236
|
+
return 0;
|
|
237
|
+
}
|
|
238
|
+
const alreadyInstalled = existsSync(unitPath);
|
|
239
|
+
// Never touch a hand-started daemon on the same port: refuse and name its pid.
|
|
240
|
+
const holder = await deps.portHolder();
|
|
241
|
+
// Only the installed service's own process may hold the port (a re-install reloads it). Anything
|
|
242
|
+
// else (a hand-started daemon, another program) is refused, named by pid, and left alone.
|
|
243
|
+
if (holder !== null) {
|
|
244
|
+
const servicePid = alreadyInstalled ? runningServicePid(deps) : null;
|
|
245
|
+
const isService = servicePid !== null && (holder.pid === null || holder.pid === servicePid);
|
|
246
|
+
if (!isService) {
|
|
247
|
+
const who = holder.pid !== null ? `pid ${holder.pid}` : 'a process lsof could not name';
|
|
248
|
+
deps.log(`wicked-crew: 127.0.0.1:${input.port} is already held by ${who}, which is not the login service. ` +
|
|
249
|
+
'Stop it first (a hand-started daemon: its terminal, or `kill <pid>`), then run `wicked-crew serve --install-service` again.');
|
|
250
|
+
return 1;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
mkdirSync(dirname(unitPath), { recursive: true });
|
|
254
|
+
mkdirSync(dirname(logPath), { recursive: true });
|
|
255
|
+
const text = deps.platform === 'darwin' ? renderPlist(spec) : renderSystemdUnit(spec);
|
|
256
|
+
writeFileSync(unitPath, text, { mode: 0o600 });
|
|
257
|
+
const steps = deps.platform === 'darwin'
|
|
258
|
+
? [
|
|
259
|
+
// An installed agent is reloaded (bootout tolerates "not loaded").
|
|
260
|
+
...(alreadyInstalled ? [['launchctl', ['bootout', `gui/${deps.uid}/${SERVICE_LABEL}`], false]] : []),
|
|
261
|
+
['launchctl', ['bootstrap', `gui/${deps.uid}`, unitPath], true],
|
|
262
|
+
]
|
|
263
|
+
: [
|
|
264
|
+
['systemctl', ['--user', 'daemon-reload'], true],
|
|
265
|
+
['systemctl', ['--user', 'enable', SYSTEMD_UNIT_NAME], true],
|
|
266
|
+
['systemctl', ['--user', 'restart', SYSTEMD_UNIT_NAME], true],
|
|
267
|
+
];
|
|
268
|
+
for (const [cmd, args, required] of steps) {
|
|
269
|
+
const r = deps.run(cmd, args);
|
|
270
|
+
if (required && r.status !== 0) {
|
|
271
|
+
deps.log(`wicked-crew: \`${cmd} ${args.join(' ')}\` failed (exit ${r.status ?? 'signal'}): ${(r.stderr || r.stdout).trim()}`);
|
|
272
|
+
deps.log(`The unit file is at ${unitPath}; remove it with \`wicked-crew serve --uninstall-service\`.`);
|
|
273
|
+
return 1;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
deps.log(`wicked-crew: login service installed — ${unitPath}`);
|
|
277
|
+
deps.log(` runs: ${spec.program.join(' ')}`);
|
|
278
|
+
deps.log(` log: ${logPath}`);
|
|
279
|
+
deps.log(` env: ${Object.keys(env).join(', ') || '(none)'}`);
|
|
280
|
+
if (omitted.length > 0) {
|
|
281
|
+
deps.log(` not written to the unit (secret-shaped): ${omitted.join(', ')} — the service runs without them` +
|
|
282
|
+
(omitted.includes('GH_TOKEN')
|
|
283
|
+
? `; the deliver phase pushes with gh's keyring login${env['GH_ACCOUNT'] !== undefined ? ', checked against GH_ACCOUNT' : ''}`
|
|
284
|
+
: ''));
|
|
285
|
+
}
|
|
286
|
+
if (deps.platform === 'linux') {
|
|
287
|
+
deps.log(' to start it at boot without a login session: `loginctl enable-linger $USER`');
|
|
288
|
+
}
|
|
289
|
+
deps.log('The daemon is starting; `wicked-crew status` answers once it is up.');
|
|
290
|
+
return 0;
|
|
291
|
+
}
|
|
292
|
+
/** The pid of the loaded service's running process, or `null` (not loaded, not running, unknown). */
|
|
293
|
+
export function runningServicePid(deps) {
|
|
294
|
+
if (deps.platform === 'darwin') {
|
|
295
|
+
const r = deps.run('launchctl', ['print', `gui/${deps.uid}/${SERVICE_LABEL}`]);
|
|
296
|
+
const m = r.status === 0 ? /^\s*pid = (\d+)$/m.exec(r.stdout) : null;
|
|
297
|
+
return m?.[1] !== undefined ? Number(m[1]) : null;
|
|
298
|
+
}
|
|
299
|
+
if (deps.platform === 'linux') {
|
|
300
|
+
const r = deps.run('systemctl', ['--user', 'show', '-p', 'MainPID', '--value', SYSTEMD_UNIT_NAME]);
|
|
301
|
+
const pid = Number(r.stdout.trim());
|
|
302
|
+
return r.status === 0 && Number.isInteger(pid) && pid > 0 ? pid : null;
|
|
303
|
+
}
|
|
304
|
+
return null;
|
|
305
|
+
}
|
|
306
|
+
export function uninstallService(deps) {
|
|
307
|
+
const unitPath = serviceUnitPath(deps.platform, deps.home);
|
|
308
|
+
if (unitPath === null) {
|
|
309
|
+
deps.log('wicked-crew: no login service is automated on this platform (remove the Task Scheduler task by hand).');
|
|
310
|
+
return 0;
|
|
311
|
+
}
|
|
312
|
+
if (!existsSync(unitPath)) {
|
|
313
|
+
deps.log(`wicked-crew: no login service installed (${unitPath} does not exist).`);
|
|
314
|
+
return 0;
|
|
315
|
+
}
|
|
316
|
+
if (deps.platform === 'darwin') {
|
|
317
|
+
deps.run('launchctl', ['bootout', `gui/${deps.uid}/${SERVICE_LABEL}`]);
|
|
318
|
+
unlinkSync(unitPath);
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
deps.run('systemctl', ['--user', 'disable', '--now', SYSTEMD_UNIT_NAME]);
|
|
322
|
+
unlinkSync(unitPath);
|
|
323
|
+
deps.run('systemctl', ['--user', 'daemon-reload']);
|
|
324
|
+
}
|
|
325
|
+
deps.log(`wicked-crew: login service removed (${unitPath}); the daemon it ran is stopped.`);
|
|
326
|
+
return 0;
|
|
327
|
+
}
|
|
328
|
+
/** The pid listening on a TCP port (lsof; best-effort, `null` when unknown). */
|
|
329
|
+
export function listeningPid(port, run = runCommand) {
|
|
330
|
+
const r = run('lsof', ['-nP', `-iTCP:${port}`, '-sTCP:LISTEN', '-t']);
|
|
331
|
+
const pid = Number((r.stdout.trim().split('\n')[0] ?? '').trim());
|
|
332
|
+
return r.status === 0 && Number.isInteger(pid) && pid > 0 ? pid : null;
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/cli/service.ts"],"names":[],"mappings":"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"}
|