@vostride/agent-qa-core 0.2.3 → 0.2.4

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.
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/run-text-output.ts
21
+ var run_text_output_exports = {};
22
+ __export(run_text_output_exports, {
23
+ guardJsonText: () => guardJsonText,
24
+ guardRunText: () => guardRunText,
25
+ isGitHubActions: () => isGitHubActions,
26
+ printRunText: () => printRunText,
27
+ reserveStdoutForData: () => reserveStdoutForData
28
+ });
29
+ module.exports = __toCommonJS(run_text_output_exports);
30
+
31
+ // src/logging/run-text-output.ts
32
+ var import_node_crypto = require("crypto");
33
+ var STDOUT_RESERVATIONS = /* @__PURE__ */ Symbol.for("agent-qa.run-text-output.stdout-reservations");
34
+ function stdoutReservations() {
35
+ const holder = globalThis;
36
+ holder[STDOUT_RESERVATIONS] ??= { count: 0 };
37
+ return holder[STDOUT_RESERVATIONS];
38
+ }
39
+ function isGitHubActions(env = process.env) {
40
+ const value = env.GITHUB_ACTIONS;
41
+ return value !== void 0 && value !== "" && value.toLowerCase() !== "false" && value !== "0";
42
+ }
43
+ function guardRunText(text, env = process.env) {
44
+ if (!isGitHubActions(env)) return text;
45
+ const token = (0, import_node_crypto.randomBytes)(16).toString("hex");
46
+ const block = text.endsWith("\n") ? text : `${text}
47
+ `;
48
+ return `::stop-commands::${token}
49
+ ${block}::${token}::
50
+ `;
51
+ }
52
+ function guardJsonText(serialized, env = process.env) {
53
+ return isGitHubActions(env) ? serialized.replaceAll("#", "\\u0023") : serialized;
54
+ }
55
+ function reserveStdoutForData() {
56
+ const reservations = stdoutReservations();
57
+ reservations.count += 1;
58
+ let released = false;
59
+ return () => {
60
+ if (released) return;
61
+ released = true;
62
+ reservations.count -= 1;
63
+ };
64
+ }
65
+ function printRunText(text, print = (line) => console.log(line), options = {}) {
66
+ const env = options.env ?? process.env;
67
+ if (!isGitHubActions(env)) {
68
+ print(text);
69
+ return;
70
+ }
71
+ const block = guardRunText(text, env);
72
+ if (options.stdoutIsData ?? stdoutReservations().count > 0) {
73
+ process.stderr.write(block);
74
+ return;
75
+ }
76
+ process.stdout.write(block);
77
+ }
78
+ // Annotate the CommonJS export names for ESM import in node:
79
+ 0 && (module.exports = {
80
+ guardJsonText,
81
+ guardRunText,
82
+ isGitHubActions,
83
+ printRunText,
84
+ reserveStdoutForData
85
+ });
86
+ //# sourceMappingURL=run-text-output.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/run-text-output.ts","../src/logging/run-text-output.ts"],"sourcesContent":["export {\n isGitHubActions,\n guardRunText,\n guardJsonText,\n reserveStdoutForData,\n printRunText,\n} from './logging/run-text-output.js'\nexport type { RunTextEnv, PrintRunTextOptions } from './logging/run-text-output.js'\n","import { randomBytes } from 'node:crypto'\n\nexport type RunTextEnv = Readonly<Record<string, string | undefined>>\n\nexport interface PrintRunTextOptions {\n readonly env?: RunTextEnv\n readonly stdoutIsData?: boolean\n}\n\n// The root entry and the subpath entry each bundle a copy of this module, so the count lives on\n// globalThis where a reservation taken through either is seen by both.\nconst STDOUT_RESERVATIONS = Symbol.for('agent-qa.run-text-output.stdout-reservations')\n\ninterface StdoutReservations {\n count: number\n}\n\nfunction stdoutReservations(): StdoutReservations {\n const holder = globalThis as typeof globalThis & { [STDOUT_RESERVATIONS]?: StdoutReservations }\n holder[STDOUT_RESERVATIONS] ??= { count: 0 }\n return holder[STDOUT_RESERVATIONS]\n}\n\nexport function isGitHubActions(env: RunTextEnv = process.env): boolean {\n const value = env.GITHUB_ACTIONS\n return value !== undefined && value !== '' && value.toLowerCase() !== 'false' && value !== '0'\n}\n\nexport function guardRunText(text: string, env: RunTextEnv = process.env): string {\n if (!isGitHubActions(env)) return text\n // Longer than 6 characters, so the runner masks the token in the log.\n const token = randomBytes(16).toString('hex')\n const block = text.endsWith('\\n') ? text : `${text}\\n`\n return `::stop-commands::${token}\\n${block}::${token}::\\n`\n}\n\nexport function guardJsonText(serialized: string, env: RunTextEnv = process.env): string {\n return isGitHubActions(env) ? serialized.replaceAll('#', '\\\\u0023') : serialized\n}\n\n/** Marks this process's stdout as carrying a JSON document or protocol; returns the release. */\nexport function reserveStdoutForData(): () => void {\n const reservations = stdoutReservations()\n reservations.count += 1\n let released = false\n return () => {\n if (released) return\n released = true\n reservations.count -= 1\n }\n}\n\nexport function printRunText(\n text: string,\n print: (text: string) => void = (line) => console.log(line),\n options: PrintRunTextOptions = {},\n): void {\n const env = options.env ?? process.env\n if (!isGitHubActions(env)) {\n print(text)\n return\n }\n const block = guardRunText(text, env)\n // The runner reads stdout and stderr on separate threads, so every wrapped block shares one\n // stream: stdout, or stderr when stdout carries data. The caller's print never sees a block.\n if (options.stdoutIsData ?? stdoutReservations().count > 0) {\n process.stderr.write(block)\n return\n }\n process.stdout.write(block)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,yBAA4B;AAW5B,IAAM,sBAAsB,uBAAO,IAAI,8CAA8C;AAMrF,SAAS,qBAAyC;AAChD,QAAM,SAAS;AACf,SAAO,mBAAmB,MAAM,EAAE,OAAO,EAAE;AAC3C,SAAO,OAAO,mBAAmB;AACnC;AAEO,SAAS,gBAAgB,MAAkB,QAAQ,KAAc;AACtE,QAAM,QAAQ,IAAI;AAClB,SAAO,UAAU,UAAa,UAAU,MAAM,MAAM,YAAY,MAAM,WAAW,UAAU;AAC7F;AAEO,SAAS,aAAa,MAAc,MAAkB,QAAQ,KAAa;AAChF,MAAI,CAAC,gBAAgB,GAAG,EAAG,QAAO;AAElC,QAAM,YAAQ,gCAAY,EAAE,EAAE,SAAS,KAAK;AAC5C,QAAM,QAAQ,KAAK,SAAS,IAAI,IAAI,OAAO,GAAG,IAAI;AAAA;AAClD,SAAO,oBAAoB,KAAK;AAAA,EAAK,KAAK,KAAK,KAAK;AAAA;AACtD;AAEO,SAAS,cAAc,YAAoB,MAAkB,QAAQ,KAAa;AACvF,SAAO,gBAAgB,GAAG,IAAI,WAAW,WAAW,KAAK,SAAS,IAAI;AACxE;AAGO,SAAS,uBAAmC;AACjD,QAAM,eAAe,mBAAmB;AACxC,eAAa,SAAS;AACtB,MAAI,WAAW;AACf,SAAO,MAAM;AACX,QAAI,SAAU;AACd,eAAW;AACX,iBAAa,SAAS;AAAA,EACxB;AACF;AAEO,SAAS,aACd,MACA,QAAgC,CAAC,SAAS,QAAQ,IAAI,IAAI,GAC1D,UAA+B,CAAC,GAC1B;AACN,QAAM,MAAM,QAAQ,OAAO,QAAQ;AACnC,MAAI,CAAC,gBAAgB,GAAG,GAAG;AACzB,UAAM,IAAI;AACV;AAAA,EACF;AACA,QAAM,QAAQ,aAAa,MAAM,GAAG;AAGpC,MAAI,QAAQ,gBAAgB,mBAAmB,EAAE,QAAQ,GAAG;AAC1D,YAAQ,OAAO,MAAM,KAAK;AAC1B;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,KAAK;AAC5B;","names":[]}
@@ -0,0 +1,13 @@
1
+ type RunTextEnv = Readonly<Record<string, string | undefined>>;
2
+ interface PrintRunTextOptions {
3
+ readonly env?: RunTextEnv;
4
+ readonly stdoutIsData?: boolean;
5
+ }
6
+ declare function isGitHubActions(env?: RunTextEnv): boolean;
7
+ declare function guardRunText(text: string, env?: RunTextEnv): string;
8
+ declare function guardJsonText(serialized: string, env?: RunTextEnv): string;
9
+ /** Marks this process's stdout as carrying a JSON document or protocol; returns the release. */
10
+ declare function reserveStdoutForData(): () => void;
11
+ declare function printRunText(text: string, print?: (text: string) => void, options?: PrintRunTextOptions): void;
12
+
13
+ export { type PrintRunTextOptions, type RunTextEnv, guardJsonText, guardRunText, isGitHubActions, printRunText, reserveStdoutForData };
@@ -0,0 +1,13 @@
1
+ type RunTextEnv = Readonly<Record<string, string | undefined>>;
2
+ interface PrintRunTextOptions {
3
+ readonly env?: RunTextEnv;
4
+ readonly stdoutIsData?: boolean;
5
+ }
6
+ declare function isGitHubActions(env?: RunTextEnv): boolean;
7
+ declare function guardRunText(text: string, env?: RunTextEnv): string;
8
+ declare function guardJsonText(serialized: string, env?: RunTextEnv): string;
9
+ /** Marks this process's stdout as carrying a JSON document or protocol; returns the release. */
10
+ declare function reserveStdoutForData(): () => void;
11
+ declare function printRunText(text: string, print?: (text: string) => void, options?: PrintRunTextOptions): void;
12
+
13
+ export { type PrintRunTextOptions, type RunTextEnv, guardJsonText, guardRunText, isGitHubActions, printRunText, reserveStdoutForData };
@@ -0,0 +1,55 @@
1
+ // src/logging/run-text-output.ts
2
+ import { randomBytes } from "crypto";
3
+ var STDOUT_RESERVATIONS = /* @__PURE__ */ Symbol.for("agent-qa.run-text-output.stdout-reservations");
4
+ function stdoutReservations() {
5
+ const holder = globalThis;
6
+ holder[STDOUT_RESERVATIONS] ??= { count: 0 };
7
+ return holder[STDOUT_RESERVATIONS];
8
+ }
9
+ function isGitHubActions(env = process.env) {
10
+ const value = env.GITHUB_ACTIONS;
11
+ return value !== void 0 && value !== "" && value.toLowerCase() !== "false" && value !== "0";
12
+ }
13
+ function guardRunText(text, env = process.env) {
14
+ if (!isGitHubActions(env)) return text;
15
+ const token = randomBytes(16).toString("hex");
16
+ const block = text.endsWith("\n") ? text : `${text}
17
+ `;
18
+ return `::stop-commands::${token}
19
+ ${block}::${token}::
20
+ `;
21
+ }
22
+ function guardJsonText(serialized, env = process.env) {
23
+ return isGitHubActions(env) ? serialized.replaceAll("#", "\\u0023") : serialized;
24
+ }
25
+ function reserveStdoutForData() {
26
+ const reservations = stdoutReservations();
27
+ reservations.count += 1;
28
+ let released = false;
29
+ return () => {
30
+ if (released) return;
31
+ released = true;
32
+ reservations.count -= 1;
33
+ };
34
+ }
35
+ function printRunText(text, print = (line) => console.log(line), options = {}) {
36
+ const env = options.env ?? process.env;
37
+ if (!isGitHubActions(env)) {
38
+ print(text);
39
+ return;
40
+ }
41
+ const block = guardRunText(text, env);
42
+ if (options.stdoutIsData ?? stdoutReservations().count > 0) {
43
+ process.stderr.write(block);
44
+ return;
45
+ }
46
+ process.stdout.write(block);
47
+ }
48
+ export {
49
+ guardJsonText,
50
+ guardRunText,
51
+ isGitHubActions,
52
+ printRunText,
53
+ reserveStdoutForData
54
+ };
55
+ //# sourceMappingURL=run-text-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/logging/run-text-output.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto'\n\nexport type RunTextEnv = Readonly<Record<string, string | undefined>>\n\nexport interface PrintRunTextOptions {\n readonly env?: RunTextEnv\n readonly stdoutIsData?: boolean\n}\n\n// The root entry and the subpath entry each bundle a copy of this module, so the count lives on\n// globalThis where a reservation taken through either is seen by both.\nconst STDOUT_RESERVATIONS = Symbol.for('agent-qa.run-text-output.stdout-reservations')\n\ninterface StdoutReservations {\n count: number\n}\n\nfunction stdoutReservations(): StdoutReservations {\n const holder = globalThis as typeof globalThis & { [STDOUT_RESERVATIONS]?: StdoutReservations }\n holder[STDOUT_RESERVATIONS] ??= { count: 0 }\n return holder[STDOUT_RESERVATIONS]\n}\n\nexport function isGitHubActions(env: RunTextEnv = process.env): boolean {\n const value = env.GITHUB_ACTIONS\n return value !== undefined && value !== '' && value.toLowerCase() !== 'false' && value !== '0'\n}\n\nexport function guardRunText(text: string, env: RunTextEnv = process.env): string {\n if (!isGitHubActions(env)) return text\n // Longer than 6 characters, so the runner masks the token in the log.\n const token = randomBytes(16).toString('hex')\n const block = text.endsWith('\\n') ? text : `${text}\\n`\n return `::stop-commands::${token}\\n${block}::${token}::\\n`\n}\n\nexport function guardJsonText(serialized: string, env: RunTextEnv = process.env): string {\n return isGitHubActions(env) ? serialized.replaceAll('#', '\\\\u0023') : serialized\n}\n\n/** Marks this process's stdout as carrying a JSON document or protocol; returns the release. */\nexport function reserveStdoutForData(): () => void {\n const reservations = stdoutReservations()\n reservations.count += 1\n let released = false\n return () => {\n if (released) return\n released = true\n reservations.count -= 1\n }\n}\n\nexport function printRunText(\n text: string,\n print: (text: string) => void = (line) => console.log(line),\n options: PrintRunTextOptions = {},\n): void {\n const env = options.env ?? process.env\n if (!isGitHubActions(env)) {\n print(text)\n return\n }\n const block = guardRunText(text, env)\n // The runner reads stdout and stderr on separate threads, so every wrapped block shares one\n // stream: stdout, or stderr when stdout carries data. The caller's print never sees a block.\n if (options.stdoutIsData ?? stdoutReservations().count > 0) {\n process.stderr.write(block)\n return\n }\n process.stdout.write(block)\n}\n"],"mappings":";AAAA,SAAS,mBAAmB;AAW5B,IAAM,sBAAsB,uBAAO,IAAI,8CAA8C;AAMrF,SAAS,qBAAyC;AAChD,QAAM,SAAS;AACf,SAAO,mBAAmB,MAAM,EAAE,OAAO,EAAE;AAC3C,SAAO,OAAO,mBAAmB;AACnC;AAEO,SAAS,gBAAgB,MAAkB,QAAQ,KAAc;AACtE,QAAM,QAAQ,IAAI;AAClB,SAAO,UAAU,UAAa,UAAU,MAAM,MAAM,YAAY,MAAM,WAAW,UAAU;AAC7F;AAEO,SAAS,aAAa,MAAc,MAAkB,QAAQ,KAAa;AAChF,MAAI,CAAC,gBAAgB,GAAG,EAAG,QAAO;AAElC,QAAM,QAAQ,YAAY,EAAE,EAAE,SAAS,KAAK;AAC5C,QAAM,QAAQ,KAAK,SAAS,IAAI,IAAI,OAAO,GAAG,IAAI;AAAA;AAClD,SAAO,oBAAoB,KAAK;AAAA,EAAK,KAAK,KAAK,KAAK;AAAA;AACtD;AAEO,SAAS,cAAc,YAAoB,MAAkB,QAAQ,KAAa;AACvF,SAAO,gBAAgB,GAAG,IAAI,WAAW,WAAW,KAAK,SAAS,IAAI;AACxE;AAGO,SAAS,uBAAmC;AACjD,QAAM,eAAe,mBAAmB;AACxC,eAAa,SAAS;AACtB,MAAI,WAAW;AACf,SAAO,MAAM;AACX,QAAI,SAAU;AACd,eAAW;AACX,iBAAa,SAAS;AAAA,EACxB;AACF;AAEO,SAAS,aACd,MACA,QAAgC,CAAC,SAAS,QAAQ,IAAI,IAAI,GAC1D,UAA+B,CAAC,GAC1B;AACN,QAAM,MAAM,QAAQ,OAAO,QAAQ;AACnC,MAAI,CAAC,gBAAgB,GAAG,GAAG;AACzB,UAAM,IAAI;AACV;AAAA,EACF;AACA,QAAM,QAAQ,aAAa,MAAM,GAAG;AAGpC,MAAI,QAAQ,gBAAgB,mBAAmB,EAAE,QAAQ,GAAG;AAC1D,YAAQ,OAAO,MAAM,KAAK;AAC1B;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,KAAK;AAC5B;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vostride/agent-qa-core",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "private": false,
5
5
  "description": "Core agent-qa runtime, schemas, tools, and execution services.",
6
6
  "keywords": [
@@ -33,6 +33,11 @@
33
33
  "types": "./dist/index.d.ts",
34
34
  "import": "./dist/index.js",
35
35
  "require": "./dist/index.cjs"
36
+ },
37
+ "./run-text-output": {
38
+ "types": "./dist/run-text-output.d.ts",
39
+ "import": "./dist/run-text-output.js",
40
+ "require": "./dist/run-text-output.cjs"
36
41
  }
37
42
  },
38
43
  "files": [
@@ -48,16 +53,15 @@
48
53
  "clean": "rm -rf dist .turbo"
49
54
  },
50
55
  "dependencies": {
51
- "@vostride/agent-qa-ids": "0.2.3",
52
- "@vostride/agent-qa-runner": "0.2.3",
53
- "@vostride/agent-qa-schema": "0.2.3",
56
+ "@vostride/agent-qa-ids": "0.2.4",
57
+ "@vostride/agent-qa-runner": "0.2.4",
58
+ "@vostride/agent-qa-schema": "0.2.4",
54
59
  "ai": "6.0.174",
55
60
  "bytes": "3.1.2",
56
61
  "fast-xml-parser": "5.7.2",
57
62
  "glob": "13.0.6",
58
63
  "ms": "2.1.3",
59
64
  "picocolors": "1.1.1",
60
- "playwright-core": "1.61.0",
61
65
  "semver": "7.8.1",
62
66
  "yaml": "2.8.4",
63
67
  "zod": "4.6.7"
@@ -66,7 +70,7 @@
66
70
  "@types/bytes": "~3.1.5",
67
71
  "@types/ms": "~2.1.0",
68
72
  "@types/node": "~24.12.2",
69
- "@vostride/agent-qa-arch": "0.2.3",
73
+ "@vostride/agent-qa-arch": "0.2.4",
70
74
  "tsup": "~8.5.1",
71
75
  "typescript": "~6.0.3",
72
76
  "vitest": "~4.1.5"