@jingyi0605/codingns 0.6.1 → 0.6.5
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/codingns.mjs +225 -0
- package/dist/public/assets/AdaptiveButlerPage-CfsUVZKl.js +3 -0
- package/dist/public/assets/{App-Dsf3ooXU.js → App-B9HcTkMT.js} +3 -3
- package/dist/public/assets/{BootstrapPage-CE0m1qSR.js → BootstrapPage-BgLdZEKQ.js} +1 -1
- package/dist/public/assets/ConversationPage-Cj8go7L0.js +4 -0
- package/dist/public/assets/{DesktopDetachPreviewPage-Dxarr_Wf.js → DesktopDetachPreviewPage-YCBnyC58.js} +1 -1
- package/dist/public/assets/{DesktopWindowPage-VytPwJ4c.js → DesktopWindowPage-CrvndE23.js} +1 -1
- package/dist/public/assets/{FileContextPanel-DwFzLsOp.js → FileContextPanel-CdC7GGw5.js} +1 -1
- package/dist/public/assets/{GitSidebar-CH6WqTrM.js → GitSidebar-z2SBinQh.js} +1 -1
- package/dist/public/assets/{MobileCreateSessionSheet-DcxKM00P.js → MobileCreateSessionSheet-Cb2HM-y3.js} +1 -1
- package/dist/public/assets/{MobileTopHeaderFrame-C5rIKQT6.js → MobileTopHeaderFrame-etF2HKlm.js} +1 -1
- package/dist/public/assets/{MobileWorkspaceSwitcherHeader-CfUnHgv_.js → MobileWorkspaceSwitcherHeader-CuGJ31kb.js} +1 -1
- package/dist/public/assets/{RelayConnectEntryPage-CgMvVZwa.js → RelayConnectEntryPage-BB6DbGtP.js} +1 -1
- package/dist/public/assets/{ServerSettingsModal-CFul__z1.js → ServerSettingsModal-Bl1sacZg.js} +1 -1
- package/dist/public/assets/{SessionIndexPage-B-tRhBXC.js → SessionIndexPage-NbF9gJnp.js} +1 -1
- package/dist/public/assets/SettingsPage-DGsmQpLv.js +1 -0
- package/dist/public/assets/{TerminalManagerPanel-BbORd-ee.js → TerminalManagerPanel-BOm8Hi_v.js} +1 -1
- package/dist/public/assets/{TerminalPage-DWHv6mlu.js → TerminalPage-B5JNFU6w.js} +19 -19
- package/dist/public/assets/{TerminalRuntimeFallbackModal-B29YxbQe.js → TerminalRuntimeFallbackModal-CM3LRKOJ.js} +1 -1
- package/dist/public/assets/{ToolFilesPage-Dx9cv9hu.js → ToolFilesPage-GSqKQsj_.js} +1 -1
- package/dist/public/assets/{ToolGitPage-D7H3vAia.js → ToolGitPage-BVFWMMQp.js} +1 -1
- package/dist/public/assets/{ToolProcessesPage-PqQWxsy-.js → ToolProcessesPage-DZ456fYz.js} +1 -1
- package/dist/public/assets/{ToolsHomePage-CX05Pe_4.js → ToolsHomePage-DsJp0y8A.js} +1 -1
- package/dist/public/assets/{WorkbenchLandingPage-CchkAC75.js → WorkbenchLandingPage-DyPei0e-.js} +1 -1
- package/dist/public/assets/WorkbenchLayout-DlbgBT3n.js +4 -0
- package/dist/public/assets/WorkbenchModal-LNfB69qx.js +1 -0
- package/dist/public/assets/WorkbenchShellRoute-BsxumYx5.js +1 -0
- package/dist/public/assets/{WorkbenchShellRoute-RGZpA0_J.css → WorkbenchShellRoute-DhQo_0vu.css} +1 -1
- package/dist/public/assets/{WorkspaceDebugDetailPage-Deqy2_pO.js → WorkspaceDebugDetailPage-CaXj5zVI.js} +1 -1
- package/dist/public/assets/{WorkspaceDetailPage-Cvf-ZdlB.js → WorkspaceDetailPage-DOexuuaw.js} +1 -1
- package/dist/public/assets/{WorkspaceHomePage-Dsyvqyk1.js → WorkspaceHomePage-DkCHNjKD.js} +1 -1
- package/dist/public/assets/{client-runtime-manager-DROQJ9v3.js → client-runtime-manager-6OoYHXGd.js} +1 -1
- package/dist/public/assets/{file-tree-icon-Bp3Ntt7u.js → file-tree-icon-9pt1OStn.js} +1 -1
- package/dist/public/assets/index-BwlbvwaA.css +1 -0
- package/dist/public/assets/index-DSw-TkQL.js +42 -0
- package/dist/public/assets/{login-direct-candidate-resolver-DotM530R.js → login-direct-candidate-resolver-CLlYtBRq.js} +1 -1
- package/dist/public/assets/model-switch-api-C-l8-E1S.js +1 -0
- package/dist/public/assets/{preferences-service-BG6GKG29.js → preferences-service-BCcfYP_d.js} +1 -1
- package/dist/public/assets/{relay-entry-pmr-c42O.js → relay-entry-BmLkMKuq.js} +1 -1
- package/dist/public/assets/session-runtime-machine-DgtvREca.js +21 -0
- package/dist/public/assets/{terminal-runtime-meta-8_uRZf7h.js → terminal-runtime-meta-0h-75uRy.js} +1 -1
- package/dist/public/assets/{useRegisteredDebugTemplates-DWX7LXQu.js → useRegisteredDebugTemplates-rBVmAqh3.js} +1 -1
- package/dist/public/index.html +2 -2
- package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +4 -1
- package/dist/server/modules/assistant-capability/assistant-capability-service.js +12 -1
- package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
- package/dist/server/modules/butler/butler-control-session-service.d.ts +4 -1
- package/dist/server/modules/butler/butler-control-session-service.js +17 -1
- package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
- package/dist/server/modules/butler/butler-profile-service.d.ts +3 -1
- package/dist/server/modules/butler/butler-profile-service.js +16 -4
- package/dist/server/modules/butler/butler-profile-service.js.map +1 -1
- package/dist/server/modules/opencli/opencli-bridge-skill-service.d.ts +12 -0
- package/dist/server/modules/opencli/opencli-bridge-skill-service.js +124 -0
- package/dist/server/modules/opencli/opencli-bridge-skill-service.js.map +1 -0
- package/dist/server/modules/opencli/opencli-catalog-service.d.ts +50 -0
- package/dist/server/modules/opencli/opencli-catalog-service.js +345 -0
- package/dist/server/modules/opencli/opencli-catalog-service.js.map +1 -0
- package/dist/server/modules/opencli/opencli-controller.d.ts +13 -0
- package/dist/server/modules/opencli/opencli-controller.js +30 -0
- package/dist/server/modules/opencli/opencli-controller.js.map +1 -0
- package/dist/server/modules/opencli/opencli-health-service.d.ts +28 -0
- package/dist/server/modules/opencli/opencli-health-service.js +106 -0
- package/dist/server/modules/opencli/opencli-health-service.js.map +1 -0
- package/dist/server/modules/opencli/opencli-install-discovery.d.ts +23 -0
- package/dist/server/modules/opencli/opencli-install-discovery.js +130 -0
- package/dist/server/modules/opencli/opencli-install-discovery.js.map +1 -0
- package/dist/server/modules/opencli/opencli-management-service.d.ts +59 -0
- package/dist/server/modules/opencli/opencli-management-service.js +152 -0
- package/dist/server/modules/opencli/opencli-management-service.js.map +1 -0
- package/dist/server/modules/opencli/opencli-runtime-builder.d.ts +11 -0
- package/dist/server/modules/opencli/opencli-runtime-builder.js +214 -0
- package/dist/server/modules/opencli/opencli-runtime-builder.js.map +1 -0
- package/dist/server/modules/opencli/opencli-runtime-layout.d.ts +3 -0
- package/dist/server/modules/opencli/opencli-runtime-layout.js +11 -0
- package/dist/server/modules/opencli/opencli-runtime-layout.js.map +1 -0
- package/dist/server/modules/opencli/opencli-runtime-profile-service.d.ts +29 -0
- package/dist/server/modules/opencli/opencli-runtime-profile-service.js +104 -0
- package/dist/server/modules/opencli/opencli-runtime-profile-service.js.map +1 -0
- package/dist/server/modules/opencli/opencli-runtime-resolver.d.ts +29 -0
- package/dist/server/modules/opencli/opencli-runtime-resolver.js +110 -0
- package/dist/server/modules/opencli/opencli-runtime-resolver.js.map +1 -0
- package/dist/server/modules/opencli/opencli-session-prompt-service.d.ts +11 -0
- package/dist/server/modules/opencli/opencli-session-prompt-service.js +66 -0
- package/dist/server/modules/opencli/opencli-session-prompt-service.js.map +1 -0
- package/dist/server/modules/provider/provider-catalog-service.d.ts +46 -0
- package/dist/server/modules/provider/provider-catalog-service.js +249 -0
- package/dist/server/modules/provider/provider-catalog-service.js.map +1 -0
- package/dist/server/modules/provider/provider-controller.d.ts +15 -2
- package/dist/server/modules/provider/provider-controller.js +44 -6
- package/dist/server/modules/provider/provider-controller.js.map +1 -1
- package/dist/server/modules/provider/provider-disabled.d.ts +8 -0
- package/dist/server/modules/provider/provider-disabled.js +45 -0
- package/dist/server/modules/provider/provider-disabled.js.map +1 -0
- package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +1 -0
- package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-helper-process.js +3 -3
- package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-runtime.d.ts +1 -1
- package/dist/server/modules/provider/provider-discovery-runtime.js +12 -8
- package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -1
- package/dist/server/modules/sessions/claude-compatible-provider-registry.d.ts +16 -0
- package/dist/server/modules/sessions/claude-compatible-provider-registry.js +91 -0
- package/dist/server/modules/sessions/claude-compatible-provider-registry.js.map +1 -0
- package/dist/server/modules/sessions/session-history-service.d.ts +7 -1
- package/dist/server/modules/sessions/session-history-service.js +49 -16
- package/dist/server/modules/sessions/session-history-service.js.map +1 -1
- package/dist/server/modules/sessions/session-live-runtime-router-service.js +9 -4
- package/dist/server/modules/sessions/session-live-runtime-router-service.js.map +1 -1
- package/dist/server/modules/sessions/session-live-runtime-service.d.ts +8 -4
- package/dist/server/modules/sessions/session-live-runtime-service.js +100 -87
- package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
- package/dist/server/modules/sessions/session-permission-request-service.d.ts +5 -2
- package/dist/server/modules/sessions/session-permission-request-service.js +26 -27
- package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
- package/dist/server/modules/sessions/session-provider-config-service.d.ts +17 -1
- package/dist/server/modules/sessions/session-provider-config-service.js +121 -17
- package/dist/server/modules/sessions/session-provider-config-service.js.map +1 -1
- package/dist/server/modules/skills/skill-manager-service.d.ts +5 -0
- package/dist/server/modules/skills/skill-manager-service.js +26 -0
- package/dist/server/modules/skills/skill-manager-service.js.map +1 -1
- package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +1 -0
- package/dist/server/modules/tasks/task-helper-process-handlers.js +1 -1
- package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -1
- package/dist/server/routes/opencli.d.ts +3 -0
- package/dist/server/routes/opencli.js +7 -0
- package/dist/server/routes/opencli.js.map +1 -0
- package/dist/server/routes/providers.js +4 -2
- package/dist/server/routes/providers.js.map +1 -1
- package/dist/server/server/create-server.d.ts +8 -0
- package/dist/server/server/create-server.js +44 -11
- package/dist/server/server/create-server.js.map +1 -1
- package/dist/server/storage/repositories/opencli-catalog-entry-repository.d.ts +9 -0
- package/dist/server/storage/repositories/opencli-catalog-entry-repository.js +85 -0
- package/dist/server/storage/repositories/opencli-catalog-entry-repository.js.map +1 -0
- package/dist/server/storage/repositories/opencli-provider-repository.d.ts +8 -0
- package/dist/server/storage/repositories/opencli-provider-repository.js +88 -0
- package/dist/server/storage/repositories/opencli-provider-repository.js.map +1 -0
- package/dist/server/storage/repositories/opencli-runtime-profile-repository.d.ts +11 -0
- package/dist/server/storage/repositories/opencli-runtime-profile-repository.js +127 -0
- package/dist/server/storage/repositories/opencli-runtime-profile-repository.js.map +1 -0
- package/dist/server/storage/repositories/provider-control-repository.d.ts +9 -0
- package/dist/server/storage/repositories/provider-control-repository.js +51 -0
- package/dist/server/storage/repositories/provider-control-repository.js.map +1 -0
- package/dist/server/storage/sqlite/client.js +53 -0
- package/dist/server/storage/sqlite/client.js.map +1 -1
- package/dist/server/storage/sqlite/schema.sql +66 -0
- package/dist/server/types/domain.d.ts +50 -0
- package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.d.ts +5 -0
- package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.js +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.js.map +1 -1
- package/package.json +1 -1
- package/dist/public/assets/AdaptiveButlerPage-Dw72U3hG.js +0 -3
- package/dist/public/assets/ConversationPage-8wOY7SX-.js +0 -4
- package/dist/public/assets/SettingsPage-C9LGxSQZ.js +0 -1
- package/dist/public/assets/WorkbenchLayout-pOZvEqp7.js +0 -3
- package/dist/public/assets/WorkbenchModal-ColqvV6a.js +0 -1
- package/dist/public/assets/WorkbenchShellRoute-C0_h4lP6.js +0 -1
- package/dist/public/assets/index-B84Po2NA.css +0 -1
- package/dist/public/assets/index-C-0oeG_5.js +0 -42
- package/dist/public/assets/model-switch-api-Bh9nYslz.js +0 -1
- package/dist/public/assets/session-runtime-machine-YN84QBlr.js +0 -21
|
@@ -16,15 +16,20 @@ export class SessionLiveRuntimeRouterService {
|
|
|
16
16
|
listQueuedMessages = async (sessionId, userId) => this.resolveServiceForSession(sessionId).listQueuedMessages(sessionId, userId);
|
|
17
17
|
deleteQueuedMessage = async (sessionId, userId, queueItemId) => this.resolveServiceForSession(sessionId).deleteQueuedMessage(sessionId, userId, queueItemId);
|
|
18
18
|
steerQueuedMessage = async (sessionId, userId, queueItemId) => this.resolveServiceForSession(sessionId).steerQueuedMessage(sessionId, userId, queueItemId);
|
|
19
|
-
getClaudeHookBridgeConfig = () => this.primaryService.getClaudeHookBridgeConfig();
|
|
20
|
-
ingestClaudeHookEvent = async (payload) => {
|
|
19
|
+
getClaudeHookBridgeConfig = (provider) => this.primaryService.getClaudeHookBridgeConfig(provider);
|
|
20
|
+
ingestClaudeHookEvent = async (providerOrPayload, payload) => {
|
|
21
|
+
const provider = typeof providerOrPayload === "string" ? providerOrPayload : null;
|
|
21
22
|
for (const service of this.services) {
|
|
22
|
-
const result =
|
|
23
|
+
const result = provider
|
|
24
|
+
? await service.ingestClaudeHookEvent(provider, payload)
|
|
25
|
+
: await service.ingestClaudeHookEvent(providerOrPayload);
|
|
23
26
|
if (!result.ignored || result.sessionId) {
|
|
24
27
|
return result;
|
|
25
28
|
}
|
|
26
29
|
}
|
|
27
|
-
return
|
|
30
|
+
return provider
|
|
31
|
+
? this.primaryService.ingestClaudeHookEvent(provider, payload)
|
|
32
|
+
: this.primaryService.ingestClaudeHookEvent(providerOrPayload);
|
|
28
33
|
};
|
|
29
34
|
resolveLiveActivityObservation = (sessionId) => this.findOwningService(sessionId)?.resolveLiveActivityObservation(sessionId) ?? null;
|
|
30
35
|
resolveServiceForSession(sessionId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-live-runtime-router-service.js","sourceRoot":"","sources":["../../../../src/modules/sessions/session-live-runtime-router-service.ts"],"names":[],"mappings":"AA6BA,MAAM,OAAO,+BAA+B;IAIvB;IAHF,QAAQ,CAAiD;IAE1E,YACmB,cAAmD,EACpE,iBAAiE;QADhD,mBAAc,GAAd,cAAc,CAAqC;QAGpE,IAAI,CAAC,QAAQ,GAAG,CAAC,cAAc,EAAE,GAAG,iBAAiB,CAAC,CAAC;IACzD,CAAC;IAEQ,gBAAgB,GAAkD,KAAK,EAAE,KAAK,EAAE,EAAE,CACzF,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAErC,eAAe,GAAiD,KAAK,EAAE,KAAK,EAAE,EAAE,CACvF,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAE/D,kBAAkB,GAAoD,KAAK,EAAE,KAAK,EAAE,EAAE,CAC7F,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAElE,iBAAiB,GAAmD,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CACvG,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEvE,gBAAgB,GAAkD,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CACrG,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEtE,gBAAgB,GAAG,CAC1B,SAAiB,EACjB,UAA+F,EACzE,EAAE,CACxB,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAE1E,sBAAsB,GAAwD,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CACjH,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAE5E,sBAAsB,GAAwD,KAAK,EAC1F,SAAS,EACT,MAAM,EACN,SAAS,EACT,KAAK,EACL,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAEjG,kBAAkB,GAAoD,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CACzG,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAExE,mBAAmB,GAAqD,KAAK,EACpF,SAAS,EACT,MAAM,EACN,WAAW,EACX,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAEzF,kBAAkB,GAAoD,KAAK,EAClF,SAAS,EACT,MAAM,EACN,WAAW,EACX,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAExF,yBAAyB,GAA2D,
|
|
1
|
+
{"version":3,"file":"session-live-runtime-router-service.js","sourceRoot":"","sources":["../../../../src/modules/sessions/session-live-runtime-router-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,9 @@ import type { SessionAttachmentInput } from "./session-message-attachment-servic
|
|
|
14
14
|
import { SessionMessageAttachmentService } from "./session-message-attachment-service.js";
|
|
15
15
|
import { type SessionPermissionEnvelope, type SessionPermissionReplyInput, type SessionPermissionRequestView } from "./session-permission-request-service.js";
|
|
16
16
|
import type { SessionHistoryEnvelope, SessionHistoryMessageWithOrigin, SessionHistoryService } from "./session-history-service.js";
|
|
17
|
+
import { type ClaudeCompatibleProviderId } from "./claude-compatible-provider-registry.js";
|
|
17
18
|
import { SessionProviderConfigService } from "./session-provider-config-service.js";
|
|
19
|
+
import type { OpenCliSessionPromptService } from "../opencli/opencli-session-prompt-service.js";
|
|
18
20
|
interface RuntimeSendOptions {
|
|
19
21
|
model?: string | null;
|
|
20
22
|
reasoningLevel?: string | null;
|
|
@@ -154,7 +156,7 @@ interface SessionTerminalStateEvent {
|
|
|
154
156
|
source: "runtime" | "external_runtime";
|
|
155
157
|
}
|
|
156
158
|
interface ClaudeHookBridgeConfig {
|
|
157
|
-
provider:
|
|
159
|
+
provider: ClaudeCompatibleProviderId;
|
|
158
160
|
bridgeUrl: string;
|
|
159
161
|
token: string;
|
|
160
162
|
scriptPath: string;
|
|
@@ -188,6 +190,7 @@ export declare class SessionLiveRuntimeService {
|
|
|
188
190
|
private readonly sessionStatusSnapshotRepository;
|
|
189
191
|
private readonly sessionProviderConfigService;
|
|
190
192
|
private readonly config;
|
|
193
|
+
private readonly openCliSessionPromptService;
|
|
191
194
|
private readonly providerRuntimeService;
|
|
192
195
|
private readonly sessionActivityAuthorityService;
|
|
193
196
|
private readonly sessionPermissionRequestService;
|
|
@@ -202,15 +205,15 @@ export declare class SessionLiveRuntimeService {
|
|
|
202
205
|
private readonly queueDispatchSessions;
|
|
203
206
|
private readonly queueRetryTimers;
|
|
204
207
|
private readonly pendingSendDebugTracesBySessionId;
|
|
205
|
-
constructor(sessionHistoryService: SessionHistoryService, sessionMessageAttachmentService: SessionMessageAttachmentService, workspaceService: WorkspaceService, sessionChangedFileService: SessionChangedFileService, sessionBindingRepository: SessionBindingRepository, authUserRepository: AuthUserRepository, sessionSendQueueRepository: SessionSendQueueRepository, sessionIndexRepository: SessionIndexRepository, sessionStateRepository: SessionStateRepository, sessionStatusSnapshotRepository: SessionStatusSnapshotRepository, sessionProviderConfigService: SessionProviderConfigService, config: HostConfig, sessionActivityAuthorityService?: SessionActivityAuthorityService);
|
|
208
|
+
constructor(sessionHistoryService: SessionHistoryService, sessionMessageAttachmentService: SessionMessageAttachmentService, workspaceService: WorkspaceService, sessionChangedFileService: SessionChangedFileService, sessionBindingRepository: SessionBindingRepository, authUserRepository: AuthUserRepository, sessionSendQueueRepository: SessionSendQueueRepository, sessionIndexRepository: SessionIndexRepository, sessionStateRepository: SessionStateRepository, sessionStatusSnapshotRepository: SessionStatusSnapshotRepository, sessionProviderConfigService: SessionProviderConfigService, config: HostConfig, sessionActivityAuthorityService?: SessionActivityAuthorityService, openCliSessionPromptService?: OpenCliSessionPromptService | null);
|
|
206
209
|
startLiveSession(input: StartLiveSessionInput): Promise<LiveMessageAcceptedResult>;
|
|
207
210
|
sendLiveMessage(input: SendLiveMessageInput): Promise<LiveMessageAcceptedResult>;
|
|
208
211
|
listQueuedMessages(sessionId: string, userId: string): Promise<SessionQueueItemView[]>;
|
|
209
212
|
enqueueLiveMessage(input: SendLiveMessageInput): Promise<SessionQueueItemView>;
|
|
210
213
|
steerQueuedMessage(sessionId: string, userId: string, queueItemId: string): Promise<SteerQueuedMessageResult>;
|
|
211
214
|
deleteQueuedMessage(sessionId: string, userId: string, queueItemId: string): Promise<DeleteQueuedMessageResult>;
|
|
212
|
-
getClaudeHookBridgeConfig(): ClaudeHookBridgeConfig;
|
|
213
|
-
ingestClaudeHookEvent(
|
|
215
|
+
getClaudeHookBridgeConfig(provider?: ClaudeCompatibleProviderId): ClaudeHookBridgeConfig;
|
|
216
|
+
ingestClaudeHookEvent(providerOrPayload: ClaudeCompatibleProviderId | ClaudeHookEventPayload, payload?: ClaudeHookEventPayload): Promise<{
|
|
214
217
|
accepted: boolean;
|
|
215
218
|
ignored: boolean;
|
|
216
219
|
sessionId: string | null;
|
|
@@ -238,6 +241,7 @@ export declare class SessionLiveRuntimeService {
|
|
|
238
241
|
private applyExternalRuntimeUpdate;
|
|
239
242
|
private startRuntimeRun;
|
|
240
243
|
private sendLiveMessageDirect;
|
|
244
|
+
private composeProviderPrompt;
|
|
241
245
|
private dispatchNextQueuedMessage;
|
|
242
246
|
private maybeDispatchQueuedMessages;
|
|
243
247
|
private shouldBlockQueueDispatch;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, mkdirSync,
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { performance } from "node:perf_hooks";
|
|
4
4
|
import { ClaudeRuntimeAdapter, CodexRuntimeAdapter, GeminiRuntimeAdapter, KimiRuntimeAdapter, LegnaRuntimeAdapter, OpenCodeRuntimeAdapter, ProviderRuntimeService } from "@codingns/session-sync-core";
|
|
@@ -8,8 +8,10 @@ import { isPerfDebugEnabled, logPerformance } from "../../shared/utils/perf-log.
|
|
|
8
8
|
import { logPermissionDebug } from "../../shared/utils/permission-debug-log.js";
|
|
9
9
|
import { nowIso } from "../../shared/utils/time.js";
|
|
10
10
|
import { SessionActivityAuthorityService } from "./session-activity-authority-service.js";
|
|
11
|
+
import { createProviderCapabilityBlockedError } from "../provider/provider-disabled.js";
|
|
11
12
|
import { SessionPermissionRequestService } from "./session-permission-request-service.js";
|
|
12
13
|
import { appendSessionProviderErrorContext, mapSessionProviderError } from "./session-provider-error-mapper.js";
|
|
14
|
+
import { buildClaudeCompatibleHookBridgeUrl, buildClaudeCompatibleRawStoreRef, buildClaudeCompatibleSessionTitle, findClaudeCompatibleSessionFile, isClaudeCompatibleProvider } from "./claude-compatible-provider-registry.js";
|
|
13
15
|
import { ClaudeRuntimeHelperAdapter } from "./claude-runtime-helper-client.js";
|
|
14
16
|
import { CodexAppServerHelperClient } from "./codex-app-server-helper-client.js";
|
|
15
17
|
const OPENCODE_ORDER_DEBUG_ENABLED = /^(1|true|yes)$/i.test(process.env.CODINGNS_OPENCODE_ORDER_DEBUG?.trim() ?? "");
|
|
@@ -30,6 +32,7 @@ export class SessionLiveRuntimeService {
|
|
|
30
32
|
sessionStatusSnapshotRepository;
|
|
31
33
|
sessionProviderConfigService;
|
|
32
34
|
config;
|
|
35
|
+
openCliSessionPromptService;
|
|
33
36
|
providerRuntimeService;
|
|
34
37
|
sessionActivityAuthorityService;
|
|
35
38
|
sessionPermissionRequestService;
|
|
@@ -44,7 +47,7 @@ export class SessionLiveRuntimeService {
|
|
|
44
47
|
queueDispatchSessions = new Set();
|
|
45
48
|
queueRetryTimers = new Map();
|
|
46
49
|
pendingSendDebugTracesBySessionId = new Map();
|
|
47
|
-
constructor(sessionHistoryService, sessionMessageAttachmentService, workspaceService, sessionChangedFileService, sessionBindingRepository, authUserRepository, sessionSendQueueRepository, sessionIndexRepository, sessionStateRepository, sessionStatusSnapshotRepository, sessionProviderConfigService, config, sessionActivityAuthorityService = new SessionActivityAuthorityService()) {
|
|
50
|
+
constructor(sessionHistoryService, sessionMessageAttachmentService, workspaceService, sessionChangedFileService, sessionBindingRepository, authUserRepository, sessionSendQueueRepository, sessionIndexRepository, sessionStateRepository, sessionStatusSnapshotRepository, sessionProviderConfigService, config, sessionActivityAuthorityService = new SessionActivityAuthorityService(), openCliSessionPromptService = null) {
|
|
48
51
|
this.sessionHistoryService = sessionHistoryService;
|
|
49
52
|
this.sessionMessageAttachmentService = sessionMessageAttachmentService;
|
|
50
53
|
this.workspaceService = workspaceService;
|
|
@@ -57,6 +60,7 @@ export class SessionLiveRuntimeService {
|
|
|
57
60
|
this.sessionStatusSnapshotRepository = sessionStatusSnapshotRepository;
|
|
58
61
|
this.sessionProviderConfigService = sessionProviderConfigService;
|
|
59
62
|
this.config = config;
|
|
63
|
+
this.openCliSessionPromptService = openCliSessionPromptService;
|
|
60
64
|
this.sessionActivityAuthorityService = sessionActivityAuthorityService;
|
|
61
65
|
this.sessionPermissionRequestService = new SessionPermissionRequestService(sessionHistoryService, sessionBindingRepository, authUserRepository, workspaceService, config, async (envelope) => {
|
|
62
66
|
await this.emitExternalRuntimeEnvelope(envelope);
|
|
@@ -97,9 +101,10 @@ export class SessionLiveRuntimeService {
|
|
|
97
101
|
this.ensurePendingSessionBinding(sessionId, workspace.id, input.provider, providerBinding);
|
|
98
102
|
const persistedAttachments = this.persistMessageAttachments(sessionId, input.clientRequestId, input.runtimeOptions?.attachments ?? []);
|
|
99
103
|
const providerPrompt = this.sessionMessageAttachmentService.buildProviderPrompt(input.provider, input.content, persistedAttachments.runtimeAttachments);
|
|
104
|
+
const resolvedProviderPrompt = this.composeProviderPrompt(input.provider, providerPrompt, providerLaunchContext.runtimeEnv);
|
|
100
105
|
const providerInstructionFilePath = resolveRuntimeInstructionFilePath(input.provider, workspace.path, input.runtimeOptions?.providerInstructionFilePath ?? null);
|
|
101
|
-
this.ensureCapability(capabilities
|
|
102
|
-
this.ensureCapability(capabilities
|
|
106
|
+
this.ensureCapability(capabilities, "provider", "canStartSession", "provider 不支持 start-live");
|
|
107
|
+
this.ensureCapability(capabilities, "provider", "canSendMessage", "provider 不支持实时对话");
|
|
103
108
|
const launchRuntimeStartedAtMs = performance.now();
|
|
104
109
|
const handle = await this.launchRuntimeRun({
|
|
105
110
|
sessionId,
|
|
@@ -117,7 +122,7 @@ export class SessionLiveRuntimeService {
|
|
|
117
122
|
model: input.runtimeOptions?.model ?? null,
|
|
118
123
|
reasoningLevel: input.runtimeOptions?.reasoningLevel ?? null,
|
|
119
124
|
permissionMode: input.runtimeOptions?.permissionMode ?? null,
|
|
120
|
-
providerPrompt,
|
|
125
|
+
providerPrompt: resolvedProviderPrompt,
|
|
121
126
|
providerInstructionFilePath,
|
|
122
127
|
attachments: persistedAttachments.runtimeAttachments
|
|
123
128
|
}
|
|
@@ -171,7 +176,7 @@ export class SessionLiveRuntimeService {
|
|
|
171
176
|
if (!shouldAwaitStartBindingBeforeAcceptedUserLookup(input.provider)) {
|
|
172
177
|
void startBindingTask;
|
|
173
178
|
}
|
|
174
|
-
const acceptedAt = acceptedMessage?.timestamp ??
|
|
179
|
+
const acceptedAt = acceptedMessage?.timestamp ?? requestStartedAt;
|
|
175
180
|
const boundAttachments = this.sessionMessageAttachmentService.bindClientRequestToMessage(sessionId, input.clientRequestId, acceptedMessage?.messageId ?? null);
|
|
176
181
|
const session = this.resolveStartedSession({
|
|
177
182
|
sessionId,
|
|
@@ -353,16 +358,25 @@ export class SessionLiveRuntimeService {
|
|
|
353
358
|
deleted: true
|
|
354
359
|
};
|
|
355
360
|
}
|
|
356
|
-
getClaudeHookBridgeConfig() {
|
|
357
|
-
return buildClaudeHookBridgeConfig(this.config);
|
|
358
|
-
}
|
|
359
|
-
async ingestClaudeHookEvent(payload) {
|
|
360
|
-
const
|
|
361
|
+
getClaudeHookBridgeConfig(provider = "claude-code") {
|
|
362
|
+
return buildClaudeHookBridgeConfig(this.config, provider);
|
|
363
|
+
}
|
|
364
|
+
async ingestClaudeHookEvent(providerOrPayload, payload) {
|
|
365
|
+
const hasExplicitProvider = typeof providerOrPayload === "string"
|
|
366
|
+
&& isClaudeCompatibleProvider(providerOrPayload);
|
|
367
|
+
const provider = hasExplicitProvider
|
|
368
|
+
? providerOrPayload
|
|
369
|
+
: "claude-code";
|
|
370
|
+
const resolvedPayload = hasExplicitProvider
|
|
371
|
+
? (payload ?? {})
|
|
372
|
+
: providerOrPayload;
|
|
373
|
+
const hookEventName = normalizeClaudeHookEventName(resolvedPayload.hook_event_name);
|
|
361
374
|
logPermissionDebug("claude_hook_event.ingest.begin", {
|
|
375
|
+
provider,
|
|
362
376
|
hookEventName,
|
|
363
|
-
sessionId:
|
|
364
|
-
cwd:
|
|
365
|
-
transcriptPath:
|
|
377
|
+
sessionId: resolvedPayload.session_id ?? null,
|
|
378
|
+
cwd: resolvedPayload.cwd ?? null,
|
|
379
|
+
transcriptPath: resolvedPayload.transcript_path ?? null
|
|
366
380
|
});
|
|
367
381
|
if (!hookEventName) {
|
|
368
382
|
throw new AppError({
|
|
@@ -388,23 +402,23 @@ export class SessionLiveRuntimeService {
|
|
|
388
402
|
hookEventName,
|
|
389
403
|
route: "handleClaudePreToolUse"
|
|
390
404
|
});
|
|
391
|
-
return this.sessionPermissionRequestService.handleClaudePreToolUse(
|
|
405
|
+
return this.sessionPermissionRequestService.handleClaudePreToolUse(resolvedPayload, provider);
|
|
392
406
|
}
|
|
393
407
|
if (hookEventName === "PermissionRequest") {
|
|
394
408
|
logPermissionDebug("claude_hook_event.route", {
|
|
395
409
|
hookEventName,
|
|
396
410
|
route: "handleClaudePermissionRequest"
|
|
397
411
|
});
|
|
398
|
-
return this.sessionPermissionRequestService.handleClaudePermissionRequest(
|
|
412
|
+
return this.sessionPermissionRequestService.handleClaudePermissionRequest(resolvedPayload, provider);
|
|
399
413
|
}
|
|
400
|
-
const providerSessionId = normalizeRequiredText(
|
|
401
|
-
const workspacePath = normalizeRequiredText(
|
|
414
|
+
const providerSessionId = normalizeRequiredText(resolvedPayload.session_id, "session_id");
|
|
415
|
+
const workspacePath = normalizeRequiredText(resolvedPayload.cwd, "cwd");
|
|
402
416
|
const workspace = this.workspaceService.findWorkspaceByPath(workspacePath);
|
|
403
417
|
if (!workspace) {
|
|
404
418
|
logPermissionDebug("claude_hook_event.workspace_not_found", {
|
|
405
419
|
hookEventName,
|
|
406
|
-
sessionId:
|
|
407
|
-
cwd:
|
|
420
|
+
sessionId: resolvedPayload.session_id ?? null,
|
|
421
|
+
cwd: resolvedPayload.cwd ?? null
|
|
408
422
|
});
|
|
409
423
|
return {
|
|
410
424
|
accepted: true,
|
|
@@ -414,13 +428,14 @@ export class SessionLiveRuntimeService {
|
|
|
414
428
|
};
|
|
415
429
|
}
|
|
416
430
|
const binding = await this.resolveClaudeExternalBinding({
|
|
431
|
+
provider,
|
|
417
432
|
providerSessionId,
|
|
418
433
|
workspaceId: workspace.id,
|
|
419
434
|
workspacePath: workspace.path,
|
|
420
|
-
transcriptPath: normalizeOptionalText(
|
|
435
|
+
transcriptPath: normalizeOptionalText(resolvedPayload.transcript_path)
|
|
421
436
|
});
|
|
422
437
|
const timestamp = nowIso();
|
|
423
|
-
const runtimeUpdate = mapClaudeHookToRuntimeUpdate(hookEventName,
|
|
438
|
+
const runtimeUpdate = mapClaudeHookToRuntimeUpdate(hookEventName, resolvedPayload, timestamp);
|
|
424
439
|
logPermissionDebug("claude_hook_event.runtime_update", {
|
|
425
440
|
hookEventName,
|
|
426
441
|
sessionId: binding.sessionId,
|
|
@@ -445,6 +460,7 @@ export class SessionLiveRuntimeService {
|
|
|
445
460
|
};
|
|
446
461
|
}
|
|
447
462
|
await this.applyExternalRuntimeUpdate({
|
|
463
|
+
provider,
|
|
448
464
|
sessionId: binding.sessionId,
|
|
449
465
|
workspaceId: workspace.id,
|
|
450
466
|
providerSessionId,
|
|
@@ -506,7 +522,7 @@ export class SessionLiveRuntimeService {
|
|
|
506
522
|
if (externalRuntimeSnapshot) {
|
|
507
523
|
return {
|
|
508
524
|
sessionId,
|
|
509
|
-
provider:
|
|
525
|
+
provider: externalRuntimeSnapshot.provider,
|
|
510
526
|
providerSessionId: externalRuntimeSnapshot.providerSessionId,
|
|
511
527
|
runningState: resolution.runningState,
|
|
512
528
|
hasActiveRun: externalHasActiveRun,
|
|
@@ -900,10 +916,10 @@ export class SessionLiveRuntimeService {
|
|
|
900
916
|
}
|
|
901
917
|
async resolveClaudeExternalBinding(input) {
|
|
902
918
|
const rawStoreRef = input.transcriptPath ??
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
let binding = this.sessionBindingRepository.findByProviderSession(
|
|
906
|
-
this.sessionBindingRepository.findByRawStoreRef(
|
|
919
|
+
findClaudeCompatibleSessionFile(this.config, input.provider, input.workspacePath, input.providerSessionId) ??
|
|
920
|
+
buildClaudeCompatibleRawStoreRef(this.config, input.provider, input.workspacePath, input.providerSessionId);
|
|
921
|
+
let binding = this.sessionBindingRepository.findByProviderSession(input.provider, input.providerSessionId) ??
|
|
922
|
+
this.sessionBindingRepository.findByRawStoreRef(input.provider, rawStoreRef);
|
|
907
923
|
if (!binding) {
|
|
908
924
|
const userIds = this.authUserRepository.listIds();
|
|
909
925
|
const bootstrapUserId = userIds[0] ?? null;
|
|
@@ -916,8 +932,8 @@ export class SessionLiveRuntimeService {
|
|
|
916
932
|
});
|
|
917
933
|
}
|
|
918
934
|
binding =
|
|
919
|
-
this.sessionBindingRepository.findByProviderSession(
|
|
920
|
-
this.sessionBindingRepository.findByRawStoreRef(
|
|
935
|
+
this.sessionBindingRepository.findByProviderSession(input.provider, input.providerSessionId) ??
|
|
936
|
+
this.sessionBindingRepository.findByRawStoreRef(input.provider, rawStoreRef);
|
|
921
937
|
}
|
|
922
938
|
if (binding) {
|
|
923
939
|
return {
|
|
@@ -928,19 +944,19 @@ export class SessionLiveRuntimeService {
|
|
|
928
944
|
const sessionId = createId();
|
|
929
945
|
const timestamp = nowIso();
|
|
930
946
|
this.sessionHistoryService.persistSessionBinding(sessionId, input.workspaceId, {
|
|
931
|
-
provider:
|
|
947
|
+
provider: input.provider,
|
|
932
948
|
providerSessionId: input.providerSessionId,
|
|
933
949
|
rawStoreRef
|
|
934
950
|
});
|
|
935
951
|
this.sessionIndexRepository.upsert({
|
|
936
952
|
sessionId,
|
|
937
953
|
workspaceId: input.workspaceId,
|
|
938
|
-
provider:
|
|
954
|
+
provider: input.provider,
|
|
939
955
|
parentSessionId: null,
|
|
940
956
|
sessionKind: "default",
|
|
941
957
|
isSubagent: false,
|
|
942
958
|
subagentLabel: null,
|
|
943
|
-
title:
|
|
959
|
+
title: buildClaudeCompatibleSessionTitle(input.provider, input.providerSessionId),
|
|
944
960
|
messageCount: 0,
|
|
945
961
|
isArchived: false,
|
|
946
962
|
lastMessageAt: null,
|
|
@@ -1021,7 +1037,7 @@ export class SessionLiveRuntimeService {
|
|
|
1021
1037
|
if (input.runningState === "running") {
|
|
1022
1038
|
this.externalRuntimeSnapshots.set(input.sessionId, {
|
|
1023
1039
|
sessionId: input.sessionId,
|
|
1024
|
-
provider:
|
|
1040
|
+
provider: input.provider,
|
|
1025
1041
|
providerSessionId: input.providerSessionId,
|
|
1026
1042
|
rawStoreRef: input.rawStoreRef,
|
|
1027
1043
|
runningState: input.runningState,
|
|
@@ -1064,7 +1080,7 @@ export class SessionLiveRuntimeService {
|
|
|
1064
1080
|
this.runtimeMessageSeenSessions.delete(request.sessionId);
|
|
1065
1081
|
this.runtimeHistoryFallbackSentSessions.delete(request.sessionId);
|
|
1066
1082
|
this.clearExternalRuntimeInterruptSuppression(request.sessionId);
|
|
1067
|
-
if (request.provider
|
|
1083
|
+
if (isClaudeCompatibleProvider(request.provider)) {
|
|
1068
1084
|
this.clearExternalRuntimeSnapshot(request.sessionId);
|
|
1069
1085
|
}
|
|
1070
1086
|
const handle = await this.launchRuntimeRun(request, mode, providerBinding);
|
|
@@ -1105,18 +1121,18 @@ export class SessionLiveRuntimeService {
|
|
|
1105
1121
|
const activeRun = this.getLiveRuntimeSnapshot(runtimeSessionId);
|
|
1106
1122
|
const externalRuntimeSnapshot = this.getFreshExternalRuntimeSnapshot(runtimeSessionId);
|
|
1107
1123
|
const hasActiveRun = Boolean(activeRun && isActiveRuntimeState(activeRun.runningState));
|
|
1108
|
-
if (hasActiveRun && activeRun?.provider
|
|
1124
|
+
if (hasActiveRun && isClaudeCompatibleProvider(activeRun?.provider)) {
|
|
1109
1125
|
this.clearExternalRuntimeSnapshot(runtimeSessionId);
|
|
1110
1126
|
}
|
|
1111
1127
|
if (hasActiveRun
|
|
1112
1128
|
|| (!activeRun &&
|
|
1113
|
-
session.provider
|
|
1129
|
+
isClaudeCompatibleProvider(session.provider) &&
|
|
1114
1130
|
externalRuntimeSnapshot &&
|
|
1115
1131
|
isActiveRuntimeState(externalRuntimeSnapshot.runningState))) {
|
|
1116
1132
|
this.assertProviderBindingStableDuringActiveRun(existingBinding, resolvedProviderBinding);
|
|
1117
1133
|
}
|
|
1118
1134
|
if (!activeRun &&
|
|
1119
|
-
session.provider
|
|
1135
|
+
isClaudeCompatibleProvider(session.provider) &&
|
|
1120
1136
|
externalRuntimeSnapshot &&
|
|
1121
1137
|
isActiveRuntimeState(externalRuntimeSnapshot.runningState)) {
|
|
1122
1138
|
throw new AppError({
|
|
@@ -1142,8 +1158,9 @@ export class SessionLiveRuntimeService {
|
|
|
1142
1158
|
const resolvedAttachments = persistedAttachments
|
|
1143
1159
|
?? this.persistMessageAttachments(input.sessionId, input.clientRequestId, input.runtimeOptions?.attachments ?? []);
|
|
1144
1160
|
const providerPrompt = this.sessionMessageAttachmentService.buildProviderPrompt(session.provider, input.content, resolvedAttachments.runtimeAttachments);
|
|
1161
|
+
const resolvedProviderPrompt = this.composeProviderPrompt(session.provider, providerPrompt, providerLaunchContext.runtimeEnv);
|
|
1145
1162
|
const providerInstructionFilePath = resolveRuntimeInstructionFilePath(session.provider, workspace.path, input.runtimeOptions?.providerInstructionFilePath ?? null);
|
|
1146
|
-
this.ensureCapability(capabilities
|
|
1163
|
+
this.ensureCapability(capabilities, "sessionId", "canSendMessage", "provider 不支持实时对话");
|
|
1147
1164
|
const runtimeRequest = {
|
|
1148
1165
|
sessionId: input.sessionId,
|
|
1149
1166
|
workspaceId: session.workspaceId,
|
|
@@ -1160,7 +1177,7 @@ export class SessionLiveRuntimeService {
|
|
|
1160
1177
|
model: input.runtimeOptions?.model ?? null,
|
|
1161
1178
|
reasoningLevel: input.runtimeOptions?.reasoningLevel ?? null,
|
|
1162
1179
|
permissionMode: input.runtimeOptions?.permissionMode ?? null,
|
|
1163
|
-
providerPrompt,
|
|
1180
|
+
providerPrompt: resolvedProviderPrompt,
|
|
1164
1181
|
providerInstructionFilePath,
|
|
1165
1182
|
attachments: resolvedAttachments.runtimeAttachments
|
|
1166
1183
|
}
|
|
@@ -1219,7 +1236,7 @@ export class SessionLiveRuntimeService {
|
|
|
1219
1236
|
this.logSendDebugStep(debugTrace, "accepted_user_lookup", acceptedLookupStartedAtMs, {
|
|
1220
1237
|
matched: Boolean(acceptedMessage)
|
|
1221
1238
|
});
|
|
1222
|
-
const acceptedAt = acceptedMessage?.timestamp ??
|
|
1239
|
+
const acceptedAt = acceptedMessage?.timestamp ?? requestStartedAt;
|
|
1223
1240
|
this.sessionHistoryService.resolveMessageOriginByClientRequestId(input.sessionId, input.clientRequestId, acceptedMessage?.messageId ?? null, acceptedAt);
|
|
1224
1241
|
const boundAttachments = this.sessionMessageAttachmentService.bindClientRequestToMessage(input.sessionId, input.clientRequestId, acceptedMessage?.messageId ?? null);
|
|
1225
1242
|
this.refreshSyntheticSessionTitle(session, input.content, input.userId);
|
|
@@ -1251,6 +1268,20 @@ export class SessionLiveRuntimeService {
|
|
|
1251
1268
|
throw error;
|
|
1252
1269
|
}
|
|
1253
1270
|
}
|
|
1271
|
+
composeProviderPrompt(provider, basePrompt, runtimeEnv) {
|
|
1272
|
+
const openCliPrompt = this.openCliSessionPromptService?.buildPrompt({
|
|
1273
|
+
provider,
|
|
1274
|
+
runtimeEnv
|
|
1275
|
+
}) ?? null;
|
|
1276
|
+
if (!openCliPrompt) {
|
|
1277
|
+
return basePrompt;
|
|
1278
|
+
}
|
|
1279
|
+
const normalizedBasePrompt = basePrompt?.trim() ?? "";
|
|
1280
|
+
if (!normalizedBasePrompt) {
|
|
1281
|
+
return openCliPrompt;
|
|
1282
|
+
}
|
|
1283
|
+
return `${normalizedBasePrompt}\n\n${openCliPrompt}`;
|
|
1284
|
+
}
|
|
1254
1285
|
async dispatchNextQueuedMessage(sessionId) {
|
|
1255
1286
|
if (this.queueDispatchSessions.has(sessionId)) {
|
|
1256
1287
|
return;
|
|
@@ -1328,7 +1359,7 @@ export class SessionLiveRuntimeService {
|
|
|
1328
1359
|
if (externalRuntimeSnapshot && isActiveRuntimeState(externalRuntimeSnapshot.runningState)) {
|
|
1329
1360
|
return true;
|
|
1330
1361
|
}
|
|
1331
|
-
if (session.provider
|
|
1362
|
+
if (isClaudeCompatibleProvider(session.provider) && isPendingSessionRunningState(session.runningState)) {
|
|
1332
1363
|
return true;
|
|
1333
1364
|
}
|
|
1334
1365
|
return false;
|
|
@@ -1356,7 +1387,7 @@ export class SessionLiveRuntimeService {
|
|
|
1356
1387
|
}
|
|
1357
1388
|
async resolveQueueDispatchSession(sessionId, userId) {
|
|
1358
1389
|
const session = this.sessionHistoryService.getSession(sessionId, userId);
|
|
1359
|
-
if (session.provider
|
|
1390
|
+
if (!isClaudeCompatibleProvider(session.provider)
|
|
1360
1391
|
|| !isPendingSessionRunningState(session.runningState)) {
|
|
1361
1392
|
return session;
|
|
1362
1393
|
}
|
|
@@ -2032,7 +2063,7 @@ export class SessionLiveRuntimeService {
|
|
|
2032
2063
|
};
|
|
2033
2064
|
}
|
|
2034
2065
|
async maybeEmitRuntimeHistoryFallback(sessionId, event) {
|
|
2035
|
-
if (event.provider
|
|
2066
|
+
if (!isClaudeCompatibleProvider(event.provider)) {
|
|
2036
2067
|
return;
|
|
2037
2068
|
}
|
|
2038
2069
|
if (event.status === "starting") {
|
|
@@ -2053,16 +2084,11 @@ export class SessionLiveRuntimeService {
|
|
|
2053
2084
|
this.runtimeHistoryFallbackSentSessions.add(sessionId);
|
|
2054
2085
|
await this.emitExternalRuntimeEnvelope(envelope);
|
|
2055
2086
|
}
|
|
2056
|
-
ensureCapability(
|
|
2057
|
-
if (
|
|
2087
|
+
ensureCapability(capabilities, field, capability, detail) {
|
|
2088
|
+
if (capabilities[capability]) {
|
|
2058
2089
|
return;
|
|
2059
2090
|
}
|
|
2060
|
-
throw
|
|
2061
|
-
statusCode: 400,
|
|
2062
|
-
errorCode: "CAPABILITY_NOT_SUPPORTED",
|
|
2063
|
-
detail,
|
|
2064
|
-
field
|
|
2065
|
-
});
|
|
2091
|
+
throw createProviderCapabilityBlockedError(capabilities, field, detail);
|
|
2066
2092
|
}
|
|
2067
2093
|
upsertSnapshot(sessionId, input) {
|
|
2068
2094
|
this.sessionStatusSnapshotRepository.upsert({
|
|
@@ -2074,7 +2100,7 @@ export class SessionLiveRuntimeService {
|
|
|
2074
2100
|
shouldIgnoreClaudeExternalRuntimeUpdate(sessionId) {
|
|
2075
2101
|
const runtimeSnapshot = this.getLiveRuntimeSnapshot(sessionId);
|
|
2076
2102
|
return Boolean(runtimeSnapshot &&
|
|
2077
|
-
runtimeSnapshot.provider
|
|
2103
|
+
isClaudeCompatibleProvider(runtimeSnapshot.provider) &&
|
|
2078
2104
|
isActiveRuntimeState(runtimeSnapshot.runningState));
|
|
2079
2105
|
}
|
|
2080
2106
|
clearExternalRuntimeSnapshot(sessionId) {
|
|
@@ -2116,7 +2142,7 @@ export class SessionLiveRuntimeService {
|
|
|
2116
2142
|
async resolveActiveClaudePermissionSession(input) {
|
|
2117
2143
|
const activeSnapshots = this.providerRuntimeService
|
|
2118
2144
|
.listSnapshots()
|
|
2119
|
-
.filter((snapshot) => snapshot.provider ===
|
|
2145
|
+
.filter((snapshot) => snapshot.provider === input.provider &&
|
|
2120
2146
|
snapshot.workspaceId === input.workspaceId &&
|
|
2121
2147
|
isActiveRuntimeState(snapshot.runningState));
|
|
2122
2148
|
if (activeSnapshots.length !== 1) {
|
|
@@ -2128,9 +2154,9 @@ export class SessionLiveRuntimeService {
|
|
|
2128
2154
|
}
|
|
2129
2155
|
const rawStoreRef = input.transcriptPath ??
|
|
2130
2156
|
activeSnapshot.rawStoreRef ??
|
|
2131
|
-
|
|
2157
|
+
buildClaudeCompatibleRawStoreRef(this.config, input.provider, input.workspacePath, input.providerSessionId);
|
|
2132
2158
|
this.sessionHistoryService.persistSessionBinding(activeSnapshot.sessionId, input.workspaceId, {
|
|
2133
|
-
provider:
|
|
2159
|
+
provider: input.provider,
|
|
2134
2160
|
providerSessionId: input.providerSessionId,
|
|
2135
2161
|
rawStoreRef
|
|
2136
2162
|
});
|
|
@@ -2445,7 +2471,8 @@ function waitForAcceptedUserLookupWindow() {
|
|
|
2445
2471
|
});
|
|
2446
2472
|
}
|
|
2447
2473
|
function createProviderRuntimeAdapters(config, options = {}) {
|
|
2448
|
-
const claudeHookBridgeConfig = buildClaudeHookBridgeConfig(config);
|
|
2474
|
+
const claudeHookBridgeConfig = buildClaudeHookBridgeConfig(config, "claude-code");
|
|
2475
|
+
const legnaHookBridgeConfig = buildClaudeHookBridgeConfig(config, "legna-code");
|
|
2449
2476
|
const claudeAdapter = process.env.VITEST
|
|
2450
2477
|
? new ClaudeRuntimeAdapter({
|
|
2451
2478
|
homeDir: config.claudeCodeHomeDir,
|
|
@@ -2473,7 +2500,12 @@ function createProviderRuntimeAdapters(config, options = {}) {
|
|
|
2473
2500
|
new LegnaRuntimeAdapter({
|
|
2474
2501
|
homeDir: config.legnaCodeHomeDir,
|
|
2475
2502
|
commandPath: config.legnaCodeCliPath,
|
|
2476
|
-
legacyClaudeHomeDir: config.claudeCodeHomeDir
|
|
2503
|
+
legacyClaudeHomeDir: config.claudeCodeHomeDir,
|
|
2504
|
+
hookBridge: {
|
|
2505
|
+
url: legnaHookBridgeConfig.bridgeUrl,
|
|
2506
|
+
token: config.claudeHookBridgeToken,
|
|
2507
|
+
scriptPath: legnaHookBridgeConfig.scriptPath
|
|
2508
|
+
}
|
|
2477
2509
|
}),
|
|
2478
2510
|
new CodexRuntimeAdapter({
|
|
2479
2511
|
homeDir: config.codexHomeDir,
|
|
@@ -2518,11 +2550,14 @@ function resolveRuntimeInstructionFilePath(provider, workspacePath, explicitFile
|
|
|
2518
2550
|
const resolvedExplicit = path.resolve(normalizedExplicit);
|
|
2519
2551
|
return existsSync(resolvedExplicit) ? resolvedExplicit : null;
|
|
2520
2552
|
}
|
|
2521
|
-
const
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2553
|
+
const defaultInstructionFileNames = {
|
|
2554
|
+
"claude-code": "CLAUDE.md",
|
|
2555
|
+
"legna-code": "LEGNA.md"
|
|
2556
|
+
};
|
|
2557
|
+
const defaultInstructionFileName = defaultInstructionFileNames[provider];
|
|
2558
|
+
const defaultInstructionPath = defaultInstructionFileName
|
|
2559
|
+
? path.join(workspacePath, defaultInstructionFileName)
|
|
2560
|
+
: null;
|
|
2526
2561
|
if (!defaultInstructionPath) {
|
|
2527
2562
|
return null;
|
|
2528
2563
|
}
|
|
@@ -2530,12 +2565,12 @@ function resolveRuntimeInstructionFilePath(provider, workspacePath, explicitFile
|
|
|
2530
2565
|
? path.resolve(defaultInstructionPath)
|
|
2531
2566
|
: null;
|
|
2532
2567
|
}
|
|
2533
|
-
function buildClaudeHookBridgeConfig(config) {
|
|
2534
|
-
const bridgeUrl =
|
|
2568
|
+
function buildClaudeHookBridgeConfig(config, provider) {
|
|
2569
|
+
const bridgeUrl = buildClaudeCompatibleHookBridgeUrl(config, provider);
|
|
2535
2570
|
const scriptPath = resolveClaudeHookBridgeScriptPath();
|
|
2536
2571
|
const command = `node "${scriptPath}" --url "${bridgeUrl}" --token "${config.claudeHookBridgeToken}"`;
|
|
2537
2572
|
return {
|
|
2538
|
-
provider
|
|
2573
|
+
provider,
|
|
2539
2574
|
bridgeUrl,
|
|
2540
2575
|
token: config.claudeHookBridgeToken,
|
|
2541
2576
|
scriptPath,
|
|
@@ -2565,28 +2600,6 @@ function resolveClaudeHookBridgeScriptPath() {
|
|
|
2565
2600
|
}
|
|
2566
2601
|
return candidates[0];
|
|
2567
2602
|
}
|
|
2568
|
-
function buildClaudeRawStoreRef(homeDir, workspacePath, sessionId) {
|
|
2569
|
-
return path.join(homeDir, "projects", workspaceSlug(workspacePath), `${sessionId}.jsonl`);
|
|
2570
|
-
}
|
|
2571
|
-
function findClaudeSessionFile(homeDir, sessionId) {
|
|
2572
|
-
const projectsDir = path.join(homeDir, "projects");
|
|
2573
|
-
if (!existsSync(projectsDir)) {
|
|
2574
|
-
return null;
|
|
2575
|
-
}
|
|
2576
|
-
const candidates = readdirSync(projectsDir, { withFileTypes: true })
|
|
2577
|
-
.filter((entry) => entry.isDirectory())
|
|
2578
|
-
.map((entry) => path.join(projectsDir, entry.name, `${sessionId}.jsonl`))
|
|
2579
|
-
.filter((candidate) => existsSync(candidate));
|
|
2580
|
-
return candidates[0] ?? null;
|
|
2581
|
-
}
|
|
2582
|
-
function workspaceSlug(workspacePath) {
|
|
2583
|
-
const trimmed = workspacePath.replace(/[\\/]+$/, "");
|
|
2584
|
-
const normalizedDriveLetter = trimmed.replace(/^[A-Z](?=:)/, (value) => value.toLowerCase());
|
|
2585
|
-
return normalizedDriveLetter
|
|
2586
|
-
.replaceAll(":", "-")
|
|
2587
|
-
.replaceAll("\\", "-")
|
|
2588
|
-
.replaceAll("/", "-");
|
|
2589
|
-
}
|
|
2590
2603
|
function normalizeOptionalBindingValue(value) {
|
|
2591
2604
|
const normalized = value?.trim();
|
|
2592
2605
|
return normalized && normalized.length > 0 ? normalized : null;
|