@kafca/agentdock 0.1.21 → 0.1.23

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 (81) hide show
  1. package/README.md +9 -0
  2. package/dist/renderer/assets/{Badge-BRmQIqbd.js → Badge-C2K5apfV.js} +1 -1
  3. package/dist/renderer/assets/{Chat-D94ODABB.js → Chat-DI2YeVKb.js} +1 -1
  4. package/dist/renderer/assets/{ChatMarkdown-DqW7OUvV.js → ChatMarkdown-DMAr15Oi.js} +1 -1
  5. package/dist/renderer/assets/{Config-9lgzpTCp.js → Config-7rP3EuUf.js} +2 -2
  6. package/dist/renderer/assets/CronList-81QslYE8.js +1 -0
  7. package/dist/renderer/assets/{Dashboard-COISXbQy.js → Dashboard-Db2T7rSZ.js} +2 -2
  8. package/dist/renderer/assets/{EmptyState-w5-I9zg7.js → EmptyState-BBJ3cTvB.js} +1 -1
  9. package/dist/renderer/assets/{KnowledgeDetail-DVxwrTLw.js → KnowledgeDetail-Dz_6flG3.js} +2 -2
  10. package/dist/renderer/assets/{KnowledgeHome-BKkubcwi.js → KnowledgeHome-DIh046mN.js} +3 -3
  11. package/dist/renderer/assets/Logs-BXBtHJLf.js +1 -0
  12. package/dist/renderer/assets/{Modal-Ceu_MP2e.js → Modal-BB2Av_Xs.js} +1 -1
  13. package/dist/renderer/assets/{Page-CpSczAz8.js → Page-DPSdvMgU.js} +1 -1
  14. package/dist/renderer/assets/{ProjectDetail-FJ_bNXLF.js → ProjectDetail-C6EWGvGg.js} +1 -1
  15. package/dist/renderer/assets/{ProjectList-DZKL4K9C.js → ProjectList-BBo5ygnS.js} +1 -1
  16. package/dist/renderer/assets/{Select-BHQk6qCU.js → Select-CNX-Tx_O.js} +2 -7
  17. package/dist/renderer/assets/SessionChat-BIn46jqZ.js +1 -0
  18. package/dist/renderer/assets/SessionList-CZt6f1Rd.js +1 -0
  19. package/dist/renderer/assets/{ThreadChat-D3s4GXGh.js → ThreadChat-BotD0gKQ.js} +7 -7
  20. package/dist/renderer/assets/Workspace-C_4tdpjX.js +14 -0
  21. package/dist/renderer/assets/{arrow-left-Dtal-eOi.js → arrow-left-cHr5wkpq.js} +1 -1
  22. package/dist/renderer/assets/{book-open-q814R_Ov.js → book-open-4nx5C8T-.js} +1 -1
  23. package/dist/renderer/assets/{check-DjfCdLvw.js → check-exTS-R-x.js} +1 -1
  24. package/dist/renderer/assets/chevron-down-DSvxXQa0.js +6 -0
  25. package/dist/renderer/assets/{circle-vfhmyE8v.js → circle-DyvEovdw.js} +1 -1
  26. package/dist/renderer/assets/desktop-B-KVT10D.js +1 -0
  27. package/dist/renderer/assets/desktop-CVibRyAw.js +4 -0
  28. package/dist/renderer/assets/{funnel-CUQibo1I.js → funnel-DA9qVdTy.js} +1 -1
  29. package/dist/renderer/assets/{heart-DG9_b8P1.js → heart-DuEV0ZRJ.js} +1 -1
  30. package/dist/renderer/assets/{index-Ds0IN5rP.js → index-BgflqkCN.js} +3 -3
  31. package/dist/renderer/assets/index-Biz-aexG.js +177 -0
  32. package/dist/renderer/assets/{index-3CzgyQYB.css → index-DFiJR0vv.css} +1 -1
  33. package/dist/renderer/assets/{pencil-Dij0LlRY.js → pencil-DBDxeNmO.js} +1 -1
  34. package/dist/renderer/assets/{play-CPFGjIyJ.js → play-IzlP83_7.js} +1 -1
  35. package/dist/renderer/assets/{plug-DH3RKQyn.js → plug-CuT-qFnW.js} +1 -1
  36. package/dist/renderer/assets/{plus-afkK9_Y8.js → plus-DEqgkn63.js} +1 -1
  37. package/dist/renderer/assets/projects-DDtDN1rc.js +1 -0
  38. package/dist/renderer/assets/{save-B-cKgWcy.js → save-D4sRo07y.js} +1 -1
  39. package/dist/renderer/assets/{search-DR6PeYkt.js → search-DbPZLuV8.js} +1 -1
  40. package/dist/renderer/assets/{server-BM6KOB5a.js → server-D1jUQmwN.js} +1 -1
  41. package/dist/renderer/assets/{session-utils-BDuThM0a.js → session-utils-Aife8ep2.js} +1 -1
  42. package/dist/renderer/assets/{sessions-C1yKps4T.js → sessions-DaH3H7gC.js} +1 -1
  43. package/dist/renderer/assets/{shield-check-BFjMG-r2.js → shield-check-BGwUFWNr.js} +1 -1
  44. package/dist/renderer/assets/{trash-2-CW1heMCf.js → trash-2-CIFBioBa.js} +1 -1
  45. package/dist/renderer/assets/{user-r_2sHG7m.js → user-CnKcvHdo.js} +1 -1
  46. package/dist/renderer/assets/{wifi-off-VMUokMpE.js → wifi-off-ClO53WGa.js} +1 -1
  47. package/dist/renderer/index.html +2 -2
  48. package/dist-electron/electron/local-core-refactor.test.js +812 -3
  49. package/dist-electron/electron/plugin-kernel.test.js +74 -14
  50. package/dist-electron/packages/core-sdk/src/index.js +40 -20
  51. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-turn-coordinator.js +5 -1
  52. package/dist-electron/services/local-ai-core/src/acp/workspace-acp-permissions.js +55 -3
  53. package/dist-electron/services/local-ai-core/src/channel/lark/cards.js +210 -0
  54. package/dist-electron/services/local-ai-core/src/channel/lark/config.js +54 -0
  55. package/dist-electron/services/local-ai-core/src/{gateway → channel/lark}/local-core-lark-gateway.js +365 -383
  56. package/dist-electron/services/local-ai-core/src/channel/lark/registration.js +50 -0
  57. package/dist-electron/services/local-ai-core/src/channel/lark/runtime-state.js +191 -0
  58. package/dist-electron/services/local-ai-core/src/channel/lark/types.js +2 -0
  59. package/dist-electron/services/local-ai-core/src/channel/shared/file-utils.js +33 -0
  60. package/dist-electron/services/local-ai-core/src/channel/shared/plugin.js +31 -0
  61. package/dist-electron/services/local-ai-core/src/channel/weixin/config.js +125 -0
  62. package/dist-electron/services/local-ai-core/src/{gateway → channel/weixin}/local-core-weixin-gateway.js +262 -258
  63. package/dist-electron/services/local-ai-core/src/channel/weixin/transport.js +169 -0
  64. package/dist-electron/services/local-ai-core/src/channel/weixin/types.js +2 -0
  65. package/dist-electron/services/local-ai-core/src/cli/lac.js +41 -1
  66. package/dist-electron/services/local-ai-core/src/kernel/bootstrap.js +5 -0
  67. package/dist-electron/services/local-ai-core/src/plugins/builtin/channel-lark-plugin.js +19 -40
  68. package/dist-electron/services/local-ai-core/src/plugins/builtin/channel-weixin-plugin.js +19 -40
  69. package/dist-electron/services/local-ai-core/src/runtime/local-core-controller.js +96 -44
  70. package/dist-electron/services/local-ai-core/src/runtime/server.js +20 -8
  71. package/dist-electron/shared/desktop.js +24 -1
  72. package/package.json +1 -1
  73. package/dist/renderer/assets/CronList-BYZ-x_bp.js +0 -1
  74. package/dist/renderer/assets/Logs-D7HxZ8Nb.js +0 -1
  75. package/dist/renderer/assets/SessionChat-DpgSXF3m.js +0 -1
  76. package/dist/renderer/assets/SessionList-CU6drQ4N.js +0 -1
  77. package/dist/renderer/assets/Workspace-B7looTVo.js +0 -14
  78. package/dist/renderer/assets/desktop-BPIxWbkM.js +0 -1
  79. package/dist/renderer/assets/desktop-DZHC4PDB.js +0 -3
  80. package/dist/renderer/assets/index-Bn8ane6_.js +0 -177
  81. package/dist/renderer/assets/projects-DTDS9SnT.js +0 -1
@@ -187,6 +187,7 @@ class LocalAiCoreServer {
187
187
  const suffix = path.slice('/api/local/v1/platforms/'.length);
188
188
  const segments = suffix.split('/').filter(Boolean).map((segment) => decodeURIComponent(segment));
189
189
  const [platform = '', workspaceOrCollection = '', action = ''] = segments;
190
+ const instanceId = String(url.searchParams.get('instance_id') || url.searchParams.get('instanceId') || '').trim() || undefined;
190
191
  if (!platform) {
191
192
  json(res, 404, null, false, 'Platform not found');
192
193
  return;
@@ -206,16 +207,16 @@ class LocalAiCoreServer {
206
207
  return;
207
208
  }
208
209
  if (segments.length === 2) {
209
- json(res, 200, await this.bindings.getChannelGatewayStatus(platform, workspaceOrCollection));
210
+ json(res, 200, await this.bindings.getChannelGatewayStatus(platform, workspaceOrCollection, instanceId));
210
211
  return;
211
212
  }
212
- if (platform === 'weixin' && segments.length === 4 && action === 'qrcode' && segments[3] === 'status') {
213
+ if (segments.length === 4 && action === 'qrcode' && segments[3] === 'status') {
213
214
  const ticket = String(url.searchParams.get('ticket') || '');
214
215
  if (!ticket) {
215
216
  json(res, 400, null, false, 'Missing ticket parameter');
216
217
  return;
217
218
  }
218
- json(res, 200, await this.bindings.checkWeixinQrCodeStatus(workspaceOrCollection, ticket));
219
+ json(res, 200, await this.bindings.checkChannelQrCodeStatus(platform, workspaceOrCollection, ticket, instanceId));
219
220
  return;
220
221
  }
221
222
  }
@@ -223,6 +224,7 @@ class LocalAiCoreServer {
223
224
  const suffix = path.slice('/api/local/v1/platforms/'.length);
224
225
  const segments = suffix.split('/').filter(Boolean).map((segment) => decodeURIComponent(segment));
225
226
  const [platform = '', workspaceOrCollection = '', action = ''] = segments;
227
+ const instanceId = String(url.searchParams.get('instance_id') || url.searchParams.get('instanceId') || '').trim() || undefined;
226
228
  if (!platform) {
227
229
  json(res, 404, null, false, 'Platform not found');
228
230
  return;
@@ -238,19 +240,29 @@ class LocalAiCoreServer {
238
240
  return;
239
241
  }
240
242
  if (action === 'test') {
241
- json(res, 200, await this.bindings.testChannelConnection(platform, workspaceOrCollection));
243
+ json(res, 200, await this.bindings.testChannelConnection(platform, workspaceOrCollection, instanceId));
242
244
  return;
243
245
  }
244
246
  if (action === 'enable') {
245
- json(res, 200, await this.bindings.enableChannelGateway(platform, workspaceOrCollection));
247
+ json(res, 200, await this.bindings.enableChannelGateway(platform, workspaceOrCollection, instanceId));
246
248
  return;
247
249
  }
248
250
  if (action === 'disable') {
249
- json(res, 200, await this.bindings.disableChannelGateway(platform, workspaceOrCollection));
251
+ json(res, 200, await this.bindings.disableChannelGateway(platform, workspaceOrCollection, instanceId));
250
252
  return;
251
253
  }
252
- if (platform === 'weixin' && segments.length === 3 && workspaceOrCollection !== 'pairings' && action === 'qrcode') {
253
- json(res, 200, await this.bindings.getWeixinQrCode(workspaceOrCollection));
254
+ if (action === 'files') {
255
+ const body = await readJsonBody(req);
256
+ json(res, 200, await this.bindings.sendChannelFile(platform, workspaceOrCollection, body));
257
+ return;
258
+ }
259
+ if (action === 'messages') {
260
+ const body = await readJsonBody(req);
261
+ json(res, 200, await this.bindings.sendChannelMessage(platform, workspaceOrCollection, body));
262
+ return;
263
+ }
264
+ if (segments.length === 3 && workspaceOrCollection !== 'pairings' && action === 'qrcode') {
265
+ json(res, 200, await this.bindings.getChannelQrCode(platform, workspaceOrCollection, instanceId));
254
266
  return;
255
267
  }
256
268
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SCHEDULER_PROTOCOL_INSTRUCTION = exports.LOCALCORE_ACP_AGENT_TYPE = exports.DESKTOP_INTERACTIVE_PERMISSION_AGENT_TYPES = exports.DESKTOP_PROVIDER_THINKING_OPTIONS = exports.DESKTOP_PROVIDER_PRESET_OPTIONS = exports.DESKTOP_PLATFORM_TYPE_OPTIONS = exports.DESKTOP_AGENT_TYPE_OPTIONS = exports.DESKTOP_LARK_SDK_PACKAGE = exports.DESKTOP_CLAUDECODE_ACP_PACKAGE = exports.DESKTOP_CODEX_ACP_PACKAGE = exports.DEFAULT_DESKTOP_CLAUDECODE_MODEL = exports.DEFAULT_DESKTOP_OPENCODE_MODEL = exports.DEFAULT_DESKTOP_AGENT_TYPE = void 0;
3
+ exports.CHANNEL_PROTOCOL_INSTRUCTION = exports.SCHEDULER_PROTOCOL_INSTRUCTION = exports.LOCALCORE_ACP_AGENT_TYPE = exports.DESKTOP_INTERACTIVE_PERMISSION_AGENT_TYPES = exports.DESKTOP_PROVIDER_THINKING_OPTIONS = exports.DESKTOP_PROVIDER_PRESET_OPTIONS = exports.DESKTOP_PLATFORM_TYPE_OPTIONS = exports.DESKTOP_AGENT_TYPE_OPTIONS = exports.DESKTOP_LARK_SDK_PACKAGE = exports.DESKTOP_CLAUDECODE_ACP_PACKAGE = exports.DESKTOP_CODEX_ACP_PACKAGE = exports.DEFAULT_DESKTOP_CLAUDECODE_MODEL = exports.DEFAULT_DESKTOP_OPENCODE_MODEL = exports.DEFAULT_DESKTOP_AGENT_TYPE = void 0;
4
4
  exports.deriveDesktopRuntimePhase = deriveDesktopRuntimePhase;
5
5
  exports.deriveDesktopRuntimeRoles = deriveDesktopRuntimeRoles;
6
6
  exports.normalizeDesktopPlatformType = normalizeDesktopPlatformType;
@@ -73,14 +73,35 @@ exports.SCHEDULER_PROTOCOL_INSTRUCTION = [
73
73
  'Only use the scheduler CLI when the user explicitly asks for scheduled automation.',
74
74
  '[/Scheduler Tools]',
75
75
  ].join('\n');
76
+ exports.CHANNEL_PROTOCOL_INSTRUCTION = [
77
+ '[Channel Tools]',
78
+ 'If the user asks you to send a local file back through the current channel conversation, use the Bash tool to run the local channel CLI.',
79
+ 'Use this command:',
80
+ 'lac channel send-file --path "<absolute-or-workdir-relative-file-path>" [--target "<channel-chat-or-user-id>"]',
81
+ 'By default, the file is sent to the current platform conversation from LOCAL_AI_CHAT_ID.',
82
+ 'Use --target only when the user explicitly names a different channel chat or user id.',
83
+ 'The CLI accepts absolute paths. Check that the file exists before sending when practical.',
84
+ 'Only use the channel CLI when the user explicitly asks to send a file through the channel.',
85
+ '[/Channel Tools]',
86
+ ].join('\n');
76
87
  const PERMISSION_RESPONSE_MAP = {
77
88
  allow: 'allow',
78
89
  deny: 'deny',
79
90
  'allow all': 'allow all',
80
91
  allowall: 'allow all',
92
+ allow_all: 'allow all',
93
+ allow_always: 'allow all',
94
+ always: 'allow all',
95
+ always_allow: 'allow all',
96
+ 'always allow': 'allow all',
97
+ 'allow always': 'allow all',
98
+ '始终允许': 'allow all',
99
+ '永久允许': 'allow all',
81
100
  'perm:allow': 'allow',
82
101
  'perm:deny': 'deny',
83
102
  'perm:allow_all': 'allow all',
103
+ 'perm:allow_always': 'allow all',
104
+ 'perm:always': 'allow all',
84
105
  };
85
106
  function deriveDesktopRuntimePhase(service) {
86
107
  if (service.status === 'starting') {
@@ -111,6 +132,8 @@ function normalizeDesktopPlatformType(platformType) {
111
132
  function wrapUserMessageWithSchedulerProtocol(content, extraBlocks = []) {
112
133
  return [
113
134
  exports.SCHEDULER_PROTOCOL_INSTRUCTION,
135
+ '',
136
+ exports.CHANNEL_PROTOCOL_INSTRUCTION,
114
137
  ...extraBlocks.flatMap((block) => (block ? ['', block] : [])),
115
138
  '',
116
139
  '[User Message]',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kafca/agentdock",
3
- "version": "0.1.21",
3
+ "version": "0.1.23",
4
4
  "type": "module",
5
5
  "main": "dist-electron/electron/main.js",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- import{G as R,l as b,H as z,J as D,K as W,N as O,u as B,r as n,j as t,O as F,B as c,D as L,C as U,A as k,I as f,T as H}from"./index-Bn8ane6_.js";import{B as u}from"./Badge-BRmQIqbd.js";import{M as G}from"./Modal-Ceu_MP2e.js";import{S as w}from"./Select-BHQk6qCU.js";import{E as K}from"./EmptyState-w5-I9zg7.js";import{P as _}from"./Page-CpSczAz8.js";import{P as q}from"./plus-afkK9_Y8.js";import{P as Q}from"./play-CPFGjIyJ.js";import{P as V}from"./pencil-Dij0LlRY.js";import{T as X}from"./trash-2-CW1heMCf.js";import"./index-Ds0IN5rP.js";import"./check-DjfCdLvw.js";const Y=a=>R(),Z=a=>D(a),$=(a,o)=>z(a,o),ee=a=>W(a),te=a=>O(a),ae=()=>b().then(a=>a.workspaces),x={workspaceId:"",executionMode:"same-thread",triggerType:"cron",cronExpr:"0 9 * * *",runAt:"",promptTemplate:"",description:"",chatId:"",platformUserId:"",threadId:"",enabled:!0};function se(a){return a?{workspaceId:a.workspaceId,executionMode:a.executionMode,triggerType:a.triggerType,cronExpr:a.cronExpr||"0 9 * * *",runAt:a.runAt?String(a.runAt).slice(0,16):"",promptTemplate:a.promptTemplate,description:a.description,chatId:a.route.channelId,platformUserId:a.route.participantId||"",threadId:a.route.threadId||"",enabled:a.enabled}:x}function re(a){return{workspaceId:a.workspaceId,platform:"local",route:{type:"local.thread",channelId:a.workspaceId||"local",...a.threadId?{threadId:a.threadId}:{}},executionMode:a.executionMode||"same-thread",triggerType:a.triggerType,...a.triggerType==="cron"?{cronExpr:a.cronExpr,runAt:void 0}:{runAt:new Date(a.runAt).toISOString(),cronExpr:void 0},promptTemplate:a.promptTemplate,description:a.description,enabled:a.enabled}}function fe(){const{t:a}=B(),[o,I]=n.useState([]),[m,T]=n.useState([]),[C,y]=n.useState(!0),[S,d]=n.useState(!1),[j,v]=n.useState(!1),[p,h]=n.useState(null),[s,r]=n.useState(x),E=n.useMemo(()=>m.map(e=>t.jsx("option",{value:e.id,children:e.name},e.id)),[m]),i=n.useCallback(async()=>{y(!0);try{const[e,l]=await Promise.all([Y(),ae()]);I(e.jobs||[]),T(l),r(g=>g.workspaceId||l.length===0?g:{...g,workspaceId:l[0].id})}finally{y(!1)}},[]);n.useEffect(()=>{i();const e=F(l=>{(l.type==="scheduler.job.updated"||l.type==="scheduler.run.updated")&&i()});return()=>e()},[i]);const J=()=>{var e;h(null),r({...x,workspaceId:((e=m[0])==null?void 0:e.id)||""}),d(!0)},N=e=>{h(e),r(se(e)),d(!0)},A=async()=>{if(!(!s.workspaceId||!s.promptTemplate.trim())&&!(s.triggerType==="once"&&!s.runAt)){v(!0);try{const e=re(s);p?await $(p.id,e):await Z(e),d(!1),h(null),r(x),await i()}finally{v(!1)}}},M=async e=>{confirm(a("common.confirmDelete"))&&(await ee(e),await i())},P=async e=>{await te(e),await i()};return C&&o.length===0?t.jsx("div",{className:"flex items-center justify-center h-64 text-gray-400 animate-pulse",children:a("common.loading")}):t.jsxs("div",{className:"space-y-4 animate-fade-in",children:[t.jsx(_,{title:a("cron.title"),description:"Create simple scheduled prompts for a workspace.",actions:t.jsxs(c,{onClick:J,children:[t.jsx(q,{size:16})," ",a("cron.add")]})}),o.length===0?t.jsx(K,{message:a("cron.noJobs"),icon:L}):t.jsx("div",{className:"space-y-3",children:o.map(e=>t.jsx(U,{children:t.jsxs("div",{className:"flex items-start justify-between gap-3",children:[t.jsxs("div",{className:"flex-1",children:[t.jsxs("div",{className:"flex items-center gap-2 mb-1 flex-wrap",children:[t.jsx("span",{className:"font-medium text-gray-900 dark:text-white text-sm",children:e.description||e.id}),t.jsx(u,{variant:e.enabled?"success":"default",children:e.enabled?a("cron.enabled"):"disabled"}),t.jsx(u,{variant:"default",children:e.triggerType}),t.jsx(u,{variant:"default",children:e.platform}),e.lastStatus&&t.jsx(u,{variant:e.lastStatus==="failed"?"danger":"default",children:e.lastStatus})]}),t.jsxs("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs text-gray-500 dark:text-gray-400 mt-2",children:[t.jsxs("span",{children:[t.jsx("strong",{children:"Workspace:"})," ",e.workspaceId]}),t.jsxs("span",{children:[t.jsx("strong",{children:"Execution:"})," ",e.executionMode]}),t.jsxs("span",{children:[t.jsx("strong",{children:"Route:"})," ",e.route.channelId," / ",e.route.participantId]}),t.jsxs("span",{children:[t.jsxs("strong",{children:[e.triggerType==="cron"?a("cron.expression"):"Run at",":"]})," ",e.triggerType==="cron"?e.cronExpr:k(e.runAt||"")]}),e.route.threadId&&t.jsxs("span",{children:[t.jsx("strong",{children:"Thread:"})," ",e.route.threadId]}),e.lastRunAt&&t.jsxs("span",{children:[t.jsxs("strong",{children:[a("cron.lastRun"),":"]})," ",k(e.lastRunAt)]})]}),t.jsx("p",{className:"text-sm text-gray-700 dark:text-gray-300 mt-2 whitespace-pre-wrap",children:e.promptTemplate}),e.lastError&&t.jsx("p",{className:"text-xs text-red-500 mt-2",children:e.lastError})]}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx(c,{size:"sm",variant:"secondary",onClick:()=>void P(e.id),children:t.jsx(Q,{size:14})}),t.jsx(c,{size:"sm",variant:"secondary",onClick:()=>N(e),children:t.jsx(V,{size:14})}),t.jsx(c,{size:"sm",variant:"danger",onClick:()=>void M(e.id),children:t.jsx(X,{size:14})})]})]})},e.id))}),t.jsx(G,{open:S,onClose:()=>d(!1),title:p?"Edit scheduler job":a("cron.add"),children:t.jsxs("div",{className:"space-y-3",children:[t.jsxs(w,{label:"Workspace",value:s.workspaceId,onChange:e=>r({...s,workspaceId:e.target.value}),children:[t.jsx("option",{value:"",children:"Select workspace"}),E]}),t.jsxs(w,{label:"Schedule type",value:s.triggerType,onChange:e=>r({...s,triggerType:e.target.value}),children:[t.jsx("option",{value:"cron",children:"Repeating"}),t.jsx("option",{value:"once",children:"One time"})]}),s.triggerType==="cron"?t.jsx(f,{label:a("cron.expression"),value:s.cronExpr,onChange:e=>r({...s,cronExpr:e.target.value}),placeholder:"0 9 * * *"}):t.jsx(f,{label:"Run at",type:"datetime-local",value:s.runAt,onChange:e=>r({...s,runAt:e.target.value})}),t.jsx(f,{label:a("cron.description"),value:s.description,onChange:e=>r({...s,description:e.target.value})}),t.jsx(H,{label:a("cron.prompt"),value:s.promptTemplate,onChange:e=>r({...s,promptTemplate:e.target.value}),rows:4,placeholder:"Summarize today's blockers and post a status update."}),t.jsxs("label",{className:"flex items-center gap-2 text-sm text-gray-700 dark:text-gray-300",children:[t.jsx("input",{type:"checkbox",checked:s.enabled,onChange:e=>r({...s,enabled:e.target.checked})}),a("cron.enabled")]}),t.jsxs("div",{className:"flex justify-end gap-2 pt-2",children:[t.jsx(c,{variant:"secondary",onClick:()=>d(!1),children:a("common.cancel")}),t.jsx(c,{onClick:()=>void A(),disabled:j,children:a(p?"common.save":"cron.add")})]})]})})]})}export{fe as default};
@@ -1 +0,0 @@
1
- import{u as p,r as t,au as v,j as e,L as j,B as d,C as y}from"./index-Bn8ane6_.js";import{B as N}from"./Badge-BRmQIqbd.js";import{S as m}from"./Select-BHQk6qCU.js";import{P as b}from"./Page-CpSczAz8.js";import{A as w}from"./arrow-left-Dtal-eOi.js";import{F as L}from"./funnel-CUQibo1I.js";import"./index-Ds0IN5rP.js";import"./check-DjfCdLvw.js";const C={debug:"text-gray-400",info:"text-blue-400",warn:"text-amber-400",error:"text-red-400"},S={debug:"default",info:"info",warn:"warning",error:"danger"};function H(){const{t:a}=p(),[i,x]=t.useState([]),[r,u]=t.useState("info"),[n,f]=t.useState("100"),[g,l]=t.useState(!0),o=t.useCallback(async()=>{l(!0);try{const s=await v({level:r,limit:n});x(s.entries||[])}finally{l(!1)}},[r,n]);return t.useEffect(()=>{o()},[o]),e.jsxs("div",{className:"space-y-4 animate-fade-in",children:[e.jsx(b,{title:a("system.logs"),description:"Filtered runtime logs for troubleshooting.",actions:e.jsx(j,{to:"/system",children:e.jsxs(d,{variant:"secondary",size:"sm",children:[e.jsx(w,{size:14})," ",a("nav.system")]})})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(L,{size:14,className:"text-muted-foreground"}),e.jsxs(m,{value:r,onChange:s=>u(s.target.value),className:"w-auto",children:[e.jsx("option",{value:"debug",children:"Debug"}),e.jsx("option",{value:"info",children:"Info"}),e.jsx("option",{value:"warn",children:"Warn"}),e.jsx("option",{value:"error",children:"Error"})]})]}),e.jsxs(m,{value:n,onChange:s=>f(s.target.value),className:"w-auto",children:[e.jsx("option",{value:"50",children:"50"}),e.jsx("option",{value:"100",children:"100"}),e.jsx("option",{value:"500",children:"500"}),e.jsx("option",{value:"1000",children:"1000"})]}),e.jsx(d,{size:"sm",variant:"secondary",onClick:o,children:a("common.refresh")})]}),e.jsx(y,{children:g?e.jsx("div",{className:"text-muted-foreground animate-pulse text-sm",children:"Loading..."}):i.length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-8",children:a("common.noData")}):e.jsx("div",{className:"space-y-1 max-h-[65vh] overflow-y-auto font-mono text-xs",children:i.map((s,h)=>{var c;return e.jsxs("div",{className:"flex items-start gap-3 py-1.5 border-b last:border-0",children:[e.jsx("span",{className:"text-muted-foreground shrink-0 w-36",children:(c=s.time)==null?void 0:c.slice(0,19)}),e.jsx(N,{variant:S[s.level]||"default",children:s.level}),e.jsx("span",{className:`${C[s.level]||"text-gray-500"} flex-1`,children:s.message})]},h)})})})]})}export{H as default};
@@ -1 +0,0 @@
1
- import{u as C,z,r as a,j as e,L as S,B as g,w as j,T as B}from"./index-Bn8ane6_.js";import{B as b}from"./Badge-BRmQIqbd.js";import{g as E,a as L}from"./sessions-C1yKps4T.js";import{C as _,A}from"./ChatMarkdown-DqW7OUvV.js";import{A as I}from"./arrow-left-Dtal-eOi.js";import{C as M}from"./circle-vfhmyE8v.js";import{W as y,R}from"./wifi-off-VMUokMpE.js";import{B as T,U}from"./user-r_2sHG7m.js";import"./check-DjfCdLvw.js";function G(){var p;const{t:r}=C(),{project:i,id:l}=z(),[s,v]=a.useState(null),[d,m]=a.useState(""),[c,x]=a.useState(!1),[w,u]=a.useState(!0),f=a.useRef(null),o=a.useCallback(async()=>{if(!(!i||!l))try{u(!0);const t=await E(i,l,200);v(t)}finally{u(!1)}},[i,l]);a.useEffect(()=>{o()},[o]),a.useEffect(()=>{var t;(t=f.current)==null||t.scrollIntoView({behavior:"smooth"})},[s==null?void 0:s.history]);const h=async()=>{if(!d.trim()||!i||!s)return;const t=d.trim();m(""),x(!0);try{await L(i,{session_key:s.session_key,message:t}),setTimeout(o,1500)}finally{x(!1)}},N=t=>{t.key==="Enter"&&!t.shiftKey&&(t.preventDefault(),h())};return w&&!s?e.jsx("div",{className:"flex items-center justify-center h-64 text-muted-foreground animate-pulse",children:"Loading..."}):e.jsxs("div",{className:"flex flex-col h-[calc(100vh-8rem)] animate-fade-in",children:[e.jsxs("div",{className:"flex items-center justify-between pb-4 border-b",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(S,{to:"/sessions",className:"p-2 rounded-md hover:bg-accent/10 transition-colors",children:e.jsx(I,{size:18,className:"text-muted-foreground"})}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"text-lg font-semibold text-foreground",children:(s==null?void 0:s.name)||l}),s!=null&&s.live?e.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-primary bg-primary/10 px-1.5 py-0.5 rounded-full",children:[e.jsx(M,{size:5,className:"fill-current"})," live"]}):e.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-muted-foreground bg-muted px-1.5 py-0.5 rounded-full",children:[e.jsx(y,{size:9})," ",r("sessions.offline")]})]}),e.jsxs("div",{className:"flex items-center gap-2 mt-0.5",children:[e.jsx(b,{children:i}),(s==null?void 0:s.platform)&&e.jsx(b,{variant:"info",children:s.platform}),e.jsx("span",{className:"text-xs text-muted-foreground",children:s==null?void 0:s.session_key})]})]})]}),e.jsxs(g,{size:"sm",variant:"ghost",onClick:o,children:[e.jsx(R,{size:14})," ",r("common.refresh")]})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto py-6 space-y-5",children:[(!(s!=null&&s.history)||s.history.length===0)&&e.jsx("p",{className:"text-center text-sm text-muted-foreground py-12",children:r("sessions.noMessages")}),(p=s==null?void 0:s.history)==null?void 0:p.map((t,k)=>{const n=t.role==="user";return e.jsxs("div",{className:j("flex gap-3",n?"justify-end":"justify-start"),children:[!n&&e.jsx("div",{className:"w-8 h-8 rounded-md bg-primary/10 flex items-center justify-center shrink-0 mt-1",children:e.jsx(T,{size:16,className:"text-primary"})}),e.jsx("div",{className:j("rounded-lg px-5 py-3.5 text-sm",n?"max-w-[70%] bg-primary text-primary-foreground rounded-br-md":"max-w-[85%] bg-card border text-card-foreground rounded-bl-md shadow-sm"),children:e.jsx(_,{content:t.content,isUser:n})}),n&&e.jsx("div",{className:"w-8 h-8 rounded-md bg-muted flex items-center justify-center shrink-0 mt-1",children:e.jsx(U,{size:16,className:"text-muted-foreground"})})]},k)}),e.jsx("div",{ref:f})]}),e.jsx("div",{className:"border-t pt-4",children:s!=null&&s.live?e.jsxs("div",{className:"relative",children:[e.jsx(B,{value:d,onChange:t=>m(t.target.value),onKeyDown:N,placeholder:r("sessions.messageInput"),rows:2,className:"min-h-[88px] rounded-[24px] border-gray-200 bg-white px-4 pb-14 pt-3 text-[15px] leading-6 shadow-[0_12px_34px_rgba(15,23,42,0.08)] dark:border-white/[0.08] dark:bg-[rgba(0,0,0,0.42)] sm:min-h-[96px] sm:px-5 sm:pt-4",disabled:c}),e.jsx(g,{onClick:h,disabled:c||!d.trim(),size:"icon","aria-label":r("sessions.messageInput"),className:"absolute bottom-3 right-3 h-10 w-10 rounded-full bg-slate-900 px-0 text-white shadow-none hover:bg-slate-800 disabled:bg-slate-300 disabled:text-white disabled:opacity-100 dark:bg-slate-100 dark:text-slate-950 dark:hover:bg-white dark:disabled:bg-white/20 dark:disabled:text-white/55 sm:h-11 sm:w-11",children:c?e.jsxs("svg",{className:"animate-spin h-4 w-4",viewBox:"0 0 24 24",children:[e.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4",fill:"none"}),e.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]}):e.jsx(A,{size:20,strokeWidth:2.2})})]}):e.jsxs("div",{className:"flex items-center gap-2 px-4 py-3 text-sm text-muted-foreground bg-muted rounded-lg",children:[e.jsx(y,{size:14}),e.jsx("span",{children:r("sessions.notLiveHint")})]})})]})}export{G as default};
@@ -1 +0,0 @@
1
- import{u as N,r as n,j as s,M as x,L as v,C as y}from"./index-Bn8ane6_.js";import{B as f}from"./Badge-BRmQIqbd.js";import{S as w}from"./Select-BHQk6qCU.js";import{E as _}from"./EmptyState-w5-I9zg7.js";import{l as S}from"./projects-DTDS9SnT.js";import{l as C}from"./sessions-C1yKps4T.js";import{F as L}from"./funnel-CUQibo1I.js";import{C as M}from"./circle-vfhmyE8v.js";import{U as E,B as $}from"./user-r_2sHG7m.js";import"./index-Ds0IN5rP.js";import"./check-DjfCdLvw.js";function k(a,o){if(!a)return"";const m=Date.now()-new Date(a).getTime(),i=Math.floor(m/6e4);if(i<1)return o("sessions.justNow");if(i<60)return`${i}m`;const l=Math.floor(i/60);return l<24?`${l}h`:`${Math.floor(l/24)}d`}function q(){const{t:a}=N(),[o,m]=n.useState([]),[i,l]=n.useState([]),[c,j]=n.useState(""),[h,p]=n.useState(!0),d=n.useCallback(async()=>{p(!0);try{const{projects:e}=await S();l(e||[]);const t=await Promise.all((e||[]).map(async r=>{try{const{sessions:g}=await C(r.name);return{project:r.name,sessions:g||[]}}catch{return{project:r.name,sessions:[]}}}));m(t)}finally{p(!1)}},[]);n.useEffect(()=>{d();const e=()=>d();return window.addEventListener("cc:refresh",e),()=>window.removeEventListener("cc:refresh",e)},[d]);const u=n.useMemo(()=>(c?o.filter(t=>t.project===c):o).flatMap(t=>t.sessions.map(r=>({...r,_project:t.project}))).sort((t,r)=>(r.updated_at||r.created_at||"").localeCompare(t.updated_at||t.created_at||"")),[o,c]);return h&&o.length===0?s.jsx("div",{className:"flex items-center justify-center h-64 text-muted-foreground animate-pulse",children:"Loading..."}):s.jsxs("div",{className:"space-y-4 animate-fade-in",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx(L,{size:16,className:"text-muted-foreground"}),s.jsxs(w,{value:c,onChange:e=>j(e.target.value),className:"w-auto min-w-48",children:[s.jsx("option",{value:"",children:a("sessions.allProjects")}),i.map(e=>s.jsx("option",{value:e.name,children:e.name},e.name))]}),s.jsxs("span",{className:"text-xs text-muted-foreground",children:[u.length," ",a("nav.sessions").toLowerCase()]})]}),u.length===0?s.jsx(_,{message:a("sessions.noSessions"),icon:x}):s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 gap-3",children:u.map(e=>s.jsx(v,{to:`/sessions/${encodeURIComponent(e._project)}/${encodeURIComponent(e.id)}`,children:s.jsxs(y,{hover:!0,className:"group relative h-full p-4",children:[s.jsxs("div",{className:"flex items-start justify-between gap-2 mb-2",children:[s.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[s.jsx(x,{size:14,className:e.live?"text-primary shrink-0":"text-muted-foreground shrink-0"}),s.jsx("span",{className:"text-sm font-medium text-foreground truncate",children:e.name||e.user_name||e.id.slice(0,8)}),e.live&&s.jsx(M,{size:5,className:"fill-primary text-primary shrink-0"})]}),s.jsx("span",{className:"text-[10px] text-muted-foreground shrink-0 mt-0.5",children:k(e.updated_at||e.created_at,a)})]}),s.jsx("div",{className:"mb-2.5 min-h-[2.5rem]",children:e.last_message?s.jsxs("p",{className:"text-xs text-muted-foreground line-clamp-2 leading-relaxed",children:[e.last_message.role==="user"?s.jsx(E,{size:10,className:"inline mr-1 -mt-0.5 opacity-60"}):s.jsx($,{size:10,className:"inline mr-1 -mt-0.5 opacity-60"}),e.last_message.content.replace(/\n/g," ").slice(0,100)]}):s.jsx("p",{className:"text-xs text-muted-foreground italic",children:a("sessions.noMessages")})}),s.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[s.jsx(f,{children:e._project}),e.platform&&s.jsx(f,{variant:"info",children:e.platform}),s.jsxs("span",{className:"text-[10px] text-muted-foreground ml-auto",children:[e.history_count," msgs"]})]})]})},`${e._project}-${e.id}`))})]})}export{q as default};
@@ -1,14 +0,0 @@
1
- import{c as rt,x as j,t as st,r as A,j as n,B as I,I as T,S as nt}from"./index-Bn8ane6_.js";import{M as Oe}from"./Modal-Ceu_MP2e.js";import{S as ae}from"./Select-BHQk6qCU.js";import{E as he}from"./EmptyState-w5-I9zg7.js";import{P as at,S as Te,a as ot}from"./Page-CpSczAz8.js";import{c as it,d as Le,e as lt,f as ct}from"./desktop-BPIxWbkM.js";import{D as me,c as $e,g as fe,d as dt,e as ut}from"./desktop-DZHC4PDB.js";import{T as ge}from"./trash-2-CW1heMCf.js";import{P as ee}from"./plus-afkK9_Y8.js";import{S as ze}from"./save-B-cKgWcy.js";import"./index-Ds0IN5rP.js";import"./check-DjfCdLvw.js";/**
2
- * @license lucide-react v0.487.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const ht=[["rect",{width:"5",height:"5",x:"3",y:"3",rx:"1",key:"1tu5fj"}],["rect",{width:"5",height:"5",x:"16",y:"3",rx:"1",key:"1v8r4q"}],["rect",{width:"5",height:"5",x:"3",y:"16",rx:"1",key:"1x03jg"}],["path",{d:"M21 16h-3a2 2 0 0 0-2 2v3",key:"177gqh"}],["path",{d:"M21 21v.01",key:"ents32"}],["path",{d:"M12 7v3a2 2 0 0 1-2 2H7",key:"8crl2c"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M12 3h.01",key:"n36tog"}],["path",{d:"M12 16v.01",key:"133mhm"}],["path",{d:"M16 12h1",key:"1slzba"}],["path",{d:"M21 12v.01",key:"1lwtk9"}],["path",{d:"M12 21v-1",key:"1880an"}]],mt=rt("qr-code",ht);var ft=Object.defineProperty,ie=Object.getOwnPropertySymbols,He=Object.prototype.hasOwnProperty,Ye=Object.prototype.propertyIsEnumerable,Fe=(c,d,o)=>d in c?ft(c,d,{enumerable:!0,configurable:!0,writable:!0,value:o}):c[d]=o,xe=(c,d)=>{for(var o in d||(d={}))He.call(d,o)&&Fe(c,o,d[o]);if(ie)for(var o of ie(d))Ye.call(d,o)&&Fe(c,o,d[o]);return c},ve=(c,d)=>{var o={};for(var h in c)He.call(c,h)&&d.indexOf(h)<0&&(o[h]=c[h]);if(c!=null&&ie)for(var h of ie(c))d.indexOf(h)<0&&Ye.call(c,h)&&(o[h]=c[h]);return o};/**
7
- * @license QR Code generator library (TypeScript)
8
- * Copyright (c) Project Nayuki.
9
- * SPDX-License-Identifier: MIT
10
- */var W;(c=>{const d=class C{constructor(e,r,t,a){if(this.version=e,this.errorCorrectionLevel=r,this.modules=[],this.isFunction=[],e<C.MIN_VERSION||e>C.MAX_VERSION)throw new RangeError("Version value out of range");if(a<-1||a>7)throw new RangeError("Mask value out of range");this.size=e*4+17;let l=[];for(let m=0;m<this.size;m++)l.push(!1);for(let m=0;m<this.size;m++)this.modules.push(l.slice()),this.isFunction.push(l.slice());this.drawFunctionPatterns();const u=this.addEccAndInterleave(t);if(this.drawCodewords(u),a==-1){let m=1e9;for(let g=0;g<8;g++){this.applyMask(g),this.drawFormatBits(g);const p=this.getPenaltyScore();p<m&&(a=g,m=p),this.applyMask(g)}}x(0<=a&&a<=7),this.mask=a,this.applyMask(a),this.drawFormatBits(a),this.isFunction=[]}static encodeText(e,r){const t=c.QrSegment.makeSegments(e);return C.encodeSegments(t,r)}static encodeBinary(e,r){const t=c.QrSegment.makeBytes(e);return C.encodeSegments([t],r)}static encodeSegments(e,r,t=1,a=40,l=-1,u=!0){if(!(C.MIN_VERSION<=t&&t<=a&&a<=C.MAX_VERSION)||l<-1||l>7)throw new RangeError("Invalid value");let m,g;for(m=t;;m++){const w=C.getNumDataCodewords(m,r)*8,N=M.getTotalBits(e,m);if(N<=w){g=N;break}if(m>=a)throw new RangeError("Data too long")}for(const w of[C.Ecc.MEDIUM,C.Ecc.QUARTILE,C.Ecc.HIGH])u&&g<=C.getNumDataCodewords(m,w)*8&&(r=w);let p=[];for(const w of e){o(w.mode.modeBits,4,p),o(w.numChars,w.mode.numCharCountBits(m),p);for(const N of w.getData())p.push(N)}x(p.length==g);const R=C.getNumDataCodewords(m,r)*8;x(p.length<=R),o(0,Math.min(4,R-p.length),p),o(0,(8-p.length%8)%8,p),x(p.length%8==0);for(let w=236;p.length<R;w^=253)o(w,8,p);let k=[];for(;k.length*8<p.length;)k.push(0);return p.forEach((w,N)=>k[N>>>3]|=w<<7-(N&7)),new C(m,r,k,l)}getModule(e,r){return 0<=e&&e<this.size&&0<=r&&r<this.size&&this.modules[r][e]}getModules(){return this.modules}drawFunctionPatterns(){for(let t=0;t<this.size;t++)this.setFunctionModule(6,t,t%2==0),this.setFunctionModule(t,6,t%2==0);this.drawFinderPattern(3,3),this.drawFinderPattern(this.size-4,3),this.drawFinderPattern(3,this.size-4);const e=this.getAlignmentPatternPositions(),r=e.length;for(let t=0;t<r;t++)for(let a=0;a<r;a++)t==0&&a==0||t==0&&a==r-1||t==r-1&&a==0||this.drawAlignmentPattern(e[t],e[a]);this.drawFormatBits(0),this.drawVersion()}drawFormatBits(e){const r=this.errorCorrectionLevel.formatBits<<3|e;let t=r;for(let l=0;l<10;l++)t=t<<1^(t>>>9)*1335;const a=(r<<10|t)^21522;x(a>>>15==0);for(let l=0;l<=5;l++)this.setFunctionModule(8,l,h(a,l));this.setFunctionModule(8,7,h(a,6)),this.setFunctionModule(8,8,h(a,7)),this.setFunctionModule(7,8,h(a,8));for(let l=9;l<15;l++)this.setFunctionModule(14-l,8,h(a,l));for(let l=0;l<8;l++)this.setFunctionModule(this.size-1-l,8,h(a,l));for(let l=8;l<15;l++)this.setFunctionModule(8,this.size-15+l,h(a,l));this.setFunctionModule(8,this.size-8,!0)}drawVersion(){if(this.version<7)return;let e=this.version;for(let t=0;t<12;t++)e=e<<1^(e>>>11)*7973;const r=this.version<<12|e;x(r>>>18==0);for(let t=0;t<18;t++){const a=h(r,t),l=this.size-11+t%3,u=Math.floor(t/3);this.setFunctionModule(l,u,a),this.setFunctionModule(u,l,a)}}drawFinderPattern(e,r){for(let t=-4;t<=4;t++)for(let a=-4;a<=4;a++){const l=Math.max(Math.abs(a),Math.abs(t)),u=e+a,m=r+t;0<=u&&u<this.size&&0<=m&&m<this.size&&this.setFunctionModule(u,m,l!=2&&l!=4)}}drawAlignmentPattern(e,r){for(let t=-2;t<=2;t++)for(let a=-2;a<=2;a++)this.setFunctionModule(e+a,r+t,Math.max(Math.abs(a),Math.abs(t))!=1)}setFunctionModule(e,r,t){this.modules[r][e]=t,this.isFunction[r][e]=!0}addEccAndInterleave(e){const r=this.version,t=this.errorCorrectionLevel;if(e.length!=C.getNumDataCodewords(r,t))throw new RangeError("Invalid argument");const a=C.NUM_ERROR_CORRECTION_BLOCKS[t.ordinal][r],l=C.ECC_CODEWORDS_PER_BLOCK[t.ordinal][r],u=Math.floor(C.getNumRawDataModules(r)/8),m=a-u%a,g=Math.floor(u/a);let p=[];const R=C.reedSolomonComputeDivisor(l);for(let w=0,N=0;w<a;w++){let _=e.slice(N,N+g-l+(w<m?0:1));N+=_.length;const $=C.reedSolomonComputeRemainder(_,R);w<m&&_.push(0),p.push(_.concat($))}let k=[];for(let w=0;w<p[0].length;w++)p.forEach((N,_)=>{(w!=g-l||_>=m)&&k.push(N[w])});return x(k.length==u),k}drawCodewords(e){if(e.length!=Math.floor(C.getNumRawDataModules(this.version)/8))throw new RangeError("Invalid argument");let r=0;for(let t=this.size-1;t>=1;t-=2){t==6&&(t=5);for(let a=0;a<this.size;a++)for(let l=0;l<2;l++){const u=t-l,g=(t+1&2)==0?this.size-1-a:a;!this.isFunction[g][u]&&r<e.length*8&&(this.modules[g][u]=h(e[r>>>3],7-(r&7)),r++)}}x(r==e.length*8)}applyMask(e){if(e<0||e>7)throw new RangeError("Mask value out of range");for(let r=0;r<this.size;r++)for(let t=0;t<this.size;t++){let a;switch(e){case 0:a=(t+r)%2==0;break;case 1:a=r%2==0;break;case 2:a=t%3==0;break;case 3:a=(t+r)%3==0;break;case 4:a=(Math.floor(t/3)+Math.floor(r/2))%2==0;break;case 5:a=t*r%2+t*r%3==0;break;case 6:a=(t*r%2+t*r%3)%2==0;break;case 7:a=((t+r)%2+t*r%3)%2==0;break;default:throw new Error("Unreachable")}!this.isFunction[r][t]&&a&&(this.modules[r][t]=!this.modules[r][t])}}getPenaltyScore(){let e=0;for(let l=0;l<this.size;l++){let u=!1,m=0,g=[0,0,0,0,0,0,0];for(let p=0;p<this.size;p++)this.modules[l][p]==u?(m++,m==5?e+=C.PENALTY_N1:m>5&&e++):(this.finderPenaltyAddHistory(m,g),u||(e+=this.finderPenaltyCountPatterns(g)*C.PENALTY_N3),u=this.modules[l][p],m=1);e+=this.finderPenaltyTerminateAndCount(u,m,g)*C.PENALTY_N3}for(let l=0;l<this.size;l++){let u=!1,m=0,g=[0,0,0,0,0,0,0];for(let p=0;p<this.size;p++)this.modules[p][l]==u?(m++,m==5?e+=C.PENALTY_N1:m>5&&e++):(this.finderPenaltyAddHistory(m,g),u||(e+=this.finderPenaltyCountPatterns(g)*C.PENALTY_N3),u=this.modules[p][l],m=1);e+=this.finderPenaltyTerminateAndCount(u,m,g)*C.PENALTY_N3}for(let l=0;l<this.size-1;l++)for(let u=0;u<this.size-1;u++){const m=this.modules[l][u];m==this.modules[l][u+1]&&m==this.modules[l+1][u]&&m==this.modules[l+1][u+1]&&(e+=C.PENALTY_N2)}let r=0;for(const l of this.modules)r=l.reduce((u,m)=>u+(m?1:0),r);const t=this.size*this.size,a=Math.ceil(Math.abs(r*20-t*10)/t)-1;return x(0<=a&&a<=9),e+=a*C.PENALTY_N4,x(0<=e&&e<=2568888),e}getAlignmentPatternPositions(){if(this.version==1)return[];{const e=Math.floor(this.version/7)+2,r=this.version==32?26:Math.ceil((this.version*4+4)/(e*2-2))*2;let t=[6];for(let a=this.size-7;t.length<e;a-=r)t.splice(1,0,a);return t}}static getNumRawDataModules(e){if(e<C.MIN_VERSION||e>C.MAX_VERSION)throw new RangeError("Version number out of range");let r=(16*e+128)*e+64;if(e>=2){const t=Math.floor(e/7)+2;r-=(25*t-10)*t-55,e>=7&&(r-=36)}return x(208<=r&&r<=29648),r}static getNumDataCodewords(e,r){return Math.floor(C.getNumRawDataModules(e)/8)-C.ECC_CODEWORDS_PER_BLOCK[r.ordinal][e]*C.NUM_ERROR_CORRECTION_BLOCKS[r.ordinal][e]}static reedSolomonComputeDivisor(e){if(e<1||e>255)throw new RangeError("Degree out of range");let r=[];for(let a=0;a<e-1;a++)r.push(0);r.push(1);let t=1;for(let a=0;a<e;a++){for(let l=0;l<r.length;l++)r[l]=C.reedSolomonMultiply(r[l],t),l+1<r.length&&(r[l]^=r[l+1]);t=C.reedSolomonMultiply(t,2)}return r}static reedSolomonComputeRemainder(e,r){let t=r.map(a=>0);for(const a of e){const l=a^t.shift();t.push(0),r.forEach((u,m)=>t[m]^=C.reedSolomonMultiply(u,l))}return t}static reedSolomonMultiply(e,r){if(e>>>8||r>>>8)throw new RangeError("Byte out of range");let t=0;for(let a=7;a>=0;a--)t=t<<1^(t>>>7)*285,t^=(r>>>a&1)*e;return x(t>>>8==0),t}finderPenaltyCountPatterns(e){const r=e[1];x(r<=this.size*3);const t=r>0&&e[2]==r&&e[3]==r*3&&e[4]==r&&e[5]==r;return(t&&e[0]>=r*4&&e[6]>=r?1:0)+(t&&e[6]>=r*4&&e[0]>=r?1:0)}finderPenaltyTerminateAndCount(e,r,t){return e&&(this.finderPenaltyAddHistory(r,t),r=0),r+=this.size,this.finderPenaltyAddHistory(r,t),this.finderPenaltyCountPatterns(t)}finderPenaltyAddHistory(e,r){r[0]==0&&(e+=this.size),r.pop(),r.unshift(e)}};d.MIN_VERSION=1,d.MAX_VERSION=40,d.PENALTY_N1=3,d.PENALTY_N2=3,d.PENALTY_N3=40,d.PENALTY_N4=10,d.ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],d.NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],c.QrCode=d;function o(E,e,r){if(e<0||e>31||E>>>e)throw new RangeError("Value out of range");for(let t=e-1;t>=0;t--)r.push(E>>>t&1)}function h(E,e){return(E>>>e&1)!=0}function x(E){if(!E)throw new Error("Assertion error")}const v=class P{constructor(e,r,t){if(this.mode=e,this.numChars=r,this.bitData=t,r<0)throw new RangeError("Invalid argument");this.bitData=t.slice()}static makeBytes(e){let r=[];for(const t of e)o(t,8,r);return new P(P.Mode.BYTE,e.length,r)}static makeNumeric(e){if(!P.isNumeric(e))throw new RangeError("String contains non-numeric characters");let r=[];for(let t=0;t<e.length;){const a=Math.min(e.length-t,3);o(parseInt(e.substring(t,t+a),10),a*3+1,r),t+=a}return new P(P.Mode.NUMERIC,e.length,r)}static makeAlphanumeric(e){if(!P.isAlphanumeric(e))throw new RangeError("String contains unencodable characters in alphanumeric mode");let r=[],t;for(t=0;t+2<=e.length;t+=2){let a=P.ALPHANUMERIC_CHARSET.indexOf(e.charAt(t))*45;a+=P.ALPHANUMERIC_CHARSET.indexOf(e.charAt(t+1)),o(a,11,r)}return t<e.length&&o(P.ALPHANUMERIC_CHARSET.indexOf(e.charAt(t)),6,r),new P(P.Mode.ALPHANUMERIC,e.length,r)}static makeSegments(e){return e==""?[]:P.isNumeric(e)?[P.makeNumeric(e)]:P.isAlphanumeric(e)?[P.makeAlphanumeric(e)]:[P.makeBytes(P.toUtf8ByteArray(e))]}static makeEci(e){let r=[];if(e<0)throw new RangeError("ECI assignment value out of range");if(e<128)o(e,8,r);else if(e<16384)o(2,2,r),o(e,14,r);else if(e<1e6)o(6,3,r),o(e,21,r);else throw new RangeError("ECI assignment value out of range");return new P(P.Mode.ECI,0,r)}static isNumeric(e){return P.NUMERIC_REGEX.test(e)}static isAlphanumeric(e){return P.ALPHANUMERIC_REGEX.test(e)}getData(){return this.bitData.slice()}static getTotalBits(e,r){let t=0;for(const a of e){const l=a.mode.numCharCountBits(r);if(a.numChars>=1<<l)return 1/0;t+=4+l+a.bitData.length}return t}static toUtf8ByteArray(e){e=encodeURI(e);let r=[];for(let t=0;t<e.length;t++)e.charAt(t)!="%"?r.push(e.charCodeAt(t)):(r.push(parseInt(e.substring(t+1,t+3),16)),t+=2);return r}};v.NUMERIC_REGEX=/^[0-9]*$/,v.ALPHANUMERIC_REGEX=/^[A-Z0-9 $%*+.\/:-]*$/,v.ALPHANUMERIC_CHARSET="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:";let M=v;c.QrSegment=v})(W||(W={}));(c=>{(d=>{const o=class{constructor(x,v){this.ordinal=x,this.formatBits=v}};o.LOW=new o(0,1),o.MEDIUM=new o(1,0),o.QUARTILE=new o(2,3),o.HIGH=new o(3,2),d.Ecc=o})(c.QrCode||(c.QrCode={}))})(W||(W={}));(c=>{(d=>{const o=class{constructor(x,v){this.modeBits=x,this.numBitsCharCount=v}numCharCountBits(x){return this.numBitsCharCount[Math.floor((x+7)/17)]}};o.NUMERIC=new o(1,[10,12,14]),o.ALPHANUMERIC=new o(2,[9,11,13]),o.BYTE=new o(4,[8,16,16]),o.KANJI=new o(8,[8,10,12]),o.ECI=new o(7,[0,0,0]),d.Mode=o})(c.QrSegment||(c.QrSegment={}))})(W||(W={}));var K=W;/**
11
- * @license qrcode.react
12
- * Copyright (c) Paul O'Shannessy
13
- * SPDX-License-Identifier: ISC
14
- */var gt={L:K.QrCode.Ecc.LOW,M:K.QrCode.Ecc.MEDIUM,Q:K.QrCode.Ecc.QUARTILE,H:K.QrCode.Ecc.HIGH},Ge=128,We="L",Ve="#FFFFFF",Ke="#000000",Xe=!1,qe=1,pt=4,xt=0,vt=.1;function Je(c,d=0){const o=[];return c.forEach(function(h,x){let v=null;h.forEach(function(M,E){if(!M&&v!==null){o.push(`M${v+d} ${x+d}h${E-v}v1H${v+d}z`),v=null;return}if(E===h.length-1){if(!M)return;v===null?o.push(`M${E+d},${x+d} h1v1H${E+d}z`):o.push(`M${v+d},${x+d} h${E+1-v}v1H${v+d}z`);return}M&&v===null&&(v=E)})}),o.join("")}function Ze(c,d){return c.slice().map((o,h)=>h<d.y||h>=d.y+d.h?o:o.map((x,v)=>v<d.x||v>=d.x+d.w?x:!1))}function bt(c,d,o,h){if(h==null)return null;const x=c.length+o*2,v=Math.floor(d*vt),M=x/d,E=(h.width||v)*M,e=(h.height||v)*M,r=h.x==null?c.length/2-E/2:h.x*M,t=h.y==null?c.length/2-e/2:h.y*M,a=h.opacity==null?1:h.opacity;let l=null;if(h.excavate){let m=Math.floor(r),g=Math.floor(t),p=Math.ceil(E+r-m),R=Math.ceil(e+t-g);l={x:m,y:g,w:p,h:R}}const u=h.crossOrigin;return{x:r,y:t,h:e,w:E,excavation:l,opacity:a,crossOrigin:u}}function wt(c,d){return d!=null?Math.max(Math.floor(d),0):c?pt:xt}function et({value:c,level:d,minVersion:o,includeMargin:h,marginSize:x,imageSettings:v,size:M,boostLevel:E}){let e=j.useMemo(()=>{const m=(Array.isArray(c)?c:[c]).reduce((g,p)=>(g.push(...K.QrSegment.makeSegments(p)),g),[]);return K.QrCode.encodeSegments(m,gt[d],o,void 0,void 0,E)},[c,d,o,E]);const{cells:r,margin:t,numCells:a,calculatedImageSettings:l}=j.useMemo(()=>{let u=e.getModules();const m=wt(h,x),g=u.length+m*2,p=bt(u,M,m,v);return{cells:u,margin:m,numCells:g,calculatedImageSettings:p}},[e,M,v,h,x]);return{qrcode:e,margin:t,cells:r,numCells:a,calculatedImageSettings:l}}var yt=(function(){try{new Path2D().addPath(new Path2D)}catch{return!1}return!0})(),Ct=j.forwardRef(function(d,o){const h=d,{value:x,size:v=Ge,level:M=We,bgColor:E=Ve,fgColor:e=Ke,includeMargin:r=Xe,minVersion:t=qe,boostLevel:a,marginSize:l,imageSettings:u}=h,g=ve(h,["value","size","level","bgColor","fgColor","includeMargin","minVersion","boostLevel","marginSize","imageSettings"]),{style:p}=g,R=ve(g,["style"]),k=u==null?void 0:u.src,w=j.useRef(null),N=j.useRef(null),_=j.useCallback(L=>{w.current=L,typeof o=="function"?o(L):o&&(o.current=L)},[o]),[$,V]=j.useState(!1),{margin:S,cells:H,numCells:z,calculatedImageSettings:y}=et({value:x,level:M,minVersion:t,boostLevel:a,includeMargin:r,marginSize:l,imageSettings:u,size:v});j.useEffect(()=>{if(w.current!=null){const L=w.current,F=L.getContext("2d");if(!F)return;let Y=H;const G=N.current,se=y!=null&&G!==null&&G.complete&&G.naturalHeight!==0&&G.naturalWidth!==0;se&&y.excavation!=null&&(Y=Ze(H,y.excavation));const X=window.devicePixelRatio||1;L.height=L.width=v*X;const U=v/z*X;F.scale(U,U),F.fillStyle=E,F.fillRect(0,0,z,z),F.fillStyle=e,yt?F.fill(new Path2D(Je(Y,S))):H.forEach(function(le,ce){le.forEach(function(de,ue){de&&F.fillRect(ue+S,ce+S,1,1)})}),y&&(F.globalAlpha=y.opacity),se&&F.drawImage(G,y.x+S,y.y+S,y.w,y.h)}}),j.useEffect(()=>{V(!1)},[k]);const re=xe({height:v,width:v},p);let D=null;return k!=null&&(D=j.createElement("img",{src:k,key:k,style:{display:"none"},onLoad:()=>{V(!0)},ref:N,crossOrigin:y==null?void 0:y.crossOrigin})),j.createElement(j.Fragment,null,j.createElement("canvas",xe({style:re,height:v,width:v,ref:_,role:"img"},R)),D)});Ct.displayName="QRCodeCanvas";var tt=j.forwardRef(function(d,o){const h=d,{value:x,size:v=Ge,level:M=We,bgColor:E=Ve,fgColor:e=Ke,includeMargin:r=Xe,minVersion:t=qe,boostLevel:a,title:l,marginSize:u,imageSettings:m}=h,g=ve(h,["value","size","level","bgColor","fgColor","includeMargin","minVersion","boostLevel","title","marginSize","imageSettings"]),{margin:p,cells:R,numCells:k,calculatedImageSettings:w}=et({value:x,level:M,minVersion:t,boostLevel:a,includeMargin:r,marginSize:u,imageSettings:m,size:v});let N=R,_=null;m!=null&&w!=null&&(w.excavation!=null&&(N=Ze(R,w.excavation)),_=j.createElement("image",{href:m.src,height:w.h,width:w.w,x:w.x+p,y:w.y+p,preserveAspectRatio:"none",opacity:w.opacity,crossOrigin:w.crossOrigin}));const $=Je(N,p);return j.createElement("svg",xe({height:v,width:v,viewBox:`0 0 ${k} ${k}`,ref:o,role:"img"},g),!!l&&j.createElement("title",null,l),j.createElement("path",{fill:E,d:`M0,0 h${k}v${k}H0z`,shapeRendering:"crispEdges"}),j.createElement("path",{fill:e,d:$,shapeRendering:"crispEdges"}),_)});tt.displayName="QRCodeSVG";const Q="__custom__",pe=["weixin","lark"],be=[{id:"openai",label:"OpenAI",name:"openai",base_url:"https://api.openai.com/v1",model:"gpt-4.1-mini"},{id:"openrouter",label:"OpenRouter",name:"openrouter",base_url:"https://openrouter.ai/api/v1",model:"openai/gpt-4.1-mini"},{id:"anthropic",label:"Anthropic",name:"anthropic",base_url:"https://api.anthropic.com/v1",model:"claude-3-5-haiku-latest"},{id:"minimax",label:"Minimax",name:"minimax",base_url:"https://api.minimax.chat/v1",model:"MiniMax-M2.5"},{id:"ollama",label:"Ollama",name:"ollama",base_url:"http://127.0.0.1:11434/v1",model:"qwen2.5-coder:7b"}];function B(c){return JSON.parse(JSON.stringify(c))}function te(c){return Array.isArray(c.projects)||(c.projects=[]),c.projects}function Et(c){const d=new Set(c.map(h=>h.name).filter(Boolean));let o=c.length+1;for(;d.has(`project-${o}`);)o+=1;return{name:`project-${o}`,agentType:ut,workDir:"",model:""}}function oe(c){var d,o,h,x,v;return{...c,agent:{...c.agent,options:{...((d=c.agent)==null?void 0:d.options)||{},model:$e((o=c.agent)==null?void 0:o.type,String(((x=(h=c.agent)==null?void 0:h.options)==null?void 0:x.model)||""))},providers:((v=c.agent)==null?void 0:v.providers)||[]},platforms:c.platforms||[]}}function Be(c,d){return d.includes(c)?c:Q}function kt(c){var d;return((d=be.find(o=>c.name===o.name||o.base_url&&c.base_url===o.base_url||o.model&&c.model===o.model&&c.name===o.name))==null?void 0:d.id)||Q}function Nt(c,d){const o=be.find(h=>h.id===d);return o?{...c,name:o.name,base_url:o.base_url,model:o.model}:c}function Ue(c="weixin"){return{type:c,options:{}}}function Qe(c){const d=c.type==="feishu"?"lark":c.type,o=c.options&&typeof c.options=="object"?{...c.options}:{};return d==="weixin"?{type:d,options:{...o}}:d==="lark"?{type:d,options:{...o,app_id:String(o.app_id||"").trim(),app_secret:String(o.app_secret||"").trim(),card_actions:o.card_actions===!0}}:{type:d,options:o}}function Pt(c){var d;if(c.type==="weixin")return"WeChat QR login";if(c.type==="lark"){const o=String(((d=c.options)==null?void 0:d.app_id)||"").trim();return o?`App ID ${o}`:"App ID and secret required"}return"Custom platform"}function Mt(c){var h,x;const d=String(((x=(h=c.agent)==null?void 0:h.options)==null?void 0:x.work_dir)||"").trim();return d?d.replace(/\/+$/,"").split("/").filter(Boolean).pop()||d:"No work directory"}function jt(c){return c==="success"?"border-primary/20 bg-primary/10 text-primary dark:border-primary/25 dark:bg-primary/10 dark:text-blue-200":c==="warning"?"border-amber-200 bg-amber-50 text-amber-700 dark:border-amber-400/20 dark:bg-amber-500/10 dark:text-amber-200":"border-red-200 bg-red-50 text-red-700 dark:border-red-400/20 dark:bg-red-500/10 dark:text-red-200"}function $t(){var we,ye,Ce,Ee,ke,Ne,Pe,Me,je,Se,Ae,Re,Ie,_e,De;const[c,d]=st(),o=c.get("project")||"",[h,x]=A.useState(null),[v,M]=A.useState(null),[E,e]=A.useState(0),[r,t]=A.useState("basic"),[a,l]=A.useState(null),[u,m]=A.useState(null),[g,p]=A.useState(null),[R,k]=A.useState(!1),[w,N]=A.useState(!0),[_,$]=A.useState(""),[V,S]=A.useState(null),H=A.useCallback(async(s="")=>{N(!0);try{const i=await it(),f=B(i.parsed||{});if(f.projects=te(f).map(b=>oe(b)),x(f),M(B(f)),s){const b=(f.projects||[]).findIndex(O=>O.name===s);e(b>=0?b:0)}}catch(i){S({tone:"error",message:i instanceof Error?i.message:String(i)})}finally{N(!1)}},[]);A.useEffect(()=>{H(o)},[H]);const z=(h==null?void 0:h.projects)||[],y=z[E]||null,re=JSON.stringify(h||{})!==JSON.stringify(v||{});A.useEffect(()=>{if(!h||!o)return;const s=z.findIndex(i=>i.name===o);s>=0&&s!==E&&e(s)},[h,z,o,E]);const D=A.useCallback(s=>{x(i=>{if(!i)return i;const f=B(i),b=te(f),O=b[E];return O?(b[E]=oe(s(O)),f):i})},[E]),L=A.useCallback((s,i)=>{D(f=>{const b=[...f.agent.providers||[]],O=b[s];return O?(b[s]=i(O),{...f,agent:{...f.agent,providers:b}}):f})},[D]),F=()=>{l(Et(z))},Y=s=>{l(i=>i&&{...i,...s})},G=()=>{if(!a)return;const s=a.name.trim(),i=a.agentType.trim(),f=a.workDir.trim(),b=a.model.trim();if(!s||!i||!f){S({tone:"warning",message:"Project name, agent type, and work directory are required."});return}if(z.some(J=>J.name===s)){S({tone:"warning",message:`Project "${s}" already exists.`});return}const O=oe({name:s,agent:{type:i,options:{model:b||fe(i),work_dir:f},providers:[]},platforms:[],admin_from:"",disabled_commands:[]}),q=z.length;x(J=>{const Z=B(J||{});return te(Z).push(O),Z}),e(q),d({project:s}),l(null),S(null)},se=s=>{x(i=>{if(!i)return i;const f=B(i),b=te(f);return b.splice(s,1),e(Math.max(0,Math.min(s,b.length-1))),f})},X=s=>{var f;if(p(null),s===null){m({index:s,draft:Ue()});return}const i=(f=y==null?void 0:y.platforms)==null?void 0:f[s];i&&m({index:s,draft:B(i)})},U=s=>{m(i=>i&&{...i,draft:s(i.draft)})},le=()=>{if(!u)return;const s=Qe(u.draft);D(i=>{const f=[...i.platforms||[]];return u.index===null?f.push(s):f[u.index]=s,{...i,platforms:f}}),m(null),p(null)},ce=async()=>{if(!(!(y!=null&&y.name)||!h)){k(!0);try{if(u){const i=B(h),f=te(i),b=f[E];if(b){const O=[...b.platforms||[]],q=Qe(u.draft);u.index===null?O.push(q):O[u.index]=q,f[E]=oe({...b,platforms:O});const J=await Le(i),Z=B(J.parsed||i);M(Z),x(B(Z)),m(ne=>ne&&{index:ne.index??O.length-1,draft:q})}}const s=await lt(y.name);p({...s,status:"wait"}),S(null)}catch(s){S({tone:"error",message:s instanceof Error?s.message:String(s)})}finally{k(!1)}}},de=async()=>{if(!(!(y!=null&&y.name)||!(g!=null&&g.ticket))){k(!0);try{const s=await ct(y.name,g.ticket);p(i=>i&&{...i,status:s.status}),s.status==="confirmed"&&S({tone:"success",message:"WeChat QR code confirmed."})}catch(s){S({tone:"error",message:s instanceof Error?s.message:String(s)})}finally{k(!1)}}},ue=async()=>{if(h){$("config");try{const s=await Le(h);M(B(s.parsed||h)),x(B(s.parsed||h)),S({tone:"success",message:"Project changes saved."}),await H()}catch(s){S({tone:"error",message:s instanceof Error?s.message:String(s)})}finally{$("")}}};return w&&!h?n.jsx("div",{className:"flex h-64 items-center justify-center text-sm text-slate-400 animate-pulse",children:"Loading workspace..."}):n.jsxs("div",{className:"space-y-6 animate-fade-in",children:[n.jsx(at,{title:"工作区",description:"创建项目,配置 Agent、工作目录、Provider 和平台接入。"}),V?n.jsx("div",{role:"status",className:`rounded-xl border px-4 py-3 text-sm ${jt(V.tone)}`,children:V.message}):null,re?n.jsx("div",{className:"rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-700 dark:border-amber-400/20 dark:bg-amber-500/10 dark:text-amber-200",children:"You have unsaved project changes."}):null,n.jsxs("div",{className:"grid min-w-0 grid-cols-1 gap-4 lg:grid-cols-[340px_minmax(0,1fr)]",children:[n.jsx(Te,{title:"项目",actions:n.jsxs(I,{size:"sm",onClick:F,children:[n.jsx(ee,{size:14})," 新建项目"]}),className:"lg:self-start",children:z.length===0?n.jsx(he,{message:"还没有项目。"}):n.jsx("div",{className:"space-y-2",children:z.map((s,i)=>{var f,b;return n.jsxs("div",{className:`flex items-center justify-between gap-2 rounded-xl border px-3 py-2 transition-colors ${i===E?"border-accent/30 bg-accent/10":"border-black/10 hover:bg-black/[0.04] dark:border-white/[0.08] dark:hover:bg-white/[0.06]"}`,children:[n.jsxs("button",{type:"button",onClick:()=>{e(i),d(s.name?{project:s.name}:{})},className:"min-w-0 flex-1 text-left",children:[n.jsx("p",{className:"truncate text-sm font-medium text-slate-950 dark:text-white",children:s.name||`Project ${i+1}`}),n.jsxs("p",{className:"mt-0.5 truncate text-xs text-muted-foreground",children:[((f=s.agent)==null?void 0:f.type)||"unknown"," · ",Mt(s)," · ",((b=s.platforms)==null?void 0:b.length)||0," platforms"]})]}),n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>se(i),"aria-label":`Remove ${s.name}`,children:n.jsx(ge,{size:14})})]},`${s.name}-${i}`)})})}),n.jsx(Te,{title:(y==null?void 0:y.name)||"Project details",description:y?n.jsxs("span",{className:"break-all",children:[((we=y.agent)==null?void 0:we.type)||"unknown"," · ",String(((Ce=(ye=y.agent)==null?void 0:ye.options)==null?void 0:Ce.work_dir)||"No work directory")]}):void 0,children:y?n.jsxs("div",{className:"space-y-6",children:[n.jsx("div",{className:"flex gap-2 overflow-x-auto border-b border-black/10 pb-4 [scrollbar-width:none] dark:border-white/[0.08] [&::-webkit-scrollbar]:hidden sm:flex-wrap",children:[["basic","基本信息"],["providers","Provider"],["platforms","平台接入"]].map(([s,i])=>n.jsx("button",{type:"button",onClick:()=>t(s),className:`shrink-0 rounded-lg px-3 py-1.5 text-sm font-medium transition-colors ${r===s?"bg-accent text-white":"bg-black/[0.04] text-muted-foreground hover:bg-black/[0.07] hover:text-foreground dark:bg-white/[0.05] dark:hover:bg-white/[0.08]"}`,children:i},s))}),r==="basic"?n.jsxs("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2",children:[n.jsx(T,{label:"Project name",value:y.name,onChange:s=>D(i=>({...i,name:s.target.value}))}),n.jsxs(ae,{label:"Agent type",value:Be(((Ee=y.agent)==null?void 0:Ee.type)||"",me),onChange:s=>D(i=>{var b;const f=s.target.value===Q?i.agent.type:s.target.value;return{...i,agent:{...i.agent,type:f,options:{...i.agent.options||{},model:$e(f,String(((b=i.agent.options)==null?void 0:b.model)||""))}}}}),children:[me.map(s=>n.jsx("option",{value:s,children:s},s)),n.jsx("option",{value:Q,children:"custom"})]}),n.jsx(T,{label:"Work directory",value:String(((Ne=(ke=y.agent)==null?void 0:ke.options)==null?void 0:Ne.work_dir)||""),onChange:s=>D(i=>({...i,agent:{...i.agent,options:{...i.agent.options||{},work_dir:s.target.value}}}))}),n.jsx(T,{label:"Default model",value:String(((Me=(Pe=y.agent)==null?void 0:Pe.options)==null?void 0:Me.model)||""),onChange:s=>D(i=>({...i,agent:{...i.agent,options:{...i.agent.options||{},model:s.target.value}}})),placeholder:fe((je=y.agent)==null?void 0:je.type)||"Use agent default model"})]}):null,r==="providers"?n.jsxs("section",{className:"space-y-3",children:[n.jsxs("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[n.jsxs("div",{children:[n.jsx("h3",{className:"text-sm font-semibold text-slate-950 dark:text-white",children:"Providers"}),n.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:"Basic endpoint and default model only."})]}),n.jsxs(I,{size:"sm",variant:"secondary",onClick:()=>D(s=>({...s,agent:{...s.agent,providers:[...s.agent.providers||[],{name:`provider-${(s.agent.providers||[]).length+1}`}]}})),children:[n.jsx(ee,{size:14})," Provider"]})]}),(y.agent.providers||[]).length===0?n.jsxs("div",{className:"flex flex-col gap-3 rounded-xl border border-black/10 px-4 py-4 dark:border-white/[0.08] sm:flex-row sm:items-center sm:justify-between",children:[n.jsx("p",{className:"text-sm text-muted-foreground",children:"No providers configured."}),n.jsxs(I,{size:"sm",variant:"secondary",onClick:()=>D(s=>({...s,agent:{...s.agent,providers:[...s.agent.providers||[],{name:`provider-${(s.agent.providers||[]).length+1}`}]}})),children:[n.jsx(ee,{size:14})," Add provider"]})]}):n.jsx("div",{className:"space-y-3",children:(y.agent.providers||[]).map((s,i)=>n.jsx("div",{className:"rounded-xl border border-black/10 p-4 dark:border-white/[0.08]",children:n.jsxs("div",{className:"grid grid-cols-1 gap-3 md:grid-cols-2",children:[n.jsxs(ae,{label:"Preset",value:kt(s),onChange:f=>{f.target.value!==Q&&L(i,b=>Nt(b,f.target.value))},children:[be.map(f=>n.jsx("option",{value:f.id,children:f.label},f.id)),n.jsx("option",{value:Q,children:"custom"})]}),n.jsx(T,{label:"Name",value:s.name||"",onChange:f=>L(i,b=>({...b,name:f.target.value}))}),n.jsx(T,{label:"API key",type:"password",value:s.api_key||"",onChange:f=>L(i,b=>({...b,api_key:f.target.value}))}),n.jsx(T,{label:"Base URL",value:s.base_url||"",onChange:f=>L(i,b=>({...b,base_url:f.target.value}))}),n.jsx(T,{label:"Default model",value:s.model||"",onChange:f=>L(i,b=>({...b,model:f.target.value}))}),n.jsx("div",{className:"flex items-end",children:n.jsxs(I,{variant:"danger",size:"sm",onClick:()=>D(f=>{const b=[...f.agent.providers||[]];return b.splice(i,1),{...f,agent:{...f.agent,providers:b}}}),children:[n.jsx(ge,{size:14})," Remove"]})})]})},`${s.name}-${i}`))})]}):null,r==="platforms"?n.jsxs("section",{className:"space-y-3",children:[n.jsxs("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[n.jsxs("div",{children:[n.jsx("h3",{className:"text-sm font-semibold text-slate-950 dark:text-white",children:"Platforms"}),n.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:"Configure each platform with its own required connection fields."})]}),n.jsxs(I,{size:"sm",variant:"secondary",onClick:()=>X(null),children:[n.jsx(ee,{size:14})," Platform"]})]}),(y.platforms||[]).length===0?n.jsx(he,{message:"No platforms configured."}):n.jsx("div",{className:"grid grid-cols-1 gap-3 md:grid-cols-2",children:(y.platforms||[]).map((s,i)=>n.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-black/10 p-3 dark:border-white/[0.08]",children:[n.jsxs("div",{className:"min-w-0",children:[n.jsx("p",{className:"truncate text-sm font-medium text-slate-950 dark:text-white",children:s.type}),n.jsx("p",{className:"mt-1 truncate text-xs text-muted-foreground",children:Pt(s)})]}),n.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[n.jsx(I,{variant:"secondary",size:"sm",onClick:()=>X(i),"aria-label":`Configure ${s.type}`,children:n.jsx(nt,{size:14})}),n.jsx(I,{variant:"danger",size:"sm",onClick:()=>D(f=>{const b=[...f.platforms||[]];return b.splice(i,1),{...f,platforms:b}}),children:n.jsx(ge,{size:14})})]})]},`${s.type}-${i}`))})]}):null,n.jsx("div",{className:"flex flex-wrap gap-2 border-t border-black/10 pt-5 dark:border-white/[0.08]",children:n.jsxs(I,{className:"w-full sm:w-auto",onClick:()=>void ue(),loading:_==="config",disabled:!re&&_!=="config",children:[n.jsx(ze,{size:14})," 保存更改"]})})]}):n.jsx(he,{message:"选择或新建项目后开始配置。"})})]}),n.jsx(Oe,{open:!!a,onClose:()=>l(null),title:"新建项目",children:a?n.jsxs("div",{className:"space-y-4",children:[n.jsx(T,{label:"Project name",value:a.name,onChange:s=>Y({name:s.target.value}),autoFocus:!0}),n.jsx(ae,{label:"Agent type",value:a.agentType,onChange:s=>{const i=s.target.value;Y({agentType:i})},children:me.map(s=>n.jsx("option",{value:s,children:s},s))}),n.jsx(T,{label:"Work directory",value:a.workDir,onChange:s=>Y({workDir:s.target.value}),placeholder:"/Users/yinyin/code/my-project"}),n.jsx(T,{label:"Default model",value:a.model,onChange:s=>Y({model:s.target.value}),placeholder:fe(a.agentType)||"Use agent default model"}),n.jsxs("div",{className:"flex flex-col-reverse gap-2 pt-2 sm:flex-row sm:justify-end",children:[n.jsx(I,{className:"w-full sm:w-auto",variant:"secondary",onClick:()=>l(null),children:"Cancel"}),n.jsxs(I,{className:"w-full sm:w-auto",onClick:G,children:[n.jsx(ee,{size:14})," 新建项目"]})]})]}):null}),n.jsx(Oe,{open:!!u,onClose:()=>{m(null),p(null)},title:(u==null?void 0:u.index)===null?"Add platform":"Configure platform",children:u?n.jsxs("div",{className:"space-y-4",children:[n.jsxs(ae,{label:"Platform",value:Be(u.draft.type,[...pe]),onChange:s=>{const i=s.target.value===Q?u.draft.type:s.target.value;U(()=>Ue(i)),p(null)},children:[pe.map(s=>n.jsx("option",{value:s,children:s},s)),dt.filter(s=>!pe.includes(s)).map(s=>n.jsx("option",{value:s,children:s},s)),n.jsx("option",{value:Q,children:"custom"})]}),u.draft.type==="lark"?n.jsxs("div",{className:"grid grid-cols-1 gap-3",children:[n.jsx(T,{label:"App ID",value:String(((Se=u.draft.options)==null?void 0:Se.app_id)||""),onChange:s=>U(i=>({...i,options:{...i.options||{},app_id:s.target.value}})),placeholder:"cli_xxx"}),n.jsx(T,{label:"App Secret",type:"password",value:String(((Ae=u.draft.options)==null?void 0:Ae.app_secret)||""),onChange:s=>U(i=>({...i,options:{...i.options||{},app_secret:s.target.value}}))}),n.jsx(T,{label:"Verification token",value:String(((Re=u.draft.options)==null?void 0:Re.verification_token)||""),onChange:s=>U(i=>({...i,options:{...i.options||{},verification_token:s.target.value}}))}),n.jsx(T,{label:"Encrypt key",value:String(((Ie=u.draft.options)==null?void 0:Ie.encrypt_key)||""),onChange:s=>U(i=>({...i,options:{...i.options||{},encrypt_key:s.target.value}}))}),n.jsxs("label",{className:"flex items-center gap-3 text-sm text-foreground",children:[n.jsx("input",{type:"checkbox",checked:((_e=u.draft.options)==null?void 0:_e.auto_approve)===!0,onChange:s=>U(i=>({...i,options:{...i.options||{},auto_approve:s.target.checked}}))}),"Auto-approve Lark users"]}),n.jsxs("label",{className:"flex items-center gap-3 text-sm text-foreground",children:[n.jsx("input",{type:"checkbox",checked:((De=u.draft.options)==null?void 0:De.card_actions)===!0,onChange:s=>U(i=>({...i,options:{...i.options||{},card_actions:s.target.checked}}))}),"Enable Lark card action buttons"]})]}):null,u.draft.type==="weixin"?n.jsxs("div",{className:"space-y-3",children:[n.jsx("div",{className:"rounded-lg border border-black/10 bg-black/[0.03] px-3 py-3 text-sm text-muted-foreground dark:border-white/[0.08] dark:bg-white/[0.04]",children:"WeChat does not need an App ID or secret. Save this platform, then generate a QR code and scan it to finish login."}),g!=null&&g.qrCodeUrl?n.jsxs("div",{className:"flex flex-col items-center gap-3 rounded-lg border border-black/10 p-4 dark:border-white/[0.08]",children:[n.jsx("div",{className:"rounded-lg border border-black/10 bg-white p-3",children:n.jsx(tt,{value:g.qrCodeUrl,size:176,includeMargin:!0})}),n.jsx(ot,{tone:g.status==="confirmed"?"success":g.status==="expired"?"danger":"warning",children:g.status||"wait"})]}):null,n.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:flex-wrap",children:[n.jsxs(I,{className:"w-full sm:w-auto",variant:"secondary",onClick:()=>void ce(),loading:R,children:[n.jsx(mt,{size:14})," Generate QR"]}),n.jsx(I,{className:"w-full sm:w-auto",variant:"secondary",onClick:()=>void de(),loading:R,disabled:!(g!=null&&g.ticket),children:"Check status"})]})]}):null,u.draft.type!=="lark"&&u.draft.type!=="weixin"?n.jsx("div",{className:"rounded-lg border border-black/10 bg-black/[0.03] px-3 py-3 text-sm text-muted-foreground dark:border-white/[0.08] dark:bg-white/[0.04]",children:"This platform has no daily UI fields yet. Existing advanced options are preserved in config."}):null,n.jsxs("div",{className:"flex flex-col-reverse gap-2 border-t border-black/10 pt-4 dark:border-white/[0.08] sm:flex-row sm:justify-end",children:[n.jsx(I,{className:"w-full sm:w-auto",variant:"secondary",onClick:()=>m(null),children:"Cancel"}),n.jsxs(I,{className:"w-full sm:w-auto",onClick:le,children:[n.jsx(ze,{size:14})," Apply"]})]})]}):null})]})}export{$t as default};
@@ -1 +0,0 @@
1
- import{U as l,O as g,V as d,X as u,Y as c,_ as h,$ as C,a0 as w,a1 as k,a2 as v,a3 as S,a4 as m,a5 as P,a6 as y,a7 as L,a8 as b,a9 as f,aa as G,ab as R,ac as B,ad as A,ae as F,af as E,ag as I,ah as W,ai as D,aj as K,ak as T,al as x,m as i,i as U,am as Q,an as j,ao as z,ap as $,aq as _,ar as q,as as M,at as O,g as V}from"./index-Bn8ane6_.js";function t(){if(!window.desktop)throw new Error("Desktop APIs are unavailable in the browser build");return window.desktop}const X={getRuntimeStatus:()=>t().getRuntimeStatus(),startService:()=>t().startService(),stopService:()=>t().stopService(),restartService:()=>t().restartService(),getLogs:e=>t().getLogs(e),listInstalledAgentRuntimes:()=>w().then(e=>e.runtimes),refreshInstalledAgentRuntimes:()=>C().then(e=>e.runtimes),readConfigFile:()=>t().readConfigFile(),saveRawConfigFile:e=>t().saveRawConfigFile(e),saveStructuredConfigFile:e=>t().saveStructuredConfigFile(e),getThreadKnowledgeBases:(e,a)=>t().getThreadKnowledgeBases(e,a),updateThreadKnowledgeBases:(e,a,s)=>t().updateThreadKnowledgeBases(e,a,s),deleteThreadKnowledgeBases:(e,a)=>t().deleteThreadKnowledgeBases(e,a),saveSettings:e=>t().saveSettings(e),getCapabilitySnapshot:()=>h(),getPluginDiagnostics:()=>c(),listChannelGateways:e=>t().listChannelGateways(e),getChannelGatewayStatus:(e,a)=>t().getChannelGatewayStatus(e,a),testChannelConnection:(e,a)=>t().testChannelConnection(e,a),enableChannelGateway:(e,a)=>t().enableChannelGateway(e,a),disableChannelGateway:(e,a)=>t().disableChannelGateway(e,a),listChannelPendingPairings:(e,a)=>t().listChannelPendingPairings(e,a),approveChannelPairing:(e,a)=>t().approveChannelPairing(e,a),rejectChannelPairing:(e,a)=>t().rejectChannelPairing(e,a),listChannelAuthorizedUsers:(e,a)=>t().listChannelAuthorizedUsers(e,a),getWeixinQrCode:e=>u(e),checkWeixinQrCodeStatus:(e,a)=>d(e,a),listLarkGateways:()=>t().listLarkGateways(),getLarkGatewayStatus:e=>t().getLarkGatewayStatus(e),testLarkConnection:e=>t().testLarkConnection(e),enableLarkGateway:e=>t().enableLarkGateway(e),disableLarkGateway:e=>t().disableLarkGateway(e),listLarkPendingPairings:e=>t().listLarkPendingPairings(e),approveLarkPairing:e=>t().approveLarkPairing(e),rejectLarkPairing:e=>t().rejectLarkPairing(e),listLarkAuthorizedUsers:e=>t().listLarkAuthorizedUsers(e),probeWorkspaceStreaming:e=>t().probeWorkspaceStreaming(e),onRuntimeEvent:e=>t().onRuntimeEvent(e),onRuntimeDetectionEvent:e=>g(a=>{(a.type.startsWith("runtime.detect.")||a.type==="runtime.status.changed")&&e(a)}),onBridgeEvent:e=>l(e)},r={getRuntimeStatus:()=>O(),startService:()=>M(),stopService:()=>q(),restartService:()=>_(),getLogs:e=>$(e),listInstalledAgentRuntimes:()=>w().then(e=>e.runtimes),refreshInstalledAgentRuntimes:()=>C().then(e=>e.runtimes),readConfigFile:()=>z(),saveRawConfigFile:e=>j(e),saveStructuredConfigFile:e=>Q(e),getThreadKnowledgeBases:(e,a)=>U(a).then(s=>s.selectedKnowledgeBaseIds||[]),updateThreadKnowledgeBases:(e,a,s)=>i(a,s).then(p=>p.knowledgeBaseIds),deleteThreadKnowledgeBases:(e,a)=>i(a,[]).then(()=>({deleted:!0})),saveSettings:e=>x(e),getCapabilitySnapshot:()=>h(),getPluginDiagnostics:()=>c(),listChannelGateways:e=>T(e).then(a=>a.gateways),getChannelGatewayStatus:(e,a)=>K(e,a),testChannelConnection:(e,a)=>D(e,a),enableChannelGateway:(e,a)=>W(e,a),disableChannelGateway:(e,a)=>I(e,a),listChannelPendingPairings:(e,a)=>E(e,a).then(s=>s.pairings),approveChannelPairing:(e,a)=>F(e,a),rejectChannelPairing:(e,a)=>A(e,a),listChannelAuthorizedUsers:(e,a)=>B(e,a).then(s=>s.users),getWeixinQrCode:e=>u(e),checkWeixinQrCodeStatus:(e,a)=>d(e,a),listLarkGateways:()=>R().then(e=>e.gateways),getLarkGatewayStatus:e=>G(e),testLarkConnection:e=>f(e),enableLarkGateway:e=>b(e),disableLarkGateway:e=>L(e),listLarkPendingPairings:e=>y(e).then(a=>a.pairings),approveLarkPairing:e=>P(e),rejectLarkPairing:e=>m(e),listLarkAuthorizedUsers:e=>S(e).then(a=>a.users),probeWorkspaceStreaming:e=>v(e),onRuntimeEvent:e=>k(e),onRuntimeDetectionEvent:e=>g(a=>{(a.type.startsWith("runtime.detect.")||a.type==="runtime.status.changed")&&e(a)}),onBridgeEvent:e=>l(e)};let o=null;function Y(e){return e==="electron"&&window.desktop?X:r}function n(){const e=o||Y(V());if(!e)throw new Error("Managed desktop APIs are unavailable in this build");return o=e,e}const J=()=>n().getRuntimeStatus(),N=()=>n().startService(),Z=()=>n().listInstalledAgentRuntimes(),ee=()=>n().refreshInstalledAgentRuntimes(),ae=()=>n().readConfigFile(),te=e=>n().saveStructuredConfigFile(e),ne=(e,a,s)=>n().updateThreadKnowledgeBases(e,a,s),se=e=>n().saveSettings(e),ie=()=>n().getPluginDiagnostics(),re=e=>n().getWeixinQrCode(e),oe=(e,a)=>n().checkWeixinQrCodeStatus(e,a),le=e=>n().onRuntimeEvent(e),ge=e=>n().onRuntimeDetectionEvent(e),de=e=>n().onBridgeEvent(e);export{ge as a,de as b,ae as c,te as d,re as e,oe as f,J as g,ie as h,se as i,Z as l,le as o,ee as r,N as s,ne as u};
@@ -1,3 +0,0 @@
1
- const u="opencode",s="opencode/minimax-m2.5-free";const h=["opencode","codex","claudecode","cursor","gemini","qoder","iflow","localcore-acp"],_=["telegram","feishu","lark","discord","slack","dingtalk","wecom","weixin","qq","qqbot","line"],l=["opencode","codex","claudecode","acp","localcore-acp"],c="localcore-acp",d=["[Scheduler Tools]","If the user asks to create, view, edit, delete, or manually run a scheduled task for this conversation, use the Bash tool to run the local scheduler CLI.","Use these commands:",'lac scheduler add --cron "<5-field cron>" --message "<exact message to send>" --desc "<short label>" [--execution-mode same-thread|side-thread]',"lac scheduler list","lac scheduler list --thread","lac scheduler info <job-id>",'lac scheduler edit <job-id> [--cron "<5-field cron>"] [--message "<exact message>"] [--desc "<short label>"] [--enabled true|false] [--execution-mode same-thread|side-thread]',"lac scheduler del <job-id>","lac scheduler run <job-id>","Environment variables LOCAL_AI_WORKSPACE_ID, LOCAL_AI_THREAD_ID, LOCAL_AI_PLATFORM, LOCAL_AI_CHAT_ID, and LOCAL_AI_PLATFORM_USER_ID are already set when available.","Prefer relying on those variables instead of inventing your own route or creating session-only cron jobs.","By default, `lac scheduler list` shows all scheduled tasks in the current workspace. Use `lac scheduler list --thread` to show only the current conversation thread.","Use `--execution-mode same-thread` to reuse the current thread, or `--execution-mode side-thread` to run in a dedicated scheduled thread.","Only use the scheduler CLI when the user explicitly asks for scheduled automation.","[/Scheduler Tools]"].join(`
2
- `),i={allow:"allow",deny:"deny","allow all":"allow all",allowall:"allow all","perm:allow":"allow","perm:deny":"deny","perm:allow_all":"allow all"};function E(e,t=[]){return[d,...t.flatMap(o=>o?["",o]:[]),"","[User Message]",e,"[/User Message]"].join(`
3
- `)}function m(e){switch(String(e||"").trim().toLowerCase()){case"opencode":return s;case"claudecode":return"";default:return""}}function O(e,t){const o=String(e||"").trim().toLowerCase(),r=String(t||"").trim();return o?o==="opencode"?r||s:o==="claudecode"&&r.startsWith("opencode/")?"":r:r}function n(e){return e&&i[String(e).trim().toLowerCase()]||null}function f(e){return!!n(e==null?void 0:e.data)}function T(e){if(!e||typeof e!="object")return null;const t=e,o=typeof t.text=="string"?t.text:typeof t.Text=="string"?t.Text:"",r=typeof t.data=="string"?t.data:typeof t.Data=="string"?t.Data:"";if(!o||!r)return null;const a=n(r);return a?{text:a,data:a}:{text:o,data:r}}function A(e){return e?l.includes(String(e).trim().toLowerCase()):!1}function D(e){const t=String(e||"").trim().toLowerCase();return t==="acp"||t==="opencode"||t==="codex"||t==="claudecode"||t===c}export{h as D,n as a,D as b,O as c,_ as d,u as e,m as g,f as i,T as n,A as s,E as w};