@code-yeongyu/senpi 2026.7.10 → 2026.7.13
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 +79 -0
- package/README.md +4 -2
- package/dist/core/agent-session.d.ts +9 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +56 -15
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.js +2 -2
- package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +10 -1
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/store.js +88 -3
- package/dist/core/extensions/builtin/goal/store.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +134 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js +6 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
- package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.d.ts +3 -3
- package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.js +7 -4
- package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +5 -3
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.js +32 -16
- package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js +10 -4
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todowrite.js +5 -8
- package/dist/core/extensions/builtin/todotools/tools/todowrite.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +5 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +5 -8
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js +22 -3
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/keybindings.d.ts +8 -3
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +7 -3
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-registry.d.ts +1 -6
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +19 -6
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/resource-loader.d.ts +1 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +20 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -3
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +2 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/compaction-queue-transfer.d.ts +22 -0
- package/dist/modes/interactive/compaction-queue-transfer.d.ts.map +1 -0
- package/dist/modes/interactive/compaction-queue-transfer.js +82 -0
- package/dist/modes/interactive/compaction-queue-transfer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +1 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +4 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +9 -2
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +1 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +1 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution-fallback.d.ts +6 -0
- package/dist/modes/interactive/components/tool-execution-fallback.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution-fallback.js +40 -0
- package/dist/modes/interactive/components/tool-execution-fallback.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution-images.d.ts +23 -0
- package/dist/modes/interactive/components/tool-execution-images.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution-images.js +104 -0
- package/dist/modes/interactive/components/tool-execution-images.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution-renderer.d.ts +28 -0
- package/dist/modes/interactive/components/tool-execution-renderer.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution-renderer.js +135 -0
- package/dist/modes/interactive/components/tool-execution-renderer.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution-types.d.ts +23 -0
- package/dist/modes/interactive/components/tool-execution-types.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution-types.js +2 -0
- package/dist/modes/interactive/components/tool-execution-types.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +13 -39
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +51 -294
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-renderer-boundary.d.ts +17 -0
- package/dist/modes/interactive/components/tool-renderer-boundary.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-renderer-boundary.js +75 -0
- package/dist/modes/interactive/components/tool-renderer-boundary.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +5 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +50 -17
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +5 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +127 -109
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +1 -0
- package/dist/modes/interactive/theme/light.json +1 -0
- package/dist/modes/interactive/theme/theme-schema.json +6 -2
- package/dist/modes/interactive/theme/theme.d.ts +3 -2
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +11 -4
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts +1 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +13 -0
- package/dist/utils/clipboard.js.map +1 -1
- package/docs/custom-provider.md +4 -3
- package/docs/extensions.md +140 -1
- package/docs/keybindings.md +1 -0
- package/docs/models.md +45 -4
- package/docs/providers.md +3 -0
- package/docs/quickstart.md +1 -1
- package/docs/rpc.md +2 -2
- package/docs/sdk.md +1 -1
- package/docs/settings.md +3 -3
- package/docs/themes.md +5 -3
- package/docs/tui.md +1 -1
- package/docs/usage.md +2 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/node_modules/@babel/helper-string-parser/LICENSE +22 -0
- package/node_modules/@babel/helper-string-parser/README.md +19 -0
- package/node_modules/@babel/helper-string-parser/lib/index.js +295 -0
- package/node_modules/@babel/helper-string-parser/lib/index.js.map +1 -0
- package/node_modules/@babel/helper-string-parser/package.json +31 -0
- package/node_modules/@babel/helper-validator-identifier/LICENSE +22 -0
- package/node_modules/@babel/helper-validator-identifier/README.md +19 -0
- package/node_modules/@babel/helper-validator-identifier/lib/identifier.js +70 -0
- package/node_modules/@babel/helper-validator-identifier/lib/identifier.js.map +1 -0
- package/node_modules/@babel/helper-validator-identifier/lib/index.js +57 -0
- package/node_modules/@babel/helper-validator-identifier/lib/index.js.map +1 -0
- package/node_modules/@babel/helper-validator-identifier/lib/keyword.js +35 -0
- package/node_modules/@babel/helper-validator-identifier/lib/keyword.js.map +1 -0
- package/node_modules/@babel/helper-validator-identifier/package.json +31 -0
- package/node_modules/@babel/parser/LICENSE +19 -0
- package/node_modules/@babel/parser/README.md +19 -0
- package/node_modules/@babel/parser/bin/babel-parser.js +15 -0
- package/node_modules/@babel/parser/lib/index.js +14599 -0
- package/node_modules/@babel/parser/lib/index.js.map +1 -0
- package/node_modules/@babel/parser/package.json +50 -0
- package/node_modules/@babel/parser/typings/babel-parser.d.ts +262 -0
- package/node_modules/@babel/types/LICENSE +22 -0
- package/node_modules/@babel/types/README.md +19 -0
- package/node_modules/@babel/types/lib/asserts/assertNode.js +16 -0
- package/node_modules/@babel/types/lib/asserts/assertNode.js.map +1 -0
- package/node_modules/@babel/types/lib/asserts/generated/index.js +1251 -0
- package/node_modules/@babel/types/lib/asserts/generated/index.js.map +1 -0
- package/node_modules/@babel/types/lib/ast-types/generated/index.js +3 -0
- package/node_modules/@babel/types/lib/ast-types/generated/index.js.map +1 -0
- package/node_modules/@babel/types/lib/builders/flow/createFlowUnionType.js +18 -0
- package/node_modules/@babel/types/lib/builders/flow/createFlowUnionType.js.map +1 -0
- package/node_modules/@babel/types/lib/builders/flow/createTypeAnnotationBasedOnTypeof.js +31 -0
- package/node_modules/@babel/types/lib/builders/flow/createTypeAnnotationBasedOnTypeof.js.map +1 -0
- package/node_modules/@babel/types/lib/builders/generated/index.js +29 -0
- package/node_modules/@babel/types/lib/builders/generated/index.js.map +1 -0
- package/node_modules/@babel/types/lib/builders/generated/lowercase.js +2902 -0
- package/node_modules/@babel/types/lib/builders/generated/lowercase.js.map +1 -0
- package/node_modules/@babel/types/lib/builders/generated/uppercase.js +272 -0
- package/node_modules/@babel/types/lib/builders/generated/uppercase.js.map +1 -0
- package/node_modules/@babel/types/lib/builders/productions.js +12 -0
- package/node_modules/@babel/types/lib/builders/productions.js.map +1 -0
- package/node_modules/@babel/types/lib/builders/react/buildChildren.js +24 -0
- package/node_modules/@babel/types/lib/builders/react/buildChildren.js.map +1 -0
- package/node_modules/@babel/types/lib/builders/typescript/createTSUnionType.js +22 -0
- package/node_modules/@babel/types/lib/builders/typescript/createTSUnionType.js.map +1 -0
- package/node_modules/@babel/types/lib/builders/validateNode.js +21 -0
- package/node_modules/@babel/types/lib/builders/validateNode.js.map +1 -0
- package/node_modules/@babel/types/lib/clone/clone.js +12 -0
- package/node_modules/@babel/types/lib/clone/clone.js.map +1 -0
- package/node_modules/@babel/types/lib/clone/cloneDeep.js +12 -0
- package/node_modules/@babel/types/lib/clone/cloneDeep.js.map +1 -0
- package/node_modules/@babel/types/lib/clone/cloneDeepWithoutLoc.js +12 -0
- package/node_modules/@babel/types/lib/clone/cloneDeepWithoutLoc.js.map +1 -0
- package/node_modules/@babel/types/lib/clone/cloneNode.js +107 -0
- package/node_modules/@babel/types/lib/clone/cloneNode.js.map +1 -0
- package/node_modules/@babel/types/lib/clone/cloneWithoutLoc.js +12 -0
- package/node_modules/@babel/types/lib/clone/cloneWithoutLoc.js.map +1 -0
- package/node_modules/@babel/types/lib/comments/addComment.js +15 -0
- package/node_modules/@babel/types/lib/comments/addComment.js.map +1 -0
- package/node_modules/@babel/types/lib/comments/addComments.js +22 -0
- package/node_modules/@babel/types/lib/comments/addComments.js.map +1 -0
- package/node_modules/@babel/types/lib/comments/inheritInnerComments.js +12 -0
- package/node_modules/@babel/types/lib/comments/inheritInnerComments.js.map +1 -0
- package/node_modules/@babel/types/lib/comments/inheritLeadingComments.js +12 -0
- package/node_modules/@babel/types/lib/comments/inheritLeadingComments.js.map +1 -0
- package/node_modules/@babel/types/lib/comments/inheritTrailingComments.js +12 -0
- package/node_modules/@babel/types/lib/comments/inheritTrailingComments.js.map +1 -0
- package/node_modules/@babel/types/lib/comments/inheritsComments.js +17 -0
- package/node_modules/@babel/types/lib/comments/inheritsComments.js.map +1 -0
- package/node_modules/@babel/types/lib/comments/removeComments.js +15 -0
- package/node_modules/@babel/types/lib/comments/removeComments.js.map +1 -0
- package/node_modules/@babel/types/lib/constants/generated/index.js +60 -0
- package/node_modules/@babel/types/lib/constants/generated/index.js.map +1 -0
- package/node_modules/@babel/types/lib/constants/index.js +31 -0
- package/node_modules/@babel/types/lib/constants/index.js.map +1 -0
- package/node_modules/@babel/types/lib/converters/ensureBlock.js +14 -0
- package/node_modules/@babel/types/lib/converters/ensureBlock.js.map +1 -0
- package/node_modules/@babel/types/lib/converters/gatherSequenceExpressions.js +65 -0
- package/node_modules/@babel/types/lib/converters/gatherSequenceExpressions.js.map +1 -0
- package/node_modules/@babel/types/lib/converters/toBindingIdentifierName.js +14 -0
- package/node_modules/@babel/types/lib/converters/toBindingIdentifierName.js.map +1 -0
- package/node_modules/@babel/types/lib/converters/toBlock.js +29 -0
- package/node_modules/@babel/types/lib/converters/toBlock.js.map +1 -0
- package/node_modules/@babel/types/lib/converters/toComputedKey.js +14 -0
- package/node_modules/@babel/types/lib/converters/toComputedKey.js.map +1 -0
- package/node_modules/@babel/types/lib/converters/toExpression.js +28 -0
- package/node_modules/@babel/types/lib/converters/toExpression.js.map +1 -0
- package/node_modules/@babel/types/lib/converters/toIdentifier.js +25 -0
- package/node_modules/@babel/types/lib/converters/toIdentifier.js.map +1 -0
- package/node_modules/@babel/types/lib/converters/toKeyAlias.js +38 -0
- package/node_modules/@babel/types/lib/converters/toKeyAlias.js.map +1 -0
- package/node_modules/@babel/types/lib/converters/toSequenceExpression.js +19 -0
- package/node_modules/@babel/types/lib/converters/toSequenceExpression.js.map +1 -0
- package/node_modules/@babel/types/lib/converters/toStatement.js +39 -0
- package/node_modules/@babel/types/lib/converters/toStatement.js.map +1 -0
- package/node_modules/@babel/types/lib/converters/valueToNode.js +89 -0
- package/node_modules/@babel/types/lib/converters/valueToNode.js.map +1 -0
- package/node_modules/@babel/types/lib/definitions/core.js +1725 -0
- package/node_modules/@babel/types/lib/definitions/core.js.map +1 -0
- package/node_modules/@babel/types/lib/definitions/deprecated-aliases.js +11 -0
- package/node_modules/@babel/types/lib/definitions/deprecated-aliases.js.map +1 -0
- package/node_modules/@babel/types/lib/definitions/experimental.js +124 -0
- package/node_modules/@babel/types/lib/definitions/experimental.js.map +1 -0
- package/node_modules/@babel/types/lib/definitions/flow.js +495 -0
- package/node_modules/@babel/types/lib/definitions/flow.js.map +1 -0
- package/node_modules/@babel/types/lib/definitions/index.js +106 -0
- package/node_modules/@babel/types/lib/definitions/index.js.map +1 -0
- package/node_modules/@babel/types/lib/definitions/jsx.js +157 -0
- package/node_modules/@babel/types/lib/definitions/jsx.js.map +1 -0
- package/node_modules/@babel/types/lib/definitions/misc.js +31 -0
- package/node_modules/@babel/types/lib/definitions/misc.js.map +1 -0
- package/node_modules/@babel/types/lib/definitions/placeholders.js +27 -0
- package/node_modules/@babel/types/lib/definitions/placeholders.js.map +1 -0
- package/node_modules/@babel/types/lib/definitions/typescript.js +528 -0
- package/node_modules/@babel/types/lib/definitions/typescript.js.map +1 -0
- package/node_modules/@babel/types/lib/definitions/utils.js +296 -0
- package/node_modules/@babel/types/lib/definitions/utils.js.map +1 -0
- package/node_modules/@babel/types/lib/index-legacy.d.ts +2797 -0
- package/node_modules/@babel/types/lib/index.d.ts +3617 -0
- package/node_modules/@babel/types/lib/index.js +582 -0
- package/node_modules/@babel/types/lib/index.js.flow +2650 -0
- package/node_modules/@babel/types/lib/index.js.map +1 -0
- package/node_modules/@babel/types/lib/modifications/appendToMemberExpression.js +15 -0
- package/node_modules/@babel/types/lib/modifications/appendToMemberExpression.js.map +1 -0
- package/node_modules/@babel/types/lib/modifications/flow/removeTypeDuplicates.js +65 -0
- package/node_modules/@babel/types/lib/modifications/flow/removeTypeDuplicates.js.map +1 -0
- package/node_modules/@babel/types/lib/modifications/inherits.js +28 -0
- package/node_modules/@babel/types/lib/modifications/inherits.js.map +1 -0
- package/node_modules/@babel/types/lib/modifications/prependToMemberExpression.js +17 -0
- package/node_modules/@babel/types/lib/modifications/prependToMemberExpression.js.map +1 -0
- package/node_modules/@babel/types/lib/modifications/removeProperties.js +24 -0
- package/node_modules/@babel/types/lib/modifications/removeProperties.js.map +1 -0
- package/node_modules/@babel/types/lib/modifications/removePropertiesDeep.js +14 -0
- package/node_modules/@babel/types/lib/modifications/removePropertiesDeep.js.map +1 -0
- package/node_modules/@babel/types/lib/modifications/typescript/removeTypeDuplicates.js +66 -0
- package/node_modules/@babel/types/lib/modifications/typescript/removeTypeDuplicates.js.map +1 -0
- package/node_modules/@babel/types/lib/retrievers/getAssignmentIdentifiers.js +48 -0
- package/node_modules/@babel/types/lib/retrievers/getAssignmentIdentifiers.js.map +1 -0
- package/node_modules/@babel/types/lib/retrievers/getBindingIdentifiers.js +102 -0
- package/node_modules/@babel/types/lib/retrievers/getBindingIdentifiers.js.map +1 -0
- package/node_modules/@babel/types/lib/retrievers/getFunctionName.js +63 -0
- package/node_modules/@babel/types/lib/retrievers/getFunctionName.js.map +1 -0
- package/node_modules/@babel/types/lib/retrievers/getOuterBindingIdentifiers.js +13 -0
- package/node_modules/@babel/types/lib/retrievers/getOuterBindingIdentifiers.js.map +1 -0
- package/node_modules/@babel/types/lib/traverse/traverse.js +50 -0
- package/node_modules/@babel/types/lib/traverse/traverse.js.map +1 -0
- package/node_modules/@babel/types/lib/traverse/traverseFast.js +40 -0
- package/node_modules/@babel/types/lib/traverse/traverseFast.js.map +1 -0
- package/node_modules/@babel/types/lib/utils/deprecationWarning.js +44 -0
- package/node_modules/@babel/types/lib/utils/deprecationWarning.js.map +1 -0
- package/node_modules/@babel/types/lib/utils/inherit.js +13 -0
- package/node_modules/@babel/types/lib/utils/inherit.js.map +1 -0
- package/node_modules/@babel/types/lib/utils/react/cleanJSXElementLiteralChild.js +40 -0
- package/node_modules/@babel/types/lib/utils/react/cleanJSXElementLiteralChild.js.map +1 -0
- package/node_modules/@babel/types/lib/utils/shallowEqual.js +17 -0
- package/node_modules/@babel/types/lib/utils/shallowEqual.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/buildMatchMemberExpression.js +13 -0
- package/node_modules/@babel/types/lib/validators/buildMatchMemberExpression.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/generated/index.js +2797 -0
- package/node_modules/@babel/types/lib/validators/generated/index.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/is.js +27 -0
- package/node_modules/@babel/types/lib/validators/is.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/isBinding.js +27 -0
- package/node_modules/@babel/types/lib/validators/isBinding.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/isBlockScoped.js +13 -0
- package/node_modules/@babel/types/lib/validators/isBlockScoped.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/isImmutable.js +21 -0
- package/node_modules/@babel/types/lib/validators/isImmutable.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/isLet.js +13 -0
- package/node_modules/@babel/types/lib/validators/isLet.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/isNode.js +12 -0
- package/node_modules/@babel/types/lib/validators/isNode.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/isNodesEquivalent.js +57 -0
- package/node_modules/@babel/types/lib/validators/isNodesEquivalent.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/isPlaceholderType.js +15 -0
- package/node_modules/@babel/types/lib/validators/isPlaceholderType.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/isReferenced.js +96 -0
- package/node_modules/@babel/types/lib/validators/isReferenced.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/isScope.js +18 -0
- package/node_modules/@babel/types/lib/validators/isScope.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/isSpecifierDefault.js +14 -0
- package/node_modules/@babel/types/lib/validators/isSpecifierDefault.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/isType.js +17 -0
- package/node_modules/@babel/types/lib/validators/isType.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/isValidES3Identifier.js +13 -0
- package/node_modules/@babel/types/lib/validators/isValidES3Identifier.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/isValidIdentifier.js +18 -0
- package/node_modules/@babel/types/lib/validators/isValidIdentifier.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/isVar.js +15 -0
- package/node_modules/@babel/types/lib/validators/isVar.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/matchesPattern.js +44 -0
- package/node_modules/@babel/types/lib/validators/matchesPattern.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/react/isCompatTag.js +11 -0
- package/node_modules/@babel/types/lib/validators/react/isCompatTag.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/react/isReactComponent.js +11 -0
- package/node_modules/@babel/types/lib/validators/react/isReactComponent.js.map +1 -0
- package/node_modules/@babel/types/lib/validators/validate.js +42 -0
- package/node_modules/@babel/types/lib/validators/validate.js.map +1 -0
- package/node_modules/@babel/types/package.json +39 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +13 -2
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +128 -78
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +22 -9
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/reserved.ts +9 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/agent-bridge.ts +197 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/output-bridge.ts +96 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/schema-injection.ts +3 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/completion/handler.ts +95 -26
- package/node_modules/@code-yeongyu/senpi-codemode/src/completion/tool-bridge.ts +14 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/config/settings.ts +96 -8
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +92 -10
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +187 -27
- package/node_modules/@code-yeongyu/senpi-codemode/src/interpreters/detect.ts +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/prelude.jl +252 -48
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/runner.jl +263 -83
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +198 -149
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker-entry.js +23 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker.ts +4 -175
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +38 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/local-module-loader.ts +108 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/prelude.ts +8 -6
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/rewrite-imports.ts +164 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/run-queue.ts +82 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +13 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-host.ts +117 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-runtime.js +307 -41
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +32 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +232 -199
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +792 -79
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/process.ts +119 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +237 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/prelude.rb +234 -21
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/runner.rb +154 -51
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-contract.ts +22 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +214 -189
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-process.ts +174 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-queue.ts +101 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-run.ts +98 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/output/output-meta.ts +89 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/output/streaming-output.ts +296 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +107 -30
- package/node_modules/@code-yeongyu/senpi-codemode/src/timeouts/bridge-timeout.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/timeouts/idle-timeout.ts +8 -19
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +267 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +226 -211
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image.ts +274 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/json-tree.ts +247 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +828 -35
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/status-events.ts +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +30 -1
- package/node_modules/@earendil-works/pi-agent-core/README.md +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +4 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/README.md +4 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +89 -40
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +7 -7
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +10 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +3 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +35 -4
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +7 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js +8 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +4 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +483 -61
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js +13 -4
- package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts +62 -5
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js +32 -20
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.d.ts +11 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.js +6 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts +7 -8
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js +20 -21
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts +11 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js +6 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.js +9 -6
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.d.ts +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.d.ts +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts +100 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js +64 -5
- package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts +56 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js +20 -9
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts +77 -8
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js +37 -24
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +80 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js +64 -8
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +25 -22
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +68 -83
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +45 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +49 -13
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +30 -7
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.d.ts +9 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.js +36 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.d.ts +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js +35 -14
- package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/image.js +2 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/image.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +2 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js +2 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keys.js +6 -5
- package/node_modules/@earendil-works/pi-tui/dist/keys.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts +0 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +0 -9
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-text.d.ts +4 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal-text.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal-text.js +18 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal-text.js.map +1 -0
- package/node_modules/@earendil-works/pi-tui/package.json +2 -2
- package/package.json +6 -6
|
@@ -1,45 +1,40 @@
|
|
|
1
|
-
import { Worker } from "node:worker_threads";
|
|
2
1
|
import type { HostToKernelMessage, KernelToHostMessage } from "../../bridge/protocol.ts";
|
|
3
2
|
import { createInlineWorker, type WorkerLike } from "./inline-worker.ts";
|
|
3
|
+
import {
|
|
4
|
+
assertJavaScriptKernelOpen,
|
|
5
|
+
type JavaScriptKernelMode,
|
|
6
|
+
type JavaScriptRunInput,
|
|
7
|
+
type LifecycleState,
|
|
8
|
+
type ResultMessage,
|
|
9
|
+
type ToolCallMessage,
|
|
10
|
+
} from "./kernel-contract.ts";
|
|
11
|
+
import { type JavaScriptKernelOptions, LocalModuleLoader, localBridgeConnection } from "./local-module-loader.ts";
|
|
12
|
+
import { JavaScriptRunQueue, type PendingJavaScriptRun, stoppedResult } from "./run-queue.ts";
|
|
13
|
+
import { bridgeError, spawnNodeWorker, WorkerStartupCancelledError, waitForReady } from "./worker-host.ts";
|
|
4
14
|
|
|
5
|
-
export type JavaScriptKernelMode
|
|
6
|
-
|
|
7
|
-
export interface JavaScriptKernelOptions {
|
|
8
|
-
readonly sessionId: string;
|
|
9
|
-
readonly cwd: string;
|
|
10
|
-
readonly parallelPoolWidth: number;
|
|
11
|
-
readonly onMessage?: (message: KernelToHostMessage) => void;
|
|
12
|
-
readonly workerEntryUrl?: URL;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface JavaScriptRunInput {
|
|
16
|
-
readonly cellId: string;
|
|
17
|
-
readonly code: string;
|
|
18
|
-
readonly timeoutMs?: number;
|
|
19
|
-
readonly onMessage?: (message: KernelToHostMessage) => void;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
type ResultMessage = Extract<KernelToHostMessage, { type: "result" }>;
|
|
23
|
-
type ToolCallMessage = Extract<KernelToHostMessage, { type: "tool-call" }>;
|
|
24
|
-
|
|
25
|
-
interface QueuedRun {
|
|
26
|
-
readonly input: JavaScriptRunInput;
|
|
27
|
-
resolve(message: ResultMessage): void;
|
|
28
|
-
}
|
|
15
|
+
export { JavaScriptKernelClosedError, type JavaScriptKernelMode, type JavaScriptRunInput } from "./kernel-contract.ts";
|
|
16
|
+
export type { JavaScriptKernelOptions } from "./local-module-loader.ts";
|
|
29
17
|
|
|
30
18
|
export class JavaScriptKernel {
|
|
31
19
|
readonly #options: JavaScriptKernelOptions;
|
|
20
|
+
readonly #moduleLoader: LocalModuleLoader;
|
|
32
21
|
#worker: WorkerLike | null = null;
|
|
33
22
|
#mode: JavaScriptKernelMode = "worker";
|
|
23
|
+
#lifecycle: LifecycleState = "open";
|
|
34
24
|
#ready: Promise<void> | null = null;
|
|
35
|
-
#
|
|
36
|
-
#
|
|
25
|
+
#startupAbort: AbortController | null = null;
|
|
26
|
+
#generation = 0;
|
|
27
|
+
#activation: Promise<void> | null = null;
|
|
28
|
+
#recovery: Promise<void> | null = null;
|
|
29
|
+
#closePromise: Promise<void> | null = null;
|
|
30
|
+
readonly #runs = new JavaScriptRunQueue();
|
|
37
31
|
#timeout: NodeJS.Timeout | null = null;
|
|
38
32
|
#toolWaiters: Array<(message: ToolCallMessage) => void> = [];
|
|
39
33
|
#pendingToolCalls: ToolCallMessage[] = [];
|
|
40
34
|
|
|
41
35
|
constructor(options: JavaScriptKernelOptions) {
|
|
42
36
|
this.#options = options;
|
|
37
|
+
this.#moduleLoader = new LocalModuleLoader(options);
|
|
43
38
|
}
|
|
44
39
|
|
|
45
40
|
get mode(): JavaScriptKernelMode {
|
|
@@ -47,22 +42,32 @@ export class JavaScriptKernel {
|
|
|
47
42
|
}
|
|
48
43
|
|
|
49
44
|
async run(input: JavaScriptRunInput): Promise<ResultMessage> {
|
|
50
|
-
|
|
51
|
-
const promise =
|
|
52
|
-
|
|
53
|
-
});
|
|
54
|
-
this.#startNext();
|
|
45
|
+
assertJavaScriptKernelOpen(this.#lifecycle, "run");
|
|
46
|
+
const promise = this.#runs.enqueue(input);
|
|
47
|
+
this.#activate();
|
|
55
48
|
return await promise;
|
|
56
49
|
}
|
|
57
50
|
|
|
51
|
+
async interrupt(reason = "interrupted"): Promise<void> {
|
|
52
|
+
assertJavaScriptKernelOpen(this.#lifecycle, "interrupt");
|
|
53
|
+
const active = this.#runs.active;
|
|
54
|
+
const target = this.#runs.takeInterruptTarget();
|
|
55
|
+
if (!target) return;
|
|
56
|
+
if (target === active) this.#clearTimeout();
|
|
57
|
+
this.#runs.settle(target, stoppedResult(target.input.cellId, `JS cell interrupted: ${reason}`));
|
|
58
|
+
await this.#restartAfterStop();
|
|
59
|
+
}
|
|
60
|
+
|
|
58
61
|
async reset(): Promise<void> {
|
|
62
|
+
assertJavaScriptKernelOpen(this.#lifecycle, "reset");
|
|
59
63
|
await this.#terminate();
|
|
60
|
-
this.#
|
|
64
|
+
assertJavaScriptKernelOpen(this.#lifecycle, "reset");
|
|
61
65
|
await this.#ensureReady();
|
|
66
|
+
this.#startNext();
|
|
62
67
|
}
|
|
63
68
|
|
|
64
69
|
deliverToolReply(message: Extract<HostToKernelMessage, { type: "tool-reply" }>): void {
|
|
65
|
-
this.#worker?.postMessage(message);
|
|
70
|
+
if (this.#lifecycle === "open") this.#worker?.postMessage(message);
|
|
66
71
|
}
|
|
67
72
|
|
|
68
73
|
async nextToolCall(): Promise<ToolCallMessage> {
|
|
@@ -72,92 +77,175 @@ export class JavaScriptKernel {
|
|
|
72
77
|
}
|
|
73
78
|
|
|
74
79
|
async close(): Promise<void> {
|
|
80
|
+
if (this.#closePromise) return await this.#closePromise;
|
|
75
81
|
this.#worker?.postMessage({ type: "close" });
|
|
76
|
-
|
|
82
|
+
this.#lifecycle = "closing";
|
|
83
|
+
this.#runs.settleAll("JS kernel closed");
|
|
84
|
+
const recovery = this.#recovery;
|
|
85
|
+
const closePromise = (async () => {
|
|
86
|
+
if (recovery) await recovery;
|
|
87
|
+
await this.#terminate();
|
|
88
|
+
})().finally(() => {
|
|
89
|
+
this.#lifecycle = "closed";
|
|
90
|
+
});
|
|
91
|
+
this.#closePromise = closePromise;
|
|
92
|
+
return await closePromise;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
#activate(): void {
|
|
96
|
+
if (this.#activation || this.#lifecycle !== "open" || this.#runs.active || !this.#runs.hasWaiting) return;
|
|
97
|
+
const activation = this.#activateWhenReady();
|
|
98
|
+
this.#activation = activation;
|
|
99
|
+
void activation.then(() => {
|
|
100
|
+
if (this.#activation === activation) this.#activation = null;
|
|
101
|
+
if (this.#lifecycle === "open" && !this.#runs.active && this.#runs.hasWaiting) this.#activate();
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async #activateWhenReady(): Promise<void> {
|
|
106
|
+
try {
|
|
107
|
+
await this.#ensureReady();
|
|
108
|
+
if (this.#lifecycle === "open") this.#startNext();
|
|
109
|
+
} catch (error) {
|
|
110
|
+
if (error instanceof WorkerStartupCancelledError) return;
|
|
111
|
+
this.#runs.rejectWaiting(error instanceof Error ? error : new Error(String(error)));
|
|
112
|
+
}
|
|
77
113
|
}
|
|
78
114
|
|
|
79
115
|
async #ensureReady(): Promise<void> {
|
|
80
|
-
|
|
116
|
+
assertJavaScriptKernelOpen(this.#lifecycle, "run");
|
|
117
|
+
if (!this.#ready) {
|
|
118
|
+
const generation = ++this.#generation;
|
|
119
|
+
const controller = new AbortController();
|
|
120
|
+
this.#startupAbort = controller;
|
|
121
|
+
const ready = this.#startWorker(generation, controller.signal);
|
|
122
|
+
this.#ready = ready;
|
|
123
|
+
void ready.then(
|
|
124
|
+
() => {
|
|
125
|
+
if (this.#ready === ready) this.#startupAbort = null;
|
|
126
|
+
},
|
|
127
|
+
() => {
|
|
128
|
+
if (this.#ready === ready) {
|
|
129
|
+
this.#ready = null;
|
|
130
|
+
this.#startupAbort = null;
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
);
|
|
134
|
+
}
|
|
81
135
|
return await this.#ready;
|
|
82
136
|
}
|
|
83
137
|
|
|
84
|
-
async #startWorker(): Promise<void> {
|
|
85
|
-
|
|
86
|
-
this.#worker
|
|
87
|
-
this.#mode = worker.mode;
|
|
88
|
-
const ready = waitForReady(worker);
|
|
89
|
-
worker.onMessage((message) => this.#handleMessage(message));
|
|
90
|
-
worker.onError((error) => this.#handleCrash(error));
|
|
91
|
-
worker.postMessage({ type: "init", sessionId: this.#options.sessionId, connection: { port: 1, token: "local" } });
|
|
138
|
+
async #startWorker(generation: number, signal: AbortSignal): Promise<void> {
|
|
139
|
+
let worker = this.#spawnWorker();
|
|
140
|
+
this.#publishWorker(worker, generation);
|
|
92
141
|
try {
|
|
93
|
-
await
|
|
142
|
+
await this.#initializeWorker(worker, signal);
|
|
143
|
+
return;
|
|
94
144
|
} catch (error) {
|
|
145
|
+
if (!this.#isCurrent(worker, generation) || error instanceof WorkerStartupCancelledError) {
|
|
146
|
+
await worker.terminate();
|
|
147
|
+
throw new WorkerStartupCancelledError();
|
|
148
|
+
}
|
|
95
149
|
if (worker.mode === "inline") throw error;
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
this.#worker = inline;
|
|
99
|
-
this.#mode = "inline";
|
|
100
|
-
const inlineReady = waitForReady(inline);
|
|
101
|
-
inline.onMessage((message) => this.#handleMessage(message));
|
|
102
|
-
inline.onError((crash) => this.#handleCrash(crash));
|
|
103
|
-
inline.postMessage({
|
|
104
|
-
type: "init",
|
|
105
|
-
sessionId: this.#options.sessionId,
|
|
106
|
-
connection: { port: 1, token: "local" },
|
|
107
|
-
});
|
|
108
|
-
await inlineReady;
|
|
150
|
+
this.#worker = null;
|
|
151
|
+
await worker.terminate();
|
|
109
152
|
}
|
|
153
|
+
if (this.#lifecycle !== "open" || generation !== this.#generation) throw new WorkerStartupCancelledError();
|
|
154
|
+
worker = createInlineWorker(this.#options.cwd, this.#options.parallelPoolWidth);
|
|
155
|
+
this.#publishWorker(worker, generation);
|
|
156
|
+
await this.#initializeWorker(worker, signal);
|
|
110
157
|
}
|
|
111
158
|
|
|
112
159
|
#spawnWorker(): WorkerLike {
|
|
113
160
|
try {
|
|
114
161
|
const url = this.#options.workerEntryUrl ?? new URL("./worker-entry.js", import.meta.url);
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
return
|
|
119
|
-
} catch {
|
|
120
|
-
return createInlineWorker(this.#options.parallelPoolWidth);
|
|
162
|
+
return spawnNodeWorker(url, this.#options.cwd, this.#options.parallelPoolWidth);
|
|
163
|
+
} catch (error) {
|
|
164
|
+
if (!(error instanceof Error)) throw error;
|
|
165
|
+
return createInlineWorker(this.#options.cwd, this.#options.parallelPoolWidth);
|
|
121
166
|
}
|
|
122
167
|
}
|
|
123
168
|
|
|
169
|
+
#publishWorker(worker: WorkerLike, generation: number): void {
|
|
170
|
+
if (this.#lifecycle !== "open" || generation !== this.#generation) throw new WorkerStartupCancelledError();
|
|
171
|
+
this.#worker = worker;
|
|
172
|
+
this.#mode = worker.mode;
|
|
173
|
+
worker.onMessage((message) => {
|
|
174
|
+
if (this.#isCurrent(worker, generation)) this.#handleMessage(message);
|
|
175
|
+
});
|
|
176
|
+
worker.onError((error) => {
|
|
177
|
+
if (this.#isCurrent(worker, generation)) this.#handleCrash(error);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
async #initializeWorker(worker: WorkerLike, signal: AbortSignal): Promise<void> {
|
|
182
|
+
const ready = waitForReady(worker, signal);
|
|
183
|
+
worker.postMessage({
|
|
184
|
+
type: "init",
|
|
185
|
+
sessionId: this.#options.sessionId,
|
|
186
|
+
connection: localBridgeConnection(this.#options),
|
|
187
|
+
});
|
|
188
|
+
await ready;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
#isCurrent(worker: WorkerLike, generation: number): boolean {
|
|
192
|
+
return this.#lifecycle === "open" && this.#worker === worker && this.#generation === generation;
|
|
193
|
+
}
|
|
194
|
+
|
|
124
195
|
#startNext(): void {
|
|
125
|
-
if (this.#active || !this.#worker) return;
|
|
126
|
-
const next = this.#
|
|
196
|
+
if (this.#lifecycle !== "open" || this.#runs.active || !this.#worker) return;
|
|
197
|
+
const next = this.#runs.startNext(performance.now());
|
|
127
198
|
if (!next) return;
|
|
128
|
-
this.#active = next;
|
|
129
199
|
if (next.input.timeoutMs) {
|
|
130
|
-
this.#timeout = setTimeout(() => void this.#timeoutActive(next
|
|
200
|
+
this.#timeout = setTimeout(() => void this.#timeoutActive(next), next.input.timeoutMs);
|
|
131
201
|
}
|
|
132
202
|
this.#worker.postMessage({
|
|
133
203
|
type: "run",
|
|
134
204
|
cellId: next.input.cellId,
|
|
135
|
-
code: next.input.code,
|
|
205
|
+
code: this.#moduleLoader.prepareCell(next.input.code),
|
|
136
206
|
timeoutMs: next.input.timeoutMs,
|
|
137
207
|
});
|
|
138
208
|
}
|
|
139
209
|
|
|
140
|
-
async #timeoutActive(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
active.resolve({
|
|
210
|
+
async #timeoutActive(run: PendingJavaScriptRun): Promise<void> {
|
|
211
|
+
if (!this.#runs.releaseActive(run)) return;
|
|
212
|
+
const durationMs = run.input.timeoutMs ?? 0;
|
|
213
|
+
this.#runs.settle(run, {
|
|
145
214
|
type: "result",
|
|
146
|
-
cellId,
|
|
215
|
+
cellId: run.input.cellId,
|
|
147
216
|
ok: false,
|
|
148
217
|
error: { message: `JS cell timed out after ${durationMs}ms` },
|
|
149
218
|
durationMs,
|
|
150
219
|
});
|
|
151
|
-
this.#
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
this.#
|
|
220
|
+
await this.#restartAfterStop();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
async #restartAfterStop(): Promise<void> {
|
|
224
|
+
if (this.#recovery) return await this.#recovery;
|
|
225
|
+
const recovery = this.#performRestartAfterStop();
|
|
226
|
+
this.#recovery = recovery;
|
|
227
|
+
try {
|
|
228
|
+
await recovery;
|
|
229
|
+
} finally {
|
|
230
|
+
if (this.#recovery === recovery) this.#recovery = null;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
async #performRestartAfterStop(): Promise<void> {
|
|
235
|
+
try {
|
|
236
|
+
await this.#terminate();
|
|
237
|
+
if (this.#lifecycle !== "open") return;
|
|
238
|
+
await this.#ensureReady();
|
|
239
|
+
if (this.#lifecycle === "open") this.#startNext();
|
|
240
|
+
} catch (error) {
|
|
241
|
+
if (error instanceof WorkerStartupCancelledError) return;
|
|
242
|
+
this.#runs.rejectWaiting(error instanceof Error ? error : new Error(String(error)));
|
|
243
|
+
}
|
|
156
244
|
}
|
|
157
245
|
|
|
158
246
|
#handleMessage(message: KernelToHostMessage): void {
|
|
159
247
|
this.#options.onMessage?.(message);
|
|
160
|
-
this.#active?.input.onMessage?.(message);
|
|
248
|
+
this.#runs.active?.input.onMessage?.(message);
|
|
161
249
|
if (message.type === "tool-call") {
|
|
162
250
|
const waiter = this.#toolWaiters.shift();
|
|
163
251
|
if (waiter) waiter(message);
|
|
@@ -165,83 +253,44 @@ export class JavaScriptKernel {
|
|
|
165
253
|
return;
|
|
166
254
|
}
|
|
167
255
|
if (message.type !== "result") return;
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
this.#active
|
|
172
|
-
active
|
|
256
|
+
const active = this.#runs.active;
|
|
257
|
+
if (!active || active.input.cellId !== message.cellId) return;
|
|
258
|
+
this.#clearTimeout();
|
|
259
|
+
this.#runs.releaseActive(active);
|
|
260
|
+
this.#runs.settle(active, message);
|
|
173
261
|
this.#startNext();
|
|
174
262
|
}
|
|
175
263
|
|
|
176
264
|
#handleCrash(error: Error): void {
|
|
177
|
-
const active = this.#active;
|
|
178
|
-
if (!active) return;
|
|
179
|
-
this.#
|
|
180
|
-
active
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
265
|
+
const active = this.#runs.active;
|
|
266
|
+
if (!active && this.#startupAbort) return;
|
|
267
|
+
this.#clearTimeout();
|
|
268
|
+
if (active) {
|
|
269
|
+
this.#runs.releaseActive(active);
|
|
270
|
+
this.#runs.settle(active, {
|
|
271
|
+
type: "result",
|
|
272
|
+
cellId: active.input.cellId,
|
|
273
|
+
ok: false,
|
|
274
|
+
error: bridgeError(error),
|
|
275
|
+
durationMs: this.#runs.durationMs(active, performance.now()),
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
void this.#restartAfterStop();
|
|
187
279
|
}
|
|
188
280
|
|
|
189
|
-
|
|
281
|
+
#clearTimeout(): void {
|
|
190
282
|
if (this.#timeout) clearTimeout(this.#timeout);
|
|
191
283
|
this.#timeout = null;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
async #terminate(): Promise<void> {
|
|
287
|
+
this.#clearTimeout();
|
|
288
|
+
this.#generation += 1;
|
|
289
|
+
this.#startupAbort?.abort();
|
|
290
|
+
this.#startupAbort = null;
|
|
291
|
+
this.#ready = null;
|
|
192
292
|
const worker = this.#worker;
|
|
193
293
|
this.#worker = null;
|
|
194
|
-
await worker
|
|
294
|
+
if (worker) await worker.terminate();
|
|
195
295
|
}
|
|
196
296
|
}
|
|
197
|
-
|
|
198
|
-
function waitForReady(worker: WorkerLike): Promise<void> {
|
|
199
|
-
return new Promise((resolve, reject) => {
|
|
200
|
-
const offMessage = worker.onMessage((message) => {
|
|
201
|
-
if (message.type === "ready") {
|
|
202
|
-
offMessage();
|
|
203
|
-
offError();
|
|
204
|
-
resolve();
|
|
205
|
-
} else if (message.type === "init-failed") {
|
|
206
|
-
offMessage();
|
|
207
|
-
offError();
|
|
208
|
-
reject(errorFromBridge(message.error));
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
const offError = worker.onError((error) => {
|
|
212
|
-
offMessage();
|
|
213
|
-
offError();
|
|
214
|
-
reject(error);
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
function wrapNodeWorker(worker: Worker): WorkerLike {
|
|
220
|
-
return {
|
|
221
|
-
mode: "worker",
|
|
222
|
-
postMessage: (message) => worker.postMessage(message),
|
|
223
|
-
onMessage(handler) {
|
|
224
|
-
const listener = (message: KernelToHostMessage): void => handler(message);
|
|
225
|
-
worker.on("message", listener);
|
|
226
|
-
return () => worker.off("message", listener);
|
|
227
|
-
},
|
|
228
|
-
onError(handler) {
|
|
229
|
-
worker.on("error", handler);
|
|
230
|
-
return () => worker.off("error", handler);
|
|
231
|
-
},
|
|
232
|
-
async terminate() {
|
|
233
|
-
await worker.terminate();
|
|
234
|
-
},
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
function errorFromBridge(error: { message: string; name?: string; stack?: string }): Error {
|
|
239
|
-
const result = new Error(error.message);
|
|
240
|
-
if (error.name) result.name = error.name;
|
|
241
|
-
if (error.stack) result.stack = error.stack;
|
|
242
|
-
return result;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
function bridgeError(error: Error): { message: string; name?: string; stack?: string } {
|
|
246
|
-
return { message: error.message, name: error.name, stack: error.stack };
|
|
247
|
-
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { parentPort, workerData } from "node:worker_threads";
|
|
2
|
+
import { createWorkerCore } from "./worker-core.js";
|
|
3
|
+
|
|
4
|
+
if (!parentPort) throw new Error("JS kernel inline fallback worker missing parentPort");
|
|
5
|
+
|
|
6
|
+
const transport = {
|
|
7
|
+
send(message) {
|
|
8
|
+
parentPort.postMessage(message);
|
|
9
|
+
},
|
|
10
|
+
onMessage(handler) {
|
|
11
|
+
parentPort.on("message", handler);
|
|
12
|
+
return () => parentPort.off("message", handler);
|
|
13
|
+
},
|
|
14
|
+
close() {
|
|
15
|
+
parentPort.close();
|
|
16
|
+
setTimeout(() => process.exit(0), 0);
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
createWorkerCore(transport, {
|
|
21
|
+
cwd: workerData.cwd,
|
|
22
|
+
parallelPoolWidth: workerData.parallelPoolWidth,
|
|
23
|
+
});
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import { inspect } from "node:util";
|
|
2
1
|
import type { HostToKernelMessage, KernelToHostMessage } from "../../bridge/protocol.ts";
|
|
3
|
-
import type { JavaScriptKernelMode } from "./
|
|
4
|
-
|
|
5
|
-
type AsyncFunctionType = new (...args: string[]) => (...values: unknown[]) => Promise<unknown>;
|
|
6
|
-
const AsyncFunction = async function inlineAsyncFunction() {
|
|
7
|
-
return undefined;
|
|
8
|
-
}.constructor as AsyncFunctionType;
|
|
2
|
+
import type { JavaScriptKernelMode } from "./kernel-contract.ts";
|
|
3
|
+
import { spawnNodeWorker } from "./worker-host.ts";
|
|
9
4
|
|
|
10
5
|
export interface WorkerLike {
|
|
11
6
|
readonly mode: JavaScriptKernelMode;
|
|
@@ -15,172 +10,6 @@ export interface WorkerLike {
|
|
|
15
10
|
terminate(): Promise<void>;
|
|
16
11
|
}
|
|
17
12
|
|
|
18
|
-
export function createInlineWorker(parallelPoolWidth: number): WorkerLike {
|
|
19
|
-
return new
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
class InlineWorker implements WorkerLike {
|
|
23
|
-
readonly mode = "inline";
|
|
24
|
-
readonly #parallelPoolWidth: number;
|
|
25
|
-
readonly #state: Record<string, unknown> = {};
|
|
26
|
-
#handlers: Array<(message: KernelToHostMessage) => void> = [];
|
|
27
|
-
#errorHandlers: Array<(error: Error) => void> = [];
|
|
28
|
-
#pendingTools = new Map<string, { resolve(value: unknown): void; reject(error: Error): void }>();
|
|
29
|
-
|
|
30
|
-
constructor(parallelPoolWidth: number) {
|
|
31
|
-
this.#parallelPoolWidth = parallelPoolWidth;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
postMessage(message: HostToKernelMessage): void {
|
|
35
|
-
if (message.type === "init") this.#emit({ type: "ready" });
|
|
36
|
-
else if (message.type === "run") void this.#run(message.cellId, message.code);
|
|
37
|
-
else if (message.type === "tool-reply") this.#deliverToolReply(message);
|
|
38
|
-
else if (message.type === "close") this.#emit({ type: "closed" });
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
onMessage(handler: (message: KernelToHostMessage) => void): () => void {
|
|
42
|
-
this.#handlers.push(handler);
|
|
43
|
-
return () => {
|
|
44
|
-
this.#handlers = this.#handlers.filter((existing) => existing !== handler);
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
onError(handler: (error: Error) => void): () => void {
|
|
49
|
-
this.#errorHandlers.push(handler);
|
|
50
|
-
return () => {
|
|
51
|
-
this.#errorHandlers = this.#errorHandlers.filter((existing) => existing !== handler);
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
async terminate(): Promise<void> {
|
|
56
|
-
this.#handlers = [];
|
|
57
|
-
this.#errorHandlers = [];
|
|
58
|
-
this.#pendingTools.clear();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
async #run(cellId: string, code: string): Promise<void> {
|
|
62
|
-
const started = Date.now();
|
|
63
|
-
try {
|
|
64
|
-
const value = await this.#execute(code);
|
|
65
|
-
this.#emit({
|
|
66
|
-
type: "result",
|
|
67
|
-
cellId,
|
|
68
|
-
ok: true,
|
|
69
|
-
valueRepr: valueRepr(value),
|
|
70
|
-
durationMs: Date.now() - started,
|
|
71
|
-
});
|
|
72
|
-
} catch (error) {
|
|
73
|
-
this.#emit({ type: "result", cellId, ok: false, error: bridgeError(error), durationMs: Date.now() - started });
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
async #execute(code: string): Promise<unknown> {
|
|
78
|
-
const transformed = code.replace(/(^|\n)\s*(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=/gu, "$1state.$2 =");
|
|
79
|
-
const body = /\breturn\b/u.test(transformed) ? transformed : `return await (${transformed})`;
|
|
80
|
-
const fn = new AsyncFunction(
|
|
81
|
-
"state",
|
|
82
|
-
"tool",
|
|
83
|
-
"parallel",
|
|
84
|
-
"print",
|
|
85
|
-
"display",
|
|
86
|
-
"log",
|
|
87
|
-
"phase",
|
|
88
|
-
`with (state) { ${body} }`,
|
|
89
|
-
);
|
|
90
|
-
return await fn(
|
|
91
|
-
this.#state,
|
|
92
|
-
this.#toolProxy(),
|
|
93
|
-
this.#parallel.bind(this),
|
|
94
|
-
this.#print.bind(this),
|
|
95
|
-
this.#display.bind(this),
|
|
96
|
-
this.#log.bind(this),
|
|
97
|
-
this.#phase.bind(this),
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
#toolProxy(): unknown {
|
|
102
|
-
return new Proxy(
|
|
103
|
-
{},
|
|
104
|
-
{
|
|
105
|
-
get: (_target, prop) => {
|
|
106
|
-
if (typeof prop !== "string") return undefined;
|
|
107
|
-
return async (args: unknown) => await this.#callTool(prop, args);
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
async #callTool(toolName: string, args: unknown): Promise<unknown> {
|
|
114
|
-
const callId = `js-${crypto.randomUUID()}`;
|
|
115
|
-
const promise = new Promise<unknown>((resolve, reject) => this.#pendingTools.set(callId, { resolve, reject }));
|
|
116
|
-
this.#emit({ type: "tool-call", callId, toolName, args });
|
|
117
|
-
return await promise;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
#deliverToolReply(message: Extract<HostToKernelMessage, { type: "tool-reply" }>): void {
|
|
121
|
-
const pending = this.#pendingTools.get(message.callId);
|
|
122
|
-
if (!pending) return;
|
|
123
|
-
this.#pendingTools.delete(message.callId);
|
|
124
|
-
if (message.ok) pending.resolve(message.value);
|
|
125
|
-
else pending.reject(errorFromBridge(message.error));
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
async #parallel(thunks: Array<() => Promise<unknown>>): Promise<unknown[]> {
|
|
129
|
-
const results = new Array<unknown>(thunks.length);
|
|
130
|
-
let next = 0;
|
|
131
|
-
await Promise.all(
|
|
132
|
-
Array.from({ length: Math.min(this.#parallelPoolWidth, thunks.length) }, async () => {
|
|
133
|
-
while (next < thunks.length) {
|
|
134
|
-
const index = next;
|
|
135
|
-
next += 1;
|
|
136
|
-
results[index] = await thunks[index]();
|
|
137
|
-
}
|
|
138
|
-
}),
|
|
139
|
-
);
|
|
140
|
-
return results;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
#print(...values: unknown[]): void {
|
|
144
|
-
this.#emit({ type: "text", stream: "stdout", data: `${values.map(formatValue).join(" ")}\n` });
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
#display(value: unknown): void {
|
|
148
|
-
this.#emit({
|
|
149
|
-
type: "display",
|
|
150
|
-
mimeType: "application/json",
|
|
151
|
-
dataBase64: Buffer.from(JSON.stringify(value), "utf8").toString("base64"),
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
#log(message: unknown): void {
|
|
156
|
-
this.#emit({ type: "log", message: String(message) });
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
#phase(title: unknown): void {
|
|
160
|
-
this.#emit({ type: "phase", title: String(title) });
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
#emit(message: KernelToHostMessage): void {
|
|
164
|
-
for (const handler of this.#handlers) handler(message);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
function valueRepr(value: unknown): string | undefined {
|
|
169
|
-
return value === undefined ? undefined : JSON.stringify(value);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
function formatValue(value: unknown): string {
|
|
173
|
-
return typeof value === "string" ? value : inspect(value, { colors: false, depth: 5 });
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
function errorFromBridge(error: { message: string; name?: string; stack?: string }): Error {
|
|
177
|
-
const result = new Error(error.message);
|
|
178
|
-
if (error.name) result.name = error.name;
|
|
179
|
-
if (error.stack) result.stack = error.stack;
|
|
180
|
-
return result;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
function bridgeError(error: unknown): { message: string; name?: string; stack?: string } {
|
|
184
|
-
if (error instanceof Error) return { message: error.message, name: error.name, stack: error.stack };
|
|
185
|
-
return { message: String(error) };
|
|
13
|
+
export function createInlineWorker(cwd: string, parallelPoolWidth: number): WorkerLike {
|
|
14
|
+
return spawnNodeWorker(new URL("./inline-worker-entry.js", import.meta.url), cwd, parallelPoolWidth, "inline");
|
|
186
15
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { KernelToHostMessage } from "../../bridge/protocol.ts";
|
|
2
|
+
|
|
3
|
+
export type ResultMessage = Extract<KernelToHostMessage, { type: "result" }>;
|
|
4
|
+
export type ToolCallMessage = Extract<KernelToHostMessage, { type: "tool-call" }>;
|
|
5
|
+
|
|
6
|
+
export type JavaScriptKernelMode = "worker" | "inline";
|
|
7
|
+
|
|
8
|
+
export interface JavaScriptKernelOptions {
|
|
9
|
+
readonly sessionId: string;
|
|
10
|
+
readonly cwd: string;
|
|
11
|
+
readonly parallelPoolWidth: number;
|
|
12
|
+
readonly onMessage?: (message: KernelToHostMessage) => void;
|
|
13
|
+
readonly workerEntryUrl?: URL;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface JavaScriptRunInput {
|
|
17
|
+
readonly cellId: string;
|
|
18
|
+
readonly code: string;
|
|
19
|
+
readonly timeoutMs?: number;
|
|
20
|
+
readonly onMessage?: (message: KernelToHostMessage) => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type KernelOperation = "run" | "reset" | "interrupt";
|
|
24
|
+
export type LifecycleState = "open" | "closing" | "closed";
|
|
25
|
+
|
|
26
|
+
export class JavaScriptKernelClosedError extends Error {
|
|
27
|
+
readonly name = "JavaScriptKernelClosedError";
|
|
28
|
+
readonly operation: KernelOperation;
|
|
29
|
+
|
|
30
|
+
constructor(operation: KernelOperation) {
|
|
31
|
+
super(`Cannot ${operation}: JavaScript kernel is closed`);
|
|
32
|
+
this.operation = operation;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function assertJavaScriptKernelOpen(lifecycle: LifecycleState, operation: KernelOperation): void {
|
|
37
|
+
if (lifecycle !== "open") throw new JavaScriptKernelClosedError(operation);
|
|
38
|
+
}
|