@liquidmetal-ai/raindrop 0.7.0 → 0.8.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 (178) hide show
  1. package/README.md +408 -73
  2. package/bin/cjs-shims.js +7 -0
  3. package/bin/run.js +20 -2
  4. package/bundle/chunk-5GH4FS6C.js +12148 -0
  5. package/bundle/chunk-6B4I2CKP.js +231 -0
  6. package/bundle/chunk-6UE75KX2.js +4481 -0
  7. package/bundle/chunk-AU3EGGJP.js +44 -0
  8. package/bundle/chunk-CDQRD3JA.js +75 -0
  9. package/bundle/chunk-CMCEP64V.js +380 -0
  10. package/bundle/chunk-CW5ZHVPX.js +292 -0
  11. package/bundle/chunk-G6NE675D.js +238720 -0
  12. package/bundle/chunk-GLIYVKQA.js +48 -0
  13. package/bundle/chunk-KXEV6E63.js +133 -0
  14. package/bundle/chunk-MCRKUPJY.js +4515 -0
  15. package/bundle/chunk-MGM2L2T3.js +805 -0
  16. package/bundle/chunk-MVQYQJHI.js +502 -0
  17. package/bundle/chunk-NG7CZTTE.js +147 -0
  18. package/bundle/chunk-PU4RCSXF.js +22452 -0
  19. package/bundle/chunk-VXAZKB3J.js +292 -0
  20. package/bundle/chunk-W2L3MYN6.js +4480 -0
  21. package/bundle/chunk-XYJACVNA.js +231 -0
  22. package/bundle/commands/annotation/get.js +153 -0
  23. package/bundle/commands/annotation/list.js +226 -0
  24. package/bundle/commands/annotation/put.js +177 -0
  25. package/bundle/commands/auth/list.js +75 -0
  26. package/bundle/commands/auth/login.js +1654 -0
  27. package/bundle/commands/auth/logout.js +27 -0
  28. package/bundle/commands/auth/select.js +53 -0
  29. package/bundle/commands/bucket/create-credential.js +173 -0
  30. package/bundle/commands/bucket/delete-credential.js +140 -0
  31. package/bundle/commands/bucket/get-credential.js +151 -0
  32. package/bundle/commands/bucket/list-credentials.js +148 -0
  33. package/bundle/commands/build/branch.js +126 -0
  34. package/bundle/commands/build/checkout.js +198 -0
  35. package/bundle/commands/build/clone.js +153 -0
  36. package/bundle/commands/build/delete.js +227 -0
  37. package/bundle/commands/build/deploy.js +160 -0
  38. package/bundle/commands/build/env/get.js +105 -0
  39. package/bundle/commands/build/env/set.js +115 -0
  40. package/bundle/commands/build/find.js +333 -0
  41. package/bundle/commands/build/generate.js +75 -0
  42. package/bundle/commands/build/init.js +76 -0
  43. package/bundle/commands/build/list.js +11 -0
  44. package/bundle/commands/build/sandbox.js +65 -0
  45. package/bundle/commands/build/start.js +84 -0
  46. package/bundle/commands/build/status.js +1839 -0
  47. package/bundle/commands/build/stop.js +84 -0
  48. package/bundle/commands/build/tools/check.js +32 -0
  49. package/bundle/commands/build/tools/fmt.js +49 -0
  50. package/bundle/commands/build/unsandbox.js +65 -0
  51. package/bundle/commands/build/upload.js +83 -0
  52. package/bundle/commands/build/validate.js +71 -0
  53. package/bundle/commands/build/workos/delete.js +86 -0
  54. package/bundle/commands/build/workos/env/attach.js +134 -0
  55. package/bundle/commands/build/workos/env/create.js +176 -0
  56. package/bundle/commands/build/workos/env/delete.js +84 -0
  57. package/bundle/commands/build/workos/env/detach.js +115 -0
  58. package/bundle/commands/build/workos/env/get.js +117 -0
  59. package/bundle/commands/build/workos/env/list.js +139 -0
  60. package/bundle/commands/build/workos/env/set.js +138 -0
  61. package/bundle/commands/build/workos/invite.js +91 -0
  62. package/bundle/commands/build/workos/setup.js +124 -0
  63. package/bundle/commands/build/workos/status.js +93 -0
  64. package/bundle/commands/dns/create.js +128 -0
  65. package/bundle/commands/dns/delete.js +80 -0
  66. package/bundle/commands/dns/get.js +167 -0
  67. package/bundle/commands/dns/list.js +193 -0
  68. package/bundle/commands/dns/records/create.js +150 -0
  69. package/bundle/commands/dns/records/delete.js +76 -0
  70. package/bundle/commands/dns/records/get.js +118 -0
  71. package/bundle/commands/dns/records/list.js +153 -0
  72. package/bundle/commands/dns/records/update.js +146 -0
  73. package/bundle/commands/logs/query.js +237 -0
  74. package/bundle/commands/logs/tail.js +155 -0
  75. package/bundle/commands/mcp/install-claude.js +220 -0
  76. package/bundle/commands/mcp/install-gemini.js +220 -0
  77. package/bundle/commands/mcp/install-goose.js +232 -0
  78. package/bundle/commands/mcp/status.js +153 -0
  79. package/bundle/commands/object/delete.js +180 -0
  80. package/bundle/commands/object/get.js +209 -0
  81. package/bundle/commands/object/list.js +206 -0
  82. package/bundle/commands/object/put.js +211 -0
  83. package/bundle/commands/query/chunk-search.js +123 -0
  84. package/bundle/commands/query/document.js +126 -0
  85. package/bundle/commands/query/events.js +98 -0
  86. package/bundle/commands/query/reindex.js +147 -0
  87. package/bundle/commands/query/search.js +169 -0
  88. package/bundle/commands/tail.js +31 -0
  89. package/bundle/index.js +51 -0
  90. package/dist/base-command.d.ts +6 -0
  91. package/dist/base-command.d.ts.map +1 -1
  92. package/dist/base-command.js +14 -1
  93. package/dist/build.d.ts +2 -1
  94. package/dist/build.d.ts.map +1 -1
  95. package/dist/build.js +169 -51
  96. package/dist/codegen.d.ts +1 -1
  97. package/dist/codegen.d.ts.map +1 -1
  98. package/dist/codegen.js +17 -3
  99. package/dist/codegen.test.js +44 -0
  100. package/dist/commands/build/checkout.d.ts.map +1 -1
  101. package/dist/commands/build/checkout.js +4 -0
  102. package/dist/commands/build/delete.d.ts.map +1 -1
  103. package/dist/commands/build/delete.js +6 -3
  104. package/dist/commands/build/deploy.d.ts.map +1 -1
  105. package/dist/commands/build/deploy.js +10 -2
  106. package/dist/commands/build/find.d.ts +1 -0
  107. package/dist/commands/build/find.d.ts.map +1 -1
  108. package/dist/commands/build/find.js +33 -2
  109. package/dist/commands/build/validate.d.ts.map +1 -1
  110. package/dist/commands/build/validate.js +0 -1
  111. package/dist/commands/build/workos/delete.d.ts +18 -0
  112. package/dist/commands/build/workos/delete.d.ts.map +1 -0
  113. package/dist/commands/build/workos/delete.js +72 -0
  114. package/dist/commands/build/workos/env/attach.d.ts +24 -0
  115. package/dist/commands/build/workos/env/attach.d.ts.map +1 -0
  116. package/dist/commands/build/workos/env/attach.js +111 -0
  117. package/dist/commands/build/workos/env/create.d.ts +26 -0
  118. package/dist/commands/build/workos/env/create.d.ts.map +1 -0
  119. package/dist/commands/build/workos/env/create.js +156 -0
  120. package/dist/commands/build/workos/env/delete.d.ts +20 -0
  121. package/dist/commands/build/workos/env/delete.d.ts.map +1 -0
  122. package/dist/commands/build/workos/env/delete.js +61 -0
  123. package/dist/commands/build/workos/env/detach.d.ts +21 -0
  124. package/dist/commands/build/workos/env/detach.d.ts.map +1 -0
  125. package/dist/commands/build/workos/env/detach.js +94 -0
  126. package/dist/commands/build/workos/env/get.d.ts +20 -0
  127. package/dist/commands/build/workos/env/get.d.ts.map +1 -0
  128. package/dist/commands/build/workos/env/get.js +94 -0
  129. package/dist/commands/build/workos/env/list.d.ts +18 -0
  130. package/dist/commands/build/workos/env/list.d.ts.map +1 -0
  131. package/dist/commands/build/workos/env/list.js +114 -0
  132. package/dist/commands/build/workos/env/set.d.ts +27 -0
  133. package/dist/commands/build/workos/env/set.d.ts.map +1 -0
  134. package/dist/commands/build/workos/env/set.js +115 -0
  135. package/dist/commands/build/workos/invite.d.ts +21 -0
  136. package/dist/commands/build/workos/invite.d.ts.map +1 -0
  137. package/dist/commands/build/workos/invite.js +68 -0
  138. package/dist/commands/build/workos/setup.d.ts +20 -0
  139. package/dist/commands/build/workos/setup.d.ts.map +1 -0
  140. package/dist/commands/build/workos/setup.js +106 -0
  141. package/dist/commands/build/workos/status.d.ts +18 -0
  142. package/dist/commands/build/workos/status.d.ts.map +1 -0
  143. package/dist/commands/build/workos/status.js +70 -0
  144. package/dist/commands/mcp/install-claude.d.ts.map +1 -1
  145. package/dist/commands/mcp/install-claude.js +0 -2
  146. package/dist/commands/mcp/install-gemini.d.ts.map +1 -1
  147. package/dist/commands/mcp/install-gemini.js +0 -2
  148. package/dist/commands/mcp/install-goose.d.ts.map +1 -1
  149. package/dist/commands/mcp/install-goose.js +0 -2
  150. package/dist/deploy.d.ts.map +1 -1
  151. package/dist/deploy.js +2 -2
  152. package/dist/index.d.ts +2 -0
  153. package/dist/index.d.ts.map +1 -1
  154. package/dist/index.js +4 -0
  155. package/oclif.manifest.json +4286 -2208
  156. package/package.json +8 -5
  157. package/templates/claude-code/debug-raindrop-app.md +89 -0
  158. package/templates/claude-code/new-raindrop-app.md +10 -6
  159. package/templates/claude-code/reattach-raindrop-session.md +50 -12
  160. package/templates/claude-code/update-raindrop-app.md +61 -9
  161. package/templates/db/node_modules/.bin/prisma +2 -2
  162. package/templates/db/node_modules/.bin/prisma-kysely +2 -2
  163. package/templates/db/node_modules/.bin/tsc +2 -2
  164. package/templates/db/node_modules/.bin/tsserver +2 -2
  165. package/templates/db/node_modules/.bin/zx +2 -2
  166. package/templates/gemini-code/debug-raindrop-app.toml +86 -0
  167. package/templates/gemini-code/new-raindrop-app.toml +9 -5
  168. package/templates/gemini-code/reattach-raindrop-session.toml +9 -11
  169. package/templates/gemini-code/update-raindrop-app.toml +55 -10
  170. package/templates/goose/debug-raindrop-app.yaml +91 -0
  171. package/templates/goose/new-raindrop-app.yaml +12 -7
  172. package/templates/goose/reattach-raindrop-session.yaml +11 -4
  173. package/templates/goose/update-raindrop-app.yaml +57 -5
  174. package/templates/init/src/_app/auth.ts +18 -0
  175. package/templates/init/src/_app/cors.ts +64 -0
  176. package/dist/tsconfig.tsbuildinfo +0 -1
  177. package/templates/claude-code/raindrop-guidelines.md +0 -322
  178. package/templates/gemini-code/raindrop-guidelines.md +0 -322
@@ -0,0 +1,44 @@
1
+ import {
2
+ init_cjs_shims
3
+ } from "./chunk-G6NE675D.js";
4
+
5
+ // ../drizzle/dist/mrn.js
6
+ init_cjs_shims();
7
+ function parseMRN(mrn) {
8
+ const parts = mrn.split(":");
9
+ if (parts.length !== 6) {
10
+ throw new Error(`Invalid MRN format: ${mrn}`);
11
+ }
12
+ const [type, applicationName, versionId, module, itemOrKey, revision] = parts;
13
+ if (!type || !applicationName || !versionId) {
14
+ throw new Error(`MRN must contain type, applicationName, and versionId: ${mrn}`);
15
+ }
16
+ if (!["annotation", "label"].includes(type)) {
17
+ throw new Error(`Invalid MRN type: ${type}`);
18
+ }
19
+ const mrnObject = {
20
+ type,
21
+ applicationName,
22
+ versionId
23
+ };
24
+ if (module) {
25
+ mrnObject.module = module;
26
+ }
27
+ if (itemOrKey) {
28
+ if (itemOrKey.includes("^")) {
29
+ const [item, keyValue] = itemOrKey.split("^");
30
+ mrnObject.item = item;
31
+ mrnObject.key = keyValue || "";
32
+ } else {
33
+ mrnObject.key = itemOrKey;
34
+ }
35
+ }
36
+ if (revision) {
37
+ mrnObject.revision = revision;
38
+ }
39
+ return mrnObject;
40
+ }
41
+
42
+ export {
43
+ parseMRN
44
+ };
@@ -0,0 +1,75 @@
1
+ import {
2
+ init_cjs_shims
3
+ } from "./chunk-G6NE675D.js";
4
+
5
+ // ../drizzle/dist/ulid.js
6
+ init_cjs_shims();
7
+ var BASE32_ENCODING = "0123456789abcdefghjkmnpqrstvwxyz";
8
+ var ENCODING_LEN = BASE32_ENCODING.length;
9
+ var TIME_MAX = Math.pow(2, 48) - 1;
10
+ var TIME_LEN = 10;
11
+ var RANDOM_LEN = 16;
12
+ function monotonic() {
13
+ let lastTime = 0;
14
+ let lastRandom;
15
+ return function ulid2() {
16
+ const seed = (/* @__PURE__ */ new Date()).getTime();
17
+ if (seed <= lastTime) {
18
+ lastRandom = incrementBase32(lastRandom);
19
+ return encodeTime(lastTime) + lastRandom;
20
+ }
21
+ lastTime = seed;
22
+ lastRandom = encodeRandom();
23
+ return encodeTime(seed) + lastRandom;
24
+ };
25
+ }
26
+ var ulid = monotonic();
27
+ function encodeRandom() {
28
+ const bytes = crypto.getRandomValues(new Uint8Array(RANDOM_LEN));
29
+ let str = "";
30
+ for (let i = 0; i < RANDOM_LEN; i++) {
31
+ str = str + BASE32_ENCODING[bytes[i] % ENCODING_LEN];
32
+ }
33
+ return str;
34
+ }
35
+ function encodeTime(ms) {
36
+ if (ms > TIME_MAX)
37
+ throw new Error("cannot encode time greater than " + TIME_MAX);
38
+ if (ms < 0)
39
+ throw new Error("time must be positive");
40
+ let mod;
41
+ let str = "";
42
+ for (let len = TIME_LEN; len > 0; len--) {
43
+ mod = ms % ENCODING_LEN;
44
+ str = BASE32_ENCODING[mod] + str;
45
+ ms = (ms - mod) / ENCODING_LEN;
46
+ }
47
+ return str;
48
+ }
49
+ function incrementBase32(str) {
50
+ function replaceCharAt(str2, index2, char2) {
51
+ if (index2 > str2.length - 1)
52
+ return str2;
53
+ return str2.substring(0, index2) + char2 + str2.substring(index2 + 1);
54
+ }
55
+ const maxCharIndex = ENCODING_LEN - 1;
56
+ let index = str ? str.length : 0;
57
+ let char;
58
+ let charIndex;
59
+ while (index-- >= 0) {
60
+ char = str[index];
61
+ charIndex = BASE32_ENCODING.indexOf(char);
62
+ if (charIndex === -1)
63
+ throw new Error("incorrectly encoded string");
64
+ if (charIndex === maxCharIndex) {
65
+ str = replaceCharAt(str, index, BASE32_ENCODING[0]);
66
+ continue;
67
+ }
68
+ return replaceCharAt(str, index, BASE32_ENCODING[charIndex + 1]);
69
+ }
70
+ return str;
71
+ }
72
+
73
+ export {
74
+ ulid
75
+ };
@@ -0,0 +1,380 @@
1
+ import {
2
+ source_default
3
+ } from "./chunk-MVQYQJHI.js";
4
+ import {
5
+ BaseCommand
6
+ } from "./chunk-MCRKUPJY.js";
7
+ import {
8
+ ApplicationsResponseSchema,
9
+ EPOCH_TS,
10
+ UnitState,
11
+ __toESM,
12
+ init_cjs_shims,
13
+ require_lib,
14
+ timestampDate,
15
+ toJsonString
16
+ } from "./chunk-G6NE675D.js";
17
+
18
+ // src/commands/build/list.ts
19
+ init_cjs_shims();
20
+ var import_core = __toESM(require_lib(), 1);
21
+ var statusString = {
22
+ [UnitState.UNSPECIFIED]: "<unknown>",
23
+ [UnitState.PENDING]: "pending...",
24
+ [UnitState.STARTING]: "starting...",
25
+ [UnitState.RUNNING]: "running",
26
+ [UnitState.STOPPING]: "stopping...",
27
+ [UnitState.STOPPED]: "stopped",
28
+ [UnitState.DELETING]: "deleting...",
29
+ [UnitState.DELETED]: "deleted"
30
+ };
31
+ var List = class extends BaseCommand {
32
+ static args = {};
33
+ static description = "list Raindrop catalog resources";
34
+ static examples = [
35
+ `<%= config.bin %> <%= command.id %>
36
+ List applications in compact view (default).
37
+
38
+ <%= config.bin %> <%= command.id %> -o tree
39
+ Show applications in tree view with version hierarchy.
40
+
41
+ <%= config.bin %> <%= command.id %> -o log
42
+ Show git-log style view with branch visualization.
43
+
44
+ <%= config.bin %> <%= command.id %> --app demo-fts --limit 5
45
+ Show only demo-fts application, limited to 5 versions.
46
+
47
+ <%= config.bin %> <%= command.id %> --active
48
+ Show only running/active versions.
49
+ `
50
+ ];
51
+ static flags = {
52
+ ...BaseCommand.HIDDEN_FLAGS,
53
+ all: import_core.Flags.boolean({ char: "a", description: "show deleted resources", default: false }),
54
+ output: import_core.Flags.string({
55
+ char: "o",
56
+ description: "output format",
57
+ default: "compact",
58
+ options: ["text", "table", "json", "log", "compact", "tree"]
59
+ }),
60
+ app: import_core.Flags.string({
61
+ description: "filter by application name",
62
+ required: false
63
+ }),
64
+ limit: import_core.Flags.integer({
65
+ char: "n",
66
+ description: "limit number of versions shown per application",
67
+ required: false
68
+ }),
69
+ active: import_core.Flags.boolean({
70
+ description: "show only running/active versions",
71
+ default: false
72
+ }),
73
+ impersonate: import_core.Flags.string({
74
+ char: "i",
75
+ description: "impersonate organization",
76
+ required: false,
77
+ hidden: true
78
+ }),
79
+ manifest: import_core.Flags.string({
80
+ char: "M",
81
+ description: "project manifest",
82
+ required: false,
83
+ default: "raindrop.manifest",
84
+ hidden: true
85
+ })
86
+ };
87
+ // Build a version tree from applications
88
+ buildVersionTree(applications) {
89
+ const nodesMap = /* @__PURE__ */ new Map();
90
+ const rootNodes = [];
91
+ applications.forEach((app) => {
92
+ const node = {
93
+ versionId: app.versionId,
94
+ previousVersionId: app.previousVersionId || null,
95
+ application: app,
96
+ children: [],
97
+ branch: app.branch
98
+ };
99
+ nodesMap.set(app.versionId, node);
100
+ });
101
+ for (const node of nodesMap.values()) {
102
+ if (node.previousVersionId && nodesMap.has(node.previousVersionId)) {
103
+ nodesMap.get(node.previousVersionId).children.push(node);
104
+ } else {
105
+ rootNodes.push(node);
106
+ }
107
+ }
108
+ return { rootNodes, nodesMap };
109
+ }
110
+ // Render the version tree in git-log style with branch lines
111
+ renderGitLogStyle(applications) {
112
+ const groups = this.groupApplicationsByName(applications);
113
+ const result = [];
114
+ for (const [_appName, appVersions] of groups) {
115
+ result.push("");
116
+ const firstApp = appVersions[0];
117
+ if (!firstApp) continue;
118
+ const formattedAppName = this.formatAppName(firstApp);
119
+ result.push(source_default.bold.underline(`=== ${formattedAppName} ===`));
120
+ result.push("");
121
+ const { rootNodes } = this.buildVersionTree(appVersions);
122
+ const columnMap = /* @__PURE__ */ new Map();
123
+ let maxColumn = 0;
124
+ const assignColumns = (node, parentColumn) => {
125
+ if (columnMap.has(node.versionId)) return;
126
+ if (parentColumn !== void 0) {
127
+ columnMap.set(node.versionId, parentColumn);
128
+ } else {
129
+ columnMap.set(node.versionId, maxColumn++);
130
+ }
131
+ node.children.forEach((child) => {
132
+ assignColumns(child, columnMap.get(node.versionId));
133
+ });
134
+ };
135
+ rootNodes.forEach((root) => assignColumns(root));
136
+ const flattenedNodes = [];
137
+ const flatten = (node) => {
138
+ flattenedNodes.push(node);
139
+ node.children.forEach((child) => flatten(child));
140
+ };
141
+ rootNodes.forEach((root) => flatten(root));
142
+ flattenedNodes.sort((a, b) => {
143
+ const aTime = timestampDate(a.application.createdAt || EPOCH_TS).getTime() || 0;
144
+ const bTime = timestampDate(b.application.createdAt || EPOCH_TS).getTime() || 0;
145
+ return bTime - aTime;
146
+ });
147
+ const processed = /* @__PURE__ */ new Set();
148
+ const linesInUse = /* @__PURE__ */ new Set();
149
+ for (const node of flattenedNodes) {
150
+ if (processed.has(node.versionId)) continue;
151
+ processed.add(node.versionId);
152
+ const app = node.application;
153
+ const column = columnMap.get(node.versionId) || 0;
154
+ linesInUse.add(column);
155
+ const date = timestampDate(app.createdAt || EPOCH_TS);
156
+ const timestamp = date.toLocaleString("en-US", {
157
+ weekday: "short",
158
+ month: "short",
159
+ day: "numeric",
160
+ year: "numeric",
161
+ hour: "numeric",
162
+ minute: "numeric",
163
+ second: "numeric",
164
+ hour12: false,
165
+ timeZoneName: "short"
166
+ });
167
+ let graphLine = "";
168
+ for (let i = 0; i <= maxColumn; i++) {
169
+ if (i === column) {
170
+ graphLine += "*";
171
+ } else if (linesInUse.has(i)) {
172
+ graphLine += "|";
173
+ } else {
174
+ graphLine += " ";
175
+ }
176
+ }
177
+ let branchInfo = "";
178
+ if (app.branch) {
179
+ branchInfo = ` (${app.branch})`;
180
+ }
181
+ let parentInfo = "";
182
+ if (app.previousVersionId) {
183
+ parentInfo = ` [parent: ${app.previousVersionId}]`;
184
+ }
185
+ const versionLine = `${graphLine} ${source_default.yellow("version")} ${source_default.yellow(app.versionId)}${source_default.cyan(branchInfo)}${source_default.dim(parentInfo)}`;
186
+ result.push(versionLine);
187
+ graphLine = graphLine.replace("*", "|");
188
+ let statusColor;
189
+ if (app.state === UnitState.RUNNING) {
190
+ statusColor = source_default.green;
191
+ } else if (app.state === UnitState.DELETING) {
192
+ statusColor = source_default.yellow;
193
+ } else if (app.state === UnitState.DELETED) {
194
+ statusColor = source_default.red;
195
+ } else {
196
+ statusColor = source_default.gray;
197
+ }
198
+ result.push(`${graphLine} ${source_default.bold("Status:")} ${statusColor(statusString[app.state])}`);
199
+ result.push(`${graphLine} ${source_default.bold("Date:")} ${source_default.dim(timestamp)}`);
200
+ result.push(`${graphLine} `);
201
+ result.push(`${graphLine} ${source_default.bold(this.formatAppName(app))}`);
202
+ result.push(`${graphLine}`);
203
+ }
204
+ }
205
+ return result.join("\n");
206
+ }
207
+ // Helper function to format app name with privileged indicator
208
+ formatAppName(app) {
209
+ const privilegedIcon = app.privileged ? source_default.magenta("\u{1F512} ") : "";
210
+ return `${privilegedIcon}${app.name}`;
211
+ }
212
+ // Group applications by name
213
+ groupApplicationsByName(applications) {
214
+ const groups = /* @__PURE__ */ new Map();
215
+ for (const app of applications) {
216
+ const name = app.name;
217
+ if (!groups.has(name)) {
218
+ groups.set(name, []);
219
+ }
220
+ groups.get(name).push(app);
221
+ }
222
+ for (const apps of groups.values()) {
223
+ apps.sort((a, b) => {
224
+ const aTime = timestampDate(a.createdAt || EPOCH_TS).getTime();
225
+ const bTime = timestampDate(b.createdAt || EPOCH_TS).getTime();
226
+ return bTime - aTime;
227
+ });
228
+ }
229
+ return groups;
230
+ }
231
+ // Render compact view
232
+ renderCompactView(applications) {
233
+ const groups = this.groupApplicationsByName(applications);
234
+ const result = [];
235
+ const sortedGroups = Array.from(groups.entries()).sort((a, b) => {
236
+ const aLatest = a[1][0];
237
+ const bLatest = b[1][0];
238
+ if (!aLatest || !bLatest) return 0;
239
+ const aTime = timestampDate(aLatest.createdAt || EPOCH_TS).getTime();
240
+ const bTime = timestampDate(bLatest.createdAt || EPOCH_TS).getTime();
241
+ return bTime - aTime;
242
+ });
243
+ for (const [_appName, versions] of sortedGroups) {
244
+ const activeVersions2 = versions.filter((v) => v.state === UnitState.RUNNING);
245
+ const deletedVersions = versions.filter((v) => v.state === UnitState.DELETED || v.state === UnitState.DELETING);
246
+ const firstVersion = versions[0];
247
+ if (!firstVersion) continue;
248
+ const formattedAppName = this.formatAppName(firstVersion);
249
+ result.push(`
250
+ ${source_default.bold(formattedAppName)} ${source_default.dim(`(${versions.length} version${versions.length !== 1 ? "s" : ""})`)}`);
251
+ let shown = 0;
252
+ for (const version of activeVersions2) {
253
+ if (this.flags.limit && shown >= this.flags.limit) break;
254
+ const date = timestampDate(version.createdAt || EPOCH_TS).toLocaleDateString();
255
+ const branch = version.branch ? source_default.cyan(` (${version.branch})`) : "";
256
+ const status = source_default.green(statusString[version.state]);
257
+ result.push(` \u2514\u2500 ${source_default.yellow(version.versionId)}...${branch} - ${status} - ${source_default.dim(date)}`);
258
+ shown++;
259
+ }
260
+ if (!this.flags.active && deletedVersions.length > 0) {
261
+ const remaining = this.flags.limit ? Math.max(0, this.flags.limit - shown) : deletedVersions.length;
262
+ const toShow = Math.min(remaining, deletedVersions.length);
263
+ for (let i = 0; i < toShow && i < 3; i++) {
264
+ const version = deletedVersions[i];
265
+ if (!version) continue;
266
+ const date = timestampDate(version.createdAt || EPOCH_TS).toLocaleDateString();
267
+ const status = version.state === UnitState.DELETING ? source_default.yellow(statusString[version.state]) : source_default.red(statusString[version.state]);
268
+ result.push(` \u2514\u2500 ${source_default.gray(version.versionId)}... - ${status} - ${source_default.dim(date)}`);
269
+ }
270
+ if (deletedVersions.length > toShow) {
271
+ result.push(source_default.dim(` ... ${deletedVersions.length - toShow} more deleted versions`));
272
+ }
273
+ }
274
+ }
275
+ const totalApps = sortedGroups.length;
276
+ const totalVersions = applications.length;
277
+ const activeVersions = applications.filter((app) => app.state === UnitState.RUNNING).length;
278
+ result.push("");
279
+ result.push(source_default.dim("\u2500".repeat(50)));
280
+ result.push(source_default.dim(`Total: ${totalApps} applications, ${totalVersions} versions (${activeVersions} active)`));
281
+ return result.join("\n");
282
+ }
283
+ // Render tree view for a specific application
284
+ renderTreeView(applications) {
285
+ const groups = this.groupApplicationsByName(applications);
286
+ const result = [];
287
+ for (const [_appName, versions] of groups) {
288
+ const firstVersion = versions[0];
289
+ if (!firstVersion) continue;
290
+ const formattedAppName = this.formatAppName(firstVersion);
291
+ result.push(`
292
+ ${source_default.bold.underline(`=== ${formattedAppName} ===`)}`);
293
+ const { rootNodes } = this.buildVersionTree(versions);
294
+ const renderNode = (node, prefix = "", isLast = true) => {
295
+ const app = node.application;
296
+ const date = timestampDate(app.createdAt || EPOCH_TS).toLocaleDateString();
297
+ const branch = app.branch ? source_default.cyan(` (${app.branch})`) : "";
298
+ let status;
299
+ if (app.state === UnitState.RUNNING) {
300
+ status = source_default.green(statusString[app.state]);
301
+ } else if (app.state === UnitState.DELETING) {
302
+ status = source_default.yellow(statusString[app.state]);
303
+ } else if (app.state === UnitState.DELETED) {
304
+ status = source_default.red(statusString[app.state]);
305
+ } else {
306
+ status = source_default.gray(statusString[app.state]);
307
+ }
308
+ const current = app.state === UnitState.RUNNING && app.branch === "main" ? source_default.bold.green(" \u2190 current") : "";
309
+ const connector = isLast ? "\u2514\u2500" : "\u251C\u2500";
310
+ const shortId = source_default.yellow(app.versionId);
311
+ result.push(`${prefix}${connector} ${shortId}...${branch} - ${status} - ${source_default.dim(date)}${current}`);
312
+ const childPrefix = prefix + (isLast ? " " : "\u2502 ");
313
+ node.children.forEach((child, index) => {
314
+ renderNode(child, childPrefix, index === node.children.length - 1);
315
+ });
316
+ };
317
+ rootNodes.forEach((root, index) => {
318
+ renderNode(root, "", index === rootNodes.length - 1);
319
+ });
320
+ }
321
+ return result.join("\n");
322
+ }
323
+ async listApplications() {
324
+ const { client: catalogService, organizationId: defaultOrganizationId, userId } = await this.catalogService();
325
+ const organizationId = this.flags.impersonate ?? defaultOrganizationId;
326
+ if (this.flags.output === "log" || this.flags.output === "table") {
327
+ this.log(source_default.dim(`Listing applications for organization ${organizationId}`));
328
+ }
329
+ const resp = await catalogService.applications({
330
+ userId,
331
+ organizationId,
332
+ showDeleted: this.flags.all
333
+ });
334
+ let applications = resp.applications;
335
+ if (this.flags.app) {
336
+ applications = applications.filter((app) => app.name === this.flags.app);
337
+ }
338
+ if (this.flags.active) {
339
+ applications = applications.filter((app) => app.state === UnitState.RUNNING);
340
+ }
341
+ if (this.flags.output === "log") {
342
+ this.log(this.renderGitLogStyle(applications));
343
+ } else if (this.flags.output === "compact") {
344
+ this.log(this.renderCompactView(applications));
345
+ } else if (this.flags.output === "tree") {
346
+ this.log(this.renderTreeView(applications));
347
+ } else if (this.flags.output === "table") {
348
+ console.table(
349
+ applications.reduce(
350
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
351
+ (acc, a) => {
352
+ const dateStr = a.createdAt ? timestampDate(a.createdAt).toISOString() : "";
353
+ acc[dateStr] = {
354
+ ...a,
355
+ status: statusString[a.state],
356
+ locked: a.lock ? "locked" : "",
357
+ privileged: a.privileged ? "system" : "user"
358
+ };
359
+ return acc;
360
+ },
361
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
362
+ {}
363
+ ),
364
+ ["organizationId", "name", "versionId", "branch", "status", "locked", "privileged", ...this.flags.all ? ["deletedAt"] : []]
365
+ );
366
+ } else if (this.flags.output === "json") {
367
+ console.log(toJsonString(ApplicationsResponseSchema, resp, { prettySpaces: 2 }));
368
+ } else {
369
+ this.log(this.renderCompactView(applications));
370
+ }
371
+ }
372
+ async run() {
373
+ await this.listApplications();
374
+ }
375
+ };
376
+
377
+ export {
378
+ statusString,
379
+ List
380
+ };