@adhdev/daemon-core 0.9.82-rc.376 → 0.9.82-rc.378
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/commands/chat-commands-debug-bundle.d.ts +14 -0
- package/dist/commands/chat-commands-read.d.ts +7 -0
- package/dist/commands/chat-commands-scope.d.ts +39 -0
- package/dist/commands/chat-commands-shared.d.ts +33 -0
- package/dist/commands/chat-commands-write.d.ts +14 -0
- package/dist/commands/chat-commands.d.ts +9 -49
- package/dist/commands/router.d.ts +3 -470
- package/dist/index.js +3166 -3115
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3561 -3510
- package/dist/index.mjs.map +1 -1
- package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
- package/dist/mesh/mesh-event-classify.d.ts +5 -0
- package/dist/mesh/mesh-event-forwarding.d.ts +18 -0
- package/dist/mesh/mesh-events-coordinator.d.ts +4 -92
- package/dist/mesh/mesh-events-utils.d.ts +3 -0
- package/dist/mesh/mesh-ledger-reconciliation.d.ts +0 -1
- package/dist/mesh/mesh-node-identity.d.ts +289 -0
- package/dist/mesh/mesh-queue-assignment.d.ts +86 -0
- package/dist/mesh/mesh-refine-gates.d.ts +428 -0
- package/dist/mesh/mesh-runtime-store.d.ts +0 -3
- package/dist/providers/native-history/constants.d.ts +12 -0
- package/dist/runtime-defaults.d.ts +2 -0
- package/package.json +2 -2
- package/src/commands/chat-commands-debug-bundle.ts +398 -0
- package/src/commands/chat-commands-read.ts +2327 -0
- package/src/commands/chat-commands-scope.ts +54 -0
- package/src/commands/chat-commands-shared.ts +114 -0
- package/src/commands/chat-commands-write.ts +880 -0
- package/src/commands/chat-commands.ts +20 -3697
- package/src/commands/router.ts +59 -3631
- package/src/mesh/mesh-coordinator-config.ts +97 -0
- package/src/mesh/mesh-event-classify.ts +51 -0
- package/src/mesh/mesh-event-forwarding.ts +1502 -0
- package/src/mesh/mesh-events-coordinator.ts +30 -2993
- package/src/mesh/mesh-events-pending.ts +1 -10
- package/src/mesh/mesh-events-stale.ts +3 -14
- package/src/mesh/mesh-events-utils.ts +52 -14
- package/src/mesh/mesh-ledger-reconciliation.ts +0 -2
- package/src/mesh/mesh-node-identity.ts +1887 -0
- package/src/mesh/mesh-queue-assignment.ts +1457 -0
- package/src/mesh/mesh-refine-gates.ts +1652 -0
- package/src/mesh/mesh-runtime-store.ts +0 -37
- package/src/providers/cli-provider-instance.ts +40 -1
- package/src/providers/native-history/constants.ts +19 -0
- package/src/providers/native-history/dispatcher.ts +2 -3
- package/src/providers/spec/native-history-executor.ts +1 -9
- package/src/runtime-defaults.ts +39 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Commands — get_chat_debug_bundle: sanitize, summarize and store a
|
|
3
|
+
* diagnostic snapshot of the current read_chat / provider / session state.
|
|
4
|
+
*/
|
|
5
|
+
import type { CommandResult, CommandHelpers } from './handler.js';
|
|
6
|
+
interface DebugSanitizeOptions {
|
|
7
|
+
maxDepth?: number;
|
|
8
|
+
maxArrayLength?: number;
|
|
9
|
+
maxObjectKeys?: number;
|
|
10
|
+
maxStringLength?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function sanitizeDebugBundleValue(value: unknown, options?: DebugSanitizeOptions, depth?: number, keyHint?: string): unknown;
|
|
13
|
+
export declare function handleGetChatDebugBundle(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Commands — read side: handleReadChat, handleChatHistory and the
|
|
3
|
+
* native-history / source-resolution / normalization helpers they use.
|
|
4
|
+
*/
|
|
5
|
+
import type { CommandResult, CommandHelpers } from './handler.js';
|
|
6
|
+
export declare function handleChatHistory(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
7
|
+
export declare function handleReadChat(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Commands — read_chat node workspace scope guard.
|
|
3
|
+
*/
|
|
4
|
+
import type { CommandHelpers } from './handler.js';
|
|
5
|
+
/**
|
|
6
|
+
* read_chat node scope verdict. One physical daemon hosts a base node plus several
|
|
7
|
+
* worktree nodes; mesh_read_chat always dispatches read_chat with the requested
|
|
8
|
+
* node's workspace (`args.workspace`). When the resolved target session actually
|
|
9
|
+
* lives in a DIFFERENT worktree, returning its transcript — or worse, letting the
|
|
10
|
+
* native-history-by-workspace fallback splice sibling worktree turns into the
|
|
11
|
+
* reply — makes the coordinator believe one session received every worktree's
|
|
12
|
+
* work. This guard refuses a CONFIRMED cross-workspace read instead of mixing.
|
|
13
|
+
*
|
|
14
|
+
* Conservative by design (mirrors the WTCLAIM fix-B "unknown → allow" rule): only
|
|
15
|
+
* a session id that resolves to a known workspace which is unequal to a known
|
|
16
|
+
* intended workspace blocks. When either side is unknown — no targetSessionId, no
|
|
17
|
+
* args.workspace, an unregistered session, the coordinator self-session, or a
|
|
18
|
+
* plain dashboard read that never passes a node workspace — the read proceeds
|
|
19
|
+
* untouched, so base-node and same-daemon coordinator reads never regress.
|
|
20
|
+
*/
|
|
21
|
+
export declare function evaluateReadChatNodeWorkspaceScope(args: {
|
|
22
|
+
targetSessionId?: string;
|
|
23
|
+
intendedWorkspace?: string;
|
|
24
|
+
sessionWorkspace?: string;
|
|
25
|
+
}): {
|
|
26
|
+
scoped: false;
|
|
27
|
+
} | {
|
|
28
|
+
scoped: true;
|
|
29
|
+
intended: string;
|
|
30
|
+
actual: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the target session's ACTUAL workspace from the most authoritative source
|
|
34
|
+
* available on this daemon: the session registry record (stamped at register
|
|
35
|
+
* time), then the live CLI adapter's working directory, then the bound instance
|
|
36
|
+
* state. Returns '' when nothing knows the session's workspace — the caller treats
|
|
37
|
+
* that as "unknown" and does not block.
|
|
38
|
+
*/
|
|
39
|
+
export declare function resolveTargetSessionActualWorkspace(h: CommandHelpers, targetSessionId: string): string;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Commands — shared private helpers used by more than one handler group.
|
|
3
|
+
*
|
|
4
|
+
* These were module-local helpers/consts/interfaces in chat-commands.ts. They
|
|
5
|
+
* are exported here only so the split read/write/debug/scope sub-modules can
|
|
6
|
+
* import them; they are NOT part of the public chat-commands surface (except
|
|
7
|
+
* READ_CHAT_PROVIDER_EVAL_TIMEOUT_MS and buildSendInputSignature, which the
|
|
8
|
+
* chat-commands barrel re-exports).
|
|
9
|
+
*/
|
|
10
|
+
import type { CommandHelpers } from './handler.js';
|
|
11
|
+
import type { CliAdapter } from '../cli-adapter-types.js';
|
|
12
|
+
import { type InputEnvelope, type ProviderModule } from '../providers/contracts.js';
|
|
13
|
+
import type { ProviderInstance } from '../providers/provider-instance.js';
|
|
14
|
+
import type { ChatMessage } from '../types.js';
|
|
15
|
+
import type { SessionTransport } from '../shared-types.js';
|
|
16
|
+
export declare const READ_CHAT_PROVIDER_EVAL_TIMEOUT_MS = 25000;
|
|
17
|
+
export interface ApprovalSelectableInstance extends ProviderInstance {
|
|
18
|
+
recordApprovalSelection?(buttonText: string): void;
|
|
19
|
+
}
|
|
20
|
+
export interface RuntimeChatMessageMerger extends ProviderInstance {
|
|
21
|
+
mergeRuntimeChatMessages?(messages: ChatMessage[]): ChatMessage[];
|
|
22
|
+
recordAcknowledgedUserInput?(input: InputEnvelope | string): void;
|
|
23
|
+
}
|
|
24
|
+
export declare function getCurrentProviderType(h: CommandHelpers, fallback?: string): string;
|
|
25
|
+
export declare function getCurrentManagerKey(h: CommandHelpers): string;
|
|
26
|
+
export declare function getTargetedCliAdapter(h: CommandHelpers, args: any, providerType?: string): CliAdapter | null;
|
|
27
|
+
export declare function getTargetInstance(h: CommandHelpers, args: any): ApprovalSelectableInstance | null;
|
|
28
|
+
export declare function getTargetTransport(h: CommandHelpers, provider?: ProviderModule): SessionTransport | null;
|
|
29
|
+
export declare function isCliLikeTransport(transport: SessionTransport | null): boolean;
|
|
30
|
+
export declare function isExtensionTransport(transport: SessionTransport | null): boolean;
|
|
31
|
+
export declare function buildSendInputSignature(input: InputEnvelope): string;
|
|
32
|
+
export declare function parseMaybeJson(value: any): any;
|
|
33
|
+
export declare function getChatMessageSignature(message: ChatMessage | null | undefined): string;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Commands — write side: handleSendChat, handleListChats, handleNewChat,
|
|
3
|
+
* handleSwitchChat, handleSetMode, handleChangeModel, handleSetThoughtLevel,
|
|
4
|
+
* handleResolveAction and the send/mode/model helpers they use.
|
|
5
|
+
*/
|
|
6
|
+
import type { CommandResult, CommandHelpers } from './handler.js';
|
|
7
|
+
export declare function handleSendChat(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
8
|
+
export declare function handleListChats(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
9
|
+
export declare function handleNewChat(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
10
|
+
export declare function handleSwitchChat(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
11
|
+
export declare function handleSetMode(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
12
|
+
export declare function handleChangeModel(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
13
|
+
export declare function handleSetThoughtLevel(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
14
|
+
export declare function handleResolveAction(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
@@ -1,54 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Chat Commands — readChat, sendChat, listChats, newChat, switchChat,
|
|
3
3
|
* setMode, changeModel, setThoughtLevel, resolveAction, chatHistory
|
|
4
|
-
*/
|
|
5
|
-
import type { CommandResult, CommandHelpers } from './handler.js';
|
|
6
|
-
import { type InputEnvelope } from '../providers/contracts.js';
|
|
7
|
-
export declare const READ_CHAT_PROVIDER_EVAL_TIMEOUT_MS = 25000;
|
|
8
|
-
export declare function buildSendInputSignature(input: InputEnvelope): string;
|
|
9
|
-
/**
|
|
10
|
-
* read_chat node scope verdict. One physical daemon hosts a base node plus several
|
|
11
|
-
* worktree nodes; mesh_read_chat always dispatches read_chat with the requested
|
|
12
|
-
* node's workspace (`args.workspace`). When the resolved target session actually
|
|
13
|
-
* lives in a DIFFERENT worktree, returning its transcript — or worse, letting the
|
|
14
|
-
* native-history-by-workspace fallback splice sibling worktree turns into the
|
|
15
|
-
* reply — makes the coordinator believe one session received every worktree's
|
|
16
|
-
* work. This guard refuses a CONFIRMED cross-workspace read instead of mixing.
|
|
17
4
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* plain dashboard read that never passes a node workspace — the read proceeds
|
|
23
|
-
* untouched, so base-node and same-daemon coordinator reads never regress.
|
|
5
|
+
* This module is a re-export barrel. The implementation was split into focused
|
|
6
|
+
* sub-modules (chat-commands-shared / -scope / -debug-bundle / -read / -write)
|
|
7
|
+
* as a pure move; the public export surface here is unchanged. handler.ts does
|
|
8
|
+
* `import * as Chat from './chat-commands.js'` and keeps working unchanged.
|
|
24
9
|
*/
|
|
25
|
-
export
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
scoped: false;
|
|
31
|
-
} | {
|
|
32
|
-
scoped: true;
|
|
33
|
-
intended: string;
|
|
34
|
-
actual: string;
|
|
35
|
-
};
|
|
36
|
-
interface DebugSanitizeOptions {
|
|
37
|
-
maxDepth?: number;
|
|
38
|
-
maxArrayLength?: number;
|
|
39
|
-
maxObjectKeys?: number;
|
|
40
|
-
maxStringLength?: number;
|
|
41
|
-
}
|
|
42
|
-
export declare function sanitizeDebugBundleValue(value: unknown, options?: DebugSanitizeOptions, depth?: number, keyHint?: string): unknown;
|
|
43
|
-
export declare function handleGetChatDebugBundle(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
44
|
-
export declare function handleChatHistory(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
45
|
-
export declare function handleReadChat(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
46
|
-
export declare function handleSendChat(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
47
|
-
export declare function handleListChats(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
48
|
-
export declare function handleNewChat(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
49
|
-
export declare function handleSwitchChat(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
50
|
-
export declare function handleSetMode(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
51
|
-
export declare function handleChangeModel(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
52
|
-
export declare function handleSetThoughtLevel(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
53
|
-
export declare function handleResolveAction(h: CommandHelpers, args: any): Promise<CommandResult>;
|
|
54
|
-
export {};
|
|
10
|
+
export { READ_CHAT_PROVIDER_EVAL_TIMEOUT_MS, buildSendInputSignature } from './chat-commands-shared.js';
|
|
11
|
+
export { evaluateReadChatNodeWorkspaceScope } from './chat-commands-scope.js';
|
|
12
|
+
export { sanitizeDebugBundleValue, handleGetChatDebugBundle } from './chat-commands-debug-bundle.js';
|
|
13
|
+
export { handleChatHistory, handleReadChat } from './chat-commands-read.js';
|
|
14
|
+
export { handleSendChat, handleListChats, handleNewChat, handleSwitchChat, handleSetMode, handleChangeModel, handleSetThoughtLevel, handleResolveAction, } from './chat-commands-write.js';
|
|
@@ -14,476 +14,9 @@ import { DaemonCliManager } from './cli-manager.js';
|
|
|
14
14
|
import type { ProviderLoader } from '../providers/provider-loader.js';
|
|
15
15
|
import type { ProviderInstanceManager } from '../providers/provider-instance-manager.js';
|
|
16
16
|
import { SessionRegistry } from '../sessions/registry.js';
|
|
17
|
-
|
|
18
|
-
export
|
|
19
|
-
|
|
20
|
-
* Normalize a providerRoles array (RepoMeshNodePolicy.providerRoles) from raw
|
|
21
|
-
* tool args. Each entry binds a providerType to an optional `maxParallel` cap.
|
|
22
|
-
* Entries without a usable providerType are dropped; the last entry wins on
|
|
23
|
-
* duplicate providerType. Returns [] when no valid entries — callers then omit
|
|
24
|
-
* the field entirely (full backward compat). Routing is governed by required_tags;
|
|
25
|
-
* any legacy `role` field on the input is ignored.
|
|
26
|
-
*/
|
|
27
|
-
export declare function normalizeProviderRoles(value: unknown): Array<{
|
|
28
|
-
providerType: string;
|
|
29
|
-
maxParallel?: number;
|
|
30
|
-
}>;
|
|
31
|
-
export declare function readObjectRecord(value: unknown): Record<string, any>;
|
|
32
|
-
export declare function readStringValue(...values: unknown[]): string | undefined;
|
|
33
|
-
export declare function readBooleanValue(...values: unknown[]): boolean | undefined;
|
|
34
|
-
export declare function summarizeRepoMeshStatusDebug(status: any): Record<string, unknown>;
|
|
35
|
-
export declare function logRepoMeshStatusDebug(event: string, fields: Record<string, unknown>): void;
|
|
36
|
-
export declare function buildMeshNodeDisplayLabel(node: Record<string, unknown>, nodeId: string, providerPriority: string[]): string;
|
|
37
|
-
export declare function readMeshNodeMachineId(node: Record<string, unknown>): string | undefined;
|
|
38
|
-
export declare function readMeshNodeHostname(node: Record<string, unknown>): string | undefined;
|
|
39
|
-
export declare function buildMeshNodeMachineIdentity(node: Record<string, unknown>, opts: {
|
|
40
|
-
localMachineId?: string;
|
|
41
|
-
localDaemonId?: string;
|
|
42
|
-
coordinatorHostname?: string;
|
|
43
|
-
isSelfNode?: boolean;
|
|
44
|
-
}): Record<string, unknown>;
|
|
45
|
-
export declare function buildInlineMeshTransitGitStatus(node: any): Record<string, unknown> | undefined;
|
|
46
|
-
export declare function buildLivePeerGitConnection(connection: Record<string, unknown>, timestamp?: string): Record<string, unknown>;
|
|
47
|
-
export declare function recordInlineMeshDirectGitTruth(node: any, git: Record<string, unknown>, source: 'selected_coordinator_local_git' | 'selected_coordinator_mesh_p2p_git'): {
|
|
48
|
-
reporterPlatform: string | null;
|
|
49
|
-
reporterArch: string | null;
|
|
50
|
-
};
|
|
51
|
-
/**
|
|
52
|
-
* Persist the live self-reported platform/arch onto the local meshes.json node
|
|
53
|
-
* record so capability-tag os=/arch= self-heals across coordinator restarts.
|
|
54
|
-
*
|
|
55
|
-
* The in-memory stamp done by recordInlineMeshDirectGitTruth lives on the
|
|
56
|
-
* mesh_status assembly object and is discarded after the response; only a
|
|
57
|
-
* `local_config` mesh has a backing meshes.json node to write through to. Inline
|
|
58
|
-
* cache/bootstrap meshes have no local node to update, so we no-op for them.
|
|
59
|
-
* Fire-and-forget (same pattern as the worktreeBootstrap writer) — a persistence
|
|
60
|
-
* failure must never block the status response.
|
|
61
|
-
*/
|
|
62
|
-
export declare function persistNodeReporterPlatform(meshSource: 'inline_cache' | 'inline_bootstrap' | 'local_config', mesh: any, nodeId: string | undefined, reporter: {
|
|
63
|
-
reporterPlatform: string | null;
|
|
64
|
-
reporterArch: string | null;
|
|
65
|
-
}): void;
|
|
66
|
-
export declare function deriveMeshNodeHealthFromGit(git: Record<string, unknown> | null | undefined): 'online' | 'dirty' | 'degraded';
|
|
67
|
-
export declare function applyInlineMeshBranchConvergence(mesh: any, node: any, status: Record<string, unknown>): void;
|
|
68
|
-
export declare function summarizeInlineMeshBranchConvergence(nodes: Array<Record<string, unknown>>): Record<string, unknown>;
|
|
69
|
-
/**
|
|
70
|
-
* Resolve the owning-node attribution for a mesh node record so a coordinator can
|
|
71
|
-
* stamp the TRUE owner onto a synthetic session entry instead of letting the
|
|
72
|
-
* dashboard fall back to the coordinator's own daemonId. Returns whichever of the
|
|
73
|
-
* owning node's `daemonId` / display machine name could be read from the node's
|
|
74
|
-
* (possibly multi-serialization-path) shape; both may be undefined for a node that
|
|
75
|
-
* never carried machine identity.
|
|
76
|
-
*/
|
|
77
|
-
export declare function resolveMeshNodeAttribution(node: unknown): {
|
|
78
|
-
daemonId?: string;
|
|
79
|
-
machineName?: string;
|
|
80
|
-
};
|
|
81
|
-
export declare function readCachedInlineMeshActiveSessionDetails(node: any): Array<Record<string, unknown>>;
|
|
82
|
-
/**
|
|
83
|
-
* Transient per-node marker the mesh_status render loop stamps onto a node
|
|
84
|
-
* `status` at the two sites that obtain git truth from a FRESH probe this call
|
|
85
|
-
* (a successful local `getGitRepoStatus`, or a successful P2P `git_status`
|
|
86
|
-
* round-trip). finalizeMeshNodeStatus consumes and deletes it. Held/standing
|
|
87
|
-
* truth (node.lastGit / cachedStatus / inline transit) is deliberately NOT
|
|
88
|
-
* stamped — its absence is exactly how the freshness marker tells "live" apart
|
|
89
|
-
* from "cached". Internal only; never serialized in the response.
|
|
90
|
-
*/
|
|
91
|
-
export declare const MESH_NODE_LIVE_TRUTH_MARKER = "__liveTruthProbed";
|
|
92
|
-
/**
|
|
93
|
-
* Build the additive per-node `dataFreshness` marker. This NEVER mutates any
|
|
94
|
-
* existing field — it only adds an explicit, machine-readable answer to the
|
|
95
|
-
* question the legacy fields blurred: is this node's data live (just probed),
|
|
96
|
-
* cached (held truth, maybe old), or absent because the peer was unreachable?
|
|
97
|
-
*
|
|
98
|
-
* The crucial separation: an UNREACHABLE peer (P2P probe failed / not connected)
|
|
99
|
-
* is no longer indistinguishable from an idle/EMPTY node. Both used to render as
|
|
100
|
-
* `health:'unknown'` with no sessions; now `dataFreshness.dataSource` and
|
|
101
|
-
* `reachable` tell them apart so a coordinator never reads a dead peer as "online
|
|
102
|
-
* but doing nothing".
|
|
103
|
-
*/
|
|
104
|
-
export declare function buildMeshNodeDataFreshness(args: {
|
|
105
|
-
status: Record<string, unknown>;
|
|
106
|
-
node?: any;
|
|
107
|
-
isSelfNode: boolean;
|
|
108
|
-
daemonId?: string;
|
|
109
|
-
/** True when this node was stamped with a fresh live git probe this call. */
|
|
110
|
-
liveTruthProbed: boolean;
|
|
111
|
-
/** True when direct-peer-truth accounting classified this node unavailable. */
|
|
112
|
-
directTruthUnavailable?: boolean;
|
|
113
|
-
now?: () => number;
|
|
114
|
-
}): Record<string, unknown>;
|
|
115
|
-
/**
|
|
116
|
-
* Canonical live-probe → freshness adapter. The coordinator-facing mesh_status
|
|
117
|
-
* (mcp-server `meshStatus`) builds each node entry from a SINGLE fresh git_status
|
|
118
|
-
* probe that either returns (live truth) or throws (peer unreachable). It used to
|
|
119
|
-
* hand-reconstruct the freshness INPUT inline — a synthetic `{ git, connection }`
|
|
120
|
-
* status plus the directTruthUnavailable/liveTruthProbed wiring — which is exactly
|
|
121
|
-
* how a field added to `buildMeshNodeDataFreshness`'s input contract ends up "wired
|
|
122
|
-
* on the daemon surface, null on the coordinator surface" (the rc.371
|
|
123
|
-
* null-everywhere regression). Routing every live-probe surface through this one
|
|
124
|
-
* adapter keeps the marker derivation canonical: there is a SINGLE place that turns
|
|
125
|
-
* a probe outcome into freshness args, so the two mesh_status surfaces cannot drift.
|
|
126
|
-
*
|
|
127
|
-
* `liveTruthProbed` true → the probe returned (live/self truth); false → it threw,
|
|
128
|
-
* so a configured peer is unreachable while an unconfigured node (no daemonId) falls
|
|
129
|
-
* through to the classifier's `unconfigured` branch.
|
|
130
|
-
*/
|
|
131
|
-
export declare function buildMeshNodeProbeFreshness(args: {
|
|
132
|
-
/** The git snapshot this probe stamped on the node entry (entry.git). */
|
|
133
|
-
git: unknown;
|
|
134
|
-
/** True when the fresh git_status probe RETURNED (live truth); false when it threw. */
|
|
135
|
-
liveTruthProbed: boolean;
|
|
136
|
-
isSelfNode: boolean;
|
|
137
|
-
/** The node's resolved daemonId; absent → unconfigured node. */
|
|
138
|
-
daemonId?: string;
|
|
139
|
-
/** The mesh node record, for held-git fallback when the probe did not return live. */
|
|
140
|
-
node?: any;
|
|
141
|
-
now?: () => number;
|
|
142
|
-
}): Record<string, unknown>;
|
|
143
|
-
export declare function finalizeMeshNodeStatus(args: {
|
|
144
|
-
status: Record<string, unknown>;
|
|
145
|
-
node: any;
|
|
146
|
-
daemonId?: string;
|
|
147
|
-
isSelfNode: boolean;
|
|
148
|
-
/** True when direct-peer-truth accounting classified this node unavailable. */
|
|
149
|
-
directTruthUnavailable?: boolean;
|
|
150
|
-
}): void;
|
|
151
|
-
export declare const MESH_DIRECT_PROBE_TIMEOUT_MS: number;
|
|
152
|
-
export declare const MESH_DIRECT_PROBE_RETRY_TIMEOUT_MS: number;
|
|
153
|
-
export declare const MESH_DIRECT_PROBE_CONNECT_TIMEOUT_MS: number;
|
|
154
|
-
/**
|
|
155
|
-
* De-duplicates and rate-limits per-peer git_status probes so a single mesh
|
|
156
|
-
* refresh — or a burst of refreshes from the dashboard auto-retry loop — cannot
|
|
157
|
-
* launch a storm of concurrent/back-to-back `refreshUpstream:true` commands to
|
|
158
|
-
* the same slow peer.
|
|
159
|
-
*
|
|
160
|
-
* Two gates, both keyed by `daemonId::workspace`:
|
|
161
|
-
* - In-flight dedup: a second probe for a key with a probe already running
|
|
162
|
-
* shares (awaits) the in-flight promise instead of issuing a second command.
|
|
163
|
-
* - Recently-probed reuse: a successful probe younger than `reuseMs` is reused
|
|
164
|
-
* verbatim instead of issuing a fresh probe. Failures are NOT cached (so a
|
|
165
|
-
* transient timeout doesn't pin a peer to "no truth" for the whole window).
|
|
166
|
-
*
|
|
167
|
-
* Lives on the router instance so the gate spans separate mesh_status calls,
|
|
168
|
-
* which is exactly where the refresh storm happens.
|
|
169
|
-
*/
|
|
170
|
-
export declare class MeshGitProbeCache {
|
|
171
|
-
private readonly reuseMs;
|
|
172
|
-
private readonly now;
|
|
173
|
-
private inflight;
|
|
174
|
-
private recent;
|
|
175
|
-
constructor(reuseMs: number, now?: () => number);
|
|
176
|
-
private key;
|
|
177
|
-
/**
|
|
178
|
-
* Run `probe` for this peer, but reuse a fresh recent result or an in-flight
|
|
179
|
-
* probe for the same key when one is available. `probe` is only invoked when
|
|
180
|
-
* neither gate is satisfied.
|
|
181
|
-
*/
|
|
182
|
-
probe(daemonId: string, workspace: string, probe: () => Promise<Record<string, unknown> | null>): Promise<Record<string, unknown> | null>;
|
|
183
|
-
}
|
|
184
|
-
export { awaitWithWarmupDeadline };
|
|
185
|
-
/**
|
|
186
|
-
* Probe a remote peer's git_status with a bounded retry budget, but only while
|
|
187
|
-
* the peer is reported `connected`. A single slow (often TURN-relayed) peer can
|
|
188
|
-
* exceed one probe window; retrying — with the connection re-checked before each
|
|
189
|
-
* attempt so we abandon a peer that dropped — recovers it without blocking the
|
|
190
|
-
* mesh forever. Shared by the bootstrap hydrate path and the per-node render
|
|
191
|
-
* path so both treat a connected-but-slow peer identically.
|
|
192
|
-
*
|
|
193
|
-
* Returns the git status on success, or null if every attempt failed/timed out
|
|
194
|
-
* (caller decides how to classify). `getConnection` is consulted before each
|
|
195
|
-
* attempt; a non-`connected` state short-circuits the retry loop (the very first
|
|
196
|
-
* attempt always runs so a missing connection getter still gets one try).
|
|
197
|
-
*/
|
|
198
|
-
export declare function probeRemoteMeshGitStatusWithRetry(args: {
|
|
199
|
-
dispatchMeshCommand?: (daemonId: string, cmd: string, args: Record<string, unknown>) => Promise<unknown>;
|
|
200
|
-
daemonId: string;
|
|
201
|
-
workspace: string;
|
|
202
|
-
timeoutMs: number;
|
|
203
|
-
/** Per-attempt timeout for retries (attempts > 0); defaults to timeoutMs. */
|
|
204
|
-
retryTimeoutMs?: number;
|
|
205
|
-
/** Cold-open warmup budget per attempt; defaults to MESH_DIRECT_PROBE_CONNECT_TIMEOUT_MS. */
|
|
206
|
-
connectTimeoutMs?: number;
|
|
207
|
-
getConnection?: (daemonId: string) => Record<string, unknown> | null;
|
|
208
|
-
onConnection?: (connection: Record<string, unknown>) => void;
|
|
209
|
-
}): Promise<Record<string, unknown> | null>;
|
|
210
|
-
export declare function hydrateInlineMeshDirectTruth(args: {
|
|
211
|
-
mesh: any;
|
|
212
|
-
meshSource: 'inline_cache' | 'inline_bootstrap' | 'local_config';
|
|
213
|
-
dispatchMeshCommand?: (daemonId: string, cmd: string, args: Record<string, unknown>) => Promise<unknown>;
|
|
214
|
-
getMeshPeerConnectionStatus?: (daemonId: string) => Record<string, unknown> | null;
|
|
215
|
-
statusInstanceId?: string;
|
|
216
|
-
localMachineId?: string;
|
|
217
|
-
probeRemotePeers: boolean;
|
|
218
|
-
probeCache?: MeshGitProbeCache;
|
|
219
|
-
}): Promise<{
|
|
220
|
-
directEvidenceCount: number;
|
|
221
|
-
localConfirmedCount: number;
|
|
222
|
-
peerAttemptedCount: number;
|
|
223
|
-
peerConfirmedCount: number;
|
|
224
|
-
standingEvidenceCount: number;
|
|
225
|
-
unavailableNodeIds: string[];
|
|
226
|
-
deadNodeIds: string[];
|
|
227
|
-
}>;
|
|
228
|
-
export declare function summarizeMeshSessionRecord(record: any): Record<string, unknown>;
|
|
229
|
-
export declare function readLiveMeshNodeWorkspace(args: {
|
|
230
|
-
meshId: string;
|
|
231
|
-
nodeId: string;
|
|
232
|
-
liveSessionRecords: any[];
|
|
233
|
-
allowCoordinatorSession?: boolean;
|
|
234
|
-
}): string;
|
|
235
|
-
export declare function collectLiveMeshSessionRecords(args: {
|
|
236
|
-
meshId: string;
|
|
237
|
-
node: any;
|
|
238
|
-
nodeId: string;
|
|
239
|
-
liveSessionRecords: any[];
|
|
240
|
-
allowCoordinatorSession?: boolean;
|
|
241
|
-
}): any[];
|
|
242
|
-
export declare function buildHistoricalMeshSessions(args: {
|
|
243
|
-
meshId: string;
|
|
244
|
-
nodes: any[];
|
|
245
|
-
liveSessionRecords: any[];
|
|
246
|
-
}): {
|
|
247
|
-
count: number;
|
|
248
|
-
sessions: Record<string, unknown>[];
|
|
249
|
-
instruction: string;
|
|
250
|
-
} | undefined;
|
|
251
|
-
export declare function applyCachedInlineMeshNodeStatus(status: Record<string, unknown>, node: any, options?: {
|
|
252
|
-
skipGit?: boolean;
|
|
253
|
-
skipError?: boolean;
|
|
254
|
-
skipHealth?: boolean;
|
|
255
|
-
}): boolean;
|
|
256
|
-
export declare function resolveProviderTypeFromPriority(args: {
|
|
257
|
-
nodeId: string;
|
|
258
|
-
providerPriority: string[];
|
|
259
|
-
providerLoader: ProviderLoader;
|
|
260
|
-
onStatusChange?: () => void;
|
|
261
|
-
}): Promise<{
|
|
262
|
-
providerType?: string;
|
|
263
|
-
error?: string;
|
|
264
|
-
}>;
|
|
265
|
-
export type MeshCoordinatorConfigFormat = 'claude_mcp_json' | 'hermes_config_yaml';
|
|
266
|
-
type MeshRefineStageStatus = 'passed' | 'failed' | 'skipped';
|
|
267
|
-
type MeshRefinePatchEquivalenceSummary = {
|
|
268
|
-
status: MeshRefineStageStatus;
|
|
269
|
-
equivalent: boolean;
|
|
270
|
-
baseHead: string;
|
|
271
|
-
branchHead: string;
|
|
272
|
-
mergeBase?: string;
|
|
273
|
-
mergedTree?: string;
|
|
274
|
-
expectedPatchId?: string;
|
|
275
|
-
actualPatchId?: string;
|
|
276
|
-
durationMs: number;
|
|
277
|
-
error?: string;
|
|
278
|
-
stdout?: string;
|
|
279
|
-
stderr?: string;
|
|
280
|
-
actionableHint?: MeshRefineSubmoduleConflictHint;
|
|
281
|
-
/**
|
|
282
|
-
* Set when a `merge-tree` submodule conflict was reclassified as a trivial
|
|
283
|
-
* gitlink fast-forward and the gate passed via a synthesized merge tree.
|
|
284
|
-
*/
|
|
285
|
-
gitlinkTrivialFastForward?: {
|
|
286
|
-
resolved: boolean;
|
|
287
|
-
gitlinks: Array<{
|
|
288
|
-
path: string;
|
|
289
|
-
baseCommit?: string;
|
|
290
|
-
branchCommit?: string;
|
|
291
|
-
fastForward: boolean;
|
|
292
|
-
}>;
|
|
293
|
-
reason?: string;
|
|
294
|
-
};
|
|
295
|
-
};
|
|
296
|
-
type MeshRefineEffectiveDiffSummary = {
|
|
297
|
-
status: MeshRefineStageStatus;
|
|
298
|
-
/** True when there is at least one root-tree change between base and branch (incl. gitlink bumps). */
|
|
299
|
-
hasEffectiveDiff: boolean;
|
|
300
|
-
baseHead: string;
|
|
301
|
-
branchHead: string;
|
|
302
|
-
/** Root-level paths that differ between base and branch (capped). */
|
|
303
|
-
changedPaths?: string[];
|
|
304
|
-
/** Submodule paths with uncommitted/divergent commits but NO committed gitlink bump in the root tree. */
|
|
305
|
-
submoduleHints?: Array<{
|
|
306
|
-
path: string;
|
|
307
|
-
reason: string;
|
|
308
|
-
}>;
|
|
309
|
-
durationMs: number;
|
|
310
|
-
error?: string;
|
|
311
|
-
stdout?: string;
|
|
312
|
-
stderr?: string;
|
|
313
|
-
};
|
|
314
|
-
type MeshRefineSubmoduleConflictHint = {
|
|
315
|
-
kind: 'submodule_conflict';
|
|
316
|
-
message: string;
|
|
317
|
-
conflicts: Array<{
|
|
318
|
-
path: string;
|
|
319
|
-
baseCommit?: string;
|
|
320
|
-
branchCommit?: string;
|
|
321
|
-
}>;
|
|
322
|
-
nextSteps: string[];
|
|
323
|
-
};
|
|
324
|
-
type MeshRefineAsyncJobStatus = 'accepted' | 'completed' | 'failed';
|
|
325
|
-
export type MeshRefineJobHandle = {
|
|
326
|
-
success: true;
|
|
327
|
-
async: true;
|
|
328
|
-
status: MeshRefineAsyncJobStatus;
|
|
329
|
-
jobId: string;
|
|
330
|
-
interactionId: string;
|
|
331
|
-
meshId: string;
|
|
332
|
-
nodeId: string;
|
|
333
|
-
targetNodeId: string;
|
|
334
|
-
targetDaemonId?: string;
|
|
335
|
-
workspace?: string;
|
|
336
|
-
startedAt: string;
|
|
337
|
-
completedAt?: string;
|
|
338
|
-
duplicate?: boolean;
|
|
339
|
-
retryOfJobId?: string;
|
|
340
|
-
/**
|
|
341
|
-
* The coordinator daemon ID that initiated this refine job.
|
|
342
|
-
* When set, events for this job are scoped to that coordinator's
|
|
343
|
-
* pending-events queue instead of the shared broadcast queue.
|
|
344
|
-
*/
|
|
345
|
-
targetCoordinatorDaemonId?: string;
|
|
346
|
-
eventDelivery: {
|
|
347
|
-
pendingEvents: true;
|
|
348
|
-
ledger: true;
|
|
349
|
-
};
|
|
350
|
-
evidence: {
|
|
351
|
-
pendingEventsCommand: 'get_pending_mesh_events';
|
|
352
|
-
ledgerCommand: 'get_mesh_ledger_slice';
|
|
353
|
-
taskHistoryKind: 'task_dispatched' | 'task_completed' | 'task_failed';
|
|
354
|
-
};
|
|
355
|
-
};
|
|
356
|
-
/**
|
|
357
|
-
* A spawn-resolution failure is when the executable itself could not be found by
|
|
358
|
-
* the OS spawn boundary — `spawn <cmd> ENOENT` — as opposed to the command
|
|
359
|
-
* running and exiting non-zero. On win32 this is the .cmd-shim case: libuv's
|
|
360
|
-
* spawn search appends only .com/.exe, so a bare `npm`/`npx`/`tsc` (which are
|
|
361
|
-
* .cmd shims) ENOENTs even though it is installed. It carries no stderr, so it
|
|
362
|
-
* must be detected by error.code/syscall, not by string-matching output.
|
|
363
|
-
*/
|
|
364
|
-
export declare function isSpawnResolutionError(error: any): boolean;
|
|
365
|
-
export declare function describeSpawnError(error: any, command: string, spawnResolutionFailed: boolean): string;
|
|
366
|
-
export declare function runMeshRefinePatchEquivalenceGate(repoRoot: string, baseHead: string, branchHead: string): Promise<MeshRefinePatchEquivalenceSummary>;
|
|
367
|
-
export type MeshWorktreePatchContainmentSummary = {
|
|
368
|
-
/** True only when merging worktreeHead into ref introduces no new patch. */
|
|
369
|
-
contained: boolean;
|
|
370
|
-
ref: string;
|
|
371
|
-
worktreeHead: string;
|
|
372
|
-
mergeBase?: string;
|
|
373
|
-
mergedTree?: string;
|
|
374
|
-
/** patch-id of (ref -> synthesized merge tree); empty string when nothing new is added. */
|
|
375
|
-
residualPatchId?: string;
|
|
376
|
-
durationMs: number;
|
|
377
|
-
/** Set when the check could not run (treated conservatively as NOT contained). */
|
|
378
|
-
error?: string;
|
|
379
|
-
};
|
|
380
|
-
/**
|
|
381
|
-
* Patch-equivalence containment check for the worktree force-cleanup convergence
|
|
382
|
-
* guard. Answers a narrower question than {@link runMeshRefinePatchEquivalenceGate}:
|
|
383
|
-
* "are the worktree branch's changes ALREADY present in `ref` (e.g. origin/main),
|
|
384
|
-
* even though the worktree HEAD's commit SHA is not an ancestor of ref?"
|
|
385
|
-
*
|
|
386
|
-
* This is the cherry-pick / squash / rebase case: the same content landed on the
|
|
387
|
-
* default ref under a different commit SHA, so `merge-base --is-ancestor` (the
|
|
388
|
-
* primary cleanup guard) reports the worktree as un-converged and refuses to
|
|
389
|
-
* remove it. Refinery already accepts patch-equivalent landings via merge-tree +
|
|
390
|
-
* patch-id; this brings the same notion of "convergence" to the cleanup guard.
|
|
391
|
-
*
|
|
392
|
-
* Mechanism: synthesize the merge of `worktreeHead` into `ref` (reusing the same
|
|
393
|
-
* trivial-gitlink-fast-forward handling as the refine gate) and compute the
|
|
394
|
-
* patch-id of (ref -> mergedTree). If that residual diff is EMPTY, merging the
|
|
395
|
-
* worktree adds nothing new on top of ref — its changes are already present there
|
|
396
|
-
* and the worktree is safe to remove. A non-empty residual means the worktree
|
|
397
|
-
* still carries content not in ref, so it is NOT contained and must stay blocked.
|
|
398
|
-
*
|
|
399
|
-
* Conservative by construction: any merge-tree / patch-id failure, a genuine
|
|
400
|
-
* (non-trivial) submodule conflict, or any thrown error yields `contained: false`
|
|
401
|
-
* so an exception can never widen the cleanup allow-list.
|
|
402
|
-
*/
|
|
403
|
-
export declare function checkWorktreeChangesPatchEquivalentInRef(repoRoot: string, ref: string, worktreeHead: string): Promise<MeshWorktreePatchContainmentSummary>;
|
|
404
|
-
/**
|
|
405
|
-
* No-op guard: detect a "silent no-op" merge before the Refinery merge runs.
|
|
406
|
-
*
|
|
407
|
-
* A silent no-op occurs when the refine target branch's ROOT tree is byte-identical
|
|
408
|
-
* to the merge base (origin/main). This is the trap where a submodule (e.g. oss) has
|
|
409
|
-
* real commits but the root branch never committed the gitlink (oss-pointer) bump, so
|
|
410
|
-
* the root diff Refinery would merge is empty. Merging that produces a merge commit with
|
|
411
|
-
* no content change — reported as "success" while the actual work never reaches main.
|
|
412
|
-
*
|
|
413
|
-
* A committed gitlink bump (the legitimate oss-pointer bump) DOES show up in the root
|
|
414
|
-
* tree diff (as a 160000-mode entry), so this guard does NOT block legitimate refines —
|
|
415
|
-
* it only fires when the root tree diff vs base is COMPLETELY empty.
|
|
416
|
-
*
|
|
417
|
-
* Runs after the patch-equivalence gate; the "already merged via other path" case
|
|
418
|
-
* (branch has real changes already present in base) is handled upstream and never
|
|
419
|
-
* reaches here, so an empty root diff at this point is genuinely a no-op.
|
|
420
|
-
*/
|
|
421
|
-
export declare function runMeshRefineEffectiveDiffGate(repoRoot: string, baseHead: string, branchHead: string): Promise<MeshRefineEffectiveDiffSummary>;
|
|
422
|
-
/**
|
|
423
|
-
* Result of evaluating whether a `git merge-tree --write-tree` submodule
|
|
424
|
-
* conflict is in fact a trivial gitlink fast-forward that should pass the
|
|
425
|
-
* patch-equivalence gate.
|
|
426
|
-
*
|
|
427
|
-
* `git merge-tree` (and `git merge` with the default recursive strategy)
|
|
428
|
-
* refuses to 3-way merge gitlinks unless the case is "trivial" — and it
|
|
429
|
-
* treats *any* gitlink that differs across merge-base/base/branch as
|
|
430
|
-
* non-trivial, even when the branch-side commit is a strict descendant of the
|
|
431
|
-
* base-side commit (i.e. a real fast-forward). Refinery only ever wants to
|
|
432
|
-
* accept the branch's recorded gitlink, so a fast-forwardable bump is safe to
|
|
433
|
-
* resolve to the branch side without any conflict.
|
|
434
|
-
*/
|
|
435
|
-
type GitlinkTrivialFastForwardEvaluation = {
|
|
436
|
-
/** True only when the merge-tree conflict is *fully* explained by trivial-ff gitlinks. */
|
|
437
|
-
trivial: boolean;
|
|
438
|
-
/** Why the evaluation declined to treat the conflict as trivial (set when trivial=false). */
|
|
439
|
-
reason?: string;
|
|
440
|
-
/** Per-path detail for the changed gitlinks that were inspected. */
|
|
441
|
-
gitlinks: Array<{
|
|
442
|
-
path: string;
|
|
443
|
-
baseCommit?: string;
|
|
444
|
-
branchCommit?: string;
|
|
445
|
-
fastForward: boolean;
|
|
446
|
-
}>;
|
|
447
|
-
};
|
|
448
|
-
/**
|
|
449
|
-
* Return the changed gitlink paths between base and branch whose advance is a
|
|
450
|
-
* strict fast-forward (the base-side commit is an ancestor of the branch-side
|
|
451
|
-
* commit inside that submodule's repo). These are the paths whose patch-id hunk
|
|
452
|
-
* may legitimately differ when base has advanced the same submodule, so they
|
|
453
|
-
* are safe to exclude from the patch-equivalence comparison. A non-ff (genuinely
|
|
454
|
-
* diverged) gitlink is deliberately excluded from this set so it still fails the
|
|
455
|
-
* gate.
|
|
456
|
-
*/
|
|
457
|
-
export declare function collectFastForwardGitlinkPaths(repoRoot: string, baseHead: string, branchHead: string): string[];
|
|
458
|
-
/**
|
|
459
|
-
* Decide whether a merge-tree submodule conflict between base and branch is a
|
|
460
|
-
* trivial gitlink fast-forward (and nothing else).
|
|
461
|
-
*
|
|
462
|
-
* The conflict is treated as trivial ONLY when:
|
|
463
|
-
* 1. at least one changed gitlink exists,
|
|
464
|
-
* 2. every changed gitlink fast-forwards (base-commit is an ancestor of the
|
|
465
|
-
* branch-commit inside that submodule's repo), and
|
|
466
|
-
* 3. the *only* paths that changed on both sides of the merge (i.e. the paths
|
|
467
|
-
* that could possibly produce a 3-way conflict — the intersection of
|
|
468
|
-
* mergeBase→base and mergeBase→branch changes) are gitlinks. Any
|
|
469
|
-
* overlapping non-gitlink path means a genuine content conflict could be
|
|
470
|
-
* hiding behind the submodule failure, so we keep the block.
|
|
471
|
-
*
|
|
472
|
-
* If any of these fail, the conflict is left as a genuine block. This never
|
|
473
|
-
* passes a regular-file conflict or a diverged (non-ff) gitlink.
|
|
474
|
-
*/
|
|
475
|
-
export declare function evaluateGitlinkTrivialFastForward(repoRoot: string, baseHead: string, branchHead: string): GitlinkTrivialFastForwardEvaluation;
|
|
476
|
-
export declare function buildMeshRefineValidationPlan(mesh: any, workspace: string): Record<string, unknown>;
|
|
477
|
-
export declare function getMcpServersKey(format: MeshCoordinatorConfigFormat): 'mcpServers' | 'mcp_servers';
|
|
478
|
-
export declare function parseMeshCoordinatorMcpConfig(text: string, format: MeshCoordinatorConfigFormat): Record<string, any>;
|
|
479
|
-
export declare function serializeMeshCoordinatorMcpConfig(config: Record<string, any>, format: MeshCoordinatorConfigFormat): string;
|
|
480
|
-
export declare function loadHermesCoordinatorBaseConfig(targetConfigPath: string): {
|
|
481
|
-
config: Record<string, any>;
|
|
482
|
-
sourceHome: string;
|
|
483
|
-
sourceConfigPath: string;
|
|
484
|
-
};
|
|
485
|
-
export declare function stripHermesCoordinatorTempModelProviderOverrides(config: Record<string, any>): Record<string, any>;
|
|
486
|
-
export declare function copyHermesCoordinatorCredentialFiles(sourceHome: string, targetHome: string): void;
|
|
17
|
+
export * from '../mesh/mesh-node-identity.js';
|
|
18
|
+
export * from '../mesh/mesh-refine-gates.js';
|
|
19
|
+
export * from '../mesh/mesh-coordinator-config.js';
|
|
487
20
|
export interface SessionHostControlPlane {
|
|
488
21
|
getDiagnostics(payload?: {
|
|
489
22
|
includeSessions?: boolean;
|