@openacp/cli 2026.328.2 → 2026.330.2

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.
Files changed (85) hide show
  1. package/dist/{adapter-HGJENQCN.js → adapter-4U6MC5ZS.js} +4 -4
  2. package/dist/api-server-5VNYFWJE.js +7 -0
  3. package/dist/{api-server-WFB5K6FP.js → api-server-JLBDKCU4.js} +2 -2
  4. package/dist/{chunk-I53NEV3S.js → chunk-5WGVYX3C.js} +13 -3
  5. package/dist/chunk-5WGVYX3C.js.map +1 -0
  6. package/dist/{chunk-RXMWJHWH.js → chunk-5ZNBNIK3.js} +723 -217
  7. package/dist/chunk-5ZNBNIK3.js.map +1 -0
  8. package/dist/{chunk-6VR4GWOO.js → chunk-7RKPIM3E.js} +247 -70
  9. package/dist/chunk-7RKPIM3E.js.map +1 -0
  10. package/dist/{chunk-IXMIC4GQ.js → chunk-BTJHGSLM.js} +2 -2
  11. package/dist/{chunk-5TCXYDLR.js → chunk-CFUJGWOP.js} +2 -2
  12. package/dist/{chunk-43JVXFYP.js → chunk-GEOXPGCO.js} +2 -2
  13. package/dist/{chunk-JUFN4XMB.js → chunk-KDU3ZEWT.js} +2 -2
  14. package/dist/{chunk-QWP76EBW.js → chunk-MITTQMGZ.js} +16 -9
  15. package/dist/chunk-MITTQMGZ.js.map +1 -0
  16. package/dist/{chunk-QBEQJFGL.js → chunk-MPGEHTGE.js} +3 -3
  17. package/dist/{chunk-4B6PCWQP.js → chunk-PA6MNBG4.js} +6 -2
  18. package/dist/chunk-PA6MNBG4.js.map +1 -0
  19. package/dist/{chunk-VD3QSMVY.js → chunk-QWVHCTCA.js} +2 -2
  20. package/dist/{chunk-NT6FYV27.js → chunk-TMVTSWVH.js} +2 -2
  21. package/dist/chunk-UWH7KIAA.js +701 -0
  22. package/dist/chunk-UWH7KIAA.js.map +1 -0
  23. package/dist/{chunk-JOMDPFQ2.js → chunk-W4LK6WJP.js} +29 -4
  24. package/dist/chunk-W4LK6WJP.js.map +1 -0
  25. package/dist/{chunk-E2SLHZAC.js → chunk-YIGBJFJL.js} +6 -6
  26. package/dist/cli.js +63 -68
  27. package/dist/cli.js.map +1 -1
  28. package/dist/config-KN6NKKPF.js +20 -0
  29. package/dist/{config-editor-OU6PUY66.js → config-editor-76RVZS4B.js} +3 -3
  30. package/dist/context-NXXW62NJ.js +9 -0
  31. package/dist/{core-plugins-R2EVZAJV.js → core-plugins-OCHKGCIZ.js} +9 -9
  32. package/dist/{daemon-DTA6KYYY.js → daemon-XFEMMJSZ.js} +3 -3
  33. package/dist/doctor-AV6AUO22.js +9 -0
  34. package/dist/index.d.ts +104 -42
  35. package/dist/index.js +8 -8
  36. package/dist/{main-RRSX5SRL.js → main-L2M4NTJY.js} +38 -30
  37. package/dist/main-L2M4NTJY.js.map +1 -0
  38. package/dist/{plugin-installer-5XHORMLS.js → plugin-installer-VSTYZSXC.js} +2 -2
  39. package/dist/{setup-OI6A3OXW.js → setup-E6BNEYCS.js} +4 -5
  40. package/dist/setup-E6BNEYCS.js.map +1 -0
  41. package/dist/speech-SG62JYIF.js +9 -0
  42. package/dist/telegram-EAVRDNFU.js +7 -0
  43. package/dist/tunnel-HWJ27WDH.js +7 -0
  44. package/dist/{tunnel-service-I2NFUX3V.js → tunnel-service-ZMO4THKE.js} +88 -8
  45. package/dist/tunnel-service-ZMO4THKE.js.map +1 -0
  46. package/package.json +1 -1
  47. package/dist/api-server-DSUW637I.js +0 -7
  48. package/dist/chunk-4B6PCWQP.js.map +0 -1
  49. package/dist/chunk-6VR4GWOO.js.map +0 -1
  50. package/dist/chunk-I53NEV3S.js.map +0 -1
  51. package/dist/chunk-JOMDPFQ2.js.map +0 -1
  52. package/dist/chunk-QWP76EBW.js.map +0 -1
  53. package/dist/chunk-RXMWJHWH.js.map +0 -1
  54. package/dist/chunk-ZHGPZBS4.js +0 -49
  55. package/dist/chunk-ZHGPZBS4.js.map +0 -1
  56. package/dist/config-UCAFCS5W.js +0 -14
  57. package/dist/context-7MPU7RL5.js +0 -9
  58. package/dist/doctor-D723IB2I.js +0 -9
  59. package/dist/main-RRSX5SRL.js.map +0 -1
  60. package/dist/setup-OI6A3OXW.js.map +0 -1
  61. package/dist/speech-GB7PHVQZ.js +0 -9
  62. package/dist/telegram-UVIAXADE.js +0 -7
  63. package/dist/tunnel-4WNFC7GO.js +0 -7
  64. package/dist/tunnel-service-I2NFUX3V.js.map +0 -1
  65. /package/dist/{adapter-HGJENQCN.js.map → adapter-4U6MC5ZS.js.map} +0 -0
  66. /package/dist/{api-server-DSUW637I.js.map → api-server-5VNYFWJE.js.map} +0 -0
  67. /package/dist/{api-server-WFB5K6FP.js.map → api-server-JLBDKCU4.js.map} +0 -0
  68. /package/dist/{chunk-IXMIC4GQ.js.map → chunk-BTJHGSLM.js.map} +0 -0
  69. /package/dist/{chunk-5TCXYDLR.js.map → chunk-CFUJGWOP.js.map} +0 -0
  70. /package/dist/{chunk-43JVXFYP.js.map → chunk-GEOXPGCO.js.map} +0 -0
  71. /package/dist/{chunk-JUFN4XMB.js.map → chunk-KDU3ZEWT.js.map} +0 -0
  72. /package/dist/{chunk-QBEQJFGL.js.map → chunk-MPGEHTGE.js.map} +0 -0
  73. /package/dist/{chunk-VD3QSMVY.js.map → chunk-QWVHCTCA.js.map} +0 -0
  74. /package/dist/{chunk-NT6FYV27.js.map → chunk-TMVTSWVH.js.map} +0 -0
  75. /package/dist/{chunk-E2SLHZAC.js.map → chunk-YIGBJFJL.js.map} +0 -0
  76. /package/dist/{config-UCAFCS5W.js.map → config-KN6NKKPF.js.map} +0 -0
  77. /package/dist/{config-editor-OU6PUY66.js.map → config-editor-76RVZS4B.js.map} +0 -0
  78. /package/dist/{context-7MPU7RL5.js.map → context-NXXW62NJ.js.map} +0 -0
  79. /package/dist/{core-plugins-R2EVZAJV.js.map → core-plugins-OCHKGCIZ.js.map} +0 -0
  80. /package/dist/{daemon-DTA6KYYY.js.map → daemon-XFEMMJSZ.js.map} +0 -0
  81. /package/dist/{doctor-D723IB2I.js.map → doctor-AV6AUO22.js.map} +0 -0
  82. /package/dist/{plugin-installer-5XHORMLS.js.map → plugin-installer-VSTYZSXC.js.map} +0 -0
  83. /package/dist/{speech-GB7PHVQZ.js.map → speech-SG62JYIF.js.map} +0 -0
  84. /package/dist/{telegram-UVIAXADE.js.map → telegram-EAVRDNFU.js.map} +0 -0
  85. /package/dist/{tunnel-4WNFC7GO.js.map → tunnel-HWJ27WDH.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/plugins/context/index.ts","../../src/plugins/context/history/history-context-builder.ts","../../src/plugins/context/history/history-provider.ts","../../src/plugins/context/history/history-recorder.ts","../../src/plugins/context/history/history-store.ts"],"sourcesContent":["import * as os from 'node:os'\nimport * as path from 'node:path'\nimport type { OpenACPPlugin, InstallContext } from '../../core/plugin/types.js'\nimport type { SessionRecord } from '../../core/types.js'\nimport { ContextManager } from './context-manager.js'\nimport { EntireProvider } from './entire/entire-provider.js'\nimport { HistoryProvider } from './history/history-provider.js'\nimport { HistoryRecorder } from './history/history-recorder.js'\nimport { HistoryStore } from './history/history-store.js'\n\nconst contextPlugin: OpenACPPlugin = {\n name: '@openacp/context',\n version: '1.0.0',\n description: 'Conversation context management with pluggable providers',\n essential: false,\n permissions: ['services:register', 'middleware:register', 'kernel:access'],\n\n async install(ctx: InstallContext) {\n const { settings, terminal } = ctx\n\n // No interactive prompts needed — save defaults\n await settings.setAll({ enabled: true })\n terminal.log.success('Context defaults saved')\n },\n\n async configure(ctx: InstallContext) {\n const { terminal, settings } = ctx\n const current = await settings.getAll()\n\n const toggle = await terminal.confirm({\n message: `Context service is ${current.enabled !== false ? 'enabled' : 'disabled'}. Toggle?`,\n initialValue: false,\n })\n if (toggle) {\n const newState = current.enabled === false\n await settings.set('enabled', newState)\n terminal.log.success(`Context service ${newState ? 'enabled' : 'disabled'}`)\n }\n },\n\n async uninstall(ctx: InstallContext, opts: { purge: boolean }) {\n if (opts.purge) {\n await ctx.settings.clear()\n ctx.terminal.log.success('Context settings cleared')\n }\n },\n\n async setup(ctx) {\n // History recording and context\n const historyDir = path.join(os.homedir(), '.openacp', 'history')\n const store = new HistoryStore(historyDir)\n const recorder = new HistoryRecorder(store)\n\n // Access session records via SessionManager (kernel:access)\n const sessionManager = ctx.sessions as { listRecords(): SessionRecord[] }\n const getRecords = () => sessionManager.listRecords()\n\n // Register providers — local first (priority), entire as fallback\n const manager = new ContextManager()\n manager.register(new HistoryProvider(store, getRecords))\n manager.register(new EntireProvider())\n ctx.registerService('context', manager)\n\n // Middleware: capture user prompts\n ctx.registerMiddleware('agent:beforePrompt', {\n priority: 200,\n handler: async (payload, next) => {\n recorder.onBeforePrompt(payload.sessionId, payload.text, payload.attachments)\n return next()\n },\n })\n\n // Middleware: capture agent events\n ctx.registerMiddleware('agent:afterEvent', {\n priority: 200,\n handler: async (payload, next) => {\n recorder.onAfterEvent(payload.sessionId, payload.event)\n return next()\n },\n })\n\n // Middleware: finalize turn and write to disk\n ctx.registerMiddleware('turn:end', {\n priority: 200,\n handler: async (payload, next) => {\n await recorder.onTurnEnd(payload.sessionId, payload.stopReason)\n return next()\n },\n })\n\n // Middleware: capture permission resolutions\n ctx.registerMiddleware('permission:afterResolve', {\n priority: 200,\n handler: async (payload, next) => {\n recorder.onPermissionResolved(payload.sessionId, payload.requestId, payload.decision)\n return next()\n },\n })\n\n // Middleware: clean up recorder memory on session destroy\n ctx.registerMiddleware('session:afterDestroy', {\n priority: 200,\n handler: async (payload, next) => {\n recorder.finalize(payload.sessionId)\n return next()\n },\n })\n\n ctx.log.info('Context service ready (local history + entire providers)')\n },\n}\n\nexport default contextPlugin\n","import type { ContextMode } from \"../context-provider.js\";\nimport type { Turn, Step, ToolCallStep } from \"./types.js\";\n\nexport function selectLevel(turnCount: number): ContextMode {\n if (turnCount <= 10) return \"full\";\n if (turnCount <= 25) return \"balanced\";\n return \"compact\";\n}\n\nexport function estimateTokens(text: string): number {\n return Math.floor(text.length / 4);\n}\n\nexport function buildHistoryMarkdown(turns: Turn[], mode: ContextMode): string {\n if (turns.length === 0) return \"\";\n switch (mode) {\n case \"full\":\n return buildFull(turns);\n case \"balanced\":\n return buildBalanced(turns);\n case \"compact\":\n return buildCompact(turns);\n }\n}\n\n// ─── Full Mode ───────────────────────────────────────────────────────────────\n\nfunction buildFull(turns: Turn[]): string {\n const out: string[] = [];\n let userIndex = 0;\n\n for (const turn of turns) {\n if (turn.role === \"user\") {\n userIndex++;\n out.push(`**User [${userIndex}]:**`);\n out.push(turn.content ?? \"\");\n if (turn.attachments?.length) {\n out.push(turn.attachments.map((a) => `[${a.type}: ${a.fileName}]`).join(\" \"));\n }\n out.push(\"\");\n } else if (turn.role === \"assistant\" && turn.steps?.length) {\n out.push(\"**Assistant:**\");\n\n for (const step of turn.steps) {\n out.push(renderStepFull(step));\n }\n\n if (turn.usage) {\n const parts: string[] = [];\n if (turn.usage.tokensUsed) parts.push(`${turn.usage.tokensUsed.toLocaleString()} tokens`);\n if (turn.usage.cost) parts.push(`$${turn.usage.cost.amount.toFixed(4)}`);\n if (parts.length) out.push(`**Usage**: ${parts.join(\", \")}`);\n }\n\n out.push(\"\");\n out.push(\"---\");\n out.push(\"\");\n }\n }\n\n return out.join(\"\\n\");\n}\n\nfunction renderStepFull(step: Step): string {\n switch (step.type) {\n case \"thinking\":\n return `> **Thinking**: ${step.content}\\n`;\n case \"text\":\n return `${step.content}\\n`;\n case \"tool_call\":\n return renderToolCallFull(step);\n case \"plan\":\n return renderPlan(step.entries);\n case \"image\":\n return `[Image: ${step.mimeType}]\\n`;\n case \"audio\":\n return `[Audio: ${step.mimeType}]\\n`;\n case \"resource\":\n return `[Resource: ${step.name}] ${step.uri}\\n`;\n case \"resource_link\":\n return `[Resource Link: ${step.name}] ${step.uri}\\n`;\n case \"mode_change\":\n return `*Mode changed to: ${step.modeId}*\\n`;\n case \"config_change\":\n return `*Config ${step.configId} set to: ${step.value}*\\n`;\n }\n}\n\nfunction renderToolCallFull(step: ToolCallStep): string {\n const lines: string[] = [];\n const loc = step.locations?.[0];\n const locStr = loc ? (loc.line ? `${loc.path}:${loc.line}` : loc.path) : \"\";\n\n if (step.diff) {\n lines.push(`**[${step.name}]** \\`${locStr || step.diff.path}\\``);\n lines.push(\"```diff\");\n if (step.diff.oldText) {\n for (const line of step.diff.oldText.split(\"\\n\")) lines.push(`- ${line}`);\n }\n for (const line of step.diff.newText.split(\"\\n\")) lines.push(`+ ${line}`);\n lines.push(\"```\");\n } else {\n lines.push(`**[${step.name}]** \\`${locStr}\\``);\n }\n\n if (step.permission) {\n lines.push(`*Permission: ${step.permission.outcome}*`);\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderPlan(entries: { content: string; priority: string; status: string }[]): string {\n const lines = [\"**Plan:**\"];\n for (const e of entries) {\n const icon = e.status === \"completed\" || e.status === \"done\" ? \"✅\" : e.status === \"in_progress\" ? \"🔄\" : \"⬜\";\n lines.push(`${icon} ${e.content} (${e.priority})`);\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n// ─── Balanced Mode ───────────────────────────────────────────────────────────\n\nfunction buildBalanced(turns: Turn[]): string {\n const out: string[] = [];\n let userIndex = 0;\n\n for (const turn of turns) {\n if (turn.role === \"user\") {\n userIndex++;\n out.push(`**User [${userIndex}]:**`);\n out.push(turn.content ?? \"\");\n out.push(\"\");\n } else if (turn.role === \"assistant\" && turn.steps?.length) {\n out.push(\"**Assistant:**\");\n\n for (const step of turn.steps) {\n if (step.type === \"thinking\") continue;\n\n if (step.type === \"text\") {\n out.push(step.content);\n } else if (step.type === \"tool_call\") {\n out.push(renderToolCallBalanced(step));\n } else if (step.type === \"plan\") {\n out.push(renderPlan(step.entries));\n } else {\n out.push(renderStepFull(step));\n }\n }\n\n out.push(\"\");\n out.push(\"---\");\n out.push(\"\");\n }\n }\n\n return out.join(\"\\n\");\n}\n\nfunction renderToolCallBalanced(step: ToolCallStep): string {\n const loc = step.locations?.[0];\n const locStr = loc ? (loc.line ? `${loc.path}:${loc.line}` : loc.path) : \"\";\n\n if (step.diff) {\n const oldLines = step.diff.oldText?.split(\"\\n\").length ?? 0;\n const newLines = step.diff.newText.split(\"\\n\").length;\n return `- ${step.name} \\`${locStr || step.diff.path}\\` (-${oldLines}/+${newLines} lines)`;\n }\n\n return `- ${step.name} \\`${locStr}\\``;\n}\n\n// ─── Compact Mode ────────────────────────────────────────────────────────────\n\nfunction buildCompact(turns: Turn[]): string {\n const out: string[] = [];\n let i = 0;\n\n while (i < turns.length) {\n const turn = turns[i];\n if (turn.role === \"user\") {\n const userText = (turn.content ?? \"\").slice(0, 100);\n const nextTurn = turns[i + 1];\n if (nextTurn?.role === \"assistant\" && nextTurn.steps?.length) {\n const tools = nextTurn.steps\n .filter((s) => s.type === \"tool_call\")\n .map((s) => (s as ToolCallStep).name);\n const texts = nextTurn.steps\n .filter((s) => s.type === \"text\")\n .map((s) => (s as { content: string }).content.slice(0, 80));\n const parts: string[] = [];\n if (tools.length) parts.push(tools.join(\", \"));\n if (texts.length) parts.push(texts.join(\" \"));\n out.push(`User: ${userText} → Assistant: ${parts.join(\" | \")}`);\n i += 2;\n } else {\n out.push(`User: ${userText}`);\n i++;\n }\n } else {\n i++;\n }\n }\n\n return out.join(\"\\n\");\n}\n","import type { SessionRecord } from \"../../../core/types.js\";\nimport type {\n ContextProvider,\n ContextQuery,\n ContextOptions,\n ContextResult,\n ContextMode,\n SessionInfo,\n SessionListResult,\n} from \"../context-provider.js\";\nimport { DEFAULT_MAX_TOKENS, TOKENS_PER_TURN_ESTIMATE } from \"../context-provider.js\";\nimport { HistoryStore } from \"./history-store.js\";\nimport {\n buildHistoryMarkdown,\n selectLevel,\n estimateTokens,\n} from \"./history-context-builder.js\";\n\nconst EMPTY_RESULT: ContextResult = {\n markdown: \"\",\n tokenEstimate: 0,\n sessionCount: 0,\n totalTurns: 0,\n mode: \"full\",\n truncated: false,\n timeRange: { start: \"\", end: \"\" },\n};\n\nexport class HistoryProvider implements ContextProvider {\n readonly name = \"local\";\n\n constructor(\n private readonly store: HistoryStore,\n private readonly getSessionRecords: () => SessionRecord[]\n ) {}\n\n async isAvailable(_repoPath: string): Promise<boolean> {\n return true;\n }\n\n async listSessions(query: ContextQuery): Promise<SessionListResult> {\n if (!this.isSupportedType(query.type)) {\n return { sessions: [], estimatedTokens: 0 };\n }\n\n const candidates = await this.resolveCandidates(query);\n const sessions: SessionInfo[] = [];\n let estimatedTokens = 0;\n\n for (const record of candidates) {\n const history = await this.store.read(record.sessionId);\n if (!history) continue;\n const turnCount = history.turns.length;\n const tokenEstimate = turnCount * TOKENS_PER_TURN_ESTIMATE;\n sessions.push(this.toSessionInfo(record, turnCount));\n estimatedTokens += tokenEstimate;\n }\n\n return { sessions, estimatedTokens };\n }\n\n async buildContext(query: ContextQuery, options?: ContextOptions): Promise<ContextResult> {\n if (!this.isSupportedType(query.type)) {\n return { ...EMPTY_RESULT };\n }\n\n const maxTokens = options?.maxTokens ?? DEFAULT_MAX_TOKENS;\n const candidates = await this.resolveCandidates(query, options?.limit);\n\n // Load histories for sessions that have files\n type LoadedSession = {\n record: SessionRecord;\n history: import(\"./types.js\").SessionHistory;\n };\n\n const loaded: LoadedSession[] = [];\n for (const record of candidates) {\n const history = await this.store.read(record.sessionId);\n if (history) {\n loaded.push({ record, history });\n }\n }\n\n if (loaded.length === 0) {\n return { ...EMPTY_RESULT };\n }\n\n const totalTurns = loaded.reduce((sum, s) => sum + s.history.turns.length, 0);\n\n // Auto-select mode based on total turn count\n let mode: ContextMode = selectLevel(totalTurns);\n\n // Build markdown with selected mode\n let markdown = this.buildMergedMarkdown(loaded, mode, query);\n let tokenEstimate = estimateTokens(markdown);\n\n // Downgrade to compact if over budget\n if (tokenEstimate > maxTokens && mode !== \"compact\") {\n mode = \"compact\";\n markdown = this.buildMergedMarkdown(loaded, mode, query);\n tokenEstimate = estimateTokens(markdown);\n }\n\n // Truncate oldest sessions if still over budget\n let truncated = false;\n let activeSessions = [...loaded];\n while (tokenEstimate > maxTokens && activeSessions.length > 1) {\n // Remove the oldest session (last in list, sorted newest-first)\n activeSessions = activeSessions.slice(0, activeSessions.length - 1);\n markdown = this.buildMergedMarkdown(activeSessions, mode, query);\n tokenEstimate = estimateTokens(markdown);\n truncated = true;\n }\n\n const timeRange = this.computeTimeRange(activeSessions.map((s) => s.record));\n\n return {\n markdown,\n tokenEstimate,\n sessionCount: activeSessions.length,\n totalTurns: activeSessions.reduce((sum, s) => sum + s.history.turns.length, 0),\n mode,\n truncated,\n timeRange,\n };\n }\n\n // ─── Private helpers ─────────────────────────────────────────────────────────\n\n private isSupportedType(type: ContextQuery[\"type\"]): boolean {\n return type === \"session\" || type === \"latest\";\n }\n\n private async resolveCandidates(query: ContextQuery, limit?: number): Promise<SessionRecord[]> {\n const all = this.getSessionRecords();\n\n if (query.type === \"session\") {\n const found = all.find((r) => r.sessionId === query.value);\n return found ? [found] : [];\n }\n\n // latest: sort by lastActiveAt descending, take N\n const n = limit ?? (parseInt(query.value, 10) || 5);\n const sorted = [...all].sort(\n (a, b) => new Date(b.lastActiveAt).getTime() - new Date(a.lastActiveAt).getTime()\n );\n return sorted.slice(0, n);\n }\n\n private toSessionInfo(record: SessionRecord, turnCount: number): SessionInfo {\n return {\n checkpointId: \"\",\n sessionIndex: \"\",\n transcriptPath: \"\",\n createdAt: record.createdAt,\n endedAt: record.lastActiveAt,\n branch: \"\",\n agent: record.agentName,\n turnCount,\n filesTouched: [],\n sessionId: record.sessionId,\n };\n }\n\n private buildMergedMarkdown(\n sessions: Array<{ record: SessionRecord; history: import(\"./types.js\").SessionHistory }>,\n mode: ContextMode,\n query: ContextQuery\n ): string {\n if (sessions.length === 0) return \"\";\n\n const totalTurns = sessions.reduce((sum, s) => sum + s.history.turns.length, 0);\n const title = query.type === \"session\" ? query.value : `latest ${sessions.length} sessions`;\n\n const parts: string[] = [];\n parts.push(`# Conversation History — ${title}`);\n parts.push(`${sessions.length} sessions | ${totalTurns} turns | mode: ${mode}`);\n parts.push(\"\");\n\n for (let i = 0; i < sessions.length; i++) {\n const { record, history } = sessions[i];\n const sessionMd = buildHistoryMarkdown(history.turns, mode);\n\n parts.push(`## Session ${i + 1} — ${record.agentName} · ${record.sessionId} (${history.turns.length} turns)`);\n parts.push(\"\");\n if (sessionMd) {\n parts.push(sessionMd);\n }\n }\n\n parts.push(\n \"> **Note:** This conversation history may contain outdated information. Verify current state before acting on past context.\"\n );\n\n return parts.join(\"\\n\");\n }\n\n private computeTimeRange(\n records: SessionRecord[]\n ): { start: string; end: string } {\n if (records.length === 0) return { start: \"\", end: \"\" };\n\n const dates = records.map((r) => r.createdAt).filter(Boolean);\n const ends = records.map((r) => r.lastActiveAt).filter(Boolean);\n\n const start = dates.sort()[0] ?? \"\";\n const end = ends.sort().reverse()[0] ?? \"\";\n\n return { start, end };\n }\n}\n","import type { AgentEvent, Attachment } from \"../../../core/types.js\";\nimport type { HistoryStore } from \"./history-store.js\";\nimport type {\n HistoryAttachment,\n ResourceLinkStep,\n ResourceStep,\n SessionHistory,\n Step,\n ToolCallStep,\n Turn,\n} from \"./types.js\";\n\nexport interface RecorderState {\n history: SessionHistory;\n currentAssistantTurn: Turn | null;\n}\n\nfunction toHistoryAttachment(att: Attachment): HistoryAttachment {\n return {\n type: att.type,\n fileName: att.fileName,\n mimeType: att.mimeType,\n size: att.size,\n };\n}\n\nfunction extractDiff(\n content: unknown,\n): { path: string; oldText?: string; newText: string } | null {\n if (!Array.isArray(content)) return null;\n for (const item of content) {\n if (\n item &&\n typeof item === \"object\" &&\n (item as Record<string, unknown>).type === \"diff\"\n ) {\n const d = item as Record<string, unknown>;\n if (typeof d.path === \"string\" && typeof d.newText === \"string\") {\n const result: { path: string; oldText?: string; newText: string } = {\n path: d.path,\n newText: d.newText,\n };\n if (typeof d.oldText === \"string\") result.oldText = d.oldText;\n return result;\n }\n }\n }\n return null;\n}\n\nfunction extractLocations(\n locations: unknown,\n): { path: string; line?: number }[] | undefined {\n if (!Array.isArray(locations)) return undefined;\n const result: { path: string; line?: number }[] = [];\n for (const loc of locations) {\n if (loc && typeof loc === \"object\" && typeof (loc as any).path === \"string\") {\n const entry: { path: string; line?: number } = { path: (loc as any).path };\n if (typeof (loc as any).line === \"number\") entry.line = (loc as any).line;\n result.push(entry);\n }\n }\n return result.length > 0 ? result : undefined;\n}\n\nconst IGNORED_TYPES = new Set([\n \"session_end\",\n \"error\",\n \"system_message\",\n \"commands_update\",\n \"session_info_update\",\n \"model_update\",\n \"user_message_chunk\",\n \"tts_strip\",\n]);\n\nexport class HistoryRecorder {\n private states = new Map<string, RecorderState>();\n\n constructor(private readonly store: HistoryStore) {}\n\n onBeforePrompt(\n sessionId: string,\n text: string,\n attachments: Attachment[] | undefined,\n ): void {\n let state = this.states.get(sessionId);\n if (!state) {\n state = {\n history: { version: 1, sessionId, turns: [] },\n currentAssistantTurn: null,\n };\n this.states.set(sessionId, state);\n }\n\n const userTurn: Turn = {\n index: state.history.turns.length,\n role: \"user\",\n timestamp: new Date().toISOString(),\n content: text,\n };\n if (attachments && attachments.length > 0) {\n userTurn.attachments = attachments.map(toHistoryAttachment);\n }\n state.history.turns.push(userTurn);\n\n const assistantTurn: Turn = {\n index: state.history.turns.length,\n role: \"assistant\",\n timestamp: new Date().toISOString(),\n steps: [],\n };\n state.history.turns.push(assistantTurn);\n state.currentAssistantTurn = assistantTurn;\n }\n\n onAfterEvent(sessionId: string, event: AgentEvent): void {\n const state = this.states.get(sessionId);\n if (!state || !state.currentAssistantTurn) return;\n\n const turn = state.currentAssistantTurn;\n const steps = turn.steps!;\n\n if (IGNORED_TYPES.has(event.type)) return;\n\n switch (event.type) {\n case \"text\": {\n const last = steps[steps.length - 1];\n if (last && last.type === \"text\") {\n last.content += event.content;\n } else {\n steps.push({ type: \"text\", content: event.content });\n }\n break;\n }\n\n case \"thought\": {\n const last = steps[steps.length - 1];\n if (last && last.type === \"thinking\") {\n last.content += event.content;\n } else {\n steps.push({ type: \"thinking\", content: event.content });\n }\n break;\n }\n\n case \"tool_call\": {\n const step: ToolCallStep = {\n type: \"tool_call\",\n id: event.id,\n name: event.name,\n status: event.status,\n };\n if (event.kind) step.kind = event.kind;\n steps.push(step);\n break;\n }\n\n case \"tool_update\": {\n const existing = this.findToolCall(steps, event.id);\n if (!existing) break;\n existing.status = event.status;\n if (event.rawInput !== undefined) existing.input = event.rawInput;\n if (event.rawOutput !== undefined) existing.output = event.rawOutput;\n if (event.content !== undefined) {\n const diff = extractDiff(event.content);\n if (diff) existing.diff = diff;\n }\n if (event.locations !== undefined) {\n const locs = extractLocations(event.locations);\n if (locs) existing.locations = locs;\n }\n break;\n }\n\n case \"plan\": {\n steps.push({\n type: \"plan\",\n entries: event.entries.map((e) => ({\n content: e.content,\n priority: e.priority,\n status: e.status,\n })),\n });\n break;\n }\n\n case \"usage\": {\n turn.usage = {};\n if (event.tokensUsed !== undefined) turn.usage.tokensUsed = event.tokensUsed;\n if (event.contextSize !== undefined) turn.usage.contextSize = event.contextSize;\n if (event.cost) turn.usage.cost = event.cost;\n break;\n }\n\n case \"image_content\": {\n steps.push({\n type: \"image\",\n mimeType: event.mimeType,\n filePath: \"\",\n });\n break;\n }\n\n case \"audio_content\": {\n steps.push({\n type: \"audio\",\n mimeType: event.mimeType,\n filePath: \"\",\n });\n break;\n }\n\n case \"resource_content\": {\n const step: ResourceStep = {\n type: \"resource\",\n uri: event.uri,\n name: event.name,\n };\n if (event.text !== undefined) step.text = event.text;\n steps.push(step);\n break;\n }\n\n case \"resource_link\": {\n const step: ResourceLinkStep = {\n type: \"resource_link\",\n uri: event.uri,\n name: event.name,\n };\n if (event.title !== undefined) step.title = event.title;\n if (event.description !== undefined)\n step.description = event.description;\n steps.push(step);\n break;\n }\n\n case \"current_mode_update\": {\n steps.push({ type: \"mode_change\", modeId: event.modeId });\n break;\n }\n\n case \"config_option_update\": {\n for (const opt of event.options) {\n steps.push({\n type: \"config_change\",\n configId: opt.id,\n value: String(opt.currentValue),\n });\n }\n break;\n }\n }\n }\n\n onPermissionResolved(\n sessionId: string,\n requestId: string,\n decision: string,\n ): void {\n const state = this.states.get(sessionId);\n if (!state || !state.currentAssistantTurn) return;\n const step = this.findToolCall(state.currentAssistantTurn.steps!, requestId);\n if (!step) return;\n step.permission = { requested: true, outcome: decision };\n }\n\n async onTurnEnd(sessionId: string, stopReason: string): Promise<void> {\n const state = this.states.get(sessionId);\n if (!state || !state.currentAssistantTurn) return;\n state.currentAssistantTurn.stopReason = stopReason;\n state.currentAssistantTurn = null;\n await this.store.write(state.history);\n }\n\n finalize(sessionId: string): void {\n this.states.delete(sessionId);\n }\n\n getState(sessionId: string): RecorderState | undefined {\n return this.states.get(sessionId);\n }\n\n private findToolCall(steps: Step[], id: string): ToolCallStep | undefined {\n for (let i = steps.length - 1; i >= 0; i--) {\n const s = steps[i];\n if (s.type === \"tool_call\" && s.id === id) return s;\n }\n return undefined;\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { SessionHistory } from \"./types.js\";\n\nexport class HistoryStore {\n constructor(private readonly dir: string) {}\n\n async write(history: SessionHistory): Promise<void> {\n await fs.promises.mkdir(this.dir, { recursive: true });\n const filePath = this.filePath(history.sessionId);\n await fs.promises.writeFile(filePath, JSON.stringify(history, null, 2));\n }\n\n async read(sessionId: string): Promise<SessionHistory | null> {\n const filePath = this.filePath(sessionId);\n try {\n const raw = await fs.promises.readFile(filePath, \"utf-8\");\n return JSON.parse(raw) as SessionHistory;\n } catch {\n return null;\n }\n }\n\n async exists(sessionId: string): Promise<boolean> {\n try {\n await fs.promises.access(this.filePath(sessionId));\n return true;\n } catch {\n return false;\n }\n }\n\n async list(): Promise<string[]> {\n try {\n const files = await fs.promises.readdir(this.dir);\n return files\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => f.replace(/\\.json$/, \"\"));\n } catch {\n return [];\n }\n }\n\n async delete(sessionId: string): Promise<void> {\n try {\n await fs.promises.unlink(this.filePath(sessionId));\n } catch {\n // file may not exist — safe to ignore\n }\n }\n\n private filePath(sessionId: string): string {\n return path.join(this.dir, `${sessionId}.json`);\n }\n}\n"],"mappings":"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","names":["path"]}
@@ -92,6 +92,23 @@ var migrations = [
92
92
  raw.agents = {};
93
93
  return true;
94
94
  }
95
+ },
96
+ {
97
+ name: "migrate-display-verbosity-to-output-mode",
98
+ apply(raw) {
99
+ const channels = raw.channels;
100
+ if (!channels) return false;
101
+ let changed = false;
102
+ for (const [, channelCfg] of Object.entries(channels)) {
103
+ if (!channelCfg || typeof channelCfg !== "object") continue;
104
+ const cfg = channelCfg;
105
+ if (cfg.displayVerbosity && !cfg.outputMode) {
106
+ cfg.outputMode = cfg.displayVerbosity;
107
+ changed = true;
108
+ }
109
+ }
110
+ return changed;
111
+ }
95
112
  }
96
113
  ];
97
114
  function applyMigrations(raw, migrationList = migrations) {
@@ -110,9 +127,13 @@ var BaseChannelSchema = z.object({
110
127
  enabled: z.boolean().default(false),
111
128
  adapter: z.string().optional(),
112
129
  // package name for plugin adapters
113
- displayVerbosity: z.enum(["low", "medium", "high"]).default("medium").optional()
130
+ displayVerbosity: z.enum(["low", "medium", "high"]).optional(),
131
+ outputMode: z.enum(["low", "medium", "high"]).optional()
114
132
  }).passthrough();
115
- var PLUGINS_DIR = path2.join(os2.homedir(), ".openacp", "plugins");
133
+ var OPENACP_DIR = path2.join(os2.homedir(), ".openacp");
134
+ var PLUGINS_DIR = path2.join(OPENACP_DIR, "plugins");
135
+ var PLUGINS_DATA_DIR = path2.join(OPENACP_DIR, "plugins", "data");
136
+ var REGISTRY_PATH = path2.join(OPENACP_DIR, "plugins.json");
116
137
  var AgentSchema = z.object({
117
138
  command: z.string(),
118
139
  args: z.array(z.string()).default([]),
@@ -191,7 +212,8 @@ var ConfigSchema = z.object({
191
212
  installedAt: z.string().optional()
192
213
  })
193
214
  ).default({}),
194
- speech: SpeechSchema
215
+ speech: SpeechSchema,
216
+ outputMode: z.enum(["low", "medium", "high"]).default("medium").optional()
195
217
  });
196
218
  function expandHome(p) {
197
219
  if (p.startsWith("~")) {
@@ -413,9 +435,12 @@ var ConfigManager = class extends EventEmitter {
413
435
 
414
436
  export {
415
437
  applyMigrations,
438
+ OPENACP_DIR,
416
439
  PLUGINS_DIR,
440
+ PLUGINS_DATA_DIR,
441
+ REGISTRY_PATH,
417
442
  ConfigSchema,
418
443
  expandHome,
419
444
  ConfigManager
420
445
  };
421
- //# sourceMappingURL=chunk-JOMDPFQ2.js.map
446
+ //# sourceMappingURL=chunk-W4LK6WJP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/config/config.ts","../../src/core/config/config-migrations.ts"],"sourcesContent":["import { z } from \"zod\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { EventEmitter } from \"node:events\";\nimport { applyMigrations } from \"./config-migrations.js\";\nimport { createChildLogger } from \"../utils/log.js\";\nconst log = createChildLogger({ module: \"config\" });\n\nconst BaseChannelSchema = z\n .object({\n enabled: z.boolean().default(false),\n adapter: z.string().optional(), // package name for plugin adapters\n displayVerbosity: z\n .enum([\"low\", \"medium\", \"high\"])\n .optional(),\n outputMode: z.enum([\"low\", \"medium\", \"high\"]).optional(),\n })\n .passthrough();\n\nexport const OPENACP_DIR = path.join(os.homedir(), \".openacp\");\nexport const PLUGINS_DIR = path.join(OPENACP_DIR, \"plugins\");\nexport const PLUGINS_DATA_DIR = path.join(OPENACP_DIR, \"plugins\", \"data\");\nexport const REGISTRY_PATH = path.join(OPENACP_DIR, \"plugins.json\");\n\nconst AgentSchema = z.object({\n command: z.string(),\n args: z.array(z.string()).default([]),\n workingDirectory: z.string().optional(),\n env: z.record(z.string(), z.string()).default({}),\n});\n\nconst LoggingSchema = z\n .object({\n level: z\n .enum([\"silent\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\"])\n .default(\"info\"),\n logDir: z.string().default(\"~/.openacp/logs\"),\n maxFileSize: z.union([z.string(), z.number()]).default(\"10m\"),\n maxFiles: z.number().default(7),\n sessionLogRetentionDays: z.number().default(30),\n })\n .default({});\n\nexport type LoggingConfig = z.infer<typeof LoggingSchema>;\n\nconst TunnelAuthSchema = z\n .object({\n enabled: z.boolean().default(false),\n token: z.string().optional(),\n })\n .default({});\n\nconst TunnelSchema = z\n .object({\n enabled: z.boolean().default(false),\n port: z.number().default(3100),\n provider: z\n .enum([\"cloudflare\", \"ngrok\", \"bore\", \"tailscale\"])\n .default(\"cloudflare\"),\n options: z.record(z.string(), z.unknown()).default({}),\n maxUserTunnels: z.number().default(5),\n storeTtlMinutes: z.number().default(60),\n auth: TunnelAuthSchema,\n })\n .default({});\n\nexport type TunnelConfig = z.infer<typeof TunnelSchema>;\n\n\nconst UsageSchema = z\n .object({\n enabled: z.boolean().default(true),\n monthlyBudget: z.number().optional(),\n warningThreshold: z.number().default(0.8),\n currency: z.string().default(\"USD\"),\n retentionDays: z.number().default(90),\n })\n .default({});\n\nexport type UsageConfig = z.infer<typeof UsageSchema>;\n\nconst SpeechProviderSchema = z\n .object({\n apiKey: z.string().min(1).optional(),\n model: z.string().optional(),\n })\n .passthrough();\n\nconst SpeechSchema = z\n .object({\n stt: z\n .object({\n provider: z.string().nullable().default(null),\n providers: z.record(SpeechProviderSchema).default({}),\n })\n .default({}),\n tts: z\n .object({\n provider: z.string().nullable().default(null),\n providers: z.record(SpeechProviderSchema).default({}),\n })\n .default({}),\n })\n .optional()\n .default({});\n\nexport const ConfigSchema = z.object({\n channels: z\n .object({})\n .catchall(BaseChannelSchema),\n agents: z.record(z.string(), AgentSchema).optional().default({}),\n defaultAgent: z.string(),\n workspace: z\n .object({\n baseDir: z.string().default(\"~/openacp-workspace\"),\n })\n .default({}),\n security: z\n .object({\n allowedUserIds: z.array(z.string()).default([]),\n maxConcurrentSessions: z.number().default(20),\n sessionTimeoutMinutes: z.number().default(60),\n })\n .default({}),\n logging: LoggingSchema,\n runMode: z.enum([\"foreground\", \"daemon\"]).default(\"foreground\"),\n autoStart: z.boolean().default(false),\n api: z\n .object({\n port: z.number().default(21420),\n host: z.string().default(\"127.0.0.1\"),\n })\n .default({}),\n sessionStore: z\n .object({\n ttlDays: z.number().default(30),\n })\n .default({}),\n tunnel: TunnelSchema,\n usage: UsageSchema,\n integrations: z\n .record(\n z.string(),\n z.object({\n installed: z.boolean(),\n installedAt: z.string().optional(),\n }),\n )\n .default({}),\n speech: SpeechSchema,\n outputMode: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\").optional(),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\nexport function expandHome(p: string): string {\n if (p.startsWith(\"~\")) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\nconst DEFAULT_CONFIG = {\n channels: {\n telegram: {\n enabled: false,\n botToken: \"YOUR_BOT_TOKEN_HERE\",\n chatId: 0,\n notificationTopicId: null,\n assistantTopicId: null,\n },\n discord: {\n enabled: false,\n botToken: \"YOUR_DISCORD_BOT_TOKEN_HERE\",\n guildId: \"\",\n forumChannelId: null,\n notificationChannelId: null,\n assistantThreadId: null,\n },\n },\n agents: {\n claude: { command: \"claude-agent-acp\", args: [], env: {} },\n codex: { command: \"codex\", args: [\"--acp\"], env: {} },\n },\n defaultAgent: \"claude\",\n workspace: { baseDir: \"~/openacp-workspace\" },\n security: {\n allowedUserIds: [],\n maxConcurrentSessions: 20,\n sessionTimeoutMinutes: 60,\n },\n sessionStore: { ttlDays: 30 },\n tunnel: {\n enabled: true,\n port: 3100,\n provider: \"cloudflare\",\n options: {},\n storeTtlMinutes: 60,\n auth: { enabled: false },\n },\n usage: {},\n};\n\nexport class ConfigManager extends EventEmitter {\n private config!: Config;\n private configPath: string;\n\n constructor() {\n super();\n this.configPath =\n process.env.OPENACP_CONFIG_PATH || expandHome(\"~/.openacp/config.json\");\n }\n\n async load(): Promise<void> {\n // 1. Ensure directory exists\n const dir = path.dirname(this.configPath);\n fs.mkdirSync(dir, { recursive: true });\n\n // 2. If config file doesn't exist, create default\n if (!fs.existsSync(this.configPath)) {\n fs.writeFileSync(\n this.configPath,\n JSON.stringify(DEFAULT_CONFIG, null, 2),\n );\n log.info({ configPath: this.configPath }, \"Config created\");\n log.info(\n \"Please edit it with your channel credentials (Telegram bot token, Discord bot token, etc.), then restart.\",\n );\n process.exit(1);\n }\n\n // 3. Read and parse\n const raw = JSON.parse(fs.readFileSync(this.configPath, \"utf-8\"));\n\n // 3.5. Auto-migrate config\n const { changed: configUpdated } = applyMigrations(raw);\n if (configUpdated) {\n fs.writeFileSync(this.configPath, JSON.stringify(raw, null, 2));\n }\n\n // 4. Apply env var overrides\n this.applyEnvOverrides(raw);\n\n // 5. Validate with Zod\n const result = ConfigSchema.safeParse(raw);\n if (!result.success) {\n log.error(\"Config validation failed\");\n for (const issue of result.error.issues) {\n log.error(\n { path: issue.path.join(\".\"), message: issue.message },\n \"Validation error\",\n );\n }\n process.exit(1);\n }\n this.config = result.data;\n }\n\n get(): Config {\n return structuredClone(this.config);\n }\n\n async save(\n updates: Record<string, unknown>,\n changePath?: string,\n ): Promise<void> {\n const oldConfig = this.config ? structuredClone(this.config) : undefined;\n // Read current file, merge updates\n const raw = JSON.parse(fs.readFileSync(this.configPath, \"utf-8\"));\n this.deepMerge(raw, updates);\n // Validate BEFORE writing to disk\n const result = ConfigSchema.safeParse(raw);\n if (!result.success) {\n log.error({ errors: result.error.issues }, \"Config validation failed, not saving\");\n return;\n }\n fs.writeFileSync(this.configPath, JSON.stringify(raw, null, 2));\n this.config = result.data;\n // Emit change event if path provided\n if (changePath) {\n const { getConfigValue } = await import(\"./config-registry.js\");\n const value = getConfigValue(this.config, changePath);\n const oldValue = oldConfig\n ? getConfigValue(oldConfig, changePath)\n : undefined;\n this.emit(\"config:changed\", { path: changePath, value, oldValue });\n }\n }\n\n resolveWorkspace(input?: string): string {\n if (!input) {\n const resolved = expandHome(this.config.workspace.baseDir);\n fs.mkdirSync(resolved, { recursive: true });\n return resolved;\n }\n if (input.startsWith(\"/\") || input.startsWith(\"~\")) {\n const resolved = expandHome(input);\n fs.mkdirSync(resolved, { recursive: true });\n return resolved;\n }\n // Named workspace → lowercase, under baseDir\n const name = input.toLowerCase();\n const resolved = path.join(expandHome(this.config.workspace.baseDir), name);\n fs.mkdirSync(resolved, { recursive: true });\n return resolved;\n }\n\n async exists(): Promise<boolean> {\n return fs.existsSync(this.configPath);\n }\n\n getConfigPath(): string {\n return this.configPath;\n }\n\n async writeNew(config: Config): Promise<void> {\n const dir = path.dirname(this.configPath);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(this.configPath, JSON.stringify(config, null, 2));\n }\n\n private applyEnvOverrides(raw: Record<string, unknown>): void {\n const overrides: [string, string[]][] = [\n [\"OPENACP_TELEGRAM_BOT_TOKEN\", [\"channels\", \"telegram\", \"botToken\"]],\n [\"OPENACP_TELEGRAM_CHAT_ID\", [\"channels\", \"telegram\", \"chatId\"]],\n [\"OPENACP_DISCORD_BOT_TOKEN\", [\"channels\", \"discord\", \"botToken\"]],\n [\"OPENACP_DISCORD_GUILD_ID\", [\"channels\", \"discord\", \"guildId\"]],\n [\"OPENACP_SLACK_BOT_TOKEN\", [\"channels\", \"slack\", \"botToken\"]],\n [\"OPENACP_SLACK_APP_TOKEN\", [\"channels\", \"slack\", \"appToken\"]],\n [\"OPENACP_SLACK_SIGNING_SECRET\", [\"channels\", \"slack\", \"signingSecret\"]],\n [\"OPENACP_DEFAULT_AGENT\", [\"defaultAgent\"]],\n [\"OPENACP_RUN_MODE\", [\"runMode\"]],\n [\"OPENACP_API_PORT\", [\"api\", \"port\"]],\n ];\n for (const [envVar, configPath] of overrides) {\n const value = process.env[envVar];\n if (value !== undefined) {\n let target: Record<string, unknown> = raw;\n for (let i = 0; i < configPath.length - 1; i++) {\n if (!target[configPath[i]]) target[configPath[i]] = {};\n target = target[configPath[i]] as Record<string, unknown>;\n }\n const key = configPath[configPath.length - 1];\n // Convert numeric fields to number\n target[key] =\n key === \"chatId\" || key === \"port\" ? Number(value) : value;\n }\n }\n\n // Logging env var overrides\n if (process.env.OPENACP_LOG_LEVEL) {\n raw.logging = raw.logging || {};\n (raw.logging as Record<string, unknown>).level =\n process.env.OPENACP_LOG_LEVEL;\n }\n if (process.env.OPENACP_LOG_DIR) {\n raw.logging = raw.logging || {};\n (raw.logging as Record<string, unknown>).logDir =\n process.env.OPENACP_LOG_DIR;\n }\n if (process.env.OPENACP_DEBUG && !process.env.OPENACP_LOG_LEVEL) {\n raw.logging = raw.logging || {};\n (raw.logging as Record<string, unknown>).level = \"debug\";\n }\n\n // Tunnel env var overrides\n if (process.env.OPENACP_TUNNEL_ENABLED) {\n raw.tunnel = raw.tunnel || {};\n (raw.tunnel as Record<string, unknown>).enabled =\n process.env.OPENACP_TUNNEL_ENABLED === \"true\";\n }\n if (process.env.OPENACP_TUNNEL_PORT) {\n raw.tunnel = raw.tunnel || {};\n (raw.tunnel as Record<string, unknown>).port = Number(\n process.env.OPENACP_TUNNEL_PORT,\n );\n }\n if (process.env.OPENACP_TUNNEL_PROVIDER) {\n raw.tunnel = raw.tunnel || {};\n (raw.tunnel as Record<string, unknown>).provider =\n process.env.OPENACP_TUNNEL_PROVIDER;\n }\n\n // Speech env var overrides\n if (process.env.OPENACP_SPEECH_STT_PROVIDER) {\n raw.speech = raw.speech || {};\n const speech = raw.speech as Record<string, unknown>;\n speech.stt = speech.stt || {};\n (speech.stt as Record<string, unknown>).provider =\n process.env.OPENACP_SPEECH_STT_PROVIDER;\n }\n if (process.env.OPENACP_SPEECH_GROQ_API_KEY) {\n raw.speech = raw.speech || {};\n const speech = raw.speech as Record<string, unknown>;\n speech.stt = speech.stt || {};\n const stt = speech.stt as Record<string, unknown>;\n stt.providers = stt.providers || {};\n const providers = stt.providers as Record<string, unknown>;\n providers.groq = providers.groq || {};\n (providers.groq as Record<string, unknown>).apiKey =\n process.env.OPENACP_SPEECH_GROQ_API_KEY;\n }\n }\n\n private deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n ): void {\n for (const key of Object.keys(source)) {\n const val = source[key];\n if (val && typeof val === \"object\" && !Array.isArray(val)) {\n if (!target[key]) target[key] = {};\n this.deepMerge(\n target[key] as Record<string, unknown>,\n val as Record<string, unknown>,\n );\n } else {\n target[key] = val;\n }\n }\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { createChildLogger } from \"../utils/log.js\";\nconst log = createChildLogger({ module: \"config-migrations\" });\n\ntype RawConfig = Record<string, unknown>;\n\nexport interface Migration {\n name: string;\n apply: (raw: RawConfig) => boolean; // returns true if config was modified\n}\n\nexport const migrations: Migration[] = [\n {\n name: \"add-tunnel-section\",\n apply(raw) {\n if (raw.tunnel) return false;\n raw.tunnel = {\n enabled: true,\n port: 3100,\n provider: \"cloudflare\",\n options: {},\n storeTtlMinutes: 60,\n auth: { enabled: false },\n };\n log.info(\"Added tunnel section to config (enabled by default with cloudflare)\");\n return true;\n },\n },\n {\n name: \"fix-agent-commands\",\n apply(raw) {\n const COMMAND_MIGRATIONS: Record<string, string[]> = {\n \"claude-agent-acp\": [\"claude\", \"claude-code\"],\n };\n\n const agents = raw.agents;\n if (!agents || typeof agents !== \"object\") return false;\n\n let changed = false;\n for (const [agentName, agentDef] of Object.entries(agents as Record<string, unknown>)) {\n if (!agentDef || typeof agentDef !== \"object\" || !(\"command\" in agentDef)) continue;\n const def = agentDef as Record<string, unknown>;\n if (typeof def.command !== \"string\") continue;\n for (const [correctCmd, legacyCmds] of Object.entries(COMMAND_MIGRATIONS)) {\n if (legacyCmds.includes(def.command as string)) {\n log.warn(\n { agent: agentName, oldCommand: def.command, newCommand: correctCmd },\n `Auto-migrating agent command: \"${def.command}\" → \"${correctCmd}\"`,\n );\n def.command = correctCmd;\n changed = true;\n }\n }\n }\n return changed;\n },\n },\n {\n name: \"migrate-agents-to-store\",\n apply(raw) {\n const agentsJsonPath = path.join(os.homedir(), \".openacp\", \"agents.json\");\n if (fs.existsSync(agentsJsonPath)) return false;\n\n const agents = raw.agents as Record<string, unknown> | undefined;\n if (!agents || Object.keys(agents).length === 0) return false;\n\n const COMMAND_TO_REGISTRY: Record<string, string> = {\n \"claude-agent-acp\": \"claude-acp\",\n \"codex\": \"codex-acp\",\n };\n\n const installed: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(agents)) {\n const cfg = val as Record<string, unknown>;\n const command = typeof cfg.command === \"string\" ? cfg.command : \"\";\n const registryId = COMMAND_TO_REGISTRY[command] ?? null;\n installed[key] = {\n registryId,\n name: key.charAt(0).toUpperCase() + key.slice(1),\n version: \"unknown\",\n distribution: \"custom\",\n command: cfg.command,\n args: cfg.args ?? [],\n env: cfg.env ?? {},\n workingDirectory: cfg.workingDirectory ?? undefined,\n installedAt: new Date().toISOString(),\n binaryPath: null,\n };\n }\n\n fs.mkdirSync(path.dirname(agentsJsonPath), { recursive: true });\n fs.writeFileSync(agentsJsonPath, JSON.stringify({ version: 1, installed }, null, 2));\n\n raw.agents = {};\n return true;\n },\n },\n {\n name: \"migrate-display-verbosity-to-output-mode\",\n apply(raw) {\n const channels = raw.channels as Record<string, unknown> | undefined;\n if (!channels) return false;\n let changed = false;\n for (const [, channelCfg] of Object.entries(channels)) {\n if (!channelCfg || typeof channelCfg !== \"object\") continue;\n const cfg = channelCfg as Record<string, unknown>;\n if (cfg.displayVerbosity && !cfg.outputMode) {\n cfg.outputMode = cfg.displayVerbosity;\n changed = true;\n }\n }\n return changed;\n },\n },\n];\n\n/**\n * Apply all migrations to raw config (mutates in place).\n * Returns whether any changes were made.\n */\nexport function applyMigrations(\n raw: RawConfig,\n migrationList: Migration[] = migrations,\n): { changed: boolean } {\n let changed = false;\n for (const migration of migrationList) {\n if (migration.apply(raw)) {\n changed = true;\n }\n }\n return { changed };\n}\n"],"mappings":"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","names":["fs","path","os","log","resolved"]}
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  telegram_default
3
- } from "./chunk-5TCXYDLR.js";
3
+ } from "./chunk-CFUJGWOP.js";
4
4
  import {
5
5
  notifications_default
6
6
  } from "./chunk-3EWTPOF7.js";
7
7
  import {
8
8
  tunnel_default
9
- } from "./chunk-4B6PCWQP.js";
9
+ } from "./chunk-PA6MNBG4.js";
10
10
  import {
11
11
  api_server_default
12
- } from "./chunk-JUFN4XMB.js";
12
+ } from "./chunk-KDU3ZEWT.js";
13
13
  import {
14
14
  security_default
15
15
  } from "./chunk-5OCGO27U.js";
@@ -18,10 +18,10 @@ import {
18
18
  } from "./chunk-3NAFXVQM.js";
19
19
  import {
20
20
  context_default
21
- } from "./chunk-ZHGPZBS4.js";
21
+ } from "./chunk-UWH7KIAA.js";
22
22
  import {
23
23
  speech_default
24
- } from "./chunk-NT6FYV27.js";
24
+ } from "./chunk-TMVTSWVH.js";
25
25
 
26
26
  // src/plugins/core-plugins.ts
27
27
  var corePlugins = [
@@ -41,4 +41,4 @@ var corePlugins = [
41
41
  export {
42
42
  corePlugins
43
43
  };
44
- //# sourceMappingURL=chunk-E2SLHZAC.js.map
44
+ //# sourceMappingURL=chunk-YIGBJFJL.js.map