umbrella-context 0.1.2 → 0.1.32
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/bin/um.js +2 -0
- package/dist/adapters/byterover-context-runtime-store.d.ts +15 -0
- package/dist/adapters/byterover-context-runtime-store.js +57 -0
- package/dist/adapters/byterover-runtime-bridge.d.ts +218 -0
- package/dist/adapters/byterover-runtime-bridge.js +343 -0
- package/dist/adapters/byterover-transport-task-store.d.ts +13 -0
- package/dist/adapters/byterover-transport-task-store.js +50 -0
- package/dist/adapters/umbrella-onboarding.d.ts +27 -0
- package/dist/adapters/umbrella-onboarding.js +79 -0
- package/dist/adapters/umbrella-provider-runtime.d.ts +38 -0
- package/dist/adapters/umbrella-provider-runtime.js +199 -0
- package/dist/adapters/vendor-byterover.d.ts +4 -0
- package/dist/adapters/vendor-byterover.js +19 -0
- package/dist/commands/activity.d.ts +2 -0
- package/dist/commands/activity.js +82 -0
- package/dist/commands/bridge.d.ts +2 -0
- package/dist/commands/bridge.js +40 -0
- package/dist/commands/catalog.d.ts +34 -0
- package/dist/commands/catalog.js +234 -0
- package/dist/commands/connect.js +14 -14
- package/dist/commands/connectors.d.ts +24 -0
- package/dist/commands/connectors.js +626 -0
- package/dist/commands/curate.d.ts +1 -0
- package/dist/commands/curate.js +48 -3
- package/dist/commands/debug.d.ts +2 -0
- package/dist/commands/debug.js +55 -0
- package/dist/commands/fix.js +54 -0
- package/dist/commands/hub.d.ts +22 -0
- package/dist/commands/hub.js +487 -0
- package/dist/commands/interactive.d.ts +2 -0
- package/dist/commands/interactive.js +970 -62
- package/dist/commands/locations.d.ts +1 -0
- package/dist/commands/locations.js +15 -12
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.js +34 -0
- package/dist/commands/model.d.ts +11 -0
- package/dist/commands/model.js +225 -0
- package/dist/commands/providers.d.ts +17 -0
- package/dist/commands/providers.js +379 -0
- package/dist/commands/pull.js +60 -1
- package/dist/commands/push.js +62 -2
- package/dist/commands/reset.d.ts +2 -0
- package/dist/commands/reset.js +35 -0
- package/dist/commands/restart.d.ts +2 -0
- package/dist/commands/restart.js +21 -0
- package/dist/commands/search.js +65 -1
- package/dist/commands/session.d.ts +2 -0
- package/dist/commands/session.js +241 -0
- package/dist/commands/setup.js +58 -56
- package/dist/commands/space.d.ts +12 -0
- package/dist/commands/space.js +138 -42
- package/dist/commands/status.d.ts +29 -0
- package/dist/commands/status.js +120 -19
- package/dist/commands/tasks.d.ts +2 -0
- package/dist/commands/tasks.js +95 -0
- package/dist/commands/transport.d.ts +2 -0
- package/dist/commands/transport.js +88 -0
- package/dist/commands/tree.d.ts +2 -0
- package/dist/commands/tree.js +98 -0
- package/dist/commands/tui.d.ts +2 -0
- package/dist/commands/tui.js +1273 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.js +69 -0
- package/dist/index.js +41 -5
- package/dist/repo-state.d.ts +227 -1
- package/dist/repo-state.js +920 -4
- package/dist/umbrella.js +29 -5
- package/package.json +11 -3
package/bin/um.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type VendorBridgeRuntimeSnapshot } from "./byterover-runtime-bridge.js";
|
|
2
|
+
export declare const useUmbrellaContextRuntimeBridgeStore: any;
|
|
3
|
+
export declare function hydrateUmbrellaContextRuntimeBridgeFromSnapshot(snapshot: VendorBridgeRuntimeSnapshot): void;
|
|
4
|
+
export declare function hydrateUmbrellaContextRuntimeBridge(cwd?: string): Promise<VendorBridgeRuntimeSnapshot>;
|
|
5
|
+
export declare function getUmbrellaContextRuntimeSummary(): {
|
|
6
|
+
companyName: any;
|
|
7
|
+
generatedAt: any;
|
|
8
|
+
isHydrated: any;
|
|
9
|
+
modelName: any;
|
|
10
|
+
providerName: any;
|
|
11
|
+
runtimeStatus: any;
|
|
12
|
+
spaceCount: any;
|
|
13
|
+
spaceName: any;
|
|
14
|
+
treeNodes: any;
|
|
15
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { create } from "zustand";
|
|
2
|
+
import { buildVendorRuntimeBridgeSnapshot, } from "./byterover-runtime-bridge.js";
|
|
3
|
+
const initialContextRuntimeState = {
|
|
4
|
+
company: { id: null, name: null },
|
|
5
|
+
connectorsStore: null,
|
|
6
|
+
generatedAt: null,
|
|
7
|
+
hubStore: null,
|
|
8
|
+
isHydrated: false,
|
|
9
|
+
modelStore: null,
|
|
10
|
+
providerStore: null,
|
|
11
|
+
repo: null,
|
|
12
|
+
services: null,
|
|
13
|
+
space: { id: null, name: null },
|
|
14
|
+
spaceStore: null,
|
|
15
|
+
treeStore: null,
|
|
16
|
+
};
|
|
17
|
+
export const useUmbrellaContextRuntimeBridgeStore = create()((set) => ({
|
|
18
|
+
...initialContextRuntimeState,
|
|
19
|
+
hydrateFromSnapshot: (snapshot) => set({
|
|
20
|
+
company: snapshot.company,
|
|
21
|
+
connectorsStore: snapshot.stores.connectors,
|
|
22
|
+
generatedAt: snapshot.generatedAt,
|
|
23
|
+
hubStore: snapshot.stores.hub,
|
|
24
|
+
isHydrated: true,
|
|
25
|
+
modelStore: snapshot.stores.model,
|
|
26
|
+
providerStore: snapshot.stores.provider,
|
|
27
|
+
repo: snapshot.repo,
|
|
28
|
+
services: snapshot.services,
|
|
29
|
+
space: snapshot.space,
|
|
30
|
+
spaceStore: snapshot.stores.space,
|
|
31
|
+
treeStore: snapshot.stores.contextTree,
|
|
32
|
+
}),
|
|
33
|
+
reset: () => set(initialContextRuntimeState),
|
|
34
|
+
}));
|
|
35
|
+
export function hydrateUmbrellaContextRuntimeBridgeFromSnapshot(snapshot) {
|
|
36
|
+
useUmbrellaContextRuntimeBridgeStore.getState().hydrateFromSnapshot(snapshot);
|
|
37
|
+
}
|
|
38
|
+
export async function hydrateUmbrellaContextRuntimeBridge(cwd = process.cwd()) {
|
|
39
|
+
const snapshot = await buildVendorRuntimeBridgeSnapshot(cwd);
|
|
40
|
+
hydrateUmbrellaContextRuntimeBridgeFromSnapshot(snapshot);
|
|
41
|
+
return snapshot;
|
|
42
|
+
}
|
|
43
|
+
export function getUmbrellaContextRuntimeSummary() {
|
|
44
|
+
const state = useUmbrellaContextRuntimeBridgeStore.getState();
|
|
45
|
+
return {
|
|
46
|
+
companyName: state.company.name,
|
|
47
|
+
generatedAt: state.generatedAt,
|
|
48
|
+
isHydrated: state.isHydrated,
|
|
49
|
+
modelName: state.modelStore?.activeModel ?? null,
|
|
50
|
+
providerName: state.providerStore?.providers.find((provider) => provider.id === state.providerStore?.activeProviderId)?.name ??
|
|
51
|
+
null,
|
|
52
|
+
runtimeStatus: state.treeStore?.runtime.transportStatus ?? "idle",
|
|
53
|
+
spaceCount: state.spaceStore?.spaces.length ?? 0,
|
|
54
|
+
spaceName: state.space.name,
|
|
55
|
+
treeNodes: state.treeStore?.nodes.length ?? 0,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { type ContextTreeNode, type LocalConnectorEntry, type LocalConnectorRun, type LocalHubInstall, type RepoContextTreeState, type RepoTransportEvent, type RepoTransportState } from "../repo-state.js";
|
|
2
|
+
export type VendorBridgeConnectionState = "connected" | "connecting" | "disconnected";
|
|
3
|
+
export type VendorBridgeTaskStatus = "cancelled" | "completed" | "created" | "error" | "started";
|
|
4
|
+
export type VendorBridgeTaskType = "curate" | "query";
|
|
5
|
+
export type VendorBridgeToolCallEvent = {
|
|
6
|
+
args: Record<string, unknown>;
|
|
7
|
+
callId?: string;
|
|
8
|
+
error?: string;
|
|
9
|
+
errorType?: string;
|
|
10
|
+
result?: unknown;
|
|
11
|
+
sessionId?: string | null;
|
|
12
|
+
status: "completed" | "error" | "running";
|
|
13
|
+
timestamp: number;
|
|
14
|
+
toolName: string;
|
|
15
|
+
};
|
|
16
|
+
export type VendorBridgeReasoningContentItem = {
|
|
17
|
+
content: string;
|
|
18
|
+
isThinking?: boolean;
|
|
19
|
+
timestamp: number;
|
|
20
|
+
};
|
|
21
|
+
export type VendorBridgeTask = {
|
|
22
|
+
completedAt?: number;
|
|
23
|
+
content: string;
|
|
24
|
+
createdAt: number;
|
|
25
|
+
error?: {
|
|
26
|
+
message: string;
|
|
27
|
+
};
|
|
28
|
+
files?: string[];
|
|
29
|
+
folders?: string[];
|
|
30
|
+
input: string;
|
|
31
|
+
isStreaming?: boolean;
|
|
32
|
+
reasoningContents?: VendorBridgeReasoningContentItem[];
|
|
33
|
+
result?: string;
|
|
34
|
+
sessionId?: string;
|
|
35
|
+
startedAt?: number;
|
|
36
|
+
status: VendorBridgeTaskStatus;
|
|
37
|
+
streamingContent?: string;
|
|
38
|
+
taskId: string;
|
|
39
|
+
toolCalls: VendorBridgeToolCallEvent[];
|
|
40
|
+
type: VendorBridgeTaskType;
|
|
41
|
+
};
|
|
42
|
+
export type VendorBridgeTasksState = {
|
|
43
|
+
recentTaskIds: string[];
|
|
44
|
+
stats: {
|
|
45
|
+
cancelled: number;
|
|
46
|
+
completed: number;
|
|
47
|
+
created: number;
|
|
48
|
+
error: number;
|
|
49
|
+
started: number;
|
|
50
|
+
};
|
|
51
|
+
tasks: Record<string, VendorBridgeTask>;
|
|
52
|
+
};
|
|
53
|
+
export type VendorBridgeTransportState = {
|
|
54
|
+
connectionState: VendorBridgeConnectionState;
|
|
55
|
+
error: string | null;
|
|
56
|
+
eventCount: number;
|
|
57
|
+
events: Array<{
|
|
58
|
+
at: number;
|
|
59
|
+
detail: string | null;
|
|
60
|
+
kind: RepoTransportEvent["kind"];
|
|
61
|
+
status: RepoTransportEvent["status"];
|
|
62
|
+
taskId: string | null;
|
|
63
|
+
title: string;
|
|
64
|
+
}>;
|
|
65
|
+
isConnected: boolean;
|
|
66
|
+
lastPullAt: number | null;
|
|
67
|
+
lastPushAt: number | null;
|
|
68
|
+
lastRuntimeCheckAt: number | null;
|
|
69
|
+
queue: RepoTransportState["queue"];
|
|
70
|
+
reconnectCount: number;
|
|
71
|
+
status: RepoTransportState["status"];
|
|
72
|
+
subscriptions: string[];
|
|
73
|
+
updatedAt: number;
|
|
74
|
+
version: string;
|
|
75
|
+
};
|
|
76
|
+
export type VendorBridgeContextTreeState = {
|
|
77
|
+
generatedAt: number;
|
|
78
|
+
nodes: Array<ContextTreeNode & {
|
|
79
|
+
depth: number;
|
|
80
|
+
}>;
|
|
81
|
+
runtime: RepoContextTreeState["runtime"];
|
|
82
|
+
stats: RepoContextTreeState["stats"];
|
|
83
|
+
summaryHandle: string;
|
|
84
|
+
};
|
|
85
|
+
export type VendorBridgeRuntimeSnapshot = {
|
|
86
|
+
company: {
|
|
87
|
+
id: string | null;
|
|
88
|
+
name: string | null;
|
|
89
|
+
};
|
|
90
|
+
generatedAt: string;
|
|
91
|
+
repo: {
|
|
92
|
+
pendingDrafts: number;
|
|
93
|
+
pulledContext: number;
|
|
94
|
+
pulledFixes: number;
|
|
95
|
+
repoRoot: string;
|
|
96
|
+
umDir: string;
|
|
97
|
+
};
|
|
98
|
+
services: {
|
|
99
|
+
activeModel: string | null;
|
|
100
|
+
activeProvider: string | null;
|
|
101
|
+
connectorsInstalled: number;
|
|
102
|
+
connectorRuns: number;
|
|
103
|
+
hubEntriesInstalled: number;
|
|
104
|
+
};
|
|
105
|
+
space: {
|
|
106
|
+
id: string | null;
|
|
107
|
+
name: string | null;
|
|
108
|
+
};
|
|
109
|
+
stores: {
|
|
110
|
+
connectors: VendorBridgeConnectorsState;
|
|
111
|
+
contextTree: VendorBridgeContextTreeState;
|
|
112
|
+
hub: VendorBridgeHubState;
|
|
113
|
+
model: VendorBridgeModelState;
|
|
114
|
+
provider: VendorBridgeProviderState;
|
|
115
|
+
space: VendorBridgeSpaceState;
|
|
116
|
+
tasks: VendorBridgeTasksState;
|
|
117
|
+
transport: VendorBridgeTransportState;
|
|
118
|
+
};
|
|
119
|
+
vendorParityTargets: readonly string[];
|
|
120
|
+
};
|
|
121
|
+
export type VendorBridgeProviderState = {
|
|
122
|
+
activeProviderId: string | null;
|
|
123
|
+
isLoading: boolean;
|
|
124
|
+
providers: Array<{
|
|
125
|
+
baseUrl?: string;
|
|
126
|
+
hasApiKey: boolean;
|
|
127
|
+
id: string;
|
|
128
|
+
kind: string;
|
|
129
|
+
name: string;
|
|
130
|
+
updatedAt: number | null;
|
|
131
|
+
}>;
|
|
132
|
+
};
|
|
133
|
+
export type VendorBridgeModelState = {
|
|
134
|
+
activeModel: string | null;
|
|
135
|
+
favorites: string[];
|
|
136
|
+
isLoading: boolean;
|
|
137
|
+
models: Array<{
|
|
138
|
+
id: string;
|
|
139
|
+
isActive: boolean;
|
|
140
|
+
label: string;
|
|
141
|
+
providerId: string | null;
|
|
142
|
+
}>;
|
|
143
|
+
recent: string[];
|
|
144
|
+
};
|
|
145
|
+
export type VendorBridgeSpaceState = {
|
|
146
|
+
activeSpaceId: string | null;
|
|
147
|
+
activeSpaceName: string | null;
|
|
148
|
+
companyId: string | null;
|
|
149
|
+
companyName: string | null;
|
|
150
|
+
isLoading: boolean;
|
|
151
|
+
spaces: Array<{
|
|
152
|
+
id: string;
|
|
153
|
+
isPrimary: boolean;
|
|
154
|
+
isSelected: boolean;
|
|
155
|
+
name: string;
|
|
156
|
+
}>;
|
|
157
|
+
};
|
|
158
|
+
export type VendorBridgeHubState = {
|
|
159
|
+
installed: LocalHubInstall[];
|
|
160
|
+
installedSlugs: string[];
|
|
161
|
+
isLoading: boolean;
|
|
162
|
+
recentSlug: string | null;
|
|
163
|
+
registryCount: number;
|
|
164
|
+
};
|
|
165
|
+
export type VendorBridgeConnectorsState = {
|
|
166
|
+
installed: LocalConnectorEntry[];
|
|
167
|
+
installedSources: string[];
|
|
168
|
+
isLoading: boolean;
|
|
169
|
+
recentRunSource: string | null;
|
|
170
|
+
recentSource: string | null;
|
|
171
|
+
runs: LocalConnectorRun[];
|
|
172
|
+
};
|
|
173
|
+
export declare function buildVendorRuntimeBridgeSnapshot(cwd?: string): Promise<VendorBridgeRuntimeSnapshot>;
|
|
174
|
+
export declare function buildVendorRuntimeBridgeSummary(cwd?: string): Promise<{
|
|
175
|
+
company: string;
|
|
176
|
+
repoRoot: string;
|
|
177
|
+
space: string;
|
|
178
|
+
tasks: {
|
|
179
|
+
completed: number;
|
|
180
|
+
created: number;
|
|
181
|
+
error: number;
|
|
182
|
+
started: number;
|
|
183
|
+
total: number;
|
|
184
|
+
};
|
|
185
|
+
transport: {
|
|
186
|
+
connectionState: VendorBridgeConnectionState;
|
|
187
|
+
events: number;
|
|
188
|
+
queueDepth: number;
|
|
189
|
+
status: "failure" | "warning" | "running" | "idle";
|
|
190
|
+
};
|
|
191
|
+
provider: {
|
|
192
|
+
active: string | null;
|
|
193
|
+
count: number;
|
|
194
|
+
};
|
|
195
|
+
model: {
|
|
196
|
+
active: string | null;
|
|
197
|
+
count: number;
|
|
198
|
+
};
|
|
199
|
+
spaces: {
|
|
200
|
+
active: string | null;
|
|
201
|
+
count: number;
|
|
202
|
+
};
|
|
203
|
+
hub: {
|
|
204
|
+
installed: number;
|
|
205
|
+
recent: string | null;
|
|
206
|
+
};
|
|
207
|
+
connectors: {
|
|
208
|
+
installed: number;
|
|
209
|
+
recent: string | null;
|
|
210
|
+
runs: number;
|
|
211
|
+
};
|
|
212
|
+
tree: {
|
|
213
|
+
nodes: number;
|
|
214
|
+
runtimeProvider: string | null;
|
|
215
|
+
runtimeStatus: "failure" | "warning" | "running" | "idle";
|
|
216
|
+
summaryHandle: string;
|
|
217
|
+
};
|
|
218
|
+
}>;
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { configManager } from "../config.js";
|
|
2
|
+
import { getModelsForActiveProvider } from "../commands/model.js";
|
|
3
|
+
import { getConnectorRuns, getContextTreeState, getInstalledConnectors, getInstalledHubEntries, getPendingMemories, getPulledFixes, getPulledMemories, getRepoContext, getSessionState, getTasks, getTransportState, } from "../repo-state.js";
|
|
4
|
+
import { getCompanyContextSummary, toContextSpaces } from "../umbrella.js";
|
|
5
|
+
function toEpoch(value) {
|
|
6
|
+
if (!value)
|
|
7
|
+
return null;
|
|
8
|
+
const next = Date.parse(value);
|
|
9
|
+
return Number.isNaN(next) ? null : next;
|
|
10
|
+
}
|
|
11
|
+
function mapTransportConnectionState(status) {
|
|
12
|
+
if (status === "running")
|
|
13
|
+
return "connecting";
|
|
14
|
+
if (status === "failure")
|
|
15
|
+
return "disconnected";
|
|
16
|
+
return "connected";
|
|
17
|
+
}
|
|
18
|
+
function mapTaskStatus(task) {
|
|
19
|
+
if (task.status === "completed")
|
|
20
|
+
return "completed";
|
|
21
|
+
if (task.status === "failed")
|
|
22
|
+
return "error";
|
|
23
|
+
if (task.status === "running")
|
|
24
|
+
return "started";
|
|
25
|
+
return "created";
|
|
26
|
+
}
|
|
27
|
+
function mapTaskType(task) {
|
|
28
|
+
return task.kind === "curate" ? "curate" : "query";
|
|
29
|
+
}
|
|
30
|
+
function mapTask(task) {
|
|
31
|
+
return {
|
|
32
|
+
completedAt: toEpoch(task.finishedAt ?? null) ?? undefined,
|
|
33
|
+
content: task.detail ?? task.title,
|
|
34
|
+
createdAt: toEpoch(task.createdAt) ?? Date.now(),
|
|
35
|
+
error: task.status === "failed" ? { message: task.detail ?? task.result ?? "Task failed" } : undefined,
|
|
36
|
+
files: task.files,
|
|
37
|
+
folders: task.folders,
|
|
38
|
+
input: task.input ?? task.focus ?? task.title,
|
|
39
|
+
isStreaming: Boolean(task.streamingContent && task.status === "running"),
|
|
40
|
+
reasoningContents: (task.reasoningContents ?? []).map((item) => ({
|
|
41
|
+
content: item.content,
|
|
42
|
+
isThinking: item.isThinking,
|
|
43
|
+
timestamp: toEpoch(item.timestamp) ?? Date.now(),
|
|
44
|
+
})),
|
|
45
|
+
result: task.result ?? undefined,
|
|
46
|
+
sessionId: task.sessionId ?? undefined,
|
|
47
|
+
startedAt: toEpoch(task.startedAt ?? null) ?? undefined,
|
|
48
|
+
status: mapTaskStatus(task),
|
|
49
|
+
streamingContent: task.streamingContent ?? undefined,
|
|
50
|
+
taskId: task.id,
|
|
51
|
+
toolCalls: (task.toolCalls ?? []).map((call) => ({
|
|
52
|
+
args: call.args,
|
|
53
|
+
callId: call.callId,
|
|
54
|
+
error: call.error,
|
|
55
|
+
errorType: call.errorType,
|
|
56
|
+
result: call.result,
|
|
57
|
+
sessionId: call.sessionId,
|
|
58
|
+
status: call.status,
|
|
59
|
+
timestamp: toEpoch(call.timestamp) ?? Date.now(),
|
|
60
|
+
toolName: call.toolName,
|
|
61
|
+
})),
|
|
62
|
+
type: mapTaskType(task),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function buildTaskStats(tasks) {
|
|
66
|
+
return tasks.reduce((acc, task) => {
|
|
67
|
+
if (task.status === "created")
|
|
68
|
+
acc.created += 1;
|
|
69
|
+
else if (task.status === "started")
|
|
70
|
+
acc.started += 1;
|
|
71
|
+
else if (task.status === "completed")
|
|
72
|
+
acc.completed += 1;
|
|
73
|
+
else if (task.status === "error")
|
|
74
|
+
acc.error += 1;
|
|
75
|
+
else
|
|
76
|
+
acc.cancelled += 1;
|
|
77
|
+
return acc;
|
|
78
|
+
}, { cancelled: 0, completed: 0, created: 0, error: 0, started: 0 });
|
|
79
|
+
}
|
|
80
|
+
function buildNodeDepthMap(nodes) {
|
|
81
|
+
const byId = new Map(nodes.map((node) => [node.id, node]));
|
|
82
|
+
const depthCache = new Map();
|
|
83
|
+
const getDepth = (node) => {
|
|
84
|
+
if (depthCache.has(node.id))
|
|
85
|
+
return depthCache.get(node.id) ?? 0;
|
|
86
|
+
if (!node.parentId || !byId.has(node.parentId)) {
|
|
87
|
+
depthCache.set(node.id, 0);
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
const parent = byId.get(node.parentId);
|
|
91
|
+
const depth = getDepth(parent) + 1;
|
|
92
|
+
depthCache.set(node.id, depth);
|
|
93
|
+
return depth;
|
|
94
|
+
};
|
|
95
|
+
return nodes.map((node) => ({ ...node, depth: getDepth(node) }));
|
|
96
|
+
}
|
|
97
|
+
function buildTransportSnapshot(transport) {
|
|
98
|
+
const connectionState = mapTransportConnectionState(transport.status);
|
|
99
|
+
return {
|
|
100
|
+
connectionState,
|
|
101
|
+
error: transport.status === "failure" ? "Transport entered failure state" : null,
|
|
102
|
+
eventCount: transport.events.length,
|
|
103
|
+
events: transport.events.map((event) => ({
|
|
104
|
+
at: toEpoch(event.at) ?? Date.now(),
|
|
105
|
+
detail: event.detail,
|
|
106
|
+
kind: event.kind,
|
|
107
|
+
status: event.status,
|
|
108
|
+
taskId: event.taskId,
|
|
109
|
+
title: event.title,
|
|
110
|
+
})),
|
|
111
|
+
isConnected: connectionState === "connected",
|
|
112
|
+
lastPullAt: toEpoch(transport.lastPullAt),
|
|
113
|
+
lastPushAt: toEpoch(transport.lastPushAt),
|
|
114
|
+
lastRuntimeCheckAt: toEpoch(transport.lastRuntimeCheckAt),
|
|
115
|
+
queue: transport.queue,
|
|
116
|
+
reconnectCount: transport.status === "running" ? 1 : 0,
|
|
117
|
+
status: transport.status,
|
|
118
|
+
subscriptions: transport.subscriptions,
|
|
119
|
+
updatedAt: toEpoch(transport.updatedAt) ?? Date.now(),
|
|
120
|
+
version: "umbrella-bridge-1",
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
async function buildProviderSnapshot() {
|
|
124
|
+
const activeProviderId = configManager.config?.activeProvider ?? null;
|
|
125
|
+
return {
|
|
126
|
+
activeProviderId,
|
|
127
|
+
isLoading: false,
|
|
128
|
+
providers: configManager.providers.map((provider) => ({
|
|
129
|
+
baseUrl: provider.baseUrl,
|
|
130
|
+
hasApiKey: Boolean(provider.apiKey),
|
|
131
|
+
id: provider.id,
|
|
132
|
+
kind: provider.kind,
|
|
133
|
+
name: provider.name,
|
|
134
|
+
updatedAt: toEpoch(provider.updatedAt),
|
|
135
|
+
})),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
async function buildModelSnapshot() {
|
|
139
|
+
const activeProviderId = configManager.config?.activeProvider ?? null;
|
|
140
|
+
const activeModel = configManager.config?.activeModel ?? null;
|
|
141
|
+
const models = getModelsForActiveProvider();
|
|
142
|
+
const sessionState = await import("../repo-state.js").then((mod) => mod.getSessionState());
|
|
143
|
+
return {
|
|
144
|
+
activeModel,
|
|
145
|
+
favorites: activeModel ? [activeModel] : [],
|
|
146
|
+
isLoading: false,
|
|
147
|
+
models: models.map((model) => ({
|
|
148
|
+
id: model,
|
|
149
|
+
isActive: model === activeModel,
|
|
150
|
+
label: model,
|
|
151
|
+
providerId: activeProviderId,
|
|
152
|
+
})),
|
|
153
|
+
recent: sessionState?.recentModels ?? [],
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
async function buildSpaceSnapshot(cwd = process.cwd()) {
|
|
157
|
+
const repoContext = await getRepoContext(cwd);
|
|
158
|
+
const config = configManager.config;
|
|
159
|
+
if (!config?.umbrellaUrl) {
|
|
160
|
+
return {
|
|
161
|
+
activeSpaceId: repoContext.state?.projectId ?? null,
|
|
162
|
+
activeSpaceName: repoContext.state?.projectName ?? null,
|
|
163
|
+
companyId: repoContext.state?.companyId ?? null,
|
|
164
|
+
companyName: repoContext.state?.companyName ?? null,
|
|
165
|
+
isLoading: false,
|
|
166
|
+
spaces: repoContext.state
|
|
167
|
+
? [
|
|
168
|
+
{
|
|
169
|
+
id: repoContext.state.projectId,
|
|
170
|
+
isPrimary: true,
|
|
171
|
+
isSelected: true,
|
|
172
|
+
name: repoContext.state.projectName,
|
|
173
|
+
},
|
|
174
|
+
]
|
|
175
|
+
: [],
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
const summary = await getCompanyContextSummary(config.umbrellaUrl, config.companyId);
|
|
179
|
+
const spaces = toContextSpaces(summary);
|
|
180
|
+
return {
|
|
181
|
+
activeSpaceId: config.projectId,
|
|
182
|
+
activeSpaceName: config.projectName,
|
|
183
|
+
companyId: config.companyId,
|
|
184
|
+
companyName: config.companyName,
|
|
185
|
+
isLoading: false,
|
|
186
|
+
spaces: spaces.map((space) => ({
|
|
187
|
+
id: space.id,
|
|
188
|
+
isPrimary: space.isPrimary,
|
|
189
|
+
isSelected: space.id === config.projectId,
|
|
190
|
+
name: space.name,
|
|
191
|
+
})),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
async function buildHubSnapshot(cwd = process.cwd()) {
|
|
195
|
+
const [installed, sessionState] = await Promise.all([getInstalledHubEntries(cwd), getSessionState(cwd)]);
|
|
196
|
+
return {
|
|
197
|
+
installed,
|
|
198
|
+
installedSlugs: installed.map((entry) => entry.slug),
|
|
199
|
+
isLoading: false,
|
|
200
|
+
recentSlug: sessionState?.recentHubSlugs?.[0] ?? null,
|
|
201
|
+
registryCount: 3,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
async function buildConnectorsSnapshot(cwd = process.cwd()) {
|
|
205
|
+
const [installed, runs, sessionState] = await Promise.all([
|
|
206
|
+
getInstalledConnectors(cwd),
|
|
207
|
+
getConnectorRuns(cwd),
|
|
208
|
+
getSessionState(cwd),
|
|
209
|
+
]);
|
|
210
|
+
return {
|
|
211
|
+
installed,
|
|
212
|
+
installedSources: installed.map((entry) => entry.source),
|
|
213
|
+
isLoading: false,
|
|
214
|
+
recentRunSource: runs[0]?.source ?? null,
|
|
215
|
+
recentSource: sessionState?.recentConnectorSources?.[0] ?? null,
|
|
216
|
+
runs,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
export async function buildVendorRuntimeBridgeSnapshot(cwd = process.cwd()) {
|
|
220
|
+
const [repoContext, pending, pulled, fixes, hubEntries, connectors, connectorRuns, localTasks, transport, contextTree, providerStore, modelStore, spaceStore, hubStore, connectorsStore,] = await Promise.all([
|
|
221
|
+
getRepoContext(cwd),
|
|
222
|
+
getPendingMemories(cwd),
|
|
223
|
+
getPulledMemories(cwd),
|
|
224
|
+
getPulledFixes(cwd),
|
|
225
|
+
getInstalledHubEntries(cwd),
|
|
226
|
+
getInstalledConnectors(cwd),
|
|
227
|
+
getConnectorRuns(cwd),
|
|
228
|
+
getTasks(cwd),
|
|
229
|
+
getTransportState(cwd),
|
|
230
|
+
getContextTreeState(cwd),
|
|
231
|
+
buildProviderSnapshot(),
|
|
232
|
+
buildModelSnapshot(),
|
|
233
|
+
buildSpaceSnapshot(cwd),
|
|
234
|
+
buildHubSnapshot(cwd),
|
|
235
|
+
buildConnectorsSnapshot(cwd),
|
|
236
|
+
]);
|
|
237
|
+
const activeProvider = configManager.providers.find((entry) => entry.id === configManager.config?.activeProvider) ?? null;
|
|
238
|
+
const mappedTasks = localTasks.map(mapTask);
|
|
239
|
+
const tasksState = {
|
|
240
|
+
recentTaskIds: mappedTasks.map((task) => task.taskId),
|
|
241
|
+
stats: buildTaskStats(mappedTasks),
|
|
242
|
+
tasks: Object.fromEntries(mappedTasks.map((task) => [task.taskId, task])),
|
|
243
|
+
};
|
|
244
|
+
return {
|
|
245
|
+
company: {
|
|
246
|
+
id: repoContext.state?.companyId ?? null,
|
|
247
|
+
name: repoContext.state?.companyName ?? null,
|
|
248
|
+
},
|
|
249
|
+
generatedAt: new Date().toISOString(),
|
|
250
|
+
repo: {
|
|
251
|
+
pendingDrafts: pending.length,
|
|
252
|
+
pulledContext: pulled.length,
|
|
253
|
+
pulledFixes: fixes.length,
|
|
254
|
+
repoRoot: repoContext.repoRoot,
|
|
255
|
+
umDir: repoContext.umDir,
|
|
256
|
+
},
|
|
257
|
+
services: {
|
|
258
|
+
activeModel: configManager.config?.activeModel ?? null,
|
|
259
|
+
activeProvider: activeProvider ? `${activeProvider.name} (${activeProvider.kind})` : null,
|
|
260
|
+
connectorsInstalled: connectors.length,
|
|
261
|
+
connectorRuns: connectorRuns.length,
|
|
262
|
+
hubEntriesInstalled: hubEntries.length,
|
|
263
|
+
},
|
|
264
|
+
space: {
|
|
265
|
+
id: repoContext.state?.projectId ?? null,
|
|
266
|
+
name: repoContext.state?.projectName ?? null,
|
|
267
|
+
},
|
|
268
|
+
stores: {
|
|
269
|
+
connectors: connectorsStore,
|
|
270
|
+
contextTree: {
|
|
271
|
+
generatedAt: toEpoch(contextTree.generatedAt) ?? Date.now(),
|
|
272
|
+
nodes: buildNodeDepthMap(contextTree.nodes),
|
|
273
|
+
runtime: contextTree.runtime,
|
|
274
|
+
stats: contextTree.stats,
|
|
275
|
+
summaryHandle: contextTree.summaryHandle,
|
|
276
|
+
},
|
|
277
|
+
hub: hubStore,
|
|
278
|
+
model: modelStore,
|
|
279
|
+
provider: providerStore,
|
|
280
|
+
space: spaceStore,
|
|
281
|
+
tasks: tasksState,
|
|
282
|
+
transport: buildTransportSnapshot(transport),
|
|
283
|
+
},
|
|
284
|
+
vendorParityTargets: [
|
|
285
|
+
"tui/stores/transport-store",
|
|
286
|
+
"tui/features/tasks/tasks/stores/tasks-store",
|
|
287
|
+
"agent/infra/map/context-tree-store",
|
|
288
|
+
"tui/features/provider/provider/stores/provider-store",
|
|
289
|
+
"tui/features/model/model/stores/model-store",
|
|
290
|
+
"tui/features/space/space/api/get-spaces",
|
|
291
|
+
"tui/features/hub/hub",
|
|
292
|
+
"tui/features/connectors/connectors",
|
|
293
|
+
],
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
export async function buildVendorRuntimeBridgeSummary(cwd = process.cwd()) {
|
|
297
|
+
const snapshot = await buildVendorRuntimeBridgeSnapshot(cwd);
|
|
298
|
+
return {
|
|
299
|
+
company: snapshot.company.name ?? "Unlinked company",
|
|
300
|
+
repoRoot: snapshot.repo.repoRoot,
|
|
301
|
+
space: snapshot.space.name ?? "Unlinked space",
|
|
302
|
+
tasks: {
|
|
303
|
+
completed: snapshot.stores.tasks.stats.completed,
|
|
304
|
+
created: snapshot.stores.tasks.stats.created,
|
|
305
|
+
error: snapshot.stores.tasks.stats.error,
|
|
306
|
+
started: snapshot.stores.tasks.stats.started,
|
|
307
|
+
total: snapshot.stores.tasks.recentTaskIds.length,
|
|
308
|
+
},
|
|
309
|
+
transport: {
|
|
310
|
+
connectionState: snapshot.stores.transport.connectionState,
|
|
311
|
+
events: snapshot.stores.transport.eventCount,
|
|
312
|
+
queueDepth: snapshot.stores.transport.queue.length,
|
|
313
|
+
status: snapshot.stores.transport.status,
|
|
314
|
+
},
|
|
315
|
+
provider: {
|
|
316
|
+
active: snapshot.stores.provider.providers.find((provider) => provider.id === snapshot.stores.provider.activeProviderId)?.name ?? null,
|
|
317
|
+
count: snapshot.stores.provider.providers.length,
|
|
318
|
+
},
|
|
319
|
+
model: {
|
|
320
|
+
active: snapshot.stores.model.activeModel,
|
|
321
|
+
count: snapshot.stores.model.models.length,
|
|
322
|
+
},
|
|
323
|
+
spaces: {
|
|
324
|
+
active: snapshot.stores.space.activeSpaceName,
|
|
325
|
+
count: snapshot.stores.space.spaces.length,
|
|
326
|
+
},
|
|
327
|
+
hub: {
|
|
328
|
+
installed: snapshot.stores.hub.installed.length,
|
|
329
|
+
recent: snapshot.stores.hub.recentSlug,
|
|
330
|
+
},
|
|
331
|
+
connectors: {
|
|
332
|
+
installed: snapshot.stores.connectors.installed.length,
|
|
333
|
+
recent: snapshot.stores.connectors.recentSource,
|
|
334
|
+
runs: snapshot.stores.connectors.runs.length,
|
|
335
|
+
},
|
|
336
|
+
tree: {
|
|
337
|
+
nodes: snapshot.stores.contextTree.nodes.length,
|
|
338
|
+
runtimeProvider: snapshot.stores.contextTree.runtime.provider,
|
|
339
|
+
runtimeStatus: snapshot.stores.contextTree.runtime.transportStatus,
|
|
340
|
+
summaryHandle: snapshot.stores.contextTree.summaryHandle,
|
|
341
|
+
},
|
|
342
|
+
};
|
|
343
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type VendorBridgeRuntimeSnapshot } from "./byterover-runtime-bridge.js";
|
|
2
|
+
export declare const useUmbrellaTransportTaskBridgeStore: any;
|
|
3
|
+
export declare function hydrateUmbrellaTransportTaskBridgeFromSnapshot(snapshot: VendorBridgeRuntimeSnapshot): void;
|
|
4
|
+
export declare function hydrateUmbrellaTransportTaskBridge(cwd?: string): Promise<VendorBridgeRuntimeSnapshot>;
|
|
5
|
+
export declare function getUmbrellaTransportTaskBridgeSummary(): {
|
|
6
|
+
activeTaskId: any;
|
|
7
|
+
generatedAt: any;
|
|
8
|
+
isHydrated: any;
|
|
9
|
+
queueDepth: any;
|
|
10
|
+
recentTaskCount: any;
|
|
11
|
+
startedTasks: any;
|
|
12
|
+
transportStatus: any;
|
|
13
|
+
};
|