Skip to content

Commit 9cc1f06

Browse files
committed
refactor!: tighten v1 api surface
1 parent 6fed9ef commit 9cc1f06

26 files changed

Lines changed: 446 additions & 599 deletions

.changeset/tidy-v1-api-surface.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"@execbox/core": minor
3+
"@execbox/quickjs": minor
4+
"@execbox/remote": minor
5+
---
6+
7+
Tighten the pre-1.0 public API surface by keeping low-level core helpers out of the main `@execbox/core` entrypoint, removing unsupported QuickJS runner subpath exports, and keeping runner-side remote endpoint types with `@execbox/quickjs/remote-endpoint`.

docs/src/content/docs/architecture/execbox-core.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ The core package exposes three main responsibilities:
2323
- Define the stable app-facing execution contract
2424
- Provide runtime implementers with shared runner semantics through `@execbox/core/runtime`
2525

26-
The main public concepts are:
26+
The main app-facing concepts are:
2727

2828
| Concept | Purpose |
2929
| ---------------------- | ----------------------------------------------------------------------------------- |
@@ -32,8 +32,10 @@ The main public concepts are:
3232
| `Executor` | Runtime-specific implementation of `execute(code, providers)` |
3333
| `ExecuteResult` | Stable success/error envelope returned by every executor |
3434
| `ToolExecutionContext` | Abort-aware metadata passed to each tool invocation |
35-
| `ProviderManifest` | Transport-safe view of a resolved provider exposed to reusable runners |
36-
| `ToolCallResult` | Trusted host response to a runner-emitted tool call |
35+
36+
Runtime implementer concepts such as `ProviderManifest` and `ToolCallResult`
37+
live on `@execbox/core/runtime` and `@execbox/core/protocol`, not the main
38+
`@execbox/core` entrypoint.
3739

3840
## Provider Resolution Pipeline
3941

packages/core/__tests__/core/jsonSchema.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { describe, expect, it } from "vitest";
2-
import { generateTypesFromJsonSchema } from "@execbox/core";
2+
import { generateTypesFromJsonSchema } from "../../src/typegen/jsonSchema";
33

44
describe("generateTypesFromJsonSchema", () => {
55
it("emits namespace declarations for object schemas with required and optional fields", () => {

packages/core/__tests__/core/runtimeEntrypoint.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,15 @@ describe("@execbox/core/runtime", () => {
1212
});
1313

1414
it("keeps executor-author helpers out of the app-facing core entrypoint", () => {
15+
expect(core).not.toHaveProperty("assertValidIdentifier");
1516
expect(core).not.toHaveProperty("createToolCallDispatcher");
1617
expect(core).not.toHaveProperty("createTimeoutExecuteResult");
1718
expect(core).not.toHaveProperty("formatConsoleLine");
19+
expect(core).not.toHaveProperty("generateTypesFromJsonSchema");
20+
expect(core).not.toHaveProperty("isJsonSerializable");
1821
expect(core).not.toHaveProperty("normalizeThrownMessage");
22+
expect(core).not.toHaveProperty("sanitizeIdentifier");
23+
expect(core).not.toHaveProperty("sanitizeToolName");
24+
expect(core).not.toHaveProperty("serializePropertyName");
1925
});
2026
});

packages/core/__tests__/core/sanitize.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { describe, expect, it } from "vitest";
2-
import { sanitizeIdentifier, sanitizeToolName } from "@execbox/core";
2+
import { sanitizeIdentifier } from "../../src/identifier";
3+
import { sanitizeToolName } from "../../src/sanitize";
34

45
describe("sanitizeToolName", () => {
56
it("replaces punctuation and spaces with underscores", () => {

packages/core/__tests__/security/isJsonSerializable.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describe, expect, it } from "vitest";
22

3-
import { isJsonSerializable } from "@execbox/core";
3+
import { isJsonSerializable } from "@execbox/core/runtime";
44

55
function buildDag(depth: number): Record<string, unknown> {
66
let current: Record<string, unknown> = { leaf: true };

packages/core/etc/execbox-core.api.md

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@
77
import { ZodRawShape } from 'zod';
88
import { ZodTypeAny } from 'zod';
99

10-
// @public
11-
export function assertValidIdentifier(value: string, label?: string): void;
12-
1310
// @public
1411
export interface ExecuteError {
1512
code: ExecuteErrorCode;
@@ -79,44 +76,12 @@ export interface ExecutorRuntimeOptions {
7976
timeoutMs?: number;
8077
}
8178

82-
// @public
83-
export function generateTypesFromJsonSchema(providerName: string, tools: Record<string, TypegenToolDescriptor>): string;
84-
8579
// @public
8680
export function isExecuteFailure(value: unknown): value is ExecuteFailure;
8781

88-
// @public
89-
export function isJsonSerializable(value: unknown, active?: Set<object>, memo?: WeakSet<object>): boolean;
90-
91-
// @public
92-
export function isReservedWord(value: string): boolean;
93-
94-
// @public
95-
export function isValidIdentifier(value: string): boolean;
96-
9782
// @public
9883
export type JsonSchema = Record<string, unknown>;
9984

100-
// @public
101-
export interface ProviderManifest {
102-
// (undocumented)
103-
name: string;
104-
// (undocumented)
105-
tools: Record<string, ProviderToolManifest>;
106-
// (undocumented)
107-
types: string;
108-
}
109-
110-
// @public
111-
export interface ProviderToolManifest {
112-
// (undocumented)
113-
description?: string;
114-
// (undocumented)
115-
originalName: string;
116-
// (undocumented)
117-
safeName: string;
118-
}
119-
12085
// @public
12186
export interface ResolvedToolDescriptor {
12287
description?: string;
@@ -139,34 +104,6 @@ export interface ResolvedToolProvider {
139104
// @public
140105
export function resolveProvider(provider: ToolProvider): ResolvedToolProvider;
141106

142-
// @public
143-
export function sanitizeIdentifier(value: string): string;
144-
145-
// @public
146-
export function sanitizeToolName(name: string): string;
147-
148-
// @public
149-
export function serializePropertyName(name: string): string;
150-
151-
// @public
152-
export interface ToolCall {
153-
// (undocumented)
154-
input: unknown;
155-
// (undocumented)
156-
providerName: string;
157-
// (undocumented)
158-
safeToolName: string;
159-
}
160-
161-
// @public
162-
export type ToolCallResult = {
163-
ok: true;
164-
result: unknown;
165-
} | {
166-
error: ExecuteError;
167-
ok: false;
168-
};
169-
170107
// @public
171108
export interface ToolDescriptor {
172109
description?: string;
@@ -193,7 +130,4 @@ export interface ToolProvider {
193130
// @public
194131
export type ToolSchema = JsonSchema | ZodTypeAny | ZodRawShape;
195132

196-
// @public
197-
export type TypegenToolDescriptor = Pick<ResolvedToolDescriptor, "description" | "inputSchema" | "outputSchema"> & Partial<Pick<ResolvedToolDescriptor, "execute">>;
198-
199133
```

packages/core/src/index.ts

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,9 @@
33
* Public API for the `@execbox/core` package.
44
*/
55
export type { Executor, ExecutorPoolOptions } from "./executor/executor";
6-
export {
7-
assertValidIdentifier,
8-
isReservedWord,
9-
isValidIdentifier,
10-
sanitizeIdentifier,
11-
serializePropertyName,
12-
} from "./identifier";
13-
export { sanitizeToolName } from "./sanitize";
14-
export { ExecuteFailure, isExecuteFailure, isJsonSerializable } from "./errors";
6+
export { ExecuteFailure, isExecuteFailure } from "./errors";
157
export { resolveProvider } from "./provider/resolveProvider";
16-
export { generateTypesFromJsonSchema } from "./typegen/jsonSchema";
17-
export type {
18-
ExecutionOptions,
19-
ExecutorRuntimeOptions,
20-
ProviderManifest,
21-
ProviderToolManifest,
22-
ToolCall,
23-
ToolCallResult,
24-
} from "./runner";
8+
export type { ExecutionOptions, ExecutorRuntimeOptions } from "./runner";
259
export type {
2610
ExecuteError,
2711
ExecuteErrorCode,
@@ -33,5 +17,4 @@ export type {
3317
ToolExecutionContext,
3418
ToolProvider,
3519
ToolSchema,
36-
TypegenToolDescriptor,
3720
} from "./types";

packages/quickjs/README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,6 @@ await executor.prewarm();
6464

6565
## Advanced Imports
6666

67-
- `@execbox/quickjs/runner` exports the reusable QuickJS runner
68-
- `@execbox/quickjs/runner/protocol-endpoint` exports the low-level QuickJS protocol loop used by worker-hosted integrations
6967
- `@execbox/quickjs/remote-endpoint` adapts the QuickJS protocol loop to `@execbox/remote` runner ports
7068

7169
## Operational Notes
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { readFileSync } from "node:fs";
2+
3+
import { describe, expect, it } from "vitest";
4+
5+
import {
6+
createEntrypointSpecifier,
7+
workspaceEntrypoints,
8+
} from "../../../scripts/workspace-entrypoints.ts";
9+
10+
interface PackageManifest {
11+
exports: Record<string, unknown>;
12+
}
13+
14+
function readPackageManifest(path: string): PackageManifest {
15+
return JSON.parse(readFileSync(path, "utf8")) as PackageManifest;
16+
}
17+
18+
describe("published entrypoints", () => {
19+
it("keeps low-level QuickJS runner internals out of the public package surface", () => {
20+
const manifest = readPackageManifest("packages/quickjs/package.json");
21+
const specifiers = workspaceEntrypoints.map(createEntrypointSpecifier);
22+
23+
expect(manifest.exports).not.toHaveProperty("./runner");
24+
expect(manifest.exports).not.toHaveProperty("./runner/protocol-endpoint");
25+
expect(specifiers).not.toContain("@execbox/quickjs/runner");
26+
expect(specifiers).not.toContain(
27+
"@execbox/quickjs/runner/protocol-endpoint",
28+
);
29+
});
30+
});

0 commit comments

Comments
 (0)