@vymalo/opencode-devtools 0.11.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,139 +1,169 @@
1
1
  import { all, create } from "mathjs";
2
2
  import { json, reqNumber, reqString } from "../tool-spec.js";
3
3
  /**
4
- * A hardened mathjs instance. We use BigNumber for precise decimal arithmetic
5
- * and disable every function that can mutate the evaluator or reach outside the
6
- * expression sandbox. `evaluate` itself parses mathjs's own expression language
7
- * (not JavaScript), so with `import` / `createUnit` / function-assignment
8
- * removed there is no path to arbitrary code execution. See plans/devtools.md
9
- * and the math-sandbox ADR.
10
- */
11
- const math = create(all, { number: "BigNumber", precision: 64 });
4
+ * A hardened mathjs instance. We use BigNumber for precise decimal arithmetic
5
+ * and disable every function that can mutate the evaluator or reach outside the
6
+ * expression sandbox. `evaluate` itself parses mathjs's own expression language
7
+ * (not JavaScript), so with `import` / `createUnit` / function-assignment
8
+ * removed there is no path to arbitrary code execution. See plans/devtools.md
9
+ * and the math-sandbox ADR.
10
+ */
11
+ const math = create(all, {
12
+ number: "BigNumber",
13
+ precision: 64
14
+ });
12
15
  const disabled = () => {
13
- throw new Error("disabled for security");
16
+ throw new Error("disabled for security");
14
17
  };
15
18
  math.import({
16
- import: disabled,
17
- createUnit: disabled,
18
- reviver: disabled,
19
- splitUnit: disabled
19
+ import: disabled,
20
+ createUnit: disabled,
21
+ reviver: disabled,
22
+ splitUnit: disabled
20
23
  }, { override: true });
21
- const RADIX_PREFIX = { 2: "0b", 8: "0o", 16: "0x" };
24
+ const RADIX_PREFIX = {
25
+ 2: "0b",
26
+ 8: "0o",
27
+ 16: "0x"
28
+ };
22
29
  function parseInRadix(value, radix) {
23
- const trimmed = value.trim().replace(/^0[box]/i, "");
24
- // Number.parseInt stops at the first illegal digit (so "1012" in base 2 would
25
- // silently parse as 5). Require EVERY digit to be legal for the radix.
26
- const allLegal = trimmed.length > 0 &&
27
- [...trimmed.toLowerCase()].every((ch) => {
28
- const d = Number.parseInt(ch, radix);
29
- return !Number.isNaN(d) && d < radix;
30
- });
31
- if (!allLegal) {
32
- throw new Error(`"${value}" is not a valid base-${radix} integer`);
33
- }
34
- return Number.parseInt(trimmed, radix);
30
+ const trimmed = value.trim().replace(/^0[box]/i, "");
31
+ // Number.parseInt stops at the first illegal digit (so "1012" in base 2 would
32
+ // silently parse as 5). Require EVERY digit to be legal for the radix.
33
+ const allLegal = trimmed.length > 0 && [...trimmed.toLowerCase()].every((ch) => {
34
+ const d = Number.parseInt(ch, radix);
35
+ return !Number.isNaN(d) && d < radix;
36
+ });
37
+ if (!allLegal) {
38
+ throw new Error(`"${value}" is not a valid base-${radix} integer`);
39
+ }
40
+ return Number.parseInt(trimmed, radix);
35
41
  }
36
42
  export const MATH_TOOLS = [
37
- {
38
- name: "math_eval",
39
- group: "math",
40
- description: 'Evaluate a mathematical expression with arbitrary-precision (64-digit) decimals. Supports arithmetic, functions (sqrt, log, sin, …), constants (pi, e), and inline unit math (e.g. "3 inch to cm"). Sandboxed: no code execution.',
41
- input: {
42
- expression: {
43
- type: "string",
44
- description: 'Expression to evaluate, e.g. "(2 + 3) * 4" or "sqrt(2)" or "5 km to miles".'
45
- }
46
- },
47
- handler: (args) => {
48
- const expression = reqString(args, "expression");
49
- const result = math.evaluate(expression);
50
- const formatted = math.format(result, { precision: 64 });
51
- return json({ expression, result: formatted }, formatted);
52
- }
53
- },
54
- {
55
- name: "math_convert_unit",
56
- group: "math",
57
- description: "Convert a physical quantity from one unit to another (length, mass, time, temperature, data, energy, …). Returns the converted value.",
58
- input: {
59
- value: { type: "number", description: "Numeric magnitude to convert." },
60
- from: { type: "string", description: 'Source unit, e.g. "km", "kg", "celsius", "GB".' },
61
- to: { type: "string", description: 'Target unit, e.g. "miles", "lbs", "fahrenheit", "MB".' }
62
- },
63
- handler: (args) => {
64
- const value = reqNumber(args, "value");
65
- const from = reqString(args, "from");
66
- const to = reqString(args, "to");
67
- const converted = math.evaluate(`${value} ${from} to ${to}`);
68
- const formatted = math.format(converted, { precision: 14 });
69
- return json({ value, from, to, result: formatted }, `${value} ${from} = ${formatted}`);
70
- }
71
- },
72
- {
73
- name: "math_stats",
74
- group: "math",
75
- description: "Compute descriptive statistics over a list of numbers: count, sum, min, max, mean, median, mode, variance and standard deviation.",
76
- input: {
77
- values: { type: "array", items: { type: "number" }, description: "The numbers to summarize." }
78
- },
79
- handler: (args) => {
80
- const raw = args.values;
81
- if (!Array.isArray(raw) || raw.length === 0) {
82
- throw new Error('"values" must be a non-empty array of numbers');
83
- }
84
- const values = raw.map((v, i) => {
85
- if (typeof v !== "number" || Number.isNaN(v)) {
86
- throw new Error(`values[${i}] is not a number`);
87
- }
88
- return v;
89
- });
90
- const num = (x) => Number(math.format(x, { precision: 14 }));
91
- const stats = {
92
- count: values.length,
93
- sum: num(math.sum(values)),
94
- min: num(math.min(values)),
95
- max: num(math.max(values)),
96
- mean: num(math.mean(values)),
97
- median: num(math.median(values)),
98
- mode: math.mode(values).map(num),
99
- variance: num(math.variance(values)),
100
- stdev: num(math.std(values))
101
- };
102
- return json(stats, `n=${stats.count} mean=${stats.mean} median=${stats.median} stdev=${stats.stdev} min=${stats.min} max=${stats.max}`);
103
- }
104
- },
105
- {
106
- name: "math_base",
107
- group: "math",
108
- description: "Convert an integer between numeric bases (radix 2–36). Common bases (binary, octal, decimal, hex) are returned alongside the requested target.",
109
- input: {
110
- value: { type: "string", description: 'Integer to convert, e.g. "255" or "0xff" or "1011".' },
111
- fromBase: { type: "number", description: "Base of the input value (2–36)." },
112
- toBase: { type: "number", description: "Base to convert to (2–36)." }
113
- },
114
- handler: (args) => {
115
- const value = reqString(args, "value");
116
- const fromBase = reqNumber(args, "fromBase");
117
- const toBase = reqNumber(args, "toBase");
118
- for (const [label, b] of [
119
- ["fromBase", fromBase],
120
- ["toBase", toBase]
121
- ]) {
122
- if (!Number.isInteger(b) || b < 2 || b > 36) {
123
- throw new Error(`"${label}" must be an integer in 2–36`);
124
- }
125
- }
126
- const n = parseInRadix(value, fromBase);
127
- const out = n.toString(toBase);
128
- const prefix = RADIX_PREFIX[toBase] ?? "";
129
- return json({
130
- decimal: n,
131
- result: out,
132
- binary: n.toString(2),
133
- octal: n.toString(8),
134
- hex: n.toString(16)
135
- }, `${value} (base ${fromBase}) = ${prefix}${out} (base ${toBase})`);
136
- }
137
- }
43
+ {
44
+ name: "math_eval",
45
+ group: "math",
46
+ description: "Evaluate a mathematical expression with arbitrary-precision (64-digit) decimals. Supports arithmetic, functions (sqrt, log, sin, …), constants (pi, e), and inline unit math (e.g. \"3 inch to cm\"). Sandboxed: no code execution.",
47
+ input: { expression: {
48
+ type: "string",
49
+ description: "Expression to evaluate, e.g. \"(2 + 3) * 4\" or \"sqrt(2)\" or \"5 km to miles\"."
50
+ } },
51
+ handler: (args) => {
52
+ const expression = reqString(args, "expression");
53
+ const result = math.evaluate(expression);
54
+ const formatted = math.format(result, { precision: 64 });
55
+ return json({
56
+ expression,
57
+ result: formatted
58
+ }, formatted);
59
+ }
60
+ },
61
+ {
62
+ name: "math_convert_unit",
63
+ group: "math",
64
+ description: "Convert a physical quantity from one unit to another (length, mass, time, temperature, data, energy, …). Returns the converted value.",
65
+ input: {
66
+ value: {
67
+ type: "number",
68
+ description: "Numeric magnitude to convert."
69
+ },
70
+ from: {
71
+ type: "string",
72
+ description: "Source unit, e.g. \"km\", \"kg\", \"celsius\", \"GB\"."
73
+ },
74
+ to: {
75
+ type: "string",
76
+ description: "Target unit, e.g. \"miles\", \"lbs\", \"fahrenheit\", \"MB\"."
77
+ }
78
+ },
79
+ handler: (args) => {
80
+ const value = reqNumber(args, "value");
81
+ const from = reqString(args, "from");
82
+ const to = reqString(args, "to");
83
+ const converted = math.evaluate(`${value} ${from} to ${to}`);
84
+ const formatted = math.format(converted, { precision: 14 });
85
+ return json({
86
+ value,
87
+ from,
88
+ to,
89
+ result: formatted
90
+ }, `${value} ${from} = ${formatted}`);
91
+ }
92
+ },
93
+ {
94
+ name: "math_stats",
95
+ group: "math",
96
+ description: "Compute descriptive statistics over a list of numbers: count, sum, min, max, mean, median, mode, variance and standard deviation.",
97
+ input: { values: {
98
+ type: "array",
99
+ items: { type: "number" },
100
+ description: "The numbers to summarize."
101
+ } },
102
+ handler: (args) => {
103
+ const raw = args.values;
104
+ if (!Array.isArray(raw) || raw.length === 0) {
105
+ throw new Error("\"values\" must be a non-empty array of numbers");
106
+ }
107
+ const values = raw.map((v, i) => {
108
+ if (typeof v !== "number" || Number.isNaN(v)) {
109
+ throw new Error(`values[${i}] is not a number`);
110
+ }
111
+ return v;
112
+ });
113
+ const num = (x) => Number(math.format(x, { precision: 14 }));
114
+ const stats = {
115
+ count: values.length,
116
+ sum: num(math.sum(values)),
117
+ min: num(math.min(values)),
118
+ max: num(math.max(values)),
119
+ mean: num(math.mean(values)),
120
+ median: num(math.median(values)),
121
+ mode: math.mode(values).map(num),
122
+ variance: num(math.variance(values)),
123
+ stdev: num(math.std(values))
124
+ };
125
+ return json(stats, `n=${stats.count} mean=${stats.mean} median=${stats.median} stdev=${stats.stdev} min=${stats.min} max=${stats.max}`);
126
+ }
127
+ },
128
+ {
129
+ name: "math_base",
130
+ group: "math",
131
+ description: "Convert an integer between numeric bases (radix 2–36). Common bases (binary, octal, decimal, hex) are returned alongside the requested target.",
132
+ input: {
133
+ value: {
134
+ type: "string",
135
+ description: "Integer to convert, e.g. \"255\" or \"0xff\" or \"1011\"."
136
+ },
137
+ fromBase: {
138
+ type: "number",
139
+ description: "Base of the input value (2–36)."
140
+ },
141
+ toBase: {
142
+ type: "number",
143
+ description: "Base to convert to (2–36)."
144
+ }
145
+ },
146
+ handler: (args) => {
147
+ const value = reqString(args, "value");
148
+ const fromBase = reqNumber(args, "fromBase");
149
+ const toBase = reqNumber(args, "toBase");
150
+ for (const [label, b] of [["fromBase", fromBase], ["toBase", toBase]]) {
151
+ if (!Number.isInteger(b) || b < 2 || b > 36) {
152
+ throw new Error(`"${label}" must be an integer in 2–36`);
153
+ }
154
+ }
155
+ const n = parseInRadix(value, fromBase);
156
+ const out = n.toString(toBase);
157
+ const prefix = RADIX_PREFIX[toBase] ?? "";
158
+ return json({
159
+ decimal: n,
160
+ result: out,
161
+ binary: n.toString(2),
162
+ octal: n.toString(8),
163
+ hex: n.toString(16)
164
+ }, `${value} (base ${fromBase}) = ${prefix}${out} (base ${toBase})`);
165
+ }
166
+ }
138
167
  ];
168
+
139
169
  //# sourceMappingURL=math.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/groups/math.ts"],"names":[],"mappings":"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"}
1
+ {"mappings":"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","names":[],"sources":["../../src/groups/math.ts"],"version":3,"file":"math.js","sourceRoot":""}
package/dist/index.js CHANGED
@@ -3,4 +3,5 @@
3
3
  // module exposes is the default plugin. Library/utility exports live in
4
4
  // `./lib` (see lib.ts), which OpenCode never inspects.
5
5
  export { default } from "./opencode.js";
6
+
6
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,wEAAwE;AACxE,uDAAuD;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
1
+ {"mappings":";;;;AAIA,SAAS,eAAe","names":[],"sources":["../src/index.ts"],"version":3,"file":"index.js","sourceRoot":""}
package/dist/lib.js CHANGED
@@ -4,4 +4,5 @@ export { buildContext, createDevtoolsTools } from "./tools.js";
4
4
  export { toJsonSchema } from "./schema.js";
5
5
  export { json, optBool, optString, reqNumber, reqString, text } from "./tool-spec.js";
6
6
  export { createJsonConsoleLogger, DEFAULT_LOG_LEVEL, fromOpenCodeLogLevel } from "./logging.js";
7
+
7
8
  //# sourceMappingURL=lib.js.map
package/dist/lib.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EAEpB,sBAAsB,EACtB,cAAc,EACf,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,cAAc,EACd,cAAc,EAEd,WAAW,EACX,WAAW,EAIZ,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAiB,MAAM,YAAY,CAAC;AAE9E,OAAO,EAA+C,YAAY,EAAE,MAAM,aAAa,CAAC;AAExF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtF,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EAIrB,MAAM,cAAc,CAAC"}
1
+ {"mappings":"AAAA,SACE,sBAEA,wBACA,sBACK;AAEP,SACE,gBACA,gBAEA,aACA,mBAIK;AAEP,SAAS,cAAc,2BAA0C;AAEjE,SAAsD,oBAAoB;AAE1E,SAAS,MAAM,SAAS,WAAW,WAAW,WAAW,YAAY;AAErE,SACE,yBACA,mBACA,4BAIK","names":[],"sources":["../src/lib.ts"],"version":3,"file":"lib.js","sourceRoot":""}
package/dist/logging.d.ts CHANGED
@@ -3,14 +3,14 @@ export type { LogLevel } from "./types.js";
3
3
  export declare const LOG_LEVEL_PRIORITY: Record<LogLevel, number>;
4
4
  export declare const DEFAULT_LOG_LEVEL: LogLevel;
5
5
  export interface LogFields {
6
- [key: string]: unknown;
6
+ [key: string]: unknown;
7
7
  }
8
8
  export interface Logger {
9
- trace(event: string, fields?: LogFields): void;
10
- debug(event: string, fields?: LogFields): void;
11
- info(event: string, fields?: LogFields): void;
12
- warn(event: string, fields?: LogFields): void;
13
- error(event: string, fields?: LogFields): void;
9
+ trace(event: string, fields?: LogFields): void;
10
+ debug(event: string, fields?: LogFields): void;
11
+ info(event: string, fields?: LogFields): void;
12
+ warn(event: string, fields?: LogFields): void;
13
+ error(event: string, fields?: LogFields): void;
14
14
  }
15
15
  export declare function createJsonConsoleLogger(minLevel?: LogLevel): Logger;
16
16
  export declare function fromOpenCodeLogLevel(value: unknown): LogLevel | undefined;
package/dist/logging.js CHANGED
@@ -1,72 +1,69 @@
1
1
  export const LOG_LEVEL_PRIORITY = {
2
- trace: 5,
3
- debug: 10,
4
- info: 20,
5
- warn: 30,
6
- error: 40
2
+ trace: 5,
3
+ debug: 10,
4
+ info: 20,
5
+ warn: 30,
6
+ error: 40
7
7
  };
8
8
  export const DEFAULT_LOG_LEVEL = "info";
9
9
  function redactFields(fields) {
10
- if (!fields) {
11
- return undefined;
12
- }
13
- const redacted = {};
14
- for (const [key, value] of Object.entries(fields)) {
15
- if (/token|secret|password|authorization/i.test(key)) {
16
- redacted[key] = "[redacted]";
17
- continue;
18
- }
19
- redacted[key] = value;
20
- }
21
- return redacted;
10
+ if (!fields) {
11
+ return undefined;
12
+ }
13
+ const redacted = {};
14
+ for (const [key, value] of Object.entries(fields)) {
15
+ if (/token|secret|password|authorization/i.test(key)) {
16
+ redacted[key] = "[redacted]";
17
+ continue;
18
+ }
19
+ redacted[key] = value;
20
+ }
21
+ return redacted;
22
22
  }
23
23
  export function createJsonConsoleLogger(minLevel = DEFAULT_LOG_LEVEL) {
24
- const minPriority = LOG_LEVEL_PRIORITY[minLevel];
25
- const write = (level, event, fields) => {
26
- if (LOG_LEVEL_PRIORITY[level] < minPriority) {
27
- return;
28
- }
29
- const payload = {
30
- ts: new Date().toISOString(),
31
- level,
32
- event,
33
- ...(redactFields(fields) ?? {})
34
- };
35
- const line = JSON.stringify(payload);
36
- if (level === "error") {
37
- console.error(line);
38
- return;
39
- }
40
- if (level === "warn") {
41
- console.warn(line);
42
- return;
43
- }
44
- console.log(line);
45
- };
46
- return {
47
- trace: (event, fields) => write("trace", event, fields),
48
- debug: (event, fields) => write("debug", event, fields),
49
- info: (event, fields) => write("info", event, fields),
50
- warn: (event, fields) => write("warn", event, fields),
51
- error: (event, fields) => write("error", event, fields)
52
- };
24
+ const minPriority = LOG_LEVEL_PRIORITY[minLevel];
25
+ const write = (level, event, fields) => {
26
+ if (LOG_LEVEL_PRIORITY[level] < minPriority) {
27
+ return;
28
+ }
29
+ const payload = {
30
+ ts: new Date().toISOString(),
31
+ level,
32
+ event,
33
+ ...redactFields(fields) ?? {}
34
+ };
35
+ const line = JSON.stringify(payload);
36
+ if (level === "error") {
37
+ console.error(line);
38
+ return;
39
+ }
40
+ if (level === "warn") {
41
+ console.warn(line);
42
+ return;
43
+ }
44
+ console.log(line);
45
+ };
46
+ return {
47
+ trace: (event, fields) => write("trace", event, fields),
48
+ debug: (event, fields) => write("debug", event, fields),
49
+ info: (event, fields) => write("info", event, fields),
50
+ warn: (event, fields) => write("warn", event, fields),
51
+ error: (event, fields) => write("error", event, fields)
52
+ };
53
53
  }
54
54
  export function fromOpenCodeLogLevel(value) {
55
- if (typeof value !== "string") {
56
- return undefined;
57
- }
58
- switch (value.toUpperCase()) {
59
- case "DEBUG":
60
- // Host DEBUG unlocks our most-verbose internal tier (trace).
61
- return "trace";
62
- case "INFO":
63
- return "info";
64
- case "WARN":
65
- return "warn";
66
- case "ERROR":
67
- return "error";
68
- default:
69
- return undefined;
70
- }
55
+ if (typeof value !== "string") {
56
+ return undefined;
57
+ }
58
+ switch (value.toUpperCase()) {
59
+ case "DEBUG":
60
+ // Host DEBUG unlocks our most-verbose internal tier (trace).
61
+ return "trace";
62
+ case "INFO": return "info";
63
+ case "WARN": return "warn";
64
+ case "ERROR": return "error";
65
+ default: return undefined;
66
+ }
71
67
  }
68
+
72
69
  //# sourceMappingURL=logging.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"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"}
1
+ {"mappings":"AAIA,OAAO,MAAM,qBAA+C;CAC1D,OAAO;CACP,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;AACT;AAEA,OAAO,MAAM,oBAA8B;AAc3C,SAAS,aAAa,QAA2C;CAC/D,IAAI,CAAC,QAAQ;EACX,OAAO;CACT;CACA,MAAM,WAAsB,CAAC;CAC7B,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;EACjD,IAAI,uCAAuC,KAAK,GAAG,GAAG;GACpD,SAAS,OAAO;GAChB;EACF;EACA,SAAS,OAAO;CAClB;CACA,OAAO;AACT;AAEA,OAAO,SAAS,wBAAwB,WAAqB,mBAA2B;CACtF,MAAM,cAAc,mBAAmB;CAEvC,MAAM,SAAS,OAAiB,OAAe,WAA6B;EAC1E,IAAI,mBAAmB,SAAS,aAAa;GAC3C;EACF;EACA,MAAM,UAAU;GACd,IAAI,IAAI,KAAK,CAAC,CAAC,YAAY;GAC3B;GACA;GACA,GAAI,aAAa,MAAM,KAAK,CAAC;EAC/B;EACA,MAAM,OAAO,KAAK,UAAU,OAAO;EACnC,IAAI,UAAU,SAAS;GACrB,QAAQ,MAAM,IAAI;GAClB;EACF;EACA,IAAI,UAAU,QAAQ;GACpB,QAAQ,KAAK,IAAI;GACjB;EACF;EACA,QAAQ,IAAI,IAAI;CAClB;CAEA,OAAO;EACL,QAAQ,OAAO,WAAW,MAAM,SAAS,OAAO,MAAM;EACtD,QAAQ,OAAO,WAAW,MAAM,SAAS,OAAO,MAAM;EACtD,OAAO,OAAO,WAAW,MAAM,QAAQ,OAAO,MAAM;EACpD,OAAO,OAAO,WAAW,MAAM,QAAQ,OAAO,MAAM;EACpD,QAAQ,OAAO,WAAW,MAAM,SAAS,OAAO,MAAM;CACxD;AACF;AAEA,OAAO,SAAS,qBAAqB,OAAsC;CACzE,IAAI,OAAO,UAAU,UAAU;EAC7B,OAAO;CACT;CACA,QAAQ,MAAM,YAAY,GAA1B;EACE,KAAK;;EAEH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,SACE,OAAO;CACX;AACF","names":[],"sources":["../src/logging.ts"],"version":3,"file":"logging.js","sourceRoot":""}
@@ -3,10 +3,10 @@ import { type Logger } from "./logging.js";
3
3
  import { type ToolDeps } from "./tools.js";
4
4
  import type { ResolvedDevtoolsOptions } from "./types.js";
5
5
  export interface DevtoolsPluginFactoryOptions {
6
- /** Inject a logger (defaults to the OpenCode-piped logger). */
7
- logger?: Logger;
8
- /** Inject the tool execution context (clock / randomness / fetch) for tests. */
9
- context?: ToolDeps["context"];
6
+ /** Inject a logger (defaults to the OpenCode-piped logger). */
7
+ logger?: Logger;
8
+ /** Inject the tool execution context (clock / randomness / fetch) for tests. */
9
+ context?: ToolDeps["context"];
10
10
  }
11
11
  export declare function resolveOptions(raw: PluginOptions | undefined): ResolvedDevtoolsOptions;
12
12
  export declare function createDevtoolsPlugin(factoryOptions?: DevtoolsPluginFactoryOptions): Plugin;