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.
Files changed (68) hide show
  1. package/bin/um.js +2 -0
  2. package/dist/adapters/byterover-context-runtime-store.d.ts +15 -0
  3. package/dist/adapters/byterover-context-runtime-store.js +57 -0
  4. package/dist/adapters/byterover-runtime-bridge.d.ts +218 -0
  5. package/dist/adapters/byterover-runtime-bridge.js +343 -0
  6. package/dist/adapters/byterover-transport-task-store.d.ts +13 -0
  7. package/dist/adapters/byterover-transport-task-store.js +50 -0
  8. package/dist/adapters/umbrella-onboarding.d.ts +27 -0
  9. package/dist/adapters/umbrella-onboarding.js +79 -0
  10. package/dist/adapters/umbrella-provider-runtime.d.ts +38 -0
  11. package/dist/adapters/umbrella-provider-runtime.js +199 -0
  12. package/dist/adapters/vendor-byterover.d.ts +4 -0
  13. package/dist/adapters/vendor-byterover.js +19 -0
  14. package/dist/commands/activity.d.ts +2 -0
  15. package/dist/commands/activity.js +82 -0
  16. package/dist/commands/bridge.d.ts +2 -0
  17. package/dist/commands/bridge.js +40 -0
  18. package/dist/commands/catalog.d.ts +34 -0
  19. package/dist/commands/catalog.js +234 -0
  20. package/dist/commands/connect.js +14 -14
  21. package/dist/commands/connectors.d.ts +24 -0
  22. package/dist/commands/connectors.js +626 -0
  23. package/dist/commands/curate.d.ts +1 -0
  24. package/dist/commands/curate.js +48 -3
  25. package/dist/commands/debug.d.ts +2 -0
  26. package/dist/commands/debug.js +55 -0
  27. package/dist/commands/fix.js +54 -0
  28. package/dist/commands/hub.d.ts +22 -0
  29. package/dist/commands/hub.js +487 -0
  30. package/dist/commands/interactive.d.ts +2 -0
  31. package/dist/commands/interactive.js +970 -62
  32. package/dist/commands/locations.d.ts +1 -0
  33. package/dist/commands/locations.js +15 -12
  34. package/dist/commands/logout.d.ts +2 -0
  35. package/dist/commands/logout.js +34 -0
  36. package/dist/commands/model.d.ts +11 -0
  37. package/dist/commands/model.js +225 -0
  38. package/dist/commands/providers.d.ts +17 -0
  39. package/dist/commands/providers.js +379 -0
  40. package/dist/commands/pull.js +60 -1
  41. package/dist/commands/push.js +62 -2
  42. package/dist/commands/reset.d.ts +2 -0
  43. package/dist/commands/reset.js +35 -0
  44. package/dist/commands/restart.d.ts +2 -0
  45. package/dist/commands/restart.js +21 -0
  46. package/dist/commands/search.js +65 -1
  47. package/dist/commands/session.d.ts +2 -0
  48. package/dist/commands/session.js +241 -0
  49. package/dist/commands/setup.js +58 -56
  50. package/dist/commands/space.d.ts +12 -0
  51. package/dist/commands/space.js +138 -42
  52. package/dist/commands/status.d.ts +29 -0
  53. package/dist/commands/status.js +120 -19
  54. package/dist/commands/tasks.d.ts +2 -0
  55. package/dist/commands/tasks.js +95 -0
  56. package/dist/commands/transport.d.ts +2 -0
  57. package/dist/commands/transport.js +88 -0
  58. package/dist/commands/tree.d.ts +2 -0
  59. package/dist/commands/tree.js +98 -0
  60. package/dist/commands/tui.d.ts +2 -0
  61. package/dist/commands/tui.js +1273 -0
  62. package/dist/config.d.ts +23 -0
  63. package/dist/config.js +69 -0
  64. package/dist/index.js +41 -5
  65. package/dist/repo-state.d.ts +227 -1
  66. package/dist/repo-state.js +920 -4
  67. package/dist/umbrella.js +29 -5
  68. package/package.json +11 -3
@@ -0,0 +1,50 @@
1
+ import { create } from "zustand";
2
+ import { buildVendorRuntimeBridgeSnapshot, } from "./byterover-runtime-bridge.js";
3
+ const emptyTasksState = {
4
+ recentTaskIds: [],
5
+ stats: {
6
+ cancelled: 0,
7
+ completed: 0,
8
+ created: 0,
9
+ error: 0,
10
+ started: 0,
11
+ },
12
+ tasks: {},
13
+ };
14
+ const initialTransportTaskState = {
15
+ generatedAt: null,
16
+ isHydrated: false,
17
+ taskStore: emptyTasksState,
18
+ transportStore: null,
19
+ };
20
+ export const useUmbrellaTransportTaskBridgeStore = create()((set) => ({
21
+ ...initialTransportTaskState,
22
+ hydrateFromSnapshot: (snapshot) => set({
23
+ generatedAt: snapshot.generatedAt,
24
+ isHydrated: true,
25
+ taskStore: snapshot.stores.tasks,
26
+ transportStore: snapshot.stores.transport,
27
+ }),
28
+ reset: () => set(initialTransportTaskState),
29
+ }));
30
+ export function hydrateUmbrellaTransportTaskBridgeFromSnapshot(snapshot) {
31
+ useUmbrellaTransportTaskBridgeStore.getState().hydrateFromSnapshot(snapshot);
32
+ }
33
+ export async function hydrateUmbrellaTransportTaskBridge(cwd = process.cwd()) {
34
+ const snapshot = await buildVendorRuntimeBridgeSnapshot(cwd);
35
+ hydrateUmbrellaTransportTaskBridgeFromSnapshot(snapshot);
36
+ return snapshot;
37
+ }
38
+ export function getUmbrellaTransportTaskBridgeSummary() {
39
+ const state = useUmbrellaTransportTaskBridgeStore.getState();
40
+ const transport = state.transportStore;
41
+ return {
42
+ activeTaskId: transport?.queue[0]?.id ?? transport?.queue.find((item) => item.status === "running")?.id ?? null,
43
+ generatedAt: state.generatedAt,
44
+ isHydrated: state.isHydrated,
45
+ queueDepth: transport?.queue.length ?? 0,
46
+ recentTaskCount: state.taskStore.recentTaskIds.length,
47
+ startedTasks: state.taskStore.stats.started,
48
+ transportStatus: transport?.status ?? "idle",
49
+ };
50
+ }
@@ -0,0 +1,27 @@
1
+ import { type UmbrellaCliSetup, type UmbrellaCompany, type UmbrellaContextSpace } from "../umbrella.js";
2
+ export type UmbrellaOnboardingServerCheck = {
3
+ companies: UmbrellaCompany[];
4
+ deploymentMode: "authenticated" | "local_trusted";
5
+ serverUrl: string;
6
+ };
7
+ export type UmbrellaOnboardingSignInResult = {
8
+ companies: UmbrellaCompany[];
9
+ cookie: string | null;
10
+ serverUrl: string;
11
+ };
12
+ export type UmbrellaOnboardingCompanyResult = {
13
+ company: UmbrellaCompany;
14
+ spaces: UmbrellaContextSpace[];
15
+ };
16
+ export type UmbrellaOnboardingSpaceResult = {
17
+ activeSpaceId: string | null;
18
+ spaces: UmbrellaContextSpace[];
19
+ };
20
+ export declare function normalizeUmbrellaServerUrl(value: string): string;
21
+ export declare function checkUmbrellaOnboardingServer(serverUrl: string): Promise<UmbrellaOnboardingServerCheck>;
22
+ export declare function signInUmbrellaOnboarding(serverUrl: string, email: string, password: string): Promise<UmbrellaOnboardingSignInResult>;
23
+ export declare function loadUmbrellaOnboardingSpaces(serverUrl: string, companyId: string, cookie?: string | null): Promise<UmbrellaContextSpace[]>;
24
+ export declare function createUmbrellaOnboardingCompany(serverUrl: string, name: string, cookie?: string | null): Promise<UmbrellaOnboardingCompanyResult>;
25
+ export declare function createUmbrellaOnboardingSpace(serverUrl: string, companyId: string, name: string, cookie?: string | null): Promise<UmbrellaOnboardingSpaceResult>;
26
+ export declare function saveUmbrellaDeviceLink(setup: UmbrellaCliSetup, umbrellaUrl: string, cwd?: string): Promise<void>;
27
+ export declare function connectUmbrellaDevice(serverUrl: string, companyId: string, spaceId?: string | null, cookie?: string | null, cwd?: string): Promise<UmbrellaCliSetup>;
@@ -0,0 +1,79 @@
1
+ import { configManager } from "../config.js";
2
+ import { ensureRepoContext } from "../repo-state.js";
3
+ import { createContextSpace, createUmbrellaCompany, getCliSetup, getCompanyContextSummary, getUmbrellaHealth, listUmbrellaCompanies, signInToUmbrella, toContextSpaces, } from "../umbrella.js";
4
+ export function normalizeUmbrellaServerUrl(value) {
5
+ return value.trim().replace(/\/+$/, "");
6
+ }
7
+ export async function checkUmbrellaOnboardingServer(serverUrl) {
8
+ const normalizedServerUrl = normalizeUmbrellaServerUrl(serverUrl);
9
+ const health = await getUmbrellaHealth(normalizedServerUrl);
10
+ if (health.deploymentMode === "authenticated") {
11
+ return {
12
+ companies: [],
13
+ deploymentMode: "authenticated",
14
+ serverUrl: normalizedServerUrl,
15
+ };
16
+ }
17
+ const companies = await listUmbrellaCompanies(normalizedServerUrl);
18
+ return {
19
+ companies,
20
+ deploymentMode: "local_trusted",
21
+ serverUrl: normalizedServerUrl,
22
+ };
23
+ }
24
+ export async function signInUmbrellaOnboarding(serverUrl, email, password) {
25
+ const normalizedServerUrl = normalizeUmbrellaServerUrl(serverUrl);
26
+ const session = await signInToUmbrella(normalizedServerUrl, email, password);
27
+ const companies = await listUmbrellaCompanies(normalizedServerUrl, session.cookie);
28
+ return {
29
+ companies,
30
+ cookie: session.cookie,
31
+ serverUrl: normalizedServerUrl,
32
+ };
33
+ }
34
+ export async function loadUmbrellaOnboardingSpaces(serverUrl, companyId, cookie) {
35
+ const summary = await getCompanyContextSummary(normalizeUmbrellaServerUrl(serverUrl), companyId, cookie);
36
+ return toContextSpaces(summary);
37
+ }
38
+ export async function createUmbrellaOnboardingCompany(serverUrl, name, cookie) {
39
+ const normalizedServerUrl = normalizeUmbrellaServerUrl(serverUrl);
40
+ const company = await createUmbrellaCompany(normalizedServerUrl, name, cookie);
41
+ const spaces = await loadUmbrellaOnboardingSpaces(normalizedServerUrl, company.id, cookie);
42
+ return { company, spaces };
43
+ }
44
+ export async function createUmbrellaOnboardingSpace(serverUrl, companyId, name, cookie) {
45
+ const normalizedServerUrl = normalizeUmbrellaServerUrl(serverUrl);
46
+ const summary = await createContextSpace(normalizedServerUrl, companyId, name, cookie);
47
+ return {
48
+ activeSpaceId: summary.activeProjectId,
49
+ spaces: toContextSpaces(summary),
50
+ };
51
+ }
52
+ export async function saveUmbrellaDeviceLink(setup, umbrellaUrl, cwd = process.cwd()) {
53
+ configManager.set({
54
+ umbrellaUrl,
55
+ serverUrl: setup.baseUrl,
56
+ companyId: setup.companyId,
57
+ companyName: setup.companyName,
58
+ workspaceId: setup.workspaceId,
59
+ workspaceName: setup.workspaceName,
60
+ projectId: setup.activeSpaceId,
61
+ projectName: setup.activeSpaceName,
62
+ apiKey: setup.apiKey,
63
+ });
64
+ configManager.upsertLocation({
65
+ repoRoot: cwd,
66
+ companyId: setup.companyId,
67
+ companyName: setup.companyName,
68
+ projectId: setup.activeSpaceId,
69
+ projectName: setup.activeSpaceName,
70
+ updatedAt: new Date().toISOString(),
71
+ });
72
+ await ensureRepoContext(configManager.config);
73
+ }
74
+ export async function connectUmbrellaDevice(serverUrl, companyId, spaceId, cookie, cwd = process.cwd()) {
75
+ const normalizedServerUrl = normalizeUmbrellaServerUrl(serverUrl);
76
+ const setup = await getCliSetup(normalizedServerUrl, companyId, spaceId, cookie);
77
+ await saveUmbrellaDeviceLink(setup, normalizedServerUrl, cwd);
78
+ return setup;
79
+ }
@@ -0,0 +1,38 @@
1
+ import { type SavedProvider } from "../config.js";
2
+ export declare const UMBRELLA_PROVIDER_CHOICES: Array<{
3
+ kind: string;
4
+ name: string;
5
+ }>;
6
+ export type ProviderConnectDraft = {
7
+ apiKey: string;
8
+ baseUrl: string;
9
+ kind: string | null;
10
+ label: string;
11
+ };
12
+ export declare function createEmptyProviderConnectDraft(): ProviderConnectDraft;
13
+ export declare function resolveSavedProvider(target?: string | null): SavedProvider | null;
14
+ export declare function getActiveSavedProvider(): SavedProvider | null;
15
+ export declare function getProviderRuntimeReadiness(): {
16
+ activeModel: string | null;
17
+ activeProvider: SavedProvider | null;
18
+ modelReady: boolean;
19
+ providerReady: boolean;
20
+ };
21
+ export declare function buildProviderDraftValue(draft: ProviderConnectDraft, mode: "connect-base-url" | "connect-key" | "connect-label"): string;
22
+ export declare function updateProviderDraftValue(draft: ProviderConnectDraft, mode: "connect-base-url" | "connect-key" | "connect-label", value: string): ProviderConnectDraft;
23
+ export declare function connectSavedProviderFromDraft(draft: ProviderConnectDraft): Promise<SavedProvider>;
24
+ export declare function switchActiveSavedProvider(target: string): Promise<SavedProvider | null>;
25
+ export declare function disconnectSavedProvider(target: string): Promise<{
26
+ activeProvider: SavedProvider | null;
27
+ removedProvider: SavedProvider;
28
+ } | null>;
29
+ export declare function inspectSavedProvider(target: string): Promise<SavedProvider | null>;
30
+ export declare function inspectRecentSavedProvider(target?: string | null): Promise<{
31
+ isActive: boolean;
32
+ provider: SavedProvider;
33
+ } | null>;
34
+ export declare function testActiveSavedProviderRuntime(): Promise<{
35
+ activeModel: string | null;
36
+ provider: SavedProvider;
37
+ runtimeReady: boolean;
38
+ } | null>;
@@ -0,0 +1,199 @@
1
+ import { randomUUID } from "crypto";
2
+ import { configManager } from "../config.js";
3
+ import { getSessionState, recordSessionEvent, recordSessionProvider, setSessionPanel } from "../repo-state.js";
4
+ export const UMBRELLA_PROVIDER_CHOICES = [
5
+ { kind: "anthropic", name: "Anthropic" },
6
+ { kind: "openai", name: "OpenAI" },
7
+ { kind: "google", name: "Google" },
8
+ { kind: "openrouter", name: "OpenRouter" },
9
+ { kind: "openai-compatible", name: "OpenAI-Compatible" },
10
+ ];
11
+ export function createEmptyProviderConnectDraft() {
12
+ return {
13
+ apiKey: "",
14
+ baseUrl: "",
15
+ kind: null,
16
+ label: "",
17
+ };
18
+ }
19
+ export function resolveSavedProvider(target) {
20
+ if (!target)
21
+ return null;
22
+ const normalized = target.toLowerCase();
23
+ return (configManager.providers.find((entry) => entry.id === target ||
24
+ entry.name.toLowerCase() === normalized ||
25
+ entry.kind.toLowerCase() === normalized) ?? null);
26
+ }
27
+ export function getActiveSavedProvider() {
28
+ const config = configManager.config;
29
+ const providers = configManager.providers;
30
+ return providers.find((entry) => entry.id === config?.activeProvider) ?? null;
31
+ }
32
+ export function getProviderRuntimeReadiness() {
33
+ const activeProvider = getActiveSavedProvider();
34
+ const activeModel = configManager.config?.activeModel ?? null;
35
+ return {
36
+ activeModel,
37
+ activeProvider,
38
+ modelReady: Boolean(activeProvider && activeModel),
39
+ providerReady: Boolean(activeProvider),
40
+ };
41
+ }
42
+ export function buildProviderDraftValue(draft, mode) {
43
+ if (mode === "connect-label")
44
+ return draft.label;
45
+ if (mode === "connect-key")
46
+ return draft.apiKey;
47
+ return draft.baseUrl;
48
+ }
49
+ export function updateProviderDraftValue(draft, mode, value) {
50
+ if (mode === "connect-label") {
51
+ return { ...draft, label: value };
52
+ }
53
+ if (mode === "connect-key") {
54
+ return { ...draft, apiKey: value };
55
+ }
56
+ return { ...draft, baseUrl: value };
57
+ }
58
+ export async function connectSavedProviderFromDraft(draft) {
59
+ const nextLabel = draft.label.trim();
60
+ const nextKey = draft.apiKey.trim();
61
+ const nextKind = draft.kind ?? "openai";
62
+ const nextBaseUrl = draft.baseUrl.trim();
63
+ if (!nextLabel) {
64
+ throw new Error("Type a provider label first.");
65
+ }
66
+ if (!nextKey) {
67
+ throw new Error("Paste an API key first.");
68
+ }
69
+ if (nextKind === "openai-compatible" && !nextBaseUrl) {
70
+ throw new Error("Type the compatible base URL first.");
71
+ }
72
+ const provider = {
73
+ apiKey: nextKey,
74
+ baseUrl: nextKind === "openai-compatible" ? nextBaseUrl : undefined,
75
+ id: randomUUID(),
76
+ kind: nextKind,
77
+ name: nextLabel,
78
+ updatedAt: new Date().toISOString(),
79
+ };
80
+ configManager.upsertProvider(provider);
81
+ configManager.set({
82
+ activeModel: undefined,
83
+ activeProvider: provider.id,
84
+ });
85
+ await setSessionPanel("providers", provider.id);
86
+ await recordSessionProvider(provider.id);
87
+ await recordSessionEvent({
88
+ detail: `${provider.name} is now the active provider for this device and needs a model next.`,
89
+ focus: provider.id,
90
+ kind: "provider",
91
+ panel: "providers",
92
+ status: "success",
93
+ title: `Connected provider ${provider.name}`,
94
+ });
95
+ return provider;
96
+ }
97
+ export async function switchActiveSavedProvider(target) {
98
+ const provider = resolveSavedProvider(target);
99
+ if (!provider)
100
+ return null;
101
+ configManager.set({ activeModel: undefined, activeProvider: provider.id });
102
+ await setSessionPanel("providers", provider.id);
103
+ await recordSessionProvider(provider.id);
104
+ await recordSessionEvent({
105
+ detail: "The active model was cleared so you can choose one for this provider.",
106
+ focus: provider.id,
107
+ kind: "provider",
108
+ panel: "providers",
109
+ status: "success",
110
+ title: `Switched active provider to ${provider.name}`,
111
+ });
112
+ return provider;
113
+ }
114
+ export async function disconnectSavedProvider(target) {
115
+ const provider = resolveSavedProvider(target);
116
+ if (!provider)
117
+ return null;
118
+ configManager.removeProvider(provider.id);
119
+ const activeProvider = getActiveSavedProvider();
120
+ await setSessionPanel("providers", provider.id);
121
+ await recordSessionEvent({
122
+ detail: activeProvider
123
+ ? `${activeProvider.name} is still available as the active provider.`
124
+ : "No active provider is left on this device.",
125
+ focus: provider.id,
126
+ kind: "provider",
127
+ panel: "providers",
128
+ status: "warning",
129
+ title: `Disconnected ${provider.name}`,
130
+ });
131
+ return { activeProvider, removedProvider: provider };
132
+ }
133
+ export async function inspectSavedProvider(target) {
134
+ const provider = resolveSavedProvider(target);
135
+ if (!provider)
136
+ return null;
137
+ const activeProviderId = configManager.config?.activeProvider;
138
+ await setSessionPanel("providers", provider.id);
139
+ await recordSessionProvider(provider.id);
140
+ await recordSessionEvent({
141
+ detail: `${provider.name} is ${provider.id === activeProviderId ? "the active provider" : "saved on this device but not active"}.`,
142
+ focus: provider.id,
143
+ kind: "provider",
144
+ panel: "providers",
145
+ status: "info",
146
+ title: `Inspected provider ${provider.name}`,
147
+ });
148
+ return provider;
149
+ }
150
+ export async function inspectRecentSavedProvider(target) {
151
+ const session = await getSessionState();
152
+ const recentId = target ?? session?.recentProviderIds?.[0] ?? null;
153
+ if (!recentId)
154
+ return null;
155
+ const provider = resolveSavedProvider(recentId);
156
+ if (!provider)
157
+ return null;
158
+ const activeProviderId = configManager.config?.activeProvider;
159
+ await setSessionPanel("providers", provider.id);
160
+ await recordSessionProvider(provider.id);
161
+ await recordSessionEvent({
162
+ detail: "Returned to the provider you touched most recently in this session.",
163
+ focus: provider.id,
164
+ kind: "provider",
165
+ panel: "providers",
166
+ status: "info",
167
+ title: `Re-opened recent provider ${provider.name}`,
168
+ });
169
+ return {
170
+ isActive: provider.id === activeProviderId,
171
+ provider,
172
+ };
173
+ }
174
+ export async function testActiveSavedProviderRuntime() {
175
+ const current = getActiveSavedProvider();
176
+ if (!current)
177
+ return null;
178
+ const activeModel = configManager.config?.activeModel ?? null;
179
+ const runtimeReady = Boolean(current.apiKey && activeModel);
180
+ await setSessionPanel("providers", current.id);
181
+ await recordSessionProvider(current.id);
182
+ await recordSessionEvent({
183
+ detail: runtimeReady
184
+ ? `${current.name} has both an API key and an active model.`
185
+ : !activeModel
186
+ ? `${current.name} is connected, but you still need to choose a model.`
187
+ : `${current.name} is missing the configuration needed to run.`,
188
+ focus: current.id,
189
+ kind: "provider",
190
+ panel: "providers",
191
+ status: runtimeReady ? "success" : "warning",
192
+ title: runtimeReady ? `Runtime ready for ${current.name}` : `Runtime incomplete for ${current.name}`,
193
+ });
194
+ return {
195
+ activeModel,
196
+ provider: current,
197
+ runtimeReady,
198
+ };
199
+ }
@@ -0,0 +1,4 @@
1
+ export declare const vendorByteRoverAdapterPlan: {
2
+ readonly importedSubsystems: readonly ["tui/features/provider", "tui/features/model", "tui/features/space", "tui/features/tasks", "tui/stores/transport-store", "agent/infra/map/context-tree-store", "agent/infra/map/map-shared", "agent/infra/map/llm-map-memory", "agent/infra/map/agentic-map-service"];
3
+ readonly umbrellaAdapterTargets: readonly ["Umbrella auth and company selection", "Umbrella server URLs and API calls", "repo-local .um state and transport persistence", "company/space naming and mapping"];
4
+ };
@@ -0,0 +1,19 @@
1
+ export const vendorByteRoverAdapterPlan = {
2
+ importedSubsystems: [
3
+ "tui/features/provider",
4
+ "tui/features/model",
5
+ "tui/features/space",
6
+ "tui/features/tasks",
7
+ "tui/stores/transport-store",
8
+ "agent/infra/map/context-tree-store",
9
+ "agent/infra/map/map-shared",
10
+ "agent/infra/map/llm-map-memory",
11
+ "agent/infra/map/agentic-map-service",
12
+ ],
13
+ umbrellaAdapterTargets: [
14
+ "Umbrella auth and company selection",
15
+ "Umbrella server URLs and API calls",
16
+ "repo-local .um state and transport persistence",
17
+ "company/space naming and mapping",
18
+ ],
19
+ };
@@ -0,0 +1,2 @@
1
+ export declare function activityCommandAction(): Promise<void>;
2
+ export declare function activityCommand(cli: any): void;
@@ -0,0 +1,82 @@
1
+ import chalk from "chalk";
2
+ import { ensureSessionState, getConnectorRuns, getPendingMemories, getPulledFixes, getPulledMemories, getTransportState, recordSessionEvent, setSessionPanel, } from "../repo-state.js";
3
+ function statusBadge(status) {
4
+ if (status === "success")
5
+ return chalk.green("success");
6
+ if (status === "warning")
7
+ return chalk.yellow("warning");
8
+ if (status === "failure")
9
+ return chalk.red("failure");
10
+ return chalk.cyan("info");
11
+ }
12
+ function toActivityRow(event) {
13
+ return {
14
+ at: event.at,
15
+ detail: event.detail ?? "No extra detail recorded.",
16
+ kind: event.kind,
17
+ status: event.status,
18
+ title: event.title,
19
+ };
20
+ }
21
+ function transportRow(event) {
22
+ return {
23
+ at: event.at,
24
+ detail: event.detail ?? "No extra detail recorded.",
25
+ kind: "transport",
26
+ status: event.status,
27
+ title: `${event.kind}: ${event.title}`,
28
+ };
29
+ }
30
+ export async function activityCommandAction() {
31
+ await setSessionPanel("activity", "feed");
32
+ const session = await ensureSessionState();
33
+ const pending = await getPendingMemories();
34
+ const pulled = await getPulledMemories();
35
+ const fixes = await getPulledFixes();
36
+ const connectorRuns = await getConnectorRuns();
37
+ const transport = await getTransportState();
38
+ const rows = [
39
+ ...(session.events ?? []).map(toActivityRow),
40
+ ...(transport.events ?? []).map(transportRow),
41
+ ...connectorRuns.slice(0, 8).map((run) => ({
42
+ at: run.ranAt,
43
+ detail: run.summary,
44
+ kind: "connector",
45
+ status: run.status,
46
+ title: `Connector run: ${run.connectorName}`,
47
+ })),
48
+ ]
49
+ .sort((a, b) => new Date(b.at).getTime() - new Date(a.at).getTime())
50
+ .slice(0, 12);
51
+ await recordSessionEvent({
52
+ kind: "session",
53
+ title: "Opened the activity feed",
54
+ detail: `Viewed ${rows.length} recent timeline item${rows.length === 1 ? "" : "s"} for this repo.`,
55
+ panel: "activity",
56
+ focus: "feed",
57
+ status: "info",
58
+ });
59
+ console.log(chalk.bold("\n Activity Feed\n"));
60
+ console.log(` Pending local drafts: ${pending.length}`);
61
+ console.log(` Pulled context notes: ${pulled.length}`);
62
+ console.log(` Pulled known fixes: ${fixes.length}`);
63
+ console.log(` Connector runs saved: ${connectorRuns.length}`);
64
+ console.log(` Transport events saved: ${transport.events.length}`);
65
+ console.log("");
66
+ if (rows.length === 0) {
67
+ console.log(chalk.gray(" No activity has been recorded for this repo yet."));
68
+ console.log("");
69
+ return;
70
+ }
71
+ rows.forEach((row, index) => {
72
+ console.log(` ${index + 1}. [${row.kind}] ${row.title}`);
73
+ console.log(chalk.gray(` ${new Date(row.at).toLocaleString()} | ${statusBadge(row.status)}`));
74
+ console.log(chalk.gray(` ${row.detail}`));
75
+ });
76
+ console.log("");
77
+ }
78
+ export function activityCommand(cli) {
79
+ cli.command("activity", "Show the latest repo activity feed for Context work").action(async () => {
80
+ await activityCommandAction();
81
+ });
82
+ }
@@ -0,0 +1,2 @@
1
+ export declare function bridgeCommandAction(action?: string): Promise<void>;
2
+ export declare function bridgeCommand(cli: any): void;
@@ -0,0 +1,40 @@
1
+ import chalk from "chalk";
2
+ import { buildVendorRuntimeBridgeSnapshot, buildVendorRuntimeBridgeSummary, } from "../adapters/byterover-runtime-bridge.js";
3
+ import { setSessionPanel } from "../repo-state.js";
4
+ export async function bridgeCommandAction(action) {
5
+ const mode = (action ?? "summary").toLowerCase();
6
+ await setSessionPanel("bridge", mode);
7
+ if (mode === "json" || mode === "snapshot") {
8
+ const snapshot = await buildVendorRuntimeBridgeSnapshot();
9
+ console.log(JSON.stringify(snapshot, null, 2));
10
+ return;
11
+ }
12
+ const summary = await buildVendorRuntimeBridgeSummary();
13
+ console.log(chalk.bold("\n ByteRover Runtime Bridge\n"));
14
+ console.log(` Company: ${summary.company}`);
15
+ console.log(` Space: ${summary.space}`);
16
+ console.log(` Repo: ${summary.repoRoot}`);
17
+ console.log("");
18
+ console.log(chalk.cyan(" Task Store"));
19
+ console.log(` total=${summary.tasks.total} created=${summary.tasks.created} started=${summary.tasks.started} completed=${summary.tasks.completed} error=${summary.tasks.error}`);
20
+ console.log(chalk.cyan(" Transport Store"));
21
+ console.log(` status=${summary.transport.status} connection=${summary.transport.connectionState} queue=${summary.transport.queueDepth} events=${summary.transport.events}`);
22
+ console.log(chalk.cyan(" Provider Store"));
23
+ console.log(` active=${summary.provider.active ?? "none"} providers=${summary.provider.count}`);
24
+ console.log(chalk.cyan(" Model Store"));
25
+ console.log(` active=${summary.model.active ?? "none"} models=${summary.model.count}`);
26
+ console.log(chalk.cyan(" Space Store"));
27
+ console.log(` active=${summary.spaces.active ?? "none"} spaces=${summary.spaces.count}`);
28
+ console.log(chalk.cyan(" Context Tree Store"));
29
+ console.log(` nodes=${summary.tree.nodes} transport=${summary.tree.runtimeStatus}`);
30
+ console.log(` provider=${summary.tree.runtimeProvider ?? "none"}`);
31
+ console.log("");
32
+ console.log(chalk.gray(" Use `umbrella-context bridge json` to inspect the full projected upstream-shaped snapshot."));
33
+ }
34
+ export function bridgeCommand(cli) {
35
+ cli
36
+ .command("bridge [action]", "Project the local .um runtime into ByteRover-shaped store snapshots")
37
+ .action(async (action) => {
38
+ await bridgeCommandAction(action);
39
+ });
40
+ }
@@ -0,0 +1,34 @@
1
+ import type { AgentMemoryConfig } from "../config.js";
2
+ export type InteractiveContext = {
3
+ config: AgentMemoryConfig;
4
+ handleFix: (error: string, config: AgentMemoryConfig) => Promise<void>;
5
+ handleRecord: (parts: string[], config: AgentMemoryConfig) => Promise<void>;
6
+ handleSpaces: (config: AgentMemoryConfig) => Promise<void>;
7
+ handleHome: (config: AgentMemoryConfig) => Promise<void>;
8
+ handleRecent: (config: AgentMemoryConfig) => Promise<void>;
9
+ handleTimeline: () => Promise<void>;
10
+ handleActivity: () => Promise<void>;
11
+ handleHistory: () => Promise<void>;
12
+ handleSession: () => Promise<void>;
13
+ handleNewSession: () => Promise<void>;
14
+ handleRestart: () => Promise<void>;
15
+ handleDebug: () => Promise<void>;
16
+ handleLogout: () => Promise<void>;
17
+ handlePanel: () => Promise<void>;
18
+ handleContinue: () => Promise<void>;
19
+ };
20
+ export type CommandSpec = {
21
+ key: string;
22
+ usage: string;
23
+ description: string;
24
+ aliases?: string[];
25
+ action: (args: string[], context: InteractiveContext) => Promise<void>;
26
+ };
27
+ export declare const COMMAND_SPECS: CommandSpec[];
28
+ export declare function parseInteractiveInput(input: string): {
29
+ command: string;
30
+ args: string[];
31
+ raw: string;
32
+ };
33
+ export declare function resolveCommand(name: string): CommandSpec | null;
34
+ export declare function renderCommandList(): string;