@flyingrobots/graft 0.7.0 → 0.7.1
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/CHANGELOG.md +13 -0
- package/README.md +0 -1
- package/bin/graft.js +26 -26
- package/dist/cli/init-client-config.d.ts.map +1 -1
- package/dist/cli/init-client-config.js +40 -4
- package/dist/cli/init-client-config.js.map +1 -1
- package/dist/cli/init-model.js +2 -2
- package/dist/cli/init-model.js.map +1 -1
- package/dist/cli/json-document.d.ts +1 -0
- package/dist/cli/json-document.d.ts.map +1 -1
- package/dist/cli/json-document.js +3 -0
- package/dist/cli/json-document.js.map +1 -1
- package/dist/hooks/posttooluse-read.js +1 -1
- package/dist/hooks/posttooluse-read.js.map +1 -1
- package/dist/hooks/pretooluse-read.js +1 -1
- package/dist/hooks/pretooluse-read.js.map +1 -1
- package/dist/mcp/daemon-worker-child-pool.d.ts +2 -0
- package/dist/mcp/daemon-worker-child-pool.d.ts.map +1 -1
- package/dist/mcp/daemon-worker-child-pool.js +10 -3
- package/dist/mcp/daemon-worker-child-pool.js.map +1 -1
- package/dist/mcp/daemon-worker-pool.d.ts +1 -1
- package/dist/mcp/daemon-worker-pool.d.ts.map +1 -1
- package/dist/mcp/daemon-worker-pool.js +1 -1
- package/dist/mcp/daemon-worker-pool.js.map +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +3 -1
- package/dist/version.js.map +1 -1
- package/docs/SETUP.md +11 -7
- package/package.json +9 -4
- package/src/adapters/canonical-json.ts +0 -56
- package/src/adapters/json-text-decoder.ts +0 -11
- package/src/adapters/node-fs.ts +0 -43
- package/src/adapters/node-git.ts +0 -47
- package/src/adapters/node-paths.ts +0 -35
- package/src/adapters/node-process-runner.ts +0 -27
- package/src/adapters/repo-paths.ts +0 -63
- package/src/adapters/rotating-ndjson-log.ts +0 -66
- package/src/api/index.ts +0 -107
- package/src/api/repo-local-graft.ts +0 -21
- package/src/api/repo-workspace.ts +0 -34
- package/src/api/tool-bridge.ts +0 -22
- package/src/cli/activity-render.ts +0 -112
- package/src/cli/cli-error.ts +0 -192
- package/src/cli/command-parser.ts +0 -484
- package/src/cli/daemon-status-model.ts +0 -238
- package/src/cli/daemon-status-render.ts +0 -102
- package/src/cli/daemon-status.ts +0 -100
- package/src/cli/entrypoint.ts +0 -18
- package/src/cli/git-graft-enhance-model.ts +0 -131
- package/src/cli/git-graft-enhance-render.ts +0 -33
- package/src/cli/git-graft-enhance.ts +0 -54
- package/src/cli/index-cmd.ts +0 -90
- package/src/cli/index-model.ts +0 -75
- package/src/cli/init-bootstrap.ts +0 -47
- package/src/cli/init-client-config.ts +0 -428
- package/src/cli/init-model.ts +0 -284
- package/src/cli/init-render.ts +0 -54
- package/src/cli/init-target-hooks.ts +0 -93
- package/src/cli/init.ts +0 -124
- package/src/cli/json-document.ts +0 -155
- package/src/cli/local-history-dag-model.ts +0 -437
- package/src/cli/local-history-dag-render.ts +0 -133
- package/src/cli/local-history-dag.ts +0 -103
- package/src/cli/main.ts +0 -197
- package/src/cli/migrate-local-history.ts +0 -119
- package/src/cli/peer-command.ts +0 -60
- package/src/contracts/capabilities.ts +0 -540
- package/src/contracts/causal-ontology.ts +0 -627
- package/src/contracts/causal-surface-next-action.ts +0 -18
- package/src/contracts/json-object.ts +0 -18
- package/src/contracts/mcp-runtime.ts +0 -16
- package/src/contracts/output-schema-cli.ts +0 -103
- package/src/contracts/output-schema-fragments.ts +0 -881
- package/src/contracts/output-schema-mcp.ts +0 -501
- package/src/contracts/output-schema-meta.ts +0 -119
- package/src/contracts/output-schemas.ts +0 -1524
- package/src/git/diff.ts +0 -161
- package/src/git/target-git-hook-bootstrap.ts +0 -56
- package/src/guards/stream-boundary.ts +0 -110
- package/src/hooks/posttooluse-read.ts +0 -54
- package/src/hooks/pretooluse-read.ts +0 -52
- package/src/hooks/read-governor.ts +0 -95
- package/src/hooks/read-messages.ts +0 -53
- package/src/hooks/shared.ts +0 -168
- package/src/index.ts +0 -1
- package/src/mcp/burden.ts +0 -132
- package/src/mcp/cache.ts +0 -7
- package/src/mcp/cached-file.ts +0 -1
- package/src/mcp/context.ts +0 -150
- package/src/mcp/control-plane/authz-storage.ts +0 -129
- package/src/mcp/control-plane/session-registry.ts +0 -115
- package/src/mcp/control-plane/status-projection.ts +0 -76
- package/src/mcp/control-plane/types.ts +0 -144
- package/src/mcp/daemon-bootstrap.ts +0 -100
- package/src/mcp/daemon-control-plane.ts +0 -310
- package/src/mcp/daemon-job-scheduler.ts +0 -279
- package/src/mcp/daemon-repos.ts +0 -99
- package/src/mcp/daemon-server.ts +0 -172
- package/src/mcp/daemon-session-host.ts +0 -234
- package/src/mcp/daemon-stdio-bridge.ts +0 -262
- package/src/mcp/daemon-worker-child-pool.ts +0 -213
- package/src/mcp/daemon-worker-inline-pool.ts +0 -46
- package/src/mcp/daemon-worker-pool.ts +0 -7
- package/src/mcp/daemon-worker-process.ts +0 -52
- package/src/mcp/daemon-worker-types.ts +0 -66
- package/src/mcp/metrics.ts +0 -176
- package/src/mcp/monitor-health.ts +0 -83
- package/src/mcp/monitor-persistence.ts +0 -54
- package/src/mcp/monitor-tick-job.ts +0 -153
- package/src/mcp/monitor-types.ts +0 -103
- package/src/mcp/persisted-local-history-graph.ts +0 -592
- package/src/mcp/persisted-local-history-policy.ts +0 -501
- package/src/mcp/persisted-local-history-views.ts +0 -250
- package/src/mcp/persisted-local-history.ts +0 -1621
- package/src/mcp/persistent-monitor-runtime.ts +0 -482
- package/src/mcp/policy.ts +0 -75
- package/src/mcp/receipt.ts +0 -201
- package/src/mcp/repo-concurrency.ts +0 -392
- package/src/mcp/repo-overview/filter.ts +0 -44
- package/src/mcp/repo-overview/types.ts +0 -63
- package/src/mcp/repo-overview/view-projection.ts +0 -90
- package/src/mcp/repo-state-git.ts +0 -247
- package/src/mcp/repo-state-observation.ts +0 -203
- package/src/mcp/repo-state-transition.ts +0 -151
- package/src/mcp/repo-state-types.ts +0 -107
- package/src/mcp/repo-state.ts +0 -146
- package/src/mcp/repo-tool-job.ts +0 -102
- package/src/mcp/repo-tool-worker-context.ts +0 -215
- package/src/mcp/repo-workspace.ts +0 -21
- package/src/mcp/run-capture-config.ts +0 -33
- package/src/mcp/runtime-causal-context.ts +0 -72
- package/src/mcp/runtime-observability.ts +0 -217
- package/src/mcp/runtime-staged-target.ts +0 -161
- package/src/mcp/runtime-workspace-overlay.ts +0 -255
- package/src/mcp/secret-scrub.ts +0 -89
- package/src/mcp/semantic-transition-guidance.ts +0 -60
- package/src/mcp/semantic-transition-summary.ts +0 -130
- package/src/mcp/server-context.ts +0 -236
- package/src/mcp/server-invocation.ts +0 -388
- package/src/mcp/server-tool-access.ts +0 -148
- package/src/mcp/server.ts +0 -270
- package/src/mcp/stdio-server.ts +0 -26
- package/src/mcp/stdio.ts +0 -3
- package/src/mcp/tool-registry.ts +0 -98
- package/src/mcp/tools/activity-view.ts +0 -325
- package/src/mcp/tools/budget.ts +0 -23
- package/src/mcp/tools/causal-attach.ts +0 -67
- package/src/mcp/tools/causal-status.ts +0 -58
- package/src/mcp/tools/changed-since.ts +0 -71
- package/src/mcp/tools/code-find.ts +0 -192
- package/src/mcp/tools/code-refs.ts +0 -470
- package/src/mcp/tools/code-show.ts +0 -289
- package/src/mcp/tools/daemon-monitors.ts +0 -14
- package/src/mcp/tools/daemon-repos.ts +0 -22
- package/src/mcp/tools/daemon-sessions.ts +0 -14
- package/src/mcp/tools/daemon-status.ts +0 -12
- package/src/mcp/tools/diagnostic-models.ts +0 -97
- package/src/mcp/tools/doctor.ts +0 -83
- package/src/mcp/tools/explain.ts +0 -84
- package/src/mcp/tools/export-surface-diff.ts +0 -26
- package/src/mcp/tools/file-outline.ts +0 -67
- package/src/mcp/tools/git-files.ts +0 -73
- package/src/mcp/tools/graft-diff.ts +0 -35
- package/src/mcp/tools/graft-edit.ts +0 -276
- package/src/mcp/tools/knowledge-map.ts +0 -34
- package/src/mcp/tools/map-collector.ts +0 -338
- package/src/mcp/tools/map.ts +0 -185
- package/src/mcp/tools/monitor-nudge.ts +0 -19
- package/src/mcp/tools/monitor-pause.ts +0 -18
- package/src/mcp/tools/monitor-resume.ts +0 -18
- package/src/mcp/tools/monitor-start.ts +0 -20
- package/src/mcp/tools/monitor-stop.ts +0 -18
- package/src/mcp/tools/precision-live.ts +0 -158
- package/src/mcp/tools/precision-match.ts +0 -54
- package/src/mcp/tools/precision-paths.ts +0 -59
- package/src/mcp/tools/precision-query.ts +0 -127
- package/src/mcp/tools/precision-show.ts +0 -86
- package/src/mcp/tools/precision-visibility.ts +0 -44
- package/src/mcp/tools/precision-warp.ts +0 -101
- package/src/mcp/tools/precision.ts +0 -21
- package/src/mcp/tools/read-range.ts +0 -28
- package/src/mcp/tools/refactor-difficulty.ts +0 -42
- package/src/mcp/tools/run-capture.ts +0 -149
- package/src/mcp/tools/safe-read.ts +0 -148
- package/src/mcp/tools/since.ts +0 -53
- package/src/mcp/tools/state.ts +0 -39
- package/src/mcp/tools/stats.ts +0 -24
- package/src/mcp/tools/structural-blame.ts +0 -55
- package/src/mcp/tools/structural-churn.ts +0 -28
- package/src/mcp/tools/structural-log.ts +0 -41
- package/src/mcp/tools/structural-review.ts +0 -63
- package/src/mcp/tools/workspace-authorizations.ts +0 -14
- package/src/mcp/tools/workspace-authorize.ts +0 -20
- package/src/mcp/tools/workspace-bind.ts +0 -25
- package/src/mcp/tools/workspace-rebind.ts +0 -25
- package/src/mcp/tools/workspace-revoke.ts +0 -18
- package/src/mcp/tools/workspace-status.ts +0 -12
- package/src/mcp/warp-pool.ts +0 -36
- package/src/mcp/workspace-read-observation-model.ts +0 -48
- package/src/mcp/workspace-read-observation.ts +0 -103
- package/src/mcp/workspace-router-capability.ts +0 -32
- package/src/mcp/workspace-router-history.ts +0 -233
- package/src/mcp/workspace-router-model.ts +0 -131
- package/src/mcp/workspace-router-resolution.ts +0 -71
- package/src/mcp/workspace-router-runtime.ts +0 -246
- package/src/mcp/workspace-router.ts +0 -688
- package/src/metrics/logger.ts +0 -40
- package/src/metrics/types.ts +0 -40
- package/src/operations/adaptive-projection.ts +0 -54
- package/src/operations/agent-handoff.ts +0 -59
- package/src/operations/cached-file.ts +0 -40
- package/src/operations/capture-range.ts +0 -64
- package/src/operations/conversation-primer.ts +0 -82
- package/src/operations/cross-session-resume.ts +0 -104
- package/src/operations/deterministic-replay.ts +0 -143
- package/src/operations/diff-identity.ts +0 -127
- package/src/operations/export-surface-diff.ts +0 -355
- package/src/operations/file-outline.ts +0 -48
- package/src/operations/footprint-parallelism.ts +0 -98
- package/src/operations/graft-diff.ts +0 -169
- package/src/operations/horizon-of-readability.ts +0 -60
- package/src/operations/import-reference-impact.ts +0 -143
- package/src/operations/knowledge-map.ts +0 -96
- package/src/operations/observation-cache.ts +0 -165
- package/src/operations/projection-safety.ts +0 -111
- package/src/operations/read-range.ts +0 -64
- package/src/operations/repo-workspace.ts +0 -339
- package/src/operations/result-dto.ts +0 -23
- package/src/operations/safe-read.ts +0 -118
- package/src/operations/semantic-drift.ts +0 -70
- package/src/operations/session-filtration.ts +0 -76
- package/src/operations/session-replay.ts +0 -73
- package/src/operations/sludge-detector.ts +0 -356
- package/src/operations/state.ts +0 -66
- package/src/operations/structural-blame.ts +0 -197
- package/src/operations/structural-review.ts +0 -317
- package/src/operations/structured-buffer-compare.ts +0 -429
- package/src/operations/structured-buffer-model.ts +0 -456
- package/src/operations/structured-buffer-query.ts +0 -794
- package/src/operations/structured-buffer.ts +0 -181
- package/src/operations/teaching-hints.ts +0 -52
- package/src/parser/diff.ts +0 -320
- package/src/parser/lang.ts +0 -71
- package/src/parser/markdown.ts +0 -197
- package/src/parser/outline.ts +0 -316
- package/src/parser/runtime.ts +0 -71
- package/src/parser/types.ts +0 -75
- package/src/policy/evaluate.ts +0 -178
- package/src/policy/graftignore.ts +0 -6
- package/src/policy/types.ts +0 -87
- package/src/ports/codec.ts +0 -13
- package/src/ports/filesystem.ts +0 -18
- package/src/ports/git.ts +0 -16
- package/src/ports/guards.ts +0 -68
- package/src/ports/paths.ts +0 -22
- package/src/ports/process-runner.ts +0 -22
- package/src/release/security-gate.ts +0 -102
- package/src/session/tracker.ts +0 -145
- package/src/session/types.ts +0 -23
- package/src/version.ts +0 -3
- package/src/warp/ast-emitter.ts +0 -133
- package/src/warp/ast-import-resolver.ts +0 -333
- package/src/warp/commit-meta.ts +0 -19
- package/src/warp/context.ts +0 -48
- package/src/warp/dead-symbols.ts +0 -174
- package/src/warp/drift-sentinel.ts +0 -101
- package/src/warp/index-head.ts +0 -348
- package/src/warp/observers.ts +0 -101
- package/src/warp/open.ts +0 -67
- package/src/warp/outline-diff-trailer.ts +0 -100
- package/src/warp/plumbing.d.ts +0 -24
- package/src/warp/refactor-difficulty.ts +0 -257
- package/src/warp/references.ts +0 -77
- package/src/warp/stale-docs.ts +0 -210
- package/src/warp/structural-drift-detection.ts +0 -97
- package/src/warp/structural-queries.ts +0 -258
- package/src/warp/symbol-timeline.ts +0 -209
- package/src/warp/traverse-hydrate.ts +0 -61
- package/src/warp/warp-reference-count.ts +0 -47
- package/src/warp/warp-structural-blame.ts +0 -65
- package/src/warp/warp-structural-churn.ts +0 -309
- package/src/warp/warp-structural-log.ts +0 -149
- package/src/warp/writer-id.ts +0 -30
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import type { RuntimeCausalContext } from "../runtime-causal-context.js";
|
|
2
|
-
import type { WorkspaceStatus } from "../workspace-router.js";
|
|
3
|
-
import { cloneCapabilityProfile } from "./authz-storage.js";
|
|
4
|
-
import type {
|
|
5
|
-
DaemonSessionView,
|
|
6
|
-
RegisteredTransport,
|
|
7
|
-
SharedAttachSource,
|
|
8
|
-
} from "./types.js";
|
|
9
|
-
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
// Session view projection
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
|
|
14
|
-
export function toDaemonSessionView(
|
|
15
|
-
session: RegisteredTransport,
|
|
16
|
-
readWorkspaceStatus: (s: RegisteredTransport) => WorkspaceStatus,
|
|
17
|
-
readRuntimeCausalContext: (s: RegisteredTransport) => RuntimeCausalContext | null,
|
|
18
|
-
): DaemonSessionView {
|
|
19
|
-
const status = readWorkspaceStatus(session);
|
|
20
|
-
const causalContext = readRuntimeCausalContext(session);
|
|
21
|
-
return {
|
|
22
|
-
sessionId: session.sessionId,
|
|
23
|
-
sessionMode: "daemon",
|
|
24
|
-
bindState: status.bindState,
|
|
25
|
-
repoId: status.repoId,
|
|
26
|
-
worktreeId: status.worktreeId,
|
|
27
|
-
worktreeRoot: status.worktreeRoot,
|
|
28
|
-
causalSessionId: causalContext?.causalSessionId ?? null,
|
|
29
|
-
checkoutEpochId: causalContext?.checkoutEpochId ?? null,
|
|
30
|
-
capabilityProfile: status.capabilityProfile === null ? null : cloneCapabilityProfile(status.capabilityProfile),
|
|
31
|
-
startedAt: session.startedAt,
|
|
32
|
-
lastActivityAt: session.lastActivityAt,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// ---------------------------------------------------------------------------
|
|
37
|
-
// Workspace status & causal context safe readers
|
|
38
|
-
// ---------------------------------------------------------------------------
|
|
39
|
-
|
|
40
|
-
export function readWorkspaceStatus(session: RegisteredTransport): WorkspaceStatus {
|
|
41
|
-
try {
|
|
42
|
-
return session.getWorkspaceStatus();
|
|
43
|
-
} catch {
|
|
44
|
-
return {
|
|
45
|
-
sessionMode: "daemon",
|
|
46
|
-
bindState: "unbound",
|
|
47
|
-
repoId: null,
|
|
48
|
-
worktreeId: null,
|
|
49
|
-
worktreeRoot: null,
|
|
50
|
-
gitCommonDir: null,
|
|
51
|
-
graftDir: null,
|
|
52
|
-
capabilityProfile: null,
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export function readRuntimeCausalContext(session: RegisteredTransport): RuntimeCausalContext | null {
|
|
58
|
-
try {
|
|
59
|
-
return session.getRuntimeCausalContext();
|
|
60
|
-
} catch {
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// ---------------------------------------------------------------------------
|
|
66
|
-
// Shared attach resolution
|
|
67
|
-
// ---------------------------------------------------------------------------
|
|
68
|
-
|
|
69
|
-
export function resolveSharedAttachSource(
|
|
70
|
-
sessions: ReadonlyMap<string, RegisteredTransport>,
|
|
71
|
-
input: {
|
|
72
|
-
readonly sessionId: string;
|
|
73
|
-
readonly repoId: string;
|
|
74
|
-
readonly worktreeId: string;
|
|
75
|
-
},
|
|
76
|
-
): SharedAttachSource | null {
|
|
77
|
-
const candidates = [...sessions.values()]
|
|
78
|
-
.filter((session) => session.sessionId !== input.sessionId)
|
|
79
|
-
.flatMap((session) => {
|
|
80
|
-
const status = readWorkspaceStatus(session);
|
|
81
|
-
if (
|
|
82
|
-
status.bindState !== "bound" ||
|
|
83
|
-
status.repoId !== input.repoId ||
|
|
84
|
-
status.worktreeId !== input.worktreeId
|
|
85
|
-
) {
|
|
86
|
-
return [];
|
|
87
|
-
}
|
|
88
|
-
const causalContext = readRuntimeCausalContext(session);
|
|
89
|
-
if (causalContext === null) {
|
|
90
|
-
return [];
|
|
91
|
-
}
|
|
92
|
-
return [{
|
|
93
|
-
sourceSessionId: session.sessionId,
|
|
94
|
-
causalSessionId: causalContext.causalSessionId,
|
|
95
|
-
strandId: causalContext.strandId,
|
|
96
|
-
lastActivityAt: session.lastActivityAt,
|
|
97
|
-
}];
|
|
98
|
-
})
|
|
99
|
-
.sort((left, right) => right.lastActivityAt.localeCompare(left.lastActivityAt));
|
|
100
|
-
|
|
101
|
-
if (candidates.length !== 1) {
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const [source] = candidates;
|
|
106
|
-
if (source === undefined) {
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return {
|
|
111
|
-
sourceSessionId: source.sourceSessionId,
|
|
112
|
-
causalSessionId: source.causalSessionId,
|
|
113
|
-
strandId: source.strandId,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import type { DaemonSchedulerCounts } from "../daemon-job-scheduler.js";
|
|
2
|
-
import type { DaemonWorkerCounts } from "../daemon-worker-pool.js";
|
|
3
|
-
import type { WorkspaceCapabilityProfile } from "../workspace-router.js";
|
|
4
|
-
import { cloneCapabilityProfile } from "./authz-storage.js";
|
|
5
|
-
import type {
|
|
6
|
-
AuthorizedWorkspaceRecord,
|
|
7
|
-
AuthorizedWorkspaceView,
|
|
8
|
-
DaemonMonitorCounts,
|
|
9
|
-
DaemonRuntimeDescriptor,
|
|
10
|
-
DaemonSessionView,
|
|
11
|
-
DaemonStatusView,
|
|
12
|
-
} from "./types.js";
|
|
13
|
-
|
|
14
|
-
// ---------------------------------------------------------------------------
|
|
15
|
-
// Zero-value defaults
|
|
16
|
-
// ---------------------------------------------------------------------------
|
|
17
|
-
|
|
18
|
-
export const ZERO_MONITOR_COUNTS: DaemonMonitorCounts = Object.freeze({
|
|
19
|
-
totalMonitors: 0,
|
|
20
|
-
runningMonitors: 0,
|
|
21
|
-
pausedMonitors: 0,
|
|
22
|
-
stoppedMonitors: 0,
|
|
23
|
-
failingMonitors: 0,
|
|
24
|
-
backlogMonitors: 0,
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
// ---------------------------------------------------------------------------
|
|
28
|
-
// Status view assembly
|
|
29
|
-
// ---------------------------------------------------------------------------
|
|
30
|
-
|
|
31
|
-
export function buildStatusView(
|
|
32
|
-
runtime: DaemonRuntimeDescriptor,
|
|
33
|
-
sessions: readonly DaemonSessionView[],
|
|
34
|
-
authorizedWorkspaces: ReadonlyMap<string, AuthorizedWorkspaceRecord>,
|
|
35
|
-
defaultCapabilityProfile: WorkspaceCapabilityProfile,
|
|
36
|
-
monitorCounts: DaemonMonitorCounts,
|
|
37
|
-
schedulerCounts: DaemonSchedulerCounts,
|
|
38
|
-
workerCounts: DaemonWorkerCounts,
|
|
39
|
-
): DaemonStatusView {
|
|
40
|
-
const boundSessions = sessions.filter((session) => session.bindState === "bound").length;
|
|
41
|
-
return {
|
|
42
|
-
ok: true,
|
|
43
|
-
sessionMode: "daemon",
|
|
44
|
-
activeSessions: sessions.length,
|
|
45
|
-
boundSessions,
|
|
46
|
-
unboundSessions: sessions.length - boundSessions,
|
|
47
|
-
authorizedWorkspaces: authorizedWorkspaces.size,
|
|
48
|
-
authorizedRepos: new Set([...authorizedWorkspaces.values()].map((record) => record.repoId)).size,
|
|
49
|
-
workspaceBindRequiresAuthorization: true,
|
|
50
|
-
defaultCapabilityProfile: cloneCapabilityProfile(defaultCapabilityProfile),
|
|
51
|
-
totalMonitors: monitorCounts.totalMonitors,
|
|
52
|
-
runningMonitors: monitorCounts.runningMonitors,
|
|
53
|
-
pausedMonitors: monitorCounts.pausedMonitors,
|
|
54
|
-
stoppedMonitors: monitorCounts.stoppedMonitors,
|
|
55
|
-
failingMonitors: monitorCounts.failingMonitors,
|
|
56
|
-
backlogMonitors: monitorCounts.backlogMonitors,
|
|
57
|
-
scheduler: schedulerCounts,
|
|
58
|
-
workers: workerCounts,
|
|
59
|
-
...runtime,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// ---------------------------------------------------------------------------
|
|
64
|
-
// Authorized workspace view projection
|
|
65
|
-
// ---------------------------------------------------------------------------
|
|
66
|
-
|
|
67
|
-
export function toAuthorizedWorkspaceView(
|
|
68
|
-
record: AuthorizedWorkspaceRecord,
|
|
69
|
-
activeSessionCount: number,
|
|
70
|
-
): AuthorizedWorkspaceView {
|
|
71
|
-
return {
|
|
72
|
-
...record,
|
|
73
|
-
capabilityProfile: cloneCapabilityProfile(record.capabilityProfile),
|
|
74
|
-
activeSessions: activeSessionCount,
|
|
75
|
-
};
|
|
76
|
-
}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import type { DaemonSchedulerCounts } from "../daemon-job-scheduler.js";
|
|
2
|
-
import type { DaemonWorkerCounts } from "../daemon-worker-pool.js";
|
|
3
|
-
import type { RuntimeCausalContext } from "../runtime-causal-context.js";
|
|
4
|
-
import type {
|
|
5
|
-
WorkspaceBindRequest,
|
|
6
|
-
WorkspaceCapabilityProfile,
|
|
7
|
-
WorkspaceStatus,
|
|
8
|
-
} from "../workspace-router.js";
|
|
9
|
-
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
// Internal: session tracking
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
|
|
14
|
-
export interface RegisteredTransport {
|
|
15
|
-
readonly sessionId: string;
|
|
16
|
-
readonly startedAt: string;
|
|
17
|
-
readonly getWorkspaceStatus: () => WorkspaceStatus;
|
|
18
|
-
readonly getRuntimeCausalContext: () => RuntimeCausalContext | null;
|
|
19
|
-
lastActivityAt: string;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// ---------------------------------------------------------------------------
|
|
23
|
-
// Authorization types
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
|
|
26
|
-
export interface AuthorizedWorkspaceRecord {
|
|
27
|
-
readonly repoId: string;
|
|
28
|
-
readonly worktreeId: string;
|
|
29
|
-
readonly worktreeRoot: string;
|
|
30
|
-
readonly gitCommonDir: string;
|
|
31
|
-
readonly capabilityProfile: WorkspaceCapabilityProfile;
|
|
32
|
-
readonly authorizedAt: string;
|
|
33
|
-
readonly lastBoundAt: string | null;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface AuthorizedWorkspaceView extends AuthorizedWorkspaceRecord {
|
|
37
|
-
readonly activeSessions: number;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface WorkspaceAuthorizeRequest extends WorkspaceBindRequest {
|
|
41
|
-
readonly runCapture?: boolean | undefined;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export interface WorkspaceAuthorizeResult {
|
|
45
|
-
readonly ok: boolean;
|
|
46
|
-
readonly changed: boolean;
|
|
47
|
-
readonly authorization?: AuthorizedWorkspaceView;
|
|
48
|
-
readonly errorCode?: string;
|
|
49
|
-
readonly error?: string;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export interface WorkspaceRevokeResult {
|
|
53
|
-
readonly ok: boolean;
|
|
54
|
-
readonly revoked: boolean;
|
|
55
|
-
readonly repoId?: string | null;
|
|
56
|
-
readonly worktreeId?: string | null;
|
|
57
|
-
readonly worktreeRoot?: string | null;
|
|
58
|
-
readonly activeSessions?: number;
|
|
59
|
-
readonly errorCode?: string;
|
|
60
|
-
readonly error?: string;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// ---------------------------------------------------------------------------
|
|
64
|
-
// Session view
|
|
65
|
-
// ---------------------------------------------------------------------------
|
|
66
|
-
|
|
67
|
-
export interface DaemonSessionView {
|
|
68
|
-
readonly sessionId: string;
|
|
69
|
-
readonly sessionMode: "daemon";
|
|
70
|
-
readonly bindState: WorkspaceStatus["bindState"];
|
|
71
|
-
readonly repoId: string | null;
|
|
72
|
-
readonly worktreeId: string | null;
|
|
73
|
-
readonly worktreeRoot: string | null;
|
|
74
|
-
readonly causalSessionId: string | null;
|
|
75
|
-
readonly checkoutEpochId: string | null;
|
|
76
|
-
readonly capabilityProfile: WorkspaceCapabilityProfile | null;
|
|
77
|
-
readonly startedAt: string;
|
|
78
|
-
readonly lastActivityAt: string;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// ---------------------------------------------------------------------------
|
|
82
|
-
// Daemon runtime & status projection
|
|
83
|
-
// ---------------------------------------------------------------------------
|
|
84
|
-
|
|
85
|
-
export interface DaemonRuntimeDescriptor {
|
|
86
|
-
readonly transport: "unix_socket" | "named_pipe";
|
|
87
|
-
readonly sameUserOnly: true;
|
|
88
|
-
readonly socketPath: string;
|
|
89
|
-
readonly mcpPath: string;
|
|
90
|
-
readonly healthPath: string;
|
|
91
|
-
readonly activeWarpRepos: number;
|
|
92
|
-
readonly startedAt: string;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export interface SharedAttachSource {
|
|
96
|
-
readonly sourceSessionId: string;
|
|
97
|
-
readonly causalSessionId: string;
|
|
98
|
-
readonly strandId: string;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export interface DaemonMonitorCounts {
|
|
102
|
-
readonly totalMonitors: number;
|
|
103
|
-
readonly runningMonitors: number;
|
|
104
|
-
readonly pausedMonitors: number;
|
|
105
|
-
readonly stoppedMonitors: number;
|
|
106
|
-
readonly failingMonitors: number;
|
|
107
|
-
readonly backlogMonitors: number;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export interface DaemonStatusView extends DaemonRuntimeDescriptor {
|
|
111
|
-
readonly ok: true;
|
|
112
|
-
readonly sessionMode: "daemon";
|
|
113
|
-
readonly activeSessions: number;
|
|
114
|
-
readonly boundSessions: number;
|
|
115
|
-
readonly unboundSessions: number;
|
|
116
|
-
readonly authorizedWorkspaces: number;
|
|
117
|
-
readonly authorizedRepos: number;
|
|
118
|
-
readonly workspaceBindRequiresAuthorization: true;
|
|
119
|
-
readonly defaultCapabilityProfile: WorkspaceCapabilityProfile;
|
|
120
|
-
readonly totalMonitors: number;
|
|
121
|
-
readonly runningMonitors: number;
|
|
122
|
-
readonly pausedMonitors: number;
|
|
123
|
-
readonly stoppedMonitors: number;
|
|
124
|
-
readonly failingMonitors: number;
|
|
125
|
-
readonly backlogMonitors: number;
|
|
126
|
-
readonly scheduler: DaemonSchedulerCounts;
|
|
127
|
-
readonly workers: DaemonWorkerCounts;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// ---------------------------------------------------------------------------
|
|
131
|
-
// Control plane constructor options
|
|
132
|
-
// ---------------------------------------------------------------------------
|
|
133
|
-
|
|
134
|
-
export interface DaemonControlPlaneOptions {
|
|
135
|
-
readonly fs: FileSystem;
|
|
136
|
-
readonly codec: JsonCodec;
|
|
137
|
-
readonly git: GitClient;
|
|
138
|
-
readonly graftDir: string;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Re-import port types so consumers don't need to reach into ports/
|
|
142
|
-
import type { FileSystem } from "../../ports/filesystem.js";
|
|
143
|
-
import type { JsonCodec } from "../../ports/codec.js";
|
|
144
|
-
import type { GitClient } from "../../ports/git.js";
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import * as crypto from "node:crypto";
|
|
2
|
-
import * as fs from "node:fs/promises";
|
|
3
|
-
import * as http from "node:http";
|
|
4
|
-
import * as net from "node:net";
|
|
5
|
-
import * as os from "node:os";
|
|
6
|
-
import * as path from "node:path";
|
|
7
|
-
|
|
8
|
-
const DIRECTORY_MODE = 0o700;
|
|
9
|
-
const SOCKET_MODE = 0o600;
|
|
10
|
-
|
|
11
|
-
export function isNamedPipePath(socketPath: string): boolean {
|
|
12
|
-
return process.platform === "win32" && socketPath.startsWith("\\\\.\\pipe\\");
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function defaultDaemonRoot(): string {
|
|
16
|
-
return path.join(os.homedir(), ".graft", "daemon");
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function defaultSocketPath(graftDir: string): string {
|
|
20
|
-
if (process.platform === "win32") {
|
|
21
|
-
const digest = crypto.createHash("sha256").update(os.homedir()).digest("hex").slice(0, 12);
|
|
22
|
-
return `\\\\.\\pipe\\graft-daemon-${digest}`;
|
|
23
|
-
}
|
|
24
|
-
return path.join(graftDir, "mcp.sock");
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function resolveSocketPath(socketPath: string | undefined, graftDir: string): string {
|
|
28
|
-
if (socketPath === undefined) return defaultSocketPath(graftDir);
|
|
29
|
-
if (isNamedPipePath(socketPath)) return socketPath;
|
|
30
|
-
return path.resolve(socketPath);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export async function ensurePrivateDirectory(dirPath: string): Promise<void> {
|
|
34
|
-
await fs.mkdir(dirPath, { recursive: true, mode: DIRECTORY_MODE });
|
|
35
|
-
if (process.platform !== "win32") {
|
|
36
|
-
await fs.chmod(dirPath, DIRECTORY_MODE).catch(() => {
|
|
37
|
-
return undefined;
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
async function socketHasActiveListener(socketPath: string): Promise<boolean> {
|
|
43
|
-
return new Promise<boolean>((resolve) => {
|
|
44
|
-
const socket = net.createConnection({ path: socketPath });
|
|
45
|
-
let settled = false;
|
|
46
|
-
|
|
47
|
-
const finish = (result: boolean): void => {
|
|
48
|
-
if (settled) return;
|
|
49
|
-
settled = true;
|
|
50
|
-
socket.destroy();
|
|
51
|
-
resolve(result);
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
socket.once("connect", () => {
|
|
55
|
-
finish(true);
|
|
56
|
-
});
|
|
57
|
-
socket.once("error", () => {
|
|
58
|
-
finish(false);
|
|
59
|
-
});
|
|
60
|
-
socket.setTimeout(200, () => {
|
|
61
|
-
finish(false);
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export async function prepareSocketPath(socketPath: string): Promise<void> {
|
|
67
|
-
if (isNamedPipePath(socketPath)) return;
|
|
68
|
-
await ensurePrivateDirectory(path.dirname(socketPath));
|
|
69
|
-
const existing = await fs.lstat(socketPath).catch((error: unknown) => {
|
|
70
|
-
if (error instanceof Error && "code" in error && error.code === "ENOENT") return null;
|
|
71
|
-
throw error;
|
|
72
|
-
});
|
|
73
|
-
if (existing === null) return;
|
|
74
|
-
if (!existing.isSocket()) {
|
|
75
|
-
throw new Error(`Refusing to overwrite non-socket path: ${socketPath}`);
|
|
76
|
-
}
|
|
77
|
-
if (await socketHasActiveListener(socketPath)) {
|
|
78
|
-
throw new Error(`A graft daemon is already listening on ${socketPath}`);
|
|
79
|
-
}
|
|
80
|
-
await fs.unlink(socketPath);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export async function tightenSocketPermissions(socketPath: string): Promise<void> {
|
|
84
|
-
if (process.platform === "win32" || isNamedPipePath(socketPath)) return;
|
|
85
|
-
await fs.chmod(socketPath, SOCKET_MODE).catch(() => {
|
|
86
|
-
return undefined;
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export async function closeHttpServer(server: http.Server): Promise<void> {
|
|
91
|
-
await new Promise<void>((resolve, reject) => {
|
|
92
|
-
server.close((error) => {
|
|
93
|
-
if (error) {
|
|
94
|
-
reject(error);
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
resolve();
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
}
|