@the-open-engine/zeroshot 6.22.0 → 6.23.0
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/lib/agent-cli-provider/adapters/omp.d.ts +3 -1
- package/lib/agent-cli-provider/adapters/omp.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/omp.js +252 -269
- package/lib/agent-cli-provider/adapters/omp.js.map +1 -1
- package/lib/agent-cli-provider/contract-invoke.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-invoke.js +68 -14
- package/lib/agent-cli-provider/contract-invoke.js.map +1 -1
- package/lib/agent-cli-provider/contract-options.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-options.js +5 -3
- package/lib/agent-cli-provider/contract-options.js.map +1 -1
- package/lib/agent-cli-provider/index.d.ts +6 -0
- package/lib/agent-cli-provider/index.d.ts.map +1 -1
- package/lib/agent-cli-provider/index.js +12 -1
- package/lib/agent-cli-provider/index.js.map +1 -1
- package/lib/agent-cli-provider/omp-release.d.ts +3 -1
- package/lib/agent-cli-provider/omp-release.d.ts.map +1 -1
- package/lib/agent-cli-provider/omp-release.js +22 -2
- package/lib/agent-cli-provider/omp-release.js.map +1 -1
- package/lib/agent-cli-provider/omp-rpc-bounds.d.ts +7 -0
- package/lib/agent-cli-provider/omp-rpc-bounds.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp-rpc-bounds.js +27 -0
- package/lib/agent-cli-provider/omp-rpc-bounds.js.map +1 -0
- package/lib/agent-cli-provider/omp-rpc-driver.d.ts +40 -0
- package/lib/agent-cli-provider/omp-rpc-driver.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp-rpc-driver.js +494 -0
- package/lib/agent-cli-provider/omp-rpc-driver.js.map +1 -0
- package/lib/agent-cli-provider/omp-rpc-events.d.ts +28 -0
- package/lib/agent-cli-provider/omp-rpc-events.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp-rpc-events.js +264 -0
- package/lib/agent-cli-provider/omp-rpc-events.js.map +1 -0
- package/lib/agent-cli-provider/omp-rpc-protocol.d.ts +1 -1
- package/lib/agent-cli-provider/omp-rpc-protocol.d.ts.map +1 -1
- package/lib/agent-cli-provider/omp-rpc-protocol.js +8 -3
- package/lib/agent-cli-provider/omp-rpc-protocol.js.map +1 -1
- package/lib/agent-cli-provider/omp-rpc-session.d.ts +17 -0
- package/lib/agent-cli-provider/omp-rpc-session.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp-rpc-session.js +6 -0
- package/lib/agent-cli-provider/omp-rpc-session.js.map +1 -0
- package/lib/agent-cli-provider/provider-registry.d.ts +15 -11
- package/lib/agent-cli-provider/provider-registry.d.ts.map +1 -1
- package/lib/agent-cli-provider/provider-registry.js +16 -5
- package/lib/agent-cli-provider/provider-registry.js.map +1 -1
- package/lib/agent-cli-provider/types.d.ts +13 -11
- package/lib/agent-cli-provider/types.d.ts.map +1 -1
- package/lib/agent-cli-provider/types.js.map +1 -1
- package/package.json +2 -1
- package/src/agent-cli-provider/adapters/omp.ts +276 -329
- package/src/agent-cli-provider/contract-invoke.ts +86 -15
- package/src/agent-cli-provider/contract-options.ts +5 -3
- package/src/agent-cli-provider/index.ts +13 -0
- package/src/agent-cli-provider/omp-release.ts +24 -1
- package/src/agent-cli-provider/omp-rpc-bounds.ts +28 -0
- package/src/agent-cli-provider/omp-rpc-driver.ts +611 -0
- package/src/agent-cli-provider/omp-rpc-events.ts +318 -0
- package/src/agent-cli-provider/omp-rpc-protocol.ts +8 -3
- package/src/agent-cli-provider/omp-rpc-session.ts +20 -0
- package/src/agent-cli-provider/provider-registry.ts +26 -7
- package/src/agent-cli-provider/types.ts +14 -11
- package/src/command-cleanup-ownership.js +307 -0
- package/src/omp-config-overlay.js +96 -0
- package/src/orchestrator.js +20 -5
- package/src/preflight.js +35 -3
- package/src/watcher-prompt-channel.js +209 -0
- package/task-lib/command-spec-cleanup.js +1 -262
- package/task-lib/provider-helper-runtime.js +6 -0
- package/task-lib/rpc-watcher.js +186 -0
- package/task-lib/runner.js +40 -6
- package/task-lib/watcher-output-runtime.js +32 -0
|
@@ -1,16 +1,46 @@
|
|
|
1
|
-
import { unlink } from 'node:fs/promises';
|
|
2
1
|
import { buildAcpPrompt } from './adapters/acp';
|
|
2
|
+
import { buildOmpPrompt } from './adapters/omp';
|
|
3
3
|
import { runAcpStdioPrompt } from './acp-stdio-runner';
|
|
4
|
+
import { runOmpRpcTask } from './omp-rpc-driver';
|
|
5
|
+
import { ABORT_GRACE_MS, EXIT_GRACE_MS } from './omp-rpc-bounds';
|
|
6
|
+
import { OMP_SUPPORTED_VERSION } from './omp-release';
|
|
4
7
|
import { commandRedactions } from './contract-env';
|
|
5
8
|
import { successEnvelope, type ContractEnvelope } from './contract-envelope';
|
|
6
9
|
import { buildCommandSpec, optionalNumber, schemaMode, type RequestData } from './contract-support';
|
|
7
10
|
import { providerFailureClassification } from './invoke-evidence';
|
|
8
11
|
import { parseOutputEvents } from './contract-parse';
|
|
9
|
-
import { unknownToMessage } from './json';
|
|
12
|
+
import { isRecord, unknownToMessage } from './json';
|
|
10
13
|
import { getProviderRegistryEntry } from './provider-registry';
|
|
11
14
|
import type { CommandSpec } from './types';
|
|
12
15
|
import type { ProcessResult, ProcessRunner, ProcessRunnerOptions } from './process-runner';
|
|
13
16
|
|
|
17
|
+
type UnknownFunction = (...args: unknown[]) => unknown;
|
|
18
|
+
|
|
19
|
+
function isUnknownFunction(value: unknown): value is UnknownFunction {
|
|
20
|
+
return typeof value === 'function';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function createCommandSpecCleanup(
|
|
24
|
+
commandSpec: CommandSpec,
|
|
25
|
+
logFailure: (path: string, error: unknown) => void
|
|
26
|
+
): { run: () => unknown } {
|
|
27
|
+
const cleanupModule: unknown = require('../../src/command-cleanup-ownership');
|
|
28
|
+
if (!isRecord(cleanupModule) || !isUnknownFunction(cleanupModule.createCommandSpecCleanup)) {
|
|
29
|
+
throw new Error('src/command-cleanup-ownership must export createCommandSpecCleanup.');
|
|
30
|
+
}
|
|
31
|
+
const cleanup = cleanupModule.createCommandSpecCleanup(commandSpec, logFailure);
|
|
32
|
+
if (!isRecord(cleanup) || !isUnknownFunction(cleanup.run)) {
|
|
33
|
+
throw new Error('createCommandSpecCleanup() must return { run }.');
|
|
34
|
+
}
|
|
35
|
+
const runFn = cleanup.run;
|
|
36
|
+
return { run: () => runFn() };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// No caller-supplied timeoutMs for the rpc-stdio lane means "no timeout"; the driver's
|
|
40
|
+
// OmpRpcTaskRequest.timeoutMs is required, so fall back to Node's max safe setTimeout delay
|
|
41
|
+
// (~24.8 days) rather than inventing a shorter implicit ceiling.
|
|
42
|
+
const NO_TIMEOUT_MS = 2_147_483_647;
|
|
43
|
+
|
|
14
44
|
interface CleanupResult {
|
|
15
45
|
readonly path: string;
|
|
16
46
|
readonly removed: boolean;
|
|
@@ -18,17 +48,18 @@ interface CleanupResult {
|
|
|
18
48
|
}
|
|
19
49
|
|
|
20
50
|
async function cleanupFiles(commandSpec: CommandSpec): Promise<readonly CleanupResult[]> {
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
51
|
+
const paths = commandSpec.cleanup ?? [];
|
|
52
|
+
if (paths.length === 0) return [];
|
|
53
|
+
const failures = new Map<string, string>();
|
|
54
|
+
const cleanup = createCommandSpecCleanup(commandSpec, (path: string, error: unknown) => {
|
|
55
|
+
failures.set(path, unknownToMessage(error));
|
|
56
|
+
});
|
|
57
|
+
await cleanup.run();
|
|
58
|
+
const planFailure = failures.get('<command-cleanup>');
|
|
59
|
+
return paths.map((path) => {
|
|
60
|
+
const error = planFailure ?? failures.get(path);
|
|
61
|
+
return error === undefined ? { path, removed: true } : { path, removed: false, error };
|
|
62
|
+
});
|
|
32
63
|
}
|
|
33
64
|
|
|
34
65
|
async function runAndCleanup(
|
|
@@ -50,6 +81,43 @@ async function runAndCleanup(
|
|
|
50
81
|
return { result, cleanup };
|
|
51
82
|
}
|
|
52
83
|
|
|
84
|
+
async function runOmpRpcContractPrompt(
|
|
85
|
+
commandSpec: CommandSpec,
|
|
86
|
+
prompt: string,
|
|
87
|
+
options: ProcessRunnerOptions = {}
|
|
88
|
+
): Promise<ProcessResult> {
|
|
89
|
+
const startedAt = Date.now();
|
|
90
|
+
const timeoutMs = options.timeoutMs ?? NO_TIMEOUT_MS;
|
|
91
|
+
const controller = new AbortController();
|
|
92
|
+
const result = await runOmpRpcTask(
|
|
93
|
+
{
|
|
94
|
+
commandSpec,
|
|
95
|
+
prompt,
|
|
96
|
+
expectedVersion: OMP_SUPPORTED_VERSION,
|
|
97
|
+
session: { kind: 'none' },
|
|
98
|
+
signal: controller.signal,
|
|
99
|
+
timeoutMs,
|
|
100
|
+
abortGraceMs: ABORT_GRACE_MS,
|
|
101
|
+
exitGraceMs: EXIT_GRACE_MS,
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
onSpawn: async () => {},
|
|
105
|
+
onEvent: async () => {},
|
|
106
|
+
onSession: async () => {},
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
const timedOut = result.stopReason === 'timeout';
|
|
110
|
+
return {
|
|
111
|
+
stdout: result.events.map((event) => JSON.stringify(event)).join('\n'),
|
|
112
|
+
stderr: '',
|
|
113
|
+
exitCode: result.exitCode,
|
|
114
|
+
signal: result.signal,
|
|
115
|
+
durationMs: Date.now() - startedAt,
|
|
116
|
+
timedOut,
|
|
117
|
+
...(timedOut ? { timeoutMs } : {}),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
53
121
|
export async function runInvoke(
|
|
54
122
|
request: RequestData,
|
|
55
123
|
runner: ProcessRunner
|
|
@@ -58,11 +126,14 @@ export async function runInvoke(
|
|
|
58
126
|
const timeoutMs = optionalNumber(request.raw, 'timeoutMs');
|
|
59
127
|
const runnerOptions = timeoutMs === undefined ? {} : { timeoutMs };
|
|
60
128
|
const invokeSpec = getProviderRegistryEntry(adapter.id).invoke;
|
|
61
|
-
const invokeRunner =
|
|
129
|
+
const invokeRunner: ProcessRunner =
|
|
62
130
|
invokeSpec.lane === 'acp-stdio'
|
|
63
131
|
? (spec: CommandSpec, invokeOptions?: ProcessRunnerOptions): Promise<ProcessResult> =>
|
|
64
132
|
runAcpStdioPrompt(adapter.id, spec, buildAcpPrompt(context, options), invokeOptions)
|
|
65
|
-
:
|
|
133
|
+
: invokeSpec.lane === 'rpc-stdio'
|
|
134
|
+
? (spec: CommandSpec, invokeOptions?: ProcessRunnerOptions): Promise<ProcessResult> =>
|
|
135
|
+
runOmpRpcContractPrompt(spec, buildOmpPrompt(context, options), invokeOptions)
|
|
136
|
+
: runner;
|
|
66
137
|
const { result, cleanup } = await runAndCleanup(commandSpec, invokeRunner, runnerOptions);
|
|
67
138
|
const parsed = parseOutputEvents(adapter, {
|
|
68
139
|
chunk: [result.stdout, result.stderr].join('\n'),
|
|
@@ -49,11 +49,13 @@ const CLI_FEATURE_FIELDS = [
|
|
|
49
49
|
'supportsNoPromptTemplates',
|
|
50
50
|
'supportsNoContextFiles',
|
|
51
51
|
'supportsNoApprove',
|
|
52
|
-
'
|
|
53
|
-
'
|
|
52
|
+
'supportsRpcMode',
|
|
53
|
+
'supportsConfig',
|
|
54
54
|
'supportsThinking',
|
|
55
|
-
'
|
|
55
|
+
'supportsApprovalMode',
|
|
56
56
|
'supportsNoTitle',
|
|
57
|
+
'supportsSessionDir',
|
|
58
|
+
'versionMatches',
|
|
57
59
|
'supportsJsonOutput',
|
|
58
60
|
'supportsAllowAll',
|
|
59
61
|
'supportsNoAskUser',
|
|
@@ -33,6 +33,19 @@ export {
|
|
|
33
33
|
type ProcessRunner,
|
|
34
34
|
type ProcessRunnerOptions,
|
|
35
35
|
} from './process-runner';
|
|
36
|
+
export {
|
|
37
|
+
runOmpRpcTask,
|
|
38
|
+
type OmpRpcSessionEvidence,
|
|
39
|
+
type OmpRpcSpawnEvidence,
|
|
40
|
+
type OmpRpcTaskHooks,
|
|
41
|
+
type OmpRpcTaskRequest,
|
|
42
|
+
type OmpRpcTaskResult,
|
|
43
|
+
} from './omp-rpc-driver';
|
|
44
|
+
export { buildOmpPrompt } from './adapters/omp';
|
|
45
|
+
export { DEFAULT_OMP_RPC_DECODER_LIMITS } from './omp-rpc-protocol';
|
|
46
|
+
export { ABORT_GRACE_MS, EXIT_GRACE_MS } from './omp-rpc-bounds';
|
|
47
|
+
export { OMP_SUPPORTED_VERSION } from './omp-release';
|
|
48
|
+
export type { OmpSessionLaunch, VerifiedOmpPartition, VerifiedOmpSessionFile } from './omp-rpc-session';
|
|
36
49
|
export {
|
|
37
50
|
detectRuntimeProviderCliFeatures,
|
|
38
51
|
prepareSingleAgentProviderCommand,
|
|
@@ -1,8 +1,31 @@
|
|
|
1
1
|
export const OMP_SUPPORTED_VERSION = '17.2.1' as const;
|
|
2
2
|
export const OMP_PACKAGE_NAME = '@oh-my-pi/pi-coding-agent' as const;
|
|
3
3
|
export const OMP_BINARY_NAME = 'omp' as const;
|
|
4
|
+
|
|
5
|
+
// Host remediation is version-selected package installation via bun, not release-asset digest
|
|
6
|
+
// attestation; the v17.2.1 shell installer downloads an asset without checking the plan's
|
|
7
|
+
// SHA-256, so it is never recommended here. `OMP_RELEASE_ASSETS` below is a separate, honest
|
|
8
|
+
// artifact-verification contract (asset name + sha256 per platform) that #868/#869/#901 consume
|
|
9
|
+
// for their own digest-checked download paths — it is not implied or claimed by this command.
|
|
10
|
+
//
|
|
11
|
+
// KEEP OMP_RELEASE_DOWNLOAD_BASE_URL / OmpReleasePlatform / OmpReleaseAsset / OMP_RELEASE_ASSETS /
|
|
12
|
+
// findOmpReleaseAsset / ompReleaseAssetDownloadUrl. This is a deliberate, verified deviation from
|
|
13
|
+
// issue #900's own PLAN_READY step 1, which pre-dates and is superseded by the issue's own
|
|
14
|
+
// non-negotiable clarification comment (verified verbatim via
|
|
15
|
+
// `gh api repos/the-open-engine/zeroshot/issues/comments/5159295182`):
|
|
16
|
+
// "(1) preserve OMP_RELEASE_ASSETS, all six pinned SHA-256 digests, findOmpReleaseAsset, and
|
|
17
|
+
// download URL helpers from #897. Host PATH/package guidance must not claim artifact attestation,
|
|
18
|
+
// but Zeroshot-owned Docker, CI conformance, and update-review downloads in #868/#869/#901 consume
|
|
19
|
+
// this single release contract; deleting it breaks downstream issues." Any validator flagging
|
|
20
|
+
// this file for exporting a "release-asset digest table" is checking stale plan text against a
|
|
21
|
+
// clarification it never read — read the comment above (or fetch that comment id) before scoring
|
|
22
|
+
// this as a defect.
|
|
4
23
|
export const OMP_INSTALL_COMMAND =
|
|
5
|
-
`
|
|
24
|
+
`bun install -g ${OMP_PACKAGE_NAME}@${OMP_SUPPORTED_VERSION}` as const;
|
|
25
|
+
export const OMP_AUTH_INSTRUCTIONS = 'omp\n/login' as const;
|
|
26
|
+
export const OMP_REMEDIATION =
|
|
27
|
+
`Install the pinned OMP release with \`${OMP_INSTALL_COMMAND}\`, then authenticate OAuth users via \`${OMP_AUTH_INSTRUCTIONS}\`.` as const;
|
|
28
|
+
|
|
6
29
|
export const OMP_RELEASE_DOWNLOAD_BASE_URL =
|
|
7
30
|
`https://github.com/can1357/oh-my-pi/releases/download/v${OMP_SUPPORTED_VERSION}` as const;
|
|
8
31
|
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Bounds for the OMP RPC v2 stdio driver. Every count/size below is checked before any buffer or
|
|
2
|
+
// array is allocated from a peer-declared count/byteLength; see omp-rpc-driver.ts.
|
|
3
|
+
|
|
4
|
+
// Inbound RPC frames (any type — response/extension_ui_request/host_tool_call/host_uri_request/
|
|
5
|
+
// message frames, etc.) the driver will hold queued awaiting dispatch at once. A single stdout
|
|
6
|
+
// chunk can decode to an attacker-controlled number of frames before any of them is actually
|
|
7
|
+
// processed (dispatch is asynchronous), so this bounds that queue depth independently of each
|
|
8
|
+
// frame's own size caps.
|
|
9
|
+
export const MAX_PENDING_REQUESTS = 64;
|
|
10
|
+
|
|
11
|
+
// Total distinct request ids the driver will track ownership of across the lifetime of one task,
|
|
12
|
+
// bounding a slow-drip identifier-exhaustion attack from a misbehaving/compromised child.
|
|
13
|
+
export const MAX_LIFETIME_REQUEST_IDS = 4096;
|
|
14
|
+
|
|
15
|
+
// Total bytes of normalized OutputEvent text (text/thinking/tool_call input/tool_result content,
|
|
16
|
+
// serialized) the driver will accumulate for one task before failing permanently.
|
|
17
|
+
export const MAX_NORMALIZED_OUTPUT_BYTES = 8 * 1024 * 1024;
|
|
18
|
+
|
|
19
|
+
// Rolling tail of stderr bytes kept only for attaching to error messages; stderr is never streamed
|
|
20
|
+
// to output.
|
|
21
|
+
export const MAX_STDERR_TAIL_BYTES = 8192;
|
|
22
|
+
|
|
23
|
+
// Grace periods for the abort → SIGTERM → SIGKILL lifecycle. Not derived from an existing shared
|
|
24
|
+
// constant: `process-runner.ts`'s DEFAULT_TIMEOUT_KILL_GRACE_MS (100ms) is a request/response
|
|
25
|
+
// runner's SIGTERM→SIGKILL-only handoff, whereas the RPC driver also has to wait for an in-band
|
|
26
|
+
// `abort` command round-trip before the process boundary is touched at all.
|
|
27
|
+
export const ABORT_GRACE_MS = 2000;
|
|
28
|
+
export const EXIT_GRACE_MS = 2000;
|