@growthub/cli 0.13.2 → 0.13.5

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 (42) hide show
  1. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/metadata-graph/route.js +184 -0
  2. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/refresh-sources/route.js +24 -2
  3. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/route.js +14 -0
  4. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/sandbox-agent-auth/login/route.js +74 -0
  5. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/sandbox-agent-auth/logout/route.js +67 -0
  6. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/sandbox-agent-auth/status/route.js +77 -0
  7. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/sandbox-run/route.js +72 -4
  8. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/AgentSwarmPanel.jsx +326 -0
  9. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/DataModelShell.jsx +123 -27
  10. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/OrchestrationGraphEmptyCanvas.jsx +6 -0
  11. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/OrchestrationNodeConfigPanel.jsx +224 -1
  12. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/OrchestrationRunTracePanel.jsx +754 -92
  13. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/SandboxAgentAuthPanel.jsx +224 -0
  14. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/SandboxRunPanel.jsx +32 -1
  15. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/WorkspaceGraphInspectorPanel.jsx +226 -0
  16. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/globals.css +530 -9
  17. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/page.jsx +8 -1
  18. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/integrations/page.jsx +10 -7
  19. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workflows/RunSetupPanel.jsx +261 -0
  20. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workflows/WorkflowSurface.jsx +119 -9
  21. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-builder.jsx +779 -138
  22. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-rail.jsx +91 -14
  23. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/docs/sandbox-environment-primitive.md +35 -0
  24. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/orchestration-agent-swarm.js +923 -0
  25. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/orchestration-graph-runner.js +28 -3
  26. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/orchestration-graph.js +216 -5
  27. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/orchestration-run-console.js +412 -0
  28. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/orchestration-run-inputs.js +366 -0
  29. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/orchestration-run-trace.js +34 -3
  30. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/sandbox-agent-auth-eligibility.js +50 -0
  31. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/sandbox-agent-auth-redaction.js +64 -0
  32. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/sandbox-agent-auth.js +665 -0
  33. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/sandbox-agent-host-catalog.js +168 -0
  34. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-chart-values.js +595 -0
  35. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-data-model.js +164 -7
  36. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-helper.js +11 -0
  37. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-metadata-graph.js +646 -0
  38. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-metadata-selectors.js +249 -0
  39. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-metadata-store.js +1186 -0
  40. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-schema.js +111 -1
  41. package/assets/worker-kits/growthub-custom-workspace-starter-v1/kit.json +14 -0
  42. package/package.json +1 -1
@@ -7,10 +7,33 @@ import {
7
7
  FILTER_OPERATORS,
8
8
  isApiRegistryTestSuccessful
9
9
  } from "@/lib/orchestration-graph";
10
+ import { SandboxAgentAuthPanel } from "./SandboxAgentAuthPanel.jsx";
11
+ import { isSandboxLocalAgentHost } from "@/lib/sandbox-agent-auth-eligibility";
12
+ import { HOST_AUTH_CATALOG } from "@/lib/sandbox-agent-host-catalog";
10
13
 
11
14
  const HTTP_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE"];
12
15
  const MODEL_OPTIONS = ["Claude Opus 4.6", "Claude Sonnet 4.5", "GPT-5.2", "Local agent host"];
13
16
  const OUTPUT_TYPES = ["Text", "Number", "Boolean", "JSON", "Record ID"];
17
+ const LOCAL_AGENT_ADAPTERS = [
18
+ { value: "local-process", label: "Local process" },
19
+ { value: "local-agent-host", label: "Local agent host" },
20
+ { value: "local-intelligence", label: "Local intelligence" }
21
+ ];
22
+ const EMPTY_AGENT_AUTH_PATCH = {
23
+ agentAuthStatus: "",
24
+ agentAuthProvider: "",
25
+ agentAuthLastChecked: "",
26
+ agentAuthLastExitCode: "",
27
+ agentAuthLastMessage: "",
28
+ agentAuthLastLoginUrl: ""
29
+ };
30
+
31
+ function getAgentHostOptions() {
32
+ return Object.entries(HOST_AUTH_CATALOG || {}).map(([slug, host]) => ({
33
+ value: slug,
34
+ label: host?.label || slug
35
+ }));
36
+ }
14
37
  function normalizeTags(tags) {
15
38
  return Array.from(new Set((Array.isArray(tags) ? tags : [])
16
39
  .map((tag) => String(tag || "").trim().toLowerCase())
@@ -378,6 +401,107 @@ function VersionDeltaControls({ node, config, sandboxRow, onChange, disabled })
378
401
  );
379
402
  }
380
403
 
404
+ function LocalAgentHostControls({
405
+ sandboxRow,
406
+ objectId,
407
+ rowName,
408
+ disabled,
409
+ onSandboxRowPatch
410
+ }) {
411
+ const row = sandboxRow && typeof sandboxRow === "object" ? sandboxRow : {};
412
+ const runLocality = String(row.runLocality || "local").trim().toLowerCase() === "serverless" ? "serverless" : "local";
413
+ const adapter = String(row.adapter || "local-process").trim() || "local-process";
414
+ const agentHost = String(row.agentHost || "").trim();
415
+ const hostOptions = getAgentHostOptions();
416
+ const canPatch = typeof onSandboxRowPatch === "function";
417
+
418
+ function patch(fields) {
419
+ onSandboxRowPatch?.(fields);
420
+ }
421
+
422
+ function patchWithClearedAgentAuth(fields) {
423
+ patch({ ...fields, ...EMPTY_AGENT_AUTH_PATCH });
424
+ }
425
+
426
+ return (
427
+ <div className="dm-orchestration-config__section dm-workflow-agent-runtime">
428
+ <span>Local agent runtime</span>
429
+ <div className="dm-sandbox-locality-toggle" role="group" aria-label="Run locality">
430
+ {["local", "serverless"].map((mode) => (
431
+ <button
432
+ key={mode}
433
+ type="button"
434
+ className={runLocality === mode ? "is-active" : ""}
435
+ disabled={disabled || !canPatch}
436
+ onClick={() => {
437
+ const fields = { runLocality: mode };
438
+ if (mode === "serverless" && ["local-agent-host", "local-intelligence"].includes(adapter)) {
439
+ fields.adapter = "local-process";
440
+ fields.agentHost = "";
441
+ patchWithClearedAgentAuth(fields);
442
+ return;
443
+ }
444
+ patch(fields);
445
+ }}
446
+ >
447
+ {mode === "local" ? "Local" : "Serverless"}
448
+ </button>
449
+ ))}
450
+ </div>
451
+ <p className="dm-orchestration-config__hint">
452
+ Same runtime fields as the Data Model sandbox sidecar. Local agent host uses the Paperclip thin adapter on this machine.
453
+ </p>
454
+ {runLocality === "serverless" && (
455
+ <p className="dm-orchestration-config__hint">
456
+ Serverless delegates execution to the configured scheduler/API Registry row; local CLI auth is not used.
457
+ </p>
458
+ )}
459
+ <label className="dm-orchestration-config__field">
460
+ <span>Execution adapter</span>
461
+ <select
462
+ value={adapter}
463
+ disabled={disabled || !canPatch}
464
+ onChange={(event) => {
465
+ const nextAdapter = event.target.value;
466
+ patchWithClearedAgentAuth({
467
+ adapter: nextAdapter,
468
+ agentHost: nextAdapter === "local-agent-host" ? (agentHost || "claude_local") : ""
469
+ });
470
+ }}
471
+ >
472
+ {LOCAL_AGENT_ADAPTERS.map((item) => (
473
+ <option key={item.value} value={item.value}>{item.label}</option>
474
+ ))}
475
+ </select>
476
+ </label>
477
+ {runLocality === "local" && adapter === "local-agent-host" && (
478
+ <label className="dm-orchestration-config__field">
479
+ <span>Agent host (Paperclip)</span>
480
+ <select
481
+ value={agentHost}
482
+ disabled={disabled || !canPatch}
483
+ onChange={(event) => patchWithClearedAgentAuth({ agentHost: event.target.value })}
484
+ >
485
+ <option value="">Select host...</option>
486
+ {hostOptions.map((item) => (
487
+ <option key={item.value} value={item.value}>{item.label}</option>
488
+ ))}
489
+ </select>
490
+ </label>
491
+ )}
492
+ {runLocality === "local" && adapter === "local-agent-host" && isSandboxLocalAgentHost(row) && (
493
+ <SandboxAgentAuthPanel
494
+ objectId={objectId}
495
+ rowName={rowName}
496
+ draft={row}
497
+ disabled={disabled || !canPatch}
498
+ onPatchDraft={patch}
499
+ />
500
+ )}
501
+ </div>
502
+ );
503
+ }
504
+
381
505
  export function OrchestrationNodeConfigPanel({
382
506
  node,
383
507
  onConfigChange,
@@ -386,6 +510,9 @@ export function OrchestrationNodeConfigPanel({
386
510
  registryRow,
387
511
  workspaceConfig,
388
512
  sandboxRow,
513
+ objectId,
514
+ rowName,
515
+ onSandboxRowPatch,
389
516
  activeTab: controlledTab,
390
517
  onTabChange
391
518
  }) {
@@ -770,7 +897,94 @@ export function OrchestrationNodeConfigPanel({
770
897
  </div>
771
898
  )}
772
899
 
773
- {activeTab === "configuration" && type === "ai-agent" && (
900
+ {activeTab === "configuration" && type === "ai-agent" && (config.role || config.taskPrompt || config.required != null) && (
901
+ <div className="dm-orchestration-config__pane">
902
+ <label className="dm-orchestration-config__field">
903
+ <span>Role</span>
904
+ <input
905
+ value={config.role || node.label || ""}
906
+ disabled={disabled}
907
+ onChange={(e) => patchConfig({ role: e.target.value, __nodePatch: { label: e.target.value } })}
908
+ />
909
+ </label>
910
+ <label className="dm-orchestration-config__field">
911
+ <span>Description</span>
912
+ <input
913
+ placeholder="One-sentence charter"
914
+ value={config.description || ""}
915
+ disabled={disabled}
916
+ onChange={(e) => patchConfig({ description: e.target.value })}
917
+ />
918
+ </label>
919
+ <label className="dm-orchestration-config__field">
920
+ <span>Task</span>
921
+ <textarea
922
+ rows={4}
923
+ value={config.taskPrompt || ""}
924
+ disabled={disabled}
925
+ onChange={(e) => patchConfig({ taskPrompt: e.target.value })}
926
+ />
927
+ </label>
928
+ <label className="dm-orchestration-config__field">
929
+ <span>Tools</span>
930
+ <input
931
+ placeholder="read, summarize"
932
+ value={Array.isArray(config.tools) ? config.tools.join(", ") : ""}
933
+ disabled={disabled}
934
+ onChange={(e) => patchConfig({
935
+ tools: e.target.value.split(",").map((t) => t.trim()).filter(Boolean)
936
+ })}
937
+ />
938
+ </label>
939
+ <label className="dm-orchestration-config__field">
940
+ <span>Max tokens</span>
941
+ <input
942
+ type="number"
943
+ min="0"
944
+ placeholder="0 = inherit"
945
+ value={config.maxTokens || 0}
946
+ disabled={disabled}
947
+ onChange={(e) => patchConfig({ maxTokens: Math.max(0, Number(e.target.value) || 0) })}
948
+ />
949
+ </label>
950
+ <label className="dm-orchestration-config__field">
951
+ <span>Agent host</span>
952
+ <select
953
+ value={config.agentHost || ""}
954
+ disabled={disabled}
955
+ onChange={(e) => patchConfig({ agentHost: e.target.value })}
956
+ >
957
+ <option value="">Inherit</option>
958
+ {Object.entries(HOST_AUTH_CATALOG || {}).map(([slug, host]) => (
959
+ <option key={slug} value={slug}>{host?.label || slug}</option>
960
+ ))}
961
+ </select>
962
+ </label>
963
+ <label className="dm-orchestration-config__field dm-orchestration-config__field-inline">
964
+ <input
965
+ type="checkbox"
966
+ checked={config.required !== false}
967
+ disabled={disabled}
968
+ onChange={(e) => patchConfig({ required: e.target.checked })}
969
+ />
970
+ <span>Required</span>
971
+ </label>
972
+ <label
973
+ className="dm-orchestration-config__field dm-orchestration-config__field-inline"
974
+ title="Network is granted only when both this and the row's networkAllow are on."
975
+ >
976
+ <input
977
+ type="checkbox"
978
+ checked={config.networkAccess === true}
979
+ disabled={disabled}
980
+ onChange={(e) => patchConfig({ networkAccess: e.target.checked })}
981
+ />
982
+ <span>Network</span>
983
+ </label>
984
+ </div>
985
+ )}
986
+
987
+ {activeTab === "configuration" && type === "ai-agent" && !(config.role || config.taskPrompt || config.required != null) && (
774
988
  <div className="dm-orchestration-config__pane">
775
989
  <label className="dm-orchestration-config__field">
776
990
  <span>Model</span>
@@ -778,6 +992,15 @@ export function OrchestrationNodeConfigPanel({
778
992
  {MODEL_OPTIONS.map((model) => <option key={model} value={model}>{model}</option>)}
779
993
  </select>
780
994
  </label>
995
+ {(config.model || MODEL_OPTIONS[0]) === "Local agent host" && (
996
+ <LocalAgentHostControls
997
+ sandboxRow={sandboxRow}
998
+ objectId={objectId}
999
+ rowName={rowName}
1000
+ disabled={disabled}
1001
+ onSandboxRowPatch={onSandboxRowPatch}
1002
+ />
1003
+ )}
781
1004
  <label className="dm-orchestration-config__field">
782
1005
  <span>Input prompt</span>
783
1006
  <textarea