@botbotgo/common 1.0.3 → 1.0.66
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/{chunk-DIIWJNRE.js → chunk-GQZFDM3S.js} +2 -2
- package/dist/chunk-GQZFDM3S.js.map +1 -0
- package/dist/{chunk-OJWAEVSP.js → chunk-OTWARMTU.js} +2 -2
- package/dist/{chunk-6VW5AW43.js → chunk-P6CL7XSX.js} +6 -7
- package/dist/chunk-P6CL7XSX.js.map +1 -0
- package/dist/{chunk-H5BG6SXW.js → chunk-RQSSJFDP.js} +9 -9
- package/dist/chunk-RQSSJFDP.js.map +1 -0
- package/dist/{chunk-2HMNFLD4.js → chunk-X4TDNR4V.js} +11 -15
- package/dist/chunk-X4TDNR4V.js.map +1 -0
- package/dist/config/index.js +1 -1
- package/dist/context/index.js +2 -2
- package/dist/events/index.js +5 -5
- package/dist/index.js +5 -5
- package/dist/security-store/index.js +1 -1
- package/dist/security-store/index.js.map +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/utils/index.js +2 -2
- package/package.json +5 -7
- package/dist/chunk-2HMNFLD4.js.map +0 -1
- package/dist/chunk-6VW5AW43.js.map +0 -1
- package/dist/chunk-DIIWJNRE.js.map +0 -1
- package/dist/chunk-H5BG6SXW.js.map +0 -1
- /package/dist/{chunk-OJWAEVSP.js.map → chunk-OTWARMTU.js.map} +0 -0
|
@@ -17,7 +17,7 @@ var DefaultAgentContext = class {
|
|
|
17
17
|
return this.registry.get(token);
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
|
-
var DEFAULT_CONTEXT_KEY = "
|
|
20
|
+
var DEFAULT_CONTEXT_KEY = "__easynet_agent_default_context__";
|
|
21
21
|
function getGlobalStore() {
|
|
22
22
|
return globalThis;
|
|
23
23
|
}
|
|
@@ -48,4 +48,4 @@ export {
|
|
|
48
48
|
getDefaultAgentContext,
|
|
49
49
|
resetDefaultAgentContext
|
|
50
50
|
};
|
|
51
|
-
//# sourceMappingURL=chunk-
|
|
51
|
+
//# sourceMappingURL=chunk-GQZFDM3S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context/default-context.ts"],"sourcesContent":["export interface AgentContext {\n set<T>(token: symbol, value: T): void;\n get<T>(token: symbol): T;\n has(token: symbol): boolean;\n tryGet<T>(token: symbol): T | undefined;\n}\n\nclass DefaultAgentContext implements AgentContext {\n private readonly registry = new Map<symbol, unknown>();\n\n set<T>(token: symbol, value: T): void {\n this.registry.set(token, value);\n }\n\n get<T>(token: symbol): T {\n if (!this.registry.has(token)) {\n throw new Error(`AgentContext: token not registered: ${token.toString()}`);\n }\n return this.registry.get(token) as T;\n }\n\n has(token: symbol): boolean {\n return this.registry.has(token);\n }\n\n tryGet<T>(token: symbol): T | undefined {\n return this.registry.get(token) as T | undefined;\n }\n}\n\nconst DEFAULT_CONTEXT_KEY = \"__easynet_agent_default_context__\";\n\nfunction getGlobalStore(): Record<string, unknown> {\n return globalThis as unknown as Record<string, unknown>;\n}\n\nexport function createAgentContext(): AgentContext {\n return new DefaultAgentContext();\n}\n\nexport function isAgentContext(value: unknown): value is AgentContext {\n return (\n typeof value === \"object\"\n && value !== null\n && typeof (value as AgentContext).get === \"function\"\n && typeof (value as AgentContext).set === \"function\"\n && typeof (value as AgentContext).has === \"function\"\n );\n}\n\nexport function getDefaultAgentContext(): AgentContext {\n const store = getGlobalStore();\n const existing = store[DEFAULT_CONTEXT_KEY];\n if (isAgentContext(existing)) return existing;\n const created = createAgentContext();\n store[DEFAULT_CONTEXT_KEY] = created;\n return created;\n}\n\nexport function resetDefaultAgentContext(): void {\n const store = getGlobalStore();\n if (DEFAULT_CONTEXT_KEY in store) {\n delete store[DEFAULT_CONTEXT_KEY];\n }\n}\n"],"mappings":";AAOA,IAAM,sBAAN,MAAkD;AAAA,EAC/B,WAAW,oBAAI,IAAqB;AAAA,EAErD,IAAO,OAAe,OAAgB;AACpC,SAAK,SAAS,IAAI,OAAO,KAAK;AAAA,EAChC;AAAA,EAEA,IAAO,OAAkB;AACvB,QAAI,CAAC,KAAK,SAAS,IAAI,KAAK,GAAG;AAC7B,YAAM,IAAI,MAAM,uCAAuC,MAAM,SAAS,CAAC,EAAE;AAAA,IAC3E;AACA,WAAO,KAAK,SAAS,IAAI,KAAK;AAAA,EAChC;AAAA,EAEA,IAAI,OAAwB;AAC1B,WAAO,KAAK,SAAS,IAAI,KAAK;AAAA,EAChC;AAAA,EAEA,OAAU,OAA8B;AACtC,WAAO,KAAK,SAAS,IAAI,KAAK;AAAA,EAChC;AACF;AAEA,IAAM,sBAAsB;AAE5B,SAAS,iBAA0C;AACjD,SAAO;AACT;AAEO,SAAS,qBAAmC;AACjD,SAAO,IAAI,oBAAoB;AACjC;AAEO,SAAS,eAAe,OAAuC;AACpE,SACE,OAAO,UAAU,YACd,UAAU,QACV,OAAQ,MAAuB,QAAQ,cACvC,OAAQ,MAAuB,QAAQ,cACvC,OAAQ,MAAuB,QAAQ;AAE9C;AAEO,SAAS,yBAAuC;AACrD,QAAM,QAAQ,eAAe;AAC7B,QAAM,WAAW,MAAM,mBAAmB;AAC1C,MAAI,eAAe,QAAQ,EAAG,QAAO;AACrC,QAAM,UAAU,mBAAmB;AACnC,QAAM,mBAAmB,IAAI;AAC7B,SAAO;AACT;AAEO,SAAS,2BAAiC;AAC/C,QAAM,QAAQ,eAAe;AAC7B,MAAI,uBAAuB,OAAO;AAChC,WAAO,MAAM,mBAAmB;AAAA,EAClC;AACF;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
parseYamlContent
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-X4TDNR4V.js";
|
|
4
4
|
|
|
5
5
|
// src/utils/deep-merge.ts
|
|
6
6
|
function deepMerge(target, ...sources) {
|
|
@@ -179,4 +179,4 @@ export {
|
|
|
179
179
|
parseMarkdownYamlFrontmatter,
|
|
180
180
|
applyDefaultToolChoice
|
|
181
181
|
};
|
|
182
|
-
//# sourceMappingURL=chunk-
|
|
182
|
+
//# sourceMappingURL=chunk-OTWARMTU.js.map
|
|
@@ -3,13 +3,13 @@ import {
|
|
|
3
3
|
asTrimmedString,
|
|
4
4
|
parseJsonObject,
|
|
5
5
|
shortToolName
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-OTWARMTU.js";
|
|
7
7
|
import {
|
|
8
8
|
AgentContextTokens
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-RQSSJFDP.js";
|
|
10
10
|
import {
|
|
11
11
|
getDefaultAgentContext
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-GQZFDM3S.js";
|
|
13
13
|
|
|
14
14
|
// src/events/progress-listener.ts
|
|
15
15
|
function formatElapsed(ms) {
|
|
@@ -291,13 +291,12 @@ function buildTreeLines(event, payload, currentRunThread, toolCalls) {
|
|
|
291
291
|
if (id) {
|
|
292
292
|
toolCalls.delete(id);
|
|
293
293
|
}
|
|
294
|
-
const fallbackToolName = event.name === "agent.runtime2.tool.call.blocked" ? to : from;
|
|
295
294
|
const icon = event.name === "agent.runtime2.tool.call.done" ? "OK" : event.name === "agent.runtime2.tool.call.blocked" ? "BLOCKED" : "ERROR";
|
|
296
295
|
const combined = compactFields([
|
|
297
|
-
summarizeToolArgs(remembered?.args
|
|
296
|
+
summarizeToolArgs(remembered?.args),
|
|
298
297
|
details
|
|
299
298
|
]);
|
|
300
|
-
return [`\u251C\u2500 ${icon} ${remembered?.toolName ??
|
|
299
|
+
return [`\u251C\u2500 ${icon} ${remembered?.toolName ?? from}${combined ? ` | ${combined}` : ""}`];
|
|
301
300
|
}
|
|
302
301
|
const prefix = currentRunThread ? "\u251C\u2500" : "\u2022";
|
|
303
302
|
return [`${prefix} ${from} -> ${to} | ${action}${suffix}`];
|
|
@@ -461,4 +460,4 @@ export {
|
|
|
461
460
|
createAgentEventBus,
|
|
462
461
|
createConsoleAgentEventListener
|
|
463
462
|
};
|
|
464
|
-
//# sourceMappingURL=chunk-
|
|
463
|
+
//# sourceMappingURL=chunk-P6CL7XSX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/events/progress-listener.ts","../src/events/runtime2-tree-listener.ts","../src/events/index.ts"],"sourcesContent":["import type { AgentEvent, AgentEventListener } from \"./index.js\";\nimport { asRecord, asTrimmedString, parseJsonObject, shortToolName } from \"../utils/index.js\";\n\ninterface ToolStep {\n action: string;\n startedAtMs: number;\n}\n\ninterface ProgressState {\n runStartedAtMs: number | null;\n startedSteps: number;\n completedSteps: number;\n currentStep: number;\n steps: Map<number, ToolStep>;\n pendingStepNumbers: number[];\n}\n\nexport interface ProgressEventListenerOptions {\n writer?: (line: string) => void;\n runLabelReact?: string;\n runLabelDeep?: string;\n reasonForAction?: (action: string) => string | null;\n}\n\nfunction formatElapsed(ms: number): string {\n return `${Math.max(0, Math.round(ms))}ms`;\n}\n\nfunction formatStepNumber(stepNumber: number): string {\n return String(Math.max(0, stepNumber)).padStart(2, \"0\");\n}\n\nfunction hasAny(record: Record<string, unknown>, keys: string[]): boolean {\n return keys.some((key) => key in record);\n}\n\nfunction summarizeAction(args: unknown, toolName: string, fallback: string): string {\n const record = asRecord(args) ?? parseJsonObject(args);\n if (!record) return fallback;\n const tool = shortToolName(toolName);\n const command = asTrimmedString(record.command);\n const path = asTrimmedString(record.path);\n const isListDirShape = hasAny(record, [\"maxEntries\", \"recursive\", \"maxDepth\", \"includeHidden\"]);\n const isReadTextShape = hasAny(record, [\"maxBytes\", \"startLine\", \"endLine\", \"encoding\"]);\n if (tool === \"runCommand\" && command) return `run command: ${command}`;\n if (tool.includes(\"itermRunCommandInSession\") && command) return `run command: ${command}`;\n if (tool === \"listDir\" || (Boolean(path) && isListDirShape)) {\n if (!path || path === \".\") return \"list directory\";\n return `list directory: ${path}`;\n }\n if (tool === \"readText\" || (Boolean(path) && isReadTextShape)) {\n if (!path) return \"read file\";\n return `read file: ${path}`;\n }\n if (command) return `run command: ${command}`;\n const query = asTrimmedString(record.query);\n if (query) return `search/query: ${query}`;\n if (path) return `read path: ${path}`;\n return fallback;\n}\n\nfunction getResultError(payload: unknown): string | null {\n const payloadRecord = asRecord(payload);\n const result = payloadRecord?.result;\n const resultRecord = asRecord(result) ?? parseJsonObject(result);\n const nestedResult = asRecord(resultRecord?.result);\n return asTrimmedString(nestedResult?.error) ?? asTrimmedString(resultRecord?.error);\n}\n\nfunction getResultPreview(payload: unknown): string | null {\n const payloadRecord = asRecord(payload);\n const directPreview = asTrimmedString(payloadRecord?.resultPreview);\n if (directPreview) return directPreview;\n\n const result = payloadRecord?.result;\n const resultRecord = asRecord(result) ?? parseJsonObject(result);\n const nestedResult = asRecord(resultRecord?.result);\n const preview =\n asTrimmedString(nestedResult?.outputText)\n ?? asTrimmedString(nestedResult?.output)\n ?? asTrimmedString(resultRecord?.output)\n ?? asTrimmedString(resultRecord?.outputText);\n return preview ? preview.replace(/\\s+/g, \" \").trim() : null;\n}\n\nfunction writeProgress(writer: (line: string) => void, state: ProgressState): void {\n writer(` progress ${state.completedSteps}/${state.startedSteps}`);\n}\n\nfunction onRunStart(writer: (line: string) => void, state: ProgressState, runLabelText: string): void {\n state.runStartedAtMs = Date.now();\n state.startedSteps = 0;\n state.completedSteps = 0;\n state.currentStep = 0;\n state.steps.clear();\n state.pendingStepNumbers = [];\n writer(\"\");\n writer(`=== Steps: ${runLabelText} ===`);\n writer(`[${formatStepNumber(0)}] ▶ understand request and plan next action`);\n}\n\nfunction onRunDone(writer: (line: string) => void, state: ProgressState): void {\n const elapsed = state.runStartedAtMs === null ? \"?\" : formatElapsed(Date.now() - state.runStartedAtMs);\n writer(`[${formatStepNumber(0)}] ✓ understand request and plan next action`);\n writeProgress(writer, state);\n writer(`=== Steps complete: ${state.completedSteps} step(s), ${elapsed} ===`);\n writer(\"\");\n}\n\nfunction onToolStart(\n writer: (line: string) => void,\n state: ProgressState,\n event: AgentEvent,\n reasonForAction?: (action: string) => string | null,\n): void {\n state.currentStep += 1;\n state.startedSteps += 1;\n const stepNumber = state.currentStep;\n const payload = asRecord(event.payload);\n const action = summarizeAction(payload?.args, event.to, `invoke tool: ${shortToolName(event.to)}`);\n state.steps.set(stepNumber, { action, startedAtMs: Date.now() });\n state.pendingStepNumbers.push(stepNumber);\n writer(`[${formatStepNumber(stepNumber)}] ▶ ${action}`);\n writer(` tool: ${shortToolName(event.to)}`);\n const reason = reasonForAction?.(action);\n if (reason) writer(` reason: ${reason}`);\n}\n\nfunction onToolDoneWithPayload(writer: (line: string) => void, state: ProgressState, event: AgentEvent): void {\n const stepNumber = state.pendingStepNumbers.shift() ?? state.currentStep;\n const step = state.steps.get(stepNumber);\n const error = getResultError(event.payload);\n const preview = getResultPreview(event.payload);\n const elapsed = step ? formatElapsed(Date.now() - step.startedAtMs) : \"?\";\n if (error) {\n writer(`[${formatStepNumber(stepNumber)}] ✖ ${step?.action ?? \"tool invocation\"}`);\n writer(` error: ${error}`);\n } else {\n writer(`[${formatStepNumber(stepNumber)}] ✓ ${step?.action ?? \"tool invocation\"} (${elapsed})`);\n if (preview) writer(` observation: ${preview}`);\n }\n state.steps.delete(stepNumber);\n state.completedSteps += 1;\n writeProgress(writer, state);\n}\n\nfunction onToolError(writer: (line: string) => void, state: ProgressState, event: AgentEvent): void {\n const stepNumber = state.pendingStepNumbers.shift() ?? state.currentStep;\n const step = state.steps.get(stepNumber);\n const payload = asRecord(event.payload);\n const error = asTrimmedString(payload?.error) ?? \"unknown error\";\n writer(`[${formatStepNumber(stepNumber)}] ✖ ${step?.action ?? \"tool invocation\"}`);\n writer(` error: ${error}`);\n state.steps.delete(stepNumber);\n state.completedSteps += 1;\n writeProgress(writer, state);\n}\n\nexport function createProgressAgentEventListener(options: ProgressEventListenerOptions = {}): AgentEventListener {\n const writer = options.writer ?? console.log;\n const runLabelReact = options.runLabelReact ?? \"analysis\";\n const runLabelDeep = options.runLabelDeep ?? \"deep analysis\";\n\n const state: ProgressState = {\n runStartedAtMs: null,\n startedSteps: 0,\n completedSteps: 0,\n currentStep: 0,\n steps: new Map(),\n pendingStepNumbers: [],\n };\n\n return (event: AgentEvent): void => {\n switch (event.name) {\n case \"agent.react.run.start\":\n onRunStart(writer, state, runLabelReact);\n return;\n case \"agent.deep.run.start\":\n onRunStart(writer, state, runLabelDeep);\n return;\n case \"agent.react.skill.matched\":\n case \"agent.deep.skill.matched\": {\n const payload = asRecord(event.payload);\n const skillName = asTrimmedString(payload?.skill) ?? \"unknown\";\n writer(` skill: ${skillName}`);\n return;\n }\n case \"agent.react.context.truncated\":\n case \"agent.deep.context.truncated\":\n writer(\" context: truncated and compacted\");\n return;\n case \"agent.react.tool.invoke.start\":\n onToolStart(writer, state, event, options.reasonForAction);\n return;\n case \"agent.react.tool.invoke.done\":\n onToolDoneWithPayload(writer, state, event);\n return;\n case \"agent.react.tool.invoke.error\":\n onToolError(writer, state, event);\n return;\n case \"agent.react.memory.write.start\":\n writer(\" memory: write started\");\n return;\n case \"agent.react.memory.write.done\":\n writer(\" memory: write completed\");\n return;\n case \"agent.react.memory.write.error\":\n writer(\" memory: write failed\");\n return;\n case \"agent.react.ptc.retry\": {\n const payload = asRecord(event.payload);\n const retry = payload?.retry;\n const reason = asTrimmedString(payload?.reason);\n writer(` planning retry: attempt ${String(retry ?? \"?\")}${reason ? `, reason=${reason}` : \"\"}`);\n return;\n }\n case \"agent.react.run.done\":\n case \"agent.deep.run.done\":\n onRunDone(writer, state);\n return;\n default:\n return;\n }\n };\n}\n","import type { AgentEvent, AgentEventListener } from \"./index.js\";\n\nexport interface Runtime2EventDebugConfig {\n run?: boolean;\n workspace?: boolean;\n toolCall?: boolean;\n stream?: boolean;\n close?: boolean;\n}\n\nexport interface Runtime2EventRuntimeConfig {\n debug?: Runtime2EventDebugConfig;\n eventLogLevel?: \"silent\" | \"lifecycle\" | \"tools\" | \"verbose\";\n}\n\nexport interface Runtime2TreeEventListenerOptions {\n runtimeConfig?: Runtime2EventRuntimeConfig;\n writer?: (line: string) => void;\n}\n\ninterface ResolvedDebugConfig {\n run: boolean;\n workspace: boolean;\n toolCall: boolean;\n stream: boolean;\n close: boolean;\n}\n\nexport function createRuntime2TreeEventListener(\n options: Runtime2TreeEventListenerOptions = {}\n): AgentEventListener {\n const writer = options.writer ?? console.error;\n const debugConfig = resolveRuntime2DebugConfig(options.runtimeConfig);\n let currentRunThread: string | null = null;\n const toolCalls = new Map<string, { toolName: string; args?: Record<string, unknown> }>();\n\n return (event: AgentEvent): void => {\n const payload = asRecord(event.payload);\n if (shouldSkipRuntime2Event(event.name, debugConfig)) {\n return;\n }\n\n const lines = buildTreeLines(event, payload, currentRunThread, toolCalls);\n if (event.name === \"agent.runtime2.run.start\") {\n currentRunThread = typeof payload?.threadId === \"string\" ? payload.threadId : null;\n toolCalls.clear();\n } else if (event.name === \"agent.runtime2.run.done\" || event.name === \"agent.runtime2.run.error\") {\n currentRunThread = null;\n toolCalls.clear();\n }\n\n for (const line of lines) {\n writer(line);\n }\n };\n}\n\nexport function resolveRuntime2DebugConfig(\n runtimeConfig?: Runtime2EventRuntimeConfig\n): ResolvedDebugConfig {\n if (runtimeConfig?.debug) {\n return {\n run: runtimeConfig.debug.run ?? true,\n workspace: runtimeConfig.debug.workspace ?? true,\n toolCall: runtimeConfig.debug.toolCall ?? true,\n stream: runtimeConfig.debug.stream ?? false,\n close: runtimeConfig.debug.close ?? true,\n };\n }\n\n switch (runtimeConfig?.eventLogLevel ?? \"tools\") {\n case \"silent\":\n return { run: false, workspace: false, toolCall: false, stream: false, close: false };\n case \"lifecycle\":\n return { run: true, workspace: true, toolCall: false, stream: false, close: true };\n case \"verbose\":\n return { run: true, workspace: true, toolCall: true, stream: true, close: true };\n case \"tools\":\n default:\n return { run: true, workspace: true, toolCall: true, stream: false, close: true };\n }\n}\n\nfunction shouldSkipRuntime2Event(name: string, debugConfig: ResolvedDebugConfig): boolean {\n if (name.startsWith(\"agent.runtime2.stream.\")) {\n return !debugConfig.stream;\n }\n if (name.startsWith(\"agent.runtime2.tool.call.\")) {\n return !debugConfig.toolCall;\n }\n if (name.startsWith(\"agent.runtime2.workspace.\")) {\n if (name === \"agent.runtime2.workspace.prepare\" || name === \"agent.runtime2.workspace.run.update\") {\n return true;\n }\n return !debugConfig.workspace;\n }\n if (name.startsWith(\"agent.runtime2.run.\")) {\n if (name === \"agent.runtime2.run.prepare\") {\n return true;\n }\n return !debugConfig.run;\n }\n if (name.startsWith(\"agent.runtime2.close.\")) {\n return !debugConfig.close;\n }\n return false;\n}\n\nfunction buildTreeLines(\n event: Pick<AgentEvent, \"name\" | \"from\" | \"to\">,\n payload: Record<string, unknown> | undefined,\n currentRunThread: string | null,\n toolCalls: Map<string, { toolName: string; args?: Record<string, unknown> }>,\n): string[] {\n const from = shortComponent(event.from);\n const to = shortComponent(event.to);\n const action = event.name.replace(/^agent\\.runtime2\\./, \"\");\n const details = summarizePayload(event.name, payload);\n const suffix = details ? ` | ${details}` : \"\";\n\n if (event.name === \"agent.runtime2.run.start\") {\n return [\n `run ${typeof payload?.threadId === \"string\" ? payload.threadId : \"\"}`.trim(),\n `├─ ${from} -> ${to} | ${action}${suffix}`,\n ];\n }\n\n if (event.name === \"agent.runtime2.run.done\" || event.name === \"agent.runtime2.run.error\") {\n return [`└─ ${from} -> ${to} | ${action}${suffix}`];\n }\n\n if (event.name === \"agent.runtime2.tool.call.start\") {\n const id = typeof payload?.toolCallId === \"string\" ? payload.toolCallId : \"\";\n if (id) {\n toolCalls.set(id, {\n toolName: to,\n args: asRecord(payload?.args),\n });\n }\n return [];\n }\n\n if (\n event.name === \"agent.runtime2.tool.call.done\"\n || event.name === \"agent.runtime2.tool.call.error\"\n || event.name === \"agent.runtime2.tool.call.blocked\"\n ) {\n const id = typeof payload?.toolCallId === \"string\" ? payload.toolCallId : \"\";\n const remembered = id ? toolCalls.get(id) : undefined;\n if (id) {\n toolCalls.delete(id);\n }\n const icon = event.name === \"agent.runtime2.tool.call.done\"\n ? \"OK\"\n : event.name === \"agent.runtime2.tool.call.blocked\"\n ? \"BLOCKED\"\n : \"ERROR\";\n const combined = compactFields([\n summarizeToolArgs(remembered?.args),\n details,\n ]);\n return [`├─ ${icon} ${remembered?.toolName ?? from}${combined ? ` | ${combined}` : \"\"}`];\n }\n\n const prefix = currentRunThread ? \"├─\" : \"•\";\n return [`${prefix} ${from} -> ${to} | ${action}${suffix}`];\n}\n\nfunction summarizePayload(name: string, payload?: Record<string, unknown>): string | null {\n switch (name) {\n case \"agent.runtime2.run.start\":\n return typeof payload?.threadId === \"string\" ? `thread=${payload.threadId}` : null;\n case \"agent.runtime2.run.done\":\n return compactFields([\n formatField(\"steps\", payload?.stepCount),\n formatDuration(payload?.durationMs),\n formatField(\"summary\", payload?.lastSummary),\n ]);\n case \"agent.runtime2.run.error\":\n return compactFields([\n formatField(\"summary\", payload?.lastSummary),\n formatField(\"error\", payload?.error),\n ]);\n case \"agent.runtime2.stream.summary\":\n return typeof payload?.summary === \"string\" ? payload.summary : null;\n case \"agent.runtime2.stream.heartbeat\":\n return formatDuration(payload?.elapsedMs);\n case \"agent.runtime2.tool.call.done\":\n case \"agent.runtime2.tool.call.error\":\n case \"agent.runtime2.tool.call.blocked\":\n return compactFields([\n formatDuration(payload?.durationMs),\n formatField(\"reason\", payload?.reason),\n formatField(\"error\", payload?.error),\n ]);\n case \"agent.runtime2.workspace.run.update\":\n case \"agent.runtime2.workspace.run.finish\":\n return compactFields([\n formatField(\"steps\", payload?.stepCount),\n formatField(\"summary\", payload?.lastSummary),\n formatField(\"status\", payload?.status),\n ]);\n case \"agent.runtime2.run.retry.empty\":\n case \"agent.runtime2.run.retry.incomplete\":\n case \"agent.runtime2.run.retry.idle_timeout\":\n case \"agent.runtime2.run.retry.transient_model\":\n case \"agent.runtime2.run.retry.tool_call\":\n return compactFields([\n formatField(\"attempt\", formatAttempt(payload?.attempt, payload?.maxRetries)),\n formatField(\"summary\", payload?.lastSummary),\n formatField(\"error\", payload?.error),\n ]);\n default:\n return compactFields([\n formatField(\"thread\", payload?.threadId),\n formatField(\"steps\", payload?.stepCount),\n formatField(\"status\", payload?.status),\n ]);\n }\n}\n\nfunction summarizeToolArgs(args: Record<string, unknown> | undefined): string | null {\n if (!args) {\n return null;\n }\n\n return compactFields([\n formatArg(\"path\", args.file_path ?? args.path),\n formatArg(\"query\", args.query),\n formatArg(\"symbol\", args.symbol),\n formatArg(\"ticker\", args.ticker),\n formatArg(\"command\", args.command),\n formatArg(\"subagent_type\", args.subagent_type),\n ]);\n}\n\nfunction formatArg(key: string, value: unknown): string | null {\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n return null;\n }\n const text = String(value).trim();\n if (!text) {\n return null;\n }\n return `${key}=${truncate(text, 80)}`;\n}\n\nfunction formatField(key: string, value: unknown): string | null {\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n return null;\n }\n const text = String(value).trim();\n if (!text) {\n return null;\n }\n return `${key}=${truncate(text, 80)}`;\n}\n\nfunction formatAttempt(attempt: unknown, maxRetries: unknown): string | null {\n if (typeof attempt !== \"number\") {\n return null;\n }\n return typeof maxRetries === \"number\" ? `${attempt}/${maxRetries}` : String(attempt);\n}\n\nfunction formatDuration(durationMs: unknown): string | null {\n if (typeof durationMs !== \"number\") {\n return null;\n }\n if (durationMs < 1_000) {\n return `elapsed=${Math.round(durationMs)}ms`;\n }\n if (durationMs < 10_000) {\n return `elapsed=${(durationMs / 1000).toFixed(2)}s`;\n }\n return `elapsed=${(durationMs / 1000).toFixed(1)}s`;\n}\n\nfunction shortComponent(value: string | undefined): string {\n return (value ?? \"?\").replace(/^agent-runtime2\\./, \"\");\n}\n\nfunction compactFields(fields: Array<string | null>): string | null {\n const items = fields.filter((field): field is string => Boolean(field));\n return items.length > 0 ? items.join(\", \") : null;\n}\n\nfunction truncate(value: string, maxLength: number): string {\n return value.length > maxLength ? `${value.slice(0, maxLength - 3)}...` : value;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined;\n}\n","import { getDefaultAgentContext, AgentContextTokens } from \"../context/index.js\";\n\nexport interface AgentEvent<TPayload = unknown> {\n id: string;\n name: string;\n from: string;\n to: string;\n at: string;\n payload?: TPayload;\n}\n\nexport interface AgentEventBus {\n publish<TPayload = unknown>(event: Omit<AgentEvent<TPayload>, \"id\" | \"at\">): AgentEvent<TPayload>;\n subscribe(listener: AgentEventListener): () => void;\n}\n\nexport type AgentEventListener = (event: AgentEvent) => void;\n\nclass DefaultAgentEventBus implements AgentEventBus {\n private listeners = new Set<AgentEventListener>();\n\n publish<TPayload = unknown>(\n event: Omit<AgentEvent<TPayload>, \"id\" | \"at\">\n ): AgentEvent<TPayload> {\n const resolved: AgentEvent<TPayload> = {\n ...event,\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`,\n at: new Date().toISOString(),\n };\n for (const listener of this.listeners) {\n try {\n listener(resolved);\n } catch {\n // Listener failures must not break agent runtime.\n }\n }\n return resolved;\n }\n\n subscribe(listener: AgentEventListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n}\n\nexport function createAgentEventBus(): AgentEventBus {\n const bus = new DefaultAgentEventBus();\n getDefaultAgentContext().set(AgentContextTokens.EventBus, bus);\n return bus;\n}\n\nexport function createConsoleAgentEventListener(\n writer: (line: string) => void = console.error\n): AgentEventListener {\n return (event) => {\n writer(`[${event.at}] ${event.from} -> ${event.to} ${event.name}`);\n };\n}\n\nexport {\n createProgressAgentEventListener,\n type ProgressEventListenerOptions,\n} from \"./progress-listener.js\";\nexport {\n createRuntime2TreeEventListener,\n resolveRuntime2DebugConfig,\n type Runtime2EventDebugConfig,\n type Runtime2EventRuntimeConfig,\n type Runtime2TreeEventListenerOptions,\n} from \"./runtime2-tree-listener.js\";\n"],"mappings":"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","names":["asRecord"]}
|
|
@@ -10,24 +10,24 @@ function createChecksummedToken(scope, name) {
|
|
|
10
10
|
}
|
|
11
11
|
var AgentContextTokens = {
|
|
12
12
|
/** The shared AgentEventBus instance */
|
|
13
|
-
EventBus: createChecksummedToken("
|
|
13
|
+
EventBus: createChecksummedToken("easynet.agent.context", "eventBus"),
|
|
14
14
|
/** The primary chat model (BaseChatModel) */
|
|
15
|
-
ChatModel: createChecksummedToken("
|
|
15
|
+
ChatModel: createChecksummedToken("easynet.agent.context", "chatModel"),
|
|
16
16
|
/** The embedding model (Embeddings) */
|
|
17
|
-
EmbedModel: createChecksummedToken("
|
|
17
|
+
EmbedModel: createChecksummedToken("easynet.agent.context", "embedModel"),
|
|
18
18
|
/** The vision-language chat model (BaseChatModel) */
|
|
19
|
-
VlmModel: createChecksummedToken("
|
|
19
|
+
VlmModel: createChecksummedToken("easynet.agent.context", "vlmModel"),
|
|
20
20
|
/** The memory client (AgentMemory) */
|
|
21
|
-
Memory: createChecksummedToken("
|
|
21
|
+
Memory: createChecksummedToken("easynet.agent.context", "memory"),
|
|
22
22
|
/** The initialized tool list */
|
|
23
|
-
Tools: createChecksummedToken("
|
|
23
|
+
Tools: createChecksummedToken("easynet.agent.context", "tools"),
|
|
24
24
|
/** The loaded skill set (SkillSet | undefined) */
|
|
25
|
-
SkillSet: createChecksummedToken("
|
|
25
|
+
SkillSet: createChecksummedToken("easynet.agent.context", "skillSet"),
|
|
26
26
|
/** The initialized agent runtime instance (react/deep) */
|
|
27
|
-
Runtime: createChecksummedToken("
|
|
27
|
+
Runtime: createChecksummedToken("easynet.agent.context", "runtime")
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
export {
|
|
31
31
|
AgentContextTokens
|
|
32
32
|
};
|
|
33
|
-
//# sourceMappingURL=chunk-
|
|
33
|
+
//# sourceMappingURL=chunk-RQSSJFDP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context/tokens.ts"],"sourcesContent":["import { computeChecksum } from \"../utils/checksum.js\";\n\nfunction createChecksummedToken(scope: string, name: string): symbol {\n const seed = `${scope}:${name}`;\n const checksum = computeChecksum(seed, { length: 12 });\n return Symbol.for(`${scope}.${name}.${checksum}`);\n}\n\n/**\n * Well-known Symbol tokens for AgentContext.\n * Use these to register and retrieve modules from an AgentContext.\n *\n * @example\n * ```ts\n * ctx.set(AgentContextTokens.ChatModel, llm);\n * const llm = ctx.get<BaseChatModel>(AgentContextTokens.ChatModel);\n * ```\n */\nexport const AgentContextTokens = {\n /** The shared AgentEventBus instance */\n EventBus: createChecksummedToken(\"easynet.agent.context\", \"eventBus\"),\n /** The primary chat model (BaseChatModel) */\n ChatModel: createChecksummedToken(\"easynet.agent.context\", \"chatModel\"),\n /** The embedding model (Embeddings) */\n EmbedModel: createChecksummedToken(\"easynet.agent.context\", \"embedModel\"),\n /** The vision-language chat model (BaseChatModel) */\n VlmModel: createChecksummedToken(\"easynet.agent.context\", \"vlmModel\"),\n /** The memory client (AgentMemory) */\n Memory: createChecksummedToken(\"easynet.agent.context\", \"memory\"),\n /** The initialized tool list */\n Tools: createChecksummedToken(\"easynet.agent.context\", \"tools\"),\n /** The loaded skill set (SkillSet | undefined) */\n SkillSet: createChecksummedToken(\"easynet.agent.context\", \"skillSet\"),\n /** The initialized agent runtime instance (react/deep) */\n Runtime: createChecksummedToken(\"easynet.agent.context\", \"runtime\"),\n} as const;\n\nexport type AgentContextTokenKey = (typeof AgentContextTokens)[keyof typeof AgentContextTokens];\n"],"mappings":";;;;;AAEA,SAAS,uBAAuB,OAAe,MAAsB;AACnE,QAAM,OAAO,GAAG,KAAK,IAAI,IAAI;AAC7B,QAAM,WAAW,gBAAgB,MAAM,EAAE,QAAQ,GAAG,CAAC;AACrD,SAAO,uBAAO,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,QAAQ,EAAE;AAClD;AAYO,IAAM,qBAAqB;AAAA;AAAA,EAEhC,UAAU,uBAAuB,yBAAyB,UAAU;AAAA;AAAA,EAEpE,WAAW,uBAAuB,yBAAyB,WAAW;AAAA;AAAA,EAEtE,YAAY,uBAAuB,yBAAyB,YAAY;AAAA;AAAA,EAExE,UAAU,uBAAuB,yBAAyB,UAAU;AAAA;AAAA,EAEpE,QAAQ,uBAAuB,yBAAyB,QAAQ;AAAA;AAAA,EAEhE,OAAO,uBAAuB,yBAAyB,OAAO;AAAA;AAAA,EAE9D,UAAU,uBAAuB,yBAAyB,UAAU;AAAA;AAAA,EAEpE,SAAS,uBAAuB,yBAAyB,SAAS;AACpE;","names":[]}
|
|
@@ -67,50 +67,46 @@ function parseYamlContent(content, options = {}) {
|
|
|
67
67
|
missingEnv: options.missingEnv ?? "keep"
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
|
-
function
|
|
71
|
-
const mtime = fileStat.mtimeNs ?? (typeof fileStat.mtimeMs === "bigint" ? fileStat.mtimeMs : BigInt(Math.trunc(fileStat.mtimeMs * 1e6)));
|
|
72
|
-
return `${mtime}:${fileStat.size.toString()}`;
|
|
73
|
-
}
|
|
74
|
-
function readFromCache(filePath, version) {
|
|
70
|
+
function readFromCache(filePath, mtimeMs) {
|
|
75
71
|
const cached = YAML_CACHE.get(filePath);
|
|
76
72
|
if (!cached) return void 0;
|
|
77
|
-
if (cached.
|
|
73
|
+
if (cached.mtimeMs !== mtimeMs) return void 0;
|
|
78
74
|
return cached.value;
|
|
79
75
|
}
|
|
80
|
-
function writeCache(filePath,
|
|
81
|
-
YAML_CACHE.set(filePath, {
|
|
76
|
+
function writeCache(filePath, mtimeMs, value) {
|
|
77
|
+
YAML_CACHE.set(filePath, { mtimeMs, value });
|
|
82
78
|
}
|
|
83
79
|
function loadYamlFileSync(filePath, options = {}) {
|
|
84
80
|
const absPath = path2.resolve(filePath);
|
|
85
81
|
if (!existsSync(absPath)) return void 0;
|
|
86
82
|
const useCache = options.cache === true;
|
|
87
|
-
const fileStat = statSync(absPath
|
|
83
|
+
const fileStat = statSync(absPath);
|
|
88
84
|
if (useCache) {
|
|
89
|
-
const cached = readFromCache(absPath,
|
|
85
|
+
const cached = readFromCache(absPath, fileStat.mtimeMs);
|
|
90
86
|
if (cached !== void 0) return cached;
|
|
91
87
|
}
|
|
92
88
|
const content = readFileSync(absPath, "utf-8");
|
|
93
89
|
const parsed = parseYamlContent(content, options);
|
|
94
|
-
if (useCache) writeCache(absPath,
|
|
90
|
+
if (useCache) writeCache(absPath, fileStat.mtimeMs, parsed);
|
|
95
91
|
return parsed;
|
|
96
92
|
}
|
|
97
93
|
async function loadYamlFile(filePath, options = {}) {
|
|
98
94
|
const absPath = path2.resolve(filePath);
|
|
99
95
|
let fileStat;
|
|
100
96
|
try {
|
|
101
|
-
fileStat = await stat(absPath
|
|
97
|
+
fileStat = await stat(absPath);
|
|
102
98
|
} catch (err) {
|
|
103
99
|
if (err?.code === "ENOENT") return void 0;
|
|
104
100
|
throw err;
|
|
105
101
|
}
|
|
106
102
|
const useCache = options.cache === true;
|
|
107
103
|
if (useCache) {
|
|
108
|
-
const cached = readFromCache(absPath,
|
|
104
|
+
const cached = readFromCache(absPath, fileStat.mtimeMs);
|
|
109
105
|
if (cached !== void 0) return cached;
|
|
110
106
|
}
|
|
111
107
|
const content = await readFile(absPath, "utf-8");
|
|
112
108
|
const parsed = parseYamlContent(content, options);
|
|
113
|
-
if (useCache) writeCache(absPath,
|
|
109
|
+
if (useCache) writeCache(absPath, fileStat.mtimeMs, parsed);
|
|
114
110
|
return parsed;
|
|
115
111
|
}
|
|
116
112
|
|
|
@@ -207,4 +203,4 @@ export {
|
|
|
207
203
|
isRefNode,
|
|
208
204
|
resolveKindResourceFile
|
|
209
205
|
};
|
|
210
|
-
//# sourceMappingURL=chunk-
|
|
206
|
+
//# sourceMappingURL=chunk-X4TDNR4V.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/yaml.ts","../src/config/path.ts","../src/config/kind.ts"],"sourcesContent":["import { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { resolveConfigPath } from \"./path.js\";\n\nexport interface YamlEnvOptions {\n substituteEnv?: boolean;\n missingEnv?: \"keep\" | \"empty\";\n env?: NodeJS.ProcessEnv;\n}\n\nexport interface LoadYamlOptions extends YamlEnvOptions {\n cache?: boolean;\n}\n\nexport interface LoadModuleConfigOptions<TConfig, TRaw = Record<string, unknown>> {\n path?: string;\n defaultPath?: string;\n appRoot?: string;\n yaml?: LoadYamlOptions;\n unwrapSpec?: boolean;\n fallback: TConfig;\n normalize?: (raw: TRaw, meta: { resolvedPath: string }) => TConfig;\n}\n\ninterface CacheEntry {\n mtimeMs: number;\n value: unknown;\n}\n\nconst YAML_CACHE = new Map<string, CacheEntry>();\n\nexport function clearYamlFileCache(): void {\n YAML_CACHE.clear();\n}\n\nfunction substituteEnvInString(\n input: string,\n env: NodeJS.ProcessEnv,\n missingEnv: \"keep\" | \"empty\",\n): string {\n return input.replace(/\\$\\{(\\w+)\\}/g, (_, name: string) => {\n const value = env[name];\n if (value !== undefined) return value;\n return missingEnv === \"empty\" ? \"\" : `\\${${name}}`;\n });\n}\n\nfunction substituteEnvInValue(\n input: unknown,\n options: { env: NodeJS.ProcessEnv; missingEnv: \"keep\" | \"empty\" },\n): unknown {\n if (typeof input === \"string\") {\n return substituteEnvInString(input, options.env, options.missingEnv);\n }\n if (Array.isArray(input)) {\n return input.map((item) => substituteEnvInValue(item, options));\n }\n if (input && typeof input === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(input)) {\n out[k] = substituteEnvInValue(v, options);\n }\n return out;\n }\n return input;\n}\n\nexport function parseYamlContent<T = unknown>(\n content: string,\n options: YamlEnvOptions = {},\n): T {\n const parsed = parseYaml(content) as unknown;\n if (options.substituteEnv === false) return parsed as T;\n return substituteEnvInValue(parsed, {\n env: options.env ?? process.env,\n missingEnv: options.missingEnv ?? \"keep\",\n }) as T;\n}\n\nfunction readFromCache(filePath: string, mtimeMs: number): unknown | undefined {\n const cached = YAML_CACHE.get(filePath);\n if (!cached) return undefined;\n if (cached.mtimeMs !== mtimeMs) return undefined;\n return cached.value;\n}\n\nfunction writeCache(filePath: string, mtimeMs: number, value: unknown): void {\n YAML_CACHE.set(filePath, { mtimeMs, value });\n}\n\nexport function loadYamlFileSync<T = unknown>(\n filePath: string,\n options: LoadYamlOptions = {},\n): T | undefined {\n const absPath = path.resolve(filePath);\n if (!existsSync(absPath)) return undefined;\n const useCache = options.cache === true;\n const fileStat = statSync(absPath);\n if (useCache) {\n const cached = readFromCache(absPath, fileStat.mtimeMs);\n if (cached !== undefined) return cached as T;\n }\n const content = readFileSync(absPath, \"utf-8\");\n const parsed = parseYamlContent<T>(content, options);\n if (useCache) writeCache(absPath, fileStat.mtimeMs, parsed);\n return parsed;\n}\n\nexport async function loadYamlFile<T = unknown>(\n filePath: string,\n options: LoadYamlOptions = {},\n): Promise<T | undefined> {\n const absPath = path.resolve(filePath);\n let fileStat;\n try {\n fileStat = await stat(absPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === \"ENOENT\") return undefined;\n throw err;\n }\n const useCache = options.cache === true;\n if (useCache) {\n const cached = readFromCache(absPath, fileStat.mtimeMs);\n if (cached !== undefined) return cached as T;\n }\n const content = await readFile(absPath, \"utf-8\");\n const parsed = parseYamlContent<T>(content, options);\n if (useCache) writeCache(absPath, fileStat.mtimeMs, parsed);\n return parsed;\n}\n\nexport async function loadYamlObject(\n filePath: string,\n options: LoadYamlOptions = {},\n): Promise<Record<string, unknown>> {\n const parsed = await loadYamlFile<unknown>(filePath, options);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return {};\n}\n\n/**\n * Generic module config loader:\n * 1) resolve path (path || defaultPath) relative to appRoot\n * 2) load YAML as object\n * 3) normalize into module-owned config interface\n * 4) fallback when missing/invalid\n */\nexport async function loadModuleConfig<TConfig, TRaw = Record<string, unknown>>(\n options: LoadModuleConfigOptions<TConfig, TRaw>,\n): Promise<TConfig> {\n const selected = options.path ?? options.defaultPath;\n if (!selected) return options.fallback;\n\n const appRoot = options.appRoot ?? process.cwd();\n const resolvedPath = resolveConfigPath(selected, appRoot);\n const loaded = await loadYamlFile<unknown>(resolvedPath, options.yaml);\n if (!loaded || typeof loaded !== \"object\" || Array.isArray(loaded)) return options.fallback;\n const raw = options.unwrapSpec === true\n ? (\n typeof (loaded as { spec?: unknown }).spec === \"object\" &&\n (loaded as { spec?: unknown }).spec !== null &&\n !Array.isArray((loaded as { spec?: unknown }).spec)\n ? (loaded as { spec: unknown }).spec\n : loaded\n )\n : loaded;\n\n if (options.normalize) {\n return options.normalize(raw as TRaw, { resolvedPath });\n }\n return raw as TConfig;\n}\n","import path from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport interface ResolveConfigPathOptions {\n expandHome?: boolean;\n homeDir?: string;\n}\n\nexport type PathRef = { ref?: string };\n\nexport function isPathRef(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length > 0 &&\n (value.endsWith(\".yaml\") || value.endsWith(\".yml\"))\n );\n}\n\nexport function expandHomePath(inputPath: string, options: { homeDir?: string } = {}): string {\n const home = options.homeDir ?? homedir();\n if (inputPath === \"~\") return home;\n if (inputPath.startsWith(\"~/\")) return path.join(home, inputPath.slice(2));\n return inputPath;\n}\n\nexport function resolveConfigPath(\n pathRef: string,\n configDir: string,\n options: ResolveConfigPathOptions = {},\n): string {\n const expanded = options.expandHome === false ? pathRef : expandHomePath(pathRef, { homeDir: options.homeDir });\n return path.resolve(configDir, expanded);\n}\n\nexport function asObject(input: unknown): Record<string, unknown> | undefined {\n return typeof input === \"object\" && input !== null ? (input as Record<string, unknown>) : undefined;\n}\n\nexport function toPathRef(input: unknown): PathRef | undefined {\n if (typeof input === \"string\" && input.trim().length > 0) return { ref: input.trim() };\n const obj = asObject(input);\n if (!obj) return undefined;\n const value =\n (typeof (obj as { __filePath?: unknown }).__filePath === \"string\" &&\n (obj as { __filePath: string }).__filePath.trim().length > 0\n ? (obj as { __filePath: string }).__filePath.trim()\n : undefined) ??\n (typeof obj.ref === \"string\" && obj.ref.trim().length > 0 ? obj.ref.trim() : undefined);\n return value ? { ref: value } : undefined;\n}\n","import { dirname } from \"node:path\";\nimport { loadYamlFile, type LoadYamlOptions } from \"./yaml.js\";\nimport { asObject, resolveConfigPath } from \"./path.js\";\n\nexport interface ResourceMetadata {\n name?: string;\n labels?: Record<string, string>;\n}\n\nexport interface ResourceHeader {\n apiVersion: string;\n kind: string;\n metadata?: ResourceMetadata;\n spec: unknown;\n}\n\nexport type RefNode = { ref: string };\n\nexport type ResolvedResource<TSpec = unknown> = ResourceHeader & {\n spec: TSpec;\n __filePath: string;\n};\n\nexport interface ResolveKindResourceOptions {\n baseDir?: string;\n maxDepth?: number;\n cache?: boolean;\n yaml?: LoadYamlOptions;\n expectedKind?: string;\n expectedApiVersion?: string;\n}\n\nfunction toResourceHeader(input: unknown): ResourceHeader {\n const obj = asObject(input);\n if (!obj) throw new Error(\"Invalid config document: expected object root\");\n\n const apiVersion = typeof obj.apiVersion === \"string\" ? obj.apiVersion.trim() : \"\";\n const kind = typeof obj.kind === \"string\" ? obj.kind.trim() : \"\";\n const spec = (obj as { spec?: unknown }).spec;\n if (!apiVersion) throw new Error(\"Invalid config document: missing apiVersion\");\n if (!kind) throw new Error(\"Invalid config document: missing kind\");\n if (spec === undefined) throw new Error(\"Invalid config document: missing spec\");\n const metadataRaw = asObject(obj.metadata);\n const metadata: ResourceMetadata | undefined = metadataRaw\n ? {\n name: typeof metadataRaw.name === \"string\" ? metadataRaw.name : undefined,\n labels:\n metadataRaw.labels && typeof metadataRaw.labels === \"object\" && !Array.isArray(metadataRaw.labels)\n ? (metadataRaw.labels as Record<string, string>)\n : undefined,\n }\n : undefined;\n return { apiVersion, kind, metadata, spec };\n}\n\nexport function isRefNode(input: unknown): input is RefNode {\n const obj = asObject(input);\n return !!obj && typeof obj.ref === \"string\" && obj.ref.trim().length > 0;\n}\n\nexport async function resolveKindResourceFile<TSpec = unknown>(\n entryFile: string,\n options: ResolveKindResourceOptions = {},\n): Promise<ResolvedResource<TSpec>> {\n const baseDir = options.baseDir ?? process.cwd();\n const entryAbs = resolveConfigPath(entryFile, baseDir);\n const maxDepth = options.maxDepth ?? 50;\n const cache = new Map<string, ResolvedResource>();\n const visiting = new Set<string>();\n\n const resolveNode = async (node: unknown, currentDir: string, depth: number): Promise<unknown> => {\n if (depth > maxDepth) throw new Error(`Config ref resolution exceeded maxDepth=${maxDepth}`);\n if (isRefNode(node)) {\n const next = resolveConfigPath(node.ref, currentDir);\n return loadResource(next, depth + 1);\n }\n if (Array.isArray(node)) {\n return Promise.all(node.map((item) => resolveNode(item, currentDir, depth + 1)));\n }\n const obj = asObject(node);\n if (!obj) return node;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n out[k] = await resolveNode(v, currentDir, depth + 1);\n }\n return out;\n };\n\n const loadResource = async (absPath: string, depth: number): Promise<ResolvedResource> => {\n if (depth > maxDepth) throw new Error(`Config ref resolution exceeded maxDepth=${maxDepth}`);\n if (options.cache !== false) {\n const cached = cache.get(absPath);\n if (cached) return cached;\n }\n if (visiting.has(absPath)) {\n throw new Error(`Config ref cycle detected at: ${absPath}`);\n }\n visiting.add(absPath);\n try {\n const raw = await loadYamlFile(absPath, options.yaml);\n const header = toResourceHeader(raw);\n if (options.expectedApiVersion && header.apiVersion !== options.expectedApiVersion) {\n throw new Error(`Unexpected apiVersion \"${header.apiVersion}\" at ${absPath}`);\n }\n const resolvedSpec = await resolveNode(header.spec, dirname(absPath), depth + 1);\n const resolved: ResolvedResource = {\n ...header,\n spec: resolvedSpec,\n __filePath: absPath,\n };\n if (options.cache !== false) cache.set(absPath, resolved);\n return resolved;\n } finally {\n visiting.delete(absPath);\n }\n };\n\n const root = await loadResource(entryAbs, 0);\n if (options.expectedKind && root.kind !== options.expectedKind) {\n throw new Error(`Expected kind \"${options.expectedKind}\" but got \"${root.kind}\" at ${root.__filePath}`);\n }\n return root as ResolvedResource<TSpec>;\n}\n"],"mappings":"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","names":["path","path"]}
|
package/dist/config/index.js
CHANGED
package/dist/context/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AgentContextTokens
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-RQSSJFDP.js";
|
|
4
4
|
import {
|
|
5
5
|
createAgentContext,
|
|
6
6
|
getDefaultAgentContext,
|
|
7
7
|
isAgentContext
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-GQZFDM3S.js";
|
|
9
9
|
import "../chunk-QG6CT2GZ.js";
|
|
10
10
|
export {
|
|
11
11
|
AgentContextTokens,
|
package/dist/events/index.js
CHANGED
|
@@ -4,11 +4,11 @@ import {
|
|
|
4
4
|
createProgressAgentEventListener,
|
|
5
5
|
createRuntime2TreeEventListener,
|
|
6
6
|
resolveRuntime2DebugConfig
|
|
7
|
-
} from "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
7
|
+
} from "../chunk-P6CL7XSX.js";
|
|
8
|
+
import "../chunk-OTWARMTU.js";
|
|
9
|
+
import "../chunk-X4TDNR4V.js";
|
|
10
|
+
import "../chunk-RQSSJFDP.js";
|
|
11
|
+
import "../chunk-GQZFDM3S.js";
|
|
12
12
|
import "../chunk-QG6CT2GZ.js";
|
|
13
13
|
export {
|
|
14
14
|
createAgentEventBus,
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
createConsoleAgentEventListener,
|
|
10
10
|
createProgressAgentEventListener,
|
|
11
11
|
createRuntime2TreeEventListener
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-P6CL7XSX.js";
|
|
13
13
|
import {
|
|
14
14
|
asRecord,
|
|
15
15
|
extractTextFromLlmOutput,
|
|
@@ -17,15 +17,15 @@ import {
|
|
|
17
17
|
shortToolName,
|
|
18
18
|
stripNullishObjectFields,
|
|
19
19
|
summarizeForLog
|
|
20
|
-
} from "./chunk-
|
|
21
|
-
import "./chunk-
|
|
20
|
+
} from "./chunk-OTWARMTU.js";
|
|
21
|
+
import "./chunk-X4TDNR4V.js";
|
|
22
22
|
import {
|
|
23
23
|
AgentContextTokens
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-RQSSJFDP.js";
|
|
25
25
|
import {
|
|
26
26
|
createAgentContext,
|
|
27
27
|
getDefaultAgentContext
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-GQZFDM3S.js";
|
|
29
29
|
import "./chunk-QG6CT2GZ.js";
|
|
30
30
|
export {
|
|
31
31
|
AgentContextTokens,
|
|
@@ -15,7 +15,7 @@ function sanitizeServiceName(service) {
|
|
|
15
15
|
return service.replace(/[^A-Za-z0-9._-]+/g, "_");
|
|
16
16
|
}
|
|
17
17
|
function defaultFileStorePath(service = "default") {
|
|
18
|
-
return path.join(homedir(), ".
|
|
18
|
+
return path.join(homedir(), ".easynet", "secret-store", `${sanitizeServiceName(service)}.json`);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
// src/security-store/backends/file/index.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/security-store/store.ts","../../src/security-store/backends/file/index.ts","../../src/security-store/backends/utils.ts","../../src/security-store/backends/keychain/index.ts","../../src/security-store/backends/keychain/constants.ts","../../src/security-store/backends/keychain/keytar.ts","../../src/security-store/backends/keychain/utils.ts","../../src/security-store/backends/keychain/swift-bridge.ts","../../src/security-store/backends/memory/index.ts","../../src/security-store/backends/index.ts"],"sourcesContent":["import crypto from \"node:crypto\";\nimport {\n MASTER_KEY_LENGTH,\n createSecretStoreBackend,\n type BiometricPolicy,\n type SecretStoreBackend,\n type SecretStoreBackendName,\n} from \"./backends/index.js\";\n\nconst PREFIX = \"enc:v1:\";\nconst NONCE_LENGTH = 12;\nconst TAG_LENGTH = 16;\n\nfunction decodeBase64Strict(input: string): Buffer {\n const trimmed = input.trim();\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(trimmed) || trimmed.length % 4 !== 0) {\n throw new Error(\"Invalid base64 in encrypted payload\");\n }\n const decoded = Buffer.from(trimmed, \"base64\");\n if (decoded.toString(\"base64\") !== trimmed) {\n throw new Error(\"Invalid base64 in encrypted payload\");\n }\n return decoded;\n}\n\nfunction assertNonEmpty(value: string, field: string): string {\n const normalized = value.trim();\n if (normalized.length === 0) {\n throw new Error(`${field} must be a non-empty string.`);\n }\n return normalized;\n}\n\nexport interface CryptoManagerKeyStore {\n init?(): Promise<void>;\n get(): Promise<Buffer | null>;\n set(key: Buffer): Promise<void>;\n}\n\nexport interface CryptoManagerOptions {\n service: string;\n account: string;\n allowPlaintextFallback?: boolean;\n masterKey?: Buffer;\n masterKeyStore?: CryptoManagerKeyStore;\n}\n\nexport class CryptoManager {\n private readonly allowPlaintextFallback: boolean;\n private readonly masterKeyStore: CryptoManagerKeyStore | null;\n private masterKey: Buffer | null = null;\n\n constructor(options: CryptoManagerOptions) {\n this.allowPlaintextFallback = options.allowPlaintextFallback !== false;\n this.masterKeyStore = options.masterKeyStore ?? null;\n if (options.masterKey != null) {\n if (options.masterKey.length !== MASTER_KEY_LENGTH) {\n throw new Error(\n `masterKey must be ${MASTER_KEY_LENGTH} bytes, got ${options.masterKey.length}`,\n );\n }\n this.masterKey = Buffer.from(options.masterKey);\n }\n }\n\n async init(): Promise<void> {\n if (this.masterKey != null && this.masterKey.length === MASTER_KEY_LENGTH) return;\n if (this.masterKeyStore == null) {\n throw new Error(\"CryptoManager requires either masterKey or masterKeyStore.\");\n }\n if (this.masterKeyStore.init) await this.masterKeyStore.init();\n let key = await this.masterKeyStore.get();\n if (key != null) {\n this.masterKey = key;\n return;\n }\n const newKey = crypto.randomBytes(MASTER_KEY_LENGTH);\n await this.masterKeyStore.set(newKey);\n key = await this.masterKeyStore.get();\n if (key == null || key.length !== MASTER_KEY_LENGTH) {\n throw new Error(\"Master key write succeeded but readback failed.\");\n }\n this.masterKey = key;\n }\n\n encrypt(plainText: string): string {\n if (this.masterKey == null) {\n throw new Error(\"CryptoManager not initialized. Call init() first.\");\n }\n const nonce = crypto.randomBytes(NONCE_LENGTH);\n const cipher = crypto.createCipheriv(\"aes-256-gcm\", this.masterKey, nonce);\n const enc = Buffer.concat([cipher.update(plainText, \"utf8\"), cipher.final()]);\n const tag = cipher.getAuthTag();\n const payload = Buffer.concat([nonce, tag, enc]);\n return PREFIX + payload.toString(\"base64\");\n }\n\n decrypt(cipherText: string): string {\n if (this.masterKey == null) {\n throw new Error(\"CryptoManager not initialized. Call init() first.\");\n }\n if (!cipherText.startsWith(PREFIX)) {\n if (this.allowPlaintextFallback) return cipherText;\n throw new Error(\"Input is not an encrypted string (missing enc:v1: prefix)\");\n }\n const payload = decodeBase64Strict(cipherText.slice(PREFIX.length));\n if (payload.length < NONCE_LENGTH + TAG_LENGTH) {\n throw new Error(\"Encrypted payload too short\");\n }\n const nonce = payload.subarray(0, NONCE_LENGTH);\n const tag = payload.subarray(NONCE_LENGTH, NONCE_LENGTH + TAG_LENGTH);\n const ciphertext = payload.subarray(NONCE_LENGTH + TAG_LENGTH);\n const decipher = crypto.createDecipheriv(\"aes-256-gcm\", this.masterKey, nonce);\n decipher.setAuthTag(tag);\n return decipher.update(ciphertext, undefined, \"utf8\") + decipher.final(\"utf8\");\n }\n\n static isEncrypted(value: string): boolean {\n return value.startsWith(PREFIX);\n }\n}\n\nexport interface SecretStoreOptions {\n service: string;\n appBinPath?: string;\n appleDeveloperTeamId?: string | null;\n biometric?: BiometricPolicy;\n prompt?: string;\n masterAccount?: string;\n dataService?: string;\n backend?: SecretStoreBackendName | SecretStoreBackend;\n masterKey?: Buffer;\n}\n\nexport class SecretStore {\n private readonly manager: CryptoManager;\n private readonly dataService: string;\n private readonly backend: SecretStoreBackend;\n private readonly initializeBackend: () => Promise<void>;\n private initialized = false;\n private initializing: Promise<void> | null = null;\n\n constructor(options: SecretStoreOptions) {\n const service = assertNonEmpty(options.service, \"service\");\n const masterAccount = options.masterAccount?.trim() || \"master-key\";\n this.dataService = options.dataService?.trim() || `${service}.data`;\n this.backend = createSecretStoreBackend(options.backend, { service });\n const backend = this.backend;\n let backendInitPromise: Promise<void> | null = null;\n this.initializeBackend = async () => {\n if (!backend.init) return;\n if (!backendInitPromise) backendInitPromise = backend.init();\n await backendInitPromise;\n };\n const backendContext = {\n service,\n account: masterAccount,\n appBinPath: options.appBinPath,\n appleDeveloperTeamId: options.appleDeveloperTeamId,\n biometric: options.biometric,\n prompt: options.prompt,\n };\n this.manager = new CryptoManager({\n service,\n account: masterAccount,\n allowPlaintextFallback: true,\n masterKey: options.masterKey,\n masterKeyStore: options.masterKey\n ? undefined\n : {\n init: this.initializeBackend,\n get: async () => {\n if (!backend.getMasterKey) {\n throw new Error(\n \"Secret store backend does not support master key storage. Pass masterKey or implement getMasterKey/setMasterKey.\",\n );\n }\n return backend.getMasterKey(backendContext);\n },\n set: async (key: Buffer) => {\n if (!backend.setMasterKey) {\n throw new Error(\n \"Secret store backend does not support master key storage. Pass masterKey or implement getMasterKey/setMasterKey.\",\n );\n }\n await backend.setMasterKey(backendContext, key);\n },\n },\n });\n }\n\n async init(): Promise<void> {\n if (this.initialized) return;\n if (this.initializing) {\n await this.initializing;\n return;\n }\n this.initializing = (async () => {\n await this.initializeBackend();\n await this.manager.init();\n this.initialized = true;\n })();\n try {\n await this.initializing;\n } finally {\n this.initializing = null;\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n await this.ensureInitialized();\n const account = assertNonEmpty(key, \"key\");\n const ciphertext = this.manager.encrypt(value);\n await this.backend.setSecret(this.dataService, account, ciphertext);\n }\n\n async get(key: string): Promise<string | undefined> {\n await this.ensureInitialized();\n const account = assertNonEmpty(key, \"key\");\n const ciphertext = await this.backend.getSecret(this.dataService, account);\n if (!ciphertext) return undefined;\n return this.manager.decrypt(ciphertext);\n }\n\n async delete(key: string): Promise<boolean> {\n await this.ensureInitialized();\n const account = assertNonEmpty(key, \"key\");\n return this.backend.deleteSecret(this.dataService, account);\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n await this.init();\n }\n}\n\nexport async function createSecretStore(options: SecretStoreOptions): Promise<SecretStore> {\n const store = new SecretStore(options);\n await store.init();\n return store;\n}\n","import { chmod, mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { buildEntryKey, defaultFileStorePath } from \"../utils.js\";\nimport {\n type FileSecretStoreBackendOptions,\n type SecretStoreBackend,\n type SecretStoreBackendContext,\n} from \"../types.js\";\n\nconst FILE_STORE_VERSION = 1;\n\ninterface FileSecretStoreData {\n version: number;\n secrets: Record<string, string>;\n masterKeys: Record<string, string>;\n}\n\nfunction emptyFileStoreData(): FileSecretStoreData {\n return { version: FILE_STORE_VERSION, secrets: {}, masterKeys: {} };\n}\n\nexport class FileSecretStoreBackend implements SecretStoreBackend {\n private readonly filePath: string;\n private data: FileSecretStoreData | null = null;\n private loading: Promise<void> | null = null;\n private writeQueue = Promise.resolve();\n\n constructor(options: FileSecretStoreBackendOptions = {}) {\n this.filePath = options.filePath?.trim() || defaultFileStorePath(options.service);\n }\n\n async init(): Promise<void> {\n await this.ensureLoaded();\n }\n\n async getSecret(service: string, account: string): Promise<string | undefined> {\n await this.ensureLoaded();\n return this.data?.secrets[buildEntryKey(service, account)];\n }\n\n async setSecret(service: string, account: string, value: string): Promise<void> {\n await this.mutate((data) => {\n data.secrets[buildEntryKey(service, account)] = value;\n });\n }\n\n async deleteSecret(service: string, account: string): Promise<boolean> {\n let deleted = false;\n await this.mutate((data) => {\n const key = buildEntryKey(service, account);\n deleted = Object.hasOwn(data.secrets, key);\n delete data.secrets[key];\n });\n return deleted;\n }\n\n async getMasterKey(context: SecretStoreBackendContext): Promise<Buffer | null> {\n await this.ensureLoaded();\n const encoded = this.data?.masterKeys[buildEntryKey(context.service, context.account)];\n return encoded ? Buffer.from(encoded, \"base64\") : null;\n }\n\n async setMasterKey(context: SecretStoreBackendContext, key: Buffer): Promise<void> {\n await this.mutate((data) => {\n data.masterKeys[buildEntryKey(context.service, context.account)] = key.toString(\"base64\");\n });\n }\n\n private async ensureLoaded(): Promise<void> {\n if (this.data) return;\n if (!this.loading) this.loading = this.load();\n await this.loading;\n }\n\n private async load(): Promise<void> {\n const directory = path.dirname(this.filePath);\n await mkdir(directory, { recursive: true });\n await this.setPermissions(directory, 0o700);\n try {\n const raw = await readFile(this.filePath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<FileSecretStoreData>;\n this.data = {\n version: FILE_STORE_VERSION,\n secrets: parsed.secrets ?? {},\n masterKeys: parsed.masterKeys ?? {},\n };\n await this.setPermissions(this.filePath, 0o600);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException | undefined)?.code;\n if (code !== \"ENOENT\") throw error;\n this.data = emptyFileStoreData();\n } finally {\n this.loading = null;\n }\n }\n\n private async mutate(update: (data: FileSecretStoreData) => void): Promise<void> {\n await this.ensureLoaded();\n this.writeQueue = this.writeQueue.then(async () => {\n const current = this.data ?? emptyFileStoreData();\n const next: FileSecretStoreData = {\n version: current.version,\n secrets: { ...current.secrets },\n masterKeys: { ...current.masterKeys },\n };\n update(next);\n await this.persist(next);\n this.data = next;\n });\n await this.writeQueue;\n }\n\n private async persist(data: FileSecretStoreData): Promise<void> {\n const directory = path.dirname(this.filePath);\n const tempPath = `${this.filePath}.${process.pid}.${Date.now()}.tmp`;\n await mkdir(directory, { recursive: true });\n await writeFile(tempPath, `${JSON.stringify(data, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await rename(tempPath, this.filePath);\n await this.setPermissions(this.filePath, 0o600);\n }\n\n private async setPermissions(targetPath: string, mode: number): Promise<void> {\n try {\n await chmod(targetPath, mode);\n } catch {\n // Best-effort permission hardening.\n }\n }\n}\n","import { homedir } from \"node:os\";\nimport path from \"node:path\";\n\nexport function buildEntryKey(service: string, account: string): string {\n return `${service}:${account}`;\n}\n\nfunction sanitizeServiceName(service: string): string {\n return service.replace(/[^A-Za-z0-9._-]+/g, \"_\");\n}\n\nexport function defaultFileStorePath(service = \"default\"): string {\n return path.join(homedir(), \".botbotgo\", \"secret-store\", `${sanitizeServiceName(service)}.json`);\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { CODESIGN_BIN, MASTER_KEY_LENGTH, SECURITY_BIN } from \"./constants.js\";\nimport { getKeytar } from \"./keytar.js\";\nimport { resolvePrompt, runSwiftKeychainWithFallback } from \"./swift-bridge.js\";\nimport { type BiometricPolicy, type KeychainAccessOptions, type SecretStoreBackend, type SecretStoreBackendContext } from \"../types.js\";\nimport {\n assertMacOS,\n assertNonEmpty,\n isKeychainNotFoundError,\n normalizeAppleDeveloperTeamId,\n normalizeBiometricPolicy,\n resolveAppBinPath,\n isPackagedApp,\n} from \"./utils.js\";\n\nconst execFileAsync = promisify(execFile);\n\nasync function getSecretViaSecurityCli(service: string, account: string): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync(SECURITY_BIN, [\n \"find-generic-password\",\n \"-s\",\n service,\n \"-a\",\n account,\n \"-w\",\n ]);\n const value = (typeof stdout === \"string\" ? stdout : String(stdout)).replace(/\\r?\\n$/, \"\");\n return value.length > 0 ? value : null;\n } catch (error) {\n if (isKeychainNotFoundError(error)) return null;\n throw error;\n }\n}\n\nfunction isKeytarUnavailable(error: unknown): boolean {\n const text = error instanceof Error ? error.message : String(error ?? \"\");\n return text.includes(\"keytar is not available\");\n}\n\nasync function getPasswordViaKeytarOrCli(service: string, account: string): Promise<string | null> {\n try {\n return await getKeytar().getPassword(service, account);\n } catch (error) {\n if (!isKeytarUnavailable(error)) throw error;\n return getSecretViaSecurityCli(service, account);\n }\n}\n\nfunction buildAddGenericPasswordArgs(\n service: string,\n account: string,\n value: string,\n appBinPath?: string,\n): string[] {\n return [\n \"add-generic-password\",\n \"-s\",\n service,\n \"-a\",\n account,\n \"-w\",\n value,\n ...(appBinPath ? [\"-T\", appBinPath] : []),\n \"-U\",\n ];\n}\n\nasync function getKeychainPassword(\n service: string,\n account: string,\n biometric: BiometricPolicy,\n prompt?: string,\n): Promise<string | null> {\n if (biometric === \"none\") return getPasswordViaKeytarOrCli(service, account);\n const result = await runSwiftKeychainWithFallback(\"get\", {\n service,\n account,\n prompt: resolvePrompt(prompt),\n biometric,\n });\n if (!result) return getPasswordViaKeytarOrCli(service, account);\n if (!result.ok) throw new Error(result.error ?? \"Failed to get key from keychain.\");\n return result.found ? (result.value ?? \"\") : null;\n}\n\nexport async function getKeyFromKeychain(\n service: string,\n account: string,\n options: KeychainAccessOptions = {},\n): Promise<Buffer | null> {\n const normalizedService = assertNonEmpty(service, \"service\");\n const normalizedAccount = assertNonEmpty(account, \"account\");\n const biometric = normalizeBiometricPolicy(options.biometric);\n const password = await getKeychainPassword(\n normalizedService,\n normalizedAccount,\n biometric,\n options.prompt,\n );\n if (!password) return null;\n const buf = Buffer.from(password, \"base64\");\n if (buf.length !== MASTER_KEY_LENGTH) return null;\n return buf;\n}\n\nexport async function getSecretFromKeychain(\n service: string,\n account: string,\n): Promise<string | null> {\n const normalizedService = assertNonEmpty(service, \"service\");\n const normalizedAccount = assertNonEmpty(account, \"account\");\n return getPasswordViaKeytarOrCli(normalizedService, normalizedAccount);\n}\n\nexport async function getTeamIdFromBinary(appBinPath: string): Promise<string | null> {\n assertMacOS();\n const normalizedPath = assertNonEmpty(appBinPath, \"appBinPath\");\n try {\n const { stdout, stderr } = await execFileAsync(CODESIGN_BIN, [\"-dvvv\", normalizedPath], {\n encoding: \"utf8\",\n maxBuffer: 64 * 1024,\n });\n const combined = `${stdout ?? \"\"}\\n${stderr ?? \"\"}`;\n const match = /TeamIdentifier=(.+)/.exec(combined);\n if (!match) return null;\n const raw = match[1].trim();\n if (!raw || /^not\\s+set$/i.test(raw)) return null;\n const normalized = raw.match(/^[A-Za-z0-9]+$/)?.[0] ?? \"\";\n return normalized || null;\n } catch {\n return null;\n }\n}\n\nexport async function setKeyInKeychainWithAcl(\n service: string,\n account: string,\n keyBuffer: Buffer,\n appBinPath: string,\n appleDeveloperTeamId?: string | null,\n options: KeychainAccessOptions = {},\n): Promise<void> {\n assertMacOS();\n const normalizedService = assertNonEmpty(service, \"service\");\n const normalizedAccount = assertNonEmpty(account, \"account\");\n const normalizedAppBinPath = assertNonEmpty(appBinPath, \"appBinPath\");\n const biometric = normalizeBiometricPolicy(options.biometric);\n if (keyBuffer.length !== MASTER_KEY_LENGTH) {\n throw new Error(`Master key must be ${MASTER_KEY_LENGTH} bytes, got ${keyBuffer.length}`);\n }\n const b64 = keyBuffer.toString(\"base64\");\n if (biometric === \"none\") {\n await execFileAsync(\n SECURITY_BIN,\n buildAddGenericPasswordArgs(\n normalizedService,\n normalizedAccount,\n b64,\n normalizedAppBinPath,\n ),\n );\n } else {\n const result = await runSwiftKeychainWithFallback(\"set\", {\n service: normalizedService,\n account: normalizedAccount,\n secret: b64,\n biometric,\n });\n if (!result) {\n await execFileAsync(\n SECURITY_BIN,\n buildAddGenericPasswordArgs(\n normalizedService,\n normalizedAccount,\n b64,\n normalizedAppBinPath,\n ),\n );\n } else if (!result.ok) {\n throw new Error(result.error ?? \"Failed to store key in keychain.\");\n }\n }\n const normalizedTeamId = normalizeAppleDeveloperTeamId(appleDeveloperTeamId);\n if (normalizedTeamId) {\n try {\n await execFileAsync(SECURITY_BIN, [\n \"set-generic-password-partition-list\",\n \"-s\",\n normalizedService,\n \"-a\",\n normalizedAccount,\n \"-S\",\n `teamid:${normalizedTeamId}`,\n ]);\n } catch {\n // Best-effort hardening; keep key if partition update fails.\n }\n }\n}\n\nexport async function setSecretInKeychain(\n service: string,\n account: string,\n value: string,\n): Promise<void> {\n assertMacOS();\n const normalizedService = assertNonEmpty(service, \"service\");\n const normalizedAccount = assertNonEmpty(account, \"account\");\n await execFileAsync(\n SECURITY_BIN,\n buildAddGenericPasswordArgs(normalizedService, normalizedAccount, value),\n );\n}\n\nexport async function deleteSecretFromKeychain(\n service: string,\n account: string,\n): Promise<boolean> {\n assertMacOS();\n const normalizedService = assertNonEmpty(service, \"service\");\n const normalizedAccount = assertNonEmpty(account, \"account\");\n try {\n await execFileAsync(SECURITY_BIN, [\n \"delete-generic-password\",\n \"-s\",\n normalizedService,\n \"-a\",\n normalizedAccount,\n ]);\n return true;\n } catch (error) {\n if (isKeychainNotFoundError(error)) return false;\n throw error;\n }\n}\n\nexport class KeychainSecretStoreBackend implements SecretStoreBackend {\n async getSecret(service: string, account: string): Promise<string | undefined> {\n return (await getSecretFromKeychain(service, account)) ?? undefined;\n }\n\n async setSecret(service: string, account: string, value: string): Promise<void> {\n await setSecretInKeychain(service, account, value);\n }\n\n async deleteSecret(service: string, account: string): Promise<boolean> {\n return deleteSecretFromKeychain(service, account);\n }\n\n async getMasterKey(context: SecretStoreBackendContext): Promise<Buffer | null> {\n return getKeyFromKeychain(context.service, context.account, {\n biometric: context.biometric,\n prompt: context.prompt,\n });\n }\n\n async setMasterKey(context: SecretStoreBackendContext, key: Buffer): Promise<void> {\n const appPath = resolveAppBinPath(context.appBinPath);\n const teamId = context.appleDeveloperTeamId ?? (await getTeamIdFromBinary(appPath));\n await setKeyInKeychainWithAcl(context.service, context.account, key, appPath, teamId, {\n biometric: context.biometric,\n prompt: context.prompt,\n });\n }\n}\n\nexport { MASTER_KEY_LENGTH, isPackagedApp };\n","export const SECURITY_BIN = \"/usr/bin/security\";\nexport const CODESIGN_BIN = \"/usr/bin/codesign\";\nexport const MASTER_KEY_LENGTH = 32;\nexport const DEFAULT_BIOMETRIC_PROMPT = \"Authenticate to access secure data\";\n","import { createRequire } from \"node:module\";\nimport { assertMacOS } from \"./utils.js\";\n\ninterface KeytarLike {\n getPassword: (service: string, account: string) => Promise<string | null>;\n}\n\nconst require = createRequire(import.meta.url);\n\nlet keytar: KeytarLike | null = null;\n\nexport function getKeytar(): KeytarLike {\n assertMacOS();\n if (keytar === null) {\n try {\n const loaded = require(\"keytar\") as Partial<KeytarLike>;\n if (!loaded || typeof loaded.getPassword !== \"function\") {\n throw new Error(\"keytar.getPassword() is unavailable.\");\n }\n keytar = loaded as KeytarLike;\n } catch {\n throw new Error(\n \"keytar is not available. Install keytar to use Keychain features on macOS.\",\n );\n }\n }\n return keytar;\n}\n","import { type BiometricPolicy } from \"../types.js\";\n\nexport function assertMacOS(): void {\n if (process.platform !== \"darwin\") {\n throw new Error(\"This module is only supported on macOS.\");\n }\n}\n\nexport function assertNonEmpty(value: string, field: string): string {\n const normalized = value.trim();\n if (normalized.length === 0) {\n throw new Error(`${field} must be a non-empty string.`);\n }\n return normalized;\n}\n\nexport function normalizeAppleDeveloperTeamId(\n teamId: string | null | undefined,\n): string | undefined {\n const value = teamId?.trim();\n if (!value) return undefined;\n if (!/^[A-Za-z0-9]{10}$/.test(value)) {\n throw new Error(\"appleDeveloperTeamId must be a 10-character alphanumeric string.\");\n }\n return value;\n}\n\nexport function normalizeBiometricPolicy(policy: BiometricPolicy | undefined): BiometricPolicy {\n if (!policy) return \"none\";\n if (\n policy === \"none\" ||\n policy === \"auto\" ||\n policy === \"user-presence\" ||\n policy === \"biometry-current-set\"\n ) {\n return policy;\n }\n return \"none\";\n}\n\nexport function resolveSwiftBiometricPolicy(\n policy: BiometricPolicy,\n): Exclude<BiometricPolicy, \"none\" | \"auto\"> {\n return policy === \"biometry-current-set\" ? \"biometry-current-set\" : \"user-presence\";\n}\n\nexport function isSwiftUnavailableError(error: unknown): boolean {\n const text = error instanceof Error ? `${error.message}` : String(error ?? \"\");\n return (\n text.includes(\"spawn xcrun ENOENT\") ||\n text.includes(\"xcrun: error\") ||\n text.includes('unable to find utility \"swift\"') ||\n text.includes(\"invalid active developer path\") ||\n text.includes(\"tool 'swift' requires Xcode\")\n );\n}\n\nexport function isSwiftEntitlementError(error: unknown): boolean {\n const text = error instanceof Error ? `${error.message}` : String(error ?? \"\");\n return (\n text.includes(\"A required entitlement isn't present.\") ||\n text.includes(\"errSecMissingEntitlement\")\n );\n}\n\nexport function isKeychainNotFoundError(error: unknown): boolean {\n const text = error instanceof Error ? `${error.message}` : String(error ?? \"\");\n return (\n text.includes(\"could not be found\") ||\n text.includes(\"The specified item could not be found\")\n );\n}\n\nexport function isPackagedApp(): boolean {\n return process.execPath.includes(\".app/Contents/MacOS/\");\n}\n\nexport function resolveAppBinPath(appBinPath?: string): string {\n if (appBinPath) return appBinPath;\n if (isPackagedApp()) return process.execPath;\n throw new Error(\n \"appBinPath is required when not running from a packaged .app (process.execPath does not contain .app/Contents/MacOS/)\",\n );\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { DEFAULT_BIOMETRIC_PROMPT } from \"./constants.js\";\nimport { type BiometricPolicy } from \"../types.js\";\nimport {\n isSwiftEntitlementError,\n isSwiftUnavailableError,\n normalizeBiometricPolicy,\n resolveSwiftBiometricPolicy,\n} from \"./utils.js\";\n\nconst execFileAsync = promisify(execFile);\n\ntype SwiftOp = \"set\" | \"get\";\n\ninterface SwiftResult {\n ok: boolean;\n found?: boolean;\n value?: string;\n error?: string;\n}\n\nconst SWIFT_KEYCHAIN_BRIDGE = `\nimport Foundation\nimport Security\n\nfunc emit(_ obj: [String: Any]) {\n let data = try! JSONSerialization.data(withJSONObject: obj, options: [])\n print(String(data: data, encoding: .utf8)!)\n}\n\nfunc secMessage(_ status: OSStatus) -> String {\n if let msg = SecCopyErrorMessageString(status, nil) { return msg as String }\n return \"OSStatus \\\\(status)\"\n}\n\nlet env = ProcessInfo.processInfo.environment\nlet op = env[\"EASYNET_KC_OP\"] ?? \"\"\nlet service = env[\"EASYNET_KC_SERVICE\"] ?? \"\"\nlet account = env[\"EASYNET_KC_ACCOUNT\"] ?? \"\"\nlet secret = env[\"EASYNET_KC_SECRET\"] ?? \"\"\nlet prompt = env[\"EASYNET_KC_PROMPT\"] ?? \"\"\nlet biometric = env[\"EASYNET_KC_BIOMETRIC\"] ?? \"none\"\n\nif op.isEmpty || service.isEmpty || account.isEmpty {\n emit([\"ok\": false, \"error\": \"Missing required env values\"])\n exit(2)\n}\n\nfunc buildBaseQuery() -> [String: Any] {\n return [\n kSecClass as String: kSecClassGenericPassword,\n kSecAttrService as String: service,\n kSecAttrAccount as String: account\n ]\n}\n\nfunc buildAccessControl(_ policy: String) -> SecAccessControl? {\n if policy == \"none\" { return nil }\n var flags: SecAccessControlCreateFlags = []\n if policy == \"user-presence\" {\n flags.insert(.userPresence)\n } else if policy == \"biometry-current-set\" {\n flags.insert(.biometryCurrentSet)\n } else {\n flags.insert(.userPresence)\n }\n var err: Unmanaged<CFError>?\n let ac = SecAccessControlCreateWithFlags(\n nil,\n kSecAttrAccessibleWhenUnlockedThisDeviceOnly,\n flags,\n &err\n )\n return ac\n}\n\nswitch op {\ncase \"set\":\n guard let data = secret.data(using: .utf8) else {\n emit([\"ok\": false, \"error\": \"Secret is not valid UTF-8\"])\n exit(2)\n }\n var add = buildBaseQuery()\n add[kSecValueData as String] = data\n\n if biometric != \"none\" {\n guard let ac = buildAccessControl(biometric) else {\n emit([\"ok\": false, \"error\": \"Failed to build access control\"])\n exit(1)\n }\n add[kSecAttrAccessControl as String] = ac\n _ = SecItemDelete(buildBaseQuery() as CFDictionary)\n let status = SecItemAdd(add as CFDictionary, nil)\n if status != errSecSuccess {\n emit([\"ok\": false, \"error\": secMessage(status)])\n exit(1)\n }\n emit([\"ok\": true])\n exit(0)\n }\n\n let addStatus = SecItemAdd(add as CFDictionary, nil)\n if addStatus == errSecSuccess {\n emit([\"ok\": true])\n exit(0)\n }\n if addStatus == errSecDuplicateItem {\n let updateStatus = SecItemUpdate(buildBaseQuery() as CFDictionary, [kSecValueData as String: data] as CFDictionary)\n if updateStatus == errSecSuccess {\n emit([\"ok\": true])\n exit(0)\n }\n emit([\"ok\": false, \"error\": secMessage(updateStatus)])\n exit(1)\n }\n emit([\"ok\": false, \"error\": secMessage(addStatus)])\n exit(1)\n\ncase \"get\":\n var query = buildBaseQuery()\n query[kSecReturnData as String] = true\n query[kSecMatchLimit as String] = kSecMatchLimitOne\n if !prompt.isEmpty {\n query[kSecUseOperationPrompt as String] = prompt\n }\n var item: CFTypeRef?\n let status = SecItemCopyMatching(query as CFDictionary, &item)\n if status == errSecItemNotFound {\n emit([\"ok\": true, \"found\": false])\n exit(0)\n }\n if status != errSecSuccess {\n emit([\"ok\": false, \"error\": secMessage(status)])\n exit(1)\n }\n guard let data = item as? Data else {\n emit([\"ok\": false, \"error\": \"Unexpected keychain data\"])\n exit(1)\n }\n let value = String(data: data, encoding: .utf8) ?? \"\"\n emit([\"ok\": true, \"found\": true, \"value\": value])\n exit(0)\n\ndefault:\n emit([\"ok\": false, \"error\": \"Unsupported operation\"])\n exit(2)\n}\n`;\n\nasync function runSwiftKeychain(\n op: SwiftOp,\n input: {\n service: string;\n account: string;\n secret?: string;\n prompt?: string;\n biometric?: BiometricPolicy;\n },\n): Promise<SwiftResult> {\n const env = {\n ...process.env,\n EASYNET_KC_OP: op,\n EASYNET_KC_SERVICE: input.service,\n EASYNET_KC_ACCOUNT: input.account,\n EASYNET_KC_SECRET: input.secret ?? \"\",\n EASYNET_KC_PROMPT: input.prompt ?? \"\",\n EASYNET_KC_BIOMETRIC: normalizeBiometricPolicy(input.biometric),\n };\n try {\n const { stdout } = await execFileAsync(\"xcrun\", [\"swift\", \"-e\", SWIFT_KEYCHAIN_BRIDGE], {\n env,\n encoding: \"utf8\",\n maxBuffer: 1024 * 1024,\n });\n return JSON.parse(stdout.trim()) as SwiftResult;\n } catch (error) {\n const err = error as {\n message?: string;\n stderr?: string | Buffer;\n stdout?: string | Buffer;\n };\n const stderr =\n typeof err.stderr === \"string\"\n ? err.stderr.trim()\n : Buffer.isBuffer(err.stderr)\n ? err.stderr.toString(\"utf8\").trim()\n : \"\";\n const stdout =\n typeof err.stdout === \"string\"\n ? err.stdout.trim()\n : Buffer.isBuffer(err.stdout)\n ? err.stdout.toString(\"utf8\").trim()\n : \"\";\n const details = [\n err.message ?? String(error),\n stderr ? `stderr: ${stderr}` : \"\",\n stdout ? `stdout: ${stdout}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n throw new Error(`Swift keychain bridge failed for op=${op}.\\n${details}`);\n }\n}\n\nexport async function runSwiftKeychainWithFallback(\n op: SwiftOp,\n input: {\n service: string;\n account: string;\n secret?: string;\n prompt?: string;\n biometric: BiometricPolicy;\n },\n): Promise<SwiftResult | undefined> {\n const policy = resolveSwiftBiometricPolicy(input.biometric);\n try {\n return await runSwiftKeychain(op, { ...input, biometric: policy });\n } catch (error) {\n if (isSwiftUnavailableError(error)) return undefined;\n if (input.biometric === \"auto\" && isSwiftEntitlementError(error)) return undefined;\n throw error;\n }\n}\n\nexport function resolvePrompt(prompt?: string): string {\n return prompt?.trim() || DEFAULT_BIOMETRIC_PROMPT;\n}\n","import { buildEntryKey } from \"../utils.js\";\nimport { type SecretStoreBackend, type SecretStoreBackendContext } from \"../types.js\";\n\nexport class MemorySecretStoreBackend implements SecretStoreBackend {\n private readonly secrets = new Map<string, string>();\n private readonly masterKeys = new Map<string, Buffer>();\n\n async getSecret(service: string, account: string): Promise<string | undefined> {\n return this.secrets.get(buildEntryKey(service, account));\n }\n\n async setSecret(service: string, account: string, value: string): Promise<void> {\n this.secrets.set(buildEntryKey(service, account), value);\n }\n\n async deleteSecret(service: string, account: string): Promise<boolean> {\n return this.secrets.delete(buildEntryKey(service, account));\n }\n\n async getMasterKey(context: SecretStoreBackendContext): Promise<Buffer | null> {\n const key = this.masterKeys.get(buildEntryKey(context.service, context.account));\n return key ? Buffer.from(key) : null;\n }\n\n async setMasterKey(context: SecretStoreBackendContext, key: Buffer): Promise<void> {\n this.masterKeys.set(buildEntryKey(context.service, context.account), Buffer.from(key));\n }\n}\n","import { FileSecretStoreBackend } from \"./file/index.js\";\nimport { KeychainSecretStoreBackend } from \"./keychain/index.js\";\nimport { MemorySecretStoreBackend } from \"./memory/index.js\";\nimport {\n type CreateSecretStoreBackendOptions,\n type SecretStoreBackend,\n type SecretStoreBackendName,\n} from \"./types.js\";\n\nexport function createSecretStoreBackend(\n backend: SecretStoreBackendName | SecretStoreBackend = \"keychain\",\n options: CreateSecretStoreBackendOptions = {},\n): SecretStoreBackend {\n if (backend === \"keychain\") return new KeychainSecretStoreBackend();\n if (backend === \"memory\") return new MemorySecretStoreBackend();\n if (backend === \"file\") {\n return new FileSecretStoreBackend({ service: options.service });\n }\n return backend;\n}\n\nexport { FileSecretStoreBackend } from \"./file/index.js\";\nexport { KeychainSecretStoreBackend } from \"./keychain/index.js\";\nexport { MemorySecretStoreBackend } from \"./memory/index.js\";\nexport {\n MASTER_KEY_LENGTH,\n deleteSecretFromKeychain,\n getKeyFromKeychain,\n getSecretFromKeychain,\n getTeamIdFromBinary,\n isPackagedApp,\n setKeyInKeychainWithAcl,\n setSecretInKeychain,\n} from \"./keychain/index.js\";\nexport type {\n BiometricPolicy,\n CreateSecretStoreBackendOptions,\n FileSecretStoreBackendOptions,\n KeychainAccessOptions,\n SecretStoreBackend,\n SecretStoreBackendContext,\n SecretStoreBackendName,\n} from \"./types.js\";\n"],"mappings":"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","names":["path","path","execFile","promisify","require","execFileAsync","promisify","execFile","assertNonEmpty"]}
|
|
1
|
+
{"version":3,"sources":["../../src/security-store/store.ts","../../src/security-store/backends/file/index.ts","../../src/security-store/backends/utils.ts","../../src/security-store/backends/keychain/index.ts","../../src/security-store/backends/keychain/constants.ts","../../src/security-store/backends/keychain/keytar.ts","../../src/security-store/backends/keychain/utils.ts","../../src/security-store/backends/keychain/swift-bridge.ts","../../src/security-store/backends/memory/index.ts","../../src/security-store/backends/index.ts"],"sourcesContent":["import crypto from \"node:crypto\";\nimport {\n MASTER_KEY_LENGTH,\n createSecretStoreBackend,\n type BiometricPolicy,\n type SecretStoreBackend,\n type SecretStoreBackendName,\n} from \"./backends/index.js\";\n\nconst PREFIX = \"enc:v1:\";\nconst NONCE_LENGTH = 12;\nconst TAG_LENGTH = 16;\n\nfunction decodeBase64Strict(input: string): Buffer {\n const trimmed = input.trim();\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(trimmed) || trimmed.length % 4 !== 0) {\n throw new Error(\"Invalid base64 in encrypted payload\");\n }\n const decoded = Buffer.from(trimmed, \"base64\");\n if (decoded.toString(\"base64\") !== trimmed) {\n throw new Error(\"Invalid base64 in encrypted payload\");\n }\n return decoded;\n}\n\nfunction assertNonEmpty(value: string, field: string): string {\n const normalized = value.trim();\n if (normalized.length === 0) {\n throw new Error(`${field} must be a non-empty string.`);\n }\n return normalized;\n}\n\nexport interface CryptoManagerKeyStore {\n init?(): Promise<void>;\n get(): Promise<Buffer | null>;\n set(key: Buffer): Promise<void>;\n}\n\nexport interface CryptoManagerOptions {\n service: string;\n account: string;\n allowPlaintextFallback?: boolean;\n masterKey?: Buffer;\n masterKeyStore?: CryptoManagerKeyStore;\n}\n\nexport class CryptoManager {\n private readonly allowPlaintextFallback: boolean;\n private readonly masterKeyStore: CryptoManagerKeyStore | null;\n private masterKey: Buffer | null = null;\n\n constructor(options: CryptoManagerOptions) {\n this.allowPlaintextFallback = options.allowPlaintextFallback !== false;\n this.masterKeyStore = options.masterKeyStore ?? null;\n if (options.masterKey != null) {\n if (options.masterKey.length !== MASTER_KEY_LENGTH) {\n throw new Error(\n `masterKey must be ${MASTER_KEY_LENGTH} bytes, got ${options.masterKey.length}`,\n );\n }\n this.masterKey = Buffer.from(options.masterKey);\n }\n }\n\n async init(): Promise<void> {\n if (this.masterKey != null && this.masterKey.length === MASTER_KEY_LENGTH) return;\n if (this.masterKeyStore == null) {\n throw new Error(\"CryptoManager requires either masterKey or masterKeyStore.\");\n }\n if (this.masterKeyStore.init) await this.masterKeyStore.init();\n let key = await this.masterKeyStore.get();\n if (key != null) {\n this.masterKey = key;\n return;\n }\n const newKey = crypto.randomBytes(MASTER_KEY_LENGTH);\n await this.masterKeyStore.set(newKey);\n key = await this.masterKeyStore.get();\n if (key == null || key.length !== MASTER_KEY_LENGTH) {\n throw new Error(\"Master key write succeeded but readback failed.\");\n }\n this.masterKey = key;\n }\n\n encrypt(plainText: string): string {\n if (this.masterKey == null) {\n throw new Error(\"CryptoManager not initialized. Call init() first.\");\n }\n const nonce = crypto.randomBytes(NONCE_LENGTH);\n const cipher = crypto.createCipheriv(\"aes-256-gcm\", this.masterKey, nonce);\n const enc = Buffer.concat([cipher.update(plainText, \"utf8\"), cipher.final()]);\n const tag = cipher.getAuthTag();\n const payload = Buffer.concat([nonce, tag, enc]);\n return PREFIX + payload.toString(\"base64\");\n }\n\n decrypt(cipherText: string): string {\n if (this.masterKey == null) {\n throw new Error(\"CryptoManager not initialized. Call init() first.\");\n }\n if (!cipherText.startsWith(PREFIX)) {\n if (this.allowPlaintextFallback) return cipherText;\n throw new Error(\"Input is not an encrypted string (missing enc:v1: prefix)\");\n }\n const payload = decodeBase64Strict(cipherText.slice(PREFIX.length));\n if (payload.length < NONCE_LENGTH + TAG_LENGTH) {\n throw new Error(\"Encrypted payload too short\");\n }\n const nonce = payload.subarray(0, NONCE_LENGTH);\n const tag = payload.subarray(NONCE_LENGTH, NONCE_LENGTH + TAG_LENGTH);\n const ciphertext = payload.subarray(NONCE_LENGTH + TAG_LENGTH);\n const decipher = crypto.createDecipheriv(\"aes-256-gcm\", this.masterKey, nonce);\n decipher.setAuthTag(tag);\n return decipher.update(ciphertext, undefined, \"utf8\") + decipher.final(\"utf8\");\n }\n\n static isEncrypted(value: string): boolean {\n return value.startsWith(PREFIX);\n }\n}\n\nexport interface SecretStoreOptions {\n service: string;\n appBinPath?: string;\n appleDeveloperTeamId?: string | null;\n biometric?: BiometricPolicy;\n prompt?: string;\n masterAccount?: string;\n dataService?: string;\n backend?: SecretStoreBackendName | SecretStoreBackend;\n masterKey?: Buffer;\n}\n\nexport class SecretStore {\n private readonly manager: CryptoManager;\n private readonly dataService: string;\n private readonly backend: SecretStoreBackend;\n private readonly initializeBackend: () => Promise<void>;\n private initialized = false;\n private initializing: Promise<void> | null = null;\n\n constructor(options: SecretStoreOptions) {\n const service = assertNonEmpty(options.service, \"service\");\n const masterAccount = options.masterAccount?.trim() || \"master-key\";\n this.dataService = options.dataService?.trim() || `${service}.data`;\n this.backend = createSecretStoreBackend(options.backend, { service });\n const backend = this.backend;\n let backendInitPromise: Promise<void> | null = null;\n this.initializeBackend = async () => {\n if (!backend.init) return;\n if (!backendInitPromise) backendInitPromise = backend.init();\n await backendInitPromise;\n };\n const backendContext = {\n service,\n account: masterAccount,\n appBinPath: options.appBinPath,\n appleDeveloperTeamId: options.appleDeveloperTeamId,\n biometric: options.biometric,\n prompt: options.prompt,\n };\n this.manager = new CryptoManager({\n service,\n account: masterAccount,\n allowPlaintextFallback: true,\n masterKey: options.masterKey,\n masterKeyStore: options.masterKey\n ? undefined\n : {\n init: this.initializeBackend,\n get: async () => {\n if (!backend.getMasterKey) {\n throw new Error(\n \"Secret store backend does not support master key storage. Pass masterKey or implement getMasterKey/setMasterKey.\",\n );\n }\n return backend.getMasterKey(backendContext);\n },\n set: async (key: Buffer) => {\n if (!backend.setMasterKey) {\n throw new Error(\n \"Secret store backend does not support master key storage. Pass masterKey or implement getMasterKey/setMasterKey.\",\n );\n }\n await backend.setMasterKey(backendContext, key);\n },\n },\n });\n }\n\n async init(): Promise<void> {\n if (this.initialized) return;\n if (this.initializing) {\n await this.initializing;\n return;\n }\n this.initializing = (async () => {\n await this.initializeBackend();\n await this.manager.init();\n this.initialized = true;\n })();\n try {\n await this.initializing;\n } finally {\n this.initializing = null;\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n await this.ensureInitialized();\n const account = assertNonEmpty(key, \"key\");\n const ciphertext = this.manager.encrypt(value);\n await this.backend.setSecret(this.dataService, account, ciphertext);\n }\n\n async get(key: string): Promise<string | undefined> {\n await this.ensureInitialized();\n const account = assertNonEmpty(key, \"key\");\n const ciphertext = await this.backend.getSecret(this.dataService, account);\n if (!ciphertext) return undefined;\n return this.manager.decrypt(ciphertext);\n }\n\n async delete(key: string): Promise<boolean> {\n await this.ensureInitialized();\n const account = assertNonEmpty(key, \"key\");\n return this.backend.deleteSecret(this.dataService, account);\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n await this.init();\n }\n}\n\nexport async function createSecretStore(options: SecretStoreOptions): Promise<SecretStore> {\n const store = new SecretStore(options);\n await store.init();\n return store;\n}\n","import { chmod, mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { buildEntryKey, defaultFileStorePath } from \"../utils.js\";\nimport {\n type FileSecretStoreBackendOptions,\n type SecretStoreBackend,\n type SecretStoreBackendContext,\n} from \"../types.js\";\n\nconst FILE_STORE_VERSION = 1;\n\ninterface FileSecretStoreData {\n version: number;\n secrets: Record<string, string>;\n masterKeys: Record<string, string>;\n}\n\nfunction emptyFileStoreData(): FileSecretStoreData {\n return { version: FILE_STORE_VERSION, secrets: {}, masterKeys: {} };\n}\n\nexport class FileSecretStoreBackend implements SecretStoreBackend {\n private readonly filePath: string;\n private data: FileSecretStoreData | null = null;\n private loading: Promise<void> | null = null;\n private writeQueue = Promise.resolve();\n\n constructor(options: FileSecretStoreBackendOptions = {}) {\n this.filePath = options.filePath?.trim() || defaultFileStorePath(options.service);\n }\n\n async init(): Promise<void> {\n await this.ensureLoaded();\n }\n\n async getSecret(service: string, account: string): Promise<string | undefined> {\n await this.ensureLoaded();\n return this.data?.secrets[buildEntryKey(service, account)];\n }\n\n async setSecret(service: string, account: string, value: string): Promise<void> {\n await this.mutate((data) => {\n data.secrets[buildEntryKey(service, account)] = value;\n });\n }\n\n async deleteSecret(service: string, account: string): Promise<boolean> {\n let deleted = false;\n await this.mutate((data) => {\n const key = buildEntryKey(service, account);\n deleted = Object.hasOwn(data.secrets, key);\n delete data.secrets[key];\n });\n return deleted;\n }\n\n async getMasterKey(context: SecretStoreBackendContext): Promise<Buffer | null> {\n await this.ensureLoaded();\n const encoded = this.data?.masterKeys[buildEntryKey(context.service, context.account)];\n return encoded ? Buffer.from(encoded, \"base64\") : null;\n }\n\n async setMasterKey(context: SecretStoreBackendContext, key: Buffer): Promise<void> {\n await this.mutate((data) => {\n data.masterKeys[buildEntryKey(context.service, context.account)] = key.toString(\"base64\");\n });\n }\n\n private async ensureLoaded(): Promise<void> {\n if (this.data) return;\n if (!this.loading) this.loading = this.load();\n await this.loading;\n }\n\n private async load(): Promise<void> {\n const directory = path.dirname(this.filePath);\n await mkdir(directory, { recursive: true });\n await this.setPermissions(directory, 0o700);\n try {\n const raw = await readFile(this.filePath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<FileSecretStoreData>;\n this.data = {\n version: FILE_STORE_VERSION,\n secrets: parsed.secrets ?? {},\n masterKeys: parsed.masterKeys ?? {},\n };\n await this.setPermissions(this.filePath, 0o600);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException | undefined)?.code;\n if (code !== \"ENOENT\") throw error;\n this.data = emptyFileStoreData();\n } finally {\n this.loading = null;\n }\n }\n\n private async mutate(update: (data: FileSecretStoreData) => void): Promise<void> {\n await this.ensureLoaded();\n this.writeQueue = this.writeQueue.then(async () => {\n const current = this.data ?? emptyFileStoreData();\n const next: FileSecretStoreData = {\n version: current.version,\n secrets: { ...current.secrets },\n masterKeys: { ...current.masterKeys },\n };\n update(next);\n await this.persist(next);\n this.data = next;\n });\n await this.writeQueue;\n }\n\n private async persist(data: FileSecretStoreData): Promise<void> {\n const directory = path.dirname(this.filePath);\n const tempPath = `${this.filePath}.${process.pid}.${Date.now()}.tmp`;\n await mkdir(directory, { recursive: true });\n await writeFile(tempPath, `${JSON.stringify(data, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await rename(tempPath, this.filePath);\n await this.setPermissions(this.filePath, 0o600);\n }\n\n private async setPermissions(targetPath: string, mode: number): Promise<void> {\n try {\n await chmod(targetPath, mode);\n } catch {\n // Best-effort permission hardening.\n }\n }\n}\n","import { homedir } from \"node:os\";\nimport path from \"node:path\";\n\nexport function buildEntryKey(service: string, account: string): string {\n return `${service}:${account}`;\n}\n\nfunction sanitizeServiceName(service: string): string {\n return service.replace(/[^A-Za-z0-9._-]+/g, \"_\");\n}\n\nexport function defaultFileStorePath(service = \"default\"): string {\n return path.join(homedir(), \".easynet\", \"secret-store\", `${sanitizeServiceName(service)}.json`);\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { CODESIGN_BIN, MASTER_KEY_LENGTH, SECURITY_BIN } from \"./constants.js\";\nimport { getKeytar } from \"./keytar.js\";\nimport { resolvePrompt, runSwiftKeychainWithFallback } from \"./swift-bridge.js\";\nimport { type BiometricPolicy, type KeychainAccessOptions, type SecretStoreBackend, type SecretStoreBackendContext } from \"../types.js\";\nimport {\n assertMacOS,\n assertNonEmpty,\n isKeychainNotFoundError,\n normalizeAppleDeveloperTeamId,\n normalizeBiometricPolicy,\n resolveAppBinPath,\n isPackagedApp,\n} from \"./utils.js\";\n\nconst execFileAsync = promisify(execFile);\n\nasync function getSecretViaSecurityCli(service: string, account: string): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync(SECURITY_BIN, [\n \"find-generic-password\",\n \"-s\",\n service,\n \"-a\",\n account,\n \"-w\",\n ]);\n const value = (typeof stdout === \"string\" ? stdout : String(stdout)).replace(/\\r?\\n$/, \"\");\n return value.length > 0 ? value : null;\n } catch (error) {\n if (isKeychainNotFoundError(error)) return null;\n throw error;\n }\n}\n\nfunction isKeytarUnavailable(error: unknown): boolean {\n const text = error instanceof Error ? error.message : String(error ?? \"\");\n return text.includes(\"keytar is not available\");\n}\n\nasync function getPasswordViaKeytarOrCli(service: string, account: string): Promise<string | null> {\n try {\n return await getKeytar().getPassword(service, account);\n } catch (error) {\n if (!isKeytarUnavailable(error)) throw error;\n return getSecretViaSecurityCli(service, account);\n }\n}\n\nfunction buildAddGenericPasswordArgs(\n service: string,\n account: string,\n value: string,\n appBinPath?: string,\n): string[] {\n return [\n \"add-generic-password\",\n \"-s\",\n service,\n \"-a\",\n account,\n \"-w\",\n value,\n ...(appBinPath ? [\"-T\", appBinPath] : []),\n \"-U\",\n ];\n}\n\nasync function getKeychainPassword(\n service: string,\n account: string,\n biometric: BiometricPolicy,\n prompt?: string,\n): Promise<string | null> {\n if (biometric === \"none\") return getPasswordViaKeytarOrCli(service, account);\n const result = await runSwiftKeychainWithFallback(\"get\", {\n service,\n account,\n prompt: resolvePrompt(prompt),\n biometric,\n });\n if (!result) return getPasswordViaKeytarOrCli(service, account);\n if (!result.ok) throw new Error(result.error ?? \"Failed to get key from keychain.\");\n return result.found ? (result.value ?? \"\") : null;\n}\n\nexport async function getKeyFromKeychain(\n service: string,\n account: string,\n options: KeychainAccessOptions = {},\n): Promise<Buffer | null> {\n const normalizedService = assertNonEmpty(service, \"service\");\n const normalizedAccount = assertNonEmpty(account, \"account\");\n const biometric = normalizeBiometricPolicy(options.biometric);\n const password = await getKeychainPassword(\n normalizedService,\n normalizedAccount,\n biometric,\n options.prompt,\n );\n if (!password) return null;\n const buf = Buffer.from(password, \"base64\");\n if (buf.length !== MASTER_KEY_LENGTH) return null;\n return buf;\n}\n\nexport async function getSecretFromKeychain(\n service: string,\n account: string,\n): Promise<string | null> {\n const normalizedService = assertNonEmpty(service, \"service\");\n const normalizedAccount = assertNonEmpty(account, \"account\");\n return getPasswordViaKeytarOrCli(normalizedService, normalizedAccount);\n}\n\nexport async function getTeamIdFromBinary(appBinPath: string): Promise<string | null> {\n assertMacOS();\n const normalizedPath = assertNonEmpty(appBinPath, \"appBinPath\");\n try {\n const { stdout, stderr } = await execFileAsync(CODESIGN_BIN, [\"-dvvv\", normalizedPath], {\n encoding: \"utf8\",\n maxBuffer: 64 * 1024,\n });\n const combined = `${stdout ?? \"\"}\\n${stderr ?? \"\"}`;\n const match = /TeamIdentifier=(.+)/.exec(combined);\n if (!match) return null;\n const raw = match[1].trim();\n if (!raw || /^not\\s+set$/i.test(raw)) return null;\n const normalized = raw.match(/^[A-Za-z0-9]+$/)?.[0] ?? \"\";\n return normalized || null;\n } catch {\n return null;\n }\n}\n\nexport async function setKeyInKeychainWithAcl(\n service: string,\n account: string,\n keyBuffer: Buffer,\n appBinPath: string,\n appleDeveloperTeamId?: string | null,\n options: KeychainAccessOptions = {},\n): Promise<void> {\n assertMacOS();\n const normalizedService = assertNonEmpty(service, \"service\");\n const normalizedAccount = assertNonEmpty(account, \"account\");\n const normalizedAppBinPath = assertNonEmpty(appBinPath, \"appBinPath\");\n const biometric = normalizeBiometricPolicy(options.biometric);\n if (keyBuffer.length !== MASTER_KEY_LENGTH) {\n throw new Error(`Master key must be ${MASTER_KEY_LENGTH} bytes, got ${keyBuffer.length}`);\n }\n const b64 = keyBuffer.toString(\"base64\");\n if (biometric === \"none\") {\n await execFileAsync(\n SECURITY_BIN,\n buildAddGenericPasswordArgs(\n normalizedService,\n normalizedAccount,\n b64,\n normalizedAppBinPath,\n ),\n );\n } else {\n const result = await runSwiftKeychainWithFallback(\"set\", {\n service: normalizedService,\n account: normalizedAccount,\n secret: b64,\n biometric,\n });\n if (!result) {\n await execFileAsync(\n SECURITY_BIN,\n buildAddGenericPasswordArgs(\n normalizedService,\n normalizedAccount,\n b64,\n normalizedAppBinPath,\n ),\n );\n } else if (!result.ok) {\n throw new Error(result.error ?? \"Failed to store key in keychain.\");\n }\n }\n const normalizedTeamId = normalizeAppleDeveloperTeamId(appleDeveloperTeamId);\n if (normalizedTeamId) {\n try {\n await execFileAsync(SECURITY_BIN, [\n \"set-generic-password-partition-list\",\n \"-s\",\n normalizedService,\n \"-a\",\n normalizedAccount,\n \"-S\",\n `teamid:${normalizedTeamId}`,\n ]);\n } catch {\n // Best-effort hardening; keep key if partition update fails.\n }\n }\n}\n\nexport async function setSecretInKeychain(\n service: string,\n account: string,\n value: string,\n): Promise<void> {\n assertMacOS();\n const normalizedService = assertNonEmpty(service, \"service\");\n const normalizedAccount = assertNonEmpty(account, \"account\");\n await execFileAsync(\n SECURITY_BIN,\n buildAddGenericPasswordArgs(normalizedService, normalizedAccount, value),\n );\n}\n\nexport async function deleteSecretFromKeychain(\n service: string,\n account: string,\n): Promise<boolean> {\n assertMacOS();\n const normalizedService = assertNonEmpty(service, \"service\");\n const normalizedAccount = assertNonEmpty(account, \"account\");\n try {\n await execFileAsync(SECURITY_BIN, [\n \"delete-generic-password\",\n \"-s\",\n normalizedService,\n \"-a\",\n normalizedAccount,\n ]);\n return true;\n } catch (error) {\n if (isKeychainNotFoundError(error)) return false;\n throw error;\n }\n}\n\nexport class KeychainSecretStoreBackend implements SecretStoreBackend {\n async getSecret(service: string, account: string): Promise<string | undefined> {\n return (await getSecretFromKeychain(service, account)) ?? undefined;\n }\n\n async setSecret(service: string, account: string, value: string): Promise<void> {\n await setSecretInKeychain(service, account, value);\n }\n\n async deleteSecret(service: string, account: string): Promise<boolean> {\n return deleteSecretFromKeychain(service, account);\n }\n\n async getMasterKey(context: SecretStoreBackendContext): Promise<Buffer | null> {\n return getKeyFromKeychain(context.service, context.account, {\n biometric: context.biometric,\n prompt: context.prompt,\n });\n }\n\n async setMasterKey(context: SecretStoreBackendContext, key: Buffer): Promise<void> {\n const appPath = resolveAppBinPath(context.appBinPath);\n const teamId = context.appleDeveloperTeamId ?? (await getTeamIdFromBinary(appPath));\n await setKeyInKeychainWithAcl(context.service, context.account, key, appPath, teamId, {\n biometric: context.biometric,\n prompt: context.prompt,\n });\n }\n}\n\nexport { MASTER_KEY_LENGTH, isPackagedApp };\n","export const SECURITY_BIN = \"/usr/bin/security\";\nexport const CODESIGN_BIN = \"/usr/bin/codesign\";\nexport const MASTER_KEY_LENGTH = 32;\nexport const DEFAULT_BIOMETRIC_PROMPT = \"Authenticate to access secure data\";\n","import { createRequire } from \"node:module\";\nimport { assertMacOS } from \"./utils.js\";\n\ninterface KeytarLike {\n getPassword: (service: string, account: string) => Promise<string | null>;\n}\n\nconst require = createRequire(import.meta.url);\n\nlet keytar: KeytarLike | null = null;\n\nexport function getKeytar(): KeytarLike {\n assertMacOS();\n if (keytar === null) {\n try {\n const loaded = require(\"keytar\") as Partial<KeytarLike>;\n if (!loaded || typeof loaded.getPassword !== \"function\") {\n throw new Error(\"keytar.getPassword() is unavailable.\");\n }\n keytar = loaded as KeytarLike;\n } catch {\n throw new Error(\n \"keytar is not available. Install keytar to use Keychain features on macOS.\",\n );\n }\n }\n return keytar;\n}\n","import { type BiometricPolicy } from \"../types.js\";\n\nexport function assertMacOS(): void {\n if (process.platform !== \"darwin\") {\n throw new Error(\"This module is only supported on macOS.\");\n }\n}\n\nexport function assertNonEmpty(value: string, field: string): string {\n const normalized = value.trim();\n if (normalized.length === 0) {\n throw new Error(`${field} must be a non-empty string.`);\n }\n return normalized;\n}\n\nexport function normalizeAppleDeveloperTeamId(\n teamId: string | null | undefined,\n): string | undefined {\n const value = teamId?.trim();\n if (!value) return undefined;\n if (!/^[A-Za-z0-9]{10}$/.test(value)) {\n throw new Error(\"appleDeveloperTeamId must be a 10-character alphanumeric string.\");\n }\n return value;\n}\n\nexport function normalizeBiometricPolicy(policy: BiometricPolicy | undefined): BiometricPolicy {\n if (!policy) return \"none\";\n if (\n policy === \"none\" ||\n policy === \"auto\" ||\n policy === \"user-presence\" ||\n policy === \"biometry-current-set\"\n ) {\n return policy;\n }\n return \"none\";\n}\n\nexport function resolveSwiftBiometricPolicy(\n policy: BiometricPolicy,\n): Exclude<BiometricPolicy, \"none\" | \"auto\"> {\n return policy === \"biometry-current-set\" ? \"biometry-current-set\" : \"user-presence\";\n}\n\nexport function isSwiftUnavailableError(error: unknown): boolean {\n const text = error instanceof Error ? `${error.message}` : String(error ?? \"\");\n return (\n text.includes(\"spawn xcrun ENOENT\") ||\n text.includes(\"xcrun: error\") ||\n text.includes('unable to find utility \"swift\"') ||\n text.includes(\"invalid active developer path\") ||\n text.includes(\"tool 'swift' requires Xcode\")\n );\n}\n\nexport function isSwiftEntitlementError(error: unknown): boolean {\n const text = error instanceof Error ? `${error.message}` : String(error ?? \"\");\n return (\n text.includes(\"A required entitlement isn't present.\") ||\n text.includes(\"errSecMissingEntitlement\")\n );\n}\n\nexport function isKeychainNotFoundError(error: unknown): boolean {\n const text = error instanceof Error ? `${error.message}` : String(error ?? \"\");\n return (\n text.includes(\"could not be found\") ||\n text.includes(\"The specified item could not be found\")\n );\n}\n\nexport function isPackagedApp(): boolean {\n return process.execPath.includes(\".app/Contents/MacOS/\");\n}\n\nexport function resolveAppBinPath(appBinPath?: string): string {\n if (appBinPath) return appBinPath;\n if (isPackagedApp()) return process.execPath;\n throw new Error(\n \"appBinPath is required when not running from a packaged .app (process.execPath does not contain .app/Contents/MacOS/)\",\n );\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { DEFAULT_BIOMETRIC_PROMPT } from \"./constants.js\";\nimport { type BiometricPolicy } from \"../types.js\";\nimport {\n isSwiftEntitlementError,\n isSwiftUnavailableError,\n normalizeBiometricPolicy,\n resolveSwiftBiometricPolicy,\n} from \"./utils.js\";\n\nconst execFileAsync = promisify(execFile);\n\ntype SwiftOp = \"set\" | \"get\";\n\ninterface SwiftResult {\n ok: boolean;\n found?: boolean;\n value?: string;\n error?: string;\n}\n\nconst SWIFT_KEYCHAIN_BRIDGE = `\nimport Foundation\nimport Security\n\nfunc emit(_ obj: [String: Any]) {\n let data = try! JSONSerialization.data(withJSONObject: obj, options: [])\n print(String(data: data, encoding: .utf8)!)\n}\n\nfunc secMessage(_ status: OSStatus) -> String {\n if let msg = SecCopyErrorMessageString(status, nil) { return msg as String }\n return \"OSStatus \\\\(status)\"\n}\n\nlet env = ProcessInfo.processInfo.environment\nlet op = env[\"EASYNET_KC_OP\"] ?? \"\"\nlet service = env[\"EASYNET_KC_SERVICE\"] ?? \"\"\nlet account = env[\"EASYNET_KC_ACCOUNT\"] ?? \"\"\nlet secret = env[\"EASYNET_KC_SECRET\"] ?? \"\"\nlet prompt = env[\"EASYNET_KC_PROMPT\"] ?? \"\"\nlet biometric = env[\"EASYNET_KC_BIOMETRIC\"] ?? \"none\"\n\nif op.isEmpty || service.isEmpty || account.isEmpty {\n emit([\"ok\": false, \"error\": \"Missing required env values\"])\n exit(2)\n}\n\nfunc buildBaseQuery() -> [String: Any] {\n return [\n kSecClass as String: kSecClassGenericPassword,\n kSecAttrService as String: service,\n kSecAttrAccount as String: account\n ]\n}\n\nfunc buildAccessControl(_ policy: String) -> SecAccessControl? {\n if policy == \"none\" { return nil }\n var flags: SecAccessControlCreateFlags = []\n if policy == \"user-presence\" {\n flags.insert(.userPresence)\n } else if policy == \"biometry-current-set\" {\n flags.insert(.biometryCurrentSet)\n } else {\n flags.insert(.userPresence)\n }\n var err: Unmanaged<CFError>?\n let ac = SecAccessControlCreateWithFlags(\n nil,\n kSecAttrAccessibleWhenUnlockedThisDeviceOnly,\n flags,\n &err\n )\n return ac\n}\n\nswitch op {\ncase \"set\":\n guard let data = secret.data(using: .utf8) else {\n emit([\"ok\": false, \"error\": \"Secret is not valid UTF-8\"])\n exit(2)\n }\n var add = buildBaseQuery()\n add[kSecValueData as String] = data\n\n if biometric != \"none\" {\n guard let ac = buildAccessControl(biometric) else {\n emit([\"ok\": false, \"error\": \"Failed to build access control\"])\n exit(1)\n }\n add[kSecAttrAccessControl as String] = ac\n _ = SecItemDelete(buildBaseQuery() as CFDictionary)\n let status = SecItemAdd(add as CFDictionary, nil)\n if status != errSecSuccess {\n emit([\"ok\": false, \"error\": secMessage(status)])\n exit(1)\n }\n emit([\"ok\": true])\n exit(0)\n }\n\n let addStatus = SecItemAdd(add as CFDictionary, nil)\n if addStatus == errSecSuccess {\n emit([\"ok\": true])\n exit(0)\n }\n if addStatus == errSecDuplicateItem {\n let updateStatus = SecItemUpdate(buildBaseQuery() as CFDictionary, [kSecValueData as String: data] as CFDictionary)\n if updateStatus == errSecSuccess {\n emit([\"ok\": true])\n exit(0)\n }\n emit([\"ok\": false, \"error\": secMessage(updateStatus)])\n exit(1)\n }\n emit([\"ok\": false, \"error\": secMessage(addStatus)])\n exit(1)\n\ncase \"get\":\n var query = buildBaseQuery()\n query[kSecReturnData as String] = true\n query[kSecMatchLimit as String] = kSecMatchLimitOne\n if !prompt.isEmpty {\n query[kSecUseOperationPrompt as String] = prompt\n }\n var item: CFTypeRef?\n let status = SecItemCopyMatching(query as CFDictionary, &item)\n if status == errSecItemNotFound {\n emit([\"ok\": true, \"found\": false])\n exit(0)\n }\n if status != errSecSuccess {\n emit([\"ok\": false, \"error\": secMessage(status)])\n exit(1)\n }\n guard let data = item as? Data else {\n emit([\"ok\": false, \"error\": \"Unexpected keychain data\"])\n exit(1)\n }\n let value = String(data: data, encoding: .utf8) ?? \"\"\n emit([\"ok\": true, \"found\": true, \"value\": value])\n exit(0)\n\ndefault:\n emit([\"ok\": false, \"error\": \"Unsupported operation\"])\n exit(2)\n}\n`;\n\nasync function runSwiftKeychain(\n op: SwiftOp,\n input: {\n service: string;\n account: string;\n secret?: string;\n prompt?: string;\n biometric?: BiometricPolicy;\n },\n): Promise<SwiftResult> {\n const env = {\n ...process.env,\n EASYNET_KC_OP: op,\n EASYNET_KC_SERVICE: input.service,\n EASYNET_KC_ACCOUNT: input.account,\n EASYNET_KC_SECRET: input.secret ?? \"\",\n EASYNET_KC_PROMPT: input.prompt ?? \"\",\n EASYNET_KC_BIOMETRIC: normalizeBiometricPolicy(input.biometric),\n };\n try {\n const { stdout } = await execFileAsync(\"xcrun\", [\"swift\", \"-e\", SWIFT_KEYCHAIN_BRIDGE], {\n env,\n encoding: \"utf8\",\n maxBuffer: 1024 * 1024,\n });\n return JSON.parse(stdout.trim()) as SwiftResult;\n } catch (error) {\n const err = error as {\n message?: string;\n stderr?: string | Buffer;\n stdout?: string | Buffer;\n };\n const stderr =\n typeof err.stderr === \"string\"\n ? err.stderr.trim()\n : Buffer.isBuffer(err.stderr)\n ? err.stderr.toString(\"utf8\").trim()\n : \"\";\n const stdout =\n typeof err.stdout === \"string\"\n ? err.stdout.trim()\n : Buffer.isBuffer(err.stdout)\n ? err.stdout.toString(\"utf8\").trim()\n : \"\";\n const details = [\n err.message ?? String(error),\n stderr ? `stderr: ${stderr}` : \"\",\n stdout ? `stdout: ${stdout}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n throw new Error(`Swift keychain bridge failed for op=${op}.\\n${details}`);\n }\n}\n\nexport async function runSwiftKeychainWithFallback(\n op: SwiftOp,\n input: {\n service: string;\n account: string;\n secret?: string;\n prompt?: string;\n biometric: BiometricPolicy;\n },\n): Promise<SwiftResult | undefined> {\n const policy = resolveSwiftBiometricPolicy(input.biometric);\n try {\n return await runSwiftKeychain(op, { ...input, biometric: policy });\n } catch (error) {\n if (isSwiftUnavailableError(error)) return undefined;\n if (input.biometric === \"auto\" && isSwiftEntitlementError(error)) return undefined;\n throw error;\n }\n}\n\nexport function resolvePrompt(prompt?: string): string {\n return prompt?.trim() || DEFAULT_BIOMETRIC_PROMPT;\n}\n","import { buildEntryKey } from \"../utils.js\";\nimport { type SecretStoreBackend, type SecretStoreBackendContext } from \"../types.js\";\n\nexport class MemorySecretStoreBackend implements SecretStoreBackend {\n private readonly secrets = new Map<string, string>();\n private readonly masterKeys = new Map<string, Buffer>();\n\n async getSecret(service: string, account: string): Promise<string | undefined> {\n return this.secrets.get(buildEntryKey(service, account));\n }\n\n async setSecret(service: string, account: string, value: string): Promise<void> {\n this.secrets.set(buildEntryKey(service, account), value);\n }\n\n async deleteSecret(service: string, account: string): Promise<boolean> {\n return this.secrets.delete(buildEntryKey(service, account));\n }\n\n async getMasterKey(context: SecretStoreBackendContext): Promise<Buffer | null> {\n const key = this.masterKeys.get(buildEntryKey(context.service, context.account));\n return key ? Buffer.from(key) : null;\n }\n\n async setMasterKey(context: SecretStoreBackendContext, key: Buffer): Promise<void> {\n this.masterKeys.set(buildEntryKey(context.service, context.account), Buffer.from(key));\n }\n}\n","import { FileSecretStoreBackend } from \"./file/index.js\";\nimport { KeychainSecretStoreBackend } from \"./keychain/index.js\";\nimport { MemorySecretStoreBackend } from \"./memory/index.js\";\nimport {\n type CreateSecretStoreBackendOptions,\n type SecretStoreBackend,\n type SecretStoreBackendName,\n} from \"./types.js\";\n\nexport function createSecretStoreBackend(\n backend: SecretStoreBackendName | SecretStoreBackend = \"keychain\",\n options: CreateSecretStoreBackendOptions = {},\n): SecretStoreBackend {\n if (backend === \"keychain\") return new KeychainSecretStoreBackend();\n if (backend === \"memory\") return new MemorySecretStoreBackend();\n if (backend === \"file\") {\n return new FileSecretStoreBackend({ service: options.service });\n }\n return backend;\n}\n\nexport { FileSecretStoreBackend } from \"./file/index.js\";\nexport { KeychainSecretStoreBackend } from \"./keychain/index.js\";\nexport { MemorySecretStoreBackend } from \"./memory/index.js\";\nexport {\n MASTER_KEY_LENGTH,\n deleteSecretFromKeychain,\n getKeyFromKeychain,\n getSecretFromKeychain,\n getTeamIdFromBinary,\n isPackagedApp,\n setKeyInKeychainWithAcl,\n setSecretInKeychain,\n} from \"./keychain/index.js\";\nexport type {\n BiometricPolicy,\n CreateSecretStoreBackendOptions,\n FileSecretStoreBackendOptions,\n KeychainAccessOptions,\n SecretStoreBackend,\n SecretStoreBackendContext,\n SecretStoreBackendName,\n} from \"./types.js\";\n"],"mappings":";AAAA,OAAO,YAAY;;;ACAnB,SAAS,OAAO,OAAO,UAAU,QAAQ,iBAAiB;AAC1D,OAAOA,WAAU;;;ACDjB,SAAS,eAAe;AACxB,OAAO,UAAU;AAEV,SAAS,cAAc,SAAiB,SAAyB;AACtE,SAAO,GAAG,OAAO,IAAI,OAAO;AAC9B;AAEA,SAAS,oBAAoB,SAAyB;AACpD,SAAO,QAAQ,QAAQ,qBAAqB,GAAG;AACjD;AAEO,SAAS,qBAAqB,UAAU,WAAmB;AAChE,SAAO,KAAK,KAAK,QAAQ,GAAG,YAAY,gBAAgB,GAAG,oBAAoB,OAAO,CAAC,OAAO;AAChG;;;ADJA,IAAM,qBAAqB;AAQ3B,SAAS,qBAA0C;AACjD,SAAO,EAAE,SAAS,oBAAoB,SAAS,CAAC,GAAG,YAAY,CAAC,EAAE;AACpE;AAEO,IAAM,yBAAN,MAA2D;AAAA,EAC/C;AAAA,EACT,OAAmC;AAAA,EACnC,UAAgC;AAAA,EAChC,aAAa,QAAQ,QAAQ;AAAA,EAErC,YAAY,UAAyC,CAAC,GAAG;AACvD,SAAK,WAAW,QAAQ,UAAU,KAAK,KAAK,qBAAqB,QAAQ,OAAO;AAAA,EAClF;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,KAAK,aAAa;AAAA,EAC1B;AAAA,EAEA,MAAM,UAAU,SAAiB,SAA8C;AAC7E,UAAM,KAAK,aAAa;AACxB,WAAO,KAAK,MAAM,QAAQ,cAAc,SAAS,OAAO,CAAC;AAAA,EAC3D;AAAA,EAEA,MAAM,UAAU,SAAiB,SAAiB,OAA8B;AAC9E,UAAM,KAAK,OAAO,CAAC,SAAS;AAC1B,WAAK,QAAQ,cAAc,SAAS,OAAO,CAAC,IAAI;AAAA,IAClD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,SAAiB,SAAmC;AACrE,QAAI,UAAU;AACd,UAAM,KAAK,OAAO,CAAC,SAAS;AAC1B,YAAM,MAAM,cAAc,SAAS,OAAO;AAC1C,gBAAU,OAAO,OAAO,KAAK,SAAS,GAAG;AACzC,aAAO,KAAK,QAAQ,GAAG;AAAA,IACzB,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,SAA4D;AAC7E,UAAM,KAAK,aAAa;AACxB,UAAM,UAAU,KAAK,MAAM,WAAW,cAAc,QAAQ,SAAS,QAAQ,OAAO,CAAC;AACrF,WAAO,UAAU,OAAO,KAAK,SAAS,QAAQ,IAAI;AAAA,EACpD;AAAA,EAEA,MAAM,aAAa,SAAoC,KAA4B;AACjF,UAAM,KAAK,OAAO,CAAC,SAAS;AAC1B,WAAK,WAAW,cAAc,QAAQ,SAAS,QAAQ,OAAO,CAAC,IAAI,IAAI,SAAS,QAAQ;AAAA,IAC1F,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,eAA8B;AAC1C,QAAI,KAAK,KAAM;AACf,QAAI,CAAC,KAAK,QAAS,MAAK,UAAU,KAAK,KAAK;AAC5C,UAAM,KAAK;AAAA,EACb;AAAA,EAEA,MAAc,OAAsB;AAClC,UAAM,YAAYC,MAAK,QAAQ,KAAK,QAAQ;AAC5C,UAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,UAAM,KAAK,eAAe,WAAW,GAAK;AAC1C,QAAI;AACF,YAAM,MAAM,MAAM,SAAS,KAAK,UAAU,MAAM;AAChD,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAK,OAAO;AAAA,QACV,SAAS;AAAA,QACT,SAAS,OAAO,WAAW,CAAC;AAAA,QAC5B,YAAY,OAAO,cAAc,CAAC;AAAA,MACpC;AACA,YAAM,KAAK,eAAe,KAAK,UAAU,GAAK;AAAA,IAChD,SAAS,OAAO;AACd,YAAM,OAAQ,OAA6C;AAC3D,UAAI,SAAS,SAAU,OAAM;AAC7B,WAAK,OAAO,mBAAmB;AAAA,IACjC,UAAE;AACA,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAc,OAAO,QAA4D;AAC/E,UAAM,KAAK,aAAa;AACxB,SAAK,aAAa,KAAK,WAAW,KAAK,YAAY;AACjD,YAAM,UAAU,KAAK,QAAQ,mBAAmB;AAChD,YAAM,OAA4B;AAAA,QAChC,SAAS,QAAQ;AAAA,QACjB,SAAS,EAAE,GAAG,QAAQ,QAAQ;AAAA,QAC9B,YAAY,EAAE,GAAG,QAAQ,WAAW;AAAA,MACtC;AACA,aAAO,IAAI;AACX,YAAM,KAAK,QAAQ,IAAI;AACvB,WAAK,OAAO;AAAA,IACd,CAAC;AACD,UAAM,KAAK;AAAA,EACb;AAAA,EAEA,MAAc,QAAQ,MAA0C;AAC9D,UAAM,YAAYA,MAAK,QAAQ,KAAK,QAAQ;AAC5C,UAAM,WAAW,GAAG,KAAK,QAAQ,IAAI,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;AAC9D,UAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,UAAM,UAAU,UAAU,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,GAAM;AAAA,MAC9D,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AACD,UAAM,OAAO,UAAU,KAAK,QAAQ;AACpC,UAAM,KAAK,eAAe,KAAK,UAAU,GAAK;AAAA,EAChD;AAAA,EAEA,MAAc,eAAe,YAAoB,MAA6B;AAC5E,QAAI;AACF,YAAM,MAAM,YAAY,IAAI;AAAA,IAC9B,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;AEnIA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,aAAAC,kBAAiB;;;ACDnB,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,oBAAoB;AAC1B,IAAM,2BAA2B;;;ACHxC,SAAS,qBAAqB;;;ACEvB,SAAS,cAAoB;AAClC,MAAI,QAAQ,aAAa,UAAU;AACjC,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AACF;AAEO,SAAS,eAAe,OAAe,OAAuB;AACnE,QAAM,aAAa,MAAM,KAAK;AAC9B,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI,MAAM,GAAG,KAAK,8BAA8B;AAAA,EACxD;AACA,SAAO;AACT;AAEO,SAAS,8BACd,QACoB;AACpB,QAAM,QAAQ,QAAQ,KAAK;AAC3B,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,CAAC,oBAAoB,KAAK,KAAK,GAAG;AACpC,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AACA,SAAO;AACT;AAEO,SAAS,yBAAyB,QAAsD;AAC7F,MAAI,CAAC,OAAQ,QAAO;AACpB,MACE,WAAW,UACX,WAAW,UACX,WAAW,mBACX,WAAW,wBACX;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,4BACd,QAC2C;AAC3C,SAAO,WAAW,yBAAyB,yBAAyB;AACtE;AAEO,SAAS,wBAAwB,OAAyB;AAC/D,QAAM,OAAO,iBAAiB,QAAQ,GAAG,MAAM,OAAO,KAAK,OAAO,SAAS,EAAE;AAC7E,SACE,KAAK,SAAS,oBAAoB,KAClC,KAAK,SAAS,cAAc,KAC5B,KAAK,SAAS,gCAAgC,KAC9C,KAAK,SAAS,+BAA+B,KAC7C,KAAK,SAAS,6BAA6B;AAE/C;AAEO,SAAS,wBAAwB,OAAyB;AAC/D,QAAM,OAAO,iBAAiB,QAAQ,GAAG,MAAM,OAAO,KAAK,OAAO,SAAS,EAAE;AAC7E,SACE,KAAK,SAAS,uCAAuC,KACrD,KAAK,SAAS,0BAA0B;AAE5C;AAEO,SAAS,wBAAwB,OAAyB;AAC/D,QAAM,OAAO,iBAAiB,QAAQ,GAAG,MAAM,OAAO,KAAK,OAAO,SAAS,EAAE;AAC7E,SACE,KAAK,SAAS,oBAAoB,KAClC,KAAK,SAAS,uCAAuC;AAEzD;AAEO,SAAS,gBAAyB;AACvC,SAAO,QAAQ,SAAS,SAAS,sBAAsB;AACzD;AAEO,SAAS,kBAAkB,YAA6B;AAC7D,MAAI,WAAY,QAAO;AACvB,MAAI,cAAc,EAAG,QAAO,QAAQ;AACpC,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;;;AD5EA,IAAMC,WAAU,cAAc,YAAY,GAAG;AAE7C,IAAI,SAA4B;AAEzB,SAAS,YAAwB;AACtC,cAAY;AACZ,MAAI,WAAW,MAAM;AACnB,QAAI;AACF,YAAM,SAASA,SAAQ,QAAQ;AAC/B,UAAI,CAAC,UAAU,OAAO,OAAO,gBAAgB,YAAY;AACvD,cAAM,IAAI,MAAM,sCAAsC;AAAA,MACxD;AACA,eAAS;AAAA,IACX,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AE3BA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAU1B,IAAM,gBAAgB,UAAU,QAAQ;AAWxC,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgI9B,eAAe,iBACb,IACA,OAOsB;AACtB,QAAM,MAAM;AAAA,IACV,GAAG,QAAQ;AAAA,IACX,eAAe;AAAA,IACf,oBAAoB,MAAM;AAAA,IAC1B,oBAAoB,MAAM;AAAA,IAC1B,mBAAmB,MAAM,UAAU;AAAA,IACnC,mBAAmB,MAAM,UAAU;AAAA,IACnC,sBAAsB,yBAAyB,MAAM,SAAS;AAAA,EAChE;AACA,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,cAAc,SAAS,CAAC,SAAS,MAAM,qBAAqB,GAAG;AAAA,MACtF;AAAA,MACA,UAAU;AAAA,MACV,WAAW,OAAO;AAAA,IACpB,CAAC;AACD,WAAO,KAAK,MAAM,OAAO,KAAK,CAAC;AAAA,EACjC,SAAS,OAAO;AACd,UAAM,MAAM;AAKZ,UAAM,SACJ,OAAO,IAAI,WAAW,WAClB,IAAI,OAAO,KAAK,IAChB,OAAO,SAAS,IAAI,MAAM,IACxB,IAAI,OAAO,SAAS,MAAM,EAAE,KAAK,IACjC;AACR,UAAM,SACJ,OAAO,IAAI,WAAW,WAClB,IAAI,OAAO,KAAK,IAChB,OAAO,SAAS,IAAI,MAAM,IACxB,IAAI,OAAO,SAAS,MAAM,EAAE,KAAK,IACjC;AACR,UAAM,UAAU;AAAA,MACd,IAAI,WAAW,OAAO,KAAK;AAAA,MAC3B,SAAS,WAAW,MAAM,KAAK;AAAA,MAC/B,SAAS,WAAW,MAAM,KAAK;AAAA,IACjC,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AACZ,UAAM,IAAI,MAAM,uCAAuC,EAAE;AAAA,EAAM,OAAO,EAAE;AAAA,EAC1E;AACF;AAEA,eAAsB,6BACpB,IACA,OAOkC;AAClC,QAAM,SAAS,4BAA4B,MAAM,SAAS;AAC1D,MAAI;AACF,WAAO,MAAM,iBAAiB,IAAI,EAAE,GAAG,OAAO,WAAW,OAAO,CAAC;AAAA,EACnE,SAAS,OAAO;AACd,QAAI,wBAAwB,KAAK,EAAG,QAAO;AAC3C,QAAI,MAAM,cAAc,UAAU,wBAAwB,KAAK,EAAG,QAAO;AACzE,UAAM;AAAA,EACR;AACF;AAEO,SAAS,cAAc,QAAyB;AACrD,SAAO,QAAQ,KAAK,KAAK;AAC3B;;;AJnNA,IAAMC,iBAAgBC,WAAUC,SAAQ;AAExC,eAAe,wBAAwB,SAAiB,SAAyC;AAC/F,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAMF,eAAc,cAAc;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,SAAS,OAAO,WAAW,WAAW,SAAS,OAAO,MAAM,GAAG,QAAQ,UAAU,EAAE;AACzF,WAAO,MAAM,SAAS,IAAI,QAAQ;AAAA,EACpC,SAAS,OAAO;AACd,QAAI,wBAAwB,KAAK,EAAG,QAAO;AAC3C,UAAM;AAAA,EACR;AACF;AAEA,SAAS,oBAAoB,OAAyB;AACpD,QAAM,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,EAAE;AACxE,SAAO,KAAK,SAAS,yBAAyB;AAChD;AAEA,eAAe,0BAA0B,SAAiB,SAAyC;AACjG,MAAI;AACF,WAAO,MAAM,UAAU,EAAE,YAAY,SAAS,OAAO;AAAA,EACvD,SAAS,OAAO;AACd,QAAI,CAAC,oBAAoB,KAAK,EAAG,OAAM;AACvC,WAAO,wBAAwB,SAAS,OAAO;AAAA,EACjD;AACF;AAEA,SAAS,4BACP,SACA,SACA,OACA,YACU;AACV,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,aAAa,CAAC,MAAM,UAAU,IAAI,CAAC;AAAA,IACvC;AAAA,EACF;AACF;AAEA,eAAe,oBACb,SACA,SACA,WACA,QACwB;AACxB,MAAI,cAAc,OAAQ,QAAO,0BAA0B,SAAS,OAAO;AAC3E,QAAM,SAAS,MAAM,6BAA6B,OAAO;AAAA,IACvD;AAAA,IACA;AAAA,IACA,QAAQ,cAAc,MAAM;AAAA,IAC5B;AAAA,EACF,CAAC;AACD,MAAI,CAAC,OAAQ,QAAO,0BAA0B,SAAS,OAAO;AAC9D,MAAI,CAAC,OAAO,GAAI,OAAM,IAAI,MAAM,OAAO,SAAS,kCAAkC;AAClF,SAAO,OAAO,QAAS,OAAO,SAAS,KAAM;AAC/C;AAEA,eAAsB,mBACpB,SACA,SACA,UAAiC,CAAC,GACV;AACxB,QAAM,oBAAoB,eAAe,SAAS,SAAS;AAC3D,QAAM,oBAAoB,eAAe,SAAS,SAAS;AAC3D,QAAM,YAAY,yBAAyB,QAAQ,SAAS;AAC5D,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AACA,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,MAAM,OAAO,KAAK,UAAU,QAAQ;AAC1C,MAAI,IAAI,WAAW,kBAAmB,QAAO;AAC7C,SAAO;AACT;AAEA,eAAsB,sBACpB,SACA,SACwB;AACxB,QAAM,oBAAoB,eAAe,SAAS,SAAS;AAC3D,QAAM,oBAAoB,eAAe,SAAS,SAAS;AAC3D,SAAO,0BAA0B,mBAAmB,iBAAiB;AACvE;AAEA,eAAsB,oBAAoB,YAA4C;AACpF,cAAY;AACZ,QAAM,iBAAiB,eAAe,YAAY,YAAY;AAC9D,MAAI;AACF,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAMA,eAAc,cAAc,CAAC,SAAS,cAAc,GAAG;AAAA,MACtF,UAAU;AAAA,MACV,WAAW,KAAK;AAAA,IAClB,CAAC;AACD,UAAM,WAAW,GAAG,UAAU,EAAE;AAAA,EAAK,UAAU,EAAE;AACjD,UAAM,QAAQ,sBAAsB,KAAK,QAAQ;AACjD,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,MAAM,MAAM,CAAC,EAAE,KAAK;AAC1B,QAAI,CAAC,OAAO,eAAe,KAAK,GAAG,EAAG,QAAO;AAC7C,UAAM,aAAa,IAAI,MAAM,gBAAgB,IAAI,CAAC,KAAK;AACvD,WAAO,cAAc;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,wBACpB,SACA,SACA,WACA,YACA,sBACA,UAAiC,CAAC,GACnB;AACf,cAAY;AACZ,QAAM,oBAAoB,eAAe,SAAS,SAAS;AAC3D,QAAM,oBAAoB,eAAe,SAAS,SAAS;AAC3D,QAAM,uBAAuB,eAAe,YAAY,YAAY;AACpE,QAAM,YAAY,yBAAyB,QAAQ,SAAS;AAC5D,MAAI,UAAU,WAAW,mBAAmB;AAC1C,UAAM,IAAI,MAAM,sBAAsB,iBAAiB,eAAe,UAAU,MAAM,EAAE;AAAA,EAC1F;AACA,QAAM,MAAM,UAAU,SAAS,QAAQ;AACvC,MAAI,cAAc,QAAQ;AACxB,UAAMA;AAAA,MACJ;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,SAAS,MAAM,6BAA6B,OAAO;AAAA,MACvD,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AACD,QAAI,CAAC,QAAQ;AACX,YAAMA;AAAA,QACJ;AAAA,QACA;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,CAAC,OAAO,IAAI;AACrB,YAAM,IAAI,MAAM,OAAO,SAAS,kCAAkC;AAAA,IACpE;AAAA,EACF;AACA,QAAM,mBAAmB,8BAA8B,oBAAoB;AAC3E,MAAI,kBAAkB;AACpB,QAAI;AACF,YAAMA,eAAc,cAAc;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,gBAAgB;AAAA,MAC5B,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,eAAsB,oBACpB,SACA,SACA,OACe;AACf,cAAY;AACZ,QAAM,oBAAoB,eAAe,SAAS,SAAS;AAC3D,QAAM,oBAAoB,eAAe,SAAS,SAAS;AAC3D,QAAMA;AAAA,IACJ;AAAA,IACA,4BAA4B,mBAAmB,mBAAmB,KAAK;AAAA,EACzE;AACF;AAEA,eAAsB,yBACpB,SACA,SACkB;AAClB,cAAY;AACZ,QAAM,oBAAoB,eAAe,SAAS,SAAS;AAC3D,QAAM,oBAAoB,eAAe,SAAS,SAAS;AAC3D,MAAI;AACF,UAAMA,eAAc,cAAc;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,wBAAwB,KAAK,EAAG,QAAO;AAC3C,UAAM;AAAA,EACR;AACF;AAEO,IAAM,6BAAN,MAA+D;AAAA,EACpE,MAAM,UAAU,SAAiB,SAA8C;AAC7E,WAAQ,MAAM,sBAAsB,SAAS,OAAO,KAAM;AAAA,EAC5D;AAAA,EAEA,MAAM,UAAU,SAAiB,SAAiB,OAA8B;AAC9E,UAAM,oBAAoB,SAAS,SAAS,KAAK;AAAA,EACnD;AAAA,EAEA,MAAM,aAAa,SAAiB,SAAmC;AACrE,WAAO,yBAAyB,SAAS,OAAO;AAAA,EAClD;AAAA,EAEA,MAAM,aAAa,SAA4D;AAC7E,WAAO,mBAAmB,QAAQ,SAAS,QAAQ,SAAS;AAAA,MAC1D,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,SAAoC,KAA4B;AACjF,UAAM,UAAU,kBAAkB,QAAQ,UAAU;AACpD,UAAM,SAAS,QAAQ,wBAAyB,MAAM,oBAAoB,OAAO;AACjF,UAAM,wBAAwB,QAAQ,SAAS,QAAQ,SAAS,KAAK,SAAS,QAAQ;AAAA,MACpF,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AACF;;;AKvQO,IAAM,2BAAN,MAA6D;AAAA,EACjD,UAAU,oBAAI,IAAoB;AAAA,EAClC,aAAa,oBAAI,IAAoB;AAAA,EAEtD,MAAM,UAAU,SAAiB,SAA8C;AAC7E,WAAO,KAAK,QAAQ,IAAI,cAAc,SAAS,OAAO,CAAC;AAAA,EACzD;AAAA,EAEA,MAAM,UAAU,SAAiB,SAAiB,OAA8B;AAC9E,SAAK,QAAQ,IAAI,cAAc,SAAS,OAAO,GAAG,KAAK;AAAA,EACzD;AAAA,EAEA,MAAM,aAAa,SAAiB,SAAmC;AACrE,WAAO,KAAK,QAAQ,OAAO,cAAc,SAAS,OAAO,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAM,aAAa,SAA4D;AAC7E,UAAM,MAAM,KAAK,WAAW,IAAI,cAAc,QAAQ,SAAS,QAAQ,OAAO,CAAC;AAC/E,WAAO,MAAM,OAAO,KAAK,GAAG,IAAI;AAAA,EAClC;AAAA,EAEA,MAAM,aAAa,SAAoC,KAA4B;AACjF,SAAK,WAAW,IAAI,cAAc,QAAQ,SAAS,QAAQ,OAAO,GAAG,OAAO,KAAK,GAAG,CAAC;AAAA,EACvF;AACF;;;AClBO,SAAS,yBACd,UAAuD,YACvD,UAA2C,CAAC,GACxB;AACpB,MAAI,YAAY,WAAY,QAAO,IAAI,2BAA2B;AAClE,MAAI,YAAY,SAAU,QAAO,IAAI,yBAAyB;AAC9D,MAAI,YAAY,QAAQ;AACtB,WAAO,IAAI,uBAAuB,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAAA,EAChE;AACA,SAAO;AACT;;;ATVA,IAAM,SAAS;AACf,IAAM,eAAe;AACrB,IAAM,aAAa;AAEnB,SAAS,mBAAmB,OAAuB;AACjD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,yBAAyB,KAAK,OAAO,KAAK,QAAQ,SAAS,MAAM,GAAG;AACvE,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AACA,QAAM,UAAU,OAAO,KAAK,SAAS,QAAQ;AAC7C,MAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS;AAC1C,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AACA,SAAO;AACT;AAEA,SAASG,gBAAe,OAAe,OAAuB;AAC5D,QAAM,aAAa,MAAM,KAAK;AAC9B,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI,MAAM,GAAG,KAAK,8BAA8B;AAAA,EACxD;AACA,SAAO;AACT;AAgBO,IAAM,gBAAN,MAAoB;AAAA,EACR;AAAA,EACA;AAAA,EACT,YAA2B;AAAA,EAEnC,YAAY,SAA+B;AACzC,SAAK,yBAAyB,QAAQ,2BAA2B;AACjE,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,QAAI,QAAQ,aAAa,MAAM;AAC7B,UAAI,QAAQ,UAAU,WAAW,mBAAmB;AAClD,cAAM,IAAI;AAAA,UACR,qBAAqB,iBAAiB,eAAe,QAAQ,UAAU,MAAM;AAAA,QAC/E;AAAA,MACF;AACA,WAAK,YAAY,OAAO,KAAK,QAAQ,SAAS;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,KAAK,aAAa,QAAQ,KAAK,UAAU,WAAW,kBAAmB;AAC3E,QAAI,KAAK,kBAAkB,MAAM;AAC/B,YAAM,IAAI,MAAM,4DAA4D;AAAA,IAC9E;AACA,QAAI,KAAK,eAAe,KAAM,OAAM,KAAK,eAAe,KAAK;AAC7D,QAAI,MAAM,MAAM,KAAK,eAAe,IAAI;AACxC,QAAI,OAAO,MAAM;AACf,WAAK,YAAY;AACjB;AAAA,IACF;AACA,UAAM,SAAS,OAAO,YAAY,iBAAiB;AACnD,UAAM,KAAK,eAAe,IAAI,MAAM;AACpC,UAAM,MAAM,KAAK,eAAe,IAAI;AACpC,QAAI,OAAO,QAAQ,IAAI,WAAW,mBAAmB;AACnD,YAAM,IAAI,MAAM,iDAAiD;AAAA,IACnE;AACA,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,QAAQ,WAA2B;AACjC,QAAI,KAAK,aAAa,MAAM;AAC1B,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AACA,UAAM,QAAQ,OAAO,YAAY,YAAY;AAC7C,UAAM,SAAS,OAAO,eAAe,eAAe,KAAK,WAAW,KAAK;AACzE,UAAM,MAAM,OAAO,OAAO,CAAC,OAAO,OAAO,WAAW,MAAM,GAAG,OAAO,MAAM,CAAC,CAAC;AAC5E,UAAM,MAAM,OAAO,WAAW;AAC9B,UAAM,UAAU,OAAO,OAAO,CAAC,OAAO,KAAK,GAAG,CAAC;AAC/C,WAAO,SAAS,QAAQ,SAAS,QAAQ;AAAA,EAC3C;AAAA,EAEA,QAAQ,YAA4B;AAClC,QAAI,KAAK,aAAa,MAAM;AAC1B,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AACA,QAAI,CAAC,WAAW,WAAW,MAAM,GAAG;AAClC,UAAI,KAAK,uBAAwB,QAAO;AACxC,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AACA,UAAM,UAAU,mBAAmB,WAAW,MAAM,OAAO,MAAM,CAAC;AAClE,QAAI,QAAQ,SAAS,eAAe,YAAY;AAC9C,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AACA,UAAM,QAAQ,QAAQ,SAAS,GAAG,YAAY;AAC9C,UAAM,MAAM,QAAQ,SAAS,cAAc,eAAe,UAAU;AACpE,UAAM,aAAa,QAAQ,SAAS,eAAe,UAAU;AAC7D,UAAM,WAAW,OAAO,iBAAiB,eAAe,KAAK,WAAW,KAAK;AAC7E,aAAS,WAAW,GAAG;AACvB,WAAO,SAAS,OAAO,YAAY,QAAW,MAAM,IAAI,SAAS,MAAM,MAAM;AAAA,EAC/E;AAAA,EAEA,OAAO,YAAY,OAAwB;AACzC,WAAO,MAAM,WAAW,MAAM;AAAA,EAChC;AACF;AAcO,IAAM,cAAN,MAAkB;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,cAAc;AAAA,EACd,eAAqC;AAAA,EAE7C,YAAY,SAA6B;AACvC,UAAM,UAAUA,gBAAe,QAAQ,SAAS,SAAS;AACzD,UAAM,gBAAgB,QAAQ,eAAe,KAAK,KAAK;AACvD,SAAK,cAAc,QAAQ,aAAa,KAAK,KAAK,GAAG,OAAO;AAC5D,SAAK,UAAU,yBAAyB,QAAQ,SAAS,EAAE,QAAQ,CAAC;AACpE,UAAM,UAAU,KAAK;AACrB,QAAI,qBAA2C;AAC/C,SAAK,oBAAoB,YAAY;AACnC,UAAI,CAAC,QAAQ,KAAM;AACnB,UAAI,CAAC,mBAAoB,sBAAqB,QAAQ,KAAK;AAC3D,YAAM;AAAA,IACR;AACA,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA,SAAS;AAAA,MACT,YAAY,QAAQ;AAAA,MACpB,sBAAsB,QAAQ;AAAA,MAC9B,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAClB;AACA,SAAK,UAAU,IAAI,cAAc;AAAA,MAC/B;AAAA,MACA,SAAS;AAAA,MACT,wBAAwB;AAAA,MACxB,WAAW,QAAQ;AAAA,MACnB,gBAAgB,QAAQ,YACpB,SACA;AAAA,QACE,MAAM,KAAK;AAAA,QACX,KAAK,YAAY;AACf,cAAI,CAAC,QAAQ,cAAc;AACzB,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,iBAAO,QAAQ,aAAa,cAAc;AAAA,QAC5C;AAAA,QACA,KAAK,OAAO,QAAgB;AAC1B,cAAI,CAAC,QAAQ,cAAc;AACzB,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,gBAAM,QAAQ,aAAa,gBAAgB,GAAG;AAAA,QAChD;AAAA,MACF;AAAA,IACN,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,KAAK,YAAa;AACtB,QAAI,KAAK,cAAc;AACrB,YAAM,KAAK;AACX;AAAA,IACF;AACA,SAAK,gBAAgB,YAAY;AAC/B,YAAM,KAAK,kBAAkB;AAC7B,YAAM,KAAK,QAAQ,KAAK;AACxB,WAAK,cAAc;AAAA,IACrB,GAAG;AACH,QAAI;AACF,YAAM,KAAK;AAAA,IACb,UAAE;AACA,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,KAAa,OAA8B;AACnD,UAAM,KAAK,kBAAkB;AAC7B,UAAM,UAAUA,gBAAe,KAAK,KAAK;AACzC,UAAM,aAAa,KAAK,QAAQ,QAAQ,KAAK;AAC7C,UAAM,KAAK,QAAQ,UAAU,KAAK,aAAa,SAAS,UAAU;AAAA,EACpE;AAAA,EAEA,MAAM,IAAI,KAA0C;AAClD,UAAM,KAAK,kBAAkB;AAC7B,UAAM,UAAUA,gBAAe,KAAK,KAAK;AACzC,UAAM,aAAa,MAAM,KAAK,QAAQ,UAAU,KAAK,aAAa,OAAO;AACzE,QAAI,CAAC,WAAY,QAAO;AACxB,WAAO,KAAK,QAAQ,QAAQ,UAAU;AAAA,EACxC;AAAA,EAEA,MAAM,OAAO,KAA+B;AAC1C,UAAM,KAAK,kBAAkB;AAC7B,UAAM,UAAUA,gBAAe,KAAK,KAAK;AACzC,WAAO,KAAK,QAAQ,aAAa,KAAK,aAAa,OAAO;AAAA,EAC5D;AAAA,EAEA,MAAc,oBAAmC;AAC/C,QAAI,KAAK,YAAa;AACtB,UAAM,KAAK,KAAK;AAAA,EAClB;AACF;AAEA,eAAsB,kBAAkB,SAAmD;AACzF,QAAM,QAAQ,IAAI,YAAY,OAAO;AACrC,QAAM,MAAM,KAAK;AACjB,SAAO;AACT;","names":["path","path","execFile","promisify","require","execFileAsync","promisify","execFile","assertNonEmpty"]}
|
package/dist/testing/index.js
CHANGED
package/dist/utils/index.js
CHANGED
|
@@ -12,8 +12,8 @@ import {
|
|
|
12
12
|
shortToolName,
|
|
13
13
|
stripNullishObjectFields,
|
|
14
14
|
summarizeForLog
|
|
15
|
-
} from "../chunk-
|
|
16
|
-
import "../chunk-
|
|
15
|
+
} from "../chunk-OTWARMTU.js";
|
|
16
|
+
import "../chunk-X4TDNR4V.js";
|
|
17
17
|
import {
|
|
18
18
|
computeChecksum,
|
|
19
19
|
createChecksumAccumulator
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@botbotgo/common",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.66",
|
|
4
4
|
"description": "Shared runtime utilities for BotBotGo agent projects",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -93,11 +93,9 @@
|
|
|
93
93
|
"release": "semantic-release"
|
|
94
94
|
},
|
|
95
95
|
"dependencies": {
|
|
96
|
+
"keytar": "^7.9.0",
|
|
96
97
|
"yaml": "^2.8.1"
|
|
97
98
|
},
|
|
98
|
-
"optionalDependencies": {
|
|
99
|
-
"keytar": "^7.9.0"
|
|
100
|
-
},
|
|
101
99
|
"peerDependencies": {},
|
|
102
100
|
"peerDependenciesMeta": {},
|
|
103
101
|
"devDependencies": {
|
|
@@ -121,10 +119,10 @@
|
|
|
121
119
|
},
|
|
122
120
|
"repository": {
|
|
123
121
|
"type": "git",
|
|
124
|
-
"url": "https://github.com/
|
|
122
|
+
"url": "https://github.com/easynet-world/agent-common.git"
|
|
125
123
|
},
|
|
126
|
-
"homepage": "https://github.com/
|
|
124
|
+
"homepage": "https://github.com/easynet-world/agent-common#readme",
|
|
127
125
|
"bugs": {
|
|
128
|
-
"url": "https://github.com/
|
|
126
|
+
"url": "https://github.com/easynet-world/agent-common/issues"
|
|
129
127
|
}
|
|
130
128
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/yaml.ts","../src/config/path.ts","../src/config/kind.ts"],"sourcesContent":["import { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { resolveConfigPath } from \"./path.js\";\n\nexport interface YamlEnvOptions {\n substituteEnv?: boolean;\n missingEnv?: \"keep\" | \"empty\";\n env?: NodeJS.ProcessEnv;\n}\n\nexport interface LoadYamlOptions extends YamlEnvOptions {\n cache?: boolean;\n}\n\nexport interface LoadModuleConfigOptions<TConfig, TRaw = Record<string, unknown>> {\n path?: string;\n defaultPath?: string;\n appRoot?: string;\n yaml?: LoadYamlOptions;\n unwrapSpec?: boolean;\n fallback: TConfig;\n normalize?: (raw: TRaw, meta: { resolvedPath: string }) => TConfig;\n}\n\ninterface CacheEntry {\n version: string;\n value: unknown;\n}\n\nconst YAML_CACHE = new Map<string, CacheEntry>();\n\nexport function clearYamlFileCache(): void {\n YAML_CACHE.clear();\n}\n\nfunction substituteEnvInString(\n input: string,\n env: NodeJS.ProcessEnv,\n missingEnv: \"keep\" | \"empty\",\n): string {\n return input.replace(/\\$\\{(\\w+)\\}/g, (_, name: string) => {\n const value = env[name];\n if (value !== undefined) return value;\n return missingEnv === \"empty\" ? \"\" : `\\${${name}}`;\n });\n}\n\nfunction substituteEnvInValue(\n input: unknown,\n options: { env: NodeJS.ProcessEnv; missingEnv: \"keep\" | \"empty\" },\n): unknown {\n if (typeof input === \"string\") {\n return substituteEnvInString(input, options.env, options.missingEnv);\n }\n if (Array.isArray(input)) {\n return input.map((item) => substituteEnvInValue(item, options));\n }\n if (input && typeof input === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(input)) {\n out[k] = substituteEnvInValue(v, options);\n }\n return out;\n }\n return input;\n}\n\nexport function parseYamlContent<T = unknown>(\n content: string,\n options: YamlEnvOptions = {},\n): T {\n const parsed = parseYaml(content) as unknown;\n if (options.substituteEnv === false) return parsed as T;\n return substituteEnvInValue(parsed, {\n env: options.env ?? process.env,\n missingEnv: options.missingEnv ?? \"keep\",\n }) as T;\n}\n\nfunction buildCacheVersion(\n fileStat: { mtimeNs?: bigint; mtimeMs: number | bigint; size: number | bigint },\n): string {\n const mtime = fileStat.mtimeNs\n ?? (typeof fileStat.mtimeMs === \"bigint\"\n ? fileStat.mtimeMs\n : BigInt(Math.trunc(fileStat.mtimeMs * 1_000_000)));\n return `${mtime}:${fileStat.size.toString()}`;\n}\n\nfunction readFromCache(filePath: string, version: string): unknown | undefined {\n const cached = YAML_CACHE.get(filePath);\n if (!cached) return undefined;\n if (cached.version !== version) return undefined;\n return cached.value;\n}\n\nfunction writeCache(filePath: string, version: string, value: unknown): void {\n YAML_CACHE.set(filePath, { version, value });\n}\n\nexport function loadYamlFileSync<T = unknown>(\n filePath: string,\n options: LoadYamlOptions = {},\n): T | undefined {\n const absPath = path.resolve(filePath);\n if (!existsSync(absPath)) return undefined;\n const useCache = options.cache === true;\n const fileStat = statSync(absPath, { bigint: true });\n if (useCache) {\n const cached = readFromCache(absPath, buildCacheVersion(fileStat));\n if (cached !== undefined) return cached as T;\n }\n const content = readFileSync(absPath, \"utf-8\");\n const parsed = parseYamlContent<T>(content, options);\n if (useCache) writeCache(absPath, buildCacheVersion(fileStat), parsed);\n return parsed;\n}\n\nexport async function loadYamlFile<T = unknown>(\n filePath: string,\n options: LoadYamlOptions = {},\n): Promise<T | undefined> {\n const absPath = path.resolve(filePath);\n let fileStat;\n try {\n fileStat = await stat(absPath, { bigint: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === \"ENOENT\") return undefined;\n throw err;\n }\n const useCache = options.cache === true;\n if (useCache) {\n const cached = readFromCache(absPath, buildCacheVersion(fileStat));\n if (cached !== undefined) return cached as T;\n }\n const content = await readFile(absPath, \"utf-8\");\n const parsed = parseYamlContent<T>(content, options);\n if (useCache) writeCache(absPath, buildCacheVersion(fileStat), parsed);\n return parsed;\n}\n\nexport async function loadYamlObject(\n filePath: string,\n options: LoadYamlOptions = {},\n): Promise<Record<string, unknown>> {\n const parsed = await loadYamlFile<unknown>(filePath, options);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return {};\n}\n\n/**\n * Generic module config loader:\n * 1) resolve path (path || defaultPath) relative to appRoot\n * 2) load YAML as object\n * 3) normalize into module-owned config interface\n * 4) fallback when missing/invalid\n */\nexport async function loadModuleConfig<TConfig, TRaw = Record<string, unknown>>(\n options: LoadModuleConfigOptions<TConfig, TRaw>,\n): Promise<TConfig> {\n const selected = options.path ?? options.defaultPath;\n if (!selected) return options.fallback;\n\n const appRoot = options.appRoot ?? process.cwd();\n const resolvedPath = resolveConfigPath(selected, appRoot);\n const loaded = await loadYamlFile<unknown>(resolvedPath, options.yaml);\n if (!loaded || typeof loaded !== \"object\" || Array.isArray(loaded)) return options.fallback;\n const raw = options.unwrapSpec === true\n ? (\n typeof (loaded as { spec?: unknown }).spec === \"object\" &&\n (loaded as { spec?: unknown }).spec !== null &&\n !Array.isArray((loaded as { spec?: unknown }).spec)\n ? (loaded as { spec: unknown }).spec\n : loaded\n )\n : loaded;\n\n if (options.normalize) {\n return options.normalize(raw as TRaw, { resolvedPath });\n }\n return raw as TConfig;\n}\n","import path from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport interface ResolveConfigPathOptions {\n expandHome?: boolean;\n homeDir?: string;\n}\n\nexport type PathRef = { ref?: string };\n\nexport function isPathRef(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length > 0 &&\n (value.endsWith(\".yaml\") || value.endsWith(\".yml\"))\n );\n}\n\nexport function expandHomePath(inputPath: string, options: { homeDir?: string } = {}): string {\n const home = options.homeDir ?? homedir();\n if (inputPath === \"~\") return home;\n if (inputPath.startsWith(\"~/\")) return path.join(home, inputPath.slice(2));\n return inputPath;\n}\n\nexport function resolveConfigPath(\n pathRef: string,\n configDir: string,\n options: ResolveConfigPathOptions = {},\n): string {\n const expanded = options.expandHome === false ? pathRef : expandHomePath(pathRef, { homeDir: options.homeDir });\n return path.resolve(configDir, expanded);\n}\n\nexport function asObject(input: unknown): Record<string, unknown> | undefined {\n return typeof input === \"object\" && input !== null ? (input as Record<string, unknown>) : undefined;\n}\n\nexport function toPathRef(input: unknown): PathRef | undefined {\n if (typeof input === \"string\" && input.trim().length > 0) return { ref: input.trim() };\n const obj = asObject(input);\n if (!obj) return undefined;\n const value =\n (typeof (obj as { __filePath?: unknown }).__filePath === \"string\" &&\n (obj as { __filePath: string }).__filePath.trim().length > 0\n ? (obj as { __filePath: string }).__filePath.trim()\n : undefined) ??\n (typeof obj.ref === \"string\" && obj.ref.trim().length > 0 ? obj.ref.trim() : undefined);\n return value ? { ref: value } : undefined;\n}\n","import { dirname } from \"node:path\";\nimport { loadYamlFile, type LoadYamlOptions } from \"./yaml.js\";\nimport { asObject, resolveConfigPath } from \"./path.js\";\n\nexport interface ResourceMetadata {\n name?: string;\n labels?: Record<string, string>;\n}\n\nexport interface ResourceHeader {\n apiVersion: string;\n kind: string;\n metadata?: ResourceMetadata;\n spec: unknown;\n}\n\nexport type RefNode = { ref: string };\n\nexport type ResolvedResource<TSpec = unknown> = ResourceHeader & {\n spec: TSpec;\n __filePath: string;\n};\n\nexport interface ResolveKindResourceOptions {\n baseDir?: string;\n maxDepth?: number;\n cache?: boolean;\n yaml?: LoadYamlOptions;\n expectedKind?: string;\n expectedApiVersion?: string;\n}\n\nfunction toResourceHeader(input: unknown): ResourceHeader {\n const obj = asObject(input);\n if (!obj) throw new Error(\"Invalid config document: expected object root\");\n\n const apiVersion = typeof obj.apiVersion === \"string\" ? obj.apiVersion.trim() : \"\";\n const kind = typeof obj.kind === \"string\" ? obj.kind.trim() : \"\";\n const spec = (obj as { spec?: unknown }).spec;\n if (!apiVersion) throw new Error(\"Invalid config document: missing apiVersion\");\n if (!kind) throw new Error(\"Invalid config document: missing kind\");\n if (spec === undefined) throw new Error(\"Invalid config document: missing spec\");\n const metadataRaw = asObject(obj.metadata);\n const metadata: ResourceMetadata | undefined = metadataRaw\n ? {\n name: typeof metadataRaw.name === \"string\" ? metadataRaw.name : undefined,\n labels:\n metadataRaw.labels && typeof metadataRaw.labels === \"object\" && !Array.isArray(metadataRaw.labels)\n ? (metadataRaw.labels as Record<string, string>)\n : undefined,\n }\n : undefined;\n return { apiVersion, kind, metadata, spec };\n}\n\nexport function isRefNode(input: unknown): input is RefNode {\n const obj = asObject(input);\n return !!obj && typeof obj.ref === \"string\" && obj.ref.trim().length > 0;\n}\n\nexport async function resolveKindResourceFile<TSpec = unknown>(\n entryFile: string,\n options: ResolveKindResourceOptions = {},\n): Promise<ResolvedResource<TSpec>> {\n const baseDir = options.baseDir ?? process.cwd();\n const entryAbs = resolveConfigPath(entryFile, baseDir);\n const maxDepth = options.maxDepth ?? 50;\n const cache = new Map<string, ResolvedResource>();\n const visiting = new Set<string>();\n\n const resolveNode = async (node: unknown, currentDir: string, depth: number): Promise<unknown> => {\n if (depth > maxDepth) throw new Error(`Config ref resolution exceeded maxDepth=${maxDepth}`);\n if (isRefNode(node)) {\n const next = resolveConfigPath(node.ref, currentDir);\n return loadResource(next, depth + 1);\n }\n if (Array.isArray(node)) {\n return Promise.all(node.map((item) => resolveNode(item, currentDir, depth + 1)));\n }\n const obj = asObject(node);\n if (!obj) return node;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n out[k] = await resolveNode(v, currentDir, depth + 1);\n }\n return out;\n };\n\n const loadResource = async (absPath: string, depth: number): Promise<ResolvedResource> => {\n if (depth > maxDepth) throw new Error(`Config ref resolution exceeded maxDepth=${maxDepth}`);\n if (options.cache !== false) {\n const cached = cache.get(absPath);\n if (cached) return cached;\n }\n if (visiting.has(absPath)) {\n throw new Error(`Config ref cycle detected at: ${absPath}`);\n }\n visiting.add(absPath);\n try {\n const raw = await loadYamlFile(absPath, options.yaml);\n const header = toResourceHeader(raw);\n if (options.expectedApiVersion && header.apiVersion !== options.expectedApiVersion) {\n throw new Error(`Unexpected apiVersion \"${header.apiVersion}\" at ${absPath}`);\n }\n const resolvedSpec = await resolveNode(header.spec, dirname(absPath), depth + 1);\n const resolved: ResolvedResource = {\n ...header,\n spec: resolvedSpec,\n __filePath: absPath,\n };\n if (options.cache !== false) cache.set(absPath, resolved);\n return resolved;\n } finally {\n visiting.delete(absPath);\n }\n };\n\n const root = await loadResource(entryAbs, 0);\n if (options.expectedKind && root.kind !== options.expectedKind) {\n throw new Error(`Expected kind \"${options.expectedKind}\" but got \"${root.kind}\" at ${root.__filePath}`);\n }\n return root as ResolvedResource<TSpec>;\n}\n"],"mappings":"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","names":["path","path"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/events/progress-listener.ts","../src/events/runtime2-tree-listener.ts","../src/events/index.ts"],"sourcesContent":["import type { AgentEvent, AgentEventListener } from \"./index.js\";\nimport { asRecord, asTrimmedString, parseJsonObject, shortToolName } from \"../utils/index.js\";\n\ninterface ToolStep {\n action: string;\n startedAtMs: number;\n}\n\ninterface ProgressState {\n runStartedAtMs: number | null;\n startedSteps: number;\n completedSteps: number;\n currentStep: number;\n steps: Map<number, ToolStep>;\n pendingStepNumbers: number[];\n}\n\nexport interface ProgressEventListenerOptions {\n writer?: (line: string) => void;\n runLabelReact?: string;\n runLabelDeep?: string;\n reasonForAction?: (action: string) => string | null;\n}\n\nfunction formatElapsed(ms: number): string {\n return `${Math.max(0, Math.round(ms))}ms`;\n}\n\nfunction formatStepNumber(stepNumber: number): string {\n return String(Math.max(0, stepNumber)).padStart(2, \"0\");\n}\n\nfunction hasAny(record: Record<string, unknown>, keys: string[]): boolean {\n return keys.some((key) => key in record);\n}\n\nfunction summarizeAction(args: unknown, toolName: string, fallback: string): string {\n const record = asRecord(args) ?? parseJsonObject(args);\n if (!record) return fallback;\n const tool = shortToolName(toolName);\n const command = asTrimmedString(record.command);\n const path = asTrimmedString(record.path);\n const isListDirShape = hasAny(record, [\"maxEntries\", \"recursive\", \"maxDepth\", \"includeHidden\"]);\n const isReadTextShape = hasAny(record, [\"maxBytes\", \"startLine\", \"endLine\", \"encoding\"]);\n if (tool === \"runCommand\" && command) return `run command: ${command}`;\n if (tool.includes(\"itermRunCommandInSession\") && command) return `run command: ${command}`;\n if (tool === \"listDir\" || (Boolean(path) && isListDirShape)) {\n if (!path || path === \".\") return \"list directory\";\n return `list directory: ${path}`;\n }\n if (tool === \"readText\" || (Boolean(path) && isReadTextShape)) {\n if (!path) return \"read file\";\n return `read file: ${path}`;\n }\n if (command) return `run command: ${command}`;\n const query = asTrimmedString(record.query);\n if (query) return `search/query: ${query}`;\n if (path) return `read path: ${path}`;\n return fallback;\n}\n\nfunction getResultError(payload: unknown): string | null {\n const payloadRecord = asRecord(payload);\n const result = payloadRecord?.result;\n const resultRecord = asRecord(result) ?? parseJsonObject(result);\n const nestedResult = asRecord(resultRecord?.result);\n return asTrimmedString(nestedResult?.error) ?? asTrimmedString(resultRecord?.error);\n}\n\nfunction getResultPreview(payload: unknown): string | null {\n const payloadRecord = asRecord(payload);\n const directPreview = asTrimmedString(payloadRecord?.resultPreview);\n if (directPreview) return directPreview;\n\n const result = payloadRecord?.result;\n const resultRecord = asRecord(result) ?? parseJsonObject(result);\n const nestedResult = asRecord(resultRecord?.result);\n const preview =\n asTrimmedString(nestedResult?.outputText)\n ?? asTrimmedString(nestedResult?.output)\n ?? asTrimmedString(resultRecord?.output)\n ?? asTrimmedString(resultRecord?.outputText);\n return preview ? preview.replace(/\\s+/g, \" \").trim() : null;\n}\n\nfunction writeProgress(writer: (line: string) => void, state: ProgressState): void {\n writer(` progress ${state.completedSteps}/${state.startedSteps}`);\n}\n\nfunction onRunStart(writer: (line: string) => void, state: ProgressState, runLabelText: string): void {\n state.runStartedAtMs = Date.now();\n state.startedSteps = 0;\n state.completedSteps = 0;\n state.currentStep = 0;\n state.steps.clear();\n state.pendingStepNumbers = [];\n writer(\"\");\n writer(`=== Steps: ${runLabelText} ===`);\n writer(`[${formatStepNumber(0)}] ▶ understand request and plan next action`);\n}\n\nfunction onRunDone(writer: (line: string) => void, state: ProgressState): void {\n const elapsed = state.runStartedAtMs === null ? \"?\" : formatElapsed(Date.now() - state.runStartedAtMs);\n writer(`[${formatStepNumber(0)}] ✓ understand request and plan next action`);\n writeProgress(writer, state);\n writer(`=== Steps complete: ${state.completedSteps} step(s), ${elapsed} ===`);\n writer(\"\");\n}\n\nfunction onToolStart(\n writer: (line: string) => void,\n state: ProgressState,\n event: AgentEvent,\n reasonForAction?: (action: string) => string | null,\n): void {\n state.currentStep += 1;\n state.startedSteps += 1;\n const stepNumber = state.currentStep;\n const payload = asRecord(event.payload);\n const action = summarizeAction(payload?.args, event.to, `invoke tool: ${shortToolName(event.to)}`);\n state.steps.set(stepNumber, { action, startedAtMs: Date.now() });\n state.pendingStepNumbers.push(stepNumber);\n writer(`[${formatStepNumber(stepNumber)}] ▶ ${action}`);\n writer(` tool: ${shortToolName(event.to)}`);\n const reason = reasonForAction?.(action);\n if (reason) writer(` reason: ${reason}`);\n}\n\nfunction onToolDoneWithPayload(writer: (line: string) => void, state: ProgressState, event: AgentEvent): void {\n const stepNumber = state.pendingStepNumbers.shift() ?? state.currentStep;\n const step = state.steps.get(stepNumber);\n const error = getResultError(event.payload);\n const preview = getResultPreview(event.payload);\n const elapsed = step ? formatElapsed(Date.now() - step.startedAtMs) : \"?\";\n if (error) {\n writer(`[${formatStepNumber(stepNumber)}] ✖ ${step?.action ?? \"tool invocation\"}`);\n writer(` error: ${error}`);\n } else {\n writer(`[${formatStepNumber(stepNumber)}] ✓ ${step?.action ?? \"tool invocation\"} (${elapsed})`);\n if (preview) writer(` observation: ${preview}`);\n }\n state.steps.delete(stepNumber);\n state.completedSteps += 1;\n writeProgress(writer, state);\n}\n\nfunction onToolError(writer: (line: string) => void, state: ProgressState, event: AgentEvent): void {\n const stepNumber = state.pendingStepNumbers.shift() ?? state.currentStep;\n const step = state.steps.get(stepNumber);\n const payload = asRecord(event.payload);\n const error = asTrimmedString(payload?.error) ?? \"unknown error\";\n writer(`[${formatStepNumber(stepNumber)}] ✖ ${step?.action ?? \"tool invocation\"}`);\n writer(` error: ${error}`);\n state.steps.delete(stepNumber);\n state.completedSteps += 1;\n writeProgress(writer, state);\n}\n\nexport function createProgressAgentEventListener(options: ProgressEventListenerOptions = {}): AgentEventListener {\n const writer = options.writer ?? console.log;\n const runLabelReact = options.runLabelReact ?? \"analysis\";\n const runLabelDeep = options.runLabelDeep ?? \"deep analysis\";\n\n const state: ProgressState = {\n runStartedAtMs: null,\n startedSteps: 0,\n completedSteps: 0,\n currentStep: 0,\n steps: new Map(),\n pendingStepNumbers: [],\n };\n\n return (event: AgentEvent): void => {\n switch (event.name) {\n case \"agent.react.run.start\":\n onRunStart(writer, state, runLabelReact);\n return;\n case \"agent.deep.run.start\":\n onRunStart(writer, state, runLabelDeep);\n return;\n case \"agent.react.skill.matched\":\n case \"agent.deep.skill.matched\": {\n const payload = asRecord(event.payload);\n const skillName = asTrimmedString(payload?.skill) ?? \"unknown\";\n writer(` skill: ${skillName}`);\n return;\n }\n case \"agent.react.context.truncated\":\n case \"agent.deep.context.truncated\":\n writer(\" context: truncated and compacted\");\n return;\n case \"agent.react.tool.invoke.start\":\n onToolStart(writer, state, event, options.reasonForAction);\n return;\n case \"agent.react.tool.invoke.done\":\n onToolDoneWithPayload(writer, state, event);\n return;\n case \"agent.react.tool.invoke.error\":\n onToolError(writer, state, event);\n return;\n case \"agent.react.memory.write.start\":\n writer(\" memory: write started\");\n return;\n case \"agent.react.memory.write.done\":\n writer(\" memory: write completed\");\n return;\n case \"agent.react.memory.write.error\":\n writer(\" memory: write failed\");\n return;\n case \"agent.react.ptc.retry\": {\n const payload = asRecord(event.payload);\n const retry = payload?.retry;\n const reason = asTrimmedString(payload?.reason);\n writer(` planning retry: attempt ${String(retry ?? \"?\")}${reason ? `, reason=${reason}` : \"\"}`);\n return;\n }\n case \"agent.react.run.done\":\n case \"agent.deep.run.done\":\n onRunDone(writer, state);\n return;\n default:\n return;\n }\n };\n}\n","import type { AgentEvent, AgentEventListener } from \"./index.js\";\n\nexport interface Runtime2EventDebugConfig {\n run?: boolean;\n workspace?: boolean;\n toolCall?: boolean;\n stream?: boolean;\n close?: boolean;\n}\n\nexport interface Runtime2EventRuntimeConfig {\n debug?: Runtime2EventDebugConfig;\n eventLogLevel?: \"silent\" | \"lifecycle\" | \"tools\" | \"verbose\";\n}\n\nexport interface Runtime2TreeEventListenerOptions {\n runtimeConfig?: Runtime2EventRuntimeConfig;\n writer?: (line: string) => void;\n}\n\ninterface ResolvedDebugConfig {\n run: boolean;\n workspace: boolean;\n toolCall: boolean;\n stream: boolean;\n close: boolean;\n}\n\nexport function createRuntime2TreeEventListener(\n options: Runtime2TreeEventListenerOptions = {}\n): AgentEventListener {\n const writer = options.writer ?? console.error;\n const debugConfig = resolveRuntime2DebugConfig(options.runtimeConfig);\n let currentRunThread: string | null = null;\n const toolCalls = new Map<string, { toolName: string; args?: Record<string, unknown> }>();\n\n return (event: AgentEvent): void => {\n const payload = asRecord(event.payload);\n if (shouldSkipRuntime2Event(event.name, debugConfig)) {\n return;\n }\n\n const lines = buildTreeLines(event, payload, currentRunThread, toolCalls);\n if (event.name === \"agent.runtime2.run.start\") {\n currentRunThread = typeof payload?.threadId === \"string\" ? payload.threadId : null;\n toolCalls.clear();\n } else if (event.name === \"agent.runtime2.run.done\" || event.name === \"agent.runtime2.run.error\") {\n currentRunThread = null;\n toolCalls.clear();\n }\n\n for (const line of lines) {\n writer(line);\n }\n };\n}\n\nexport function resolveRuntime2DebugConfig(\n runtimeConfig?: Runtime2EventRuntimeConfig\n): ResolvedDebugConfig {\n if (runtimeConfig?.debug) {\n return {\n run: runtimeConfig.debug.run ?? true,\n workspace: runtimeConfig.debug.workspace ?? true,\n toolCall: runtimeConfig.debug.toolCall ?? true,\n stream: runtimeConfig.debug.stream ?? false,\n close: runtimeConfig.debug.close ?? true,\n };\n }\n\n switch (runtimeConfig?.eventLogLevel ?? \"tools\") {\n case \"silent\":\n return { run: false, workspace: false, toolCall: false, stream: false, close: false };\n case \"lifecycle\":\n return { run: true, workspace: true, toolCall: false, stream: false, close: true };\n case \"verbose\":\n return { run: true, workspace: true, toolCall: true, stream: true, close: true };\n case \"tools\":\n default:\n return { run: true, workspace: true, toolCall: true, stream: false, close: true };\n }\n}\n\nfunction shouldSkipRuntime2Event(name: string, debugConfig: ResolvedDebugConfig): boolean {\n if (name.startsWith(\"agent.runtime2.stream.\")) {\n return !debugConfig.stream;\n }\n if (name.startsWith(\"agent.runtime2.tool.call.\")) {\n return !debugConfig.toolCall;\n }\n if (name.startsWith(\"agent.runtime2.workspace.\")) {\n if (name === \"agent.runtime2.workspace.prepare\" || name === \"agent.runtime2.workspace.run.update\") {\n return true;\n }\n return !debugConfig.workspace;\n }\n if (name.startsWith(\"agent.runtime2.run.\")) {\n if (name === \"agent.runtime2.run.prepare\") {\n return true;\n }\n return !debugConfig.run;\n }\n if (name.startsWith(\"agent.runtime2.close.\")) {\n return !debugConfig.close;\n }\n return false;\n}\n\nfunction buildTreeLines(\n event: Pick<AgentEvent, \"name\" | \"from\" | \"to\">,\n payload: Record<string, unknown> | undefined,\n currentRunThread: string | null,\n toolCalls: Map<string, { toolName: string; args?: Record<string, unknown> }>,\n): string[] {\n const from = shortComponent(event.from);\n const to = shortComponent(event.to);\n const action = event.name.replace(/^agent\\.runtime2\\./, \"\");\n const details = summarizePayload(event.name, payload);\n const suffix = details ? ` | ${details}` : \"\";\n\n if (event.name === \"agent.runtime2.run.start\") {\n return [\n `run ${typeof payload?.threadId === \"string\" ? payload.threadId : \"\"}`.trim(),\n `├─ ${from} -> ${to} | ${action}${suffix}`,\n ];\n }\n\n if (event.name === \"agent.runtime2.run.done\" || event.name === \"agent.runtime2.run.error\") {\n return [`└─ ${from} -> ${to} | ${action}${suffix}`];\n }\n\n if (event.name === \"agent.runtime2.tool.call.start\") {\n const id = typeof payload?.toolCallId === \"string\" ? payload.toolCallId : \"\";\n if (id) {\n toolCalls.set(id, {\n toolName: to,\n args: asRecord(payload?.args),\n });\n }\n return [];\n }\n\n if (\n event.name === \"agent.runtime2.tool.call.done\"\n || event.name === \"agent.runtime2.tool.call.error\"\n || event.name === \"agent.runtime2.tool.call.blocked\"\n ) {\n const id = typeof payload?.toolCallId === \"string\" ? payload.toolCallId : \"\";\n const remembered = id ? toolCalls.get(id) : undefined;\n if (id) {\n toolCalls.delete(id);\n }\n const fallbackToolName = event.name === \"agent.runtime2.tool.call.blocked\" ? to : from;\n const icon = event.name === \"agent.runtime2.tool.call.done\"\n ? \"OK\"\n : event.name === \"agent.runtime2.tool.call.blocked\"\n ? \"BLOCKED\"\n : \"ERROR\";\n const combined = compactFields([\n summarizeToolArgs(remembered?.args ?? asRecord(payload?.args)),\n details,\n ]);\n return [`├─ ${icon} ${remembered?.toolName ?? fallbackToolName}${combined ? ` | ${combined}` : \"\"}`];\n }\n\n const prefix = currentRunThread ? \"├─\" : \"•\";\n return [`${prefix} ${from} -> ${to} | ${action}${suffix}`];\n}\n\nfunction summarizePayload(name: string, payload?: Record<string, unknown>): string | null {\n switch (name) {\n case \"agent.runtime2.run.start\":\n return typeof payload?.threadId === \"string\" ? `thread=${payload.threadId}` : null;\n case \"agent.runtime2.run.done\":\n return compactFields([\n formatField(\"steps\", payload?.stepCount),\n formatDuration(payload?.durationMs),\n formatField(\"summary\", payload?.lastSummary),\n ]);\n case \"agent.runtime2.run.error\":\n return compactFields([\n formatField(\"summary\", payload?.lastSummary),\n formatField(\"error\", payload?.error),\n ]);\n case \"agent.runtime2.stream.summary\":\n return typeof payload?.summary === \"string\" ? payload.summary : null;\n case \"agent.runtime2.stream.heartbeat\":\n return formatDuration(payload?.elapsedMs);\n case \"agent.runtime2.tool.call.done\":\n case \"agent.runtime2.tool.call.error\":\n case \"agent.runtime2.tool.call.blocked\":\n return compactFields([\n formatDuration(payload?.durationMs),\n formatField(\"reason\", payload?.reason),\n formatField(\"error\", payload?.error),\n ]);\n case \"agent.runtime2.workspace.run.update\":\n case \"agent.runtime2.workspace.run.finish\":\n return compactFields([\n formatField(\"steps\", payload?.stepCount),\n formatField(\"summary\", payload?.lastSummary),\n formatField(\"status\", payload?.status),\n ]);\n case \"agent.runtime2.run.retry.empty\":\n case \"agent.runtime2.run.retry.incomplete\":\n case \"agent.runtime2.run.retry.idle_timeout\":\n case \"agent.runtime2.run.retry.transient_model\":\n case \"agent.runtime2.run.retry.tool_call\":\n return compactFields([\n formatField(\"attempt\", formatAttempt(payload?.attempt, payload?.maxRetries)),\n formatField(\"summary\", payload?.lastSummary),\n formatField(\"error\", payload?.error),\n ]);\n default:\n return compactFields([\n formatField(\"thread\", payload?.threadId),\n formatField(\"steps\", payload?.stepCount),\n formatField(\"status\", payload?.status),\n ]);\n }\n}\n\nfunction summarizeToolArgs(args: Record<string, unknown> | undefined): string | null {\n if (!args) {\n return null;\n }\n\n return compactFields([\n formatArg(\"path\", args.file_path ?? args.path),\n formatArg(\"query\", args.query),\n formatArg(\"symbol\", args.symbol),\n formatArg(\"ticker\", args.ticker),\n formatArg(\"command\", args.command),\n formatArg(\"subagent_type\", args.subagent_type),\n ]);\n}\n\nfunction formatArg(key: string, value: unknown): string | null {\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n return null;\n }\n const text = String(value).trim();\n if (!text) {\n return null;\n }\n return `${key}=${truncate(text, 80)}`;\n}\n\nfunction formatField(key: string, value: unknown): string | null {\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n return null;\n }\n const text = String(value).trim();\n if (!text) {\n return null;\n }\n return `${key}=${truncate(text, 80)}`;\n}\n\nfunction formatAttempt(attempt: unknown, maxRetries: unknown): string | null {\n if (typeof attempt !== \"number\") {\n return null;\n }\n return typeof maxRetries === \"number\" ? `${attempt}/${maxRetries}` : String(attempt);\n}\n\nfunction formatDuration(durationMs: unknown): string | null {\n if (typeof durationMs !== \"number\") {\n return null;\n }\n if (durationMs < 1_000) {\n return `elapsed=${Math.round(durationMs)}ms`;\n }\n if (durationMs < 10_000) {\n return `elapsed=${(durationMs / 1000).toFixed(2)}s`;\n }\n return `elapsed=${(durationMs / 1000).toFixed(1)}s`;\n}\n\nfunction shortComponent(value: string | undefined): string {\n return (value ?? \"?\").replace(/^agent-runtime2\\./, \"\");\n}\n\nfunction compactFields(fields: Array<string | null>): string | null {\n const items = fields.filter((field): field is string => Boolean(field));\n return items.length > 0 ? items.join(\", \") : null;\n}\n\nfunction truncate(value: string, maxLength: number): string {\n return value.length > maxLength ? `${value.slice(0, maxLength - 3)}...` : value;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined;\n}\n","import { getDefaultAgentContext, AgentContextTokens } from \"../context/index.js\";\n\nexport interface AgentEvent<TPayload = unknown> {\n id: string;\n name: string;\n from: string;\n to: string;\n at: string;\n payload?: TPayload;\n}\n\nexport interface AgentEventBus {\n publish<TPayload = unknown>(event: Omit<AgentEvent<TPayload>, \"id\" | \"at\">): AgentEvent<TPayload>;\n subscribe(listener: AgentEventListener): () => void;\n}\n\nexport type AgentEventListener = (event: AgentEvent) => void;\n\nclass DefaultAgentEventBus implements AgentEventBus {\n private listeners = new Set<AgentEventListener>();\n\n publish<TPayload = unknown>(\n event: Omit<AgentEvent<TPayload>, \"id\" | \"at\">\n ): AgentEvent<TPayload> {\n const resolved: AgentEvent<TPayload> = {\n ...event,\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`,\n at: new Date().toISOString(),\n };\n for (const listener of this.listeners) {\n try {\n listener(resolved);\n } catch {\n // Listener failures must not break agent runtime.\n }\n }\n return resolved;\n }\n\n subscribe(listener: AgentEventListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n}\n\nexport function createAgentEventBus(): AgentEventBus {\n const bus = new DefaultAgentEventBus();\n getDefaultAgentContext().set(AgentContextTokens.EventBus, bus);\n return bus;\n}\n\nexport function createConsoleAgentEventListener(\n writer: (line: string) => void = console.error\n): AgentEventListener {\n return (event) => {\n writer(`[${event.at}] ${event.from} -> ${event.to} ${event.name}`);\n };\n}\n\nexport {\n createProgressAgentEventListener,\n type ProgressEventListenerOptions,\n} from \"./progress-listener.js\";\nexport {\n createRuntime2TreeEventListener,\n resolveRuntime2DebugConfig,\n type Runtime2EventDebugConfig,\n type Runtime2EventRuntimeConfig,\n type Runtime2TreeEventListenerOptions,\n} from \"./runtime2-tree-listener.js\";\n"],"mappings":"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","names":["asRecord"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context/default-context.ts"],"sourcesContent":["export interface AgentContext {\n set<T>(token: symbol, value: T): void;\n get<T>(token: symbol): T;\n has(token: symbol): boolean;\n tryGet<T>(token: symbol): T | undefined;\n}\n\nclass DefaultAgentContext implements AgentContext {\n private readonly registry = new Map<symbol, unknown>();\n\n set<T>(token: symbol, value: T): void {\n this.registry.set(token, value);\n }\n\n get<T>(token: symbol): T {\n if (!this.registry.has(token)) {\n throw new Error(`AgentContext: token not registered: ${token.toString()}`);\n }\n return this.registry.get(token) as T;\n }\n\n has(token: symbol): boolean {\n return this.registry.has(token);\n }\n\n tryGet<T>(token: symbol): T | undefined {\n return this.registry.get(token) as T | undefined;\n }\n}\n\nconst DEFAULT_CONTEXT_KEY = \"__botbotgo_agent_default_context__\";\n\nfunction getGlobalStore(): Record<string, unknown> {\n return globalThis as unknown as Record<string, unknown>;\n}\n\nexport function createAgentContext(): AgentContext {\n return new DefaultAgentContext();\n}\n\nexport function isAgentContext(value: unknown): value is AgentContext {\n return (\n typeof value === \"object\"\n && value !== null\n && typeof (value as AgentContext).get === \"function\"\n && typeof (value as AgentContext).set === \"function\"\n && typeof (value as AgentContext).has === \"function\"\n );\n}\n\nexport function getDefaultAgentContext(): AgentContext {\n const store = getGlobalStore();\n const existing = store[DEFAULT_CONTEXT_KEY];\n if (isAgentContext(existing)) return existing;\n const created = createAgentContext();\n store[DEFAULT_CONTEXT_KEY] = created;\n return created;\n}\n\nexport function resetDefaultAgentContext(): void {\n const store = getGlobalStore();\n if (DEFAULT_CONTEXT_KEY in store) {\n delete store[DEFAULT_CONTEXT_KEY];\n }\n}\n"],"mappings":";AAOA,IAAM,sBAAN,MAAkD;AAAA,EAC/B,WAAW,oBAAI,IAAqB;AAAA,EAErD,IAAO,OAAe,OAAgB;AACpC,SAAK,SAAS,IAAI,OAAO,KAAK;AAAA,EAChC;AAAA,EAEA,IAAO,OAAkB;AACvB,QAAI,CAAC,KAAK,SAAS,IAAI,KAAK,GAAG;AAC7B,YAAM,IAAI,MAAM,uCAAuC,MAAM,SAAS,CAAC,EAAE;AAAA,IAC3E;AACA,WAAO,KAAK,SAAS,IAAI,KAAK;AAAA,EAChC;AAAA,EAEA,IAAI,OAAwB;AAC1B,WAAO,KAAK,SAAS,IAAI,KAAK;AAAA,EAChC;AAAA,EAEA,OAAU,OAA8B;AACtC,WAAO,KAAK,SAAS,IAAI,KAAK;AAAA,EAChC;AACF;AAEA,IAAM,sBAAsB;AAE5B,SAAS,iBAA0C;AACjD,SAAO;AACT;AAEO,SAAS,qBAAmC;AACjD,SAAO,IAAI,oBAAoB;AACjC;AAEO,SAAS,eAAe,OAAuC;AACpE,SACE,OAAO,UAAU,YACd,UAAU,QACV,OAAQ,MAAuB,QAAQ,cACvC,OAAQ,MAAuB,QAAQ,cACvC,OAAQ,MAAuB,QAAQ;AAE9C;AAEO,SAAS,yBAAuC;AACrD,QAAM,QAAQ,eAAe;AAC7B,QAAM,WAAW,MAAM,mBAAmB;AAC1C,MAAI,eAAe,QAAQ,EAAG,QAAO;AACrC,QAAM,UAAU,mBAAmB;AACnC,QAAM,mBAAmB,IAAI;AAC7B,SAAO;AACT;AAEO,SAAS,2BAAiC;AAC/C,QAAM,QAAQ,eAAe;AAC7B,MAAI,uBAAuB,OAAO;AAChC,WAAO,MAAM,mBAAmB;AAAA,EAClC;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context/tokens.ts"],"sourcesContent":["import { computeChecksum } from \"../utils/checksum.js\";\n\nfunction createChecksummedToken(scope: string, name: string): symbol {\n const seed = `${scope}:${name}`;\n const checksum = computeChecksum(seed, { length: 12 });\n return Symbol.for(`${scope}.${name}.${checksum}`);\n}\n\n/**\n * Well-known Symbol tokens for AgentContext.\n * Use these to register and retrieve modules from an AgentContext.\n *\n * @example\n * ```ts\n * ctx.set(AgentContextTokens.ChatModel, llm);\n * const llm = ctx.get<BaseChatModel>(AgentContextTokens.ChatModel);\n * ```\n */\nexport const AgentContextTokens = {\n /** The shared AgentEventBus instance */\n EventBus: createChecksummedToken(\"botbotgo.agent.context\", \"eventBus\"),\n /** The primary chat model (BaseChatModel) */\n ChatModel: createChecksummedToken(\"botbotgo.agent.context\", \"chatModel\"),\n /** The embedding model (Embeddings) */\n EmbedModel: createChecksummedToken(\"botbotgo.agent.context\", \"embedModel\"),\n /** The vision-language chat model (BaseChatModel) */\n VlmModel: createChecksummedToken(\"botbotgo.agent.context\", \"vlmModel\"),\n /** The memory client (AgentMemory) */\n Memory: createChecksummedToken(\"botbotgo.agent.context\", \"memory\"),\n /** The initialized tool list */\n Tools: createChecksummedToken(\"botbotgo.agent.context\", \"tools\"),\n /** The loaded skill set (SkillSet | undefined) */\n SkillSet: createChecksummedToken(\"botbotgo.agent.context\", \"skillSet\"),\n /** The initialized agent runtime instance (react/deep) */\n Runtime: createChecksummedToken(\"botbotgo.agent.context\", \"runtime\"),\n} as const;\n\nexport type AgentContextTokenKey = (typeof AgentContextTokens)[keyof typeof AgentContextTokens];\n"],"mappings":";;;;;AAEA,SAAS,uBAAuB,OAAe,MAAsB;AACnE,QAAM,OAAO,GAAG,KAAK,IAAI,IAAI;AAC7B,QAAM,WAAW,gBAAgB,MAAM,EAAE,QAAQ,GAAG,CAAC;AACrD,SAAO,uBAAO,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,QAAQ,EAAE;AAClD;AAYO,IAAM,qBAAqB;AAAA;AAAA,EAEhC,UAAU,uBAAuB,0BAA0B,UAAU;AAAA;AAAA,EAErE,WAAW,uBAAuB,0BAA0B,WAAW;AAAA;AAAA,EAEvE,YAAY,uBAAuB,0BAA0B,YAAY;AAAA;AAAA,EAEzE,UAAU,uBAAuB,0BAA0B,UAAU;AAAA;AAAA,EAErE,QAAQ,uBAAuB,0BAA0B,QAAQ;AAAA;AAAA,EAEjE,OAAO,uBAAuB,0BAA0B,OAAO;AAAA;AAAA,EAE/D,UAAU,uBAAuB,0BAA0B,UAAU;AAAA;AAAA,EAErE,SAAS,uBAAuB,0BAA0B,SAAS;AACrE;","names":[]}
|
|
File without changes
|