@code-yeongyu/senpi 2026.8.28 → 2026.8.29

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 (128) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/dist/cli/args.d.ts +2 -0
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +4 -0
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/core/agent-session-services.d.ts.map +1 -1
  7. package/dist/core/agent-session-services.js +2 -0
  8. package/dist/core/agent-session-services.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +5 -0
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +1 -0
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/auth-storage.d.ts +1 -0
  14. package/dist/core/auth-storage.d.ts.map +1 -1
  15. package/dist/core/auth-storage.js +3 -0
  16. package/dist/core/auth-storage.js.map +1 -1
  17. package/dist/core/credential-accounts.d.ts.map +1 -1
  18. package/dist/core/credential-accounts.js +22 -12
  19. package/dist/core/credential-accounts.js.map +1 -1
  20. package/dist/core/credential-pool/classify.d.ts +6 -1
  21. package/dist/core/credential-pool/classify.d.ts.map +1 -1
  22. package/dist/core/credential-pool/classify.js +22 -5
  23. package/dist/core/credential-pool/classify.js.map +1 -1
  24. package/dist/core/credential-pool/failover.d.ts +8 -0
  25. package/dist/core/credential-pool/failover.d.ts.map +1 -1
  26. package/dist/core/credential-pool/failover.js +24 -6
  27. package/dist/core/credential-pool/failover.js.map +1 -1
  28. package/dist/core/credential-pool/rotation-stream.d.ts +13 -2
  29. package/dist/core/credential-pool/rotation-stream.d.ts.map +1 -1
  30. package/dist/core/credential-pool/rotation-stream.js +97 -10
  31. package/dist/core/credential-pool/rotation-stream.js.map +1 -1
  32. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  33. package/dist/core/extensions/builtin/goal/index.js +7 -0
  34. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  35. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  36. package/dist/core/extensions/builtin/service-tier.js +13 -0
  37. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  38. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  39. package/dist/core/extensions/builtin/terminal/extension.js +4 -2
  40. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  41. package/dist/core/model-config-schema.d.ts +4 -4
  42. package/dist/core/model-runtime.d.ts +2 -0
  43. package/dist/core/model-runtime.d.ts.map +1 -1
  44. package/dist/core/model-runtime.js +74 -37
  45. package/dist/core/model-runtime.js.map +1 -1
  46. package/dist/core/retry-fallback/chains.d.ts +23 -1
  47. package/dist/core/retry-fallback/chains.d.ts.map +1 -1
  48. package/dist/core/retry-fallback/chains.js +59 -3
  49. package/dist/core/retry-fallback/chains.js.map +1 -1
  50. package/dist/core/retry-fallback/controller.d.ts.map +1 -1
  51. package/dist/core/retry-fallback/controller.js +9 -2
  52. package/dist/core/retry-fallback/controller.js.map +1 -1
  53. package/dist/core/retry-fallback/settings.d.ts.map +1 -1
  54. package/dist/core/retry-fallback/settings.js +9 -0
  55. package/dist/core/retry-fallback/settings.js.map +1 -1
  56. package/dist/core/retry-fallback/validate.js +1 -1
  57. package/dist/core/retry-fallback/validate.js.map +1 -1
  58. package/dist/core/sdk.js +1 -1
  59. package/dist/core/sdk.js.map +1 -1
  60. package/dist/core/session-manager.d.ts +9 -0
  61. package/dist/core/session-manager.d.ts.map +1 -1
  62. package/dist/core/session-manager.js +31 -0
  63. package/dist/core/session-manager.js.map +1 -1
  64. package/dist/main.d.ts +7 -0
  65. package/dist/main.d.ts.map +1 -1
  66. package/dist/main.js +10 -1
  67. package/dist/main.js.map +1 -1
  68. package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
  69. package/dist/modes/interactive/components/favorite-models-selector.js +2 -2
  70. package/dist/modes/interactive/components/favorite-models-selector.js.map +1 -1
  71. package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
  72. package/dist/modes/interactive/interactive-host-runtime.js +323 -33
  73. package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
  74. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  75. package/dist/modes/interactive/interactive-mode.js +276 -237
  76. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  77. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  78. package/dist/modes/rpc/connection-handler.js +133 -24
  79. package/dist/modes/rpc/connection-handler.js.map +1 -1
  80. package/dist/modes/rpc/multi-session-host.js +14 -4
  81. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  82. package/dist/modes/rpc/rpc-client.d.ts +82 -13
  83. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  84. package/dist/modes/rpc/rpc-client.js +85 -28
  85. package/dist/modes/rpc/rpc-client.js.map +1 -1
  86. package/dist/modes/rpc/rpc-mode.d.ts +3 -1
  87. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  88. package/dist/modes/rpc/rpc-mode.js +3 -1
  89. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  90. package/dist/modes/rpc/rpc-types.d.ts +162 -2
  91. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  92. package/dist/modes/rpc/rpc-types.js.map +1 -1
  93. package/dist/modes/rpc/session-command-router.d.ts +22 -0
  94. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  95. package/dist/modes/rpc/session-command-router.js +147 -16
  96. package/dist/modes/rpc/session-command-router.js.map +1 -1
  97. package/dist/modes/rpc/session-event-writer.d.ts +2 -0
  98. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  99. package/dist/modes/rpc/session-event-writer.js +4 -0
  100. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  101. package/dist/modes/rpc/session-registry.d.ts +7 -0
  102. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  103. package/dist/modes/rpc/session-registry.js +9 -0
  104. package/dist/modes/rpc/session-registry.js.map +1 -1
  105. package/docs/rpc.md +37 -0
  106. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +24 -0
  107. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  108. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  109. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +6 -3
  110. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  111. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  112. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  113. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  114. package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
  115. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  116. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  117. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  118. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  119. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  120. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  121. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  122. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  123. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  124. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  125. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  126. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  127. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  128. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"connection-handler.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/connection-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AACnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAwC/E,OAAO,KAAK,EAWX,eAAe,EAEf,MAAM,gBAAgB,CAAC;AAGxB,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACpC,mFAAmF;IACnF,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACpC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,sEAAsE;IACtE,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C;;;OAGG;IACH,mBAAmB,IAAI,OAAO,CAAC;IAC/B,iFAAiF;IACjF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AA4BD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe,CAiB3E;AA4BD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACzC,WAAW,EAAE,mBAAmB,EAChC,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,oBAAyB,GAChC,oBAAoB,CAyiCtB"}
1
+ {"version":3,"file":"connection-handler.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/connection-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AACnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAwC/E,OAAO,KAAK,EAWX,eAAe,EAEf,MAAM,gBAAgB,CAAC;AAGxB,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACpC,mFAAmF;IACnF,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACpC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,sEAAsE;IACtE,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C;;;OAGG;IACH,mBAAmB,IAAI,OAAO,CAAC;IAC/B,iFAAiF;IACjF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AA4BD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe,CAsC3E;AA4BD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACzC,WAAW,EAAE,mBAAmB,EAChC,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,oBAAyB,GAChC,oBAAoB,CA4pCtB"}
@@ -15,6 +15,7 @@
15
15
  * (and whether) to end the process.
16
16
  */
17
17
  import * as crypto from "node:crypto";
18
+ import { existsSync } from "node:fs";
18
19
  import { basename, dirname, extname } from "node:path";
19
20
  import { VERSION } from "../../config.js";
20
21
  import { buildLoginProviderInfos } from "../../core/auth-providers.js";
@@ -73,14 +74,31 @@ export function buildRpcSessionState(session) {
73
74
  fastMode: session.isFastModeActive(),
74
75
  isStreaming: session.isStreaming,
75
76
  isCompacting: session.isCompacting,
77
+ retryAttempt: session.retryAttempt,
78
+ isBashRunning: session.isBashRunning,
76
79
  steeringMode: session.steeringMode,
77
80
  followUpMode: session.followUpMode,
78
81
  sessionFile: session.sessionFile,
79
82
  sessionId: session.sessionId,
80
83
  sessionName: session.sessionName,
84
+ cwd: session.sessionManager.getCwd(),
85
+ projectTrusted: session.settingsManager?.isProjectTrusted?.() ?? true,
86
+ ...(session.sessionFile &&
87
+ !existsSync(session.sessionFile) &&
88
+ session.sessionManager
89
+ .getEntries()
90
+ .some((entry) => entry.type !== "model_change" && entry.type !== "thinking_level_change")
91
+ ? { entries: session.sessionManager.getEntries() }
92
+ : {}),
93
+ steering: typeof session.getSteeringMessages === "function" ? [...session.getSteeringMessages()] : [],
94
+ followUp: typeof session.getFollowUpMessages === "function" ? [...session.getFollowUpMessages()] : [],
95
+ ordered: [
96
+ ...(session._queuedInputOrder ?? []),
97
+ ].sort((a, b) => a.enqueueOrder - b.enqueueOrder),
81
98
  autoCompactionEnabled: session.autoCompactionEnabled,
82
99
  messageCount: session.messages.length,
83
100
  pendingMessageCount: session.pendingMessageCount,
101
+ usageTotals: session.sessionManager.getUsageTotals(),
84
102
  };
85
103
  }
86
104
  function loadedMcpServers(snapshot) {
@@ -191,8 +209,16 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
191
209
  }
192
210
  return { id, type: "response", command, success: true, data };
193
211
  };
194
- const error = (id, command, message) => {
195
- return { id, type: "response", command, success: false, error: message };
212
+ const error = (id, command, message, errorCode, errorData) => {
213
+ return {
214
+ id,
215
+ type: "response",
216
+ command,
217
+ success: false,
218
+ error: message,
219
+ ...(errorCode ? { errorCode } : {}),
220
+ ...(errorData === undefined ? {} : { errorData }),
221
+ };
196
222
  };
197
223
  // Pending extension UI requests waiting for response
198
224
  const pendingExtensionRequests = new SessionExtensionUiRequests();
@@ -597,6 +623,7 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
597
623
  images: command.images,
598
624
  streamingBehavior: command.streamingBehavior,
599
625
  thinkingLevel: command.thinkingLevel,
626
+ expandPromptTemplates: command.expandPromptTemplates,
600
627
  source: "rpc",
601
628
  promptDisposition: (nextDisposition) => {
602
629
  disposition = nextDisposition;
@@ -615,21 +642,68 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
615
642
  });
616
643
  return undefined;
617
644
  }
645
+ case "append_user_message": {
646
+ const content = command.content;
647
+ const message = typeof content === "string"
648
+ ? { role: "user", content, timestamp: Date.now() }
649
+ : { role: "user", content, timestamp: Date.now() };
650
+ session.sessionManager.appendMessage(message);
651
+ session.messages.push(message);
652
+ return success(id, "append_user_message");
653
+ }
654
+ case "append_session_entry": {
655
+ session.sessionManager.appendEntry(command.entry);
656
+ if (command.entry.type === "message")
657
+ session.messages.push(command.entry.message);
658
+ return success(id, "append_session_entry");
659
+ }
660
+ case "send_custom_message": {
661
+ await session.sendCustomMessage({
662
+ customType: command.customType,
663
+ content: command.content,
664
+ display: command.display,
665
+ details: command.details,
666
+ }, { triggerTurn: command.triggerTurn, deliverAs: command.deliverAs });
667
+ return success(id, "send_custom_message");
668
+ }
618
669
  case "steer": {
619
- await session.steer(command.message, command.images);
670
+ await session.steer(command.message, command.images, { enqueueOrder: command.enqueueOrder });
620
671
  return success(id, "steer");
621
672
  }
622
673
  case "follow_up": {
623
- await session.followUp(command.message, command.images);
674
+ await session.followUp(command.message, command.images, { enqueueOrder: command.enqueueOrder });
624
675
  return success(id, "follow_up");
625
676
  }
626
677
  case "abort": {
627
678
  await session.abort();
628
679
  return success(id, "abort");
629
680
  }
681
+ case "abort_compaction": {
682
+ session.abortCompaction();
683
+ return success(id, "abort_compaction");
684
+ }
685
+ case "reload": {
686
+ const result = await session.reload();
687
+ return success(id, "reload", result);
688
+ }
689
+ case "check_reload_veto": {
690
+ return success(id, "check_reload_veto", await session.checkReloadVeto());
691
+ }
630
692
  case "clear_queue": {
631
- return success(id, "clear_queue", session.clearQueue());
693
+ const cleared = session.clearQueue({ abortWillFollow: command.abortWillFollow ?? false });
694
+ return success(id, "clear_queue", {
695
+ steering: cleared.steering,
696
+ followUp: cleared.followUp,
697
+ ordered: [...cleared.ordered],
698
+ });
632
699
  }
700
+ case "get_steering_messages":
701
+ return success(id, "get_steering_messages", { messages: [...session.getSteeringMessages()] });
702
+ case "get_follow_up_messages":
703
+ return success(id, "get_follow_up_messages", { messages: [...session.getFollowUpMessages()] });
704
+ case "abort_branch_summary":
705
+ session.abortBranchSummary();
706
+ return success(id, "abort_branch_summary");
633
707
  case "new_session": {
634
708
  const options = command.parentSession ? { parentSession: command.parentSession } : undefined;
635
709
  const result = await runtimeHost.newSession(options);
@@ -652,8 +726,8 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
652
726
  if (!model) {
653
727
  return error(id, "set_model", `Model not found: ${command.provider}/${command.modelId}`);
654
728
  }
655
- await session.setModel(model);
656
- return success(id, "set_model", model);
729
+ const systemPromptChange = await session.setModel(model);
730
+ return success(id, "set_model", { ...model, systemPromptName: systemPromptChange?.systemPromptName });
657
731
  }
658
732
  case "cycle_model": {
659
733
  const result = await session.cycleModel();
@@ -769,24 +843,49 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
769
843
  // =================================================================
770
844
  // Bash
771
845
  // =================================================================
772
- case "bash": {
773
- const eventResult = await session.extensionRunner.emitUserBash({
774
- type: "user_bash",
775
- command: command.command,
776
- excludeFromContext: command.excludeFromContext ?? false,
777
- cwd: session.sessionManager.getCwd(),
846
+ case "navigate_tree": {
847
+ const result = await session.navigateTree(command.targetId, {
848
+ summarize: command.summarize,
849
+ customInstructions: command.customInstructions,
850
+ replaceInstructions: command.replaceInstructions,
851
+ label: command.label,
852
+ });
853
+ return success(id, "navigate_tree", result);
854
+ }
855
+ case "record_bash_result":
856
+ session.recordBashResult(command.command, command.result, {
857
+ excludeFromContext: command.excludeFromContext,
778
858
  });
779
- if (eventResult?.result) {
780
- session.recordBashResult(command.command, eventResult.result, {
859
+ return success(id, "record_bash_result");
860
+ case "set_label":
861
+ session.sessionManager.appendLabelChange(command.entryId, command.label);
862
+ return success(id, "set_label");
863
+ case "bash": {
864
+ outputEvent({ type: "bash_start" });
865
+ try {
866
+ const eventResult = await session.extensionRunner.emitUserBash({
867
+ type: "user_bash",
868
+ command: command.command,
869
+ excludeFromContext: command.excludeFromContext ?? false,
870
+ cwd: session.sessionManager.getCwd(),
871
+ });
872
+ if (eventResult?.result) {
873
+ session.recordBashResult(command.command, eventResult.result, {
874
+ excludeFromContext: command.excludeFromContext,
875
+ });
876
+ return success(id, "bash", eventResult.result);
877
+ }
878
+ const result = await session.executeBash(command.command, undefined, {
781
879
  excludeFromContext: command.excludeFromContext,
880
+ // Functions cannot cross JSONL. Host extensions may still provide the
881
+ // executable operations object; client-supplied data is only a wire-safe hint.
882
+ operations: eventResult?.operations,
782
883
  });
783
- return success(id, "bash", eventResult.result);
884
+ return success(id, "bash", result);
885
+ }
886
+ finally {
887
+ outputEvent({ type: "bash_end" });
784
888
  }
785
- const result = await session.executeBash(command.command, undefined, {
786
- excludeFromContext: command.excludeFromContext,
787
- operations: eventResult?.operations,
788
- });
789
- return success(id, "bash", result);
790
889
  }
791
890
  case "abort_bash": {
792
891
  session.abortBash();
@@ -803,15 +902,18 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
803
902
  const path = await session.exportToHtml(command.outputPath);
804
903
  return success(id, "export_html", { path });
805
904
  }
905
+ case "export_jsonl": {
906
+ return success(id, "export_jsonl", { path: session.exportToJsonl(command.outputPath) });
907
+ }
806
908
  case "switch_session": {
807
- const result = await runtimeHost.switchSession(command.sessionPath);
909
+ const result = await runtimeHost.switchSession(command.sessionPath, { cwdOverride: command.cwdOverride });
808
910
  if (!result.cancelled) {
809
911
  await rebindSession();
810
912
  }
811
913
  return success(id, "switch_session", result);
812
914
  }
813
915
  case "fork": {
814
- const result = await runtimeHost.fork(command.entryId);
916
+ const result = await runtimeHost.fork(command.entryId, { position: command.position });
815
917
  if (!result.cancelled) {
816
918
  await rebindSession();
817
919
  }
@@ -852,6 +954,12 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
852
954
  const text = session.getLastAssistantText();
853
955
  return success(id, "get_last_assistant_text", { text });
854
956
  }
957
+ case "import_jsonl": {
958
+ const result = await runtimeHost.importFromJsonl(command.inputPath, command.cwdOverride);
959
+ if (!result.cancelled)
960
+ await rebindSession();
961
+ return success(id, "import_jsonl", result);
962
+ }
855
963
  case "set_session_name": {
856
964
  const name = command.name.trim();
857
965
  if (!name) {
@@ -985,7 +1093,8 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
985
1093
  }
986
1094
  }
987
1095
  catch (commandError) {
988
- output(error(command.id, command.type, commandError instanceof Error ? commandError.message : String(commandError)));
1096
+ const missingCwd = commandError instanceof Error && commandError.name === "MissingSessionCwdError" && "issue" in commandError;
1097
+ output(error(command.id, command.type, commandError instanceof Error ? commandError.message : String(commandError), missingCwd ? "missing_session_cwd" : undefined, missingCwd ? commandError.issue : undefined));
989
1098
  await waitForRpcBackpressure();
990
1099
  }
991
1100
  };