@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.
- package/CHANGELOG.md +41 -0
- package/README.md +20 -2
- package/package.json +4 -4
- package/src/bridge/kernel-tools-protocol.ts +1 -1
- package/src/bridge/reserved.ts +10 -0
- package/src/bridges/eval-virtual-schemas.ts +79 -0
- package/src/bridges/handle-bridge.ts +72 -0
- package/src/bridges/reserved-dispatch.ts +20 -2
- package/src/bridges/schema-bridge.ts +4 -0
- package/src/completion/handle.ts +69 -0
- package/src/completion/tool-bridge.ts +31 -12
- package/src/config/feature-settings.ts +110 -0
- package/src/config/memory-settings.ts +8 -0
- package/src/config/settings-constants.ts +7 -0
- package/src/config/settings-overrides.ts +72 -0
- package/src/config/settings.ts +35 -78
- package/src/config/unknown-settings.ts +19 -0
- package/src/extension/bridge-dispatch.ts +41 -0
- package/src/extension/bridge-tool-call.ts +41 -0
- package/src/extension/host-facts.ts +18 -0
- package/src/extension/idle-parking-kernel.ts +272 -0
- package/src/extension/kernel-registration.ts +25 -0
- package/src/extension/kernel-tools-probe.ts +24 -0
- package/src/extension/removed-tool-hints.ts +15 -0
- package/src/extension/runtime-factory.ts +3 -0
- package/src/extension/session-manager-contract.ts +3 -0
- package/src/extension/session-manager.ts +58 -58
- package/src/extension/start-recovery.ts +111 -0
- package/src/handles/completion-handles.ts +202 -0
- package/src/handles/handle-args.ts +103 -0
- package/src/handles/handle-registry.ts +164 -0
- package/src/handles/wait.ts +214 -0
- package/src/handles/watch-queue.ts +102 -0
- package/src/index.ts +99 -94
- package/src/kernels/jl/handles.jl +124 -0
- package/src/kernels/jl/kernel.ts +3 -1
- package/src/kernels/jl/prelude.jl +9 -0
- package/src/kernels/jl/runner.jl +160 -1
- package/src/kernels/js/context-manager.ts +1 -1
- package/src/kernels/js/handles.js +93 -0
- package/src/kernels/js/kernel-tools-define.d.ts +6 -0
- package/src/kernels/js/kernel-tools-define.js +3 -1
- package/src/kernels/js/kernel-tools-registry.d.ts +2 -0
- package/src/kernels/js/kernel-tools-registry.js +18 -9
- package/src/kernels/js/kernel-tools-schema.js +6 -2
- package/src/kernels/js/kernel-tools-types.ts +2 -1
- package/src/kernels/js/worker-global-sizes.js +84 -14
- package/src/kernels/js/worker-runtime.js +10 -1
- package/src/kernels/py/host-cell.ts +42 -0
- package/src/kernels/py/kernel-contract.ts +2 -0
- package/src/kernels/py/kernel.ts +48 -4
- package/src/kernels/py/prelude.py +145 -4
- package/src/kernels/rb/handles.rb +97 -0
- package/src/kernels/rb/kernel.ts +3 -1
- package/src/kernels/rb/paths.rb +37 -0
- package/src/kernels/rb/prelude.rb +15 -38
- package/src/kernels/rb/runner.rb +141 -0
- package/src/kernels/shared/kernel-memory-host.ts +14 -6
- package/src/kernels/{js/kernel-tools-host.ts → shared/kernel-tools-pump.ts} +2 -2
- package/src/kernels/shared/process-group-cpu.ts +139 -0
- package/src/kernels/shared/subprocess-contract.ts +3 -0
- package/src/kernels/shared/subprocess-kernel.ts +33 -1
- package/src/kernels/shared/subprocess-startup.ts +90 -0
- package/src/tool/cell-handler.ts +21 -18
- package/src/tool/cell-reserved-dispatch.ts +51 -0
- package/src/tool/eval-tool-options.ts +3 -0
- package/src/tool/run-eval-cell.ts +7 -6
- 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 =
|
|
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
|
|
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
|
|
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) =>
|
|
305
|
-
invoke: (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;
|