@growthub/cli 0.9.18 → 0.10.1
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.
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/reference-options/route.js +62 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/refresh-sources/route.js +13 -2
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/resolver-templates/route.js +23 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/sandbox-run/route.js +35 -5
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/test-source/route.js +15 -1
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/DataModelShell.jsx +2277 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/DataTable.jsx +1 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/FieldEditor.jsx +1 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/FieldManager.jsx +9 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/ObjectSidebar.jsx +41 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/RecordDrawer.jsx +1 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/ReferencePicker.jsx +244 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/SandboxRunPanel.jsx +21 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/SourceTestPanel.jsx +15 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/StatusPill.jsx +13 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/ToggleField.jsx +41 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/dm-shared.jsx +99 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/page.jsx +2 -1528
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/globals.css +99 -6
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/docs/connector-template-authoring.md +8 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/docs/data-model-reference-fields.md +15 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/docs/mcp-chrome-tool-connectors.md +12 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/docs/resolver-template-library.md +17 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/source-resolver-registry.js +13 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/README.md +12 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/chrome-bridge.js +22 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/custom-http.js +23 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/generic-commerce.js +22 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/generic-crm.js +23 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/generic-project-management.js +22 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/generic-spreadsheet.js +22 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/mcp-tool.js +22 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/template-registry.js +50 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/webhook.js +22 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/references/collect-reference-options.js +133 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/references/reference-resolver-registry.js +17 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/references/resolver-loader.js +6 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/references/resolvers/README.md +8 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/references/resolvers/local-data-model.js +11 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/references/resolvers/source-records.js +34 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/sandboxes/adapters/README.md +5 -3
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/sandboxes/default-local-intelligence.js +203 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/sandboxes/index.js +1 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/data-model/field-contracts.js +81 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/data-model/reference-option-schema.js +59 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/data-model/reference-options.js +29 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-data-model.js +534 -23
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-schema.js +131 -1
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/helpers/export-training-traces.mjs +144 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/helpers/grade-raw-pairs.mjs +279 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/helpers/harvest-cursor-traces.mjs +288 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/helpers/upload-graded-traces.mjs +128 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/kit.json +10 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/templates/seeded-configs/alignment-loop.config.json +264 -0
- package/dist/index.js +486 -1
- package/package.json +1 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POST /api/workspace/reference-options
|
|
3
|
+
*
|
|
4
|
+
* Lazy, status-aware reference picker backing store. No provider tokens in/out.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { NextResponse } from "next/server";
|
|
8
|
+
import { readWorkspaceConfig } from "@/lib/workspace-config";
|
|
9
|
+
import { validateReferenceOptionsRequest } from "@/lib/data-model/reference-option-schema";
|
|
10
|
+
import { collectReferenceOptions } from "@/lib/adapters/references/collect-reference-options";
|
|
11
|
+
|
|
12
|
+
async function POST(request) {
|
|
13
|
+
let body;
|
|
14
|
+
try {
|
|
15
|
+
body = await request.json();
|
|
16
|
+
} catch {
|
|
17
|
+
return NextResponse.json({ ok: false, error: "invalid JSON body" }, { status: 400 });
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const parsed = validateReferenceOptionsRequest(body);
|
|
21
|
+
if (!parsed.ok) {
|
|
22
|
+
return NextResponse.json(
|
|
23
|
+
{ ok: false, error: parsed.errors.join("; ") },
|
|
24
|
+
{ status: 400 }
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
let workspaceConfig;
|
|
29
|
+
try {
|
|
30
|
+
workspaceConfig = await readWorkspaceConfig();
|
|
31
|
+
} catch (err) {
|
|
32
|
+
return NextResponse.json(
|
|
33
|
+
{ ok: false, error: `failed to read workspace config: ${err.message}` },
|
|
34
|
+
{ status: 500 }
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const result = await collectReferenceOptions(workspaceConfig, parsed.value);
|
|
39
|
+
if (!result.ok) {
|
|
40
|
+
return NextResponse.json(
|
|
41
|
+
{
|
|
42
|
+
ok: false,
|
|
43
|
+
options: [],
|
|
44
|
+
nextCursor: null,
|
|
45
|
+
reason: result.reason,
|
|
46
|
+
error: result.error || "reference resolution failed"
|
|
47
|
+
},
|
|
48
|
+
{ status: 400 }
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return NextResponse.json({
|
|
53
|
+
ok: true,
|
|
54
|
+
options: result.options,
|
|
55
|
+
nextCursor: result.nextCursor ?? null,
|
|
56
|
+
reason: result.reason ?? null,
|
|
57
|
+
total: result.total,
|
|
58
|
+
resolverIntegrationId: result.resolverIntegrationId
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { POST };
|
|
@@ -82,29 +82,34 @@ async function POST(request) {
|
|
|
82
82
|
|
|
83
83
|
const refreshed = [];
|
|
84
84
|
const skipped = [];
|
|
85
|
+
const skippedDetail = [];
|
|
85
86
|
|
|
86
87
|
for (const sourceId of sourceIds) {
|
|
87
88
|
const obj = dataObjects.find((o) => o.id === sourceId);
|
|
88
89
|
if (!obj) {
|
|
89
90
|
skipped.push(sourceId);
|
|
91
|
+
skippedDetail.push({ sourceId, reason: "unknown-object" });
|
|
90
92
|
continue;
|
|
91
93
|
}
|
|
92
94
|
|
|
93
95
|
const binding = obj.binding;
|
|
94
96
|
if (!binding || binding.sourceStorage !== "workspace-source-records") {
|
|
95
97
|
skipped.push(sourceId);
|
|
98
|
+
skippedDetail.push({ sourceId, reason: "not-live-backed" });
|
|
96
99
|
continue;
|
|
97
100
|
}
|
|
98
101
|
|
|
99
102
|
const integrationId = binding.integrationId;
|
|
100
103
|
if (!integrationId) {
|
|
101
104
|
skipped.push(sourceId);
|
|
105
|
+
skippedDetail.push({ sourceId, reason: "missing-integration-id" });
|
|
102
106
|
continue;
|
|
103
107
|
}
|
|
104
108
|
|
|
105
109
|
const resolver = getSourceResolver(integrationId);
|
|
106
110
|
if (!resolver) {
|
|
107
111
|
skipped.push(sourceId);
|
|
112
|
+
skippedDetail.push({ sourceId, reason: "missing-resolver", integrationId });
|
|
108
113
|
continue;
|
|
109
114
|
}
|
|
110
115
|
|
|
@@ -116,12 +121,18 @@ async function POST(request) {
|
|
|
116
121
|
const fetchedAt = new Date().toISOString();
|
|
117
122
|
await writeWorkspaceSourceRecords(sourceId, records, { integrationId, fetchedAt });
|
|
118
123
|
refreshed.push({ sourceId, integrationId, recordCount: records.length, fetchedAt });
|
|
119
|
-
} catch {
|
|
124
|
+
} catch (err) {
|
|
120
125
|
skipped.push(sourceId);
|
|
126
|
+
skippedDetail.push({
|
|
127
|
+
sourceId,
|
|
128
|
+
reason: "fetch-error",
|
|
129
|
+
integrationId,
|
|
130
|
+
message: err?.message || "fetchRecords failed"
|
|
131
|
+
});
|
|
121
132
|
}
|
|
122
133
|
}
|
|
123
134
|
|
|
124
|
-
return NextResponse.json({ refreshed, skipped });
|
|
135
|
+
return NextResponse.json({ refreshed, skipped, skippedDetail });
|
|
125
136
|
}
|
|
126
137
|
|
|
127
138
|
export { POST };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /api/workspace/resolver-templates
|
|
3
|
+
*
|
|
4
|
+
* Lists built-in resolver / connector templates (metadata only).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { NextResponse } from "next/server";
|
|
8
|
+
import { listResolverTemplates, getResolverTemplate } from "@/lib/adapters/integrations/templates/template-registry";
|
|
9
|
+
|
|
10
|
+
async function GET(request) {
|
|
11
|
+
const { searchParams } = new URL(request.url);
|
|
12
|
+
const id = searchParams.get("templateId");
|
|
13
|
+
if (id) {
|
|
14
|
+
const one = getResolverTemplate(id);
|
|
15
|
+
if (!one) {
|
|
16
|
+
return NextResponse.json({ ok: false, error: "template not found" }, { status: 404 });
|
|
17
|
+
}
|
|
18
|
+
return NextResponse.json({ ok: true, template: one });
|
|
19
|
+
}
|
|
20
|
+
return NextResponse.json({ ok: true, templates: listResolverTemplates() });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { GET };
|
|
@@ -344,9 +344,10 @@ function buildRunResponse({
|
|
|
344
344
|
networkAllow,
|
|
345
345
|
allowList,
|
|
346
346
|
result,
|
|
347
|
-
timeoutMs
|
|
347
|
+
timeoutMs,
|
|
348
|
+
row
|
|
348
349
|
}) {
|
|
349
|
-
|
|
350
|
+
const base = {
|
|
350
351
|
runId,
|
|
351
352
|
ranAt,
|
|
352
353
|
runLocality,
|
|
@@ -370,6 +371,14 @@ function buildRunResponse({
|
|
|
370
371
|
allowList,
|
|
371
372
|
adapterMeta: result.adapterMeta || null
|
|
372
373
|
};
|
|
374
|
+
if (row && (row.resolverTemplateId || row.connectorKind || row.executionLane)) {
|
|
375
|
+
base.templateTrace = {
|
|
376
|
+
resolverTemplateId: row.resolverTemplateId ? String(row.resolverTemplateId) : null,
|
|
377
|
+
connectorKind: row.connectorKind ? String(row.connectorKind) : null,
|
|
378
|
+
executionLane: row.executionLane ? String(row.executionLane) : null
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
return base;
|
|
373
382
|
}
|
|
374
383
|
|
|
375
384
|
function findSandboxRow(workspaceConfig, objectId, name) {
|
|
@@ -442,6 +451,18 @@ async function POST(request) {
|
|
|
442
451
|
const agentCommand = instructions
|
|
443
452
|
? `Instructions:\n${instructions}\n\nPrompt:\n${command}`
|
|
444
453
|
: command;
|
|
454
|
+
const intelligenceSandbox =
|
|
455
|
+
adapterId === "local-intelligence"
|
|
456
|
+
? {
|
|
457
|
+
userIntent: agentCommand,
|
|
458
|
+
localModel: typeof row.localModel === "string" ? row.localModel.trim() : "",
|
|
459
|
+
localEndpoint: typeof row.localEndpoint === "string" ? row.localEndpoint.trim() : "",
|
|
460
|
+
intelligenceAdapterMode:
|
|
461
|
+
typeof row.intelligenceAdapterMode === "string"
|
|
462
|
+
? row.intelligenceAdapterMode.trim().toLowerCase()
|
|
463
|
+
: "ollama",
|
|
464
|
+
}
|
|
465
|
+
: undefined;
|
|
445
466
|
const lifecycleStatus = String(row.lifecycleStatus || "draft").trim().toLowerCase() === "live" ? "live" : "draft";
|
|
446
467
|
const version = row.version ?? "";
|
|
447
468
|
const requestedTimeout = Number(row.timeoutMs);
|
|
@@ -449,6 +470,13 @@ async function POST(request) {
|
|
|
449
470
|
? Math.min(requestedTimeout, SANDBOX_MAX_TIMEOUT_MS)
|
|
450
471
|
: SANDBOX_DEFAULT_TIMEOUT_MS;
|
|
451
472
|
|
|
473
|
+
if (runLocality === "serverless" && adapterId === "local-intelligence") {
|
|
474
|
+
return NextResponse.json({
|
|
475
|
+
ok: false,
|
|
476
|
+
error: "`local-intelligence` applies only when runLocality is local. Switch run locality or choose a process adapter for serverless delegation.",
|
|
477
|
+
}, { status: 400 });
|
|
478
|
+
}
|
|
479
|
+
|
|
452
480
|
if (runLocality === "serverless" && adapterId === "local-agent-host") {
|
|
453
481
|
return NextResponse.json({
|
|
454
482
|
ok: false,
|
|
@@ -522,7 +550,7 @@ async function POST(request) {
|
|
|
522
550
|
name: row.Name || name,
|
|
523
551
|
runtime,
|
|
524
552
|
agentHost,
|
|
525
|
-
command: adapterId === "local-agent-host" ? agentCommand : command,
|
|
553
|
+
command: adapterId === "local-agent-host" || adapterId === "local-intelligence" ? agentCommand : command,
|
|
526
554
|
timeoutMs,
|
|
527
555
|
networkAllow,
|
|
528
556
|
allowList,
|
|
@@ -530,7 +558,8 @@ async function POST(request) {
|
|
|
530
558
|
envRefSlugs,
|
|
531
559
|
envRefsMissing,
|
|
532
560
|
workdir,
|
|
533
|
-
ranAt
|
|
561
|
+
ranAt,
|
|
562
|
+
...(intelligenceSandbox ? { intelligenceSandbox } : {}),
|
|
534
563
|
});
|
|
535
564
|
} catch (error) {
|
|
536
565
|
result = {
|
|
@@ -564,7 +593,8 @@ async function POST(request) {
|
|
|
564
593
|
networkAllow,
|
|
565
594
|
allowList,
|
|
566
595
|
result,
|
|
567
|
-
timeoutMs
|
|
596
|
+
timeoutMs,
|
|
597
|
+
row
|
|
568
598
|
});
|
|
569
599
|
|
|
570
600
|
const sourceId = sandboxRunSourceId(objectId, row.Name || name);
|
|
@@ -117,13 +117,27 @@ async function POST(request) {
|
|
|
117
117
|
const columns = inferColumns(records);
|
|
118
118
|
const preview = records.slice(0, PREVIEW_ROW_LIMIT);
|
|
119
119
|
|
|
120
|
+
const resolverMeta = {
|
|
121
|
+
entityTypes: Array.isArray(resolver.entityTypes) ? resolver.entityTypes : [],
|
|
122
|
+
configSchema: Array.isArray(resolver.configSchema) ? resolver.configSchema : null,
|
|
123
|
+
hasListEntities: typeof resolver.listEntities === "function",
|
|
124
|
+
connectorKind: typeof resolver.connectorKind === "string" ? resolver.connectorKind : null,
|
|
125
|
+
templateId: typeof resolver.templateId === "string" ? resolver.templateId : null,
|
|
126
|
+
capabilities: Array.isArray(resolver.capabilities) ? resolver.capabilities : null,
|
|
127
|
+
referenceSchema:
|
|
128
|
+
resolver.referenceSchema && typeof resolver.referenceSchema === "object" && !Array.isArray(resolver.referenceSchema)
|
|
129
|
+
? resolver.referenceSchema
|
|
130
|
+
: null
|
|
131
|
+
};
|
|
132
|
+
|
|
120
133
|
return NextResponse.json({
|
|
121
134
|
ok: true,
|
|
122
135
|
integrationId: integrationId.trim(),
|
|
123
136
|
recordCount: records.length,
|
|
124
137
|
columns,
|
|
125
138
|
preview,
|
|
126
|
-
entityTypes:
|
|
139
|
+
entityTypes: resolverMeta.entityTypes,
|
|
140
|
+
resolverMeta
|
|
127
141
|
});
|
|
128
142
|
}
|
|
129
143
|
|