@jingyi0605/codingns 1.0.0-beta.2 → 1.0.0-beta.3

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 (75) hide show
  1. package/dist/public/assets/{AdaptiveButlerPage-BHUAx_24.js → AdaptiveButlerPage-CLHLiZSY.js} +1 -1
  2. package/dist/public/assets/{App-D5hc6KuU.js → App-FYuZfAoO.js} +3 -3
  3. package/dist/public/assets/{BootstrapPage-C2sMZMJa.js → BootstrapPage-3xpnsG-A.js} +1 -1
  4. package/dist/public/assets/ConversationPage-C5_ZqhU3.js +9 -0
  5. package/dist/public/assets/{DesktopDetachPreviewPage-D9Abm5NU.js → DesktopDetachPreviewPage-B77MG82y.js} +1 -1
  6. package/dist/public/assets/{DesktopModal-BCVZq_PQ.js → DesktopModal-K5bEcj38.js} +1 -1
  7. package/dist/public/assets/{DesktopWindowPage-Cotl5fte.js → DesktopWindowPage-DbG-RBAf.js} +1 -1
  8. package/dist/public/assets/{FileContextPanel-DbPOq5w-.js → FileContextPanel-C-1yOton.js} +1 -1
  9. package/dist/public/assets/{GitSidebar-Cuxi2R93.js → GitSidebar-DFHAPT3S.js} +1 -1
  10. package/dist/public/assets/{MobileCreateSessionSheet-DYqarJqO.js → MobileCreateSessionSheet-gOyAZ857.js} +1 -1
  11. package/dist/public/assets/{MobileSheet-DPYtp5Ze.js → MobileSheet-D0MfNkTv.js} +1 -1
  12. package/dist/public/assets/{PluginAccessOverview-CiVzb_NI.js → PluginAccessOverview-IrYIPLg3.js} +1 -1
  13. package/dist/public/assets/{PluginContainerPage-BfZ3E41c.js → PluginContainerPage-b9LQVuqG.js} +1 -1
  14. package/dist/public/assets/{PluginDetailPage-DQQAg_ba.js → PluginDetailPage-BX7gohai.js} +1 -1
  15. package/dist/public/assets/{PluginsListPage-bF1NmA_r.js → PluginsListPage-R0SibHMi.js} +1 -1
  16. package/dist/public/assets/{PureConversationPage-CWji-ARJ.js → PureConversationPage-CcakFvo0.js} +1 -1
  17. package/dist/public/assets/{RelayConnectEntryPage-D4-3Fher.js → RelayConnectEntryPage-cAVq_kNM.js} +1 -1
  18. package/dist/public/assets/{ServerSettingsModal-BUY1Y3g6.js → ServerSettingsModal-BJwYHdKD.js} +1 -1
  19. package/dist/public/assets/{SessionIndexPage-zVB9jnzP.js → SessionIndexPage-CJKRHB_F.js} +1 -1
  20. package/dist/public/assets/{SettingsPage-DeqR2p7d.js → SettingsPage-Csp7wEBC.js} +1 -1
  21. package/dist/public/assets/{TerminalManagerPanel-BjnC70ga.js → TerminalManagerPanel-2HG-NyfR.js} +1 -1
  22. package/dist/public/assets/{ToolFilesPage-BZseQqvZ.js → ToolFilesPage-BAZdjNaF.js} +1 -1
  23. package/dist/public/assets/{ToolGitPage-SrOO8Ftz.js → ToolGitPage-CGkPmgsz.js} +1 -1
  24. package/dist/public/assets/{ToolProcessesPage-Dbzlqjdy.js → ToolProcessesPage-BHpS7-VH.js} +1 -1
  25. package/dist/public/assets/{ToolsHomePage-BBilUc0P.js → ToolsHomePage-DDGqYwYU.js} +1 -1
  26. package/dist/public/assets/{WorkbenchLandingPage-FdsBC8WN.js → WorkbenchLandingPage-B4aooEYJ.js} +1 -1
  27. package/dist/public/assets/{WorkbenchLayout-yGxGKcG1.js → WorkbenchLayout-DrAvGjGK.js} +81 -79
  28. package/dist/public/assets/{WorkbenchModal-Cm-ciXO9.js → WorkbenchModal-BK5ix8YI.js} +1 -1
  29. package/dist/public/assets/WorkbenchShellRoute-p1FvkoPN.js +1 -0
  30. package/dist/public/assets/{WorkspaceDebugDetailPage-CZtpOiY0.js → WorkspaceDebugDetailPage-CPgAe8dd.js} +1 -1
  31. package/dist/public/assets/{WorkspaceDetailPage-CbbgUz1H.js → WorkspaceDetailPage-YM85dTGg.js} +1 -1
  32. package/dist/public/assets/{WorkspaceHomePage-DMNJKAYe.js → WorkspaceHomePage-DPPvwM93.js} +1 -1
  33. package/dist/public/assets/{client-runtime-manager-tsFkLtO_.js → client-runtime-manager-Clq-8rWh.js} +1 -1
  34. package/dist/public/assets/{host-alias-df5bYDlE.js → host-alias-BxzpRYrt.js} +1 -1
  35. package/dist/public/assets/{index-CILPuSCp.js → index-BArTKWXk.js} +3 -3
  36. package/dist/public/assets/index-CqKepLbu.css +1 -0
  37. package/dist/public/assets/{login-direct-candidate-resolver-pkfXrMJy.js → login-direct-candidate-resolver-BiWwFKnk.js} +1 -1
  38. package/dist/public/assets/{peer-host-config-sync-nS_66OLg.js → peer-host-config-sync-kTom1_pp.js} +1 -1
  39. package/dist/public/assets/{plugin-permission-copy-LDy-lW7h.js → plugin-permission-copy-1_1wViri.js} +1 -1
  40. package/dist/public/assets/{plugins-api-BGF9OybZ.js → plugins-api-C0JqR2-W.js} +1 -1
  41. package/dist/public/assets/{preferences-service-BC25oxA_.js → preferences-service-DWeLWZST.js} +1 -1
  42. package/dist/public/assets/{relay-entry-ErQKnI7B.js → relay-entry-ClEd3cjN.js} +1 -1
  43. package/dist/public/assets/{useRegisteredDebugTemplates-BTr3ATCZ.js → useRegisteredDebugTemplates-wJGOYam9.js} +1 -1
  44. package/dist/public/assets/{workbench-navigation-hwM28xIb.js → workbench-navigation-vIWt3Rv_.js} +1 -1
  45. package/dist/public/index.html +2 -2
  46. package/dist/server/modules/sessions/codex-app-server-helper-process.js +84 -20
  47. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  48. package/dist/server/modules/sessions/session-controller.js +2 -1
  49. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  50. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +14 -0
  51. package/dist/server/modules/sessions/session-live-runtime-service.js +103 -4
  52. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  53. package/dist/server/modules/sessions/session-permission-request-service.d.ts +1 -0
  54. package/dist/server/modules/sessions/session-permission-request-service.js +27 -5
  55. package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
  56. package/dist/server/modules/sessions/session-provider-config-service.js +1 -0
  57. package/dist/server/modules/sessions/session-provider-config-service.js.map +1 -1
  58. package/dist/server/modules/sessions/workspace-session-runtime-context-service.js +5 -1
  59. package/dist/server/modules/sessions/workspace-session-runtime-context-service.js.map +1 -1
  60. package/dist/server/storage/repositories/session-send-queue-repository.d.ts +1 -0
  61. package/dist/server/storage/repositories/session-send-queue-repository.js +23 -0
  62. package/dist/server/storage/repositories/session-send-queue-repository.js.map +1 -1
  63. package/node_modules/@codingns/session-sync-core/dist/index.d.ts +1 -0
  64. package/node_modules/@codingns/session-sync-core/dist/index.js +1 -0
  65. package/node_modules/@codingns/session-sync-core/dist/index.js.map +1 -1
  66. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.d.ts +27 -1
  67. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.js +48 -4
  68. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.js.map +1 -1
  69. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +53 -15
  70. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  71. package/package.json +2 -1
  72. package/scripts/claude-hook-bridge.cjs +167 -0
  73. package/dist/public/assets/ConversationPage-CDpyEOUA.js +0 -9
  74. package/dist/public/assets/WorkbenchShellRoute-CijuAd9-.js +0 -1
  75. package/dist/public/assets/index-CSlwKnM4.css +0 -1
@@ -99,6 +99,16 @@ export interface SessionRuntimeStatusView {
99
99
  updatedAt: string;
100
100
  watchdogTriggeredAt: string | null;
101
101
  contextUsage: ContextUsageSnapshot | null;
102
+ permissionStatus: SessionRuntimePermissionStatusView | null;
103
+ }
104
+ export interface SessionRuntimePermissionStatusView {
105
+ requestedPermissionMode: string | null;
106
+ effectivePermissionMode: "default" | "acceptEdits" | "bypassPermissions";
107
+ effectiveSandboxMode: "read-only" | "workspace-write" | "danger-full-access" | null;
108
+ effectiveApprovalPolicy: "never" | "cli-default" | null;
109
+ source: "codex-cli-default" | "codingns-override" | "provider-non-codex";
110
+ summary: string;
111
+ detail: string;
102
112
  }
103
113
  export interface InterruptSessionResult {
104
114
  sessionId: string;
@@ -221,6 +231,7 @@ export declare class SessionLiveRuntimeService {
221
231
  private readonly queueRetryTimers;
222
232
  private readonly pendingSendDebugTracesBySessionId;
223
233
  private readonly runtimePersistenceQueues;
234
+ private readonly sessionPermissionRuntimeStates;
224
235
  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, workspaceSessionRuntimeContextService?: Pick<WorkspaceSessionRuntimeContextService, "prepareWorkspaceInstructionBundle"> | null);
225
236
  startLiveSession(input: StartLiveSessionInput): Promise<LiveMessageAcceptedResult>;
226
237
  sendLiveMessage(input: SendLiveMessageInput): Promise<LiveMessageAcceptedResult>;
@@ -246,6 +257,9 @@ export declare class SessionLiveRuntimeService {
246
257
  private subscribeExternalRuntime;
247
258
  private emitExternalRuntimeEnvelope;
248
259
  private getLiveRuntimeSnapshot;
260
+ private resolveRequestedPermissionMode;
261
+ private rememberRequestedPermissionMode;
262
+ private logSessionPermissionStatus;
249
263
  private demoteDeadRuntimeSnapshot;
250
264
  private scheduleDeadRuntimeReconciliation;
251
265
  private reconcileDeadRuntimeSession;
@@ -1,7 +1,8 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
3
4
  import { performance } from "node:perf_hooks";
4
- import { ClaudeRuntimeAdapter, CodexRuntimeAdapter, GeminiRuntimeAdapter, KimiRuntimeAdapter, LegnaRuntimeAdapter, OpenCodeRuntimeAdapter, ProviderRuntimeService } from "@codingns/session-sync-core";
5
+ import { ClaudeRuntimeAdapter, CodexRuntimeAdapter, GeminiRuntimeAdapter, KimiRuntimeAdapter, LegnaRuntimeAdapter, OpenCodeRuntimeAdapter, ProviderRuntimeService, resolveCodexPermissionResolution } from "@codingns/session-sync-core";
5
6
  import { AppError, isAppError } from "../../shared/errors/app-error.js";
6
7
  import { createId } from "../../shared/utils/id.js";
7
8
  import { isPerfDebugEnabled, logPerformance } from "../../shared/utils/perf-log.js";
@@ -17,6 +18,42 @@ import { ClaudeRuntimeHelperAdapter } from "./claude-runtime-helper-client.js";
17
18
  import { CodexAppServerHelperClient } from "./codex-app-server-helper-client.js";
18
19
  const OPENCODE_ORDER_DEBUG_ENABLED = /^(1|true|yes)$/i.test(process.env.CODINGNS_OPENCODE_ORDER_DEBUG?.trim() ?? "");
19
20
  const RUNTIME_EVENT_SQLITE_BUSY_RETRY_DELAYS_MS = [100, 250, 500, 1_000, 1_500, 2_000];
21
+ function buildSessionRuntimePermissionStatus(input) {
22
+ if (input.provider !== "codex") {
23
+ return {
24
+ requestedPermissionMode: input.requestedPermissionMode,
25
+ effectivePermissionMode: "default",
26
+ effectiveSandboxMode: null,
27
+ effectiveApprovalPolicy: null,
28
+ source: "provider-non-codex",
29
+ summary: "当前 provider 不使用 Codex 沙箱权限映射。",
30
+ detail: "这份权限说明只对 Codex 会话生效,其他 provider 仍沿用各自的权限体系。"
31
+ };
32
+ }
33
+ const resolution = resolveCodexPermissionResolution(input.requestedPermissionMode);
34
+ if (resolution.effectivePermissionMode === "default") {
35
+ return {
36
+ requestedPermissionMode: input.requestedPermissionMode,
37
+ effectivePermissionMode: resolution.effectivePermissionMode,
38
+ effectiveSandboxMode: resolution.sandboxMode,
39
+ effectiveApprovalPolicy: resolution.approvalPolicy ? "never" : "cli-default",
40
+ source: "codex-cli-default",
41
+ summary: "当前会话跟随 Codex CLI 默认权限。",
42
+ detail: resolution.reasoning
43
+ };
44
+ }
45
+ return {
46
+ requestedPermissionMode: input.requestedPermissionMode,
47
+ effectivePermissionMode: resolution.effectivePermissionMode,
48
+ effectiveSandboxMode: resolution.sandboxMode,
49
+ effectiveApprovalPolicy: resolution.approvalPolicy ? "never" : "cli-default",
50
+ source: "codingns-override",
51
+ summary: resolution.effectivePermissionMode === "acceptEdits"
52
+ ? "当前会话已切到工作区可写权限。"
53
+ : "当前会话已切到完整权限。",
54
+ detail: resolution.reasoning
55
+ };
56
+ }
20
57
  const RUNTIME_START_BINDING_WAIT_TIMEOUT_MS = 10_000;
21
58
  const START_BINDING_POLL_INTERVAL_MS = 50;
22
59
  const EXTERNAL_RUNTIME_INTERRUPT_SUPPRESSION_MS = 30_000;
@@ -51,6 +88,7 @@ export class SessionLiveRuntimeService {
51
88
  queueRetryTimers = new Map();
52
89
  pendingSendDebugTracesBySessionId = new Map();
53
90
  runtimePersistenceQueues = new Map();
91
+ sessionPermissionRuntimeStates = new Map();
54
92
  constructor(sessionHistoryService, sessionMessageAttachmentService, workspaceService, sessionChangedFileService, sessionBindingRepository, authUserRepository, sessionSendQueueRepository, sessionIndexRepository, sessionStateRepository, sessionStatusSnapshotRepository, sessionProviderConfigService, config, sessionActivityAuthorityService = new SessionActivityAuthorityService(), openCliSessionPromptService = null, workspaceSessionRuntimeContextService = null) {
55
93
  this.sessionHistoryService = sessionHistoryService;
56
94
  this.sessionMessageAttachmentService = sessionMessageAttachmentService;
@@ -90,6 +128,7 @@ export class SessionLiveRuntimeService {
90
128
  clientRequestId: input.clientRequestId
91
129
  });
92
130
  try {
131
+ this.rememberRequestedPermissionMode(sessionId, input.runtimeOptions?.permissionMode ?? null, "start_live");
93
132
  const capabilities = this.sessionHistoryService.getProviderCapabilitiesSnapshot(input.provider);
94
133
  const providerBinding = this.sessionProviderConfigService.prepareSessionBinding({
95
134
  sessionId,
@@ -534,6 +573,12 @@ export class SessionLiveRuntimeService {
534
573
  this.maybeDispatchQueuedMessages(session);
535
574
  const capabilities = await this.sessionHistoryService.getSessionCapabilities(sessionId, userId);
536
575
  const contextUsage = await this.sessionHistoryService.getSessionContextUsage(sessionId).catch(() => null);
576
+ const requestedPermissionMode = this.resolveRequestedPermissionMode(sessionId);
577
+ const permissionStatus = buildSessionRuntimePermissionStatus({
578
+ provider: session.provider,
579
+ requestedPermissionMode
580
+ });
581
+ this.logSessionPermissionStatus(sessionId, session.provider, permissionStatus);
537
582
  const resolution = runtimeSnapshot
538
583
  ? this.sessionActivityAuthorityService.observe(createRuntimeActivityObservation(runtimeSessionId, runtimeSnapshot))
539
584
  : externalRuntimeSnapshot
@@ -562,7 +607,8 @@ export class SessionLiveRuntimeService {
562
607
  : null,
563
608
  updatedAt: resolution.updatedAt,
564
609
  watchdogTriggeredAt: resolution.watchdogTriggeredAt,
565
- contextUsage
610
+ contextUsage,
611
+ permissionStatus
566
612
  };
567
613
  }
568
614
  if (externalRuntimeSnapshot) {
@@ -584,7 +630,8 @@ export class SessionLiveRuntimeService {
584
630
  errorDetail: resolution.runningState === "failed" ? resolution.detail ?? session.lastErrorDetail : null,
585
631
  updatedAt: resolution.updatedAt,
586
632
  watchdogTriggeredAt: resolution.watchdogTriggeredAt,
587
- contextUsage
633
+ contextUsage,
634
+ permissionStatus
588
635
  };
589
636
  }
590
637
  const persistedErrorCode = resolution.runningState === "failed" ? resolution.errorCode ?? session.lastErrorCode : null;
@@ -607,7 +654,8 @@ export class SessionLiveRuntimeService {
607
654
  errorDetail: persistedErrorDetail,
608
655
  updatedAt: resolution.updatedAt,
609
656
  watchdogTriggeredAt: resolution.watchdogTriggeredAt,
610
- contextUsage
657
+ contextUsage,
658
+ permissionStatus
611
659
  };
612
660
  }
613
661
  resolveLiveActivityObservation(sessionId) {
@@ -829,6 +877,48 @@ export class SessionLiveRuntimeService {
829
877
  }
830
878
  return snapshot;
831
879
  }
880
+ resolveRequestedPermissionMode(sessionId) {
881
+ const runtimeState = this.sessionPermissionRuntimeStates.get(sessionId);
882
+ if (runtimeState?.requestedPermissionMode?.trim()) {
883
+ return runtimeState.requestedPermissionMode.trim();
884
+ }
885
+ const queuedItems = this.sessionSendQueueRepository.listBySessionId(sessionId);
886
+ const dispatchingItem = queuedItems.find((item) => item.status === "dispatching");
887
+ if (dispatchingItem?.permissionMode?.trim()) {
888
+ return dispatchingItem.permissionMode.trim();
889
+ }
890
+ const latestPermissionItem = [...queuedItems]
891
+ .reverse()
892
+ .find((item) => item.permissionMode?.trim());
893
+ if (latestPermissionItem?.permissionMode?.trim()) {
894
+ return latestPermissionItem.permissionMode.trim();
895
+ }
896
+ return null;
897
+ }
898
+ rememberRequestedPermissionMode(sessionId, permissionMode, source) {
899
+ this.sessionPermissionRuntimeStates.set(sessionId, {
900
+ requestedPermissionMode: permissionMode?.trim() || null,
901
+ updatedAt: nowIso(),
902
+ source
903
+ });
904
+ }
905
+ logSessionPermissionStatus(sessionId, provider, permissionStatus) {
906
+ if (!permissionStatus) {
907
+ return;
908
+ }
909
+ const runtimeState = this.sessionPermissionRuntimeStates.get(sessionId);
910
+ logPermissionDebug("session_runtime.permission_status", {
911
+ sessionId,
912
+ provider,
913
+ requestedPermissionMode: permissionStatus.requestedPermissionMode,
914
+ effectivePermissionMode: permissionStatus.effectivePermissionMode,
915
+ effectiveSandboxMode: permissionStatus.effectiveSandboxMode,
916
+ effectiveApprovalPolicy: permissionStatus.effectiveApprovalPolicy,
917
+ source: permissionStatus.source,
918
+ runtimeStateSource: runtimeState?.source ?? null,
919
+ runtimeStateUpdatedAt: runtimeState?.updatedAt ?? null
920
+ });
921
+ }
832
922
  demoteDeadRuntimeSnapshot(snapshot) {
833
923
  const updatedAt = nowIso();
834
924
  for (const userId of this.authUserRepository.listIds()) {
@@ -1122,6 +1212,7 @@ export class SessionLiveRuntimeService {
1122
1212
  }
1123
1213
  }
1124
1214
  async startRuntimeRun(request, userId, mode, providerBinding) {
1215
+ this.rememberRequestedPermissionMode(request.sessionId, request.options.permissionMode ?? null, "runtime_snapshot");
1125
1216
  this.runtimeMessageSeenSessions.delete(request.sessionId);
1126
1217
  this.runtimeHistoryFallbackSentSessions.delete(request.sessionId);
1127
1218
  this.clearExternalRuntimeInterruptSuppression(request.sessionId);
@@ -1160,6 +1251,7 @@ export class SessionLiveRuntimeService {
1160
1251
  clientRequestId: input.clientRequestId
1161
1252
  });
1162
1253
  try {
1254
+ this.rememberRequestedPermissionMode(input.sessionId, input.runtimeOptions?.permissionMode ?? null, "send_live");
1163
1255
  const capabilities = await this.sessionHistoryService.getSessionCapabilities(input.sessionId, input.userId);
1164
1256
  const workspace = this.workspaceService.getWorkspaceOrThrow(session.workspaceId);
1165
1257
  const runtimeMode = shouldStartNativeSessionOnFirstMessage(session);
@@ -1396,6 +1488,7 @@ export class SessionLiveRuntimeService {
1396
1488
  runtimeAttachments: restoredAttachments
1397
1489
  };
1398
1490
  try {
1491
+ this.rememberRequestedPermissionMode(nextQueueItem.sessionId, nextQueueItem.permissionMode, "queue_dispatch");
1399
1492
  await this.sendLiveMessageDirect({
1400
1493
  sessionId: nextQueueItem.sessionId,
1401
1494
  userId: nextQueueItem.userId,
@@ -3158,7 +3251,13 @@ function buildClaudeHookBridgeConfig(config, provider) {
3158
3251
  };
3159
3252
  }
3160
3253
  function resolveClaudeHookBridgeScriptPath() {
3254
+ const currentFilePath = fileURLToPath(import.meta.url);
3255
+ const currentDir = path.dirname(currentFilePath);
3256
+ const packageRoot = path.resolve(currentDir, "..", "..", "..", "..");
3257
+ const workspaceRoot = path.resolve(packageRoot, "..", "..", "..");
3161
3258
  const candidates = [
3259
+ path.resolve(packageRoot, "scripts", "claude-hook-bridge.cjs"),
3260
+ path.resolve(workspaceRoot, "scripts", "claude-hook-bridge.cjs"),
3162
3261
  path.resolve(process.cwd(), "scripts", "claude-hook-bridge.cjs"),
3163
3262
  path.resolve(process.cwd(), "..", "scripts", "claude-hook-bridge.cjs"),
3164
3263
  path.resolve(process.cwd(), "..", "..", "scripts", "claude-hook-bridge.cjs")