@hachej/boring-ui-cli 0.1.78 → 0.1.80

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 (75) hide show
  1. package/README.md +14 -0
  2. package/dist/server/modeApps.js +2 -2
  3. package/dist/server/pluginDiscovery.js +4 -3
  4. package/package.json +9 -8
  5. package/public/assets/{DebugDrawer-DH80atiV.js → DebugDrawer-CmBNqdMZ.js} +1 -1
  6. package/public/assets/{DiagramPane-DAgdN3YX.js → DiagramPane-DExG3C_B.js} +5 -5
  7. package/public/assets/{abnfDiagram-VRR7QNED-DHFtXKha.js → abnfDiagram-VRR7QNED-BYIpnEWe.js} +1 -1
  8. package/public/assets/{architectureDiagram-ZJ3FMSHR-BqXoOqPc.js → architectureDiagram-ZJ3FMSHR-CuXk1ExT.js} +1 -1
  9. package/public/assets/{blockDiagram-677ZJIJ3-CwBNw3pP.js → blockDiagram-677ZJIJ3-BNuwFkOB.js} +1 -1
  10. package/public/assets/{c4Diagram-LMCZKHZV-DbzngMZS.js → c4Diagram-LMCZKHZV-vOd-i6oU.js} +1 -1
  11. package/public/assets/channel-UL65cgUu.js +1 -0
  12. package/public/assets/{chunk-32BRIVSS-CJKug8ts.js → chunk-32BRIVSS-D0LVvwRn.js} +1 -1
  13. package/public/assets/{chunk-C7G6YPKG-BFN4wniS.js → chunk-C7G6YPKG-WlrjvRPU.js} +1 -1
  14. package/public/assets/{chunk-EX3LRPZG-D_T6tXSz.js → chunk-EX3LRPZG-C1D9OQgx.js} +1 -1
  15. package/public/assets/{chunk-HOUHSVGY-OsF2bElz.js → chunk-HOUHSVGY-DsnMzn8e.js} +1 -1
  16. package/public/assets/{chunk-ICXQ74PX-E0PPsDNl.js → chunk-ICXQ74PX-CyAvh-Bu.js} +1 -1
  17. package/public/assets/{chunk-MOJQB5TN-CP_dQviu.js → chunk-MOJQB5TN-D8X4zTh2.js} +1 -1
  18. package/public/assets/{chunk-OGEWGWER-B_ShcHCB.js → chunk-OGEWGWER-BShclaB5.js} +1 -1
  19. package/public/assets/{chunk-PUDLZKDR-DCfWKUqx.js → chunk-PUDLZKDR-xAlZkx_V.js} +1 -1
  20. package/public/assets/{chunk-Q4XR5HBZ-DncequgQ.js → chunk-Q4XR5HBZ-DjBZZefu.js} +1 -1
  21. package/public/assets/{chunk-V7JOEXUC-CkWfMBya.js → chunk-V7JOEXUC-BjWM_jnD.js} +1 -1
  22. package/public/assets/{chunk-VR4S4FIN-Bwauz6ax.js → chunk-VR4S4FIN-0xFZ77et.js} +1 -1
  23. package/public/assets/{chunk-WYO6CB5R-BYQBPZdV.js → chunk-WYO6CB5R-B5B5hVg0.js} +2 -2
  24. package/public/assets/{chunk-ZGVPDNZ5-w40EBMAk.js → chunk-ZGVPDNZ5-ezDabbl-.js} +1 -1
  25. package/public/assets/classDiagram-OUVF2IWQ-DD8BZuSm.js +1 -0
  26. package/public/assets/classDiagram-v2-EOCWNBFH-DD8BZuSm.js +1 -0
  27. package/public/assets/{createLucideIcon-CwPc8Vzh.js → createLucideIcon-Wu4zuv2w.js} +1 -1
  28. package/public/assets/{cynefinDiagram-TSTJHNR4-MqlLfQLV.js → cynefinDiagram-TSTJHNR4-DirqPxaJ.js} +1 -1
  29. package/public/assets/{dagre-VKFMJZFB-BtMel0jZ.js → dagre-VKFMJZFB-CsWb9Wvi.js} +1 -1
  30. package/public/assets/{diagram-FQU43EPY-BLn2JOxM.js → diagram-FQU43EPY-CWXXPDyf.js} +1 -1
  31. package/public/assets/{diagram-G47NLZAW-CcU7cY2d.js → diagram-G47NLZAW-CR6Vw1qI.js} +1 -1
  32. package/public/assets/{diagram-NH7WQ7WH-DFv5wLuq.js → diagram-NH7WQ7WH-C7egv5PI.js} +1 -1
  33. package/public/assets/{diagram-OA4YK3LP-srdMEEtw.js → diagram-OA4YK3LP-BDjGAN6E.js} +1 -1
  34. package/public/assets/{diagram-WEI45ONY-CtD4L13_.js → diagram-WEI45ONY-ByWPeJ3n.js} +1 -1
  35. package/public/assets/{dist-DNd1zfJo.js → dist-CnC30ANf.js} +1 -1
  36. package/public/assets/{ebnfDiagram-CCIWWBDH-_-229G-a.js → ebnfDiagram-CCIWWBDH-DTE_Hi9u.js} +1 -1
  37. package/public/assets/{erDiagram-Q63AITRT-DJYYhyDf.js → erDiagram-Q63AITRT-B6RMjkqo.js} +1 -1
  38. package/public/assets/flowDiagram-23GEKE2U-CouB6ylb.js +1 -0
  39. package/public/assets/{ganttDiagram-NO4QXBWP-BDWjR2BL.js → ganttDiagram-NO4QXBWP-C7VOoWID.js} +1 -1
  40. package/public/assets/{gitGraphDiagram-IHSO6WYX-6VNHaoaE.js → gitGraphDiagram-IHSO6WYX-_Ujm6vip.js} +1 -1
  41. package/public/assets/{highlighted-body-OFNGDK62-ClTUT11e.js → highlighted-body-OFNGDK62-Cj3Ar0n3.js} +1 -1
  42. package/public/assets/index-BlhPFh_2.css +1 -0
  43. package/public/assets/index-Lpwxmb5G.js +871 -0
  44. package/public/assets/{infoDiagram-FWYZ7A6U-C8nPo8f6.js → infoDiagram-FWYZ7A6U-BNFhgDLP.js} +1 -1
  45. package/public/assets/{ishikawaDiagram-FXEZZL3T-DhhRWuLD.js → ishikawaDiagram-FXEZZL3T-VJcgTL8W.js} +1 -1
  46. package/public/assets/{journeyDiagram-5HDEW3XC-CTgKZqOm.js → journeyDiagram-5HDEW3XC-BlcNNU8v.js} +1 -1
  47. package/public/assets/{kanban-definition-HUTT4EX6-CoVQymWJ.js → kanban-definition-HUTT4EX6-DLdfqqIW.js} +1 -1
  48. package/public/assets/{line-DIJ2uGIx.js → line-CrRWgAHs.js} +1 -1
  49. package/public/assets/mermaid-GHXKKRXX-C4DsMfhs.js +1 -0
  50. package/public/assets/{mindmap-definition-LN4V7U3C-CnBQGuc8.js → mindmap-definition-LN4V7U3C-B3bwSTt2.js} +1 -1
  51. package/public/assets/{pegDiagram-2B236MQR-DS30M766.js → pegDiagram-2B236MQR-9LLuxSRX.js} +1 -1
  52. package/public/assets/{pieDiagram-ENE6RG2P-BiFYahi8.js → pieDiagram-ENE6RG2P-BgJCWQHt.js} +1 -1
  53. package/public/assets/{quadrantDiagram-ABIIQ3AL-7RXOQFPw.js → quadrantDiagram-ABIIQ3AL-CQYQ3GYO.js} +1 -1
  54. package/public/assets/{railroadDiagram-RFXS5EU6-BfYMSm1Y.js → railroadDiagram-RFXS5EU6-C0cBUvf6.js} +1 -1
  55. package/public/assets/{requirementDiagram-TGXJPOKE-BcPpT5PP.js → requirementDiagram-TGXJPOKE-C-oeLyY_.js} +1 -1
  56. package/public/assets/{sankeyDiagram-HTMAVEWB-BGYvXFPC.js → sankeyDiagram-HTMAVEWB-COo7g9T1.js} +1 -1
  57. package/public/assets/{sequenceDiagram-DBY2YBRQ-BQDw_5wi.js → sequenceDiagram-DBY2YBRQ-hsxNS03R.js} +1 -1
  58. package/public/assets/{stateDiagram-2N3HPSRC-tGXvsFbG.js → stateDiagram-2N3HPSRC-bIMnxqO8.js} +1 -1
  59. package/public/assets/stateDiagram-v2-6OUMAXLB-nx3bC5I9.js +1 -0
  60. package/public/assets/{swimlanes-5IMT3BWC-COzjOnAn.js → swimlanes-5IMT3BWC-D_RQIhid.js} +1 -1
  61. package/public/assets/swimlanesDiagram-G3AALYLV-CwYEB1yi.js +8 -0
  62. package/public/assets/{timeline-definition-FHXFAJF6-D3-XwGPp.js → timeline-definition-FHXFAJF6-C9JnE-9Z.js} +1 -1
  63. package/public/assets/{vennDiagram-L72KCM5P-eBsFqZoN.js → vennDiagram-L72KCM5P-Bs58CXI0.js} +1 -1
  64. package/public/assets/{wardleyDiagram-EHGQE667-CKvJIjcw.js → wardleyDiagram-EHGQE667-ngPnquAL.js} +1 -1
  65. package/public/assets/{xychartDiagram-FW5EYKEG-C49Uf4Nk.js → xychartDiagram-FW5EYKEG-oepIN_mI.js} +1 -1
  66. package/public/index.html +11 -11
  67. package/public/assets/channel-C6WZXm7Y.js +0 -1
  68. package/public/assets/classDiagram-OUVF2IWQ-D19WQ2fv.js +0 -1
  69. package/public/assets/classDiagram-v2-EOCWNBFH-D19WQ2fv.js +0 -1
  70. package/public/assets/flowDiagram-23GEKE2U-DVtDhScs.js +0 -1
  71. package/public/assets/index-B52MzomI.js +0 -871
  72. package/public/assets/index-DhfASYSW.css +0 -1
  73. package/public/assets/mermaid-GHXKKRXX-NeIk_INh.js +0 -1
  74. package/public/assets/stateDiagram-v2-6OUMAXLB-CYSK2pph.js +0 -1
  75. package/public/assets/swimlanesDiagram-G3AALYLV-2xI_2ZRC.js +0 -8
package/README.md CHANGED
@@ -39,6 +39,20 @@ configured it prints a guide: in another terminal run `pi` (or
39
39
  sign in to a subscription (Claude Pro/Max, ChatGPT Plus, Copilot). Credentials
40
40
  are saved at `~/.pi/agent/auth.json`; refresh the browser afterward.
41
41
 
42
+ ### Invoke scheduled automations
43
+
44
+ Folder mode exposes a loopback-only due-operation endpoint. It evaluates only
45
+ the current cron minute and never starts a background timer or daemon:
46
+
47
+ ```bash
48
+ curl --fail --silent --show-error -X POST \
49
+ http://127.0.0.1:5200/api/v1/boring-automation/due
50
+ ```
51
+
52
+ Configure that command in user-owned cron/systemd while `boring-ui` is already
53
+ running. Missed minutes are intentionally not backfilled. The endpoint is
54
+ unavailable in workspaces mode and hosted deployments.
55
+
42
56
  ---
43
57
 
44
58
  ## Commands
@@ -263,7 +263,7 @@ async function createFolderModeApp(opts) {
263
263
  const runtimeHost = await createPluginFrontRuntimeHost({
264
264
  onDiagnostic: (diagnostic) => diagnosticsStore.record(diagnostic)
265
265
  });
266
- const pluginDirs = pluginDiscovery.resolveCliBoringPluginDirs(workspaceRoot);
266
+ const pluginDirs = pluginDiscovery.resolveCliBoringPluginDirs(workspaceRoot, { includeFolderModeAutomation: true });
267
267
  const runtimeProvisioning = await provisionCliWorkspaceRuntime({
268
268
  workspaceRoot,
269
269
  mode: opts.mode,
@@ -283,7 +283,7 @@ async function createFolderModeApp(opts) {
283
283
  // CLI-bundled internal plugins, resolved to absolute package dirs. This
284
284
  // drives the server-side install array (boot-time routes/agentTools);
285
285
  // additionalBoringPluginDirs only feeds the asset-manager scan.
286
- defaultPluginPackages: pluginDiscovery.resolveCliDefaultPluginPackagePaths(),
286
+ defaultPluginPackages: pluginDiscovery.resolveCliDefaultPluginPackagePaths({ includeFolderModeAutomation: true }),
287
287
  additionalBoringPluginDirs: pluginDirs,
288
288
  workspaceBridge: { allowInsecureLocalCliBrowserAuth: opts.allowInsecureLocalBridgeAuth === true },
289
289
  boringPluginFrontTargetResolver: runtimeHost.createFrontTargetResolver(FOLDER_RUNTIME_PLUGIN_WORKSPACE_ID)
@@ -24,11 +24,12 @@ function getGlobalPiAgentRoot(options = {}) {
24
24
  return resolve(options.globalAgentRoot ?? dirname(getGlobalPiExtensionsRoot(options)));
25
25
  }
26
26
  const CLI_DEFAULT_PLUGIN_PACKAGES = ["@hachej/boring-ask-user", "@hachej/boring-diagram", "@hachej/boring-tasks"];
27
- function resolveCliDefaultPluginPackagePaths() {
27
+ const CLI_FOLDER_MODE_PLUGIN_PACKAGES = [...CLI_DEFAULT_PLUGIN_PACKAGES, "@hachej/boring-automation"];
28
+ function resolveCliDefaultPluginPackagePaths(options = {}) {
28
29
  try {
29
30
  return resolveDefaultWorkspacePluginPackagePaths({
30
31
  anchorDir: resolveBoringUiCliPackageRoot(),
31
- defaultPluginPackages: CLI_DEFAULT_PLUGIN_PACKAGES
32
+ defaultPluginPackages: options.includeFolderModeAutomation ? CLI_FOLDER_MODE_PLUGIN_PACKAGES : CLI_DEFAULT_PLUGIN_PACKAGES
32
33
  });
33
34
  } catch (error) {
34
35
  console.error("[boring-ui] failed to resolve default plugin packages:", error instanceof Error ? error.message : String(error));
@@ -46,7 +47,7 @@ function resolveCliBoringPluginDirs(workspaceRoot, options = {}) {
46
47
  ];
47
48
  const includeDefaultPackages = options.includeDefaultPackages ?? true;
48
49
  const roots = [
49
- ...includeDefaultPackages ? resolveCliDefaultPluginPackagePaths().map((rootDir) => ({ rootDir, kind: "internal" })) : [],
50
+ ...includeDefaultPackages ? resolveCliDefaultPluginPackagePaths({ includeFolderModeAutomation: options.includeFolderModeAutomation }).map((rootDir) => ({ rootDir, kind: "internal" })) : [],
50
51
  { rootDir: getGlobalPiExtensionsRoot(options), kind: "external" },
51
52
  { rootDir: globalScope.npmDir, kind: "external" },
52
53
  { rootDir: globalScope.gitDir, kind: "external" },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hachej/boring-ui-cli",
3
- "version": "0.1.78",
3
+ "version": "0.1.80",
4
4
  "description": "Turn an agent into an app",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -21,13 +21,14 @@
21
21
  "typescript": "^6.0.3",
22
22
  "vite": "^8.1.2",
23
23
  "yaml": "^2.9.0",
24
- "@hachej/boring-agent": "0.1.78",
25
- "@hachej/boring-diagram": "0.1.78",
26
- "@hachej/boring-ask-user": "0.1.78",
27
- "@hachej/boring-ui-kit": "0.1.78",
28
- "@hachej/boring-ui-plugin-cli": "0.1.78",
29
- "@hachej/boring-tasks": "0.1.78",
30
- "@hachej/boring-workspace": "0.1.78"
24
+ "@hachej/boring-agent": "0.1.80",
25
+ "@hachej/boring-ask-user": "0.1.80",
26
+ "@hachej/boring-tasks": "0.1.80",
27
+ "@hachej/boring-automation": "0.1.80",
28
+ "@hachej/boring-diagram": "0.1.80",
29
+ "@hachej/boring-ui-kit": "0.1.80",
30
+ "@hachej/boring-workspace": "0.1.80",
31
+ "@hachej/boring-ui-plugin-cli": "0.1.80"
31
32
  },
32
33
  "devDependencies": {
33
34
  "@tailwindcss/vite": "^4.3.1",
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-DAXXjFlN.js";import{n as t,t as n}from"./jsx-runtime-CBD9r_Rc.js";import{Ct as r,G as i,St as a,Tt as o,d as s,wt as c}from"./createLucideIcon-CwPc8Vzh.js";import{A as l,E as u,M as d,N as f,T as p,j as m,k as h}from"./index-B52MzomI.js";var g=e(t(),1),_=e(n(),1);function v({value:e,label:t}){let[n,r]=(0,g.useState)(!1);return(0,_.jsx)(i,{type:`button`,variant:`ghost`,size:`icon-xs`,onClick:(0,g.useCallback)(()=>{p(e).then(e=>{e&&(r(!0),window.setTimeout(()=>r(!1),1200))})},[e]),className:`text-muted-foreground/60`,"aria-label":t,title:t,children:n?(0,_.jsx)(f,{className:`h-3 w-3`}):(0,_.jsx)(l,{className:`h-3 w-3`})})}function y({label:e,value:t}){return(0,_.jsxs)(`div`,{className:`rounded-md border border-border/40 bg-muted/20 p-2`,children:[(0,_.jsxs)(`div`,{className:`mb-1 flex items-center justify-between gap-2`,children:[(0,_.jsx)(`span`,{className:`text-[10px] font-medium uppercase tracking-[0.16em] text-muted-foreground`,children:e}),(0,_.jsx)(v,{value:t,label:`Copy ${e}`})]}),(0,_.jsx)(`code`,{className:`block break-all font-mono text-[11px] leading-relaxed text-foreground dark:text-zinc-100`,children:t})]})}function b({sessionId:e}){return(0,_.jsxs)(`div`,{className:`flex flex-col gap-3 overflow-auto p-3 text-[11px] text-muted-foreground dark:text-zinc-300`,children:[(0,_.jsx)(`p`,{className:`text-muted-foreground dark:text-zinc-300`,children:`This web chat is backed by a runtime session. Use the id below for support or debugging.`}),(0,_.jsx)(y,{label:`Runtime session id`,value:e})]})}var x=2500,S=20;function C({apiBaseUrl:e,fetch:t,sessionId:n,requestHeaders:r,storageScope:a}){let[o,s]=(0,g.useState)({kind:`loading`}),[c,l]=(0,g.useState)(0),u=(0,g.useRef)(0),d=(0,g.useCallback)(()=>{u.current=0,l(e=>e+1)},[]);return(0,g.useEffect)(()=>{let i=!1,o=null;return s({kind:`loading`}),(t??globalThis.fetch.bind(globalThis))(j(e,`/api/v1/agent/sessions/${encodeURIComponent(n)}/system-prompt`),{headers:M(r,a)}).then(async e=>{if(i)return;if(e.ok){let t=await e.json();if(typeof t.systemPrompt==`string`){u.current=0,s({kind:`ok`,text:t.systemPrompt});return}}let t=(await e.json().catch(()=>null))?.error?.message??`HTTP ${e.status}`;e.status===404&&u.current<S?(s({kind:`empty`,reason:t}),o=setTimeout(()=>{i||(u.current++,l(e=>e+1))},x)):s(e.status===404?{kind:`empty`,reason:t}:{kind:`error`,reason:t})}).catch(e=>{i||s({kind:`error`,reason:e instanceof Error?e.message:String(e)})}),()=>{i=!0,o&&clearTimeout(o)}},[e,t,n,r,c,a]),(0,_.jsxs)(`div`,{className:`flex flex-col h-full min-h-0`,children:[(0,_.jsxs)(`div`,{className:`shrink-0 flex items-center justify-between px-3 pt-2 pb-1 border-b border-border/40`,children:[(0,_.jsx)(`span`,{className:`text-[10px] text-muted-foreground/80 font-mono`,children:o.kind===`ok`?`${o.text.length.toLocaleString()} chars`:o.kind===`loading`?`loading…`:o.kind===`empty`?`waiting for session · retry ${u.current}/${S}`:`error`}),o.kind!==`loading`&&(0,_.jsx)(i,{type:`button`,variant:`ghost`,size:`icon-xs`,onClick:d,className:`text-muted-foreground/60`,"aria-label":`Refresh system prompt`,children:(0,_.jsx)(h,{className:`h-3 w-3`})})]}),(o.kind===`loading`||o.kind===`empty`)&&(0,_.jsx)(`p`,{className:`text-[11px] text-muted-foreground p-3`,children:o.kind===`loading`?`Loading…`:o.reason}),o.kind===`error`&&(0,_.jsx)(`p`,{className:`text-[11px] text-destructive p-3`,children:o.reason}),o.kind===`ok`&&(0,_.jsx)(`pre`,{className:`flex-1 overflow-auto px-3 py-2 font-mono text-[11px] leading-relaxed text-foreground whitespace-pre-wrap break-words`,children:o.text})]})}function w(e){let t=e,n=t?.type??`?`;if(n===`text`){let e=String(t.text??``);return e.slice(0,80)+(e.length>80?`…`:``)}if(n===`tool-invocation`){let e=t.toolInvocation,n=String(e?.state??``);return`${e?.toolName??`?`}() · ${n}`}if(n===`reasoning`){let e=String(t.text??t.reasoning??``);return e.slice(0,80)+(e.length>80?`…`:``)}return n}function T(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n],i=r,a=i.createdAt?new Date(i.createdAt).toISOString().slice(11,23):null;for(let e=0;e<r.parts.length;e++){let i=r.parts[e];t.push({msgId:r.id,msgIndex:n,role:r.role,time:a,partIndex:e,partType:i?.type??`unknown`,part:i})}}return t}function E({messages:e}){let t=T(e),[n,r]=(0,g.useState)(null),i=(0,g.useRef)(null),a=(0,g.useRef)(t.length);return(0,g.useEffect)(()=>{t.length!==a.current&&(i.current?.scrollIntoView({behavior:`smooth`}),a.current=t.length)},[t.length]),t.length===0?(0,_.jsx)(`p`,{className:`text-[11px] text-muted-foreground p-3`,children:`No messages yet.`}):(0,_.jsxs)(`div`,{className:`flex flex-col h-full min-h-0`,children:[(0,_.jsxs)(`div`,{className:`shrink-0 px-3 pt-2 pb-1 text-[10px] text-muted-foreground/80 font-mono border-b border-border/40`,children:[e.length,` msg · `,t.length,` parts`]}),(0,_.jsxs)(`div`,{className:`flex-1 overflow-auto`,children:[t.map(e=>{let t=`${e.msgId}:${e.partIndex}`,i=n===t;return(0,_.jsxs)(`div`,{className:`border-b border-border/30 last:border-0`,children:[(0,_.jsxs)(s,{type:`button`,variant:`ghost`,onClick:()=>r(i?null:t),className:`h-auto w-full justify-start gap-1.5 rounded-none px-2 py-1.5 text-left`,children:[(0,_.jsx)(`span`,{className:`mt-0.5 shrink-0 text-muted-foreground/40`,children:i?(0,_.jsx)(d,{className:`h-3 w-3`}):(0,_.jsx)(m,{className:`h-3 w-3`})}),(0,_.jsx)(`span`,{className:`font-mono text-[10px] shrink-0 w-20`,children:e.time?(0,_.jsx)(`span`,{className:`text-muted-foreground/60`,children:e.time}):(0,_.jsxs)(`span`,{className:`text-muted-foreground/30`,children:[`m`,e.msgIndex]})}),(0,_.jsx)(`span`,{className:u(`shrink-0 font-mono text-[10px] w-14`,e.role===`user`?`text-accent`:`text-muted-foreground`),children:e.role}),(0,_.jsx)(`span`,{className:`shrink-0 font-mono text-[10px] text-muted-foreground/60 w-24`,children:e.partType}),(0,_.jsx)(`span`,{className:`flex-1 min-w-0 font-mono text-[11px] text-foreground truncate`,children:w(e.part)})]}),i&&(0,_.jsx)(`pre`,{className:`px-3 pb-2 font-mono text-[10px] leading-relaxed text-foreground/80 whitespace-pre-wrap break-words bg-muted/20`,children:JSON.stringify(e.part,null,2)})]},t)}),(0,_.jsx)(`div`,{ref:i})]})]})}var D=[{id:`session`,label:`Session`},{id:`prompt`,label:`System prompt`},{id:`messages`,label:`Messages`}],O=280,k=800;function A({apiBaseUrl:e,fetch:t,sessionId:n,messages:i,requestHeaders:s,storageScope:l,width:d,onWidthChange:f}){let[p,m]=(0,g.useState)(`session`);return(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(`div`,{onMouseDown:(0,g.useCallback)(e=>{e.preventDefault();let t=e.clientX,n=d,r=e=>{let r=t-e.clientX;f(Math.min(k,Math.max(O,n+r)))},i=()=>{window.removeEventListener(`mousemove`,r),window.removeEventListener(`mouseup`,i)};window.addEventListener(`mousemove`,r),window.addEventListener(`mouseup`,i)},[d,f]),className:`w-1 shrink-0 cursor-col-resize hover:bg-accent/40 active:bg-accent/60 transition-colors`,"aria-hidden":!0}),(0,_.jsx)(`aside`,{style:{width:d},className:u(`flex h-full shrink-0 flex-col border-l border-border/60`,`bg-[oklch(from_var(--background)_calc(l-0.01)_c_h)]`),children:(0,_.jsxs)(a,{value:p,onValueChange:e=>m(e),className:`flex flex-col flex-1 min-h-0 overflow-hidden`,children:[(0,_.jsx)(`header`,{className:`flex shrink-0 items-center gap-0 border-b border-border/60 px-1`,children:(0,_.jsx)(c,{variant:`line`,className:`h-auto gap-0 p-0 w-full`,children:D.map(({id:e,label:t})=>(0,_.jsx)(o,{value:e,className:`h-8 flex-none px-3 py-2 text-[11px] font-medium data-[state=active]:after:bg-[color:var(--accent)]`,children:t},e))})}),(0,_.jsx)(r,{value:`session`,forceMount:!0,className:`flex flex-col flex-1 min-h-0 overflow-hidden data-[state=inactive]:hidden`,children:(0,_.jsx)(b,{sessionId:n})}),(0,_.jsx)(r,{value:`prompt`,forceMount:!0,className:`flex flex-col flex-1 min-h-0 overflow-hidden data-[state=inactive]:hidden`,children:(0,_.jsx)(C,{apiBaseUrl:e,fetch:t,sessionId:n,requestHeaders:s,storageScope:l})}),(0,_.jsx)(r,{value:`messages`,forceMount:!0,className:`flex flex-col flex-1 min-h-0 overflow-hidden data-[state=inactive]:hidden`,children:(0,_.jsx)(E,{messages:i})})]})})]})}function j(e,t){return`${e?.replace(/\/$/,``)??``}${t}`}function M(e,t){if(!e&&!t)return;let n={...e??{}},r=Object.keys(n).some(e=>e.toLowerCase()===`x-boring-storage-scope`);return t&&!r&&(n[`x-boring-storage-scope`]=t),n}export{A as DebugDrawer};
1
+ import{o as e}from"./rolldown-runtime-DAXXjFlN.js";import{n as t,t as n}from"./jsx-runtime-CBD9r_Rc.js";import{Ct as r,G as i,St as a,Tt as o,d as s,wt as c}from"./createLucideIcon-Wu4zuv2w.js";import{A as l,E as u,M as d,N as f,T as p,j as m,k as h}from"./index-Lpwxmb5G.js";var g=e(t(),1),_=e(n(),1);function v({value:e,label:t}){let[n,r]=(0,g.useState)(!1);return(0,_.jsx)(i,{type:`button`,variant:`ghost`,size:`icon-xs`,onClick:(0,g.useCallback)(()=>{p(e).then(e=>{e&&(r(!0),window.setTimeout(()=>r(!1),1200))})},[e]),className:`text-muted-foreground/60`,"aria-label":t,title:t,children:n?(0,_.jsx)(f,{className:`h-3 w-3`}):(0,_.jsx)(l,{className:`h-3 w-3`})})}function y({label:e,value:t}){return(0,_.jsxs)(`div`,{className:`rounded-md border border-border/40 bg-muted/20 p-2`,children:[(0,_.jsxs)(`div`,{className:`mb-1 flex items-center justify-between gap-2`,children:[(0,_.jsx)(`span`,{className:`text-[10px] font-medium uppercase tracking-[0.16em] text-muted-foreground`,children:e}),(0,_.jsx)(v,{value:t,label:`Copy ${e}`})]}),(0,_.jsx)(`code`,{className:`block break-all font-mono text-[11px] leading-relaxed text-foreground dark:text-zinc-100`,children:t})]})}function b({sessionId:e}){return(0,_.jsxs)(`div`,{className:`flex flex-col gap-3 overflow-auto p-3 text-[11px] text-muted-foreground dark:text-zinc-300`,children:[(0,_.jsx)(`p`,{className:`text-muted-foreground dark:text-zinc-300`,children:`This web chat is backed by a runtime session. Use the id below for support or debugging.`}),(0,_.jsx)(y,{label:`Runtime session id`,value:e})]})}var x=2500,S=20;function C({apiBaseUrl:e,fetch:t,sessionId:n,requestHeaders:r,storageScope:a}){let[o,s]=(0,g.useState)({kind:`loading`}),[c,l]=(0,g.useState)(0),u=(0,g.useRef)(0),d=(0,g.useCallback)(()=>{u.current=0,l(e=>e+1)},[]);return(0,g.useEffect)(()=>{let i=!1,o=null;return s({kind:`loading`}),(t??globalThis.fetch.bind(globalThis))(j(e,`/api/v1/agent/sessions/${encodeURIComponent(n)}/system-prompt`),{headers:M(r,a)}).then(async e=>{if(i)return;if(e.ok){let t=await e.json();if(typeof t.systemPrompt==`string`){u.current=0,s({kind:`ok`,text:t.systemPrompt});return}}let t=(await e.json().catch(()=>null))?.error?.message??`HTTP ${e.status}`;e.status===404&&u.current<S?(s({kind:`empty`,reason:t}),o=setTimeout(()=>{i||(u.current++,l(e=>e+1))},x)):s(e.status===404?{kind:`empty`,reason:t}:{kind:`error`,reason:t})}).catch(e=>{i||s({kind:`error`,reason:e instanceof Error?e.message:String(e)})}),()=>{i=!0,o&&clearTimeout(o)}},[e,t,n,r,c,a]),(0,_.jsxs)(`div`,{className:`flex flex-col h-full min-h-0`,children:[(0,_.jsxs)(`div`,{className:`shrink-0 flex items-center justify-between px-3 pt-2 pb-1 border-b border-border/40`,children:[(0,_.jsx)(`span`,{className:`text-[10px] text-muted-foreground/80 font-mono`,children:o.kind===`ok`?`${o.text.length.toLocaleString()} chars`:o.kind===`loading`?`loading…`:o.kind===`empty`?`waiting for session · retry ${u.current}/${S}`:`error`}),o.kind!==`loading`&&(0,_.jsx)(i,{type:`button`,variant:`ghost`,size:`icon-xs`,onClick:d,className:`text-muted-foreground/60`,"aria-label":`Refresh system prompt`,children:(0,_.jsx)(h,{className:`h-3 w-3`})})]}),(o.kind===`loading`||o.kind===`empty`)&&(0,_.jsx)(`p`,{className:`text-[11px] text-muted-foreground p-3`,children:o.kind===`loading`?`Loading…`:o.reason}),o.kind===`error`&&(0,_.jsx)(`p`,{className:`text-[11px] text-destructive p-3`,children:o.reason}),o.kind===`ok`&&(0,_.jsx)(`pre`,{className:`flex-1 overflow-auto px-3 py-2 font-mono text-[11px] leading-relaxed text-foreground whitespace-pre-wrap break-words`,children:o.text})]})}function w(e){let t=e,n=t?.type??`?`;if(n===`text`){let e=String(t.text??``);return e.slice(0,80)+(e.length>80?`…`:``)}if(n===`tool-invocation`){let e=t.toolInvocation,n=String(e?.state??``);return`${e?.toolName??`?`}() · ${n}`}if(n===`reasoning`){let e=String(t.text??t.reasoning??``);return e.slice(0,80)+(e.length>80?`…`:``)}return n}function T(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n],i=r,a=i.createdAt?new Date(i.createdAt).toISOString().slice(11,23):null;for(let e=0;e<r.parts.length;e++){let i=r.parts[e];t.push({msgId:r.id,msgIndex:n,role:r.role,time:a,partIndex:e,partType:i?.type??`unknown`,part:i})}}return t}function E({messages:e}){let t=T(e),[n,r]=(0,g.useState)(null),i=(0,g.useRef)(null),a=(0,g.useRef)(t.length);return(0,g.useEffect)(()=>{t.length!==a.current&&(i.current?.scrollIntoView({behavior:`smooth`}),a.current=t.length)},[t.length]),t.length===0?(0,_.jsx)(`p`,{className:`text-[11px] text-muted-foreground p-3`,children:`No messages yet.`}):(0,_.jsxs)(`div`,{className:`flex flex-col h-full min-h-0`,children:[(0,_.jsxs)(`div`,{className:`shrink-0 px-3 pt-2 pb-1 text-[10px] text-muted-foreground/80 font-mono border-b border-border/40`,children:[e.length,` msg · `,t.length,` parts`]}),(0,_.jsxs)(`div`,{className:`flex-1 overflow-auto`,children:[t.map(e=>{let t=`${e.msgId}:${e.partIndex}`,i=n===t;return(0,_.jsxs)(`div`,{className:`border-b border-border/30 last:border-0`,children:[(0,_.jsxs)(s,{type:`button`,variant:`ghost`,onClick:()=>r(i?null:t),className:`h-auto w-full justify-start gap-1.5 rounded-none px-2 py-1.5 text-left`,children:[(0,_.jsx)(`span`,{className:`mt-0.5 shrink-0 text-muted-foreground/40`,children:i?(0,_.jsx)(d,{className:`h-3 w-3`}):(0,_.jsx)(m,{className:`h-3 w-3`})}),(0,_.jsx)(`span`,{className:`font-mono text-[10px] shrink-0 w-20`,children:e.time?(0,_.jsx)(`span`,{className:`text-muted-foreground/60`,children:e.time}):(0,_.jsxs)(`span`,{className:`text-muted-foreground/30`,children:[`m`,e.msgIndex]})}),(0,_.jsx)(`span`,{className:u(`shrink-0 font-mono text-[10px] w-14`,e.role===`user`?`text-accent`:`text-muted-foreground`),children:e.role}),(0,_.jsx)(`span`,{className:`shrink-0 font-mono text-[10px] text-muted-foreground/60 w-24`,children:e.partType}),(0,_.jsx)(`span`,{className:`flex-1 min-w-0 font-mono text-[11px] text-foreground truncate`,children:w(e.part)})]}),i&&(0,_.jsx)(`pre`,{className:`px-3 pb-2 font-mono text-[10px] leading-relaxed text-foreground/80 whitespace-pre-wrap break-words bg-muted/20`,children:JSON.stringify(e.part,null,2)})]},t)}),(0,_.jsx)(`div`,{ref:i})]})]})}var D=[{id:`session`,label:`Session`},{id:`prompt`,label:`System prompt`},{id:`messages`,label:`Messages`}],O=280,k=800;function A({apiBaseUrl:e,fetch:t,sessionId:n,messages:i,requestHeaders:s,storageScope:l,width:d,onWidthChange:f}){let[p,m]=(0,g.useState)(`session`);return(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(`div`,{onMouseDown:(0,g.useCallback)(e=>{e.preventDefault();let t=e.clientX,n=d,r=e=>{let r=t-e.clientX;f(Math.min(k,Math.max(O,n+r)))},i=()=>{window.removeEventListener(`mousemove`,r),window.removeEventListener(`mouseup`,i)};window.addEventListener(`mousemove`,r),window.addEventListener(`mouseup`,i)},[d,f]),className:`w-1 shrink-0 cursor-col-resize hover:bg-accent/40 active:bg-accent/60 transition-colors`,"aria-hidden":!0}),(0,_.jsx)(`aside`,{style:{width:d},className:u(`flex h-full shrink-0 flex-col border-l border-border/60`,`bg-[oklch(from_var(--background)_calc(l-0.01)_c_h)]`),children:(0,_.jsxs)(a,{value:p,onValueChange:e=>m(e),className:`flex flex-col flex-1 min-h-0 overflow-hidden`,children:[(0,_.jsx)(`header`,{className:`flex shrink-0 items-center gap-0 border-b border-border/60 px-1`,children:(0,_.jsx)(c,{variant:`line`,className:`h-auto gap-0 p-0 w-full`,children:D.map(({id:e,label:t})=>(0,_.jsx)(o,{value:e,className:`h-8 flex-none px-3 py-2 text-[11px] font-medium data-[state=active]:after:bg-[color:var(--accent)]`,children:t},e))})}),(0,_.jsx)(r,{value:`session`,forceMount:!0,className:`flex flex-col flex-1 min-h-0 overflow-hidden data-[state=inactive]:hidden`,children:(0,_.jsx)(b,{sessionId:n})}),(0,_.jsx)(r,{value:`prompt`,forceMount:!0,className:`flex flex-col flex-1 min-h-0 overflow-hidden data-[state=inactive]:hidden`,children:(0,_.jsx)(C,{apiBaseUrl:e,fetch:t,sessionId:n,requestHeaders:s,storageScope:l})}),(0,_.jsx)(r,{value:`messages`,forceMount:!0,className:`flex flex-col flex-1 min-h-0 overflow-hidden data-[state=inactive]:hidden`,children:(0,_.jsx)(E,{messages:i})})]})})]})}function j(e,t){return`${e?.replace(/\/$/,``)??``}${t}`}function M(e,t){if(!e&&!t)return;let n={...e??{}},r=Object.keys(n).some(e=>e.toLowerCase()===`x-boring-storage-scope`);return t&&!r&&(n[`x-boring-storage-scope`]=t),n}export{A as DebugDrawer};