panopticon-cli 0.4.32 → 0.4.33

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 (138) hide show
  1. package/dist/{agents-BDFHF4T3.js → agents-VLK4BMVA.js} +10 -7
  2. package/dist/chunk-7SN4L4PH.js +150 -0
  3. package/dist/chunk-7SN4L4PH.js.map +1 -0
  4. package/dist/chunk-7XNJJBH6.js +538 -0
  5. package/dist/chunk-7XNJJBH6.js.map +1 -0
  6. package/dist/chunk-AQXETQHW.js +113 -0
  7. package/dist/chunk-AQXETQHW.js.map +1 -0
  8. package/dist/{chunk-2NIAOCIC.js → chunk-ASY7T35E.js} +170 -64
  9. package/dist/chunk-ASY7T35E.js.map +1 -0
  10. package/dist/chunk-B3PF6JPQ.js +212 -0
  11. package/dist/chunk-B3PF6JPQ.js.map +1 -0
  12. package/dist/{chunk-XP2DXWYP.js → chunk-BKCWRMUX.js} +88 -35
  13. package/dist/chunk-BKCWRMUX.js.map +1 -0
  14. package/dist/chunk-CFCUOV3Q.js +669 -0
  15. package/dist/chunk-CFCUOV3Q.js.map +1 -0
  16. package/dist/chunk-CWELWPWQ.js +32 -0
  17. package/dist/chunk-CWELWPWQ.js.map +1 -0
  18. package/dist/chunk-DI7ABPNQ.js +352 -0
  19. package/dist/chunk-DI7ABPNQ.js.map +1 -0
  20. package/dist/{chunk-VU4FLXV5.js → chunk-FQ66DECN.js} +31 -4
  21. package/dist/chunk-FQ66DECN.js.map +1 -0
  22. package/dist/{review-status-GWQYY77L.js → chunk-GFP3PIPB.js} +14 -7
  23. package/dist/chunk-GFP3PIPB.js.map +1 -0
  24. package/dist/chunk-JQBV3Q2W.js +29 -0
  25. package/dist/chunk-JQBV3Q2W.js.map +1 -0
  26. package/dist/{chunk-BWGFN44T.js → chunk-JT4O4YVM.js} +28 -16
  27. package/dist/chunk-JT4O4YVM.js.map +1 -0
  28. package/dist/{chunk-VIWUCJ4V.js → chunk-KJ2TRXNK.js} +34 -36
  29. package/dist/chunk-KJ2TRXNK.js.map +1 -0
  30. package/dist/{chunk-JY7R7V4G.js → chunk-OMNXYPXC.js} +2 -2
  31. package/dist/chunk-OMNXYPXC.js.map +1 -0
  32. package/dist/chunk-PELXV435.js +215 -0
  33. package/dist/chunk-PELXV435.js.map +1 -0
  34. package/dist/chunk-PI7Y3PSN.js +797 -0
  35. package/dist/chunk-PI7Y3PSN.js.map +1 -0
  36. package/dist/chunk-RBUO57TC.js +154 -0
  37. package/dist/chunk-RBUO57TC.js.map +1 -0
  38. package/dist/chunk-XFR2DLMR.js +600 -0
  39. package/dist/chunk-XFR2DLMR.js.map +1 -0
  40. package/dist/chunk-XKT5MHPT.js +677 -0
  41. package/dist/chunk-XKT5MHPT.js.map +1 -0
  42. package/dist/{chunk-HCTJFIJJ.js → chunk-YLPSQAM2.js} +2 -2
  43. package/dist/{chunk-HCTJFIJJ.js.map → chunk-YLPSQAM2.js.map} +1 -1
  44. package/dist/{chunk-6HXKTOD7.js → chunk-ZTFNYOC7.js} +53 -38
  45. package/dist/chunk-ZTFNYOC7.js.map +1 -0
  46. package/dist/cli/index.js +4362 -2927
  47. package/dist/cli/index.js.map +1 -1
  48. package/dist/{config-BOAMSKTF.js → config-4CJNUE3O.js} +7 -3
  49. package/dist/dashboard/prompts/merge-agent.md +217 -0
  50. package/dist/dashboard/prompts/review-agent.md +409 -0
  51. package/dist/dashboard/prompts/sync-main.md +84 -0
  52. package/dist/dashboard/prompts/test-agent.md +283 -0
  53. package/dist/dashboard/prompts/work-agent.md +247 -0
  54. package/dist/dashboard/public/assets/index-UjZq6ykz.css +32 -0
  55. package/dist/dashboard/public/assets/index-kAJqtLDO.js +708 -0
  56. package/dist/dashboard/public/index.html +2 -2
  57. package/dist/dashboard/server.js +15194 -3160
  58. package/dist/{dns-L3L2BB27.js → dns-7BDJSD3E.js} +4 -2
  59. package/dist/{feedback-writer-AAKF5BTK.js → feedback-writer-LVZ5TFYZ.js} +8 -4
  60. package/dist/feedback-writer-LVZ5TFYZ.js.map +1 -0
  61. package/dist/hume-WMAUBBV2.js +13 -0
  62. package/dist/index.d.ts +153 -40
  63. package/dist/index.js +65 -23
  64. package/dist/index.js.map +1 -1
  65. package/dist/{projects-VXRUCMLM.js → projects-JEIVIYC6.js} +3 -3
  66. package/dist/rally-RKFSWC7E.js +10 -0
  67. package/dist/{remote-agents-Z3R2A5BN.js → remote-agents-TFSMW7GN.js} +2 -2
  68. package/dist/{remote-workspace-2G6V2KNP.js → remote-workspace-AHVHQEES.js} +8 -8
  69. package/dist/review-status-EPFG4XM7.js +19 -0
  70. package/dist/shadow-state-5MDP6YXH.js +30 -0
  71. package/dist/shadow-state-5MDP6YXH.js.map +1 -0
  72. package/dist/{specialist-context-N32QBNNQ.js → specialist-context-T3NBMCIE.js} +8 -7
  73. package/dist/{specialist-context-N32QBNNQ.js.map → specialist-context-T3NBMCIE.js.map} +1 -1
  74. package/dist/{specialist-logs-GF3YV4KL.js → specialist-logs-CVKD3YJ3.js} +7 -6
  75. package/dist/specialist-logs-CVKD3YJ3.js.map +1 -0
  76. package/dist/{specialists-JBIW6MP4.js → specialists-TKAP6T6Z.js} +7 -6
  77. package/dist/specialists-TKAP6T6Z.js.map +1 -0
  78. package/dist/tldr-daemon-T3THOUGT.js +21 -0
  79. package/dist/tldr-daemon-T3THOUGT.js.map +1 -0
  80. package/dist/traefik-QX4ZV4YG.js +19 -0
  81. package/dist/traefik-QX4ZV4YG.js.map +1 -0
  82. package/dist/tunnel-W2GZBLEV.js +13 -0
  83. package/dist/tunnel-W2GZBLEV.js.map +1 -0
  84. package/dist/workspace-manager-KLHUCIZV.js +22 -0
  85. package/dist/workspace-manager-KLHUCIZV.js.map +1 -0
  86. package/package.json +2 -2
  87. package/scripts/heartbeat-hook +37 -10
  88. package/scripts/patches/llm-tldr-tsx-support.py +109 -0
  89. package/scripts/pre-tool-hook +26 -15
  90. package/scripts/record-cost-event.js +177 -43
  91. package/scripts/record-cost-event.ts +87 -3
  92. package/scripts/statusline.sh +169 -0
  93. package/scripts/stop-hook +14 -11
  94. package/scripts/tldr-post-edit +72 -0
  95. package/scripts/tldr-read-enforcer +275 -0
  96. package/skills/check-merged/SKILL.md +143 -0
  97. package/skills/crash-investigation/SKILL.md +301 -0
  98. package/skills/github-cli/SKILL.md +185 -0
  99. package/skills/pan-reopen/SKILL.md +65 -0
  100. package/skills/pan-sync-main/SKILL.md +87 -0
  101. package/skills/pan-tldr/SKILL.md +149 -0
  102. package/skills/react-best-practices/SKILL.md +125 -0
  103. package/skills/spec-readiness/REPORT-TEMPLATE.md +158 -0
  104. package/skills/spec-readiness/SCORING-REFERENCE.md +369 -0
  105. package/skills/spec-readiness/SKILL.md +400 -0
  106. package/skills/spec-readiness-setup/SKILL.md +361 -0
  107. package/skills/workspace-status/SKILL.md +56 -0
  108. package/templates/traefik/dynamic/panopticon.yml.template +0 -5
  109. package/templates/traefik/traefik.yml +0 -8
  110. package/dist/chunk-2NIAOCIC.js.map +0 -1
  111. package/dist/chunk-3XAB4IXF.js +0 -51
  112. package/dist/chunk-3XAB4IXF.js.map +0 -1
  113. package/dist/chunk-6HXKTOD7.js.map +0 -1
  114. package/dist/chunk-BBCUK6N2.js +0 -241
  115. package/dist/chunk-BBCUK6N2.js.map +0 -1
  116. package/dist/chunk-BWGFN44T.js.map +0 -1
  117. package/dist/chunk-ELK6Q7QI.js +0 -545
  118. package/dist/chunk-ELK6Q7QI.js.map +0 -1
  119. package/dist/chunk-JY7R7V4G.js.map +0 -1
  120. package/dist/chunk-LYSBSZYV.js +0 -1523
  121. package/dist/chunk-LYSBSZYV.js.map +0 -1
  122. package/dist/chunk-VIWUCJ4V.js.map +0 -1
  123. package/dist/chunk-VU4FLXV5.js.map +0 -1
  124. package/dist/chunk-XP2DXWYP.js.map +0 -1
  125. package/dist/dashboard/public/assets/index-C7X6LP5Z.css +0 -32
  126. package/dist/dashboard/public/assets/index-ClYqpcAJ.js +0 -645
  127. package/dist/feedback-writer-AAKF5BTK.js.map +0 -1
  128. package/dist/review-status-GWQYY77L.js.map +0 -1
  129. package/dist/traefik-CUJM6K5Z.js +0 -12
  130. /package/dist/{agents-BDFHF4T3.js.map → agents-VLK4BMVA.js.map} +0 -0
  131. /package/dist/{config-BOAMSKTF.js.map → config-4CJNUE3O.js.map} +0 -0
  132. /package/dist/{dns-L3L2BB27.js.map → dns-7BDJSD3E.js.map} +0 -0
  133. /package/dist/{projects-VXRUCMLM.js.map → hume-WMAUBBV2.js.map} +0 -0
  134. /package/dist/{remote-agents-Z3R2A5BN.js.map → projects-JEIVIYC6.js.map} +0 -0
  135. /package/dist/{specialist-logs-GF3YV4KL.js.map → rally-RKFSWC7E.js.map} +0 -0
  136. /package/dist/{specialists-JBIW6MP4.js.map → remote-agents-TFSMW7GN.js.map} +0 -0
  137. /package/dist/{remote-workspace-2G6V2KNP.js.map → remote-workspace-AHVHQEES.js.map} +0 -0
  138. /package/dist/{traefik-CUJM6K5Z.js.map → review-status-EPFG4XM7.js.map} +0 -0
@@ -4,6 +4,7 @@ import {
4
4
  detectCrashedAgents,
5
5
  getActivity,
6
6
  getAgentDir,
7
+ getAgentRuntimeFile,
7
8
  getAgentRuntimeState,
8
9
  getAgentState,
9
10
  getSessionId,
@@ -17,12 +18,13 @@ import {
17
18
  saveSessionId,
18
19
  spawnAgent,
19
20
  stopAgent
20
- } from "./chunk-XP2DXWYP.js";
21
- import "./chunk-VIWUCJ4V.js";
22
- import "./chunk-LYSBSZYV.js";
23
- import "./chunk-BBCUK6N2.js";
24
- import "./chunk-VU4FLXV5.js";
25
- import "./chunk-6HXKTOD7.js";
21
+ } from "./chunk-BKCWRMUX.js";
22
+ import "./chunk-KJ2TRXNK.js";
23
+ import "./chunk-XFR2DLMR.js";
24
+ import "./chunk-7XNJJBH6.js";
25
+ import "./chunk-FQ66DECN.js";
26
+ import "./chunk-CFCUOV3Q.js";
27
+ import "./chunk-ZTFNYOC7.js";
26
28
  import "./chunk-ZHC57RCV.js";
27
29
  init_agents();
28
30
  export {
@@ -31,6 +33,7 @@ export {
31
33
  detectCrashedAgents,
32
34
  getActivity,
33
35
  getAgentDir,
36
+ getAgentRuntimeFile,
34
37
  getAgentRuntimeState,
35
38
  getAgentState,
36
39
  getSessionId,
@@ -44,4 +47,4 @@ export {
44
47
  spawnAgent,
45
48
  stopAgent
46
49
  };
47
- //# sourceMappingURL=agents-BDFHF4T3.js.map
50
+ //# sourceMappingURL=agents-VLK4BMVA.js.map
@@ -0,0 +1,150 @@
1
+ import {
2
+ init_workspace_config,
3
+ replacePlaceholders
4
+ } from "./chunk-CWELWPWQ.js";
5
+ import {
6
+ __esm,
7
+ init_esm_shims
8
+ } from "./chunk-ZHC57RCV.js";
9
+
10
+ // src/lib/hume.ts
11
+ async function humeFetch(path, apiKey, method = "GET", body) {
12
+ const controller = new AbortController();
13
+ const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT);
14
+ try {
15
+ const resp = await fetch(`${HUME_API}${path}`, {
16
+ method,
17
+ headers: {
18
+ "X-Hume-Api-Key": apiKey,
19
+ "Content-Type": "application/json"
20
+ },
21
+ body: body ? JSON.stringify(body) : void 0,
22
+ signal: controller.signal
23
+ });
24
+ if (resp.status === 204) {
25
+ return { ok: true, status: 204, data: null };
26
+ }
27
+ const json = await resp.json();
28
+ return { ok: resp.ok, status: resp.status, data: json };
29
+ } catch (err) {
30
+ return { ok: false, status: 0, data: { message: err.message } };
31
+ } finally {
32
+ clearTimeout(timeout);
33
+ }
34
+ }
35
+ async function createHumeConfig(config, placeholders) {
36
+ const steps = [];
37
+ const apiKey = process.env[config.api_key_env || "HUME_API_KEY"];
38
+ if (!apiKey) {
39
+ return { success: false, steps: [`[hume] API key not found in env var ${config.api_key_env || "HUME_API_KEY"}`] };
40
+ }
41
+ const configName = replacePlaceholders(config.name_pattern, placeholders);
42
+ const byollmUrl = replacePlaceholders(config.byollm_url_pattern, placeholders);
43
+ steps.push(`[hume] Target config: ${configName}`);
44
+ steps.push(`[hume] BYOLLM URL: ${byollmUrl}`);
45
+ const listResult = await humeFetch(`/configs?name=${encodeURIComponent(configName)}`, apiKey);
46
+ if (listResult.ok) {
47
+ const configs = listResult.data?.configs_page ?? [];
48
+ const existing = Array.isArray(configs) ? configs.find((c) => c.name === configName) : null;
49
+ if (existing) {
50
+ steps.push(`[hume] Config "${configName}" already exists (ID: ${existing.id}), skipping creation`);
51
+ return { success: true, steps, configId: existing.id, configName };
52
+ }
53
+ }
54
+ const templateResult = await humeFetch(`/configs/${config.template_config_id}`, apiKey);
55
+ if (!templateResult.ok) {
56
+ steps.push(`[hume] Failed to get template config ${config.template_config_id}: ${JSON.stringify(templateResult.data)}`);
57
+ return { success: false, steps };
58
+ }
59
+ const templatePage = templateResult.data?.configs_page;
60
+ const template = Array.isArray(templatePage) ? templatePage[0] : templateResult.data;
61
+ if (!template || !template.id) {
62
+ steps.push(`[hume] Template config ${config.template_config_id} not found in response`);
63
+ return { success: false, steps };
64
+ }
65
+ steps.push(`[hume] Read template config: ${template.name || config.template_config_id}`);
66
+ const newConfig = {
67
+ name: configName,
68
+ evi_version: template.evi_version || "3",
69
+ language_model: {
70
+ model_provider: "CUSTOM_LANGUAGE_MODEL",
71
+ model_resource: byollmUrl
72
+ }
73
+ };
74
+ if (template.voice) {
75
+ newConfig.voice = template.voice;
76
+ }
77
+ if (template.prompt) {
78
+ newConfig.prompt = template.prompt;
79
+ }
80
+ if (template.event_messages) {
81
+ newConfig.event_messages = template.event_messages;
82
+ }
83
+ if (template.timeouts) {
84
+ newConfig.timeouts = template.timeouts;
85
+ }
86
+ if (template.tools) {
87
+ newConfig.tools = template.tools;
88
+ }
89
+ if (template.builtin_tools) {
90
+ newConfig.builtin_tools = template.builtin_tools;
91
+ }
92
+ if (template.ellm_model) {
93
+ newConfig.ellm_model = template.ellm_model;
94
+ }
95
+ const createResult = await humeFetch("/configs", apiKey, "POST", newConfig);
96
+ if (!createResult.ok) {
97
+ steps.push(`[hume] Failed to create config: ${JSON.stringify(createResult.data)}`);
98
+ return { success: false, steps };
99
+ }
100
+ const newId = createResult.data?.id;
101
+ steps.push(`[hume] Created config "${configName}" (ID: ${newId})`);
102
+ return { success: true, steps, configId: newId, configName };
103
+ }
104
+ async function deleteHumeConfig(config, placeholders) {
105
+ const steps = [];
106
+ const apiKey = process.env[config.api_key_env || "HUME_API_KEY"];
107
+ if (!apiKey) {
108
+ return { success: false, steps: [`[hume] API key not found in env var ${config.api_key_env || "HUME_API_KEY"}`] };
109
+ }
110
+ const configName = replacePlaceholders(config.name_pattern, placeholders);
111
+ steps.push(`[hume] Looking for config: ${configName}`);
112
+ const listResult = await humeFetch(`/configs?name=${encodeURIComponent(configName)}`, apiKey);
113
+ if (!listResult.ok) {
114
+ steps.push(`[hume] Failed to list configs: ${JSON.stringify(listResult.data)}`);
115
+ return { success: false, steps };
116
+ }
117
+ const configs = listResult.data?.configs_page ?? [];
118
+ const matches = Array.isArray(configs) ? configs.filter((c) => c.name === configName) : [];
119
+ if (matches.length === 0) {
120
+ steps.push(`[hume] No config found with name "${configName}"`);
121
+ return { success: true, steps };
122
+ }
123
+ let allOk = true;
124
+ for (const match of matches) {
125
+ const delResult = await humeFetch(`/configs/${match.id}`, apiKey, "DELETE");
126
+ if (delResult.ok) {
127
+ steps.push(`[hume] Deleted config "${configName}" (ID: ${match.id})`);
128
+ } else {
129
+ steps.push(`[hume] Failed to delete config ${match.id}: ${JSON.stringify(delResult.data)}`);
130
+ allOk = false;
131
+ }
132
+ }
133
+ return { success: allOk, steps };
134
+ }
135
+ var HUME_API, FETCH_TIMEOUT;
136
+ var init_hume = __esm({
137
+ "src/lib/hume.ts"() {
138
+ init_esm_shims();
139
+ init_workspace_config();
140
+ HUME_API = "https://api.hume.ai/v0/evi";
141
+ FETCH_TIMEOUT = 15e3;
142
+ }
143
+ });
144
+
145
+ export {
146
+ createHumeConfig,
147
+ deleteHumeConfig,
148
+ init_hume
149
+ };
150
+ //# sourceMappingURL=chunk-7SN4L4PH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/hume.ts"],"sourcesContent":["/**\n * Hume EVI Config Management\n *\n * Manages per-workspace Hume EVI configs for BYOLLM (Bring Your Own LLM).\n * Called during workspace create (createHumeConfig) and workspace remove/deep-wipe (deleteHumeConfig).\n *\n * Pattern mirrors tunnel.ts — stateless CRUD against external API.\n */\n\nimport { HumeConfig, TemplatePlaceholders, replacePlaceholders } from './workspace-config.js';\n\nexport interface HumeResult {\n success: boolean;\n steps: string[];\n /** Populated on successful create */\n configId?: string;\n configName?: string;\n}\n\nconst HUME_API = 'https://api.hume.ai/v0/evi';\nconst FETCH_TIMEOUT = 15_000;\n\n/**\n * Make an authenticated Hume API request.\n * Auth via X-Hume-Api-Key header.\n */\nasync function humeFetch(\n path: string,\n apiKey: string,\n method: 'GET' | 'POST' | 'DELETE' = 'GET',\n body?: unknown,\n): Promise<{ ok: boolean; status: number; data: any }> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT);\n\n try {\n const resp = await fetch(`${HUME_API}${path}`, {\n method,\n headers: {\n 'X-Hume-Api-Key': apiKey,\n 'Content-Type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n // DELETE returns 204 No Content\n if (resp.status === 204) {\n return { ok: true, status: 204, data: null };\n }\n\n const json = await resp.json();\n return { ok: resp.ok, status: resp.status, data: json };\n } catch (err: any) {\n return { ok: false, status: 0, data: { message: err.message } };\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/**\n * Create a workspace-specific Hume EVI config by cloning the template config.\n *\n * Steps:\n * 1. Resolve config name from name_pattern with placeholders\n * 2. Check if config already exists (idempotent)\n * 3. GET template config to extract voice, prompt, tools, etc.\n * 4. POST new config with workspace-specific BYOLLM URL\n */\nexport async function createHumeConfig(\n config: HumeConfig,\n placeholders: TemplatePlaceholders,\n): Promise<HumeResult> {\n const steps: string[] = [];\n\n // Resolve API key\n const apiKey = process.env[config.api_key_env || 'HUME_API_KEY'];\n if (!apiKey) {\n return { success: false, steps: [`[hume] API key not found in env var ${config.api_key_env || 'HUME_API_KEY'}`] };\n }\n\n // Resolve config name and BYOLLM URL\n const configName = replacePlaceholders(config.name_pattern, placeholders);\n const byollmUrl = replacePlaceholders(config.byollm_url_pattern, placeholders);\n steps.push(`[hume] Target config: ${configName}`);\n steps.push(`[hume] BYOLLM URL: ${byollmUrl}`);\n\n // Check if config already exists (idempotent)\n const listResult = await humeFetch(`/configs?name=${encodeURIComponent(configName)}`, apiKey);\n if (listResult.ok) {\n const configs = listResult.data?.configs_page ?? [];\n const existing = Array.isArray(configs)\n ? configs.find((c: any) => c.name === configName)\n : null;\n if (existing) {\n steps.push(`[hume] Config \"${configName}\" already exists (ID: ${existing.id}), skipping creation`);\n return { success: true, steps, configId: existing.id, configName };\n }\n }\n\n // GET template config (API returns paginated format even for single-config lookup)\n const templateResult = await humeFetch(`/configs/${config.template_config_id}`, apiKey);\n if (!templateResult.ok) {\n steps.push(`[hume] Failed to get template config ${config.template_config_id}: ${JSON.stringify(templateResult.data)}`);\n return { success: false, steps };\n }\n\n // Extract config from paginated response\n const templatePage = templateResult.data?.configs_page;\n const template = Array.isArray(templatePage) ? templatePage[0] : templateResult.data;\n if (!template || !template.id) {\n steps.push(`[hume] Template config ${config.template_config_id} not found in response`);\n return { success: false, steps };\n }\n steps.push(`[hume] Read template config: ${template.name || config.template_config_id}`);\n\n // Build new config payload — clone template but override name and BYOLLM URL\n const newConfig: Record<string, any> = {\n name: configName,\n evi_version: template.evi_version || '3',\n language_model: {\n model_provider: 'CUSTOM_LANGUAGE_MODEL',\n model_resource: byollmUrl,\n },\n };\n\n // Preserve voice from template\n if (template.voice) {\n newConfig.voice = template.voice;\n }\n\n // Preserve prompt from template\n if (template.prompt) {\n newConfig.prompt = template.prompt;\n }\n\n // Preserve event messages from template\n if (template.event_messages) {\n newConfig.event_messages = template.event_messages;\n }\n\n // Preserve timeouts from template\n if (template.timeouts) {\n newConfig.timeouts = template.timeouts;\n }\n\n // Preserve tools from template\n if (template.tools) {\n newConfig.tools = template.tools;\n }\n\n // Preserve builtin_tools from template\n if (template.builtin_tools) {\n newConfig.builtin_tools = template.builtin_tools;\n }\n\n // Preserve ellm_model (quick responses) from template\n if (template.ellm_model) {\n newConfig.ellm_model = template.ellm_model;\n }\n\n // Create new config\n const createResult = await humeFetch('/configs', apiKey, 'POST', newConfig);\n if (!createResult.ok) {\n steps.push(`[hume] Failed to create config: ${JSON.stringify(createResult.data)}`);\n return { success: false, steps };\n }\n\n const newId = createResult.data?.id;\n steps.push(`[hume] Created config \"${configName}\" (ID: ${newId})`);\n\n return { success: true, steps, configId: newId, configName };\n}\n\n/**\n * Delete a workspace-specific Hume EVI config.\n *\n * Steps:\n * 1. List configs matching the workspace name\n * 2. DELETE each match\n */\nexport async function deleteHumeConfig(\n config: HumeConfig,\n placeholders: TemplatePlaceholders,\n): Promise<HumeResult> {\n const steps: string[] = [];\n\n // Resolve API key\n const apiKey = process.env[config.api_key_env || 'HUME_API_KEY'];\n if (!apiKey) {\n return { success: false, steps: [`[hume] API key not found in env var ${config.api_key_env || 'HUME_API_KEY'}`] };\n }\n\n const configName = replacePlaceholders(config.name_pattern, placeholders);\n steps.push(`[hume] Looking for config: ${configName}`);\n\n // List configs matching the name\n const listResult = await humeFetch(`/configs?name=${encodeURIComponent(configName)}`, apiKey);\n if (!listResult.ok) {\n steps.push(`[hume] Failed to list configs: ${JSON.stringify(listResult.data)}`);\n return { success: false, steps };\n }\n\n const configs = listResult.data?.configs_page ?? [];\n const matches = Array.isArray(configs)\n ? configs.filter((c: any) => c.name === configName)\n : [];\n\n if (matches.length === 0) {\n steps.push(`[hume] No config found with name \"${configName}\"`);\n return { success: true, steps };\n }\n\n let allOk = true;\n for (const match of matches) {\n const delResult = await humeFetch(`/configs/${match.id}`, apiKey, 'DELETE');\n if (delResult.ok) {\n steps.push(`[hume] Deleted config \"${configName}\" (ID: ${match.id})`);\n } else {\n steps.push(`[hume] Failed to delete config ${match.id}: ${JSON.stringify(delResult.data)}`);\n allOk = false;\n }\n }\n\n return { success: allOk, steps };\n}\n"],"mappings":"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","names":[]}