@growthub/cli 0.13.5 → 0.13.7

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 (39) hide show
  1. package/assets/worker-kits/growthub-custom-workspace-starter-v1/QUICKSTART.md +19 -0
  2. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/.env.example +8 -0
  3. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/README.md +4 -0
  4. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/integrations/nango/action/execute/route.js +60 -0
  5. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/integrations/nango/actions/route.js +50 -0
  6. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/integrations/nango/connect-session/route.js +68 -0
  7. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/integrations/nango/connection-status/route.js +56 -0
  8. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/integrations/nango/proxy/route.js +67 -0
  9. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/integrations/nango/status/route.js +50 -0
  10. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/metadata-graph/route.js +1 -0
  11. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/components/WorkspaceActivationPanel.jsx +172 -0
  12. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/DataModelShell.jsx +161 -50
  13. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/NangoConnectionPanel.jsx +531 -0
  14. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/globals.css +274 -18
  15. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/integrations/nango/page.jsx +167 -0
  16. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/integrations/page.jsx +1 -0
  17. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workflows/WorkflowSurface.jsx +62 -7
  18. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-builder.jsx +554 -48
  19. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-rail.jsx +24 -14
  20. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/env.js +7 -0
  21. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/nango/index.js +38 -0
  22. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/nango/nango-adapter.js +552 -0
  23. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/nango/nango-config-loader.js +202 -0
  24. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/nango/nango-schema.js +303 -0
  25. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/resolver-loader.js +49 -10
  26. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/source-resolver-registry.js +1 -1
  27. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/nango.js +49 -0
  28. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/template-registry.js +4 -2
  29. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/orchestration-graph.js +2 -2
  30. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-activation.js +534 -0
  31. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-data-model.js +3 -1
  32. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-metadata-store.js +82 -0
  33. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-schema.js +102 -3
  34. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/package.json +1 -0
  35. package/assets/worker-kits/growthub-custom-workspace-starter-v1/bundles/growthub-custom-workspace-starter-v1.json +1 -0
  36. package/assets/worker-kits/growthub-custom-workspace-starter-v1/kit.json +5 -0
  37. package/assets/worker-kits/growthub-custom-workspace-starter-v1/templates/seeded-configs/project-management.config.json +276 -0
  38. package/dist/index.js +127 -44
  39. package/package.json +1 -1
@@ -51,6 +51,7 @@ import { AgentSwarmPanel } from "../data-model/components/AgentSwarmPanel.jsx";
51
51
  import { RunSetupPanel } from "./RunSetupPanel.jsx";
52
52
  import { describeRunInputMetadataItems, discoverRunInputSchema } from "@/lib/orchestration-run-inputs";
53
53
  import { selectWorkflowNodeInputSchema } from "@/lib/workspace-metadata-selectors";
54
+ import { deriveProvenance, hasConnectionId } from "@/lib/workspace-activation";
54
55
 
55
56
  // Workspace Metadata Graph V1 — read-only dependency metadata for workflow
56
57
  // sidecars. The runtime path (sandbox-run, publish, draft/live) is
@@ -62,7 +63,7 @@ const WORKFLOW_METADATA_SELECTORS = Object.freeze({
62
63
  });
63
64
 
64
65
  function resolveRegistryRowForSandbox(workspaceConfig, sandboxRow) {
65
- const graph = parseOrchestrationGraph(sandboxRow?.orchestrationGraph);
66
+ const graph = parseOrchestrationGraph(sandboxRow?.orchestrationConfig || sandboxRow?.orchestrationGraph);
66
67
  const apiNode = graph?.nodes?.find((n) => n?.type === "api-registry-call");
67
68
  const registryId = String(
68
69
  apiNode?.config?.registryId || apiNode?.config?.integrationId || sandboxRow?.schedulerRegistryId || ""
@@ -291,6 +292,10 @@ function isPassingRun(payload) {
291
292
  return payload?.ok === true && Number(payload?.exitCode ?? payload?.response?.exitCode) === 0;
292
293
  }
293
294
 
295
+ function graphHasNodes(graph) {
296
+ return Array.isArray(graph?.nodes) && graph.nodes.length > 0;
297
+ }
298
+
294
299
  function WorkflowAddStepPanel({ target, onSelect }) {
295
300
  return (
296
301
  <div className="dm-workflow-add-panel">
@@ -323,7 +328,7 @@ export default function WorkflowSurface() {
323
328
  const searchParams = useSearchParams();
324
329
  const objectId = String(searchParams.get("object") || "").trim();
325
330
  const rowId = String(searchParams.get("row") || "").trim();
326
- const fieldName = String(searchParams.get("field") || "orchestrationGraph").trim();
331
+ const fieldName = String(searchParams.get("field") || "orchestrationConfig").trim();
327
332
  const runId = String(searchParams.get("run") || "").trim();
328
333
 
329
334
  const [workspaceConfig, setWorkspaceConfig] = useState(null);
@@ -369,24 +374,58 @@ export default function WorkflowSurface() {
369
374
  );
370
375
 
371
376
  const sandboxRow = resolved.row;
372
- const effectiveFieldName = sandboxRow?.[fieldName] !== undefined
377
+ const hasGraphValue = (value) => Boolean(parseOrchestrationGraph(value));
378
+ const effectiveFieldName = hasGraphValue(sandboxRow?.[fieldName])
373
379
  ? fieldName
374
- : sandboxRow?.orchestrationConfig !== undefined
380
+ : hasGraphValue(sandboxRow?.orchestrationConfig)
375
381
  ? "orchestrationConfig"
376
- : "orchestrationGraph";
382
+ : hasGraphValue(sandboxRow?.orchestrationGraph)
383
+ ? "orchestrationGraph"
384
+ : (fieldName || "orchestrationConfig");
377
385
  const draftFieldName = effectiveFieldName === "orchestrationConfig" ? "orchestrationDraftConfig" : "orchestrationDraftGraph";
378
386
  const registryRow = useMemo(
379
387
  () => (sandboxRow && workspaceConfig ? resolveRegistryRowForSandbox(workspaceConfig, sandboxRow) : null),
380
388
  [workspaceConfig, sandboxRow]
381
389
  );
382
390
 
391
+ // Template-aware activation banner. When the active workflow belongs to
392
+ // a seeded template (project-management today) and its provider row
393
+ // doesn't have a connectionId yet, surface a back-link to the API
394
+ // Registry / Nango panel so the user can finish setup without hunting
395
+ // through Data Model surfaces.
396
+ const templateBanner = useMemo(() => {
397
+ if (!workspaceConfig) return null;
398
+ const provenance = deriveProvenance(workspaceConfig);
399
+ if (provenance.template !== "project-management") return null;
400
+ if (!registryRow) return null;
401
+ const ready = hasConnectionId(registryRow);
402
+ const apiRegistryObjectId = String(
403
+ (Array.isArray(workspaceConfig?.dataModel?.objects)
404
+ ? workspaceConfig.dataModel.objects.find((o) => o?.objectType === "api-registry")?.id
405
+ : "") || ""
406
+ );
407
+ const apiRegistryRowId = String(registryRow.integrationId || "").trim();
408
+ const backHref = apiRegistryObjectId && apiRegistryRowId
409
+ ? `/data-model?object=${encodeURIComponent(apiRegistryObjectId)}&row=${encodeURIComponent(apiRegistryRowId)}`
410
+ : "/data-model";
411
+ return {
412
+ ready,
413
+ backHref,
414
+ providerConfigKey: String(registryRow.providerConfigKey || registryRow.integrationId || "").trim(),
415
+ };
416
+ }, [workspaceConfig, registryRow]);
417
+
383
418
  useEffect(() => {
384
419
  setSidecarMode(runId ? "trace" : "graph");
385
420
  }, [runId]);
386
421
 
387
422
  useEffect(() => {
388
423
  if (!sandboxRow) return;
389
- const parsed = parseOrchestrationGraph(sandboxRow[draftFieldName]) || parseOrchestrationGraph(sandboxRow[effectiveFieldName]);
424
+ const draftParsed = parseOrchestrationGraph(sandboxRow[draftFieldName]);
425
+ const publishedParsed = parseOrchestrationGraph(sandboxRow[effectiveFieldName])
426
+ || parseOrchestrationGraph(sandboxRow.orchestrationConfig)
427
+ || parseOrchestrationGraph(sandboxRow.orchestrationGraph);
428
+ const parsed = graphHasNodes(draftParsed) || !graphHasNodes(publishedParsed) ? draftParsed : publishedParsed;
390
429
  setOrchestrationGraph(parsed);
391
430
  setDirty(false);
392
431
  setGraphError("");
@@ -760,7 +799,7 @@ export default function WorkflowSurface() {
760
799
  const publishReady = draftPassed && String(sandboxRow?.orchestrationDraftTestedConfig || "") === currentGraphSerialized && !dirty;
761
800
  const savedDraftValue = String(sandboxRow?.[draftFieldName] || "").trim();
762
801
  const draftStatus = String(sandboxRow?.orchestrationDraftStatus || "").trim();
763
- const hasSavedDraft = Boolean(savedDraftValue) && draftStatus !== "published";
802
+ const hasSavedDraft = Boolean(savedDraftValue) && draftStatus !== "published" && graphHasNodes(parseOrchestrationGraph(savedDraftValue));
764
803
  const isDraftMode = dirty || hasSavedDraft;
765
804
  const canTest = !graphUnset && !graphBlankShell && Boolean(sandboxRow) && !Boolean(graphError);
766
805
  const showDiscardDraft = isDraftMode;
@@ -865,6 +904,22 @@ export default function WorkflowSurface() {
865
904
  </div>
866
905
  </header>
867
906
 
907
+ {templateBanner ? (
908
+ <div
909
+ className={"workspace-template-context-banner" + (templateBanner.ready ? "" : " is-warn")}
910
+ role="note"
911
+ >
912
+ <span>
913
+ {templateBanner.ready
914
+ ? `Provider connected via Nango${templateBanner.providerConfigKey ? ` (${templateBanner.providerConfigKey})` : ""}. Ready to run.`
915
+ : "Connect your provider through Nango before running this workflow."}
916
+ </span>
917
+ <Link href={templateBanner.backHref} className="workspace-template-context-link">
918
+ <span>{templateBanner.ready ? "Manage connection" : "Open Nango panel"}</span>
919
+ </Link>
920
+ </div>
921
+ ) : null}
922
+
868
923
  {loading ? (
869
924
  <p className="dm-workflow-empty">Loading workflow…</p>
870
925
  ) : error ? (