orizu 0.5.31 → 0.5.33
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/dist/app-commands.d.ts +2 -0
- package/dist/app-commands.d.ts.map +1 -1
- package/dist/app-commands.js +10 -4
- package/dist/help.js +5 -5
- package/dist/hosted-agent-prompt.d.ts +14 -0
- package/dist/hosted-agent-prompt.d.ts.map +1 -0
- package/dist/hosted-agent-prompt.js +17 -0
- package/dist/hosted-harness-opencode.d.ts.map +1 -1
- package/dist/hosted-harness-opencode.js +4 -0
- package/dist/hosted-loop.d.ts.map +1 -1
- package/dist/hosted-loop.js +8 -3
- package/dist/hosted-optimization-prebaked-marker.d.ts +9 -0
- package/dist/hosted-optimization-prebaked-marker.d.ts.map +1 -0
- package/dist/hosted-optimization-prebaked-marker.js +22 -0
- package/dist/hosted-run-event-sink.d.ts +10 -1
- package/dist/hosted-run-event-sink.d.ts.map +1 -1
- package/dist/hosted-run-event-sink.js +69 -8
- package/dist/markdown-report-input.d.ts.map +1 -1
- package/dist/markdown-report-input.js +1 -1
- package/dist/preview-runtime.d.ts +7 -0
- package/dist/preview-runtime.d.ts.map +1 -1
- package/dist/preview-runtime.js +49 -5
- package/dist/provider-refusals.js +2 -2
- package/dist/report-markdown-blankness.d.ts +6 -0
- package/dist/report-markdown-blankness.d.ts.map +1 -1
- package/dist/report-markdown-blankness.js +47 -4
- package/dist/setup-and-skills-commands.d.ts.map +1 -1
- package/dist/setup-and-skills-commands.js +123 -9
- package/dist/skill-installer.d.ts +32 -0
- package/dist/skill-installer.d.ts.map +1 -1
- package/dist/skill-installer.js +228 -1
- package/package.json +1 -1
- package/src/app-commands.ts +13 -3
- package/src/help.ts +5 -5
- package/src/hosted-agent-prompt.ts +18 -0
- package/src/hosted-harness-opencode.ts +4 -0
- package/src/hosted-loop.ts +8 -3
- package/src/hosted-optimization-prebaked-marker.ts +20 -0
- package/src/hosted-run-event-sink.ts +74 -9
- package/src/markdown-report-input.ts +3 -1
- package/src/preview-runtime.ts +44 -5
- package/src/provider-refusals.ts +2 -2
- package/src/report-markdown-blankness.ts +59 -4
- package/src/setup-and-skills-commands.ts +160 -8
- package/src/skill-installer.ts +315 -0
- package/vendor/skills/orizu/SKILL.md +3 -3
- package/vendor/skills/orizu/flows/first-win.md +3 -1
- package/vendor/skills/orizu/flows/promote.md +2 -1
- package/vendor/skills/orizu/references/building-apps.md +2 -0
- package/vendor/skills/orizu/references/building-judges.md +138 -8
- package/vendor/skills/orizu/references/cli-reference.md +1 -1
- package/vendor/skills/orizu/references/optimization-with-gepa.md +21 -3
- package/vendor/skills/orizu/references/primer.md +2 -2
- package/vendor/skills/orizu/scripts/test-app.mjs +53 -4
package/dist/app-commands.d.ts
CHANGED
|
@@ -24,6 +24,8 @@ declare function previewAppFromFile(): Promise<void>;
|
|
|
24
24
|
declare function updateAppFromFile(): Promise<void>;
|
|
25
25
|
declare function linkAppDataset(): Promise<void>;
|
|
26
26
|
declare function appDetail(): Promise<void>;
|
|
27
|
+
/** `--out` may be a file path or a directory; a directory gets the default file name. */
|
|
28
|
+
export declare function resolveAppExportPath(outPathArg: string | null | undefined, defaultFilename: string): string;
|
|
27
29
|
declare function exportAppSource(): Promise<void>;
|
|
28
30
|
export { readSourceFile, readJsonFile, readManifestFile, readPromptPrimaryText, readPromptSidecars, stringFromRecord, isRecord, safeRelativePath, writeTextFileEnsuringDir, sha256Hex, readSourceBytes, listApps, createAppFromFile, previewAppFromFile, updateAppFromFile, linkAppDataset, appDetail, exportAppSource, };
|
|
29
31
|
//# sourceMappingURL=app-commands.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-commands.d.ts","sourceRoot":"","sources":["../src/app-commands.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app-commands.d.ts","sourceRoot":"","sources":["../src/app-commands.ts"],"names":[],"mappings":"AAiCA,iBAAe,QAAQ,kBAQtB;AAED,iBAAS,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAU/C;AAED,iBAAS,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUhD;AAED,iBAAS,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAY9D;AAED,iBAAS,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAElE;AAED,iBAAS,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG1F;AAED,iBAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUjE;AAED,iBAAS,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAEjD;AAED,iBAAS,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG;IACpF,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb,CAeA;AAED,iBAAS,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM;;;;;IAoB/E;AAED,iBAAS,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QAGjE;AAED,iBAAS,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEjE;AAED,iBAAe,iBAAiB,kBAiD/B;AAED,iBAAe,kBAAkB,kBAiDhC;AAED,iBAAe,iBAAiB,kBA+C/B;AAED,iBAAe,cAAc,kBAgD5B;AA+CD,iBAAe,SAAS,kBA2CvB;AAED,yFAAyF;AACzF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAK3G;AAED,iBAAe,eAAe,kBAmD7B;AAED,OAAO,EACL,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,EAChB,wBAAwB,EACxB,SAAS,EACT,eAAe,EACf,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,eAAe,GAChB,CAAA"}
|
package/dist/app-commands.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ORI-2044: moved from index.ts to keep app commands together.
|
|
2
|
-
import { readFileSync, mkdirSync, writeFileSync, realpathSync, } from 'fs';
|
|
2
|
+
import { readFileSync, statSync, mkdirSync, writeFileSync, realpathSync, } from 'fs';
|
|
3
3
|
import { normalize, isAbsolute, join, dirname, } from 'path';
|
|
4
4
|
import { createHash } from 'crypto';
|
|
5
5
|
import { getArg, getArchiveListStatus, hasJsonFlag, expandHomePath, hasArg, } from './command-line-arguments.js';
|
|
@@ -330,6 +330,14 @@ async function appDetail() {
|
|
|
330
330
|
printLine(` Created: ${sanitizeTerminalText(detail.createdAt)}`);
|
|
331
331
|
printLine(` Updated: ${sanitizeTerminalText(detail.updatedAt)}`);
|
|
332
332
|
}
|
|
333
|
+
/** `--out` may be a file path or a directory; a directory gets the default file name. */
|
|
334
|
+
export function resolveAppExportPath(outPathArg, defaultFilename) {
|
|
335
|
+
if (!outPathArg)
|
|
336
|
+
return defaultFilename;
|
|
337
|
+
const expanded = expandHomePath(outPathArg);
|
|
338
|
+
const isDirectory = /[\\/]$/.test(outPathArg) || statSync(expanded, { throwIfNoEntry: false })?.isDirectory() === true;
|
|
339
|
+
return isDirectory ? join(expanded, defaultFilename) : expanded;
|
|
340
|
+
}
|
|
333
341
|
async function exportAppSource() {
|
|
334
342
|
const project = getArg('--project');
|
|
335
343
|
const versionArg = getArg('--version');
|
|
@@ -358,9 +366,7 @@ async function exportAppSource() {
|
|
|
358
366
|
throw new Error(`Failed to export app (${response.status}): ${await response.text()}`);
|
|
359
367
|
}
|
|
360
368
|
const data = await parseJsonResponse(response, 'App export');
|
|
361
|
-
const filename = outPathArg
|
|
362
|
-
? expandHomePath(outPathArg)
|
|
363
|
-
: defaultAppExportFilename(data.app.name, data.version.versionNum);
|
|
369
|
+
const filename = resolveAppExportPath(outPathArg, defaultAppExportFilename(data.app.name, data.version.versionNum));
|
|
364
370
|
writeTextFileEnsuringDir(filename, data.version.code);
|
|
365
371
|
if (hasJsonFlag()) {
|
|
366
372
|
printJson({
|
package/dist/help.js
CHANGED
|
@@ -280,13 +280,13 @@ export const COMMAND_DOCS = [
|
|
|
280
280
|
options: [
|
|
281
281
|
{ name: '--team <slug>', help: 'Choose an existing accessible team.' },
|
|
282
282
|
{ name: '--create-team <name>', help: 'Create and select a new team; mutually exclusive with --team.' },
|
|
283
|
-
{ name: '--project <slug>', help: 'Choose the project to
|
|
284
|
-
{ name: '--create-project <name>', help: 'Create and select a project in the chosen team; mutually exclusive with --project.' },
|
|
283
|
+
{ name: '--project <slug>', help: 'Choose the project to work in. Only that project is set up in the workspace, and the team-project checklist is skipped, interactive or not.' },
|
|
284
|
+
{ name: '--create-project <name>', help: 'Create and select a project in the chosen team, and set up only that project (no checklist); mutually exclusive with --project.' },
|
|
285
285
|
{ name: '--workspace [path]', help: 'Initialize or validate a workspace path, or the current directory when no path is provided. If provided, the value must be a filesystem path.' },
|
|
286
286
|
{ name: '--service-origin <url>', help: 'Service origin written to setup metadata. Defaults to the active CLI server.' },
|
|
287
287
|
{ name: '--attach-workspace <id>', help: 'Record an existing Orizu workspace id for future attachment.' },
|
|
288
288
|
{ name: '--validate', help: 'Inspect the workspace contract without writing files.' },
|
|
289
|
-
{ name: '--fix', help: 'Apply safe idempotent repairs only.' },
|
|
289
|
+
{ name: '--fix', help: 'Apply safe idempotent repairs only, restoring every team project.' },
|
|
290
290
|
{ name: '--no-symlinks', help: 'Write CLAUDE.md as a pointer file instead of a symlink to AGENTS.md.' },
|
|
291
291
|
{ name: '--verbose', help: 'Show per-file setup actions. Default setup output is summary-oriented.' },
|
|
292
292
|
{ name: '--agent <agent>', help: 'Non-interactive opt-in to install the shared global Orizu skill plus any applicable native target. Repeat for multiple agents.', repeatable: true, choices: ['claude', 'codex', 'pi', 'devin', 'droid', 'grok', 'windsurf', 'opencode'] },
|
|
@@ -748,8 +748,8 @@ export const COMMAND_DOCS = [
|
|
|
748
748
|
},
|
|
749
749
|
{
|
|
750
750
|
path: ['apps', 'export'],
|
|
751
|
-
usage: 'orizu apps export [--app <appId>] [--project <team/project>] [--version <n>] [--out <
|
|
752
|
-
summary: 'Export app source for the selected app version.',
|
|
751
|
+
usage: 'orizu apps export [--app <appId>] [--project <team/project>] [--version <n>] [--out <file-or-directory>]',
|
|
752
|
+
summary: 'Export app source for the selected app version. --out is a file path, or a directory (the file is named <app>.v<version>.tsx inside it).',
|
|
753
753
|
group: 'Apps',
|
|
754
754
|
},
|
|
755
755
|
{
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The system prompt for the hosted agent (ORI-2207).
|
|
3
|
+
*
|
|
4
|
+
* OpenCode (the program that runs the agent in a hosted session) ships its own
|
|
5
|
+
* built-in prompt that starts "You are opencode, an interactive CLI tool…", so
|
|
6
|
+
* the agent used to introduce itself as OpenCode. We register our own "primary
|
|
7
|
+
* agent" in the OpenCode config with this text, and every prompt request picks
|
|
8
|
+
* it by name. That replaces OpenCode's built-in prompt entirely, so this text
|
|
9
|
+
* carries the working rules we still want: use the tools, keep answers short.
|
|
10
|
+
* AGENTS.md is still added after it, as before.
|
|
11
|
+
*/
|
|
12
|
+
export declare const HOSTED_AGENT_NAME = "orizu";
|
|
13
|
+
export declare const HOSTED_AGENT_PROMPT = "You are the Orizu agent. You work in the person's repository inside an Orizu workbench, helping them with software engineering tasks. If asked who or what you are, say you are the Orizu agent. Never call yourself OpenCode.\n\n- Do the work with your tools: read files, search, edit, and run commands. Do not guess at what a file contains when you can look.\n- Keep answers short and plain. Say what you did and what the person needs to know next.\n- Follow the repository's own conventions and any instructions in its AGENTS.md.";
|
|
14
|
+
//# sourceMappingURL=hosted-agent-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-agent-prompt.d.ts","sourceRoot":"","sources":["../src/hosted-agent-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,UAAU,CAAA;AAExC,eAAO,MAAM,mBAAmB,qhBAIiD,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The system prompt for the hosted agent (ORI-2207).
|
|
3
|
+
*
|
|
4
|
+
* OpenCode (the program that runs the agent in a hosted session) ships its own
|
|
5
|
+
* built-in prompt that starts "You are opencode, an interactive CLI tool…", so
|
|
6
|
+
* the agent used to introduce itself as OpenCode. We register our own "primary
|
|
7
|
+
* agent" in the OpenCode config with this text, and every prompt request picks
|
|
8
|
+
* it by name. That replaces OpenCode's built-in prompt entirely, so this text
|
|
9
|
+
* carries the working rules we still want: use the tools, keep answers short.
|
|
10
|
+
* AGENTS.md is still added after it, as before.
|
|
11
|
+
*/
|
|
12
|
+
export const HOSTED_AGENT_NAME = 'orizu';
|
|
13
|
+
export const HOSTED_AGENT_PROMPT = `You are the Orizu agent. You work in the person's repository inside an Orizu workbench, helping them with software engineering tasks. If asked who or what you are, say you are the Orizu agent. Never call yourself OpenCode.
|
|
14
|
+
|
|
15
|
+
- Do the work with your tools: read files, search, edit, and run commands. Do not guess at what a file contains when you can look.
|
|
16
|
+
- Keep answers short and plain. Say what you did and what the person needs to know next.
|
|
17
|
+
- Follow the repository's own conventions and any instructions in its AGENTS.md.`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-harness-opencode.d.ts","sourceRoot":"","sources":["../src/hosted-harness-opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;
|
|
1
|
+
{"version":3,"file":"hosted-harness-opencode.d.ts","sourceRoot":"","sources":["../src/hosted-harness-opencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
* would break both ports and must be re-verified.
|
|
50
50
|
*/
|
|
51
51
|
import { readFileSync } from 'fs';
|
|
52
|
+
import { HOSTED_AGENT_NAME, HOSTED_AGENT_PROMPT } from './hosted-agent-prompt.js';
|
|
52
53
|
import { findProvider, parseModelIdentity } from './provider-registry.js';
|
|
53
54
|
import { HARNESS_NAMES } from './hosted-harness.js';
|
|
54
55
|
// OpenCode is HARD-PINNED to this version everywhere it is installed/launched.
|
|
@@ -150,6 +151,7 @@ export function buildPromptRequestBody(content, model, opencodeMessageId, reason
|
|
|
150
151
|
const body = {
|
|
151
152
|
parts: [{ type: 'text', text: content }],
|
|
152
153
|
messageID: opencodeMessageId,
|
|
154
|
+
agent: HOSTED_AGENT_NAME,
|
|
153
155
|
};
|
|
154
156
|
if (!model)
|
|
155
157
|
return body;
|
|
@@ -991,6 +993,8 @@ export function buildOpenCodeConfigContent(opts) {
|
|
|
991
993
|
return JSON.stringify({
|
|
992
994
|
model: opts.model,
|
|
993
995
|
permission: opts.permission ?? defaultHeadlessPermission(),
|
|
996
|
+
// Replaces OpenCode's built-in "You are opencode…" prompt (ORI-2207).
|
|
997
|
+
agent: { [HOSTED_AGENT_NAME]: { mode: 'primary', prompt: HOSTED_AGENT_PROMPT } },
|
|
994
998
|
});
|
|
995
999
|
}
|
|
996
1000
|
const OPENCODE_READY_TIMEOUT_MS = 180_000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-loop.d.ts","sourceRoot":"","sources":["../src/hosted-loop.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"hosted-loop.d.ts","sourceRoot":"","sources":["../src/hosted-loop.ts"],"names":[],"mappings":"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"}
|
package/dist/hosted-loop.js
CHANGED
|
@@ -691,7 +691,10 @@ export async function runHostedLoop(opts) {
|
|
|
691
691
|
await sleep(delayMs);
|
|
692
692
|
try {
|
|
693
693
|
await sink.finish(error.intendedStatus, error.finishOptions);
|
|
694
|
-
|
|
694
|
+
// A timer flush may have met the server's 404/410 during the sleep,
|
|
695
|
+
// making finish() a no-op: honour the server, as the drain does.
|
|
696
|
+
const status = sink.terminatedServerSide ? 'cancelled' : error.intendedStatus;
|
|
697
|
+
return { status, agentSessionId, installOk, error: null };
|
|
695
698
|
}
|
|
696
699
|
catch (retryError) {
|
|
697
700
|
// The run went terminal server-side while we were retrying: accept
|
|
@@ -705,8 +708,10 @@ export async function runHostedLoop(opts) {
|
|
|
705
708
|
}
|
|
706
709
|
if (sink.sealed) {
|
|
707
710
|
// A concurrent/preceding delivery landed after all — the record is
|
|
708
|
-
// terminal server-side with our intended status semantics preserved
|
|
709
|
-
|
|
711
|
+
// terminal server-side with our intended status semantics preserved —
|
|
712
|
+
// unless a timer flush met the server's 404/410 instead.
|
|
713
|
+
const status = sink.terminatedServerSide ? 'cancelled' : error.intendedStatus;
|
|
714
|
+
return { status, agentSessionId, installOk, error: null };
|
|
710
715
|
}
|
|
711
716
|
return {
|
|
712
717
|
status: error.intendedStatus,
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The check the session coordinator makes on `/opt/orizu/prebaked.json`, the
|
|
3
|
+
* first bootstrap command of a hosted optimization run. It lives here so the
|
|
4
|
+
* release bake's start check (hosted-runtime-image/check-snapshot-starts.mjs)
|
|
5
|
+
* rejects a snapshot on exactly the rules the coordinator would refuse it on.
|
|
6
|
+
* Worker code imports this module, so it must not use Node APIs.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isHostedOptimizationPrebakedMarker(raw: string): boolean;
|
|
9
|
+
//# sourceMappingURL=hosted-optimization-prebaked-marker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-optimization-prebaked-marker.d.ts","sourceRoot":"","sources":["../src/hosted-optimization-prebaked-marker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYvE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The check the session coordinator makes on `/opt/orizu/prebaked.json`, the
|
|
3
|
+
* first bootstrap command of a hosted optimization run. It lives here so the
|
|
4
|
+
* release bake's start check (hosted-runtime-image/check-snapshot-starts.mjs)
|
|
5
|
+
* rejects a snapshot on exactly the rules the coordinator would refuse it on.
|
|
6
|
+
* Worker code imports this module, so it must not use Node APIs.
|
|
7
|
+
*/
|
|
8
|
+
export function isHostedOptimizationPrebakedMarker(raw) {
|
|
9
|
+
try {
|
|
10
|
+
const marker = JSON.parse(raw);
|
|
11
|
+
if (!marker || typeof marker !== 'object' || Array.isArray(marker))
|
|
12
|
+
return false;
|
|
13
|
+
const value = marker;
|
|
14
|
+
return value.builtFor === 'vercel-sandbox' &&
|
|
15
|
+
typeof value.cliVersion === 'string' && value.cliVersion.length > 0 &&
|
|
16
|
+
typeof value.opencodeVersion === 'string' && value.opencodeVersion.length > 0 &&
|
|
17
|
+
typeof value.claudeSdkVersion === 'string' && value.claudeSdkVersion.length > 0;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -66,12 +66,15 @@ export interface RunEventSink {
|
|
|
66
66
|
* Terminal kinds are rejected (they must go through `finish`). */
|
|
67
67
|
append(event: HarnessEvent): Promise<void>;
|
|
68
68
|
/** Force-flush any coalesced token snapshots (also runs on every structural
|
|
69
|
-
* event
|
|
69
|
+
* event, on `finish`, and every `tokenFlushMs` while new tokens arrive). */
|
|
70
70
|
flushTokens(): Promise<void>;
|
|
71
71
|
/** Terminal transition via PATCH; records the transcript tail first, then CAS. */
|
|
72
72
|
finish(status: TerminalStatus, opts?: FinishOptions): Promise<void>;
|
|
73
73
|
/** True once a terminal transition has landed and the sink is sealed. */
|
|
74
74
|
readonly sealed: boolean;
|
|
75
|
+
/** True when an append met 404/410, i.e. the server ended the run, not this
|
|
76
|
+
* writer's PATCH. A timer flush can learn this with no caller awaiting it. */
|
|
77
|
+
readonly terminatedServerSide: boolean;
|
|
75
78
|
/** The next sequence the sink will attempt to allocate (test/resume aid). */
|
|
76
79
|
readonly nextSequence: number;
|
|
77
80
|
/** Events the sink has confirmed appended, in order (redacted payloads). */
|
|
@@ -163,7 +166,13 @@ export interface CreateRunEventSinkOptions {
|
|
|
163
166
|
sleepImpl?: (ms: number) => Promise<void>;
|
|
164
167
|
/** Local diagnostic sink for disagreement-rule logs (never throws). */
|
|
165
168
|
onDiagnostic?: (message: string) => void;
|
|
169
|
+
/** How often buffered token snapshots are flushed while a reply is being
|
|
170
|
+
* written (ORI-2340). Default TOKEN_FLUSH_MS. */
|
|
171
|
+
tokenFlushMs?: number;
|
|
166
172
|
}
|
|
173
|
+
/** A text-only reply reaches the browser as growing snapshots at this cadence
|
|
174
|
+
* instead of whole at the end of the turn (ORI-2340). */
|
|
175
|
+
export declare const TOKEN_FLUSH_MS = 250;
|
|
167
176
|
export declare function createRunEventSink(options: CreateRunEventSinkOptions): RunEventSink;
|
|
168
177
|
export interface ResumeRunEventSinkOptions extends Omit<CreateRunEventSinkOptions, 'startSequence'> {
|
|
169
178
|
/** Page size for the cursor tail while discovering the latest sequence. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-run-event-sink.d.ts","sourceRoot":"","sources":["../src/hosted-run-event-sink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAIzE,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAUhF,eAAO,MAAM,yBAAyB,mBAAmB,CAAA;AACzD,eAAO,MAAM,yBAAyB,mBAAmB,CAAA;AAiCzD;oFACoF;AACpF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAEtE;AAED,eAAO,MAAM,sBAAsB,gBAAgB,CAAA;AACnD,eAAO,MAAM,2BAA2B,qBAAqB,CAAA;AAC7D,gFAAgF;AAChF,eAAO,MAAM,yBAAyB,QAAS,CAAA;AAY/C,eAAO,MAAM,6BAA6B,uBAAuB,CAAA;AACjE,eAAO,MAAM,iCAAiC,2BAA2B,CAAA;AAEzE,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAA;AAEjE,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC;8EAC0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B;uEACmE;IACnE,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C;
|
|
1
|
+
{"version":3,"file":"hosted-run-event-sink.d.ts","sourceRoot":"","sources":["../src/hosted-run-event-sink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAIzE,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAUhF,eAAO,MAAM,yBAAyB,mBAAmB,CAAA;AACzD,eAAO,MAAM,yBAAyB,mBAAmB,CAAA;AAiCzD;oFACoF;AACpF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAEtE;AAED,eAAO,MAAM,sBAAsB,gBAAgB,CAAA;AACnD,eAAO,MAAM,2BAA2B,qBAAqB,CAAA;AAC7D,gFAAgF;AAChF,eAAO,MAAM,yBAAyB,QAAS,CAAA;AAY/C,eAAO,MAAM,6BAA6B,uBAAuB,CAAA;AACjE,eAAO,MAAM,iCAAiC,2BAA2B,CAAA;AAEzE,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAA;AAEjE,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC;8EAC0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B;uEACmE;IACnE,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C;iFAC6E;IAC7E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,kFAAkF;IAClF,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnE,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB;mFAC+E;IAC/E,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAA;IACtC,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAC/C;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED,mFAAmF;AACnF,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED;+EAC+E;AAC/E,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;GASG;AACH,qBAAa,qBAAsB,SAAQ,qBAAqB;IAC9D,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;IACvC,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,CAAA;gBACrC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,CAAC,EAAE,aAAa;CAM3F;AAED;;;;;;;GAOG;AACH,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAQD,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAA;IAC/B,SAAS,CAAC,EAAE,WAAW,CAAA;IACvB;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;iFAC6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,0EAA0E;IAC1E,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,uEAAuE;IACvE,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC;sDACkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;0DAC0D;AAC1D,eAAO,MAAM,cAAc,MAAM,CAAA;AAkBjC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,YAAY,CA6XnF;AAID,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,yBAAyB,EAAE,eAAe,CAAC;IACjG,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,YAAY,CAAC,CAyBvB;AAID,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAA;CACxD;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,EACnC,IAAI,EAAE,YAAY,EAClB,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,cAAc,CAAC,CAyFzB"}
|
|
@@ -156,6 +156,9 @@ const TERMINAL_STATUSES = new Set(['succeeded', 'failed', 'cancelled']);
|
|
|
156
156
|
function isTerminalStatus(status) {
|
|
157
157
|
return status !== null && TERMINAL_STATUSES.has(status);
|
|
158
158
|
}
|
|
159
|
+
/** A text-only reply reaches the browser as growing snapshots at this cadence
|
|
160
|
+
* instead of whole at the end of the turn (ORI-2340). */
|
|
161
|
+
export const TOKEN_FLUSH_MS = 250; // held equal to SESSION_TIMERS.agentTokenFlushMs by test
|
|
159
162
|
const DEFAULT_MAX_CRITICAL_ATTEMPTS = 4;
|
|
160
163
|
// Non-critical appends get a SMALL bounded retry so a single transient blip
|
|
161
164
|
// (network reset / 5xx) does not drop the event — but on exhaustion they are
|
|
@@ -209,6 +212,53 @@ export function createRunEventSink(options) {
|
|
|
209
212
|
const tokenBuffer = new Map();
|
|
210
213
|
let nextSequence = options.startSequence ?? 1;
|
|
211
214
|
let sealed = false;
|
|
215
|
+
let terminatedServerSide = false;
|
|
216
|
+
// One promise chain for every buffer-touching operation: append, flushTokens,
|
|
217
|
+
// finish and the timer flush below. This is how the timer honours the
|
|
218
|
+
// reentrancy contract on flushTokens — it queues behind an in-flight append
|
|
219
|
+
// or flush instead of running beside it. A rejected step reaches its own
|
|
220
|
+
// caller and never breaks the chain.
|
|
221
|
+
let queue = Promise.resolve();
|
|
222
|
+
function serialize(fn) {
|
|
223
|
+
const run = queue.then(fn);
|
|
224
|
+
queue = run.catch(() => { });
|
|
225
|
+
return run;
|
|
226
|
+
}
|
|
227
|
+
// ORI-2340 timer flush: started by the first token, unref'd so it never keeps
|
|
228
|
+
// the process alive, stopped for good once the sink seals or the bearer is
|
|
229
|
+
// refused. `tokensDirty` keeps a quiet tick (or a dropped snapshot with no
|
|
230
|
+
// newer text) from posting again.
|
|
231
|
+
let flushTimer = null;
|
|
232
|
+
let flushTimerStopped = false;
|
|
233
|
+
let tokensDirty = false;
|
|
234
|
+
let timerFlushQueued = false;
|
|
235
|
+
function stopFlushTimer() {
|
|
236
|
+
flushTimerStopped = true;
|
|
237
|
+
if (flushTimer)
|
|
238
|
+
clearInterval(flushTimer);
|
|
239
|
+
flushTimer = null;
|
|
240
|
+
}
|
|
241
|
+
function onFlushTick() {
|
|
242
|
+
if (sealed)
|
|
243
|
+
return stopFlushTimer();
|
|
244
|
+
if (!tokensDirty || timerFlushQueued)
|
|
245
|
+
return;
|
|
246
|
+
timerFlushQueued = true;
|
|
247
|
+
serialize(async () => {
|
|
248
|
+
timerFlushQueued = false;
|
|
249
|
+
// Queued behind finish(), the sink may have sealed since the tick fired.
|
|
250
|
+
if (sealed)
|
|
251
|
+
return;
|
|
252
|
+
tokensDirty = false;
|
|
253
|
+
await flushTokens();
|
|
254
|
+
}).catch(error => {
|
|
255
|
+
// A refused bearer would be refused again every tick; the loop learns of
|
|
256
|
+
// it at its next structural event or finish.
|
|
257
|
+
if (error instanceof RunAuthError)
|
|
258
|
+
stopFlushTimer();
|
|
259
|
+
diag(`timer token flush failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
260
|
+
});
|
|
261
|
+
}
|
|
212
262
|
function assertWritable() {
|
|
213
263
|
if (sealed) {
|
|
214
264
|
throw new RunTerminalError('run is terminal server-side — refusing to append (Orizu records win)');
|
|
@@ -280,6 +330,7 @@ export function createRunEventSink(options) {
|
|
|
280
330
|
// Run gone/terminal server-side: seal and stop (Orizu records win).
|
|
281
331
|
if (response.status === 404 || response.status === 410) {
|
|
282
332
|
sealed = true;
|
|
333
|
+
terminatedServerSide = true;
|
|
283
334
|
diag(`append rejected (${response.status}) for ${eventType} — sealing sink (run terminal)`);
|
|
284
335
|
throw new RunTerminalError(`append rejected (${response.status}) — run is terminal server-side`);
|
|
285
336
|
}
|
|
@@ -321,10 +372,10 @@ export function createRunEventSink(options) {
|
|
|
321
372
|
// REENTRANCY CONTRACT: flushTokens MUST run to completion before the next
|
|
322
373
|
// append()/flushTokens() begins — it is NOT safe to run concurrently with a
|
|
323
374
|
// token append. Coalescing correctness (and the `===` re-check below) relies on
|
|
324
|
-
//
|
|
325
|
-
//
|
|
326
|
-
//
|
|
327
|
-
//
|
|
375
|
+
// every append/flush running strictly sequentially, so no newer delta can
|
|
376
|
+
// mutate `tokenBuffer` mid-flush. The public methods and the ORI-2340 timer
|
|
377
|
+
// flush all go through `serialize` to keep that true; any new caller of this
|
|
378
|
+
// inner function MUST too, or the drop-preserving guarantee breaks.
|
|
328
379
|
async function flushTokens() {
|
|
329
380
|
if (tokenBuffer.size === 0)
|
|
330
381
|
return;
|
|
@@ -354,6 +405,11 @@ export function createRunEventSink(options) {
|
|
|
354
405
|
const messageId = event.messageId ?? '_';
|
|
355
406
|
const text = typeof event.payload.text === 'string' ? event.payload.text : '';
|
|
356
407
|
tokenBuffer.set(messageId, text);
|
|
408
|
+
tokensDirty = true;
|
|
409
|
+
if (!flushTimer && !flushTimerStopped) {
|
|
410
|
+
flushTimer = setInterval(onFlushTick, options.tokenFlushMs ?? TOKEN_FLUSH_MS);
|
|
411
|
+
flushTimer.unref?.();
|
|
412
|
+
}
|
|
357
413
|
return;
|
|
358
414
|
}
|
|
359
415
|
const eventType = eventTypeForKind(event.kind);
|
|
@@ -470,12 +526,15 @@ export function createRunEventSink(options) {
|
|
|
470
526
|
}
|
|
471
527
|
}
|
|
472
528
|
return {
|
|
473
|
-
append,
|
|
474
|
-
flushTokens,
|
|
475
|
-
finish,
|
|
529
|
+
append: event => serialize(() => append(event)),
|
|
530
|
+
flushTokens: () => serialize(flushTokens),
|
|
531
|
+
finish: (status, opts) => serialize(() => finish(status, opts)),
|
|
476
532
|
get sealed() {
|
|
477
533
|
return sealed;
|
|
478
534
|
},
|
|
535
|
+
get terminatedServerSide() {
|
|
536
|
+
return terminatedServerSide;
|
|
537
|
+
},
|
|
479
538
|
get nextSequence() {
|
|
480
539
|
return nextSequence;
|
|
481
540
|
},
|
|
@@ -583,7 +642,9 @@ export async function drainHarnessToSink(events, sink, opts = {}) {
|
|
|
583
642
|
: finishOpts;
|
|
584
643
|
try {
|
|
585
644
|
await sink.finish(status, mergedFinishOpts);
|
|
586
|
-
|
|
645
|
+
// A timer flush queued ahead of finish() can meet the server's 404/410
|
|
646
|
+
// after the check above; finish() then no-ops, so honour the server.
|
|
647
|
+
return sink.terminatedServerSide ? 'cancelled' : status;
|
|
587
648
|
}
|
|
588
649
|
catch (error) {
|
|
589
650
|
if (error instanceof RunTerminalError)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-report-input.d.ts","sourceRoot":"","sources":["../src/markdown-report-input.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,yBAAyB,QAAkB,CAAA;AAsCxD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,WAAW,EAAE,cAAc,GAAG,QAAQ,GAAG,MAAM,GAC9C,mBAAmB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"markdown-report-input.d.ts","sourceRoot":"","sources":["../src/markdown-report-input.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,yBAAyB,QAAkB,CAAA;AAsCxD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,WAAW,EAAE,cAAc,GAAG,QAAQ,GAAG,MAAM,GAC9C,mBAAmB,GAAG,IAAI,CAgD5B"}
|
|
@@ -72,7 +72,7 @@ export function readMarkdownReportInput(args, reportLabel) {
|
|
|
72
72
|
sourceName = 'inline';
|
|
73
73
|
}
|
|
74
74
|
if (!hasCanonicalReportMarkdownContent(markdown)) {
|
|
75
|
-
throw new Error(`${reportLabel} report
|
|
75
|
+
throw new Error(`${reportLabel} report has no visible content: it is empty or contains only whitespace`);
|
|
76
76
|
}
|
|
77
77
|
if (Buffer.byteLength(markdown, 'utf8') > MARKDOWN_REPORT_MAX_BYTES) {
|
|
78
78
|
throw new Error(`${reportLabel} report exceeds ${MARKDOWN_REPORT_MAX_BYTES} bytes`);
|
|
@@ -47,6 +47,13 @@ interface PreviewPage {
|
|
|
47
47
|
on?: (event: string, listener: () => void) => unknown;
|
|
48
48
|
off?: (event: string, listener: () => void) => unknown;
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Removes line and block comments, walking left to right so a `//` or `/*`
|
|
52
|
+
* inside a quoted string or template literal is left alone. A block comment
|
|
53
|
+
* keeps its newlines, so line numbers in later messages stay true.
|
|
54
|
+
* Regex literals are not tracked; a quote inside one can hide a comment.
|
|
55
|
+
*/
|
|
56
|
+
export declare function stripComments(code: string): string;
|
|
50
57
|
export declare function validatePreviewInputs(options: AppPreviewOptions): Issue[];
|
|
51
58
|
export declare function runLocalAppPreview(options: AppPreviewOptions): Promise<AppPreviewResult>;
|
|
52
59
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview-runtime.d.ts","sourceRoot":"","sources":["../src/preview-runtime.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"preview-runtime.d.ts","sourceRoot":"","sources":["../src/preview-runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/preview-runtime.js
CHANGED
|
@@ -57,9 +57,56 @@ function isNodeError(error) {
|
|
|
57
57
|
return error instanceof Error;
|
|
58
58
|
}
|
|
59
59
|
const SUPPORTED_SCHEMA_KEYS = new Set(['type', 'required', 'properties', 'items', 'enum']);
|
|
60
|
+
/**
|
|
61
|
+
* Removes line and block comments, walking left to right so a `//` or `/*`
|
|
62
|
+
* inside a quoted string or template literal is left alone. A block comment
|
|
63
|
+
* keeps its newlines, so line numbers in later messages stay true.
|
|
64
|
+
* Regex literals are not tracked; a quote inside one can hide a comment.
|
|
65
|
+
*/
|
|
66
|
+
export function stripComments(code) {
|
|
67
|
+
let out = '';
|
|
68
|
+
let quote = '';
|
|
69
|
+
let i = 0;
|
|
70
|
+
while (i < code.length) {
|
|
71
|
+
const char = code[i];
|
|
72
|
+
const next = code[i + 1];
|
|
73
|
+
if (quote) {
|
|
74
|
+
out += char;
|
|
75
|
+
if (char === '\\' && next !== undefined) {
|
|
76
|
+
out += next;
|
|
77
|
+
i += 2;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
// Single and double quoted strings end at the line's end; templates may span lines.
|
|
81
|
+
if (char === quote || (char === '\n' && quote !== '`'))
|
|
82
|
+
quote = '';
|
|
83
|
+
i++;
|
|
84
|
+
}
|
|
85
|
+
else if (char === '"' || char === "'" || char === '`') {
|
|
86
|
+
quote = char;
|
|
87
|
+
out += char;
|
|
88
|
+
i++;
|
|
89
|
+
}
|
|
90
|
+
else if (char === '/' && next === '/' && code[i - 1] !== ':') {
|
|
91
|
+
while (i < code.length && code[i] !== '\n')
|
|
92
|
+
i++;
|
|
93
|
+
}
|
|
94
|
+
else if (char === '/' && next === '*') {
|
|
95
|
+
const close = code.indexOf('*/', i + 2);
|
|
96
|
+
const end = close === -1 ? code.length : close + 2;
|
|
97
|
+
out += code.slice(i, end).replace(/[^\n]/g, ' ');
|
|
98
|
+
i = end;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
out += char;
|
|
102
|
+
i++;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
60
107
|
export function validatePreviewInputs(options) {
|
|
61
108
|
const issues = [];
|
|
62
|
-
const source = readFileSync(options.filePath, 'utf8');
|
|
109
|
+
const source = stripComments(readFileSync(options.filePath, 'utf8'));
|
|
63
110
|
validateImports(source, issues);
|
|
64
111
|
validateDefaultExport(source, options.componentName, issues);
|
|
65
112
|
validateSchema(options.inputSchema, 'input schema', issues);
|
|
@@ -296,10 +343,7 @@ function resolveDefaultExport(source) {
|
|
|
296
343
|
return null;
|
|
297
344
|
}
|
|
298
345
|
function unwrapDefaultExportExpression(expression) {
|
|
299
|
-
const trimmed = expression
|
|
300
|
-
.replace(/\/\*[\s\S]*?\*\/\s*$/, '')
|
|
301
|
-
.replace(/\/\/.*$/, '')
|
|
302
|
-
.trim();
|
|
346
|
+
const trimmed = expression.trim();
|
|
303
347
|
if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(trimmed)) {
|
|
304
348
|
return trimmed;
|
|
305
349
|
}
|
|
@@ -13,11 +13,11 @@ export const RESERVED_CREDENTIAL_ENVS = new Set([
|
|
|
13
13
|
'GEMINI_API_KEY', // Historical SQL reservation; removing local forwarding does not release this name.
|
|
14
14
|
'GOOGLE_API_KEY', // Historical SQL reservation for the Google alias, independent of run providers.
|
|
15
15
|
'ALI_1505_ENDPOINT_OVERRIDE_API_KEY', // hosted-optimization.ts: runner-injected secret.
|
|
16
|
-
'BRAINTRUST_API_KEY', //
|
|
16
|
+
'BRAINTRUST_API_KEY', // lib/hosted-connectors.ts: workbench connector.
|
|
17
17
|
'CF_API_KEY', // test/with-cloudflare-env.test.ts: Cloudflare spelling.
|
|
18
18
|
'CLOUDFLARE_API_KEY', // test/with-cloudflare-env.test.ts: Cloudflare spelling.
|
|
19
19
|
'DAYTONA_API_KEY', // scripts/daytona-workbench-slice.mjs: hosted sandbox.
|
|
20
|
-
'INTERNAL_API_KEY', //
|
|
20
|
+
'INTERNAL_API_KEY', // Historical SQL reservation; the internal compile route is gone (ORI-2305).
|
|
21
21
|
'LINEAR_API_KEY', // lib/services/linear-feedback.ts: issue service.
|
|
22
22
|
'RESEND_API_KEY', // lib/services/email.ts: email delivery.
|
|
23
23
|
]);
|
|
@@ -1,2 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matches any content character. `\uXXXX` names each code point, so
|
|
3
|
+
* JavaScript (with the `u` flag) and PostgreSQL's `~` read it identically and
|
|
4
|
+
* no locale is involved.
|
|
5
|
+
*/
|
|
6
|
+
export declare const REPORT_MARKDOWN_CONTENT_PATTERN: string;
|
|
1
7
|
export declare function hasCanonicalReportMarkdownContent(markdown: string): boolean;
|
|
2
8
|
//# sourceMappingURL=report-markdown-blankness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-markdown-blankness.d.ts","sourceRoot":"","sources":["../src/report-markdown-blankness.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"report-markdown-blankness.d.ts","sourceRoot":"","sources":["../src/report-markdown-blankness.ts"],"names":[],"mappings":"AA+CA;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,QAE/B,CAAA;AAIb,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE3E"}
|