@marifold/core 0.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/dist/agent/AgentEvents.d.ts +106 -0
- package/dist/agent/AgentEvents.d.ts.map +1 -0
- package/dist/agent/AgentEvents.js +3 -0
- package/dist/agent/AgentEvents.js.map +1 -0
- package/dist/agent/AgentHistory.d.ts +27 -0
- package/dist/agent/AgentHistory.d.ts.map +1 -0
- package/dist/agent/AgentHistory.js +42 -0
- package/dist/agent/AgentHistory.js.map +1 -0
- package/dist/agent/AgentRunner.d.ts +149 -0
- package/dist/agent/AgentRunner.d.ts.map +1 -0
- package/dist/agent/AgentRunner.js +727 -0
- package/dist/agent/AgentRunner.js.map +1 -0
- package/dist/agent/ApprovalPolicy.d.ts +71 -0
- package/dist/agent/ApprovalPolicy.d.ts.map +1 -0
- package/dist/agent/ApprovalPolicy.js +29 -0
- package/dist/agent/ApprovalPolicy.js.map +1 -0
- package/dist/agent/ControlBlockTools.d.ts +9 -0
- package/dist/agent/ControlBlockTools.d.ts.map +1 -0
- package/dist/agent/ControlBlockTools.js +49 -0
- package/dist/agent/ControlBlockTools.js.map +1 -0
- package/dist/agent/RunWorkspace.d.ts +92 -0
- package/dist/agent/RunWorkspace.d.ts.map +1 -0
- package/dist/agent/RunWorkspace.js +328 -0
- package/dist/agent/RunWorkspace.js.map +1 -0
- package/dist/agent/ScopedProcess.d.ts +35 -0
- package/dist/agent/ScopedProcess.d.ts.map +1 -0
- package/dist/agent/ScopedProcess.js +280 -0
- package/dist/agent/ScopedProcess.js.map +1 -0
- package/dist/agent/ToolRegistry.d.ts +80 -0
- package/dist/agent/ToolRegistry.d.ts.map +1 -0
- package/dist/agent/ToolRegistry.js +45 -0
- package/dist/agent/ToolRegistry.js.map +1 -0
- package/dist/agent/UserInput.d.ts +59 -0
- package/dist/agent/UserInput.d.ts.map +1 -0
- package/dist/agent/UserInput.js +203 -0
- package/dist/agent/UserInput.js.map +1 -0
- package/dist/agent/tools/AskUserTool.d.ts +71 -0
- package/dist/agent/tools/AskUserTool.d.ts.map +1 -0
- package/dist/agent/tools/AskUserTool.js +70 -0
- package/dist/agent/tools/AskUserTool.js.map +1 -0
- package/dist/agent/tools/DelegateTool.d.ts +49 -0
- package/dist/agent/tools/DelegateTool.d.ts.map +1 -0
- package/dist/agent/tools/DelegateTool.js +62 -0
- package/dist/agent/tools/DelegateTool.js.map +1 -0
- package/dist/agent/tools/InspectAttachmentTool.d.ts +25 -0
- package/dist/agent/tools/InspectAttachmentTool.d.ts.map +1 -0
- package/dist/agent/tools/InspectAttachmentTool.js +129 -0
- package/dist/agent/tools/InspectAttachmentTool.js.map +1 -0
- package/dist/agent/tools/PythonPackageTool.d.ts +26 -0
- package/dist/agent/tools/PythonPackageTool.d.ts.map +1 -0
- package/dist/agent/tools/PythonPackageTool.js +105 -0
- package/dist/agent/tools/PythonPackageTool.js.map +1 -0
- package/dist/agent/tools/ReadFileTool.d.ts +24 -0
- package/dist/agent/tools/ReadFileTool.d.ts.map +1 -0
- package/dist/agent/tools/ReadFileTool.js +112 -0
- package/dist/agent/tools/ReadFileTool.js.map +1 -0
- package/dist/agent/tools/ShellExecTool.d.ts +23 -0
- package/dist/agent/tools/ShellExecTool.d.ts.map +1 -0
- package/dist/agent/tools/ShellExecTool.js +75 -0
- package/dist/agent/tools/ShellExecTool.js.map +1 -0
- package/dist/agent/tools/WebSearchTool.d.ts +26 -0
- package/dist/agent/tools/WebSearchTool.d.ts.map +1 -0
- package/dist/agent/tools/WebSearchTool.js +52 -0
- package/dist/agent/tools/WebSearchTool.js.map +1 -0
- package/dist/agent/tools/WriteFileTool.d.ts +30 -0
- package/dist/agent/tools/WriteFileTool.d.ts.map +1 -0
- package/dist/agent/tools/WriteFileTool.js +155 -0
- package/dist/agent/tools/WriteFileTool.js.map +1 -0
- package/dist/app/AppActionResolver.d.ts +15 -0
- package/dist/app/AppActionResolver.d.ts.map +1 -0
- package/dist/app/AppActionResolver.js +98 -0
- package/dist/app/AppActionResolver.js.map +1 -0
- package/dist/app/AppSchema.d.ts +83 -0
- package/dist/app/AppSchema.d.ts.map +1 -0
- package/dist/app/AppSchema.js +17 -0
- package/dist/app/AppSchema.js.map +1 -0
- package/dist/app/AppStore.d.ts +14 -0
- package/dist/app/AppStore.d.ts.map +1 -0
- package/dist/app/AppStore.js +146 -0
- package/dist/app/AppStore.js.map +1 -0
- package/dist/app/AppValidator.d.ts +10 -0
- package/dist/app/AppValidator.d.ts.map +1 -0
- package/dist/app/AppValidator.js +503 -0
- package/dist/app/AppValidator.js.map +1 -0
- package/dist/app/SkillAppCompiler.d.ts +5 -0
- package/dist/app/SkillAppCompiler.d.ts.map +1 -0
- package/dist/app/SkillAppCompiler.js +632 -0
- package/dist/app/SkillAppCompiler.js.map +1 -0
- package/dist/app/SkillAppDsl.d.ts +93 -0
- package/dist/app/SkillAppDsl.d.ts.map +1 -0
- package/dist/app/SkillAppDsl.js +72 -0
- package/dist/app/SkillAppDsl.js.map +1 -0
- package/dist/app/SkillAppInstanceRegistry.d.ts +25 -0
- package/dist/app/SkillAppInstanceRegistry.d.ts.map +1 -0
- package/dist/app/SkillAppInstanceRegistry.js +218 -0
- package/dist/app/SkillAppInstanceRegistry.js.map +1 -0
- package/dist/app/SkillAppResolver.d.ts +12 -0
- package/dist/app/SkillAppResolver.d.ts.map +1 -0
- package/dist/app/SkillAppResolver.js +89 -0
- package/dist/app/SkillAppResolver.js.map +1 -0
- package/dist/app/SkillAppSchema.d.ts +116 -0
- package/dist/app/SkillAppSchema.d.ts.map +1 -0
- package/dist/app/SkillAppSchema.js +5 -0
- package/dist/app/SkillAppSchema.js.map +1 -0
- package/dist/channels/TelegramBridge.d.ts +103 -0
- package/dist/channels/TelegramBridge.d.ts.map +1 -0
- package/dist/channels/TelegramBridge.js +565 -0
- package/dist/channels/TelegramBridge.js.map +1 -0
- package/dist/channels/respond.d.ts +46 -0
- package/dist/channels/respond.d.ts.map +1 -0
- package/dist/channels/respond.js +41 -0
- package/dist/channels/respond.js.map +1 -0
- package/dist/config/ChatGptTokenRefresh.d.ts +18 -0
- package/dist/config/ChatGptTokenRefresh.d.ts.map +1 -0
- package/dist/config/ChatGptTokenRefresh.js +63 -0
- package/dist/config/ChatGptTokenRefresh.js.map +1 -0
- package/dist/config/ConfigBackup.d.ts +20 -0
- package/dist/config/ConfigBackup.d.ts.map +1 -0
- package/dist/config/ConfigBackup.js +197 -0
- package/dist/config/ConfigBackup.js.map +1 -0
- package/dist/config/ConfigLoader.d.ts +28 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +335 -0
- package/dist/config/ConfigLoader.js.map +1 -0
- package/dist/config/ConfigManager.d.ts +55 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +707 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/config/ConfigSchema.d.ts +231 -0
- package/dist/config/ConfigSchema.d.ts.map +1 -0
- package/dist/config/ConfigSchema.js +15 -0
- package/dist/config/ConfigSchema.js.map +1 -0
- package/dist/config/GitHubCopilotAuth.d.ts +7 -0
- package/dist/config/GitHubCopilotAuth.d.ts.map +1 -0
- package/dist/config/GitHubCopilotAuth.js +40 -0
- package/dist/config/GitHubCopilotAuth.js.map +1 -0
- package/dist/config/MarifoldOpenAICompatProvider.d.ts +39 -0
- package/dist/config/MarifoldOpenAICompatProvider.d.ts.map +1 -0
- package/dist/config/MarifoldOpenAICompatProvider.js +158 -0
- package/dist/config/MarifoldOpenAICompatProvider.js.map +1 -0
- package/dist/config/OpenAICompatUrls.d.ts +7 -0
- package/dist/config/OpenAICompatUrls.d.ts.map +1 -0
- package/dist/config/OpenAICompatUrls.js +47 -0
- package/dist/config/OpenAICompatUrls.js.map +1 -0
- package/dist/config/ProviderFactory.d.ts +12 -0
- package/dist/config/ProviderFactory.d.ts.map +1 -0
- package/dist/config/ProviderFactory.js +61 -0
- package/dist/config/ProviderFactory.js.map +1 -0
- package/dist/config/ProviderInspector.d.ts +46 -0
- package/dist/config/ProviderInspector.d.ts.map +1 -0
- package/dist/config/ProviderInspector.js +356 -0
- package/dist/config/ProviderInspector.js.map +1 -0
- package/dist/config/ProviderRegistry.d.ts +19 -0
- package/dist/config/ProviderRegistry.d.ts.map +1 -0
- package/dist/config/ProviderRegistry.js +301 -0
- package/dist/config/ProviderRegistry.js.map +1 -0
- package/dist/config/XaiTokenRefresh.d.ts +15 -0
- package/dist/config/XaiTokenRefresh.d.ts.map +1 -0
- package/dist/config/XaiTokenRefresh.js +73 -0
- package/dist/config/XaiTokenRefresh.js.map +1 -0
- package/dist/errors/MarifoldError.d.ts +34 -0
- package/dist/errors/MarifoldError.d.ts.map +1 -0
- package/dist/errors/MarifoldError.js +100 -0
- package/dist/errors/MarifoldError.js.map +1 -0
- package/dist/images/ImageOptimizer.d.ts +34 -0
- package/dist/images/ImageOptimizer.d.ts.map +1 -0
- package/dist/images/ImageOptimizer.js +225 -0
- package/dist/images/ImageOptimizer.js.map +1 -0
- package/dist/index.d.ts +96 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +193 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/MemoryControls.d.ts +26 -0
- package/dist/memory/MemoryControls.d.ts.map +1 -0
- package/dist/memory/MemoryControls.js +388 -0
- package/dist/memory/MemoryControls.js.map +1 -0
- package/dist/memory/MemoryStore.d.ts +122 -0
- package/dist/memory/MemoryStore.d.ts.map +1 -0
- package/dist/memory/MemoryStore.js +1096 -0
- package/dist/memory/MemoryStore.js.map +1 -0
- package/dist/profiles/ProfileManager.d.ts +139 -0
- package/dist/profiles/ProfileManager.d.ts.map +1 -0
- package/dist/profiles/ProfileManager.js +475 -0
- package/dist/profiles/ProfileManager.js.map +1 -0
- package/dist/profiles/ProfileResolver.d.ts +18 -0
- package/dist/profiles/ProfileResolver.d.ts.map +1 -0
- package/dist/profiles/ProfileResolver.js +280 -0
- package/dist/profiles/ProfileResolver.js.map +1 -0
- package/dist/runs/RunRegistry.d.ts +140 -0
- package/dist/runs/RunRegistry.d.ts.map +1 -0
- package/dist/runs/RunRegistry.js +432 -0
- package/dist/runs/RunRegistry.js.map +1 -0
- package/dist/runtime/MarifoldRuntime.d.ts +244 -0
- package/dist/runtime/MarifoldRuntime.d.ts.map +1 -0
- package/dist/runtime/MarifoldRuntime.js +1099 -0
- package/dist/runtime/MarifoldRuntime.js.map +1 -0
- package/dist/runtime/MarifoldTypes.d.ts +70 -0
- package/dist/runtime/MarifoldTypes.d.ts.map +1 -0
- package/dist/runtime/MarifoldTypes.js +3 -0
- package/dist/runtime/MarifoldTypes.js.map +1 -0
- package/dist/schedule/ScheduleStore.d.ts +60 -0
- package/dist/schedule/ScheduleStore.d.ts.map +1 -0
- package/dist/schedule/ScheduleStore.js +212 -0
- package/dist/schedule/ScheduleStore.js.map +1 -0
- package/dist/schedule/Scheduler.d.ts +28 -0
- package/dist/schedule/Scheduler.d.ts.map +1 -0
- package/dist/schedule/Scheduler.js +65 -0
- package/dist/schedule/Scheduler.js.map +1 -0
- package/dist/search/DuckDuckGoBackend.d.ts +18 -0
- package/dist/search/DuckDuckGoBackend.d.ts.map +1 -0
- package/dist/search/DuckDuckGoBackend.js +37 -0
- package/dist/search/DuckDuckGoBackend.js.map +1 -0
- package/dist/search/FirecrawlBackend.d.ts +28 -0
- package/dist/search/FirecrawlBackend.d.ts.map +1 -0
- package/dist/search/FirecrawlBackend.js +76 -0
- package/dist/search/FirecrawlBackend.js.map +1 -0
- package/dist/search/SearchBackend.d.ts +18 -0
- package/dist/search/SearchBackend.d.ts.map +1 -0
- package/dist/search/SearchBackend.js +24 -0
- package/dist/search/SearchBackend.js.map +1 -0
- package/dist/search/createSearchBackend.d.ts +16 -0
- package/dist/search/createSearchBackend.d.ts.map +1 -0
- package/dist/search/createSearchBackend.js +30 -0
- package/dist/search/createSearchBackend.js.map +1 -0
- package/dist/sessions/ResponseMetrics.d.ts +17 -0
- package/dist/sessions/ResponseMetrics.d.ts.map +1 -0
- package/dist/sessions/ResponseMetrics.js +3 -0
- package/dist/sessions/ResponseMetrics.js.map +1 -0
- package/dist/sessions/SessionResolver.d.ts +135 -0
- package/dist/sessions/SessionResolver.d.ts.map +1 -0
- package/dist/sessions/SessionResolver.js +1173 -0
- package/dist/sessions/SessionResolver.js.map +1 -0
- package/dist/skill/BuiltInSkillManager.d.ts +11 -0
- package/dist/skill/BuiltInSkillManager.d.ts.map +1 -0
- package/dist/skill/BuiltInSkillManager.js +98 -0
- package/dist/skill/BuiltInSkillManager.js.map +1 -0
- package/dist/skill/SkillInvocation.d.ts +30 -0
- package/dist/skill/SkillInvocation.d.ts.map +1 -0
- package/dist/skill/SkillInvocation.js +135 -0
- package/dist/skill/SkillInvocation.js.map +1 -0
- package/dist/skill/SkillSchema.d.ts +37 -0
- package/dist/skill/SkillSchema.d.ts.map +1 -0
- package/dist/skill/SkillSchema.js +26 -0
- package/dist/skill/SkillSchema.js.map +1 -0
- package/dist/skill/SkillStore.d.ts +41 -0
- package/dist/skill/SkillStore.d.ts.map +1 -0
- package/dist/skill/SkillStore.js +184 -0
- package/dist/skill/SkillStore.js.map +1 -0
- package/dist/skill/SkillTemplater.d.ts +19 -0
- package/dist/skill/SkillTemplater.d.ts.map +1 -0
- package/dist/skill/SkillTemplater.js +36 -0
- package/dist/skill/SkillTemplater.js.map +1 -0
- package/dist/skill/SkillValidator.d.ts +10 -0
- package/dist/skill/SkillValidator.d.ts.map +1 -0
- package/dist/skill/SkillValidator.js +131 -0
- package/dist/skill/SkillValidator.js.map +1 -0
- package/dist/skill/SkillVars.d.ts +10 -0
- package/dist/skill/SkillVars.d.ts.map +1 -0
- package/dist/skill/SkillVars.js +65 -0
- package/dist/skill/SkillVars.js.map +1 -0
- package/dist/skill/index.d.ts +10 -0
- package/dist/skill/index.d.ts.map +1 -0
- package/dist/skill/index.js +22 -0
- package/dist/skill/index.js.map +1 -0
- package/dist/skillapp/SkillAppActionResolver.d.ts +13 -0
- package/dist/skillapp/SkillAppActionResolver.d.ts.map +1 -0
- package/dist/skillapp/SkillAppActionResolver.js +95 -0
- package/dist/skillapp/SkillAppActionResolver.js.map +1 -0
- package/dist/skillapp/SkillAppSchema.d.ts +79 -0
- package/dist/skillapp/SkillAppSchema.d.ts.map +1 -0
- package/dist/skillapp/SkillAppSchema.js +20 -0
- package/dist/skillapp/SkillAppSchema.js.map +1 -0
- package/dist/skillapp/SkillAppStore.d.ts +11 -0
- package/dist/skillapp/SkillAppStore.d.ts.map +1 -0
- package/dist/skillapp/SkillAppStore.js +98 -0
- package/dist/skillapp/SkillAppStore.js.map +1 -0
- package/dist/skillapp/SkillAppValidator.d.ts +10 -0
- package/dist/skillapp/SkillAppValidator.d.ts.map +1 -0
- package/dist/skillapp/SkillAppValidator.js +522 -0
- package/dist/skillapp/SkillAppValidator.js.map +1 -0
- package/dist/tasks/TaskStore.d.ts +110 -0
- package/dist/tasks/TaskStore.d.ts.map +1 -0
- package/dist/tasks/TaskStore.js +371 -0
- package/dist/tasks/TaskStore.js.map +1 -0
- package/dist/util/fetchRetry.d.ts +11 -0
- package/dist/util/fetchRetry.d.ts.map +1 -0
- package/dist/util/fetchRetry.js +48 -0
- package/dist/util/fetchRetry.js.map +1 -0
- package/dist/util/idToken.d.ts +12 -0
- package/dist/util/idToken.d.ts.map +1 -0
- package/dist/util/idToken.js +32 -0
- package/dist/util/idToken.js.map +1 -0
- package/dist/util/proxy.d.ts +18 -0
- package/dist/util/proxy.d.ts.map +1 -0
- package/dist/util/proxy.js +28 -0
- package/dist/util/proxy.js.map +1 -0
- package/dist/workspace/Workspace.d.ts +9 -0
- package/dist/workspace/Workspace.d.ts.map +1 -0
- package/dist/workspace/Workspace.js +55 -0
- package/dist/workspace/Workspace.js.map +1 -0
- package/dist/workspace/WorkspaceInitializer.d.ts +40 -0
- package/dist/workspace/WorkspaceInitializer.d.ts.map +1 -0
- package/dist/workspace/WorkspaceInitializer.js +212 -0
- package/dist/workspace/WorkspaceInitializer.js.map +1 -0
- package/dist/workspace/WorkspacePaths.d.ts +11 -0
- package/dist/workspace/WorkspacePaths.d.ts.map +1 -0
- package/dist/workspace/WorkspacePaths.js +82 -0
- package/dist/workspace/WorkspacePaths.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.respond = respond;
|
|
4
|
+
/**
|
|
5
|
+
* Run one turn for a messaging channel (Telegram, Slack, …) and collect a
|
|
6
|
+
* plain-text reply. **Channel-agnostic:** without an `approvalHandler` the agent
|
|
7
|
+
* run is unattended (`ask` degrades to deny — the profile's `allow` rules and
|
|
8
|
+
* `trusted_folders` govern); with one, the channel prompts the user to approve.
|
|
9
|
+
* Presentation/formatting (chunking, markdown) belongs to the channel bridge.
|
|
10
|
+
*/
|
|
11
|
+
async function respond(runtime, request) {
|
|
12
|
+
const { profile, mode, prompt, sessionId, approvalHandler, cwd, trustedFolders, instructions, think } = request;
|
|
13
|
+
if (mode === 'chat') {
|
|
14
|
+
let text = '';
|
|
15
|
+
for await (const chunk of runtime.stream({ prompt, profile, sessionId, think }))
|
|
16
|
+
text += chunk;
|
|
17
|
+
return { text: text.trim(), ok: true, denied: [] };
|
|
18
|
+
}
|
|
19
|
+
// Agent — unattended (no approvalHandler). Accumulate the visible text; map
|
|
20
|
+
// tool requests by id so a policy denial can be reported by tool name; track
|
|
21
|
+
// the terminal status so the channel can flag a failed run.
|
|
22
|
+
const runner = runtime.createAgentRunner(profile);
|
|
23
|
+
const toolById = new Map();
|
|
24
|
+
const denied = new Set();
|
|
25
|
+
let text = '';
|
|
26
|
+
let ok = false;
|
|
27
|
+
for await (const event of runner.run({ objective: prompt, profile, sessionId, approvalHandler, cwd, trustedFolders, instructions, think })) {
|
|
28
|
+
if (event.type === 'text')
|
|
29
|
+
text += event.text;
|
|
30
|
+
else if (event.type === 'tool_request')
|
|
31
|
+
toolById.set(event.call.id, event.call.tool);
|
|
32
|
+
else if (event.type === 'approval_decision' && !event.approved) {
|
|
33
|
+
denied.add(toolById.get(event.requestId) ?? event.requestId);
|
|
34
|
+
}
|
|
35
|
+
else if (event.type === 'done') {
|
|
36
|
+
ok = event.status === 'completed';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return { text: text.trim(), ok, denied: [...denied] };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=respond.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"respond.js","sourceRoot":"","sources":["../../src/channels/respond.ts"],"names":[],"mappings":";;;AAwCA;;;;;;GAMG;AACI,KAAK,kBAAkB,OAAwB,EAAE,OAAuB;IAC7E,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEhH,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAAE,IAAI,IAAI,KAAK,CAAC;QAC/F,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACrD,CAAC;IAED,4EAA4E;IAC5E,6EAA6E;IAC7E,4DAA4D;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC3I,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;aACzC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAChF,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/D,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACjC,EAAE,GAAG,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface ChatGptRefreshedTokens {
|
|
2
|
+
/** OAuth access token — used directly as the Codex-backend bearer credential. */
|
|
3
|
+
apiKey: string;
|
|
4
|
+
/** Next refresh token. May rotate; persist it. */
|
|
5
|
+
refreshToken: string;
|
|
6
|
+
/** ChatGPT account id from the refreshed id_token, when present. */
|
|
7
|
+
accountId?: string;
|
|
8
|
+
/** Unix seconds when the access credential expires, when reported. */
|
|
9
|
+
expiresAt?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Refresh an expired ChatGPT OAuth credential from the stored refresh token.
|
|
13
|
+
* Subscription (ChatGPT plan) accounts use the access token directly against
|
|
14
|
+
* the Codex backend, so no id_token→API-key exchange happens; the account id is
|
|
15
|
+
* re-derived from the refreshed id_token for the `chatgpt-account-id` header.
|
|
16
|
+
*/
|
|
17
|
+
export declare function refreshChatGptAccessToken(refreshToken: string): Promise<ChatGptRefreshedTokens>;
|
|
18
|
+
//# sourceMappingURL=ChatGptTokenRefresh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatGptTokenRefresh.d.ts","sourceRoot":"","sources":["../../src/config/ChatGptTokenRefresh.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,sBAAsB;IACrC,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAqBrG"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.refreshChatGptAccessToken = refreshChatGptAccessToken;
|
|
4
|
+
const proxy_1 = require("../util/proxy");
|
|
5
|
+
const idToken_1 = require("../util/idToken");
|
|
6
|
+
const CHATGPT_AUTH_ISSUER = 'https://auth.openai.com';
|
|
7
|
+
const CHATGPT_OAUTH_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';
|
|
8
|
+
const REFRESH_TIMEOUT_MS = 20_000;
|
|
9
|
+
/**
|
|
10
|
+
* Refresh an expired ChatGPT OAuth credential from the stored refresh token.
|
|
11
|
+
* Subscription (ChatGPT plan) accounts use the access token directly against
|
|
12
|
+
* the Codex backend, so no id_token→API-key exchange happens; the account id is
|
|
13
|
+
* re-derived from the refreshed id_token for the `chatgpt-account-id` header.
|
|
14
|
+
*/
|
|
15
|
+
async function refreshChatGptAccessToken(refreshToken) {
|
|
16
|
+
const data = await postJson(`${CHATGPT_AUTH_ISSUER}/oauth/token`, {
|
|
17
|
+
grant_type: 'refresh_token',
|
|
18
|
+
refresh_token: refreshToken,
|
|
19
|
+
client_id: CHATGPT_OAUTH_CLIENT_ID,
|
|
20
|
+
}, 'ChatGPT token refresh failed');
|
|
21
|
+
const accessToken = stringField(data.access_token);
|
|
22
|
+
if (!accessToken) {
|
|
23
|
+
throw new Error('ChatGPT token refresh response did not include an access token.');
|
|
24
|
+
}
|
|
25
|
+
const idToken = stringField(data.id_token);
|
|
26
|
+
const expiresIn = numberField(data.expires_in);
|
|
27
|
+
return {
|
|
28
|
+
apiKey: accessToken,
|
|
29
|
+
refreshToken: stringField(data.refresh_token) ?? refreshToken,
|
|
30
|
+
accountId: idToken ? (0, idToken_1.accountIdFromIdToken)(idToken) : undefined,
|
|
31
|
+
expiresAt: expiresIn !== undefined ? Math.floor(Date.now() / 1000) + expiresIn : undefined,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
async function postJson(url, body, label) {
|
|
35
|
+
return parseResponse(await doFetch(url, {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
|
|
38
|
+
body: JSON.stringify(body),
|
|
39
|
+
signal: AbortSignal.timeout(REFRESH_TIMEOUT_MS),
|
|
40
|
+
}, label), label);
|
|
41
|
+
}
|
|
42
|
+
async function doFetch(url, init, label) {
|
|
43
|
+
const dispatcher = (0, proxy_1.proxyDispatcher)();
|
|
44
|
+
try {
|
|
45
|
+
return await fetch(url, dispatcher ? { ...init, dispatcher } : init);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
throw new Error(`${label}: ${error instanceof Error ? `${error.name}: ${error.message}` : String(error)}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function parseResponse(response, label) {
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
throw new Error(`${label}: HTTP ${response.status}: ${await response.text().catch(() => '')}`);
|
|
54
|
+
}
|
|
55
|
+
return await response.json();
|
|
56
|
+
}
|
|
57
|
+
function stringField(value) {
|
|
58
|
+
return typeof value === 'string' && value ? value : undefined;
|
|
59
|
+
}
|
|
60
|
+
function numberField(value) {
|
|
61
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=ChatGptTokenRefresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatGptTokenRefresh.js","sourceRoot":"","sources":["../../src/config/ChatGptTokenRefresh.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { LoadedMarifoldConfig } from './ConfigSchema';
|
|
2
|
+
export interface ConfigBackupExportOptions {
|
|
3
|
+
includeSessions?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export interface ConfigBackupExportResult {
|
|
6
|
+
path: string;
|
|
7
|
+
profileFileCount: number;
|
|
8
|
+
includedSessions: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ConfigBackupImportOptions {
|
|
11
|
+
force?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface ConfigBackupImportResult {
|
|
14
|
+
configPath: string;
|
|
15
|
+
profileFileCount: number;
|
|
16
|
+
restoredSessions: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function exportConfigBackup(loadedConfig: LoadedMarifoldConfig, outputPath: string, options?: ConfigBackupExportOptions): ConfigBackupExportResult;
|
|
19
|
+
export declare function importConfigBackup(loadedConfig: LoadedMarifoldConfig, inputPath: string, options?: ConfigBackupImportOptions): ConfigBackupImportResult;
|
|
20
|
+
//# sourceMappingURL=ConfigBackup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigBackup.d.ts","sourceRoot":"","sources":["../../src/config/ConfigBackup.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAyBtD,MAAM,WAAW,yBAAyB;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,oBAAoB,EAClC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,yBAA8B,GACtC,wBAAwB,CA2B1B;AAED,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,oBAAoB,EAClC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,yBAA8B,GACtC,wBAAwB,CA0C1B"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.exportConfigBackup = exportConfigBackup;
|
|
37
|
+
exports.importConfigBackup = importConfigBackup;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const os = __importStar(require("os"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const ConfigLoader_1 = require("./ConfigLoader");
|
|
42
|
+
const ConfigManager_1 = require("./ConfigManager");
|
|
43
|
+
const MarifoldError_1 = require("../errors/MarifoldError");
|
|
44
|
+
const WorkspacePaths_1 = require("../workspace/WorkspacePaths");
|
|
45
|
+
const BACKUP_SCHEMA = 'marifold.config-backup.v1';
|
|
46
|
+
function exportConfigBackup(loadedConfig, outputPath, options = {}) {
|
|
47
|
+
const resolvedOutputPath = (0, WorkspacePaths_1.resolveUserPath)(outputPath);
|
|
48
|
+
const profileFiles = collectProfileFiles(loadedConfig.config.paths.profilesDir);
|
|
49
|
+
const sessionsDb = options.includeSessions && fs.existsSync(loadedConfig.config.paths.sessionsDb)
|
|
50
|
+
? {
|
|
51
|
+
encoding: 'base64',
|
|
52
|
+
content: fs.readFileSync(loadedConfig.config.paths.sessionsDb).toString('base64'),
|
|
53
|
+
}
|
|
54
|
+
: undefined;
|
|
55
|
+
const backup = {
|
|
56
|
+
schema: BACKUP_SCHEMA,
|
|
57
|
+
exportedAt: new Date().toISOString(),
|
|
58
|
+
configToml: fs.existsSync(loadedConfig.configPath)
|
|
59
|
+
? fs.readFileSync(loadedConfig.configPath, 'utf-8')
|
|
60
|
+
: (0, ConfigManager_1.renderMarifoldConfig)(loadedConfig.config),
|
|
61
|
+
profiles: profileFiles,
|
|
62
|
+
...(sessionsDb ? { sessionsDb } : {}),
|
|
63
|
+
};
|
|
64
|
+
fs.mkdirSync(path.dirname(resolvedOutputPath), { recursive: true });
|
|
65
|
+
fs.writeFileSync(resolvedOutputPath, `${JSON.stringify(backup, null, 2)}\n`);
|
|
66
|
+
return {
|
|
67
|
+
path: resolvedOutputPath,
|
|
68
|
+
profileFileCount: profileFiles.length,
|
|
69
|
+
includedSessions: Boolean(sessionsDb),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function importConfigBackup(loadedConfig, inputPath, options = {}) {
|
|
73
|
+
const resolvedInputPath = (0, WorkspacePaths_1.resolveUserPath)(inputPath);
|
|
74
|
+
const backup = readBackup(resolvedInputPath);
|
|
75
|
+
const restoredConfig = loadBackupConfig(backup.configToml);
|
|
76
|
+
const profileTargets = backup.profiles.map(file => ({
|
|
77
|
+
file,
|
|
78
|
+
target: path.join(restoredConfig.config.paths.profilesDir, safeRelativePath(file.path)),
|
|
79
|
+
}));
|
|
80
|
+
const sessionsTarget = backup.sessionsDb ? restoredConfig.config.paths.sessionsDb : undefined;
|
|
81
|
+
if (!options.force) {
|
|
82
|
+
if (fs.existsSync(loadedConfig.configPath)) {
|
|
83
|
+
throw MarifoldError_1.MarifoldError.configInvalid(`Config file already exists at ${loadedConfig.configPath}. Re-run with --force to overwrite it.`);
|
|
84
|
+
}
|
|
85
|
+
for (const target of profileTargets) {
|
|
86
|
+
if (fs.existsSync(target.target)) {
|
|
87
|
+
throw MarifoldError_1.MarifoldError.configInvalid(`Profile file already exists at ${target.target}. Re-run with --force to overwrite it.`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (sessionsTarget && fs.existsSync(sessionsTarget)) {
|
|
91
|
+
throw MarifoldError_1.MarifoldError.configInvalid(`Sessions database already exists at ${sessionsTarget}. Re-run with --force to overwrite it.`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
fs.mkdirSync(path.dirname(loadedConfig.configPath), { recursive: true });
|
|
95
|
+
fs.writeFileSync(loadedConfig.configPath, backup.configToml);
|
|
96
|
+
for (const target of profileTargets) {
|
|
97
|
+
fs.mkdirSync(path.dirname(target.target), { recursive: true });
|
|
98
|
+
fs.writeFileSync(target.target, Buffer.from(target.file.content, target.file.encoding));
|
|
99
|
+
}
|
|
100
|
+
if (backup.sessionsDb && sessionsTarget) {
|
|
101
|
+
fs.mkdirSync(path.dirname(sessionsTarget), { recursive: true });
|
|
102
|
+
fs.writeFileSync(sessionsTarget, Buffer.from(backup.sessionsDb.content, backup.sessionsDb.encoding));
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
configPath: loadedConfig.configPath,
|
|
106
|
+
profileFileCount: profileTargets.length,
|
|
107
|
+
restoredSessions: Boolean(backup.sessionsDb),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function collectProfileFiles(profilesDir) {
|
|
111
|
+
if (!fs.existsSync(profilesDir))
|
|
112
|
+
return [];
|
|
113
|
+
const files = [];
|
|
114
|
+
const stack = [profilesDir];
|
|
115
|
+
while (stack.length > 0) {
|
|
116
|
+
const current = stack.pop();
|
|
117
|
+
if (!current)
|
|
118
|
+
continue;
|
|
119
|
+
for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
|
|
120
|
+
const absolutePath = path.join(current, entry.name);
|
|
121
|
+
if (entry.isDirectory()) {
|
|
122
|
+
stack.push(absolutePath);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (!entry.isFile())
|
|
126
|
+
continue;
|
|
127
|
+
const relativePath = path.relative(profilesDir, absolutePath);
|
|
128
|
+
if (!relativePath || relativePath.startsWith('..') || path.isAbsolute(relativePath))
|
|
129
|
+
continue;
|
|
130
|
+
files.push({
|
|
131
|
+
path: relativePath,
|
|
132
|
+
encoding: 'base64',
|
|
133
|
+
content: fs.readFileSync(absolutePath).toString('base64'),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return files.sort((a, b) => a.path.localeCompare(b.path));
|
|
138
|
+
}
|
|
139
|
+
function readBackup(inputPath) {
|
|
140
|
+
try {
|
|
141
|
+
const parsed = JSON.parse(fs.readFileSync(inputPath, 'utf-8'));
|
|
142
|
+
if (parsed.schema !== BACKUP_SCHEMA) {
|
|
143
|
+
throw new Error(`Expected schema '${BACKUP_SCHEMA}'.`);
|
|
144
|
+
}
|
|
145
|
+
if (typeof parsed.configToml !== 'string') {
|
|
146
|
+
throw new Error('Expected configToml to be a string.');
|
|
147
|
+
}
|
|
148
|
+
if (!Array.isArray(parsed.profiles)) {
|
|
149
|
+
throw new Error('Expected profiles to be an array.');
|
|
150
|
+
}
|
|
151
|
+
for (const file of parsed.profiles) {
|
|
152
|
+
if (typeof file !== 'object'
|
|
153
|
+
|| file === null
|
|
154
|
+
|| typeof file.path !== 'string'
|
|
155
|
+
|| file.encoding !== 'base64'
|
|
156
|
+
|| typeof file.content !== 'string') {
|
|
157
|
+
throw new Error('Profile files must include path, base64 encoding, and content.');
|
|
158
|
+
}
|
|
159
|
+
safeRelativePath(file.path);
|
|
160
|
+
}
|
|
161
|
+
if (parsed.sessionsDb && (parsed.sessionsDb.encoding !== 'base64' || typeof parsed.sessionsDb.content !== 'string')) {
|
|
162
|
+
throw new Error('sessionsDb must use base64 encoding.');
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
schema: BACKUP_SCHEMA,
|
|
166
|
+
exportedAt: typeof parsed.exportedAt === 'string' ? parsed.exportedAt : '',
|
|
167
|
+
configToml: parsed.configToml,
|
|
168
|
+
profiles: parsed.profiles,
|
|
169
|
+
...(parsed.sessionsDb ? { sessionsDb: parsed.sessionsDb } : {}),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
throw MarifoldError_1.MarifoldError.configInvalid(`Could not read config backup ${inputPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function loadBackupConfig(configToml) {
|
|
177
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'marifold-config-backup-'));
|
|
178
|
+
const tempConfig = path.join(tempDir, 'config.toml');
|
|
179
|
+
try {
|
|
180
|
+
fs.writeFileSync(tempConfig, configToml);
|
|
181
|
+
return new ConfigLoader_1.ConfigLoader().load({ configPath: tempConfig });
|
|
182
|
+
}
|
|
183
|
+
finally {
|
|
184
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function safeRelativePath(filePath) {
|
|
188
|
+
if (!filePath || path.isAbsolute(filePath)) {
|
|
189
|
+
throw MarifoldError_1.MarifoldError.configInvalid(`Invalid backup profile path: ${filePath}`);
|
|
190
|
+
}
|
|
191
|
+
const normalized = path.normalize(filePath);
|
|
192
|
+
if (normalized === '.' || normalized.startsWith('..') || path.isAbsolute(normalized)) {
|
|
193
|
+
throw MarifoldError_1.MarifoldError.configInvalid(`Invalid backup profile path: ${filePath}`);
|
|
194
|
+
}
|
|
195
|
+
return normalized;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=ConfigBackup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigBackup.js","sourceRoot":"","sources":["../../src/config/ConfigBackup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { PartialAgentConfig } from '../agent/ApprovalPolicy';
|
|
2
|
+
import { LoadedMarifoldConfig } from './ConfigSchema';
|
|
3
|
+
export interface LoadConfigOptions {
|
|
4
|
+
configPath?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class ConfigLoader {
|
|
7
|
+
load(options?: LoadConfigOptions): LoadedMarifoldConfig;
|
|
8
|
+
private resolveConfigPath;
|
|
9
|
+
private readToml;
|
|
10
|
+
private normalize;
|
|
11
|
+
private normalizeService;
|
|
12
|
+
private normalizeChannels;
|
|
13
|
+
private normalizeTelegramChannel;
|
|
14
|
+
private normalizeWebSearch;
|
|
15
|
+
private normalizeDefault;
|
|
16
|
+
private normalizePaths;
|
|
17
|
+
private normalizeModels;
|
|
18
|
+
private normalizeMemory;
|
|
19
|
+
private normalizeProviders;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parse a TOML `[agent]` table into a {@link PartialAgentConfig} — only the keys
|
|
23
|
+
* actually present, with NO defaults applied — so it can be merged over the
|
|
24
|
+
* global config. Shared by ConfigLoader (global `[agent]`) and ProfileResolver
|
|
25
|
+
* (per-profile `[agent]` in profile.toml) so validation is identical.
|
|
26
|
+
*/
|
|
27
|
+
export declare function parsePartialAgentConfig(raw: unknown, label: string): PartialAgentConfig;
|
|
28
|
+
//# sourceMappingURL=ConfigLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigLoader.d.ts","sourceRoot":"","sources":["../../src/config/ConfigLoader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoD,kBAAkB,EAAsB,MAAM,yBAAyB,CAAC;AAEnI,OAAO,EACL,oBAAoB,EAerB,MAAM,gBAAgB,CAAC;AAcxB,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,YAAY;IACvB,IAAI,CAAC,OAAO,GAAE,iBAAsB,GAAG,oBAAoB,CAW1D;IAED,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,kBAAkB;CAuC3B;AAkFD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAavF"}
|