@clinebot/core 0.0.0

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 (200) hide show
  1. package/README.md +88 -0
  2. package/dist/account/cline-account-service.d.ts +34 -0
  3. package/dist/account/index.d.ts +3 -0
  4. package/dist/account/rpc.d.ts +38 -0
  5. package/dist/account/types.d.ts +74 -0
  6. package/dist/agents/agent-config-loader.d.ts +18 -0
  7. package/dist/agents/agent-config-parser.d.ts +25 -0
  8. package/dist/agents/hooks-config-loader.d.ts +23 -0
  9. package/dist/agents/index.d.ts +11 -0
  10. package/dist/agents/plugin-config-loader.d.ts +22 -0
  11. package/dist/agents/plugin-loader.d.ts +9 -0
  12. package/dist/agents/plugin-sandbox.d.ts +12 -0
  13. package/dist/agents/unified-config-file-watcher.d.ts +77 -0
  14. package/dist/agents/user-instruction-config-loader.d.ts +63 -0
  15. package/dist/auth/client.d.ts +11 -0
  16. package/dist/auth/cline.d.ts +41 -0
  17. package/dist/auth/codex.d.ts +39 -0
  18. package/dist/auth/oca.d.ts +22 -0
  19. package/dist/auth/server.d.ts +22 -0
  20. package/dist/auth/types.d.ts +72 -0
  21. package/dist/auth/utils.d.ts +32 -0
  22. package/dist/chat/chat-schema.d.ts +145 -0
  23. package/dist/default-tools/constants.d.ts +23 -0
  24. package/dist/default-tools/definitions.d.ts +96 -0
  25. package/dist/default-tools/executors/apply-patch-parser.d.ts +68 -0
  26. package/dist/default-tools/executors/apply-patch.d.ts +26 -0
  27. package/dist/default-tools/executors/bash.d.ts +49 -0
  28. package/dist/default-tools/executors/editor.d.ts +31 -0
  29. package/dist/default-tools/executors/file-read.d.ts +40 -0
  30. package/dist/default-tools/executors/index.d.ts +44 -0
  31. package/dist/default-tools/executors/search.d.ts +50 -0
  32. package/dist/default-tools/executors/web-fetch.d.ts +58 -0
  33. package/dist/default-tools/index.d.ts +57 -0
  34. package/dist/default-tools/presets.d.ts +124 -0
  35. package/dist/default-tools/schemas.d.ts +121 -0
  36. package/dist/default-tools/types.d.ts +237 -0
  37. package/dist/index.d.ts +23 -0
  38. package/dist/index.js +220 -0
  39. package/dist/input/file-indexer.d.ts +5 -0
  40. package/dist/input/index.d.ts +4 -0
  41. package/dist/input/mention-enricher.d.ts +12 -0
  42. package/dist/mcp/config-loader.d.ts +15 -0
  43. package/dist/mcp/index.d.ts +4 -0
  44. package/dist/mcp/manager.d.ts +24 -0
  45. package/dist/mcp/types.d.ts +66 -0
  46. package/dist/runtime/hook-file-hooks.d.ts +18 -0
  47. package/dist/runtime/rules.d.ts +5 -0
  48. package/dist/runtime/runtime-builder.d.ts +5 -0
  49. package/dist/runtime/sandbox/subprocess-sandbox.d.ts +19 -0
  50. package/dist/runtime/session-runtime.d.ts +36 -0
  51. package/dist/runtime/tool-approval.d.ts +9 -0
  52. package/dist/runtime/workflows.d.ts +13 -0
  53. package/dist/server/index.d.ts +47 -0
  54. package/dist/server/index.js +641 -0
  55. package/dist/session/default-session-manager.d.ts +77 -0
  56. package/dist/session/rpc-session-service.d.ts +12 -0
  57. package/dist/session/runtime-oauth-token-manager.d.ts +28 -0
  58. package/dist/session/session-artifacts.d.ts +19 -0
  59. package/dist/session/session-graph.d.ts +15 -0
  60. package/dist/session/session-host.d.ts +21 -0
  61. package/dist/session/session-manager.d.ts +50 -0
  62. package/dist/session/session-manifest.d.ts +30 -0
  63. package/dist/session/session-service.d.ts +113 -0
  64. package/dist/session/sqlite-rpc-session-backend.d.ts +30 -0
  65. package/dist/session/unified-session-persistence-service.d.ts +93 -0
  66. package/dist/session/workspace-manager.d.ts +28 -0
  67. package/dist/session/workspace-manifest.d.ts +25 -0
  68. package/dist/storage/provider-settings-legacy-migration.d.ts +13 -0
  69. package/dist/storage/provider-settings-manager.d.ts +20 -0
  70. package/dist/storage/sqlite-session-store.d.ts +29 -0
  71. package/dist/storage/sqlite-team-store.d.ts +31 -0
  72. package/dist/storage/team-store.d.ts +2 -0
  73. package/dist/team/index.d.ts +1 -0
  74. package/dist/team/projections.d.ts +8 -0
  75. package/dist/types/common.d.ts +10 -0
  76. package/dist/types/config.d.ts +37 -0
  77. package/dist/types/events.d.ts +54 -0
  78. package/dist/types/provider-settings.d.ts +20 -0
  79. package/dist/types/sessions.d.ts +9 -0
  80. package/dist/types/storage.d.ts +37 -0
  81. package/dist/types/workspace.d.ts +7 -0
  82. package/dist/types.d.ts +26 -0
  83. package/package.json +63 -0
  84. package/src/account/cline-account-service.test.ts +101 -0
  85. package/src/account/cline-account-service.ts +267 -0
  86. package/src/account/index.ts +20 -0
  87. package/src/account/rpc.test.ts +62 -0
  88. package/src/account/rpc.ts +172 -0
  89. package/src/account/types.ts +80 -0
  90. package/src/agents/agent-config-loader.test.ts +234 -0
  91. package/src/agents/agent-config-loader.ts +107 -0
  92. package/src/agents/agent-config-parser.ts +191 -0
  93. package/src/agents/hooks-config-loader.ts +97 -0
  94. package/src/agents/index.ts +84 -0
  95. package/src/agents/plugin-config-loader.test.ts +91 -0
  96. package/src/agents/plugin-config-loader.ts +160 -0
  97. package/src/agents/plugin-loader.test.ts +102 -0
  98. package/src/agents/plugin-loader.ts +105 -0
  99. package/src/agents/plugin-sandbox.test.ts +120 -0
  100. package/src/agents/plugin-sandbox.ts +471 -0
  101. package/src/agents/unified-config-file-watcher.test.ts +196 -0
  102. package/src/agents/unified-config-file-watcher.ts +483 -0
  103. package/src/agents/user-instruction-config-loader.test.ts +158 -0
  104. package/src/agents/user-instruction-config-loader.ts +438 -0
  105. package/src/auth/client.test.ts +40 -0
  106. package/src/auth/client.ts +25 -0
  107. package/src/auth/cline.test.ts +130 -0
  108. package/src/auth/cline.ts +414 -0
  109. package/src/auth/codex.test.ts +170 -0
  110. package/src/auth/codex.ts +466 -0
  111. package/src/auth/oca.test.ts +215 -0
  112. package/src/auth/oca.ts +546 -0
  113. package/src/auth/server.ts +216 -0
  114. package/src/auth/types.ts +78 -0
  115. package/src/auth/utils.test.ts +128 -0
  116. package/src/auth/utils.ts +247 -0
  117. package/src/chat/chat-schema.ts +82 -0
  118. package/src/default-tools/constants.ts +35 -0
  119. package/src/default-tools/definitions.test.ts +233 -0
  120. package/src/default-tools/definitions.ts +632 -0
  121. package/src/default-tools/executors/apply-patch-parser.ts +520 -0
  122. package/src/default-tools/executors/apply-patch.ts +359 -0
  123. package/src/default-tools/executors/bash.ts +205 -0
  124. package/src/default-tools/executors/editor.ts +231 -0
  125. package/src/default-tools/executors/file-read.test.ts +25 -0
  126. package/src/default-tools/executors/file-read.ts +94 -0
  127. package/src/default-tools/executors/index.ts +75 -0
  128. package/src/default-tools/executors/search.ts +278 -0
  129. package/src/default-tools/executors/web-fetch.ts +259 -0
  130. package/src/default-tools/index.ts +161 -0
  131. package/src/default-tools/presets.test.ts +63 -0
  132. package/src/default-tools/presets.ts +168 -0
  133. package/src/default-tools/schemas.ts +228 -0
  134. package/src/default-tools/types.ts +324 -0
  135. package/src/index.ts +119 -0
  136. package/src/input/file-indexer.d.ts +11 -0
  137. package/src/input/file-indexer.test.ts +87 -0
  138. package/src/input/file-indexer.ts +280 -0
  139. package/src/input/index.ts +7 -0
  140. package/src/input/mention-enricher.test.ts +82 -0
  141. package/src/input/mention-enricher.ts +119 -0
  142. package/src/mcp/config-loader.test.ts +238 -0
  143. package/src/mcp/config-loader.ts +219 -0
  144. package/src/mcp/index.ts +26 -0
  145. package/src/mcp/manager.test.ts +106 -0
  146. package/src/mcp/manager.ts +262 -0
  147. package/src/mcp/types.ts +88 -0
  148. package/src/runtime/hook-file-hooks.test.ts +106 -0
  149. package/src/runtime/hook-file-hooks.ts +736 -0
  150. package/src/runtime/index.ts +27 -0
  151. package/src/runtime/rules.ts +34 -0
  152. package/src/runtime/runtime-builder.team-persistence.test.ts +203 -0
  153. package/src/runtime/runtime-builder.test.ts +215 -0
  154. package/src/runtime/runtime-builder.ts +515 -0
  155. package/src/runtime/runtime-parity.test.ts +132 -0
  156. package/src/runtime/sandbox/subprocess-sandbox.ts +207 -0
  157. package/src/runtime/session-runtime.ts +44 -0
  158. package/src/runtime/tool-approval.ts +104 -0
  159. package/src/runtime/workflows.test.ts +119 -0
  160. package/src/runtime/workflows.ts +54 -0
  161. package/src/server/index.ts +282 -0
  162. package/src/session/default-session-manager.e2e.test.ts +354 -0
  163. package/src/session/default-session-manager.test.ts +816 -0
  164. package/src/session/default-session-manager.ts +1286 -0
  165. package/src/session/index.ts +37 -0
  166. package/src/session/rpc-session-service.ts +189 -0
  167. package/src/session/runtime-oauth-token-manager.test.ts +137 -0
  168. package/src/session/runtime-oauth-token-manager.ts +265 -0
  169. package/src/session/session-artifacts.ts +106 -0
  170. package/src/session/session-graph.ts +90 -0
  171. package/src/session/session-host.ts +190 -0
  172. package/src/session/session-manager.ts +56 -0
  173. package/src/session/session-manifest.ts +29 -0
  174. package/src/session/session-service.team-persistence.test.ts +48 -0
  175. package/src/session/session-service.ts +610 -0
  176. package/src/session/sqlite-rpc-session-backend.ts +303 -0
  177. package/src/session/unified-session-persistence-service.ts +781 -0
  178. package/src/session/workspace-manager.ts +98 -0
  179. package/src/session/workspace-manifest.ts +100 -0
  180. package/src/storage/artifact-store.ts +1 -0
  181. package/src/storage/index.ts +11 -0
  182. package/src/storage/provider-settings-legacy-migration.test.ts +175 -0
  183. package/src/storage/provider-settings-legacy-migration.ts +637 -0
  184. package/src/storage/provider-settings-manager.test.ts +111 -0
  185. package/src/storage/provider-settings-manager.ts +129 -0
  186. package/src/storage/session-store.ts +1 -0
  187. package/src/storage/sqlite-session-store.ts +270 -0
  188. package/src/storage/sqlite-team-store.ts +443 -0
  189. package/src/storage/team-store.ts +5 -0
  190. package/src/team/index.ts +4 -0
  191. package/src/team/projections.ts +285 -0
  192. package/src/types/common.ts +14 -0
  193. package/src/types/config.ts +64 -0
  194. package/src/types/events.ts +46 -0
  195. package/src/types/index.ts +24 -0
  196. package/src/types/provider-settings.ts +43 -0
  197. package/src/types/sessions.ts +16 -0
  198. package/src/types/storage.ts +64 -0
  199. package/src/types/workspace.ts +7 -0
  200. package/src/types.ts +127 -0
@@ -0,0 +1,77 @@
1
+ import { Agent, type AgentConfig, type AgentResult, type ToolApprovalRequest, type ToolApprovalResult } from "@clinebot/agents";
2
+ import type { providers as LlmsProviders } from "@clinebot/llms";
3
+ import { type ToolExecutors } from "../default-tools";
4
+ import type { RuntimeBuilder } from "../runtime/session-runtime";
5
+ import { ProviderSettingsManager } from "../storage/provider-settings-manager";
6
+ import type { CoreSessionEvent } from "../types/events";
7
+ import type { SessionRecord } from "../types/sessions";
8
+ import type { RpcCoreSessionService } from "./rpc-session-service";
9
+ import { RuntimeOAuthTokenManager } from "./runtime-oauth-token-manager";
10
+ import type { SendSessionInput, SessionManager, StartSessionInput, StartSessionResult } from "./session-manager";
11
+ import type { CoreSessionService } from "./session-service";
12
+ type SessionBackend = CoreSessionService | RpcCoreSessionService;
13
+ export interface DefaultSessionManagerOptions {
14
+ distinctId: string;
15
+ sessionService: SessionBackend;
16
+ runtimeBuilder?: RuntimeBuilder;
17
+ createAgent?: (config: AgentConfig) => Agent;
18
+ defaultToolExecutors?: Partial<ToolExecutors>;
19
+ toolPolicies?: AgentConfig["toolPolicies"];
20
+ providerSettingsManager?: ProviderSettingsManager;
21
+ oauthTokenManager?: RuntimeOAuthTokenManager;
22
+ requestToolApproval?: (request: ToolApprovalRequest) => Promise<ToolApprovalResult>;
23
+ }
24
+ export declare class DefaultSessionManager implements SessionManager {
25
+ private readonly sessionService;
26
+ private readonly runtimeBuilder;
27
+ private readonly createAgentInstance;
28
+ private readonly defaultToolExecutors?;
29
+ private readonly defaultToolPolicies?;
30
+ private readonly providerSettingsManager;
31
+ private readonly oauthTokenManager;
32
+ private readonly defaultRequestToolApproval?;
33
+ private readonly listeners;
34
+ private readonly sessions;
35
+ constructor(options: DefaultSessionManagerOptions);
36
+ private resolveStoredProviderSettings;
37
+ private buildResolvedProviderConfig;
38
+ start(input: StartSessionInput): Promise<StartSessionResult>;
39
+ send(input: SendSessionInput): Promise<AgentResult | undefined>;
40
+ abort(sessionId: string): Promise<void>;
41
+ stop(sessionId: string): Promise<void>;
42
+ dispose(reason?: string): Promise<void>;
43
+ get(sessionId: string): Promise<SessionRecord | undefined>;
44
+ list(limit?: number): Promise<SessionRecord[]>;
45
+ delete(sessionId: string): Promise<boolean>;
46
+ readTranscript(sessionId: string, maxChars?: number): Promise<string>;
47
+ readMessages(sessionId: string): Promise<LlmsProviders.Message[]>;
48
+ readHooks(sessionId: string, limit?: number): Promise<unknown[]>;
49
+ subscribe(listener: (event: CoreSessionEvent) => void): () => void;
50
+ private runTurn;
51
+ private executeAgentTurn;
52
+ private prepareTurnInput;
53
+ private resolveAbsoluteFilePaths;
54
+ private ensureSessionPersisted;
55
+ private finalizeSingleRun;
56
+ private failSession;
57
+ private shutdownSession;
58
+ private updateStatus;
59
+ private emitStatus;
60
+ private listRows;
61
+ private getRow;
62
+ private createSpawnTool;
63
+ private handleTeamEvent;
64
+ private hasPendingTeamRunWork;
65
+ private shouldAutoContinueTeamRuns;
66
+ private notifyTeamRunWaiters;
67
+ private waitForTeamRunUpdates;
68
+ private buildTeamRunContinuationPrompt;
69
+ private emit;
70
+ private invoke;
71
+ private invokeOptional;
72
+ private invokeOptionalValue;
73
+ private runWithAuthRetry;
74
+ private isLikelyAuthError;
75
+ private syncOAuthCredentials;
76
+ }
77
+ export {};
@@ -0,0 +1,12 @@
1
+ import { UnifiedSessionPersistenceService } from "./unified-session-persistence-service";
2
+ export interface RpcCoreSessionServiceOptions {
3
+ address?: string;
4
+ sessionsDir: string;
5
+ }
6
+ export declare class RpcCoreSessionService extends UnifiedSessionPersistenceService {
7
+ private readonly sessionsDirPath;
8
+ private readonly client;
9
+ constructor(options: RpcCoreSessionServiceOptions);
10
+ ensureSessionsDir(): string;
11
+ close(): void;
12
+ }
@@ -0,0 +1,28 @@
1
+ import { ProviderSettingsManager } from "../storage/provider-settings-manager";
2
+ declare const MANAGED_OAUTH_PROVIDERS: readonly ["cline", "oca", "openai-codex"];
3
+ type ManagedOAuthProviderId = (typeof MANAGED_OAUTH_PROVIDERS)[number];
4
+ export declare class OAuthReauthRequiredError extends Error {
5
+ readonly providerId: ManagedOAuthProviderId;
6
+ constructor(providerId: ManagedOAuthProviderId);
7
+ }
8
+ export type RuntimeOAuthResolution = {
9
+ providerId: ManagedOAuthProviderId;
10
+ apiKey: string;
11
+ accountId?: string;
12
+ refreshed: boolean;
13
+ };
14
+ export declare class RuntimeOAuthTokenManager {
15
+ private readonly providerSettingsManager;
16
+ private readonly refreshInFlight;
17
+ constructor(options?: {
18
+ providerSettingsManager?: ProviderSettingsManager;
19
+ });
20
+ resolveProviderApiKey(input: {
21
+ providerId: string;
22
+ forceRefresh?: boolean;
23
+ }): Promise<RuntimeOAuthResolution | null>;
24
+ private resolveWithSingleFlight;
25
+ private resolveProviderApiKeyInternal;
26
+ private resolveCredentials;
27
+ }
28
+ export {};
@@ -0,0 +1,19 @@
1
+ export declare function nowIso(): string;
2
+ export declare function unlinkIfExists(path: string | null | undefined): void;
3
+ export interface SessionArtifactPaths {
4
+ transcriptPath: string;
5
+ hookPath: string;
6
+ messagesPath: string;
7
+ }
8
+ export declare class SessionArtifacts {
9
+ private readonly ensureSessionsDir;
10
+ constructor(ensureSessionsDir: () => string);
11
+ sessionArtifactsDir(sessionId: string): string;
12
+ ensureSessionArtifactsDir(sessionId: string): string;
13
+ sessionTranscriptPath(sessionId: string): string;
14
+ sessionHookPath(sessionId: string): string;
15
+ sessionMessagesPath(sessionId: string): string;
16
+ sessionManifestPath(sessionId: string, ensureDir?: boolean): string;
17
+ removeSessionDirIfEmpty(sessionId: string): void;
18
+ subagentArtifactPaths(sessionId: string, subAgentId: string, activeTeamTaskSessionId?: string): SessionArtifactPaths;
19
+ }
@@ -0,0 +1,15 @@
1
+ import type { HookEventPayload } from "@clinebot/agents";
2
+ import type { SessionStatus } from "../types/common";
3
+ export declare function sanitizeSessionToken(value: string): string;
4
+ export declare function makeSubSessionId(rootSessionId: string, agentId: string): string;
5
+ export declare function makeTeamTaskSubSessionId(rootSessionId: string, agentId: string): string;
6
+ export declare function parseTeamTaskSubSessionId(sessionId: string): {
7
+ rootSessionId: string;
8
+ agentId: string;
9
+ teamTaskId: string;
10
+ } | null;
11
+ export declare function parseSubSessionId(sessionId: string): {
12
+ rootSessionId: string;
13
+ agentId: string;
14
+ } | null;
15
+ export declare function deriveSubsessionStatus(event: HookEventPayload): SessionStatus;
@@ -0,0 +1,21 @@
1
+ import type { AgentConfig, ToolApprovalRequest, ToolApprovalResult } from "@clinebot/agents";
2
+ import type { ToolExecutors } from "../default-tools";
3
+ import { RpcCoreSessionService } from "./rpc-session-service";
4
+ import type { SessionManager } from "./session-manager";
5
+ import { CoreSessionService } from "./session-service";
6
+ type SessionBackend = RpcCoreSessionService | CoreSessionService;
7
+ export interface CreateSessionHostOptions {
8
+ distinctId?: string;
9
+ sessionService?: SessionBackend;
10
+ backendMode?: "auto" | "rpc" | "local";
11
+ rpcAddress?: string;
12
+ autoStartRpcServer?: boolean;
13
+ rpcConnectAttempts?: number;
14
+ rpcConnectDelayMs?: number;
15
+ defaultToolExecutors?: Partial<ToolExecutors>;
16
+ toolPolicies?: AgentConfig["toolPolicies"];
17
+ requestToolApproval?: (request: ToolApprovalRequest) => Promise<ToolApprovalResult>;
18
+ }
19
+ export type SessionHost = SessionManager;
20
+ export declare function createSessionHost(options: CreateSessionHostOptions): Promise<SessionHost>;
21
+ export {};
@@ -0,0 +1,50 @@
1
+ import type { AgentResult } from "@clinebot/agents";
2
+ import type { providers as LlmsProviders } from "@clinebot/llms";
3
+ import type { SessionSource } from "../types/common";
4
+ import type { CoreSessionConfig } from "../types/config";
5
+ import type { CoreSessionEvent } from "../types/events";
6
+ import type { SessionRecord } from "../types/sessions";
7
+ import type { SessionManifest } from "./session-manifest";
8
+ export interface StartSessionInput {
9
+ config: CoreSessionConfig;
10
+ source?: SessionSource;
11
+ prompt?: string;
12
+ interactive?: boolean;
13
+ initialMessages?: LlmsProviders.Message[];
14
+ userImages?: string[];
15
+ userFiles?: string[];
16
+ userInstructionWatcher?: import("../agents").UserInstructionConfigWatcher;
17
+ onTeamRestored?: () => void;
18
+ defaultToolExecutors?: Partial<import("../default-tools").ToolExecutors>;
19
+ toolPolicies?: import("@clinebot/agents").AgentConfig["toolPolicies"];
20
+ requestToolApproval?: (request: import("@clinebot/agents").ToolApprovalRequest) => Promise<import("@clinebot/agents").ToolApprovalResult>;
21
+ }
22
+ export interface StartSessionResult {
23
+ sessionId: string;
24
+ manifest: SessionManifest;
25
+ manifestPath: string;
26
+ transcriptPath: string;
27
+ hookPath: string;
28
+ messagesPath: string;
29
+ result?: AgentResult;
30
+ }
31
+ export interface SendSessionInput {
32
+ sessionId: string;
33
+ prompt: string;
34
+ userImages?: string[];
35
+ userFiles?: string[];
36
+ }
37
+ export interface SessionManager {
38
+ start(input: StartSessionInput): Promise<StartSessionResult>;
39
+ send(input: SendSessionInput): Promise<AgentResult | undefined>;
40
+ abort(sessionId: string): Promise<void>;
41
+ stop(sessionId: string): Promise<void>;
42
+ dispose(reason?: string): Promise<void>;
43
+ get(sessionId: string): Promise<SessionRecord | undefined>;
44
+ list(limit?: number): Promise<SessionRecord[]>;
45
+ delete(sessionId: string): Promise<boolean>;
46
+ readMessages(sessionId: string): Promise<LlmsProviders.Message[]>;
47
+ readTranscript(sessionId: string, maxChars?: number): Promise<string>;
48
+ readHooks(sessionId: string, limit?: number): Promise<unknown[]>;
49
+ subscribe(listener: (event: CoreSessionEvent) => void): () => void;
50
+ }
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ import { SessionSource } from "../types/common";
3
+ export declare const SessionManifestSchema: z.ZodObject<{
4
+ version: z.ZodLiteral<1>;
5
+ session_id: z.ZodString;
6
+ source: z.ZodEnum<typeof SessionSource>;
7
+ pid: z.ZodNumber;
8
+ started_at: z.ZodString;
9
+ ended_at: z.ZodOptional<z.ZodString>;
10
+ exit_code: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
11
+ status: z.ZodEnum<{
12
+ running: "running";
13
+ completed: "completed";
14
+ cancelled: "cancelled";
15
+ failed: "failed";
16
+ }>;
17
+ interactive: z.ZodBoolean;
18
+ provider: z.ZodString;
19
+ model: z.ZodString;
20
+ cwd: z.ZodString;
21
+ workspace_root: z.ZodString;
22
+ team_name: z.ZodOptional<z.ZodString>;
23
+ enable_tools: z.ZodBoolean;
24
+ enable_spawn: z.ZodBoolean;
25
+ enable_teams: z.ZodBoolean;
26
+ prompt: z.ZodOptional<z.ZodString>;
27
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
28
+ messages_path: z.ZodOptional<z.ZodString>;
29
+ }, z.core.$strip>;
30
+ export type SessionManifest = z.infer<typeof SessionManifestSchema>;
@@ -0,0 +1,113 @@
1
+ import type { AgentTeamsRuntime, TeamEvent, TeamTeammateSpec } from "@clinebot/agents";
2
+ import type { SqliteSessionStore } from "../storage/sqlite-session-store";
3
+ import type { SessionSource, SessionStatus } from "../types/common";
4
+ import type { SessionManifest } from "./session-manifest";
5
+ import { UnifiedSessionPersistenceService } from "./unified-session-persistence-service";
6
+ export interface SessionRowShape {
7
+ session_id: string;
8
+ source: string;
9
+ pid: number;
10
+ started_at: string;
11
+ ended_at?: string | null;
12
+ exit_code?: number | null;
13
+ status: SessionStatus;
14
+ status_lock?: number;
15
+ interactive: number;
16
+ provider: string;
17
+ model: string;
18
+ cwd: string;
19
+ workspace_root: string;
20
+ team_name?: string | null;
21
+ enable_tools: number;
22
+ enable_spawn: number;
23
+ enable_teams: number;
24
+ parent_session_id?: string | null;
25
+ parent_agent_id?: string | null;
26
+ agent_id?: string | null;
27
+ conversation_id?: string | null;
28
+ is_subagent: number;
29
+ prompt?: string | null;
30
+ metadata_json?: string | null;
31
+ transcript_path: string;
32
+ hook_path: string;
33
+ messages_path?: string | null;
34
+ updated_at?: string;
35
+ }
36
+ export interface CreateRootSessionInput {
37
+ sessionId: string;
38
+ source: SessionSource;
39
+ pid: number;
40
+ startedAt: string;
41
+ interactive: boolean;
42
+ provider: string;
43
+ model: string;
44
+ cwd: string;
45
+ workspaceRoot: string;
46
+ teamName?: string;
47
+ enableTools: boolean;
48
+ enableSpawn: boolean;
49
+ enableTeams: boolean;
50
+ prompt?: string;
51
+ metadata?: Record<string, unknown>;
52
+ transcriptPath: string;
53
+ hookPath: string;
54
+ messagesPath: string;
55
+ }
56
+ export interface CreateRootSessionWithArtifactsInput {
57
+ sessionId: string;
58
+ source: SessionSource;
59
+ pid: number;
60
+ interactive: boolean;
61
+ provider: string;
62
+ model: string;
63
+ cwd: string;
64
+ workspaceRoot: string;
65
+ teamName?: string;
66
+ enableTools: boolean;
67
+ enableSpawn: boolean;
68
+ enableTeams: boolean;
69
+ prompt?: string;
70
+ metadata?: Record<string, unknown>;
71
+ startedAt?: string;
72
+ }
73
+ export interface RootSessionArtifacts {
74
+ manifestPath: string;
75
+ transcriptPath: string;
76
+ hookPath: string;
77
+ messagesPath: string;
78
+ manifest: SessionManifest;
79
+ }
80
+ export interface UpsertSubagentInput {
81
+ agentId: string;
82
+ parentAgentId: string;
83
+ conversationId: string;
84
+ prompt?: string;
85
+ rootSessionId?: string;
86
+ }
87
+ type TeamRuntimeState = ReturnType<AgentTeamsRuntime["exportState"]>;
88
+ export interface FileTeamPersistenceStoreOptions {
89
+ teamName: string;
90
+ baseDir?: string;
91
+ }
92
+ export declare class FileTeamPersistenceStore {
93
+ private readonly dirPath;
94
+ private readonly statePath;
95
+ private readonly taskHistoryPath;
96
+ private readonly teammateSpecs;
97
+ constructor(options: FileTeamPersistenceStoreOptions);
98
+ loadState(): TeamRuntimeState | undefined;
99
+ getTeammateSpecs(): TeamTeammateSpec[];
100
+ upsertTeammateSpec(spec: TeamTeammateSpec): void;
101
+ removeTeammateSpec(agentId: string): void;
102
+ persist(runtime: AgentTeamsRuntime): void;
103
+ appendTaskHistory(event: TeamEvent): void;
104
+ private ensureDir;
105
+ private hasPersistableState;
106
+ private clearPersistedState;
107
+ }
108
+ export declare class CoreSessionService extends UnifiedSessionPersistenceService {
109
+ private readonly store;
110
+ constructor(store: SqliteSessionStore);
111
+ createRootSession(input: CreateRootSessionInput): void;
112
+ }
113
+ export {};
@@ -0,0 +1,30 @@
1
+ import type { RpcSessionBackend, RpcSessionRow, RpcSessionUpdateInput, RpcSpawnQueueItem } from "@clinebot/rpc";
2
+ export interface SqliteRpcSessionBackendOptions {
3
+ sessionsDir?: string;
4
+ }
5
+ export declare class SqliteRpcSessionBackend implements RpcSessionBackend {
6
+ private readonly store;
7
+ constructor(options?: SqliteRpcSessionBackendOptions);
8
+ init(): void;
9
+ upsertSession(row: RpcSessionRow): void;
10
+ getSession(sessionId: string): RpcSessionRow | undefined;
11
+ listSessions(options: {
12
+ limit: number;
13
+ parentSessionId?: string;
14
+ status?: string;
15
+ }): RpcSessionRow[];
16
+ updateSession(input: RpcSessionUpdateInput): {
17
+ updated: boolean;
18
+ statusLock: number;
19
+ };
20
+ deleteSession(sessionId: string): boolean;
21
+ deleteSessionsByParent(parentSessionId: string): void;
22
+ enqueueSpawnRequest(input: {
23
+ rootSessionId: string;
24
+ parentAgentId: string;
25
+ task?: string;
26
+ systemPrompt?: string;
27
+ }): void;
28
+ claimSpawnRequest(rootSessionId: string, parentAgentId: string): RpcSpawnQueueItem | undefined;
29
+ }
30
+ export declare function createSqliteRpcSessionBackend(options?: SqliteRpcSessionBackendOptions): RpcSessionBackend;
@@ -0,0 +1,93 @@
1
+ import type { HookEventPayload, SubAgentEndContext, SubAgentStartContext } from "@clinebot/agents";
2
+ import type { providers as LlmsProviders } from "@clinebot/llms";
3
+ import type { SessionStatus } from "../types/common";
4
+ import { SessionArtifacts } from "./session-artifacts";
5
+ import { type SessionManifest } from "./session-manifest";
6
+ import type { CreateRootSessionWithArtifactsInput, RootSessionArtifacts, SessionRowShape, UpsertSubagentInput } from "./session-service";
7
+ export interface PersistedSessionUpdateInput {
8
+ sessionId: string;
9
+ expectedStatusLock?: number;
10
+ status?: SessionStatus;
11
+ endedAt?: string | null;
12
+ exitCode?: number | null;
13
+ prompt?: string | null;
14
+ metadataJson?: string | null;
15
+ parentSessionId?: string | null;
16
+ parentAgentId?: string | null;
17
+ agentId?: string | null;
18
+ conversationId?: string | null;
19
+ setRunning?: boolean;
20
+ }
21
+ export interface SessionPersistenceAdapter {
22
+ ensureSessionsDir(): string;
23
+ upsertSession(row: SessionRowShape): Promise<void>;
24
+ getSession(sessionId: string): Promise<SessionRowShape | undefined>;
25
+ listSessions(options: {
26
+ limit: number;
27
+ parentSessionId?: string;
28
+ status?: string;
29
+ }): Promise<SessionRowShape[]>;
30
+ updateSession(input: PersistedSessionUpdateInput): Promise<{
31
+ updated: boolean;
32
+ statusLock: number;
33
+ }>;
34
+ deleteSession(sessionId: string, cascade: boolean): Promise<boolean>;
35
+ enqueueSpawnRequest(input: {
36
+ rootSessionId: string;
37
+ parentAgentId: string;
38
+ task?: string;
39
+ systemPrompt?: string;
40
+ }): Promise<void>;
41
+ claimSpawnRequest(rootSessionId: string, parentAgentId: string): Promise<string | undefined>;
42
+ }
43
+ export declare class UnifiedSessionPersistenceService {
44
+ private readonly adapter;
45
+ private readonly teamTaskSessionsByAgent;
46
+ protected readonly artifacts: SessionArtifacts;
47
+ constructor(adapter: SessionPersistenceAdapter);
48
+ private teamTaskQueueKey;
49
+ ensureSessionsDir(): string;
50
+ private sessionTranscriptPath;
51
+ private sessionHookPath;
52
+ private sessionMessagesPath;
53
+ private sessionManifestPath;
54
+ private sessionPathFromStore;
55
+ private activeTeamTaskSessionId;
56
+ private subagentArtifactPaths;
57
+ private writeSessionManifestFile;
58
+ private createRootSessionId;
59
+ createRootSessionWithArtifacts(input: CreateRootSessionWithArtifactsInput): Promise<RootSessionArtifacts>;
60
+ writeSessionManifest(manifestPath: string, manifest: SessionManifest): void;
61
+ updateSessionStatus(sessionId: string, status: SessionStatus, exitCode?: number | null): Promise<{
62
+ updated: boolean;
63
+ endedAt?: string;
64
+ }>;
65
+ updateSession(input: {
66
+ sessionId: string;
67
+ prompt?: string | null;
68
+ metadata?: Record<string, unknown> | null;
69
+ }): Promise<{
70
+ updated: boolean;
71
+ }>;
72
+ queueSpawnRequest(event: HookEventPayload): Promise<void>;
73
+ private readRootSession;
74
+ private claimQueuedSpawnTask;
75
+ upsertSubagentSession(input: UpsertSubagentInput): Promise<string | undefined>;
76
+ upsertSubagentSessionFromHook(event: HookEventPayload): Promise<string | undefined>;
77
+ appendSubagentHookAudit(subSessionId: string, event: HookEventPayload): Promise<void>;
78
+ appendSubagentTranscriptLine(subSessionId: string, line: string): Promise<void>;
79
+ persistSessionMessages(sessionId: string, messages: LlmsProviders.Message[]): Promise<void>;
80
+ applySubagentStatus(subSessionId: string, event: HookEventPayload): Promise<void>;
81
+ applySubagentStatusBySessionId(subSessionId: string, status: SessionStatus): Promise<void>;
82
+ applyStatusToRunningChildSessions(parentSessionId: string, status: Exclude<SessionStatus, "running">): Promise<void>;
83
+ private createTeamTaskSubSession;
84
+ onTeamTaskStart(rootSessionId: string, agentId: string, message: string): Promise<void>;
85
+ onTeamTaskEnd(rootSessionId: string, agentId: string, status: SessionStatus, summary?: string, messages?: LlmsProviders.Message[]): Promise<void>;
86
+ handleSubAgentStart(rootSessionId: string, context: SubAgentStartContext): Promise<void>;
87
+ handleSubAgentEnd(rootSessionId: string, context: SubAgentEndContext): Promise<void>;
88
+ private isPidAlive;
89
+ listSessions(limit?: number): Promise<SessionRowShape[]>;
90
+ deleteSession(sessionId: string): Promise<{
91
+ deleted: boolean;
92
+ }>;
93
+ }
@@ -0,0 +1,28 @@
1
+ import type { WorkspaceInfo } from "../types/workspace";
2
+ import { type WorkspaceManifest } from "./workspace-manifest";
3
+ export interface WorkspaceManagerEvent {
4
+ type: "workspace_added" | "workspace_switched";
5
+ workspace: WorkspaceInfo;
6
+ }
7
+ export interface WorkspaceManager {
8
+ addWorkspacePath(workspacePath: string): Promise<WorkspaceInfo>;
9
+ switchWorkspace(workspacePath: string): Promise<WorkspaceInfo>;
10
+ subscribe(listener: (event: WorkspaceManagerEvent) => void): () => void;
11
+ getCurrentWorkspace(): WorkspaceInfo | undefined;
12
+ getWorkspace(workspacePath: string): WorkspaceInfo | undefined;
13
+ listWorkspaces(): WorkspaceInfo[];
14
+ getManifest(): WorkspaceManifest;
15
+ }
16
+ export declare class InMemoryWorkspaceManager implements WorkspaceManager {
17
+ private manifest;
18
+ private readonly listeners;
19
+ constructor(manifest?: WorkspaceManifest);
20
+ addWorkspacePath(workspacePath: string): Promise<WorkspaceInfo>;
21
+ switchWorkspace(workspacePath: string): Promise<WorkspaceInfo>;
22
+ subscribe(listener: (event: WorkspaceManagerEvent) => void): () => void;
23
+ getCurrentWorkspace(): WorkspaceInfo | undefined;
24
+ getWorkspace(workspacePath: string): WorkspaceInfo | undefined;
25
+ listWorkspaces(): WorkspaceInfo[];
26
+ getManifest(): WorkspaceManifest;
27
+ private emit;
28
+ }
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ import type { WorkspaceInfo } from "../types/workspace";
3
+ export declare const WorkspaceInfoSchema: z.ZodObject<{
4
+ rootPath: z.ZodString;
5
+ hint: z.ZodOptional<z.ZodString>;
6
+ associatedRemoteUrls: z.ZodOptional<z.ZodArray<z.ZodString>>;
7
+ latestGitCommitHash: z.ZodOptional<z.ZodString>;
8
+ latestGitBranchName: z.ZodOptional<z.ZodString>;
9
+ }, z.core.$strip>;
10
+ export declare const WorkspaceManifestSchema: z.ZodObject<{
11
+ currentWorkspacePath: z.ZodOptional<z.ZodString>;
12
+ workspaces: z.ZodRecord<z.ZodString, z.ZodObject<{
13
+ rootPath: z.ZodString;
14
+ hint: z.ZodOptional<z.ZodString>;
15
+ associatedRemoteUrls: z.ZodOptional<z.ZodArray<z.ZodString>>;
16
+ latestGitCommitHash: z.ZodOptional<z.ZodString>;
17
+ latestGitBranchName: z.ZodOptional<z.ZodString>;
18
+ }, z.core.$strip>>;
19
+ }, z.core.$strip>;
20
+ export type WorkspaceManifest = z.infer<typeof WorkspaceManifestSchema>;
21
+ export declare function emptyWorkspaceManifest(): WorkspaceManifest;
22
+ export declare function normalizeWorkspacePath(workspacePath: string): string;
23
+ export declare function generateWorkspaceInfo(workspacePath: string): Promise<WorkspaceInfo>;
24
+ export declare function upsertWorkspaceInfo(manifest: WorkspaceManifest, info: WorkspaceInfo): WorkspaceManifest;
25
+ export declare function buildWorkspaceMetadata(cwd: string): Promise<string>;
@@ -0,0 +1,13 @@
1
+ import type { ProviderSettingsManager } from "./provider-settings-manager";
2
+ export interface MigrateLegacyProviderSettingsOptions {
3
+ providerSettingsManager: ProviderSettingsManager;
4
+ dataDir?: string;
5
+ globalStatePath?: string;
6
+ secretsPath?: string;
7
+ }
8
+ export interface MigrateLegacyProviderSettingsResult {
9
+ migrated: boolean;
10
+ providerCount: number;
11
+ lastUsedProvider?: string;
12
+ }
13
+ export declare function migrateLegacyProviderSettings(options: MigrateLegacyProviderSettingsOptions): MigrateLegacyProviderSettingsResult;
@@ -0,0 +1,20 @@
1
+ import { type ProviderConfig, type ProviderSettings, type ProviderTokenSource, type StoredProviderSettings } from "../types/provider-settings";
2
+ export interface ProviderSettingsManagerOptions {
3
+ filePath?: string;
4
+ }
5
+ export interface SaveProviderSettingsOptions {
6
+ setLastUsed?: boolean;
7
+ tokenSource?: ProviderTokenSource;
8
+ }
9
+ export declare class ProviderSettingsManager {
10
+ private readonly filePath;
11
+ constructor(options?: ProviderSettingsManagerOptions);
12
+ getFilePath(): string;
13
+ read(): StoredProviderSettings;
14
+ write(state: StoredProviderSettings): void;
15
+ saveProviderSettings(settings: unknown, options?: SaveProviderSettingsOptions): StoredProviderSettings;
16
+ getProviderSettings(providerId: string): ProviderSettings | undefined;
17
+ getLastUsedProviderSettings(): ProviderSettings | undefined;
18
+ getProviderConfig(providerId: string): ProviderConfig | undefined;
19
+ getLastUsedProviderConfig(): ProviderConfig | undefined;
20
+ }
@@ -0,0 +1,29 @@
1
+ import { type SqliteDb } from "@clinebot/shared/db";
2
+ import type { SessionStatus } from "../types/common";
3
+ import type { SessionRecord } from "../types/sessions";
4
+ import type { SessionStore } from "../types/storage";
5
+ export interface SqliteSessionStoreOptions {
6
+ sessionsDir?: string;
7
+ }
8
+ export declare class SqliteSessionStore implements SessionStore {
9
+ private readonly sessionsDirPath;
10
+ private db;
11
+ constructor(options?: SqliteSessionStoreOptions);
12
+ init(): void;
13
+ ensureSessionsDir(): string;
14
+ sessionDbPath(): string;
15
+ getRawDb(): SqliteDb;
16
+ run(sql: string, params?: unknown[]): {
17
+ changes?: number;
18
+ };
19
+ queryOne<T>(sql: string, params?: unknown[]): T | undefined;
20
+ queryAll<T>(sql: string, params?: unknown[]): T[];
21
+ create(record: SessionRecord): void;
22
+ update(record: Partial<SessionRecord> & {
23
+ sessionId: string;
24
+ }): void;
25
+ updateStatus(sessionId: string, status: SessionStatus, exitCode?: number | null): void;
26
+ get(sessionId: string): SessionRecord | undefined;
27
+ list(limit?: number): SessionRecord[];
28
+ delete(sessionId: string, cascade?: boolean): boolean;
29
+ }
@@ -0,0 +1,31 @@
1
+ import type { TeamEvent, TeamRuntimeState, TeamTeammateSpec } from "@clinebot/agents";
2
+ import type { TeamStore } from "../types/storage";
3
+ export interface SqliteTeamStoreOptions {
4
+ teamDir?: string;
5
+ }
6
+ export interface TeamRuntimeLoadResult {
7
+ state?: TeamRuntimeState;
8
+ teammates: TeamTeammateSpec[];
9
+ interruptedRunIds: string[];
10
+ }
11
+ export declare class SqliteTeamStore implements TeamStore {
12
+ private readonly teamDirPath;
13
+ private db;
14
+ constructor(options?: SqliteTeamStoreOptions);
15
+ init(): void;
16
+ private ensureTeamDir;
17
+ private dbPath;
18
+ private getRawDb;
19
+ private ensureSchema;
20
+ private run;
21
+ private queryOne;
22
+ private queryAll;
23
+ listTeamNames(): string[];
24
+ readState(teamName: string): TeamRuntimeState | undefined;
25
+ readHistory(teamName: string, limit?: number): unknown[];
26
+ loadRuntime(teamName: string): TeamRuntimeLoadResult;
27
+ appendTeamEvent(teamName: string, eventType: string, payload: unknown, correlationId?: string): void;
28
+ persistRuntime(teamName: string, state: TeamRuntimeState, teammates: TeamTeammateSpec[]): void;
29
+ markInProgressRunsInterrupted(teamName: string, reason: string): string[];
30
+ handleTeamEvent(teamName: string, event: TeamEvent): void;
31
+ }
@@ -0,0 +1,2 @@
1
+ export type { TeamStore } from "../types/storage";
2
+ export { SqliteTeamStore, type SqliteTeamStoreOptions, } from "./sqlite-team-store";
@@ -0,0 +1 @@
1
+ export { buildTeamProgressSummary, toTeamProgressLifecycleEvent, } from "./projections";