@fusionkit/cli 0.1.4 → 0.1.6

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 (74) hide show
  1. package/README.md +26 -4
  2. package/dist/cli.d.ts +1 -0
  3. package/dist/cli.js +4 -17
  4. package/dist/commands/ensemble-gateway.js +0 -2
  5. package/dist/commands/ensemble-records.d.ts +2 -1
  6. package/dist/commands/ensemble-records.js +3 -1
  7. package/dist/commands/ensemble.js +3 -4
  8. package/dist/commands/fusion.js +14 -15
  9. package/dist/commands/local.js +3 -3
  10. package/dist/cursor-acp.d.ts +18 -0
  11. package/dist/cursor-acp.js +206 -0
  12. package/dist/dashboard.d.ts +65 -0
  13. package/dist/dashboard.js +587 -0
  14. package/dist/fusion/env.d.ts +108 -0
  15. package/dist/fusion/env.js +98 -0
  16. package/dist/fusion/observability.d.ts +39 -0
  17. package/dist/fusion/observability.js +227 -0
  18. package/dist/fusion/preflight.d.ts +12 -0
  19. package/dist/fusion/preflight.js +42 -0
  20. package/dist/fusion/stack.d.ts +62 -0
  21. package/dist/fusion/stack.js +295 -0
  22. package/dist/fusion-config.d.ts +0 -1
  23. package/dist/fusion-config.js +0 -6
  24. package/dist/fusion-init.js +2 -11
  25. package/dist/fusion-quickstart.d.ts +11 -222
  26. package/dist/fusion-quickstart.js +57 -759
  27. package/dist/gateway.d.ts +0 -2
  28. package/dist/gateway.js +12 -2
  29. package/dist/local.d.ts +10 -17
  30. package/dist/local.js +50 -116
  31. package/dist/shared/options.d.ts +2 -1
  32. package/dist/shared/options.js +13 -19
  33. package/dist/shared/proc.d.ts +4 -70
  34. package/dist/shared/proc.js +3 -228
  35. package/dist/test/cli.test.js +32 -142
  36. package/dist/test/dashboard.test.d.ts +1 -0
  37. package/dist/test/dashboard.test.js +214 -0
  38. package/dist/test/gateway-e2e.test.js +13 -10
  39. package/dist/test/local.test.js +4 -4
  40. package/dist/tools.d.ts +2 -0
  41. package/dist/tools.js +25 -0
  42. package/package.json +14 -9
  43. package/scope/.next/BUILD_ID +1 -1
  44. package/scope/.next/app-build-manifest.json +12 -12
  45. package/scope/.next/app-path-routes-manifest.json +3 -3
  46. package/scope/.next/build-manifest.json +2 -2
  47. package/scope/.next/prerender-manifest.json +16 -16
  48. package/scope/.next/server/app/_not-found.html +1 -1
  49. package/scope/.next/server/app/_not-found.rsc +1 -1
  50. package/scope/.next/server/app/environments.html +1 -1
  51. package/scope/.next/server/app/environments.rsc +1 -1
  52. package/scope/.next/server/app/index.html +1 -1
  53. package/scope/.next/server/app/index.rsc +1 -1
  54. package/scope/.next/server/app/models.html +1 -1
  55. package/scope/.next/server/app/models.rsc +1 -1
  56. package/scope/.next/server/app-paths-manifest.json +3 -3
  57. package/scope/.next/server/functions-config-manifest.json +2 -2
  58. package/scope/.next/server/pages/404.html +1 -1
  59. package/scope/.next/server/pages/500.html +1 -1
  60. package/scope/.next/server/server-reference-manifest.json +1 -1
  61. package/dist/commands/init.d.ts +0 -2
  62. package/dist/commands/init.js +0 -24
  63. package/dist/commands/lifecycle.d.ts +0 -2
  64. package/dist/commands/lifecycle.js +0 -124
  65. package/dist/commands/plane.d.ts +0 -2
  66. package/dist/commands/plane.js +0 -38
  67. package/dist/commands/run.d.ts +0 -2
  68. package/dist/commands/run.js +0 -149
  69. package/dist/commands/runner.d.ts +0 -2
  70. package/dist/commands/runner.js +0 -33
  71. package/dist/commands/secrets.d.ts +0 -2
  72. package/dist/commands/secrets.js +0 -21
  73. /package/scope/.next/static/{5tnFLuvnSbNZNtqRgoot8 → x7wPUCpgS31-5ZHJkcKsU}/_buildManifest.js +0 -0
  74. /package/scope/.next/static/{5tnFLuvnSbNZNtqRgoot8 → x7wPUCpgS31-5ZHJkcKsU}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- <!DOCTYPE html><!--5tnFLuvnSbNZNtqRgoot8--><html lang="en" class="dark __variable_246ccd __variable_c29908"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/22a5144ee8d83bca-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/7d4881bb7e1bf84d-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/d57be8dcbceccbc1.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-4501ec292abda191.js"/><script src="/_next/static/chunks/4bd1b696-409494caf8c83275.js" async=""></script><script src="/_next/static/chunks/255-69a4a78fac9becef.js" async=""></script><script src="/_next/static/chunks/main-app-2a6b1f94de31f96f.js" async=""></script><script src="/_next/static/chunks/239-1c69ce437d02745f.js" async=""></script><script src="/_next/static/chunks/989-1c7081e9fd5c9b9d.js" async=""></script><script src="/_next/static/chunks/app/layout-d12f7c5cc80486b4.js" async=""></script><script src="/_next/static/chunks/873-9351d1edaa9d58ef.js" async=""></script><script src="/_next/static/chunks/app/models/page-d9b7d19485e9a640.js" async=""></script><meta name="next-size-adjust" content=""/><title>scope — fusion observability</title><meta name="description" content="Live observability for the FusionKit + HandoffKit + Cursorkit stack"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="antialiased"><div hidden=""><!--$--><!--/$--></div><div class="flex h-screen overflow-hidden"><aside class="bg-sidebar text-sidebar-foreground flex w-60 shrink-0 flex-col overflow-y-auto border-r p-5"><div class="flex items-center gap-2"><span class="bg-primary inline-block size-2.5 rounded-full"></span><div><div class="text-base font-semibold tracking-tight">scope</div><div class="text-muted-foreground text-xs">fusion observability</div></div></div><div data-orientation="horizontal" role="none" data-slot="separator" class="shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch my-5"></div><nav class="flex flex-col gap-1"><a class="rounded-md px-3 py-2 text-sm font-medium transition-colors text-muted-foreground hover:bg-accent hover:text-foreground" href="/">Sessions</a><a aria-current="page" class="rounded-md px-3 py-2 text-sm font-medium transition-colors bg-accent text-foreground" href="/models">Models</a><a class="rounded-md px-3 py-2 text-sm font-medium transition-colors text-muted-foreground hover:bg-accent hover:text-foreground" href="/environments">Environments</a></nav><div class="text-muted-foreground mt-auto pt-8 text-[11px] leading-relaxed">Tails the fusion-trace event spine across FusionKit, HandoffKit, and Cursorkit.</div></aside><main class="min-w-0 flex-1 overflow-x-hidden overflow-y-auto"><div><header class="bg-background/80 sticky top-0 z-10 flex items-center justify-between gap-4 border-b px-8 py-5 backdrop-blur"><div class="min-w-0"><h1 class="truncate text-xl font-semibold tracking-tight">Models</h1><p class="text-muted-foreground mt-0.5 truncate text-sm">Per-model latency, usage, and call counts across all sessions.</p></div><div class="flex shrink-0 items-center gap-2"><span class="text-muted-foreground inline-flex items-center gap-1.5 text-xs"><span class="relative flex size-2"><span class="absolute inline-flex size-full animate-ping rounded-full bg-emerald-500 opacity-60 motion-reduce:animate-none"></span><span class="relative inline-flex size-2 rounded-full bg-emerald-500"></span></span>live</span></div></header><div class="space-y-6 p-8"><div data-slot="skeleton" class="animate-pulse rounded-md bg-muted h-80 w-full"></div></div></div><!--$--><!--/$--></main></div><script src="/_next/static/chunks/webpack-4501ec292abda191.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[82180,[\"239\",\"static/chunks/239-1c69ce437d02745f.js\",\"989\",\"static/chunks/989-1c7081e9fd5c9b9d.js\",\"177\",\"static/chunks/app/layout-d12f7c5cc80486b4.js\"],\"TooltipProvider\"]\n3:I[54664,[\"239\",\"static/chunks/239-1c69ce437d02745f.js\",\"989\",\"static/chunks/989-1c7081e9fd5c9b9d.js\",\"177\",\"static/chunks/app/layout-d12f7c5cc80486b4.js\"],\"Separator\"]\n4:I[31327,[\"239\",\"static/chunks/239-1c69ce437d02745f.js\",\"989\",\"static/chunks/989-1c7081e9fd5c9b9d.js\",\"177\",\"static/chunks/app/layout-d12f7c5cc80486b4.js\"],\"SidebarNav\"]\n5:I[9766,[],\"\"]\n6:I[98924,[],\"\"]\n7:I[81959,[],\"ClientPageRoot\"]\n8:I[64441,[\"239\",\"static/chunks/239-1c69ce437d02745f.js\",\"873\",\"static/chunks/873-9351d1edaa9d58ef.js\",\"329\",\"static/chunks/app/models/page-d9b7d19485e9a640.js\"],\"default\"]\nb:I[24431,[],\"OutletBoundary\"]\nd:I[15278,[],\"AsyncMetadataOutlet\"]\nf:I[24431,[],\"ViewportBoundary\"]\n11:I[24431,[],\"MetadataBoundary\"]\n12:\"$Sreact.suspense\"\n14:I[57150,[],\"\"]\n:HL[\"/_next/static/media/22a5144ee8d83bca-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/7d4881bb7e1bf84d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/d57be8dcbceccbc1.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"5tnFLuvnSbNZNtqRgoot8\",\"p\":\"\",\"c\":[\"\",\"models\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"models\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/d57be8dcbceccbc1.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark __variable_246ccd __variable_c29908\",\"children\":[\"$\",\"body\",null,{\"className\":\"antialiased\",\"children\":[\"$\",\"$L2\",null,{\"delayDuration\":200,\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-screen overflow-hidden\",\"children\":[[\"$\",\"aside\",null,{\"className\":\"bg-sidebar text-sidebar-foreground flex w-60 shrink-0 flex-col overflow-y-auto border-r p-5\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"bg-primary inline-block size-2.5 rounded-full\"}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"text-base font-semibold tracking-tight\",\"children\":\"scope\"}],[\"$\",\"div\",null,{\"className\":\"text-muted-foreground text-xs\",\"children\":\"fusion observability\"}]]}]]}],[\"$\",\"$L3\",null,{\"className\":\"my-5\"}],[\"$\",\"$L4\",null,{}],[\"$\",\"div\",null,{\"className\":\"text-muted-foreground mt-auto pt-8 text-[11px] leading-relaxed\",\"children\":\"Tails the fusion-trace event spine across FusionKit, HandoffKit, and Cursorkit.\"}]]}],[\"$\",\"main\",null,{\"className\":\"min-w-0 flex-1 overflow-x-hidden overflow-y-auto\",\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"models\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L7\",null,{\"Component\":\"$8\",\"searchParams\":{},\"params\":{},\"promises\":[\"$@9\",\"$@a\"]}],null,[\"$\",\"$Lb\",null,{\"children\":[\"$Lc\",[\"$\",\"$Ld\",null,{\"promise\":\"$@e\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lf\",null,{\"children\":\"$L10\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$L11\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$12\",null,{\"fallback\":null,\"children\":\"$L13\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$14\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:{}\na:\"$0:f:0:1:2:children:2:children:1:props:children:0:props:params\"\n"])</script><script>self.__next_f.push([1,"10:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nc:null\n"])</script><script>self.__next_f.push([1,"e:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"scope — fusion observability\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Live observability for the FusionKit + HandoffKit + Cursorkit stack\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"13:\"$e:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--x7wPUCpgS31_5ZHJkcKsU--><html lang="en" class="dark __variable_246ccd __variable_c29908"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/22a5144ee8d83bca-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/7d4881bb7e1bf84d-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/d57be8dcbceccbc1.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-4501ec292abda191.js"/><script src="/_next/static/chunks/4bd1b696-409494caf8c83275.js" async=""></script><script src="/_next/static/chunks/255-69a4a78fac9becef.js" async=""></script><script src="/_next/static/chunks/main-app-2a6b1f94de31f96f.js" async=""></script><script src="/_next/static/chunks/239-1c69ce437d02745f.js" async=""></script><script src="/_next/static/chunks/989-1c7081e9fd5c9b9d.js" async=""></script><script src="/_next/static/chunks/app/layout-d12f7c5cc80486b4.js" async=""></script><script src="/_next/static/chunks/873-9351d1edaa9d58ef.js" async=""></script><script src="/_next/static/chunks/app/models/page-d9b7d19485e9a640.js" async=""></script><meta name="next-size-adjust" content=""/><title>scope — fusion observability</title><meta name="description" content="Live observability for the FusionKit + HandoffKit + Cursorkit stack"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="antialiased"><div hidden=""><!--$--><!--/$--></div><div class="flex h-screen overflow-hidden"><aside class="bg-sidebar text-sidebar-foreground flex w-60 shrink-0 flex-col overflow-y-auto border-r p-5"><div class="flex items-center gap-2"><span class="bg-primary inline-block size-2.5 rounded-full"></span><div><div class="text-base font-semibold tracking-tight">scope</div><div class="text-muted-foreground text-xs">fusion observability</div></div></div><div data-orientation="horizontal" role="none" data-slot="separator" class="shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch my-5"></div><nav class="flex flex-col gap-1"><a class="rounded-md px-3 py-2 text-sm font-medium transition-colors text-muted-foreground hover:bg-accent hover:text-foreground" href="/">Sessions</a><a aria-current="page" class="rounded-md px-3 py-2 text-sm font-medium transition-colors bg-accent text-foreground" href="/models">Models</a><a class="rounded-md px-3 py-2 text-sm font-medium transition-colors text-muted-foreground hover:bg-accent hover:text-foreground" href="/environments">Environments</a></nav><div class="text-muted-foreground mt-auto pt-8 text-[11px] leading-relaxed">Tails the fusion-trace event spine across FusionKit, HandoffKit, and Cursorkit.</div></aside><main class="min-w-0 flex-1 overflow-x-hidden overflow-y-auto"><div><header class="bg-background/80 sticky top-0 z-10 flex items-center justify-between gap-4 border-b px-8 py-5 backdrop-blur"><div class="min-w-0"><h1 class="truncate text-xl font-semibold tracking-tight">Models</h1><p class="text-muted-foreground mt-0.5 truncate text-sm">Per-model latency, usage, and call counts across all sessions.</p></div><div class="flex shrink-0 items-center gap-2"><span class="text-muted-foreground inline-flex items-center gap-1.5 text-xs"><span class="relative flex size-2"><span class="absolute inline-flex size-full animate-ping rounded-full bg-emerald-500 opacity-60 motion-reduce:animate-none"></span><span class="relative inline-flex size-2 rounded-full bg-emerald-500"></span></span>live</span></div></header><div class="space-y-6 p-8"><div data-slot="skeleton" class="animate-pulse rounded-md bg-muted h-80 w-full"></div></div></div><!--$--><!--/$--></main></div><script src="/_next/static/chunks/webpack-4501ec292abda191.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[82180,[\"239\",\"static/chunks/239-1c69ce437d02745f.js\",\"989\",\"static/chunks/989-1c7081e9fd5c9b9d.js\",\"177\",\"static/chunks/app/layout-d12f7c5cc80486b4.js\"],\"TooltipProvider\"]\n3:I[54664,[\"239\",\"static/chunks/239-1c69ce437d02745f.js\",\"989\",\"static/chunks/989-1c7081e9fd5c9b9d.js\",\"177\",\"static/chunks/app/layout-d12f7c5cc80486b4.js\"],\"Separator\"]\n4:I[31327,[\"239\",\"static/chunks/239-1c69ce437d02745f.js\",\"989\",\"static/chunks/989-1c7081e9fd5c9b9d.js\",\"177\",\"static/chunks/app/layout-d12f7c5cc80486b4.js\"],\"SidebarNav\"]\n5:I[9766,[],\"\"]\n6:I[98924,[],\"\"]\n7:I[81959,[],\"ClientPageRoot\"]\n8:I[64441,[\"239\",\"static/chunks/239-1c69ce437d02745f.js\",\"873\",\"static/chunks/873-9351d1edaa9d58ef.js\",\"329\",\"static/chunks/app/models/page-d9b7d19485e9a640.js\"],\"default\"]\nb:I[24431,[],\"OutletBoundary\"]\nd:I[15278,[],\"AsyncMetadataOutlet\"]\nf:I[24431,[],\"ViewportBoundary\"]\n11:I[24431,[],\"MetadataBoundary\"]\n12:\"$Sreact.suspense\"\n14:I[57150,[],\"\"]\n:HL[\"/_next/static/media/22a5144ee8d83bca-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/7d4881bb7e1bf84d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/d57be8dcbceccbc1.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"x7wPUCpgS31-5ZHJkcKsU\",\"p\":\"\",\"c\":[\"\",\"models\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"models\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/d57be8dcbceccbc1.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark __variable_246ccd __variable_c29908\",\"children\":[\"$\",\"body\",null,{\"className\":\"antialiased\",\"children\":[\"$\",\"$L2\",null,{\"delayDuration\":200,\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-screen overflow-hidden\",\"children\":[[\"$\",\"aside\",null,{\"className\":\"bg-sidebar text-sidebar-foreground flex w-60 shrink-0 flex-col overflow-y-auto border-r p-5\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"bg-primary inline-block size-2.5 rounded-full\"}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"text-base font-semibold tracking-tight\",\"children\":\"scope\"}],[\"$\",\"div\",null,{\"className\":\"text-muted-foreground text-xs\",\"children\":\"fusion observability\"}]]}]]}],[\"$\",\"$L3\",null,{\"className\":\"my-5\"}],[\"$\",\"$L4\",null,{}],[\"$\",\"div\",null,{\"className\":\"text-muted-foreground mt-auto pt-8 text-[11px] leading-relaxed\",\"children\":\"Tails the fusion-trace event spine across FusionKit, HandoffKit, and Cursorkit.\"}]]}],[\"$\",\"main\",null,{\"className\":\"min-w-0 flex-1 overflow-x-hidden overflow-y-auto\",\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"models\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L7\",null,{\"Component\":\"$8\",\"searchParams\":{},\"params\":{},\"promises\":[\"$@9\",\"$@a\"]}],null,[\"$\",\"$Lb\",null,{\"children\":[\"$Lc\",[\"$\",\"$Ld\",null,{\"promise\":\"$@e\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lf\",null,{\"children\":\"$L10\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$L11\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$12\",null,{\"fallback\":null,\"children\":\"$L13\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$14\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:{}\na:\"$0:f:0:1:2:children:2:children:1:props:children:0:props:params\"\n"])</script><script>self.__next_f.push([1,"10:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nc:null\n"])</script><script>self.__next_f.push([1,"e:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"scope — fusion observability\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Live observability for the FusionKit + HandoffKit + Cursorkit stack\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"13:\"$e:metadata\"\n"])</script></body></html>
@@ -15,7 +15,7 @@ f:I[24431,[],"ViewportBoundary"]
15
15
  :HL["/_next/static/media/22a5144ee8d83bca-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
16
16
  :HL["/_next/static/media/7d4881bb7e1bf84d-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
17
17
  :HL["/_next/static/css/d57be8dcbceccbc1.css","style"]
18
- 0:{"P":null,"b":"5tnFLuvnSbNZNtqRgoot8","p":"","c":["","models"],"i":false,"f":[[["",{"children":["models",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/d57be8dcbceccbc1.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"dark __variable_246ccd __variable_c29908","children":["$","body",null,{"className":"antialiased","children":["$","$L2",null,{"delayDuration":200,"children":["$","div",null,{"className":"flex h-screen overflow-hidden","children":[["$","aside",null,{"className":"bg-sidebar text-sidebar-foreground flex w-60 shrink-0 flex-col overflow-y-auto border-r p-5","children":[["$","div",null,{"className":"flex items-center gap-2","children":[["$","span",null,{"className":"bg-primary inline-block size-2.5 rounded-full"}],["$","div",null,{"children":[["$","div",null,{"className":"text-base font-semibold tracking-tight","children":"scope"}],["$","div",null,{"className":"text-muted-foreground text-xs","children":"fusion observability"}]]}]]}],["$","$L3",null,{"className":"my-5"}],["$","$L4",null,{}],["$","div",null,{"className":"text-muted-foreground mt-auto pt-8 text-[11px] leading-relaxed","children":"Tails the fusion-trace event spine across FusionKit, HandoffKit, and Cursorkit."}]]}],["$","main",null,{"className":"min-w-0 flex-1 overflow-x-hidden overflow-y-auto","children":["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]}]}]}]]}],{"children":["models",["$","$1","c",{"children":[null,["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L7",null,{"Component":"$8","searchParams":{},"params":{},"promises":["$@9","$@a"]}],null,["$","$Lb",null,{"children":["$Lc",["$","$Ld",null,{"promise":"$@e"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lf",null,{"children":"$L10"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$L11",null,{"children":["$","div",null,{"hidden":true,"children":["$","$12",null,{"fallback":null,"children":"$L13"}]}]}]]}],false]],"m":"$undefined","G":["$14",[]],"s":false,"S":true}
18
+ 0:{"P":null,"b":"x7wPUCpgS31-5ZHJkcKsU","p":"","c":["","models"],"i":false,"f":[[["",{"children":["models",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/d57be8dcbceccbc1.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"dark __variable_246ccd __variable_c29908","children":["$","body",null,{"className":"antialiased","children":["$","$L2",null,{"delayDuration":200,"children":["$","div",null,{"className":"flex h-screen overflow-hidden","children":[["$","aside",null,{"className":"bg-sidebar text-sidebar-foreground flex w-60 shrink-0 flex-col overflow-y-auto border-r p-5","children":[["$","div",null,{"className":"flex items-center gap-2","children":[["$","span",null,{"className":"bg-primary inline-block size-2.5 rounded-full"}],["$","div",null,{"children":[["$","div",null,{"className":"text-base font-semibold tracking-tight","children":"scope"}],["$","div",null,{"className":"text-muted-foreground text-xs","children":"fusion observability"}]]}]]}],["$","$L3",null,{"className":"my-5"}],["$","$L4",null,{}],["$","div",null,{"className":"text-muted-foreground mt-auto pt-8 text-[11px] leading-relaxed","children":"Tails the fusion-trace event spine across FusionKit, HandoffKit, and Cursorkit."}]]}],["$","main",null,{"className":"min-w-0 flex-1 overflow-x-hidden overflow-y-auto","children":["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]}]}]}]]}],{"children":["models",["$","$1","c",{"children":[null,["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L7",null,{"Component":"$8","searchParams":{},"params":{},"promises":["$@9","$@a"]}],null,["$","$Lb",null,{"children":["$Lc",["$","$Ld",null,{"promise":"$@e"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lf",null,{"children":"$L10"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$L11",null,{"children":["$","div",null,{"hidden":true,"children":["$","$12",null,{"fallback":null,"children":"$L13"}]}]}]]}],false]],"m":"$undefined","G":["$14",[]],"s":false,"S":true}
19
19
  9:{}
20
20
  a:"$0:f:0:1:2:children:2:children:1:props:children:0:props:params"
21
21
  10:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "/_not-found/page": "app/_not-found/page.js",
3
- "/api/environments/route": "app/api/environments/route.js",
4
3
  "/api/models/route": "app/api/models/route.js",
5
- "/api/ingest/route": "app/api/ingest/route.js",
4
+ "/api/environments/route": "app/api/environments/route.js",
6
5
  "/api/replay/route": "app/api/replay/route.js",
7
- "/api/sessions/route": "app/api/sessions/route.js",
8
6
  "/api/sessions/[traceId]/route": "app/api/sessions/[traceId]/route.js",
7
+ "/api/ingest/route": "app/api/ingest/route.js",
8
+ "/api/sessions/route": "app/api/sessions/route.js",
9
9
  "/api/stream/route": "app/api/stream/route.js",
10
10
  "/environments/page": "app/environments/page.js",
11
11
  "/models/page": "app/models/page.js",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "version": 1,
3
3
  "functions": {
4
- "/api/ingest": {},
5
4
  "/api/environments": {},
5
+ "/api/ingest": {},
6
6
  "/api/models": {},
7
7
  "/api/replay": {},
8
- "/api/sessions": {},
9
8
  "/api/sessions/[traceId]": {},
9
+ "/api/sessions": {},
10
10
  "/api/stream": {}
11
11
  }
12
12
  }
@@ -1 +1 @@
1
- <!DOCTYPE html><!--5tnFLuvnSbNZNtqRgoot8--><html lang="en" class="dark __variable_246ccd __variable_c29908"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/22a5144ee8d83bca-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/7d4881bb7e1bf84d-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/d57be8dcbceccbc1.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-4501ec292abda191.js"/><script src="/_next/static/chunks/4bd1b696-409494caf8c83275.js" async=""></script><script src="/_next/static/chunks/255-69a4a78fac9becef.js" async=""></script><script src="/_next/static/chunks/main-app-2a6b1f94de31f96f.js" async=""></script><script src="/_next/static/chunks/239-1c69ce437d02745f.js" async=""></script><script src="/_next/static/chunks/989-1c7081e9fd5c9b9d.js" async=""></script><script src="/_next/static/chunks/app/layout-d12f7c5cc80486b4.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>scope — fusion observability</title><meta name="description" content="Live observability for the FusionKit + HandoffKit + Cursorkit stack"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="antialiased"><div hidden=""><!--$--><!--/$--></div><div class="flex h-screen overflow-hidden"><aside class="bg-sidebar text-sidebar-foreground flex w-60 shrink-0 flex-col overflow-y-auto border-r p-5"><div class="flex items-center gap-2"><span class="bg-primary inline-block size-2.5 rounded-full"></span><div><div class="text-base font-semibold tracking-tight">scope</div><div class="text-muted-foreground text-xs">fusion observability</div></div></div><div data-orientation="horizontal" role="none" data-slot="separator" class="shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch my-5"></div><nav class="flex flex-col gap-1"><a class="rounded-md px-3 py-2 text-sm font-medium transition-colors text-muted-foreground hover:bg-accent hover:text-foreground" href="/">Sessions</a><a class="rounded-md px-3 py-2 text-sm font-medium transition-colors text-muted-foreground hover:bg-accent hover:text-foreground" href="/models">Models</a><a class="rounded-md px-3 py-2 text-sm font-medium transition-colors text-muted-foreground hover:bg-accent hover:text-foreground" href="/environments">Environments</a></nav><div class="text-muted-foreground mt-auto pt-8 text-[11px] leading-relaxed">Tails the fusion-trace event spine across FusionKit, HandoffKit, and Cursorkit.</div></aside><main class="min-w-0 flex-1 overflow-x-hidden overflow-y-auto"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main></div><script src="/_next/static/chunks/webpack-4501ec292abda191.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[82180,[\"239\",\"static/chunks/239-1c69ce437d02745f.js\",\"989\",\"static/chunks/989-1c7081e9fd5c9b9d.js\",\"177\",\"static/chunks/app/layout-d12f7c5cc80486b4.js\"],\"TooltipProvider\"]\n3:I[54664,[\"239\",\"static/chunks/239-1c69ce437d02745f.js\",\"989\",\"static/chunks/989-1c7081e9fd5c9b9d.js\",\"177\",\"static/chunks/app/layout-d12f7c5cc80486b4.js\"],\"Separator\"]\n4:I[31327,[\"239\",\"static/chunks/239-1c69ce437d02745f.js\",\"989\",\"static/chunks/989-1c7081e9fd5c9b9d.js\",\"177\",\"static/chunks/app/layout-d12f7c5cc80486b4.js\"],\"SidebarNav\"]\n5:I[9766,[],\"\"]\n6:I[98924,[],\"\"]\n7:I[24431,[],\"OutletBoundary\"]\n9:I[15278,[],\"AsyncMetadataOutlet\"]\nb:I[24431,[],\"ViewportBoundary\"]\nd:I[24431,[],\"MetadataBoundary\"]\ne:\"$Sreact.suspense\"\n10:I[57150,[],\"\"]\n:HL[\"/_next/static/media/22a5144ee8d83bca-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/7d4881bb7e1bf84d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/d57be8dcbceccbc1.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"5tnFLuvnSbNZNtqRgoot8\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/d57be8dcbceccbc1.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark __variable_246ccd __variable_c29908\",\"children\":[\"$\",\"body\",null,{\"className\":\"antialiased\",\"children\":[\"$\",\"$L2\",null,{\"delayDuration\":200,\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-screen overflow-hidden\",\"children\":[[\"$\",\"aside\",null,{\"className\":\"bg-sidebar text-sidebar-foreground flex w-60 shrink-0 flex-col overflow-y-auto border-r p-5\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"bg-primary inline-block size-2.5 rounded-full\"}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"text-base font-semibold tracking-tight\",\"children\":\"scope\"}],[\"$\",\"div\",null,{\"className\":\"text-muted-foreground text-xs\",\"children\":\"fusion observability\"}]]}]]}],[\"$\",\"$L3\",null,{\"className\":\"my-5\"}],[\"$\",\"$L4\",null,{}],[\"$\",\"div\",null,{\"className\":\"text-muted-foreground mt-auto pt-8 text-[11px] leading-relaxed\",\"children\":\"Tails the fusion-trace event spine across FusionKit, HandoffKit, and Cursorkit.\"}]]}],[\"$\",\"main\",null,{\"className\":\"min-w-0 flex-1 overflow-x-hidden overflow-y-auto\",\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L7\",null,{\"children\":[\"$L8\",[\"$\",\"$L9\",null,{\"promise\":\"$@a\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$e\",null,{\"fallback\":null,\"children\":\"$Lf\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n8:null\n"])</script><script>self.__next_f.push([1,"a:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"scope — fusion observability\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Live observability for the FusionKit + HandoffKit + Cursorkit stack\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"f:\"$a:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--x7wPUCpgS31_5ZHJkcKsU--><html lang="en" class="dark __variable_246ccd __variable_c29908"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/22a5144ee8d83bca-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/7d4881bb7e1bf84d-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/d57be8dcbceccbc1.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-4501ec292abda191.js"/><script src="/_next/static/chunks/4bd1b696-409494caf8c83275.js" async=""></script><script src="/_next/static/chunks/255-69a4a78fac9becef.js" async=""></script><script src="/_next/static/chunks/main-app-2a6b1f94de31f96f.js" async=""></script><script src="/_next/static/chunks/239-1c69ce437d02745f.js" async=""></script><script src="/_next/static/chunks/989-1c7081e9fd5c9b9d.js" async=""></script><script src="/_next/static/chunks/app/layout-d12f7c5cc80486b4.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>scope — fusion observability</title><meta name="description" content="Live observability for the FusionKit + HandoffKit + Cursorkit stack"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="antialiased"><div hidden=""><!--$--><!--/$--></div><div class="flex h-screen overflow-hidden"><aside class="bg-sidebar text-sidebar-foreground flex w-60 shrink-0 flex-col overflow-y-auto border-r p-5"><div class="flex items-center gap-2"><span class="bg-primary inline-block size-2.5 rounded-full"></span><div><div class="text-base font-semibold tracking-tight">scope</div><div class="text-muted-foreground text-xs">fusion observability</div></div></div><div data-orientation="horizontal" role="none" data-slot="separator" class="shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch my-5"></div><nav class="flex flex-col gap-1"><a class="rounded-md px-3 py-2 text-sm font-medium transition-colors text-muted-foreground hover:bg-accent hover:text-foreground" href="/">Sessions</a><a class="rounded-md px-3 py-2 text-sm font-medium transition-colors text-muted-foreground hover:bg-accent hover:text-foreground" href="/models">Models</a><a class="rounded-md px-3 py-2 text-sm font-medium transition-colors text-muted-foreground hover:bg-accent hover:text-foreground" href="/environments">Environments</a></nav><div class="text-muted-foreground mt-auto pt-8 text-[11px] leading-relaxed">Tails the fusion-trace event spine across FusionKit, HandoffKit, and Cursorkit.</div></aside><main class="min-w-0 flex-1 overflow-x-hidden overflow-y-auto"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main></div><script src="/_next/static/chunks/webpack-4501ec292abda191.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[82180,[\"239\",\"static/chunks/239-1c69ce437d02745f.js\",\"989\",\"static/chunks/989-1c7081e9fd5c9b9d.js\",\"177\",\"static/chunks/app/layout-d12f7c5cc80486b4.js\"],\"TooltipProvider\"]\n3:I[54664,[\"239\",\"static/chunks/239-1c69ce437d02745f.js\",\"989\",\"static/chunks/989-1c7081e9fd5c9b9d.js\",\"177\",\"static/chunks/app/layout-d12f7c5cc80486b4.js\"],\"Separator\"]\n4:I[31327,[\"239\",\"static/chunks/239-1c69ce437d02745f.js\",\"989\",\"static/chunks/989-1c7081e9fd5c9b9d.js\",\"177\",\"static/chunks/app/layout-d12f7c5cc80486b4.js\"],\"SidebarNav\"]\n5:I[9766,[],\"\"]\n6:I[98924,[],\"\"]\n7:I[24431,[],\"OutletBoundary\"]\n9:I[15278,[],\"AsyncMetadataOutlet\"]\nb:I[24431,[],\"ViewportBoundary\"]\nd:I[24431,[],\"MetadataBoundary\"]\ne:\"$Sreact.suspense\"\n10:I[57150,[],\"\"]\n:HL[\"/_next/static/media/22a5144ee8d83bca-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/7d4881bb7e1bf84d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/d57be8dcbceccbc1.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"x7wPUCpgS31-5ZHJkcKsU\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/d57be8dcbceccbc1.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark __variable_246ccd __variable_c29908\",\"children\":[\"$\",\"body\",null,{\"className\":\"antialiased\",\"children\":[\"$\",\"$L2\",null,{\"delayDuration\":200,\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-screen overflow-hidden\",\"children\":[[\"$\",\"aside\",null,{\"className\":\"bg-sidebar text-sidebar-foreground flex w-60 shrink-0 flex-col overflow-y-auto border-r p-5\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"bg-primary inline-block size-2.5 rounded-full\"}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"text-base font-semibold tracking-tight\",\"children\":\"scope\"}],[\"$\",\"div\",null,{\"className\":\"text-muted-foreground text-xs\",\"children\":\"fusion observability\"}]]}]]}],[\"$\",\"$L3\",null,{\"className\":\"my-5\"}],[\"$\",\"$L4\",null,{}],[\"$\",\"div\",null,{\"className\":\"text-muted-foreground mt-auto pt-8 text-[11px] leading-relaxed\",\"children\":\"Tails the fusion-trace event spine across FusionKit, HandoffKit, and Cursorkit.\"}]]}],[\"$\",\"main\",null,{\"className\":\"min-w-0 flex-1 overflow-x-hidden overflow-y-auto\",\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L7\",null,{\"children\":[\"$L8\",[\"$\",\"$L9\",null,{\"promise\":\"$@a\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$e\",null,{\"fallback\":null,\"children\":\"$Lf\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n8:null\n"])</script><script>self.__next_f.push([1,"a:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"scope — fusion observability\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Live observability for the FusionKit + HandoffKit + Cursorkit stack\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"f:\"$a:metadata\"\n"])</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-4501ec292abda191.js" defer=""></script><script src="/_next/static/chunks/framework-f52ebcb9f26a1e11.js" defer=""></script><script src="/_next/static/chunks/main-bd4a730124c6c896.js" defer=""></script><script src="/_next/static/chunks/pages/_app-5addca2b3b969fde.js" defer=""></script><script src="/_next/static/chunks/pages/_error-022e4ac7bbb9914f.js" defer=""></script><script src="/_next/static/5tnFLuvnSbNZNtqRgoot8/_buildManifest.js" defer=""></script><script src="/_next/static/5tnFLuvnSbNZNtqRgoot8/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"5tnFLuvnSbNZNtqRgoot8","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-4501ec292abda191.js" defer=""></script><script src="/_next/static/chunks/framework-f52ebcb9f26a1e11.js" defer=""></script><script src="/_next/static/chunks/main-bd4a730124c6c896.js" defer=""></script><script src="/_next/static/chunks/pages/_app-5addca2b3b969fde.js" defer=""></script><script src="/_next/static/chunks/pages/_error-022e4ac7bbb9914f.js" defer=""></script><script src="/_next/static/x7wPUCpgS31-5ZHJkcKsU/_buildManifest.js" defer=""></script><script src="/_next/static/x7wPUCpgS31-5ZHJkcKsU/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"x7wPUCpgS31-5ZHJkcKsU","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- {"node":{},"edge":{},"encryptionKey":"/IksIpKGMQ6AaJkOjOn6oHqFUtYv1s9H4Kb7coHTgC4="}
1
+ {"node":{},"edge":{},"encryptionKey":"tVmFcln48QtRAaLz7Z0VsSy+pZmk2FWsQFMozlcKLtQ="}
@@ -1,2 +0,0 @@
1
- import type { Command } from "commander";
2
- export declare function registerInit(program: Command): void;
@@ -1,24 +0,0 @@
1
- import { join } from "node:path";
2
- import { initHome } from "../config.js";
3
- import { resolveDir } from "../shared/plane.js";
4
- export function registerInit(program) {
5
- program
6
- .command("init")
7
- .description("initialize org keys, config, policy")
8
- .option("--port <n>", "plane port")
9
- .option("--host <host>", "plane bind host")
10
- .option("--plane-url <url>", "public plane URL for clients and runners")
11
- .action((opts) => {
12
- const dir = resolveDir(program.opts().dir);
13
- const home = initHome(dir, {
14
- ...(opts.port ? { port: Number(opts.port) } : {}),
15
- ...(opts.host ? { host: opts.host } : {}),
16
- ...(opts.planeUrl ? { planeUrl: opts.planeUrl } : {})
17
- });
18
- console.log(`initialized warrant home at ${home.dir}`);
19
- console.log(`plane url: ${home.config.planeUrl}`);
20
- console.log(`policy: ${join(home.dir, "policy.json")}`);
21
- console.log(`enroll token (for runners): ${home.config.enrollToken}`);
22
- console.log(`admin token (for the control panel): ${home.config.adminToken}`);
23
- });
24
- }
@@ -1,2 +0,0 @@
1
- import type { Command } from "commander";
2
- export declare function registerLifecycle(program: Command): void;
@@ -1,124 +0,0 @@
1
- import { readFileSync, writeFileSync } from "node:fs";
2
- import { resolve } from "node:path";
3
- import { verifyReceiptBundle } from "@fusionkit/protocol";
4
- import { pullRun } from "@fusionkit/workspace";
5
- import { loadHome } from "../config.js";
6
- import { renderReceipt, renderRunList } from "../render.js";
7
- import { clientFor, resolveDir, waitForTerminal } from "../shared/plane.js";
8
- export function registerLifecycle(program) {
9
- const dirOf = () => resolveDir(program.opts().dir);
10
- program
11
- .command("runs")
12
- .description("list runs")
13
- .action(async () => {
14
- const { runs } = await clientFor(dirOf()).listRuns();
15
- console.log(renderRunList(runs));
16
- });
17
- program
18
- .command("approve <runId>")
19
- .description("grant required consent")
20
- .action(async (runId) => {
21
- const dir = dirOf();
22
- const home = loadHome(dir);
23
- const result = await clientFor(dir).approve(runId, {
24
- kind: "human",
25
- id: home.config.requestedBy
26
- });
27
- console.log(`run ${result.runId} [${result.status}]`);
28
- });
29
- program
30
- .command("cancel <runId>")
31
- .description("cancel an unclaimed run")
32
- .action(async (runId) => {
33
- const dir = dirOf();
34
- const home = loadHome(dir);
35
- const result = await clientFor(dir).cancel(runId, {
36
- kind: "human",
37
- id: home.config.requestedBy
38
- });
39
- console.log(`run ${result.runId} [${result.status}]`);
40
- });
41
- program
42
- .command("watch <runId>")
43
- .description("stream run status")
44
- .action(async (runId) => {
45
- const status = await waitForTerminal(clientFor(dirOf()), runId, (s) => console.log(s));
46
- console.log(`final: ${status}`);
47
- });
48
- program
49
- .command("receipt <runId>")
50
- .description("one screen, five questions")
51
- .action(async (runId) => {
52
- console.log(renderReceipt(await clientFor(dirOf()).getBundle(runId)));
53
- });
54
- program
55
- .command("bundle <runId>")
56
- .description("save offline-verifiable bundle")
57
- .option("--out <file>", "output path")
58
- .action(async (runId, opts) => {
59
- const bundle = await clientFor(dirOf()).getBundle(runId);
60
- const out = opts.out ?? `${runId}.bundle.json`;
61
- writeFileSync(out, JSON.stringify(bundle, null, 2));
62
- console.log(`bundle written to ${out}`);
63
- });
64
- program
65
- .command("verify <file>")
66
- .description("verify a bundle offline")
67
- .action((file) => {
68
- const bundle = JSON.parse(readFileSync(file, "utf8"));
69
- const result = verifyReceiptBundle(bundle);
70
- if (result.ok) {
71
- console.log("VERIFIED: signatures, event chain, and linkage all check out");
72
- return;
73
- }
74
- console.error("VERIFICATION FAILED:");
75
- for (const problem of result.problems)
76
- console.error(` - ${problem}`);
77
- process.exit(1);
78
- });
79
- program
80
- .command("pull <runId>")
81
- .description("divergence-safe pull of results")
82
- .option("--repo <dir>", "workspace repository", ".")
83
- .action(async (runId, opts) => {
84
- const client = clientFor(dirOf());
85
- const bundle = await client.getBundle(runId);
86
- const diffHash = bundle.receipt.workspaceOut.diffHash;
87
- if (!diffHash) {
88
- console.log("run produced no workspace changes; nothing to pull");
89
- return;
90
- }
91
- const diff = await client.getBlob(diffHash);
92
- const result = pullRun(resolve(opts.repo), runId, bundle.contract.workspace.baseRef, diff);
93
- switch (result.mode) {
94
- case "applied":
95
- console.log("applied run output to the working tree (clean fast path)");
96
- break;
97
- case "branch":
98
- console.log(`local workspace diverged from the contract base; results are on branch ${result.branch}`);
99
- break;
100
- case "empty":
101
- console.log("run produced no workspace changes; nothing to pull");
102
- break;
103
- default: {
104
- const exhausted = result;
105
- throw new Error(`unreachable: ${String(exhausted)}`);
106
- }
107
- }
108
- });
109
- program
110
- .command("export")
111
- .description("audit JSONL export")
112
- .option("--since <iso>", "only export events at or after this timestamp")
113
- .action(async (opts) => {
114
- process.stdout.write(await clientFor(dirOf()).exportJsonl(opts.since));
115
- });
116
- program
117
- .command("ui")
118
- .description("control panel URL and login token")
119
- .action(() => {
120
- const home = loadHome(dirOf());
121
- console.log(`control panel: ${home.config.planeUrl}/ui/`);
122
- console.log(`login token: ${home.config.adminToken}`);
123
- });
124
- }
@@ -1,2 +0,0 @@
1
- import type { Command } from "commander";
2
- export declare function registerPlane(program: Command): void;
@@ -1,38 +0,0 @@
1
- import { join } from "node:path";
2
- import { Plane, startPlaneServer } from "@fusionkit/plane";
3
- import { loadHome, secretStoreFor } from "../config.js";
4
- import { resolveDir } from "../shared/plane.js";
5
- import { createPortlessSession } from "../shared/portless.js";
6
- export function registerPlane(program) {
7
- const plane = program.command("plane").description("control plane + control panel");
8
- plane
9
- .command("start")
10
- .description("start the control plane + control panel")
11
- .option("--port <n>", "bind port")
12
- .option("--host <host>", "bind host")
13
- .action(async (opts) => {
14
- const dir = resolveDir(program.opts().dir);
15
- const home = loadHome(dir);
16
- const planeInstance = new Plane({
17
- dataDir: join(dir, "data"),
18
- policy: home.policy,
19
- planePrivateKeyPem: home.planePrivateKeyPem,
20
- planePublicKeyPem: home.planePublicKeyPem,
21
- adminToken: home.config.adminToken,
22
- enrollToken: home.config.enrollToken,
23
- secretStore: secretStoreFor(home)
24
- });
25
- const port = opts.port ? Number(opts.port) : home.config.port;
26
- const host = opts.host ?? home.config.host;
27
- const started = await startPlaneServer(planeInstance, { port, host });
28
- // Register a stable portless name for the control panel (enabled unless
29
- // PORTLESS=0 or no proxy is detected; falls back to the loopback URL).
30
- const portless = await createPortlessSession({
31
- enabled: process.env.PORTLESS !== "0",
32
- log: (line) => console.error(line)
33
- });
34
- const baseUrl = portless.register("plane", started.port);
35
- console.log(`warrant plane listening on ${baseUrl}`);
36
- console.log(`control panel: ${baseUrl}/ui/`);
37
- });
38
- }
@@ -1,2 +0,0 @@
1
- import type { Command } from "commander";
2
- export declare function registerRun(program: Command): void;
@@ -1,149 +0,0 @@
1
- import { readFileSync } from "node:fs";
2
- import { resolve } from "node:path";
3
- import { agents, handoff, targets } from "@fusionkit/handoff";
4
- import { AGENT_KINDS } from "@fusionkit/protocol";
5
- import { captureWorkspace } from "@fusionkit/workspace";
6
- import { loadHome } from "../config.js";
7
- import { renderDisclosure, renderReceipt, renderTrace } from "../render.js";
8
- import { fail } from "../shared/errors.js";
9
- import { collect, isolationFlag } from "../shared/options.js";
10
- import { CONTINUE_WAIT_TIMEOUT_MS, clientFor, resolveDir, waitForTerminal } from "../shared/plane.js";
11
- function agentSpecFor(kind) {
12
- switch (kind) {
13
- case "claude-code":
14
- return agents.claudeCode();
15
- case "codex":
16
- return agents.codex();
17
- case "pi":
18
- return agents.pi();
19
- case "mock":
20
- return agents.mock();
21
- case "command":
22
- return agents.command();
23
- default:
24
- fail(`unknown agent kind "${kind}" (expected ${AGENT_KINDS.join(" | ")})`);
25
- }
26
- }
27
- function addRunOptions(cmd) {
28
- return cmd
29
- .option("--agent <kind>", `agent kind (${AGENT_KINDS.join(" | ")})`)
30
- .option("--pool <pool>", "runner pool", "default")
31
- .option("--secret <name>", "release a secret into the session (repeatable)", collect)
32
- .option("--allow-host <host>", "allow egress to host (repeatable)", collect)
33
- .option("--allow-untracked <glob>", "include untracked files matching glob (repeatable)", collect)
34
- .option("--repo <dir>", "workspace repository", ".")
35
- .option("--isolation <tier>", "session isolation: process | hermetic | vercel-sandbox")
36
- .option("--dry-run", "show what would move; move nothing")
37
- .option("--no-watch", "do not wait for completion");
38
- }
39
- export function registerRun(program) {
40
- addRunOptions(program
41
- .command("run")
42
- .description("request a governed run")
43
- .argument("[task...]", "task prompt")).action(async (task, opts) => {
44
- const dir = resolveDir(program.opts().dir);
45
- if (!opts.agent)
46
- fail(`--agent is required (${AGENT_KINDS.join(" | ")})`);
47
- const prompt = task.join(" ").trim();
48
- if (!prompt)
49
- fail("a task prompt is required");
50
- const home = loadHome(dir);
51
- const client = clientFor(dir);
52
- const repoDir = resolve(opts.repo);
53
- const captured = captureWorkspace(repoDir, {
54
- allowUntracked: opts.allowUntracked ?? []
55
- });
56
- const isolation = isolationFlag(opts.isolation);
57
- const request = {
58
- requestedBy: { kind: "human", id: home.config.requestedBy },
59
- agentKind: opts.agent,
60
- prompt,
61
- pool: opts.pool,
62
- secretNames: opts.secret ?? [],
63
- workspace: captured.manifest,
64
- network: {
65
- defaultDeny: home.policy.network.defaultDeny,
66
- allowHosts: opts.allowHost ?? []
67
- },
68
- budget: {},
69
- disclosure: "minimal-context",
70
- ...(isolation ? { isolation } : {})
71
- };
72
- if (opts.dryRun) {
73
- const report = await client.dryRun(request);
74
- console.log(renderDisclosure(report));
75
- return;
76
- }
77
- await client.putBlob(captured.bundle);
78
- if (captured.dirtyDiff)
79
- await client.putBlob(captured.dirtyDiff);
80
- for (const file of captured.untracked)
81
- await client.putBlob(file.content);
82
- const created = await client.requestRun(request);
83
- console.log(`run ${created.runId} [${created.status}]`);
84
- if (!opts.watch)
85
- return;
86
- const status = await waitForTerminal(client, created.runId, (s) => console.log(` ${s}`));
87
- if (status === "completed" || status === "failed") {
88
- const bundle = await client.getBundle(created.runId);
89
- console.log("");
90
- console.log(renderReceipt(bundle));
91
- }
92
- });
93
- addRunOptions(program
94
- .command("continue")
95
- .description("hand local work to a governed runner")
96
- .argument("[task...]", "task prompt"))
97
- .option("--transcript <file>", "carry a session transcript as semantic state")
98
- .option("--reason <text>", "why the runtime boundary changes")
99
- .action(async (task, opts) => {
100
- const dir = resolveDir(program.opts().dir);
101
- if (!opts.agent)
102
- fail(`--agent is required (${AGENT_KINDS.join(" | ")})`);
103
- const prompt = task.join(" ").trim();
104
- if (!prompt)
105
- fail("a task prompt is required");
106
- const home = loadHome(dir);
107
- const repoDir = resolve(opts.repo);
108
- const target = targets.pool(opts.pool);
109
- const transcript = opts.transcript ? readFileSync(opts.transcript, "utf8") : undefined;
110
- const h = handoff({
111
- workspace: repoDir,
112
- plane: { url: home.config.planeUrl, adminToken: home.config.adminToken },
113
- actor: { kind: "human", id: home.config.requestedBy },
114
- agent: agentSpecFor(opts.agent),
115
- secrets: opts.secret ?? [],
116
- allowHosts: opts.allowHost ?? [],
117
- allowUntracked: opts.allowUntracked ?? []
118
- });
119
- const isolation = isolationFlag(opts.isolation);
120
- const continueOptions = {
121
- task: prompt,
122
- ...(opts.reason ? { reason: opts.reason } : {}),
123
- ...(transcript !== undefined ? { transcript } : {}),
124
- ...(isolation ? { session: isolation } : {})
125
- };
126
- if (opts.dryRun) {
127
- const { report } = await h.dryRun(target, continueOptions);
128
- console.log(renderDisclosure(report));
129
- return;
130
- }
131
- const run = await h.continueIn(target, continueOptions);
132
- console.log(`continuation ${run.envelope.envelopeId} → ${target.id} as run ${run.runId}`);
133
- if (!opts.watch)
134
- return;
135
- const outcome = await run.wait({ timeoutMs: CONTINUE_WAIT_TIMEOUT_MS });
136
- if (outcome.status === "awaiting_approval") {
137
- console.log(`awaiting approval (${outcome.consentRequirements.join("; ")}) — run: warrant approve ${run.runId}`);
138
- return;
139
- }
140
- console.log("");
141
- console.log(renderTrace(h.trace()));
142
- if (outcome.status === "completed" || outcome.status === "failed") {
143
- console.log("");
144
- console.log(renderReceipt(await run.receipt()));
145
- console.log("");
146
- console.log(`pull results: warrant pull ${run.runId}`);
147
- }
148
- });
149
- }
@@ -1,2 +0,0 @@
1
- import type { Command } from "commander";
2
- export declare function registerRunner(program: Command): void;