@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.
Files changed (73) hide show
  1. package/dist/auth-config-3MWVCUTJ.js +117 -0
  2. package/dist/auth-config-3MWVCUTJ.js.map +1 -0
  3. package/dist/billing-OY5GJP5X.js +265 -0
  4. package/dist/billing-OY5GJP5X.js.map +1 -0
  5. package/dist/bin.d.ts +2 -0
  6. package/dist/bin.js +49 -0
  7. package/dist/bin.js.map +1 -0
  8. package/dist/chunk-7TA63VHV.js +38 -0
  9. package/dist/chunk-7TA63VHV.js.map +1 -0
  10. package/dist/chunk-ALA4X7UU.js +19 -0
  11. package/dist/chunk-ALA4X7UU.js.map +1 -0
  12. package/dist/chunk-NIDLPHWY.js +53 -0
  13. package/dist/chunk-NIDLPHWY.js.map +1 -0
  14. package/dist/chunk-QMF7LD67.js +39 -0
  15. package/dist/chunk-QMF7LD67.js.map +1 -0
  16. package/dist/chunk-QXIVJY7K.js +56 -0
  17. package/dist/chunk-QXIVJY7K.js.map +1 -0
  18. package/dist/chunk-T3UROBMA.js +169 -0
  19. package/dist/chunk-T3UROBMA.js.map +1 -0
  20. package/dist/chunk-WZYOSGN3.js +88 -0
  21. package/dist/chunk-WZYOSGN3.js.map +1 -0
  22. package/dist/config-DACYO7JC.js +103 -0
  23. package/dist/config-DACYO7JC.js.map +1 -0
  24. package/dist/dev-R3AZSONQ.js +57 -0
  25. package/dist/dev-R3AZSONQ.js.map +1 -0
  26. package/dist/envs-RNZQ3OQP.js +105 -0
  27. package/dist/envs-RNZQ3OQP.js.map +1 -0
  28. package/dist/export-YRFR3JH2.js +81 -0
  29. package/dist/export-YRFR3JH2.js.map +1 -0
  30. package/dist/generate-QUETX3TN.js +41 -0
  31. package/dist/generate-QUETX3TN.js.map +1 -0
  32. package/dist/index.d.ts +43 -0
  33. package/dist/index.js +34 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/init-TWJAGUN3.js +187 -0
  36. package/dist/init-TWJAGUN3.js.map +1 -0
  37. package/dist/keys-JBKCYKJU.js +111 -0
  38. package/dist/keys-JBKCYKJU.js.map +1 -0
  39. package/dist/lenses-VZSDFH3D.js +51 -0
  40. package/dist/lenses-VZSDFH3D.js.map +1 -0
  41. package/dist/login-BZ6ZPFHC.js +119 -0
  42. package/dist/login-BZ6ZPFHC.js.map +1 -0
  43. package/dist/logout-VMPRV62T.js +38 -0
  44. package/dist/logout-VMPRV62T.js.map +1 -0
  45. package/dist/members-DVE5FDLZ.js +110 -0
  46. package/dist/members-DVE5FDLZ.js.map +1 -0
  47. package/dist/observe-W346RZBX.js +149 -0
  48. package/dist/observe-W346RZBX.js.map +1 -0
  49. package/dist/orgs-YA3TVA3T.js +67 -0
  50. package/dist/orgs-YA3TVA3T.js.map +1 -0
  51. package/dist/pause-GQ6PKBUA.js +50 -0
  52. package/dist/pause-GQ6PKBUA.js.map +1 -0
  53. package/dist/projects-DMA2AXH3.js +107 -0
  54. package/dist/projects-DMA2AXH3.js.map +1 -0
  55. package/dist/push-3ZK3W2AC.js +145 -0
  56. package/dist/push-3ZK3W2AC.js.map +1 -0
  57. package/dist/resume-KVRPLXZZ.js +50 -0
  58. package/dist/resume-KVRPLXZZ.js.map +1 -0
  59. package/dist/run-IR5B4AE3.js +375 -0
  60. package/dist/run-IR5B4AE3.js.map +1 -0
  61. package/dist/sources-S52HUWRK.js +170 -0
  62. package/dist/sources-S52HUWRK.js.map +1 -0
  63. package/dist/status-AUECH6RX.js +130 -0
  64. package/dist/status-AUECH6RX.js.map +1 -0
  65. package/dist/stream-V7RGHTPR.js +344 -0
  66. package/dist/stream-V7RGHTPR.js.map +1 -0
  67. package/dist/sync-NRTC3WX4.js +68 -0
  68. package/dist/sync-NRTC3WX4.js.map +1 -0
  69. package/dist/whoami-EQGW6V5D.js +50 -0
  70. package/dist/whoami-EQGW6V5D.js.map +1 -0
  71. package/dist/wizard-QLAR33T2.js +306 -0
  72. package/dist/wizard-QLAR33T2.js.map +1 -0
  73. 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":"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","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":[]}