@circuitwall/jarela 1.9.1 → 1.9.3

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 (72) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +2 -2
  3. package/.next/standalone/.next/build-manifest.json +2 -2
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  6. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  16. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  17. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  18. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  19. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  20. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  21. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  22. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  23. package/.next/standalone/.next/server/app/page.js +3989 -3805
  24. package/.next/standalone/.next/server/app/page.js.map +1 -1
  25. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app-paths-manifest.json +2 -2
  28. package/.next/standalone/.next/server/chunks/1813.js.map +1 -1
  29. package/.next/standalone/.next/server/chunks/319.js.map +1 -1
  30. package/.next/standalone/.next/server/chunks/4045.js.map +1 -1
  31. package/.next/standalone/.next/server/chunks/4741.js.map +1 -1
  32. package/.next/standalone/.next/server/middleware-build-manifest.js +2 -2
  33. package/.next/standalone/.next/server/pages/404.html +2 -2
  34. package/.next/standalone/.next/server/pages/500.html +1 -1
  35. package/.next/standalone/.next/server/proxy.js.map +1 -1
  36. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  37. package/.next/standalone/.next/static/chunks/2747-4a6287cacd57d231.js.map +1 -1
  38. package/.next/standalone/.next/static/chunks/3457-6d51726379cee3b7.js.map +1 -1
  39. package/.next/standalone/.next/static/chunks/{1998-31a617131197a83a.js → 962-fe2372e00f85e23a.js} +111 -2
  40. package/.next/standalone/.next/static/chunks/962-fe2372e00f85e23a.js.map +1 -0
  41. package/.next/standalone/.next/static/chunks/app/layout-84c6f211a7a1ca36.js.map +1 -1
  42. package/.next/standalone/.next/static/chunks/app/{page-cd662565eba5ef59.js → page-c5b9f4407416c3f9.js} +3493 -3390
  43. package/.next/standalone/.next/static/chunks/app/page-c5b9f4407416c3f9.js.map +1 -0
  44. package/.next/standalone/.next/static/chunks/main-3eb94471f04b2368.js.map +1 -1
  45. package/.next/standalone/.next/static/css/b8e04d59a2bfff04.css +5 -0
  46. package/.next/standalone/.next/static/css/b8e04d59a2bfff04.css.map +1 -0
  47. package/.next/standalone/package.json +1 -1
  48. package/CHANGELOG.md +47 -0
  49. package/README.md +6 -6
  50. package/components/agents/agent-editor/VoiceFields.tsx +1 -1
  51. package/components/credentials/AddCredentialDialog.tsx +30 -141
  52. package/components/credentials/CredentialsPanel.tsx +146 -49
  53. package/components/{integrations/IntegrationsPanel.tsx → credentials/IntegrationCard.tsx} +9 -168
  54. package/components/documents/AddSourceForm.tsx +4 -4
  55. package/components/documents/DocumentsPanel.tsx +1 -1
  56. package/components/integrations/NetworkPanel.tsx +104 -0
  57. package/components/layout/AppShell.tsx +6 -0
  58. package/components/layout/MenuPanel.tsx +15 -91
  59. package/components/profile/ProfileEditor.tsx +1 -1
  60. package/components/proposals/ApprovalsBanner.tsx +2 -2
  61. package/components/settings/AppearancePanel.tsx +93 -0
  62. package/components/settings/SettingsPanel.tsx +94 -0
  63. package/contexts/AppContext.tsx +1 -1
  64. package/hooks/useUrlSync.ts +1 -1
  65. package/lib/ui/navigate.ts +1 -1
  66. package/package.json +1 -1
  67. package/.next/standalone/.next/static/chunks/1998-31a617131197a83a.js.map +0 -1
  68. package/.next/standalone/.next/static/chunks/app/page-cd662565eba5ef59.js.map +0 -1
  69. package/.next/standalone/.next/static/css/11aaed27d2989cc1.css +0 -5
  70. package/.next/standalone/.next/static/css/11aaed27d2989cc1.css.map +0 -1
  71. /package/.next/standalone/.next/static/{tTk-KuLcT7O-E0z6PdMmO → EOkgU73YJOpR-vFcKMgL0}/_buildManifest.js +0 -0
  72. /package/.next/standalone/.next/static/{tTk-KuLcT7O-E0z6PdMmO → EOkgU73YJOpR-vFcKMgL0}/_ssgManifest.js +0 -0
@@ -0,0 +1,94 @@
1
+ "use client";
2
+ import { Cpu, Globe, Key, Palette, ScrollText, ServerCog, Shapes } from "lucide-react";
3
+ import { useAppContext } from "@/contexts/AppContext";
4
+ import { CredentialsListPanel } from "@/components/credentials/CredentialsPanel";
5
+ import { NetworkPanel } from "@/components/integrations/NetworkPanel";
6
+ import { ModelsPanel } from "@/components/models/ModelsPanel";
7
+ import { HarnessPanel } from "@/components/harness/HarnessPanel";
8
+ import { LogsPanel } from "@/components/logs/LogsPanel";
9
+ import { EnvVarsPanel } from "@/components/env/EnvVarsPanel";
10
+ import { AppearancePanel } from "./AppearancePanel";
11
+
12
+ // Settings is the consolidated home for everything that used to live as
13
+ // its own top-level tab (credentials, models, harness, logs, defaults)
14
+ // plus appearance/networking. The individual Tab values still exist so
15
+ // deep links like ?tab=credentials and ?tab=models keep working — this
16
+ // surface is the new top-of-funnel for menu navigation.
17
+
18
+ type Sub =
19
+ | "appearance"
20
+ | "networking"
21
+ | "credentials"
22
+ | "models"
23
+ | "harness"
24
+ | "logs"
25
+ | "defaults";
26
+
27
+ const SUBS: ReadonlyArray<{ id: Sub; label: string; icon: React.ReactNode; advancedOnly?: boolean }> = [
28
+ { id: "appearance", label: "Appearance", icon: <Palette size={13} /> },
29
+ { id: "networking", label: "Networking", icon: <Globe size={13} /> },
30
+ { id: "credentials", label: "Credentials", icon: <Key size={13} /> },
31
+ { id: "models", label: "Models", icon: <Cpu size={13} /> },
32
+ { id: "harness", label: "Harness", icon: <Shapes size={13} />, advancedOnly: true },
33
+ { id: "logs", label: "Logs", icon: <ScrollText size={13} />, advancedOnly: true },
34
+ { id: "defaults", label: "Defaults", icon: <ServerCog size={13} />, advancedOnly: true },
35
+ ];
36
+
37
+ const VALID = new Set<Sub>(SUBS.map((s) => s.id));
38
+
39
+ function parseSub(raw: string | undefined): Sub {
40
+ if (raw && VALID.has(raw as Sub)) return raw as Sub;
41
+ return "appearance";
42
+ }
43
+
44
+ export function SettingsPanel() {
45
+ const { state, dispatch } = useAppContext();
46
+ const isFullMode = state.experienceMode === "full";
47
+ const active = parseSub(state.selectedItem.settings);
48
+
49
+ const setSub = (s: Sub) =>
50
+ dispatch({ type: "SET_SELECTION", tab: "settings", itemId: s });
51
+
52
+ const visibleSubs = SUBS.filter((s) => isFullMode || !s.advancedOnly);
53
+
54
+ return (
55
+ <div className="flex flex-col h-full min-h-0">
56
+ <div
57
+ role="tablist"
58
+ aria-label="Settings sub-section"
59
+ className="flex gap-1 border-b border-[var(--border)] bg-[var(--bg-secondary)] px-3 pt-2 overflow-x-auto"
60
+ >
61
+ {visibleSubs.map((s) => {
62
+ const selected = s.id === active;
63
+ return (
64
+ <button
65
+ key={s.id}
66
+ role="tab"
67
+ type="button"
68
+ aria-selected={selected}
69
+ onClick={() => setSub(s.id)}
70
+ className={
71
+ "inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-t-md border-b-2 -mb-px transition-colors whitespace-nowrap " +
72
+ (selected
73
+ ? "border-[var(--accent)] text-[var(--text-primary)] bg-[var(--bg-primary)]"
74
+ : "border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)]")
75
+ }
76
+ >
77
+ <span className="text-fg-subtle">{s.icon}</span>
78
+ <span>{s.label}</span>
79
+ </button>
80
+ );
81
+ })}
82
+ </div>
83
+ <div className="flex-1 min-h-0 overflow-hidden">
84
+ {active === "appearance" && <AppearancePanel />}
85
+ {active === "networking" && <NetworkPanel />}
86
+ {active === "credentials" && <CredentialsListPanel />}
87
+ {active === "models" && <ModelsPanel />}
88
+ {active === "harness" && <HarnessPanel />}
89
+ {active === "logs" && <LogsPanel />}
90
+ {active === "defaults" && <EnvVarsPanel />}
91
+ </div>
92
+ </div>
93
+ );
94
+ }
@@ -13,7 +13,7 @@ function parseStoredMode(raw: string | null): ExperienceMode | null {
13
13
  return null;
14
14
  }
15
15
 
16
- export type Tab = "chat" | "dashboard" | "agents" | "memory" | "documents" | "models" | "credentials" | "mcp" | "extensions" | "tools" | "tasks" | "bridges" | "profile" | "harness" | "logs" | "env";
16
+ export type Tab = "chat" | "dashboard" | "agents" | "memory" | "documents" | "models" | "credentials" | "mcp" | "extensions" | "tools" | "tasks" | "bridges" | "profile" | "harness" | "logs" | "env" | "settings";
17
17
 
18
18
  interface AppState {
19
19
  activeThreadId: string | null;
@@ -15,7 +15,7 @@ import { useEffect, useRef } from "react";
15
15
  import { useAppContext, type Tab } from "@/contexts/AppContext";
16
16
  import { buildHref, parseHref } from "@/lib/ui/navigate";
17
17
 
18
- const TABS: Tab[] = ["chat", "dashboard", "agents", "memory", "documents", "models", "credentials", "mcp", "extensions", "tools", "tasks", "bridges", "profile", "harness"];
18
+ const TABS: Tab[] = ["chat", "dashboard", "agents", "memory", "documents", "models", "credentials", "mcp", "extensions", "tools", "tasks", "bridges", "profile", "harness", "settings"];
19
19
 
20
20
  export function useUrlSync() {
21
21
  const { state, dispatch } = useAppContext();
@@ -18,7 +18,7 @@ export interface ParsedHref {
18
18
  external: boolean;
19
19
  }
20
20
 
21
- const TABS: Tab[] = ["chat", "dashboard", "agents", "memory", "models", "credentials", "mcp", "extensions", "tools", "tasks", "bridges", "profile", "harness", "documents"];
21
+ const TABS: Tab[] = ["chat", "dashboard", "agents", "memory", "models", "credentials", "mcp", "extensions", "tools", "tasks", "bridges", "profile", "harness", "documents", "settings"];
22
22
 
23
23
  export function parseHref(input: string | null | undefined): ParsedHref {
24
24
  if (!input) return { external: false };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@circuitwall/jarela",
3
- "version": "1.9.1",
3
+ "version": "1.9.3",
4
4
  "description": "Jarela — local chat interface for LangGraph agents (multi-provider, single-process, SQLite-backed).",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Andrew Ge Wu",