@code-yeongyu/senpi-codemode 2026.10.5 → 2026.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +20 -2
  3. package/package.json +4 -4
  4. package/src/bridge/kernel-tools-protocol.ts +1 -1
  5. package/src/bridge/reserved.ts +10 -0
  6. package/src/bridges/eval-virtual-schemas.ts +79 -0
  7. package/src/bridges/handle-bridge.ts +72 -0
  8. package/src/bridges/reserved-dispatch.ts +20 -2
  9. package/src/bridges/schema-bridge.ts +4 -0
  10. package/src/completion/handle.ts +69 -0
  11. package/src/completion/tool-bridge.ts +31 -12
  12. package/src/config/feature-settings.ts +110 -0
  13. package/src/config/memory-settings.ts +8 -0
  14. package/src/config/settings-constants.ts +7 -0
  15. package/src/config/settings-overrides.ts +72 -0
  16. package/src/config/settings.ts +35 -78
  17. package/src/config/unknown-settings.ts +19 -0
  18. package/src/extension/bridge-dispatch.ts +41 -0
  19. package/src/extension/bridge-tool-call.ts +41 -0
  20. package/src/extension/host-facts.ts +18 -0
  21. package/src/extension/idle-parking-kernel.ts +272 -0
  22. package/src/extension/kernel-registration.ts +25 -0
  23. package/src/extension/kernel-tools-probe.ts +24 -0
  24. package/src/extension/removed-tool-hints.ts +15 -0
  25. package/src/extension/runtime-factory.ts +3 -0
  26. package/src/extension/session-manager-contract.ts +3 -0
  27. package/src/extension/session-manager.ts +58 -58
  28. package/src/extension/start-recovery.ts +111 -0
  29. package/src/handles/completion-handles.ts +202 -0
  30. package/src/handles/handle-args.ts +103 -0
  31. package/src/handles/handle-registry.ts +164 -0
  32. package/src/handles/wait.ts +214 -0
  33. package/src/handles/watch-queue.ts +102 -0
  34. package/src/index.ts +99 -94
  35. package/src/kernels/jl/handles.jl +124 -0
  36. package/src/kernels/jl/kernel.ts +3 -1
  37. package/src/kernels/jl/prelude.jl +9 -0
  38. package/src/kernels/jl/runner.jl +160 -1
  39. package/src/kernels/js/context-manager.ts +1 -1
  40. package/src/kernels/js/handles.js +93 -0
  41. package/src/kernels/js/kernel-tools-define.d.ts +6 -0
  42. package/src/kernels/js/kernel-tools-define.js +3 -1
  43. package/src/kernels/js/kernel-tools-registry.d.ts +2 -0
  44. package/src/kernels/js/kernel-tools-registry.js +18 -9
  45. package/src/kernels/js/kernel-tools-schema.js +6 -2
  46. package/src/kernels/js/kernel-tools-types.ts +2 -1
  47. package/src/kernels/js/worker-global-sizes.js +84 -14
  48. package/src/kernels/js/worker-runtime.js +10 -1
  49. package/src/kernels/py/host-cell.ts +42 -0
  50. package/src/kernels/py/kernel-contract.ts +2 -0
  51. package/src/kernels/py/kernel.ts +48 -4
  52. package/src/kernels/py/prelude.py +145 -4
  53. package/src/kernels/rb/handles.rb +97 -0
  54. package/src/kernels/rb/kernel.ts +3 -1
  55. package/src/kernels/rb/paths.rb +37 -0
  56. package/src/kernels/rb/prelude.rb +15 -38
  57. package/src/kernels/rb/runner.rb +141 -0
  58. package/src/kernels/shared/kernel-memory-host.ts +14 -6
  59. package/src/kernels/{js/kernel-tools-host.ts → shared/kernel-tools-pump.ts} +2 -2
  60. package/src/kernels/shared/process-group-cpu.ts +139 -0
  61. package/src/kernels/shared/subprocess-contract.ts +3 -0
  62. package/src/kernels/shared/subprocess-kernel.ts +33 -1
  63. package/src/kernels/shared/subprocess-startup.ts +90 -0
  64. package/src/tool/cell-handler.ts +21 -18
  65. package/src/tool/cell-reserved-dispatch.ts +51 -0
  66. package/src/tool/eval-tool-options.ts +3 -0
  67. package/src/tool/run-eval-cell.ts +7 -6
  68. package/src/tool/types.ts +15 -0
@@ -0,0 +1,51 @@
1
+ import type { ExtensionContext } from "@code-yeongyu/senpi";
2
+ import type { KernelToHostMessage } from "../bridge/protocol.ts";
3
+ import type { ReservedDispatchContext } from "../bridges/reserved-dispatch.ts";
4
+ import type { CompletionRequest, CompletionResult } from "../completion/handler.ts";
5
+ import type { CompletionToolCallOptions } from "../completion/tool-bridge.ts";
6
+ import type { CellBridgeRuntime } from "./cell-handler.ts";
7
+ import { marshalToolResult } from "./image.ts";
8
+ import type { EvalKernel, EvalStatusEvent } from "./types.ts";
9
+
10
+ type ToolCallMessage = Extract<KernelToHostMessage, { type: "tool-call" }>;
11
+
12
+ /** The in-process (JS kernel) dispatch context for a reserved helper call; mirrors the bridge route for py/rb/jl. */
13
+ export function reservedDispatchContext(
14
+ message: ToolCallMessage,
15
+ runtime: CellBridgeRuntime,
16
+ signal: AbortSignal,
17
+ emitStatus: (event: EvalStatusEvent) => void,
18
+ ): ReservedDispatchContext {
19
+ const host = runtime.ctx.evalHandleHost;
20
+ return {
21
+ callId: message.callId,
22
+ args: message.args,
23
+ executeTool: runtime.executeTool,
24
+ taskToolName: runtime.settings.taskTools.task,
25
+ taskOutputToolName: runtime.settings.taskTools.output,
26
+ listTools: runtime.listTools,
27
+ signal,
28
+ emitStatus,
29
+ marshalToolResult,
30
+ ...(runtime.handles === undefined ? {} : { handles: runtime.handles }),
31
+ ...(host === undefined ? {} : { evalHandleHost: host }),
32
+ };
33
+ }
34
+
35
+ export function completionCallOptions(
36
+ message: ToolCallMessage,
37
+ kernel: EvalKernel,
38
+ runtime: CellBridgeRuntime,
39
+ complete: (request: CompletionRequest, ctx: ExtensionContext) => Promise<CompletionResult>,
40
+ isActive: () => boolean,
41
+ ): CompletionToolCallOptions {
42
+ return {
43
+ message,
44
+ kernel,
45
+ complete,
46
+ ctx: runtime.ctx,
47
+ isActive,
48
+ ...(runtime.handles === undefined ? {} : { handles: runtime.handles }),
49
+ ...(runtime.hardDeadlineMs === undefined ? {} : { hardDeadlineMs: runtime.hardDeadlineMs }),
50
+ };
51
+ }
@@ -9,6 +9,7 @@ import type { EvalSchemaToolInfo } from "../bridges/schema-bridge.ts";
9
9
  import type { CompletionRequest, CompletionResult } from "../completion/handler.ts";
10
10
  import type { ResolvedCodemodeSettings } from "../config/settings.ts";
11
11
  import type { EvalExecutionTracker } from "../extension/session-manager.ts";
12
+ import type { HandleRegistry } from "../handles/handle-registry.ts";
12
13
  import type { EvalTimeoutFactory } from "./cell-execution.ts";
13
14
  import type { EvalDetachedCellManager } from "./detached-cell-manager.ts";
14
15
  import type { EvalExecutionEventPayload } from "./eval-execution-event.ts";
@@ -50,6 +51,8 @@ export interface CreateEvalToolOptions {
50
51
  readonly imageResizer?: EvalImageResizer;
51
52
  readonly executionTracker?: EvalExecutionTracker;
52
53
  readonly cellManager?: EvalDetachedCellManager;
54
+ /** The session generation's handle registry (`wait()`, `handle()`, completion handles); absent before session_start. */
55
+ readonly handles?: HandleRegistry;
53
56
  readonly onCellSettled?: (payload: EvalExecutionEventPayload) => void;
54
57
  readonly timeoutFactory?: EvalTimeoutFactory;
55
58
  readonly proxyExecutor?: (params: EvalToolInput, signal?: AbortSignal) => Promise<AgentToolResult<EvalToolDetails>>;
@@ -209,7 +209,7 @@ async function executeCell(
209
209
  const kernel = await execution.wait(options.kernelManager.getKernel(invocation.input.language, onMessage));
210
210
  // Computed before the handler so its construction-time snapshot captures this cell's capability.
211
211
  // Worker messages later restore that snapshot before calling host tools (#1754, #2512).
212
- const kernelTools = jsKernelTools(kernel, invocation.input.language);
212
+ const kernelTools = kernelToolsFor(kernel);
213
213
  const runBound = async (): Promise<AgentToolResult<EvalToolDetails>> => {
214
214
  const queue = kernel.queueSnapshot();
215
215
  state.queuedBehind = [...(queue.activeCellId === null ? [] : [queue.activeCellId]), ...queue.queuedCellIds];
@@ -224,6 +224,8 @@ async function executeCell(
224
224
  : { artifactPath: join(options.artifactsDir, `eval-${randomUUID()}.log`) }),
225
225
  ...(options.imageResizer === undefined ? {} : { imageResizer: options.imageResizer }),
226
226
  ...(kernelTools === undefined ? {} : { kernelTools }),
227
+ ...(options.handles === undefined ? {} : { handles: options.handles }),
228
+ hardDeadlineMs: cell.startedAtMs + cell.hardLimitSeconds * 1_000,
227
229
  });
228
230
  handler = activeHandler;
229
231
  cellManager.bindKernel(
@@ -292,16 +294,15 @@ async function executeCell(
292
294
  }
293
295
  }
294
296
 
295
- function jsKernelTools(kernel: EvalKernel, language: string): KernelToolsCapability | undefined {
296
- if (language !== "js") return undefined;
297
+ function kernelToolsFor(kernel: EvalKernel): KernelToolsCapability | undefined {
297
298
  if (!("describeKernelTools" in kernel) || typeof kernel.describeKernelTools !== "function") return undefined;
298
- const js = kernel as EvalKernel & {
299
+ const withTools = kernel as EvalKernel & {
299
300
  describeKernelTools: (names: readonly string[]) => Promise<KernelToolsDescribeResult>;
300
301
  invokeKernelTool: ExtensionKernelTools["invoke"];
301
302
  };
302
303
  return {
303
304
  capabilities: KERNEL_TOOLS_CAPABILITIES,
304
- describe: (names) => js.describeKernelTools(names),
305
- invoke: (request, options) => js.invokeKernelTool(request, options),
305
+ describe: (names) => withTools.describeKernelTools(names),
306
+ invoke: (request, options) => withTools.invokeKernelTool(request, options),
306
307
  } satisfies ExtensionKernelTools;
307
308
  }
package/src/tool/types.ts CHANGED
@@ -144,9 +144,24 @@ export function createEvalInputSchema(
144
144
  export type EvalKernelResult = Extract<KernelToHostMessage, { type: "result" }>;
145
145
  export type EvalToolCallMessage = Extract<KernelToHostMessage, { type: "tool-call" }>;
146
146
 
147
+ export type HostCellOutcome =
148
+ | { readonly ok: true; readonly valueRepr?: string }
149
+ | { readonly ok: false; readonly error: { readonly message: string; readonly name?: string } };
150
+
151
+ /**
152
+ * Work the host runs in the cell's place when the entry reaches the front of the kernel's queue: no code is
153
+ * sent to the interpreter, and aborting the signal (interrupt, timeout, kernel close) ends it without
154
+ * restarting the interpreter.
155
+ */
156
+ export type HostCellExecutor = (context: {
157
+ readonly signal: AbortSignal;
158
+ readonly emit: (message: KernelToHostMessage) => void;
159
+ }) => Promise<HostCellOutcome>;
160
+
147
161
  export interface EvalKernelRunInput {
148
162
  readonly cellId: string;
149
163
  readonly code: string;
164
+ readonly host?: HostCellExecutor;
150
165
  readonly timeoutMs?: number;
151
166
  readonly onStarted?: () => void;
152
167
  readonly onMessage?: (message: KernelToHostMessage) => void;