@aria-cli/types 1.0.9 → 1.0.10
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/package.json +4 -1
- package/dist-cjs/.tsbuildinfo +0 -1
- package/dist-cjs/errors.d.ts +0 -29
- package/dist-cjs/errors.js +0 -51
- package/dist-cjs/errors.js.map +0 -1
- package/dist-cjs/index.d.ts +0 -11
- package/dist-cjs/index.js +0 -29
- package/dist-cjs/index.js.map +0 -1
- package/dist-cjs/logger.d.ts +0 -54
- package/dist-cjs/logger.js +0 -166
- package/dist-cjs/logger.js.map +0 -1
- package/dist-cjs/memoria.d.ts +0 -428
- package/dist-cjs/memoria.js +0 -11
- package/dist-cjs/memoria.js.map +0 -1
- package/dist-cjs/models.d.ts +0 -322
- package/dist-cjs/models.js +0 -21
- package/dist-cjs/models.js.map +0 -1
- package/dist-cjs/native-tools.d.ts +0 -57
- package/dist-cjs/native-tools.js +0 -33
- package/dist-cjs/native-tools.js.map +0 -1
- package/dist-cjs/package.json +0 -3
- package/dist-cjs/relaunch.d.ts +0 -22
- package/dist-cjs/relaunch.js +0 -67
- package/dist-cjs/relaunch.js.map +0 -1
- package/dist-cjs/src/errors.d.ts +0 -29
- package/dist-cjs/src/errors.js +0 -51
- package/dist-cjs/src/errors.js.map +0 -1
- package/dist-cjs/src/index.d.ts +0 -10
- package/dist-cjs/src/index.js +0 -28
- package/dist-cjs/src/index.js.map +0 -1
- package/dist-cjs/src/logger.d.ts +0 -22
- package/dist-cjs/src/logger.js +0 -85
- package/dist-cjs/src/logger.js.map +0 -1
- package/dist-cjs/src/memoria.d.ts +0 -418
- package/dist-cjs/src/memoria.js +0 -11
- package/dist-cjs/src/memoria.js.map +0 -1
- package/dist-cjs/src/models.d.ts +0 -322
- package/dist-cjs/src/models.js +0 -21
- package/dist-cjs/src/models.js.map +0 -1
- package/dist-cjs/src/native-tools.d.ts +0 -57
- package/dist-cjs/src/native-tools.js +0 -33
- package/dist-cjs/src/native-tools.js.map +0 -1
- package/dist-cjs/src/relaunch.d.ts +0 -22
- package/dist-cjs/src/relaunch.js +0 -61
- package/dist-cjs/src/relaunch.js.map +0 -1
- package/dist-cjs/src/tool-outputs.d.ts +0 -37
- package/dist-cjs/src/tool-outputs.js +0 -5
- package/dist-cjs/src/tool-outputs.js.map +0 -1
- package/dist-cjs/stall-phase.d.ts +0 -2
- package/dist-cjs/stall-phase.js +0 -18
- package/dist-cjs/stall-phase.js.map +0 -1
- package/dist-cjs/tests/logger.test.d.ts +0 -1
- package/dist-cjs/tests/logger.test.js +0 -65
- package/dist-cjs/tests/logger.test.js.map +0 -1
- package/dist-cjs/tool-outputs.d.ts +0 -37
- package/dist-cjs/tool-outputs.js +0 -5
- package/dist-cjs/tool-outputs.js.map +0 -1
- package/dist-cjs/vitest.config.d.ts +0 -2
- package/dist-cjs/vitest.config.js +0 -19
- package/dist-cjs/vitest.config.js.map +0 -1
- package/src/errors.ts +0 -50
- package/src/index.ts +0 -17
- package/src/logger.ts +0 -169
- package/src/memoria.ts +0 -437
- package/src/models.ts +0 -356
- package/src/native-tools.ts +0 -73
- package/src/relaunch.ts +0 -67
- package/src/stall-phase.ts +0 -20
- package/src/tool-outputs.ts +0 -42
- package/tests/guards/types-test-lane-manifest.contract.test.ts +0 -42
- package/tests/logger.test.ts +0 -102
- package/tests/memoria-vitest-isolation.contract.test.ts +0 -108
- package/tests/test-lane-manifest.ts +0 -177
- package/tests/vitest-project-runner.contract.test.ts +0 -309
- package/tests/vitest-runner-capacity.contract.test.ts +0 -142
- package/tests/vitest-shared-pool.contract.test.ts +0 -79
- package/tsconfig.cjs.json +0 -15
- package/tsconfig.json +0 -12
- package/vitest.config.ts +0 -17
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../../tests/logger.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/** Canonical output shapes for tools with dedicated renderers.
|
|
2
|
-
* Executors MUST return these shapes. Renderers consume them directly. */
|
|
3
|
-
export interface EditFileOutput {
|
|
4
|
-
filePath: string;
|
|
5
|
-
structuredPatch: Array<{
|
|
6
|
-
oldStart: number;
|
|
7
|
-
oldLines: number;
|
|
8
|
-
newStart: number;
|
|
9
|
-
newLines: number;
|
|
10
|
-
lines: string[];
|
|
11
|
-
}>;
|
|
12
|
-
replacements: number;
|
|
13
|
-
strategy: string;
|
|
14
|
-
}
|
|
15
|
-
export interface WriteFileOutput {
|
|
16
|
-
filePath: string;
|
|
17
|
-
action: "created" | "overwritten" | "appended";
|
|
18
|
-
bytesWritten: number;
|
|
19
|
-
structuredPatch?: Array<{
|
|
20
|
-
oldStart: number;
|
|
21
|
-
oldLines: number;
|
|
22
|
-
newStart: number;
|
|
23
|
-
newLines: number;
|
|
24
|
-
lines: string[];
|
|
25
|
-
}>;
|
|
26
|
-
}
|
|
27
|
-
export interface BashToolOutput {
|
|
28
|
-
stdout: string;
|
|
29
|
-
stderr: string;
|
|
30
|
-
exitCode: number;
|
|
31
|
-
}
|
|
32
|
-
export interface NotebookEditOutput {
|
|
33
|
-
cellNumber: number;
|
|
34
|
-
newSource: string;
|
|
35
|
-
language: string;
|
|
36
|
-
error?: string;
|
|
37
|
-
}
|
package/dist-cjs/tool-outputs.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-outputs.js","sourceRoot":"","sources":["../src/tool-outputs.ts"],"names":[],"mappings":";AAAA;2EAC2E"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const config_1 = require("vitest/config");
|
|
4
|
-
const vitest_shared_ts_1 = require("../../vitest.shared.ts");
|
|
5
|
-
exports.default = (0, config_1.defineConfig)({
|
|
6
|
-
test: {
|
|
7
|
-
...vitest_shared_ts_1.sharedPoolConfig,
|
|
8
|
-
globals: true,
|
|
9
|
-
exclude: (0, vitest_shared_ts_1.getExcludes)(),
|
|
10
|
-
coverage: {
|
|
11
|
-
provider: "v8",
|
|
12
|
-
reporter: ["text", "json", "html"],
|
|
13
|
-
reportOnFailure: true,
|
|
14
|
-
include: ["src/**"],
|
|
15
|
-
exclude: ["**/__tests__/**", "**/*.test.ts"],
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
//# sourceMappingURL=vitest.config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":";;AAAA,0CAA6C;AAC7C,6DAAuE;AAEvE,kBAAe,IAAA,qBAAY,EAAC;IAC1B,IAAI,EAAE;QACJ,GAAG,mCAAgB;QACnB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAA,8BAAW,GAAE;QACtB,QAAQ,EAAE;YACR,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAClC,eAAe,EAAE,IAAI;YACrB,OAAO,EAAE,CAAC,QAAQ,CAAC;YACnB,OAAO,EAAE,CAAC,iBAAiB,EAAE,cAAc,CAAC;SAC7C;KACF;CACF,CAAC,CAAC"}
|
package/src/errors.ts
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Error narrowing utilities for replacing `catch (err: any)` patterns.
|
|
3
|
-
* @module @aria/types/errors
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Extract a human-readable message from an unknown caught value.
|
|
8
|
-
*
|
|
9
|
-
* Replaces the pattern:
|
|
10
|
-
* `catch (err: any) { ... err.message ... }`
|
|
11
|
-
* with:
|
|
12
|
-
* `catch (err: unknown) { ... getErrorMessage(err) ... }`
|
|
13
|
-
*/
|
|
14
|
-
export function getErrorMessage(err: unknown): string {
|
|
15
|
-
if (err instanceof Error) return err.message;
|
|
16
|
-
if (typeof err === "string") return err;
|
|
17
|
-
return String(err);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Extract an HTTP-style status code from an unknown caught value.
|
|
22
|
-
*
|
|
23
|
-
* Replaces the pattern:
|
|
24
|
-
* `(error as any).statusCode`
|
|
25
|
-
* with:
|
|
26
|
-
* `getErrorStatusCode(error)`
|
|
27
|
-
*/
|
|
28
|
-
export function getErrorStatusCode(err: unknown): number | undefined {
|
|
29
|
-
if (
|
|
30
|
-
typeof err === "object" &&
|
|
31
|
-
err !== null &&
|
|
32
|
-
"statusCode" in err &&
|
|
33
|
-
typeof (err as { statusCode: unknown }).statusCode === "number"
|
|
34
|
-
) {
|
|
35
|
-
return (err as { statusCode: number }).statusCode;
|
|
36
|
-
}
|
|
37
|
-
return undefined;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Type guard: is this caught value an Error with a `.code` property?
|
|
42
|
-
* Common for Node.js system errors (ENOENT, ECONNREFUSED, etc.)
|
|
43
|
-
*/
|
|
44
|
-
export function isNodeError(err: unknown): err is Error & { code: string } {
|
|
45
|
-
return (
|
|
46
|
-
err instanceof Error &&
|
|
47
|
-
"code" in err &&
|
|
48
|
-
typeof (err as { code: unknown }).code === "string"
|
|
49
|
-
);
|
|
50
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @aria/types - Minimal shared types
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export * from "./models.js";
|
|
6
|
-
export * from "./memoria.js";
|
|
7
|
-
export * from "./errors.js";
|
|
8
|
-
export * from "./native-tools.js";
|
|
9
|
-
export * from "./relaunch.js";
|
|
10
|
-
export * from "./stall-phase.js";
|
|
11
|
-
export { log, type LogLevel, type LogSink } from "./logger.js";
|
|
12
|
-
export type {
|
|
13
|
-
EditFileOutput,
|
|
14
|
-
WriteFileOutput,
|
|
15
|
-
BashToolOutput,
|
|
16
|
-
NotebookEditOutput,
|
|
17
|
-
} from "./tool-outputs.js";
|
package/src/logger.ts
DELETED
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Lightweight leveled logger for ARIA.
|
|
3
|
-
*
|
|
4
|
-
* Respects `ARIA_LOG_LEVEL` env var (debug | info | warn | error | silent).
|
|
5
|
-
* Default level: "info" — debug messages are suppressed in normal usage.
|
|
6
|
-
*
|
|
7
|
-
* Architecture: logs dispatch through pluggable sinks. The default console
|
|
8
|
-
* sink writes to stdout/stderr with ANSI styling. Execution contexts that
|
|
9
|
-
* lack a terminal (daemon, headless server) replace or supplement it with
|
|
10
|
-
* durable sinks (e.g., JSONL file sink). This decoupling makes it impossible
|
|
11
|
-
* for diagnostic output to silently go to /dev/null — every context
|
|
12
|
-
* configures the sink that matches its output channel.
|
|
13
|
-
*
|
|
14
|
-
* Usage:
|
|
15
|
-
* import { log } from "@aria-cli/types";
|
|
16
|
-
* log.debug("[PhaseTimer] ..."); // only prints when ARIA_LOG_LEVEL=debug
|
|
17
|
-
* log.info("[runner] ..."); // prints at info level and above
|
|
18
|
-
* log.warn("[runner] ..."); // prints at warn level and above
|
|
19
|
-
* log.error("[runner] ..."); // always prints (unless level > error)
|
|
20
|
-
*
|
|
21
|
-
* Sink configuration (daemon example):
|
|
22
|
-
* import { log } from "@aria-cli/types";
|
|
23
|
-
* log.addSink(myFileLogSink);
|
|
24
|
-
* log.removeConsoleSink(); // stdio is /dev/null in detached mode
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
export type LogLevel = "debug" | "info" | "warn" | "error" | "silent";
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* A log sink receives raw (unstyled) log arguments and writes them
|
|
31
|
-
* to a destination. Each sink decides its own formatting.
|
|
32
|
-
*/
|
|
33
|
-
export interface LogSink {
|
|
34
|
-
write(level: LogLevel, args: unknown[]): void;
|
|
35
|
-
close?(): void;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const DIM_GRAY = "\x1b[2m\x1b[90m";
|
|
39
|
-
const CYAN = "\x1b[36m";
|
|
40
|
-
const RESET = "\x1b[0m";
|
|
41
|
-
|
|
42
|
-
const LEVEL_ORDER: Record<LogLevel, number> = {
|
|
43
|
-
debug: 0,
|
|
44
|
-
info: 1,
|
|
45
|
-
warn: 2,
|
|
46
|
-
error: 3,
|
|
47
|
-
silent: 4,
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
function resolveLevel(): LogLevel {
|
|
51
|
-
const env = typeof process !== "undefined" ? process.env.ARIA_LOG_LEVEL : undefined;
|
|
52
|
-
if (env && env in LEVEL_ORDER) return env as LogLevel;
|
|
53
|
-
return "info";
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
let currentLevel: LogLevel = resolveLevel();
|
|
57
|
-
|
|
58
|
-
function enabled(level: LogLevel): boolean {
|
|
59
|
-
return LEVEL_ORDER[level] >= LEVEL_ORDER[currentLevel];
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function isBrokenPipeError(error: unknown): boolean {
|
|
63
|
-
if (!error || typeof error !== "object") {
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
const maybe = error as { code?: unknown };
|
|
67
|
-
return maybe.code === "EPIPE" || maybe.code === "ERR_STREAM_DESTROYED";
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function writeSafely(method: (...args: unknown[]) => void, args: unknown[]): void {
|
|
71
|
-
try {
|
|
72
|
-
method(...args);
|
|
73
|
-
} catch (error) {
|
|
74
|
-
if (isBrokenPipeError(error)) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
throw error;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function styleSystemDebugArgs(args: unknown[]): unknown[] {
|
|
82
|
-
if (args.length === 0) return args;
|
|
83
|
-
const [first, ...rest] = args;
|
|
84
|
-
if (typeof first !== "string") return args;
|
|
85
|
-
if (!first.startsWith("[")) return args;
|
|
86
|
-
return [`${DIM_GRAY}${first}${RESET}`, ...rest];
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function styleSystemInfoArgs(args: unknown[]): unknown[] {
|
|
90
|
-
if (args.length === 0) return args;
|
|
91
|
-
const [first, ...rest] = args;
|
|
92
|
-
if (typeof first !== "string") return args;
|
|
93
|
-
if (!first.startsWith("[")) return args;
|
|
94
|
-
return [`${CYAN}${first}${RESET}`, ...rest];
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// ── Sinks ────────────────────────────────────────────────────────
|
|
98
|
-
|
|
99
|
-
/** Default console sink — applies ANSI styling for terminal readability. */
|
|
100
|
-
const consoleSink: LogSink = {
|
|
101
|
-
write(level: LogLevel, args: unknown[]): void {
|
|
102
|
-
let styled: unknown[];
|
|
103
|
-
let method: (...a: unknown[]) => void;
|
|
104
|
-
switch (level) {
|
|
105
|
-
case "debug":
|
|
106
|
-
styled = styleSystemDebugArgs(args);
|
|
107
|
-
method = console.debug;
|
|
108
|
-
break;
|
|
109
|
-
case "info":
|
|
110
|
-
styled = styleSystemInfoArgs(args);
|
|
111
|
-
method = console.info;
|
|
112
|
-
break;
|
|
113
|
-
case "warn":
|
|
114
|
-
styled = args;
|
|
115
|
-
method = console.warn;
|
|
116
|
-
break;
|
|
117
|
-
default:
|
|
118
|
-
styled = args;
|
|
119
|
-
method = console.error;
|
|
120
|
-
break;
|
|
121
|
-
}
|
|
122
|
-
writeSafely(method, styled);
|
|
123
|
-
},
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
const sinks: LogSink[] = [consoleSink];
|
|
127
|
-
|
|
128
|
-
// ── Public API ───────────────────────────────────────────────────
|
|
129
|
-
|
|
130
|
-
export const log = {
|
|
131
|
-
debug(...args: unknown[]): void {
|
|
132
|
-
if (enabled("debug")) for (const s of sinks) s.write("debug", args);
|
|
133
|
-
},
|
|
134
|
-
info(...args: unknown[]): void {
|
|
135
|
-
if (enabled("info")) for (const s of sinks) s.write("info", args);
|
|
136
|
-
},
|
|
137
|
-
warn(...args: unknown[]): void {
|
|
138
|
-
if (enabled("warn")) for (const s of sinks) s.write("warn", args);
|
|
139
|
-
},
|
|
140
|
-
error(...args: unknown[]): void {
|
|
141
|
-
if (enabled("error")) for (const s of sinks) s.write("error", args);
|
|
142
|
-
},
|
|
143
|
-
setLevel(level: LogLevel): void {
|
|
144
|
-
currentLevel = level;
|
|
145
|
-
},
|
|
146
|
-
getLevel(): LogLevel {
|
|
147
|
-
return currentLevel;
|
|
148
|
-
},
|
|
149
|
-
/** Add a log sink. All subsequent log calls dispatch to it. */
|
|
150
|
-
addSink(sink: LogSink): void {
|
|
151
|
-
sinks.push(sink);
|
|
152
|
-
},
|
|
153
|
-
/** Remove a previously added sink. */
|
|
154
|
-
removeSink(sink: LogSink): void {
|
|
155
|
-
const idx = sinks.indexOf(sink);
|
|
156
|
-
if (idx >= 0) sinks.splice(idx, 1);
|
|
157
|
-
},
|
|
158
|
-
/**
|
|
159
|
-
* Remove the built-in console sink.
|
|
160
|
-
*
|
|
161
|
-
* Use this in execution contexts where stdio is unavailable (detached
|
|
162
|
-
* daemon, headless server) AFTER adding a durable file sink. Prevents
|
|
163
|
-
* wasted console.* calls that go to /dev/null.
|
|
164
|
-
*/
|
|
165
|
-
removeConsoleSink(): void {
|
|
166
|
-
const idx = sinks.indexOf(consoleSink);
|
|
167
|
-
if (idx >= 0) sinks.splice(idx, 1);
|
|
168
|
-
},
|
|
169
|
-
};
|