@agimon-ai/po-runner 0.0.0-alpha.1 → 0.0.0-alpha.3
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/ansiScrub.mjs +1 -2
- package/dist/apiContracts.cjs +1 -1
- package/dist/apiContracts.cjs.map +1 -1
- package/dist/apiContracts.mjs +1 -1
- package/dist/apiContracts.mjs.map +1 -1
- package/dist/bashRunService.mjs +1 -2
- package/dist/bashSchema.mjs +1 -2
- package/dist/bin/logSink.cjs +24 -13
- package/dist/bin/logSink.cjs.map +1 -1
- package/dist/bin/logSink.d.mts.map +1 -1
- package/dist/bin/logSink.mjs +24 -13
- package/dist/bin/logSink.mjs.map +1 -1
- package/dist/cliApp.mjs +1 -2
- package/dist/clock.mjs +1 -2
- package/dist/compaction.mjs +1 -2
- package/dist/config.mjs +1 -2
- package/dist/extensions/native.mjs +939 -0
- package/dist/extensions/native.mjs.map +1 -0
- package/dist/extensions/server.cjs +98 -16
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.mjs +98 -16
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/extensions/web.mjs +21 -7
- package/dist/extensions/web.mjs.map +1 -1
- package/dist/launcher.mjs +1 -2
- package/dist/logFile.mjs +1 -2
- package/dist/logReader.mjs +1 -2
- package/dist/processControl.mjs +1 -2
- package/dist/ptyHost.mjs +1 -2
- package/dist/ptySpawner.mjs +1 -2
- package/dist/reconcile.d.mts +1 -0
- package/dist/reconcile.mjs +1 -2
- package/dist/rmuxBackend.mjs +1 -2
- package/dist/runnerDependencies.mjs +1 -2
- package/dist/runnerNamer.mjs +1 -2
- package/dist/runnerPaths.mjs +1 -2
- package/dist/runnerRegistry.mjs +1 -2
- package/dist/spawner.mjs +1 -2
- package/package.json +51 -23
package/dist/ansiScrub.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { collapseCarriageReturns, scrubTerminalOutput, scrubTerminalOutputToPlainText, stripAnsi, stripAnsiKeepingColour };
|
|
1
|
+
export { t as collapseCarriageReturns, n as scrubTerminalOutput, r as scrubTerminalOutputToPlainText, i as stripAnsi, a as stripAnsiKeepingColour } from "./ansiScrub-CsqTSaVT.mjs";
|
package/dist/apiContracts.cjs
CHANGED
|
@@ -147,7 +147,7 @@ const apiContracts = (0, _agimon_ai_po_core_apiContracts.defineApiContract)({
|
|
|
147
147
|
sockets: ["global", "workspace"].map((scope) => ({
|
|
148
148
|
id: "runner.channel",
|
|
149
149
|
scope,
|
|
150
|
-
service: "po.hub
|
|
150
|
+
service: "po.hub",
|
|
151
151
|
member: "runner_runs",
|
|
152
152
|
kind: "channel",
|
|
153
153
|
direction: "server-to-client",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.cjs","names":["Type","defineApiContract","jsonApiResponses"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/po-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst N = Type.Number();\nconst B = Type.Boolean();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nconst Run = Type.Object({\n id: S,\n name: S,\n pid: N,\n command: S,\n cwd: S,\n interactive: B,\n backend: literals(['rmux', 'tmux', 'native']),\n state: literals(['running', 'completed']),\n promoted: B,\n startedAt: S,\n logPath: S,\n exit: O(\n Type.Object({\n reason: literals(['completed', 'failed', 'signaled', 'stopped', 'timed_out', 'launcher_error', 'backend_lost']),\n code: Type.Union([N, Type.Null()]),\n signal: Type.Union([S, Type.Null()]),\n terminationReason: O(\n literals([\n 'timeout',\n 'user_stop',\n 'request_cancelled',\n 'parent_session_cleanup',\n 'owner_lost',\n 'external_signal',\n ]),\n ),\n stopReason: O(S),\n finishedAt: S,\n }),\n ),\n});\nexport const RunnerPayloadSchema = Type.Object({ runs: Type.Array(Run) });\nexport const RunnerLogSchema = Type.Object({\n runId: S,\n running: B,\n text: S,\n lineCount: N,\n totalLines: N,\n fileSize: N,\n completeBytes: N,\n path: S,\n exists: B,\n lineNumbers: O(Type.Array(N)),\n});\nexport const RunnerAppendSchema = Type.Object({ lines: Type.Array(S), offset: O(N), ended: O(B) });\nexport const RunnerScreenSchema = Type.Object({ chunk: S, offset: O(N), ended: O(B) });\nexport const apiContracts = defineApiContract({\n version: 1,\n dynamic: [],\n http: [\n {\n id: 'runner.log',\n scope: 'session',\n basePath: 'runner',\n path: '/runners/{runId}/log',\n method: 'GET',\n authentication: 'owner',\n description: 'Read a runner log tail or literal substring search.',\n parameters: ['lines', 'grep', 'ignoreCase', 'contextLines'].map((name) => ({\n name,\n in: 'query',\n required: false,\n schema: S,\n })),\n responses: jsonApiResponses(RunnerLogSchema),\n },\n ...(['log', 'screen'] as const).map((kind) => ({\n id: `runner.${kind}.stream`,\n scope: 'session' as const,\n basePath: 'runner',\n path: `/runners/{runId}/${kind}/stream`,\n method: 'GET' as const,\n authentication: 'owner' as const,\n description: `Follow runner ${kind}. SSE data is JSON; ping events carry empty data.`,\n parameters: [{ name: 'from', in: 'query' as const, required: false, schema: N }],\n responses: {\n '200': {\n description: 'Event stream.',\n contentType: 'text/event-stream',\n schema: S,\n events: {\n [kind === 'log' ? 'append' : 'screen']: kind === 'log' ? RunnerAppendSchema : RunnerScreenSchema,\n ping: Type.Literal(''),\n },\n },\n '404': { description: 'Runner unavailable.', schema: Type.Object({ error: S }) },\n },\n })),\n {\n id: 'runner.input',\n scope: 'session',\n basePath: 'runner',\n path: '/runners/{runId}/screen/input',\n method: 'POST',\n authentication: 'owner',\n description: 'Send text to an interactive runner.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ text: Type.String({ minLength: 1 }) }),\n },\n responses: jsonApiResponses(Type.Object({ delivered: Type.Literal(true) })),\n },\n ],\n sockets: (['global', 'workspace'] as const).map((scope) => ({\n id: 'runner.channel',\n scope,\n service: 'po.hub
|
|
1
|
+
{"version":3,"file":"apiContracts.cjs","names":["Type","defineApiContract","jsonApiResponses"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/po-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst N = Type.Number();\nconst B = Type.Boolean();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nconst Run = Type.Object({\n id: S,\n name: S,\n pid: N,\n command: S,\n cwd: S,\n interactive: B,\n backend: literals(['rmux', 'tmux', 'native']),\n state: literals(['running', 'completed']),\n promoted: B,\n startedAt: S,\n logPath: S,\n exit: O(\n Type.Object({\n reason: literals(['completed', 'failed', 'signaled', 'stopped', 'timed_out', 'launcher_error', 'backend_lost']),\n code: Type.Union([N, Type.Null()]),\n signal: Type.Union([S, Type.Null()]),\n terminationReason: O(\n literals([\n 'timeout',\n 'user_stop',\n 'request_cancelled',\n 'parent_session_cleanup',\n 'owner_lost',\n 'external_signal',\n ]),\n ),\n stopReason: O(S),\n finishedAt: S,\n }),\n ),\n});\nexport const RunnerPayloadSchema = Type.Object({ runs: Type.Array(Run) });\nexport const RunnerLogSchema = Type.Object({\n runId: S,\n running: B,\n text: S,\n lineCount: N,\n totalLines: N,\n fileSize: N,\n completeBytes: N,\n path: S,\n exists: B,\n lineNumbers: O(Type.Array(N)),\n});\nexport const RunnerAppendSchema = Type.Object({ lines: Type.Array(S), offset: O(N), ended: O(B) });\nexport const RunnerScreenSchema = Type.Object({ chunk: S, offset: O(N), ended: O(B) });\nexport const apiContracts = defineApiContract({\n version: 1,\n dynamic: [],\n http: [\n {\n id: 'runner.log',\n scope: 'session',\n basePath: 'runner',\n path: '/runners/{runId}/log',\n method: 'GET',\n authentication: 'owner',\n description: 'Read a runner log tail or literal substring search.',\n parameters: ['lines', 'grep', 'ignoreCase', 'contextLines'].map((name) => ({\n name,\n in: 'query',\n required: false,\n schema: S,\n })),\n responses: jsonApiResponses(RunnerLogSchema),\n },\n ...(['log', 'screen'] as const).map((kind) => ({\n id: `runner.${kind}.stream`,\n scope: 'session' as const,\n basePath: 'runner',\n path: `/runners/{runId}/${kind}/stream`,\n method: 'GET' as const,\n authentication: 'owner' as const,\n description: `Follow runner ${kind}. SSE data is JSON; ping events carry empty data.`,\n parameters: [{ name: 'from', in: 'query' as const, required: false, schema: N }],\n responses: {\n '200': {\n description: 'Event stream.',\n contentType: 'text/event-stream',\n schema: S,\n events: {\n [kind === 'log' ? 'append' : 'screen']: kind === 'log' ? RunnerAppendSchema : RunnerScreenSchema,\n ping: Type.Literal(''),\n },\n },\n '404': { description: 'Runner unavailable.', schema: Type.Object({ error: S }) },\n },\n })),\n {\n id: 'runner.input',\n scope: 'session',\n basePath: 'runner',\n path: '/runners/{runId}/screen/input',\n method: 'POST',\n authentication: 'owner',\n description: 'Send text to an interactive runner.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ text: Type.String({ minLength: 1 }) }),\n },\n responses: jsonApiResponses(Type.Object({ delivered: Type.Literal(true) })),\n },\n ],\n sockets: (['global', 'workspace'] as const).map((scope) => ({\n id: 'runner.channel',\n scope,\n service: 'po.hub',\n member: 'runner_runs',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Runner channel payload in the hub frame payload property.',\n input: RunnerPayloadSchema,\n })),\n});\nexport default apiContracts;\n"],"mappings":"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"}
|
package/dist/apiContracts.mjs
CHANGED
|
@@ -143,7 +143,7 @@ const apiContracts = defineApiContract({
|
|
|
143
143
|
sockets: ["global", "workspace"].map((scope) => ({
|
|
144
144
|
id: "runner.channel",
|
|
145
145
|
scope,
|
|
146
|
-
service: "po.hub
|
|
146
|
+
service: "po.hub",
|
|
147
147
|
member: "runner_runs",
|
|
148
148
|
kind: "channel",
|
|
149
149
|
direction: "server-to-client",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/po-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst N = Type.Number();\nconst B = Type.Boolean();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nconst Run = Type.Object({\n id: S,\n name: S,\n pid: N,\n command: S,\n cwd: S,\n interactive: B,\n backend: literals(['rmux', 'tmux', 'native']),\n state: literals(['running', 'completed']),\n promoted: B,\n startedAt: S,\n logPath: S,\n exit: O(\n Type.Object({\n reason: literals(['completed', 'failed', 'signaled', 'stopped', 'timed_out', 'launcher_error', 'backend_lost']),\n code: Type.Union([N, Type.Null()]),\n signal: Type.Union([S, Type.Null()]),\n terminationReason: O(\n literals([\n 'timeout',\n 'user_stop',\n 'request_cancelled',\n 'parent_session_cleanup',\n 'owner_lost',\n 'external_signal',\n ]),\n ),\n stopReason: O(S),\n finishedAt: S,\n }),\n ),\n});\nexport const RunnerPayloadSchema = Type.Object({ runs: Type.Array(Run) });\nexport const RunnerLogSchema = Type.Object({\n runId: S,\n running: B,\n text: S,\n lineCount: N,\n totalLines: N,\n fileSize: N,\n completeBytes: N,\n path: S,\n exists: B,\n lineNumbers: O(Type.Array(N)),\n});\nexport const RunnerAppendSchema = Type.Object({ lines: Type.Array(S), offset: O(N), ended: O(B) });\nexport const RunnerScreenSchema = Type.Object({ chunk: S, offset: O(N), ended: O(B) });\nexport const apiContracts = defineApiContract({\n version: 1,\n dynamic: [],\n http: [\n {\n id: 'runner.log',\n scope: 'session',\n basePath: 'runner',\n path: '/runners/{runId}/log',\n method: 'GET',\n authentication: 'owner',\n description: 'Read a runner log tail or literal substring search.',\n parameters: ['lines', 'grep', 'ignoreCase', 'contextLines'].map((name) => ({\n name,\n in: 'query',\n required: false,\n schema: S,\n })),\n responses: jsonApiResponses(RunnerLogSchema),\n },\n ...(['log', 'screen'] as const).map((kind) => ({\n id: `runner.${kind}.stream`,\n scope: 'session' as const,\n basePath: 'runner',\n path: `/runners/{runId}/${kind}/stream`,\n method: 'GET' as const,\n authentication: 'owner' as const,\n description: `Follow runner ${kind}. SSE data is JSON; ping events carry empty data.`,\n parameters: [{ name: 'from', in: 'query' as const, required: false, schema: N }],\n responses: {\n '200': {\n description: 'Event stream.',\n contentType: 'text/event-stream',\n schema: S,\n events: {\n [kind === 'log' ? 'append' : 'screen']: kind === 'log' ? RunnerAppendSchema : RunnerScreenSchema,\n ping: Type.Literal(''),\n },\n },\n '404': { description: 'Runner unavailable.', schema: Type.Object({ error: S }) },\n },\n })),\n {\n id: 'runner.input',\n scope: 'session',\n basePath: 'runner',\n path: '/runners/{runId}/screen/input',\n method: 'POST',\n authentication: 'owner',\n description: 'Send text to an interactive runner.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ text: Type.String({ minLength: 1 }) }),\n },\n responses: jsonApiResponses(Type.Object({ delivered: Type.Literal(true) })),\n },\n ],\n sockets: (['global', 'workspace'] as const).map((scope) => ({\n id: 'runner.channel',\n scope,\n service: 'po.hub
|
|
1
|
+
{"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/po-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst N = Type.Number();\nconst B = Type.Boolean();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nconst Run = Type.Object({\n id: S,\n name: S,\n pid: N,\n command: S,\n cwd: S,\n interactive: B,\n backend: literals(['rmux', 'tmux', 'native']),\n state: literals(['running', 'completed']),\n promoted: B,\n startedAt: S,\n logPath: S,\n exit: O(\n Type.Object({\n reason: literals(['completed', 'failed', 'signaled', 'stopped', 'timed_out', 'launcher_error', 'backend_lost']),\n code: Type.Union([N, Type.Null()]),\n signal: Type.Union([S, Type.Null()]),\n terminationReason: O(\n literals([\n 'timeout',\n 'user_stop',\n 'request_cancelled',\n 'parent_session_cleanup',\n 'owner_lost',\n 'external_signal',\n ]),\n ),\n stopReason: O(S),\n finishedAt: S,\n }),\n ),\n});\nexport const RunnerPayloadSchema = Type.Object({ runs: Type.Array(Run) });\nexport const RunnerLogSchema = Type.Object({\n runId: S,\n running: B,\n text: S,\n lineCount: N,\n totalLines: N,\n fileSize: N,\n completeBytes: N,\n path: S,\n exists: B,\n lineNumbers: O(Type.Array(N)),\n});\nexport const RunnerAppendSchema = Type.Object({ lines: Type.Array(S), offset: O(N), ended: O(B) });\nexport const RunnerScreenSchema = Type.Object({ chunk: S, offset: O(N), ended: O(B) });\nexport const apiContracts = defineApiContract({\n version: 1,\n dynamic: [],\n http: [\n {\n id: 'runner.log',\n scope: 'session',\n basePath: 'runner',\n path: '/runners/{runId}/log',\n method: 'GET',\n authentication: 'owner',\n description: 'Read a runner log tail or literal substring search.',\n parameters: ['lines', 'grep', 'ignoreCase', 'contextLines'].map((name) => ({\n name,\n in: 'query',\n required: false,\n schema: S,\n })),\n responses: jsonApiResponses(RunnerLogSchema),\n },\n ...(['log', 'screen'] as const).map((kind) => ({\n id: `runner.${kind}.stream`,\n scope: 'session' as const,\n basePath: 'runner',\n path: `/runners/{runId}/${kind}/stream`,\n method: 'GET' as const,\n authentication: 'owner' as const,\n description: `Follow runner ${kind}. SSE data is JSON; ping events carry empty data.`,\n parameters: [{ name: 'from', in: 'query' as const, required: false, schema: N }],\n responses: {\n '200': {\n description: 'Event stream.',\n contentType: 'text/event-stream',\n schema: S,\n events: {\n [kind === 'log' ? 'append' : 'screen']: kind === 'log' ? RunnerAppendSchema : RunnerScreenSchema,\n ping: Type.Literal(''),\n },\n },\n '404': { description: 'Runner unavailable.', schema: Type.Object({ error: S }) },\n },\n })),\n {\n id: 'runner.input',\n scope: 'session',\n basePath: 'runner',\n path: '/runners/{runId}/screen/input',\n method: 'POST',\n authentication: 'owner',\n description: 'Send text to an interactive runner.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ text: Type.String({ minLength: 1 }) }),\n },\n responses: jsonApiResponses(Type.Object({ delivered: Type.Literal(true) })),\n },\n ],\n sockets: (['global', 'workspace'] as const).map((scope) => ({\n id: 'runner.channel',\n scope,\n service: 'po.hub',\n member: 'runner_runs',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Runner channel payload in the hub frame payload property.',\n input: RunnerPayloadSchema,\n })),\n});\nexport default apiContracts;\n"],"mappings":"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"}
|
package/dist/bashRunService.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { BashRunService };
|
|
1
|
+
export { t as BashRunService } from "./bashRunService-CJ02XaAq.mjs";
|
package/dist/bashSchema.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { BASH_TOOL_LABEL, BASH_TOOL_NAME, BashParamsSchema };
|
|
1
|
+
export { t as BASH_TOOL_LABEL, n as BASH_TOOL_NAME, r as BashParamsSchema } from "./bashTool-C-k7fmyh.mjs";
|
package/dist/bin/logSink.cjs
CHANGED
|
@@ -3,6 +3,7 @@ const require_rolldown_runtime = require("../rolldown-runtime-VH7oDXx4.cjs");
|
|
|
3
3
|
const require_ansiScrub = require("../ansiScrub-D5gpHDch.cjs");
|
|
4
4
|
let node_fs = require("node:fs");
|
|
5
5
|
node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
|
|
6
|
+
let node_string_decoder = require("node:string_decoder");
|
|
6
7
|
let node_url = require("node:url");
|
|
7
8
|
let _agimon_ai_po_telemetry = require("@agimon-ai/po-telemetry");
|
|
8
9
|
//#region src/bin/logSink.ts
|
|
@@ -35,16 +36,18 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
35
36
|
}
|
|
36
37
|
let chunks = 0;
|
|
37
38
|
const rawCeiling = Number.parseInt(maxBytesRaw, 10);
|
|
38
|
-
|
|
39
|
-
let rawWritten =
|
|
39
|
+
let raw = rawPath === void 0 || rawPath === "" ? void 0 : openRaw(rawPath);
|
|
40
|
+
let rawWritten = 0;
|
|
41
|
+
const decoder = new node_string_decoder.StringDecoder("utf8");
|
|
40
42
|
try {
|
|
41
|
-
process.stdin.setEncoding("utf8");
|
|
42
43
|
for await (const chunk of process.stdin) {
|
|
43
|
-
const
|
|
44
|
+
const rawBytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));
|
|
45
|
+
const source = decoder.write(rawBytes);
|
|
44
46
|
if (raw !== void 0) {
|
|
45
|
-
const rawBytes = Buffer.from(source, "utf8");
|
|
46
47
|
if (rawWritten + rawBytes.byteLength > rawCeiling) {
|
|
47
|
-
|
|
48
|
+
const previous = raw;
|
|
49
|
+
raw = openRaw(rawPath);
|
|
50
|
+
node_fs.default.closeSync(previous);
|
|
48
51
|
rawWritten = 0;
|
|
49
52
|
}
|
|
50
53
|
node_fs.default.writeSync(raw, rawBytes);
|
|
@@ -57,6 +60,12 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
57
60
|
written += bytes.byteLength;
|
|
58
61
|
chunks += 1;
|
|
59
62
|
}
|
|
63
|
+
const remaining = require_ansiScrub.scrubTerminalOutput(decoder.end());
|
|
64
|
+
if (remaining) {
|
|
65
|
+
const bytes = Buffer.from(remaining);
|
|
66
|
+
node_fs.default.writeSync(handle, bytes);
|
|
67
|
+
written += bytes.byteLength;
|
|
68
|
+
}
|
|
60
69
|
node_fs.default.closeSync(handle);
|
|
61
70
|
if (raw !== void 0) node_fs.default.closeSync(raw);
|
|
62
71
|
writeDone(donePath);
|
|
@@ -74,15 +83,17 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
74
83
|
await telemetry.shutdown();
|
|
75
84
|
}
|
|
76
85
|
}
|
|
77
|
-
/**
|
|
86
|
+
/** Publish a fresh inode so readers can identify rollover from the descriptor they read. */
|
|
78
87
|
function openRaw(target) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
function rawSize(target) {
|
|
88
|
+
const temporary = `${target}.${process.pid}.tmp`;
|
|
89
|
+
const descriptor = node_fs.default.openSync(temporary, "wx", 384);
|
|
82
90
|
try {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
91
|
+
node_fs.default.renameSync(temporary, target);
|
|
92
|
+
return descriptor;
|
|
93
|
+
} catch (error) {
|
|
94
|
+
node_fs.default.closeSync(descriptor);
|
|
95
|
+
node_fs.default.unlinkSync(temporary);
|
|
96
|
+
throw error;
|
|
86
97
|
}
|
|
87
98
|
}
|
|
88
99
|
function writeDone(target) {
|
package/dist/bin/logSink.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logSink.cjs","names":["createDoomTelemetry","fs","scrubTerminalOutput","pathToFileURL"],"sources":["../../src/bin/logSink.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { pathToFileURL } from 'node:url';\n\nimport { createDoomTelemetry } from '@agimon-ai/po-telemetry';\n\nimport { scrubTerminalOutput } from '../services/ansiScrub';\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-log-sink',\n packageName: '@agimon-ai/po-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const [logPath, rotatedPath, maxBytesRaw, donePath, rawPath] = argv;\n try {\n // Keep the legacy argument shape for the published executable subpath. The\n // scrubbed log is append-only, so the former rotation path is unused; the\n // ceiling now bounds the raw copy, which only interactive runs ask for.\n if (!logPath || !rotatedPath || !maxBytesRaw || !donePath) {\n throw new Error('logSink requires log, rotated log, max bytes, and completion paths');\n }\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n\n let handle: number;\n let written: number;\n try {\n handle = fs.openSync(logPath, 'a');\n written = fs.statSync(logPath).size;\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n let chunks = 0;\n // The pane's bytes before anything is taken out of them. Scrubbing exists so\n // the log stays worth grepping, and it is exactly what makes the log useless\n // to a terminal, so an attached view needs its own faithful copy.\n const rawCeiling = Number.parseInt(maxBytesRaw, 10);\n
|
|
1
|
+
{"version":3,"file":"logSink.cjs","names":["createDoomTelemetry","fs","StringDecoder","scrubTerminalOutput","pathToFileURL"],"sources":["../../src/bin/logSink.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { StringDecoder } from 'node:string_decoder';\nimport { pathToFileURL } from 'node:url';\n\nimport { createDoomTelemetry } from '@agimon-ai/po-telemetry';\n\nimport { scrubTerminalOutput } from '../services/ansiScrub';\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-log-sink',\n packageName: '@agimon-ai/po-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const [logPath, rotatedPath, maxBytesRaw, donePath, rawPath] = argv;\n try {\n // Keep the legacy argument shape for the published executable subpath. The\n // scrubbed log is append-only, so the former rotation path is unused; the\n // ceiling now bounds the raw copy, which only interactive runs ask for.\n if (!logPath || !rotatedPath || !maxBytesRaw || !donePath) {\n throw new Error('logSink requires log, rotated log, max bytes, and completion paths');\n }\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n\n let handle: number;\n let written: number;\n try {\n handle = fs.openSync(logPath, 'a');\n written = fs.statSync(logPath).size;\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n let chunks = 0;\n // The pane's bytes before anything is taken out of them. Scrubbing exists so\n // the log stays worth grepping, and it is exactly what makes the log useless\n // to a terminal, so an attached view needs its own faithful copy.\n const rawCeiling = Number.parseInt(maxBytesRaw, 10);\n let raw = rawPath === undefined || rawPath === '' ? undefined : openRaw(rawPath);\n let rawWritten = 0;\n const decoder = new StringDecoder('utf8');\n try {\n for await (const chunk of process.stdin) {\n const rawBytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n const source = decoder.write(rawBytes);\n if (raw !== undefined) {\n // A terminal that scrolls all day must not fill the disk. Past the\n // ceiling the copy starts over: a reader attaching later wants the\n // recent screen, and no part of this is the record of the run.\n if (rawWritten + rawBytes.byteLength > rawCeiling) {\n const previous = raw;\n raw = openRaw(rawPath as string);\n fs.closeSync(previous);\n rawWritten = 0;\n }\n fs.writeSync(raw, rawBytes);\n rawWritten += rawBytes.byteLength;\n }\n const text = scrubTerminalOutput(source);\n if (!text) continue;\n const bytes = Buffer.from(text, 'utf8');\n fs.writeSync(handle, bytes);\n written += bytes.byteLength;\n chunks += 1;\n }\n const remaining = scrubTerminalOutput(decoder.end());\n if (remaining) {\n const bytes = Buffer.from(remaining);\n fs.writeSync(handle, bytes);\n written += bytes.byteLength;\n }\n fs.closeSync(handle);\n if (raw !== undefined) fs.closeSync(raw);\n writeDone(donePath);\n await telemetry.recordEvent('doom_runner.file_sink_finished', {\n outcome: 'completed',\n 'runner.chunk_count': chunks,\n 'runner.bytes_written': written,\n duration_ms: Date.now() - startedAt,\n });\n return 0;\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n throw error;\n } finally {\n await telemetry.shutdown();\n }\n}\n\n/** Publish a fresh inode so readers can identify rollover from the descriptor they read. */\nfunction openRaw(target: string): number {\n const temporary = `${target}.${process.pid}.tmp`;\n const descriptor = fs.openSync(temporary, 'wx', 0o600);\n try {\n fs.renameSync(temporary, target);\n return descriptor;\n } catch (error) {\n fs.closeSync(descriptor);\n fs.unlinkSync(temporary);\n throw error;\n }\n}\n\nfunction writeDone(target: string): void {\n const temporary = `${target}.${process.pid}.tmp`;\n fs.writeFileSync(temporary, '', { mode: 0o600 });\n fs.renameSync(temporary, target);\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logSink.d.mts","names":[],"sources":["../../src/bin/logSink.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"logSink.d.mts","names":[],"sources":["../../src/bin/logSink.ts"],"mappings":";wBAQsB,KAAK,2BAAkD"}
|
package/dist/bin/logSink.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { n as scrubTerminalOutput } from "../ansiScrub-CsqTSaVT.mjs";
|
|
2
2
|
import fs from "node:fs";
|
|
3
|
+
import { StringDecoder } from "node:string_decoder";
|
|
3
4
|
import { pathToFileURL } from "node:url";
|
|
4
5
|
import { createDoomTelemetry } from "@agimon-ai/po-telemetry";
|
|
5
6
|
//#region src/bin/logSink.ts
|
|
@@ -32,16 +33,18 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
32
33
|
}
|
|
33
34
|
let chunks = 0;
|
|
34
35
|
const rawCeiling = Number.parseInt(maxBytesRaw, 10);
|
|
35
|
-
|
|
36
|
-
let rawWritten =
|
|
36
|
+
let raw = rawPath === void 0 || rawPath === "" ? void 0 : openRaw(rawPath);
|
|
37
|
+
let rawWritten = 0;
|
|
38
|
+
const decoder = new StringDecoder("utf8");
|
|
37
39
|
try {
|
|
38
|
-
process.stdin.setEncoding("utf8");
|
|
39
40
|
for await (const chunk of process.stdin) {
|
|
40
|
-
const
|
|
41
|
+
const rawBytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));
|
|
42
|
+
const source = decoder.write(rawBytes);
|
|
41
43
|
if (raw !== void 0) {
|
|
42
|
-
const rawBytes = Buffer.from(source, "utf8");
|
|
43
44
|
if (rawWritten + rawBytes.byteLength > rawCeiling) {
|
|
44
|
-
|
|
45
|
+
const previous = raw;
|
|
46
|
+
raw = openRaw(rawPath);
|
|
47
|
+
fs.closeSync(previous);
|
|
45
48
|
rawWritten = 0;
|
|
46
49
|
}
|
|
47
50
|
fs.writeSync(raw, rawBytes);
|
|
@@ -54,6 +57,12 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
54
57
|
written += bytes.byteLength;
|
|
55
58
|
chunks += 1;
|
|
56
59
|
}
|
|
60
|
+
const remaining = scrubTerminalOutput(decoder.end());
|
|
61
|
+
if (remaining) {
|
|
62
|
+
const bytes = Buffer.from(remaining);
|
|
63
|
+
fs.writeSync(handle, bytes);
|
|
64
|
+
written += bytes.byteLength;
|
|
65
|
+
}
|
|
57
66
|
fs.closeSync(handle);
|
|
58
67
|
if (raw !== void 0) fs.closeSync(raw);
|
|
59
68
|
writeDone(donePath);
|
|
@@ -71,15 +80,17 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
71
80
|
await telemetry.shutdown();
|
|
72
81
|
}
|
|
73
82
|
}
|
|
74
|
-
/**
|
|
83
|
+
/** Publish a fresh inode so readers can identify rollover from the descriptor they read. */
|
|
75
84
|
function openRaw(target) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
function rawSize(target) {
|
|
85
|
+
const temporary = `${target}.${process.pid}.tmp`;
|
|
86
|
+
const descriptor = fs.openSync(temporary, "wx", 384);
|
|
79
87
|
try {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
88
|
+
fs.renameSync(temporary, target);
|
|
89
|
+
return descriptor;
|
|
90
|
+
} catch (error) {
|
|
91
|
+
fs.closeSync(descriptor);
|
|
92
|
+
fs.unlinkSync(temporary);
|
|
93
|
+
throw error;
|
|
83
94
|
}
|
|
84
95
|
}
|
|
85
96
|
function writeDone(target) {
|
package/dist/bin/logSink.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logSink.mjs","names":[],"sources":["../../src/bin/logSink.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { pathToFileURL } from 'node:url';\n\nimport { createDoomTelemetry } from '@agimon-ai/po-telemetry';\n\nimport { scrubTerminalOutput } from '../services/ansiScrub';\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-log-sink',\n packageName: '@agimon-ai/po-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const [logPath, rotatedPath, maxBytesRaw, donePath, rawPath] = argv;\n try {\n // Keep the legacy argument shape for the published executable subpath. The\n // scrubbed log is append-only, so the former rotation path is unused; the\n // ceiling now bounds the raw copy, which only interactive runs ask for.\n if (!logPath || !rotatedPath || !maxBytesRaw || !donePath) {\n throw new Error('logSink requires log, rotated log, max bytes, and completion paths');\n }\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n\n let handle: number;\n let written: number;\n try {\n handle = fs.openSync(logPath, 'a');\n written = fs.statSync(logPath).size;\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n let chunks = 0;\n // The pane's bytes before anything is taken out of them. Scrubbing exists so\n // the log stays worth grepping, and it is exactly what makes the log useless\n // to a terminal, so an attached view needs its own faithful copy.\n const rawCeiling = Number.parseInt(maxBytesRaw, 10);\n
|
|
1
|
+
{"version":3,"file":"logSink.mjs","names":[],"sources":["../../src/bin/logSink.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { StringDecoder } from 'node:string_decoder';\nimport { pathToFileURL } from 'node:url';\n\nimport { createDoomTelemetry } from '@agimon-ai/po-telemetry';\n\nimport { scrubTerminalOutput } from '../services/ansiScrub';\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-log-sink',\n packageName: '@agimon-ai/po-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const [logPath, rotatedPath, maxBytesRaw, donePath, rawPath] = argv;\n try {\n // Keep the legacy argument shape for the published executable subpath. The\n // scrubbed log is append-only, so the former rotation path is unused; the\n // ceiling now bounds the raw copy, which only interactive runs ask for.\n if (!logPath || !rotatedPath || !maxBytesRaw || !donePath) {\n throw new Error('logSink requires log, rotated log, max bytes, and completion paths');\n }\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n\n let handle: number;\n let written: number;\n try {\n handle = fs.openSync(logPath, 'a');\n written = fs.statSync(logPath).size;\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n let chunks = 0;\n // The pane's bytes before anything is taken out of them. Scrubbing exists so\n // the log stays worth grepping, and it is exactly what makes the log useless\n // to a terminal, so an attached view needs its own faithful copy.\n const rawCeiling = Number.parseInt(maxBytesRaw, 10);\n let raw = rawPath === undefined || rawPath === '' ? undefined : openRaw(rawPath);\n let rawWritten = 0;\n const decoder = new StringDecoder('utf8');\n try {\n for await (const chunk of process.stdin) {\n const rawBytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n const source = decoder.write(rawBytes);\n if (raw !== undefined) {\n // A terminal that scrolls all day must not fill the disk. Past the\n // ceiling the copy starts over: a reader attaching later wants the\n // recent screen, and no part of this is the record of the run.\n if (rawWritten + rawBytes.byteLength > rawCeiling) {\n const previous = raw;\n raw = openRaw(rawPath as string);\n fs.closeSync(previous);\n rawWritten = 0;\n }\n fs.writeSync(raw, rawBytes);\n rawWritten += rawBytes.byteLength;\n }\n const text = scrubTerminalOutput(source);\n if (!text) continue;\n const bytes = Buffer.from(text, 'utf8');\n fs.writeSync(handle, bytes);\n written += bytes.byteLength;\n chunks += 1;\n }\n const remaining = scrubTerminalOutput(decoder.end());\n if (remaining) {\n const bytes = Buffer.from(remaining);\n fs.writeSync(handle, bytes);\n written += bytes.byteLength;\n }\n fs.closeSync(handle);\n if (raw !== undefined) fs.closeSync(raw);\n writeDone(donePath);\n await telemetry.recordEvent('doom_runner.file_sink_finished', {\n outcome: 'completed',\n 'runner.chunk_count': chunks,\n 'runner.bytes_written': written,\n duration_ms: Date.now() - startedAt,\n });\n return 0;\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n throw error;\n } finally {\n await telemetry.shutdown();\n }\n}\n\n/** Publish a fresh inode so readers can identify rollover from the descriptor they read. */\nfunction openRaw(target: string): number {\n const temporary = `${target}.${process.pid}.tmp`;\n const descriptor = fs.openSync(temporary, 'wx', 0o600);\n try {\n fs.renameSync(temporary, target);\n return descriptor;\n } catch (error) {\n fs.closeSync(descriptor);\n fs.unlinkSync(temporary);\n throw error;\n }\n}\n\nfunction writeDone(target: string): void {\n const temporary = `${target}.${process.pid}.tmp`;\n fs.writeFileSync(temporary, '', { mode: 0o600 });\n fs.renameSync(temporary, target);\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":"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"}
|
package/dist/cliApp.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { runCli };
|
|
1
|
+
export { t as runCli } from "./cliApp-v8Z3rMCi.mjs";
|
package/dist/clock.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { SystemClock };
|
|
1
|
+
export { t as SystemClock } from "./clock-Cv2pddgo.mjs";
|
package/dist/compaction.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { activeRunnerRecovery, appendActiveRunnersToSummary };
|
|
1
|
+
export { t as activeRunnerRecovery, n as appendActiveRunnersToSummary } from "./compaction-DCw80VZj.mjs";
|
package/dist/config.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { BG_THRESHOLD_MS_ENV, DEFAULT_BG_THRESHOLD_MS, DEFAULT_ERROR_BUDGET_RATIO, DEFAULT_ERROR_MAX_ENTRIES, DEFAULT_ERROR_MAX_VARIANTS_JOINED, DEFAULT_HEAD_RATIO, DEFAULT_LOG_MAX_BYTES, DEFAULT_LOG_TTL_MS, DEFAULT_MAX_COMPLETED_RUNNERS, DEFAULT_RESULT_MAX_BYTES, DEFAULT_RESULT_MAX_LINES, DEFAULT_RESULT_MAX_TOKENS, DEFAULT_SUCCESS_RESULT_MAX_BYTES, DEFAULT_SUCCESS_RESULT_MAX_TOKENS, LOG_DIR_ENV, LOG_MAX_BYTES_ENV, LOG_TTL_MS_ENV, MAX_COMPLETED_RUNNERS_ENV, RESULT_MAX_BYTES_ENV, RESULT_MAX_TOKENS_ENV, SUCCESS_RESULT_MAX_BYTES_ENV, SUCCESS_RESULT_MAX_TOKENS_ENV, getBackgroundThresholdMs, getErrorBudgetRatio, getErrorMaxEntries, getErrorMaxVariantsJoined, getErrorPatterns, getHeadRatio, getLogMaxBytes, getLogTtlMs, getMaxCompletedRunners, getResultMaxBytes, getResultMaxLines, getResultMaxTokens, getRunnerSettings, getSuccessResultMaxBytes, getSuccessResultMaxTokens, noninteractiveEnvironment, setRunnerSettings };
|
|
1
|
+
export { v as BG_THRESHOLD_MS_ENV, y as DEFAULT_BG_THRESHOLD_MS, b as DEFAULT_ERROR_BUDGET_RATIO, x as DEFAULT_ERROR_MAX_ENTRIES, S as DEFAULT_ERROR_MAX_VARIANTS_JOINED, C as DEFAULT_HEAD_RATIO, w as DEFAULT_LOG_MAX_BYTES, T as DEFAULT_LOG_TTL_MS, E as DEFAULT_MAX_COMPLETED_RUNNERS, D as DEFAULT_RESULT_MAX_BYTES, O as DEFAULT_RESULT_MAX_LINES, k as DEFAULT_RESULT_MAX_TOKENS, A as DEFAULT_SUCCESS_RESULT_MAX_BYTES, j as DEFAULT_SUCCESS_RESULT_MAX_TOKENS, M as LOG_DIR_ENV, N as LOG_MAX_BYTES_ENV, P as LOG_TTL_MS_ENV, F as MAX_COMPLETED_RUNNERS_ENV, I as RESULT_MAX_BYTES_ENV, L as RESULT_MAX_TOKENS_ENV, R as SUCCESS_RESULT_MAX_BYTES_ENV, z as SUCCESS_RESULT_MAX_TOKENS_ENV, t as getBackgroundThresholdMs, n as getErrorBudgetRatio, r as getErrorMaxEntries, i as getErrorMaxVariantsJoined, a as getErrorPatterns, o as getHeadRatio, s as getLogMaxBytes, c as getLogTtlMs, l as getMaxCompletedRunners, u as getResultMaxBytes, d as getResultMaxLines, f as getResultMaxTokens, p as getRunnerSettings, m as getSuccessResultMaxBytes, h as getSuccessResultMaxTokens, g as noninteractiveEnvironment, _ as setRunnerSettings } from "./runnerConfig-BQBlVAXn.mjs";
|