@semilayer/cli 1.1.0
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/dist/auth-config-3MWVCUTJ.js +117 -0
- package/dist/auth-config-3MWVCUTJ.js.map +1 -0
- package/dist/billing-OY5GJP5X.js +265 -0
- package/dist/billing-OY5GJP5X.js.map +1 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +49 -0
- package/dist/bin.js.map +1 -0
- package/dist/chunk-7TA63VHV.js +38 -0
- package/dist/chunk-7TA63VHV.js.map +1 -0
- package/dist/chunk-ALA4X7UU.js +19 -0
- package/dist/chunk-ALA4X7UU.js.map +1 -0
- package/dist/chunk-NIDLPHWY.js +53 -0
- package/dist/chunk-NIDLPHWY.js.map +1 -0
- package/dist/chunk-QMF7LD67.js +39 -0
- package/dist/chunk-QMF7LD67.js.map +1 -0
- package/dist/chunk-QXIVJY7K.js +56 -0
- package/dist/chunk-QXIVJY7K.js.map +1 -0
- package/dist/chunk-T3UROBMA.js +169 -0
- package/dist/chunk-T3UROBMA.js.map +1 -0
- package/dist/chunk-WZYOSGN3.js +88 -0
- package/dist/chunk-WZYOSGN3.js.map +1 -0
- package/dist/config-DACYO7JC.js +103 -0
- package/dist/config-DACYO7JC.js.map +1 -0
- package/dist/dev-R3AZSONQ.js +57 -0
- package/dist/dev-R3AZSONQ.js.map +1 -0
- package/dist/envs-RNZQ3OQP.js +105 -0
- package/dist/envs-RNZQ3OQP.js.map +1 -0
- package/dist/export-YRFR3JH2.js +81 -0
- package/dist/export-YRFR3JH2.js.map +1 -0
- package/dist/generate-QUETX3TN.js +41 -0
- package/dist/generate-QUETX3TN.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/init-TWJAGUN3.js +187 -0
- package/dist/init-TWJAGUN3.js.map +1 -0
- package/dist/keys-JBKCYKJU.js +111 -0
- package/dist/keys-JBKCYKJU.js.map +1 -0
- package/dist/lenses-VZSDFH3D.js +51 -0
- package/dist/lenses-VZSDFH3D.js.map +1 -0
- package/dist/login-BZ6ZPFHC.js +119 -0
- package/dist/login-BZ6ZPFHC.js.map +1 -0
- package/dist/logout-VMPRV62T.js +38 -0
- package/dist/logout-VMPRV62T.js.map +1 -0
- package/dist/members-DVE5FDLZ.js +110 -0
- package/dist/members-DVE5FDLZ.js.map +1 -0
- package/dist/observe-W346RZBX.js +149 -0
- package/dist/observe-W346RZBX.js.map +1 -0
- package/dist/orgs-YA3TVA3T.js +67 -0
- package/dist/orgs-YA3TVA3T.js.map +1 -0
- package/dist/pause-GQ6PKBUA.js +50 -0
- package/dist/pause-GQ6PKBUA.js.map +1 -0
- package/dist/projects-DMA2AXH3.js +107 -0
- package/dist/projects-DMA2AXH3.js.map +1 -0
- package/dist/push-3ZK3W2AC.js +145 -0
- package/dist/push-3ZK3W2AC.js.map +1 -0
- package/dist/resume-KVRPLXZZ.js +50 -0
- package/dist/resume-KVRPLXZZ.js.map +1 -0
- package/dist/run-IR5B4AE3.js +375 -0
- package/dist/run-IR5B4AE3.js.map +1 -0
- package/dist/sources-S52HUWRK.js +170 -0
- package/dist/sources-S52HUWRK.js.map +1 -0
- package/dist/status-AUECH6RX.js +130 -0
- package/dist/status-AUECH6RX.js.map +1 -0
- package/dist/stream-V7RGHTPR.js +344 -0
- package/dist/stream-V7RGHTPR.js.map +1 -0
- package/dist/sync-NRTC3WX4.js +68 -0
- package/dist/sync-NRTC3WX4.js.map +1 -0
- package/dist/whoami-EQGW6V5D.js +50 -0
- package/dist/whoami-EQGW6V5D.js.map +1 -0
- package/dist/wizard-QLAR33T2.js +306 -0
- package/dist/wizard-QLAR33T2.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
orgPath
|
|
4
|
+
} from "./chunk-ALA4X7UU.js";
|
|
5
|
+
import {
|
|
6
|
+
loadContext
|
|
7
|
+
} from "./chunk-QMF7LD67.js";
|
|
8
|
+
import {
|
|
9
|
+
confirm
|
|
10
|
+
} from "./chunk-QXIVJY7K.js";
|
|
11
|
+
import {
|
|
12
|
+
createApiClient
|
|
13
|
+
} from "./chunk-T3UROBMA.js";
|
|
14
|
+
import "./chunk-7TA63VHV.js";
|
|
15
|
+
import {
|
|
16
|
+
bold,
|
|
17
|
+
dim,
|
|
18
|
+
error,
|
|
19
|
+
info,
|
|
20
|
+
newline,
|
|
21
|
+
success,
|
|
22
|
+
table
|
|
23
|
+
} from "./chunk-WZYOSGN3.js";
|
|
24
|
+
|
|
25
|
+
// src/commands/projects.ts
|
|
26
|
+
import { defineCommand } from "citty";
|
|
27
|
+
var projects_default = defineCommand({
|
|
28
|
+
meta: { name: "projects", description: "Manage projects" },
|
|
29
|
+
subCommands: {
|
|
30
|
+
list: defineCommand({
|
|
31
|
+
meta: { name: "list", description: "List projects in the current organization" },
|
|
32
|
+
async run() {
|
|
33
|
+
const ctx = await loadContext();
|
|
34
|
+
if (!ctx) {
|
|
35
|
+
error("No .semilayerrc found. Run `semilayer init` first.");
|
|
36
|
+
process.exitCode = 1;
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const api = await createApiClient();
|
|
40
|
+
const { projects } = await api.get(`${orgPath(ctx)}/projects`);
|
|
41
|
+
if (projects.length === 0) {
|
|
42
|
+
newline();
|
|
43
|
+
bold("No projects found.");
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
table(
|
|
47
|
+
["Slug", "Name"],
|
|
48
|
+
projects.map((p) => [p.slug, p.name])
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
}),
|
|
52
|
+
create: defineCommand({
|
|
53
|
+
meta: { name: "create", description: "Create a new project" },
|
|
54
|
+
args: {
|
|
55
|
+
name: { type: "string", description: "Project name", required: true },
|
|
56
|
+
slug: { type: "string", description: "Project slug", required: true }
|
|
57
|
+
},
|
|
58
|
+
async run({ args }) {
|
|
59
|
+
const ctx = await loadContext();
|
|
60
|
+
if (!ctx) {
|
|
61
|
+
error("No .semilayerrc found. Run `semilayer init` first.");
|
|
62
|
+
process.exitCode = 1;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const api = await createApiClient();
|
|
66
|
+
const result = await api.post(`${orgPath(ctx)}/projects`, { name: args.name, slug: args.slug });
|
|
67
|
+
success(`Project "${args.name}" (${args.slug}) created.`);
|
|
68
|
+
newline();
|
|
69
|
+
info(`Auto-created environment: ${result.environment.name} (${result.environment.slug})`);
|
|
70
|
+
newline();
|
|
71
|
+
if (result.keys && result.keys.length > 0) {
|
|
72
|
+
bold("API Keys:");
|
|
73
|
+
for (const k of result.keys) {
|
|
74
|
+
info(` ${k.type}: ${k.key}`);
|
|
75
|
+
}
|
|
76
|
+
newline();
|
|
77
|
+
dim("Save these keys \u2014 they will not be shown again.");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}),
|
|
81
|
+
delete: defineCommand({
|
|
82
|
+
meta: { name: "delete", description: "Delete a project" },
|
|
83
|
+
args: {
|
|
84
|
+
project: { type: "string", description: "Project slug to delete", required: true }
|
|
85
|
+
},
|
|
86
|
+
async run({ args }) {
|
|
87
|
+
const ctx = await loadContext();
|
|
88
|
+
if (!ctx) {
|
|
89
|
+
error("No .semilayerrc found. Run `semilayer init` first.");
|
|
90
|
+
process.exitCode = 1;
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const ok = await confirm(
|
|
94
|
+
`Delete project "${args.project}" and all its environments? This cannot be undone.`
|
|
95
|
+
);
|
|
96
|
+
if (!ok) return;
|
|
97
|
+
const api = await createApiClient();
|
|
98
|
+
await api.del(`${orgPath(ctx)}/projects/${args.project}`);
|
|
99
|
+
success(`Project "${args.project}" deleted.`);
|
|
100
|
+
}
|
|
101
|
+
})
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
export {
|
|
105
|
+
projects_default as default
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=projects-DMA2AXH3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/projects.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport type { Project, CreateProjectResponse } from '@semilayer/core'\nimport { createApiClient } from '../lib/api.js'\nimport { loadContext } from '../lib/context.js'\nimport { orgPath } from '../lib/env-path.js'\nimport { success, error, info, bold, dim, table, newline } from '../lib/output.js'\nimport { confirm } from '../lib/prompt.js'\n\nexport default defineCommand({\n meta: { name: 'projects', description: 'Manage projects' },\n subCommands: {\n list: defineCommand({\n meta: { name: 'list', description: 'List projects in the current organization' },\n async run() {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const api = await createApiClient()\n const { projects } = await api.get<{ projects: Project[] }>(`${orgPath(ctx)}/projects`)\n if (projects.length === 0) {\n newline()\n bold('No projects found.')\n return\n }\n table(\n ['Slug', 'Name'],\n projects.map((p) => [p.slug, p.name]),\n )\n },\n }),\n\n create: defineCommand({\n meta: { name: 'create', description: 'Create a new project' },\n args: {\n name: { type: 'string', description: 'Project name', required: true },\n slug: { type: 'string', description: 'Project slug', required: true },\n },\n async run({ args }) {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const api = await createApiClient()\n const result = await api.post<CreateProjectResponse>(`${orgPath(ctx)}/projects`, { name: args.name, slug: args.slug })\n success(`Project \"${args.name}\" (${args.slug}) created.`)\n newline()\n info(`Auto-created environment: ${result.environment.name} (${result.environment.slug})`)\n newline()\n if (result.keys && result.keys.length > 0) {\n bold('API Keys:')\n for (const k of result.keys) {\n info(` ${k.type}: ${k.key}`)\n }\n newline()\n dim('Save these keys — they will not be shown again.')\n }\n },\n }),\n\n delete: defineCommand({\n meta: { name: 'delete', description: 'Delete a project' },\n args: {\n project: { type: 'string', description: 'Project slug to delete', required: true },\n },\n async run({ args }) {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const ok = await confirm(\n `Delete project \"${args.project}\" and all its environments? This cannot be undone.`,\n )\n if (!ok) return\n const api = await createApiClient()\n await api.del(`${orgPath(ctx)}/projects/${args.project}`)\n success(`Project \"${args.project}\" deleted.`)\n },\n }),\n },\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAQ9B,IAAO,mBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,YAAY,aAAa,kBAAkB;AAAA,EACzD,aAAa;AAAA,IACX,MAAM,cAAc;AAAA,MAClB,MAAM,EAAE,MAAM,QAAQ,aAAa,4CAA4C;AAAA,MAC/E,MAAM,MAAM;AACV,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,EAAE,SAAS,IAAI,MAAM,IAAI,IAA6B,GAAG,QAAQ,GAAG,CAAC,WAAW;AACtF,YAAI,SAAS,WAAW,GAAG;AACzB,kBAAQ;AACR,eAAK,oBAAoB;AACzB;AAAA,QACF;AACA;AAAA,UACE,CAAC,QAAQ,MAAM;AAAA,UACf,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC;AAAA,QACtC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IAED,QAAQ,cAAc;AAAA,MACpB,MAAM,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,MAC5D,MAAM;AAAA,QACJ,MAAM,EAAE,MAAM,UAAU,aAAa,gBAAgB,UAAU,KAAK;AAAA,QACpE,MAAM,EAAE,MAAM,UAAU,aAAa,gBAAgB,UAAU,KAAK;AAAA,MACtE;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,SAAS,MAAM,IAAI,KAA4B,GAAG,QAAQ,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK,CAAC;AACrH,gBAAQ,YAAY,KAAK,IAAI,MAAM,KAAK,IAAI,YAAY;AACxD,gBAAQ;AACR,aAAK,6BAA6B,OAAO,YAAY,IAAI,KAAK,OAAO,YAAY,IAAI,GAAG;AACxF,gBAAQ;AACR,YAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,GAAG;AACzC,eAAK,WAAW;AAChB,qBAAW,KAAK,OAAO,MAAM;AAC3B,iBAAK,KAAK,EAAE,IAAI,KAAK,EAAE,GAAG,EAAE;AAAA,UAC9B;AACA,kBAAQ;AACR,cAAI,sDAAiD;AAAA,QACvD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IAED,QAAQ,cAAc;AAAA,MACpB,MAAM,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,MACxD,MAAM;AAAA,QACJ,SAAS,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,KAAK;AAAA,MACnF;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,KAAK,MAAM;AAAA,UACf,mBAAmB,KAAK,OAAO;AAAA,QACjC;AACA,YAAI,CAAC,GAAI;AACT,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,IAAI,IAAI,GAAG,QAAQ,GAAG,CAAC,aAAa,KAAK,OAAO,EAAE;AACxD,gBAAQ,YAAY,KAAK,OAAO,YAAY;AAAA,MAC9C;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
loadContext
|
|
4
|
+
} from "./chunk-QMF7LD67.js";
|
|
5
|
+
import {
|
|
6
|
+
confirm
|
|
7
|
+
} from "./chunk-QXIVJY7K.js";
|
|
8
|
+
import {
|
|
9
|
+
createApiClient
|
|
10
|
+
} from "./chunk-T3UROBMA.js";
|
|
11
|
+
import "./chunk-7TA63VHV.js";
|
|
12
|
+
import {
|
|
13
|
+
loadConfig
|
|
14
|
+
} from "./chunk-NIDLPHWY.js";
|
|
15
|
+
import {
|
|
16
|
+
bold,
|
|
17
|
+
dim,
|
|
18
|
+
error,
|
|
19
|
+
info,
|
|
20
|
+
newline,
|
|
21
|
+
success,
|
|
22
|
+
table,
|
|
23
|
+
warn
|
|
24
|
+
} from "./chunk-WZYOSGN3.js";
|
|
25
|
+
|
|
26
|
+
// src/commands/push.ts
|
|
27
|
+
import { defineCommand } from "citty";
|
|
28
|
+
import { canonicalHash } from "@semilayer/core";
|
|
29
|
+
var push_default = defineCommand({
|
|
30
|
+
meta: { name: "push", description: "Push config to the SemiLayer service" },
|
|
31
|
+
args: {
|
|
32
|
+
"resume-ingest": {
|
|
33
|
+
type: "boolean",
|
|
34
|
+
description: "Start ingest for new/modified lenses after push",
|
|
35
|
+
default: false
|
|
36
|
+
},
|
|
37
|
+
rebuild: {
|
|
38
|
+
type: "boolean",
|
|
39
|
+
description: "Full re-index for ALL lenses (clears existing vectors)",
|
|
40
|
+
default: false
|
|
41
|
+
},
|
|
42
|
+
"skip-confirmation-dangerously": {
|
|
43
|
+
type: "boolean",
|
|
44
|
+
description: "Skip rebuild confirmation (for CI/CD)",
|
|
45
|
+
default: false
|
|
46
|
+
},
|
|
47
|
+
force: {
|
|
48
|
+
type: "boolean",
|
|
49
|
+
description: "Skip drift detection check",
|
|
50
|
+
default: false
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
async run({ args }) {
|
|
54
|
+
try {
|
|
55
|
+
if (args.rebuild && !args["skip-confirmation-dangerously"]) {
|
|
56
|
+
warn("This will re-index ALL lenses, clearing existing vectors.");
|
|
57
|
+
const ok = await confirm("Continue?");
|
|
58
|
+
if (!ok) {
|
|
59
|
+
info("Aborted.");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const { config, configPath } = await loadConfig();
|
|
64
|
+
info(`Config: ${dim(configPath)}`);
|
|
65
|
+
const ctx = await loadContext();
|
|
66
|
+
if (!ctx) {
|
|
67
|
+
error("No .semilayerrc found. Run `semilayer init` first.");
|
|
68
|
+
process.exitCode = 1;
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const api = await createApiClient();
|
|
72
|
+
if (!args.force) {
|
|
73
|
+
try {
|
|
74
|
+
const driftPath = `/v1/orgs/${ctx.orgSlug}/projects/${ctx.projectSlug}/envs/${ctx.envSlug}/drift`;
|
|
75
|
+
const drift = await api.get(driftPath);
|
|
76
|
+
const drifted = [];
|
|
77
|
+
for (const remote of drift.lenses) {
|
|
78
|
+
const localLens = config.lenses[remote.name];
|
|
79
|
+
if (!localLens) continue;
|
|
80
|
+
const localHash = canonicalHash(localLens);
|
|
81
|
+
if (remote.configHash && remote.configHash !== localHash && remote.lastModifiedBy === "console") {
|
|
82
|
+
drifted.push({ name: remote.name, updatedAt: remote.updatedAt });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (drifted.length > 0) {
|
|
86
|
+
newline();
|
|
87
|
+
warn("These lenses were modified in the Console since your last push:");
|
|
88
|
+
newline();
|
|
89
|
+
const driftRows = drifted.map((d) => {
|
|
90
|
+
const ago = timeSince(d.updatedAt);
|
|
91
|
+
return [" " + bold(d.name), dim(ago), dim("console")];
|
|
92
|
+
});
|
|
93
|
+
table(driftRows);
|
|
94
|
+
newline();
|
|
95
|
+
warn("Pushing will overwrite these changes.");
|
|
96
|
+
const ok = await confirm("Continue?");
|
|
97
|
+
if (!ok) {
|
|
98
|
+
info("Aborted. Use `semilayer export config` to pull the remote config first.");
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
} catch {
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const result = await api.post("/v1/push", {
|
|
106
|
+
orgSlug: ctx.orgSlug,
|
|
107
|
+
projectSlug: ctx.projectSlug,
|
|
108
|
+
envSlug: ctx.envSlug,
|
|
109
|
+
config,
|
|
110
|
+
options: {
|
|
111
|
+
resumeIngest: args["resume-ingest"],
|
|
112
|
+
rebuild: args.rebuild
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
newline();
|
|
116
|
+
success("Push complete");
|
|
117
|
+
const { lenses } = result;
|
|
118
|
+
const rows = [];
|
|
119
|
+
for (const name of lenses.created) rows.push([bold("Created:"), name]);
|
|
120
|
+
for (const name of lenses.updated) rows.push([bold("Updated:"), name]);
|
|
121
|
+
for (const name of lenses.unchanged) rows.push([dim("Unchanged:"), dim(name)]);
|
|
122
|
+
for (const name of lenses.deleted) rows.push([bold("Deleted:"), name]);
|
|
123
|
+
if (rows.length > 0) table(rows);
|
|
124
|
+
if (result.ingestJobs.length > 0) {
|
|
125
|
+
info(`Jobs enqueued: ${result.ingestJobs.length}`);
|
|
126
|
+
}
|
|
127
|
+
} catch (err) {
|
|
128
|
+
error(err.message);
|
|
129
|
+
process.exitCode = 1;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
function timeSince(iso) {
|
|
134
|
+
const diff = Date.now() - new Date(iso).getTime();
|
|
135
|
+
const minutes = Math.floor(diff / 6e4);
|
|
136
|
+
if (minutes < 60) return `${minutes}m ago`;
|
|
137
|
+
const hours = Math.floor(minutes / 60);
|
|
138
|
+
if (hours < 24) return `${hours}h ago`;
|
|
139
|
+
const days = Math.floor(hours / 24);
|
|
140
|
+
return `${days}d ago`;
|
|
141
|
+
}
|
|
142
|
+
export {
|
|
143
|
+
push_default as default
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=push-3ZK3W2AC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/push.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport type { PushResponse, LensConfig } from '@semilayer/core'\nimport { canonicalHash } from '@semilayer/core'\nimport { loadConfig } from '../lib/config-loader.js'\nimport { loadContext } from '../lib/context.js'\nimport { createApiClient } from '../lib/api.js'\nimport { success, error, info, warn, dim, bold, newline, table } from '../lib/output.js'\nimport { confirm } from '../lib/prompt.js'\n\ninterface DriftLensInfo {\n name: string\n configHash: string | null\n lastModifiedBy: string | null\n updatedAt: string\n}\n\nexport default defineCommand({\n meta: { name: 'push', description: 'Push config to the SemiLayer service' },\n args: {\n 'resume-ingest': {\n type: 'boolean',\n description: 'Start ingest for new/modified lenses after push',\n default: false,\n },\n rebuild: {\n type: 'boolean',\n description: 'Full re-index for ALL lenses (clears existing vectors)',\n default: false,\n },\n 'skip-confirmation-dangerously': {\n type: 'boolean',\n description: 'Skip rebuild confirmation (for CI/CD)',\n default: false,\n },\n force: {\n type: 'boolean',\n description: 'Skip drift detection check',\n default: false,\n },\n },\n async run({ args }) {\n try {\n // Rebuild confirmation\n if (args.rebuild && !args['skip-confirmation-dangerously']) {\n warn('This will re-index ALL lenses, clearing existing vectors.')\n const ok = await confirm('Continue?')\n if (!ok) {\n info('Aborted.')\n return\n }\n }\n\n const { config, configPath } = await loadConfig()\n info(`Config: ${dim(configPath)}`)\n\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n\n const api = await createApiClient()\n\n // ── Drift detection ──────────────────────────────────────\n if (!args.force) {\n try {\n const driftPath = `/v1/orgs/${ctx.orgSlug}/projects/${ctx.projectSlug}/envs/${ctx.envSlug}/drift`\n const drift = await api.get<{ lenses: DriftLensInfo[] }>(driftPath)\n\n const drifted: Array<{ name: string; updatedAt: string }> = []\n\n for (const remote of drift.lenses) {\n const localLens = config.lenses[remote.name] as LensConfig | undefined\n if (!localLens) continue\n\n const localHash = canonicalHash(localLens)\n if (\n remote.configHash &&\n remote.configHash !== localHash &&\n remote.lastModifiedBy === 'console'\n ) {\n drifted.push({ name: remote.name, updatedAt: remote.updatedAt })\n }\n }\n\n if (drifted.length > 0) {\n newline()\n warn('These lenses were modified in the Console since your last push:')\n newline()\n const driftRows = drifted.map((d) => {\n const ago = timeSince(d.updatedAt)\n return [' ' + bold(d.name), dim(ago), dim('console')]\n })\n table(driftRows)\n newline()\n warn('Pushing will overwrite these changes.')\n const ok = await confirm('Continue?')\n if (!ok) {\n info('Aborted. Use `semilayer export config` to pull the remote config first.')\n return\n }\n }\n } catch {\n // Drift endpoint may not exist on older servers — continue with push\n }\n }\n\n const result = await api.post<PushResponse>('/v1/push', {\n orgSlug: ctx.orgSlug,\n projectSlug: ctx.projectSlug,\n envSlug: ctx.envSlug,\n config,\n options: {\n resumeIngest: args['resume-ingest'],\n rebuild: args.rebuild,\n },\n })\n\n newline()\n success('Push complete')\n\n const { lenses } = result\n const rows: string[][] = []\n for (const name of lenses.created) rows.push([bold('Created:'), name])\n for (const name of lenses.updated) rows.push([bold('Updated:'), name])\n for (const name of lenses.unchanged) rows.push([dim('Unchanged:'), dim(name)])\n for (const name of lenses.deleted) rows.push([bold('Deleted:'), name])\n\n if (rows.length > 0) table(rows)\n\n if (result.ingestJobs.length > 0) {\n info(`Jobs enqueued: ${result.ingestJobs.length}`)\n }\n } catch (err) {\n error((err as Error).message)\n process.exitCode = 1\n }\n },\n})\n\nfunction timeSince(iso: string): string {\n const diff = Date.now() - new Date(iso).getTime()\n const minutes = Math.floor(diff / 60000)\n if (minutes < 60) return `${minutes}m ago`\n const hours = Math.floor(minutes / 60)\n if (hours < 24) return `${hours}h ago`\n const days = Math.floor(hours / 24)\n return `${days}d ago`\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAE9B,SAAS,qBAAqB;AAc9B,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,uCAAuC;AAAA,EAC1E,MAAM;AAAA,IACJ,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,iCAAiC;AAAA,MAC/B,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,QAAI;AAEF,UAAI,KAAK,WAAW,CAAC,KAAK,+BAA+B,GAAG;AAC1D,aAAK,2DAA2D;AAChE,cAAM,KAAK,MAAM,QAAQ,WAAW;AACpC,YAAI,CAAC,IAAI;AACP,eAAK,UAAU;AACf;AAAA,QACF;AAAA,MACF;AAEA,YAAM,EAAE,QAAQ,WAAW,IAAI,MAAM,WAAW;AAChD,WAAK,WAAW,IAAI,UAAU,CAAC,EAAE;AAEjC,YAAM,MAAM,MAAM,YAAY;AAC9B,UAAI,CAAC,KAAK;AACR,cAAM,oDAAoD;AAC1D,gBAAQ,WAAW;AACnB;AAAA,MACF;AAEA,YAAM,MAAM,MAAM,gBAAgB;AAGlC,UAAI,CAAC,KAAK,OAAO;AACf,YAAI;AACF,gBAAM,YAAY,YAAY,IAAI,OAAO,aAAa,IAAI,WAAW,SAAS,IAAI,OAAO;AACzF,gBAAM,QAAQ,MAAM,IAAI,IAAiC,SAAS;AAElE,gBAAM,UAAsD,CAAC;AAE7D,qBAAW,UAAU,MAAM,QAAQ;AACjC,kBAAM,YAAY,OAAO,OAAO,OAAO,IAAI;AAC3C,gBAAI,CAAC,UAAW;AAEhB,kBAAM,YAAY,cAAc,SAAS;AACzC,gBACE,OAAO,cACP,OAAO,eAAe,aACtB,OAAO,mBAAmB,WAC1B;AACA,sBAAQ,KAAK,EAAE,MAAM,OAAO,MAAM,WAAW,OAAO,UAAU,CAAC;AAAA,YACjE;AAAA,UACF;AAEA,cAAI,QAAQ,SAAS,GAAG;AACtB,oBAAQ;AACR,iBAAK,iEAAiE;AACtE,oBAAQ;AACR,kBAAM,YAAY,QAAQ,IAAI,CAAC,MAAM;AACnC,oBAAM,MAAM,UAAU,EAAE,SAAS;AACjC,qBAAO,CAAC,OAAO,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,SAAS,CAAC;AAAA,YACvD,CAAC;AACD,kBAAM,SAAS;AACf,oBAAQ;AACR,iBAAK,uCAAuC;AAC5C,kBAAM,KAAK,MAAM,QAAQ,WAAW;AACpC,gBAAI,CAAC,IAAI;AACP,mBAAK,yEAAyE;AAC9E;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,IAAI,KAAmB,YAAY;AAAA,QACtD,SAAS,IAAI;AAAA,QACb,aAAa,IAAI;AAAA,QACjB,SAAS,IAAI;AAAA,QACb;AAAA,QACA,SAAS;AAAA,UACP,cAAc,KAAK,eAAe;AAAA,UAClC,SAAS,KAAK;AAAA,QAChB;AAAA,MACF,CAAC;AAED,cAAQ;AACR,cAAQ,eAAe;AAEvB,YAAM,EAAE,OAAO,IAAI;AACnB,YAAM,OAAmB,CAAC;AAC1B,iBAAW,QAAQ,OAAO,QAAS,MAAK,KAAK,CAAC,KAAK,UAAU,GAAG,IAAI,CAAC;AACrE,iBAAW,QAAQ,OAAO,QAAS,MAAK,KAAK,CAAC,KAAK,UAAU,GAAG,IAAI,CAAC;AACrE,iBAAW,QAAQ,OAAO,UAAW,MAAK,KAAK,CAAC,IAAI,YAAY,GAAG,IAAI,IAAI,CAAC,CAAC;AAC7E,iBAAW,QAAQ,OAAO,QAAS,MAAK,KAAK,CAAC,KAAK,UAAU,GAAG,IAAI,CAAC;AAErE,UAAI,KAAK,SAAS,EAAG,OAAM,IAAI;AAE/B,UAAI,OAAO,WAAW,SAAS,GAAG;AAChC,aAAK,kBAAkB,OAAO,WAAW,MAAM,EAAE;AAAA,MACnD;AAAA,IACF,SAAS,KAAK;AACZ,YAAO,IAAc,OAAO;AAC5B,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF,CAAC;AAED,SAAS,UAAU,KAAqB;AACtC,QAAM,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,QAAQ;AAChD,QAAM,UAAU,KAAK,MAAM,OAAO,GAAK;AACvC,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,MAAI,QAAQ,GAAI,QAAO,GAAG,KAAK;AAC/B,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAClC,SAAO,GAAG,IAAI;AAChB;","names":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
envPath
|
|
4
|
+
} from "./chunk-ALA4X7UU.js";
|
|
5
|
+
import {
|
|
6
|
+
loadContext
|
|
7
|
+
} from "./chunk-QMF7LD67.js";
|
|
8
|
+
import {
|
|
9
|
+
createApiClient
|
|
10
|
+
} from "./chunk-T3UROBMA.js";
|
|
11
|
+
import "./chunk-7TA63VHV.js";
|
|
12
|
+
import {
|
|
13
|
+
error,
|
|
14
|
+
success
|
|
15
|
+
} from "./chunk-WZYOSGN3.js";
|
|
16
|
+
|
|
17
|
+
// src/commands/resume.ts
|
|
18
|
+
import { defineCommand } from "citty";
|
|
19
|
+
var resume_default = defineCommand({
|
|
20
|
+
meta: { name: "resume", description: "Resume ingestion for a lens" },
|
|
21
|
+
args: {
|
|
22
|
+
lens: {
|
|
23
|
+
type: "positional",
|
|
24
|
+
description: "Lens name",
|
|
25
|
+
required: true
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
async run({ args }) {
|
|
29
|
+
const ctx = await loadContext();
|
|
30
|
+
if (!ctx) {
|
|
31
|
+
error("No .semilayerrc found. Run `semilayer init` first.");
|
|
32
|
+
process.exitCode = 1;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const api = await createApiClient();
|
|
36
|
+
const { lenses } = await api.get(`${envPath(ctx)}/lenses`);
|
|
37
|
+
const lens = lenses.find((l) => l.name === args.lens);
|
|
38
|
+
if (!lens) {
|
|
39
|
+
error(`Lens "${args.lens}" not found`);
|
|
40
|
+
process.exitCode = 1;
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
await api.post(`${envPath(ctx)}/lenses/${lens.id}/resume`);
|
|
44
|
+
success(`Lens "${args.lens}" resumed.`);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
export {
|
|
48
|
+
resume_default as default
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=resume-KVRPLXZZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/resume.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport type { Lens } from '@semilayer/core'\nimport { createApiClient } from '../lib/api.js'\nimport { loadContext } from '../lib/context.js'\nimport { envPath } from '../lib/env-path.js'\nimport { success, error } from '../lib/output.js'\n\nexport default defineCommand({\n meta: { name: 'resume', description: 'Resume ingestion for a lens' },\n args: {\n lens: {\n type: 'positional',\n description: 'Lens name',\n required: true,\n },\n },\n async run({ args }) {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const api = await createApiClient()\n const { lenses } = await api.get<{ lenses: Lens[] }>(`${envPath(ctx)}/lenses`)\n const lens = lenses.find((l) => l.name === args.lens)\n if (!lens) {\n error(`Lens \"${args.lens}\" not found`)\n process.exitCode = 1\n return\n }\n await api.post(`${envPath(ctx)}/lenses/${lens.id}/resume`)\n success(`Lens \"${args.lens}\" resumed.`)\n },\n})\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAO9B,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,EACnE,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,MAAM,MAAM,YAAY;AAC9B,QAAI,CAAC,KAAK;AACR,YAAM,oDAAoD;AAC1D,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,UAAM,MAAM,MAAM,gBAAgB;AAClC,UAAM,EAAE,OAAO,IAAI,MAAM,IAAI,IAAwB,GAAG,QAAQ,GAAG,CAAC,SAAS;AAC7E,UAAM,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI;AACpD,QAAI,CAAC,MAAM;AACT,YAAM,SAAS,KAAK,IAAI,aAAa;AACrC,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,UAAM,IAAI,KAAK,GAAG,QAAQ,GAAG,CAAC,WAAW,KAAK,EAAE,SAAS;AACzD,YAAQ,SAAS,KAAK,IAAI,YAAY;AAAA,EACxC;AACF,CAAC;","names":[]}
|