@trycadence/cli 0.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 (3) hide show
  1. package/README.md +25 -0
  2. package/dist/cadence +2417 -0
  3. package/package.json +26 -0
package/dist/cadence ADDED
@@ -0,0 +1,2417 @@
1
+ #!/usr/bin/env bun
2
+ // @bun
3
+
4
+ // ../../packages/config/src/index.ts
5
+ var cadenceServicePorts = {
6
+ api: 3000,
7
+ worker: 3100,
8
+ web: 3001,
9
+ gui: 3002,
10
+ mcp: 3003
11
+ };
12
+ function getDefaultPort(service) {
13
+ return cadenceServicePorts[service];
14
+ }
15
+ function getDefaultApiBaseUrl() {
16
+ return `http://localhost:${getDefaultPort("api")}`;
17
+ }
18
+
19
+ // ../../node_modules/.bun/@trpc+client@11.17.0+f02ef5e6ba82b535/node_modules/@trpc/client/dist/objectSpread2-BvkFp-_Y.mjs
20
+ var __create = Object.create;
21
+ var __defProp = Object.defineProperty;
22
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
23
+ var __getOwnPropNames = Object.getOwnPropertyNames;
24
+ var __getProtoOf = Object.getPrototypeOf;
25
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
26
+ var __commonJS = (cb, mod) => function() {
27
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
28
+ };
29
+ var __copyProps = (to, from, except, desc) => {
30
+ if (from && typeof from === "object" || typeof from === "function")
31
+ for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key;i < n; i++) {
32
+ key = keys[i];
33
+ if (!__hasOwnProp.call(to, key) && key !== except)
34
+ __defProp(to, key, {
35
+ get: ((k) => from[k]).bind(null, key),
36
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
37
+ });
38
+ }
39
+ return to;
40
+ };
41
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
42
+ value: mod,
43
+ enumerable: true
44
+ }) : target, mod));
45
+ var require_typeof = __commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/typeof.js"(exports, module) {
46
+ function _typeof$2(o) {
47
+ "@babel/helpers - typeof";
48
+ return module.exports = _typeof$2 = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(o$1) {
49
+ return typeof o$1;
50
+ } : function(o$1) {
51
+ return o$1 && typeof Symbol == "function" && o$1.constructor === Symbol && o$1 !== Symbol.prototype ? "symbol" : typeof o$1;
52
+ }, module.exports.__esModule = true, module.exports["default"] = module.exports, _typeof$2(o);
53
+ }
54
+ module.exports = _typeof$2, module.exports.__esModule = true, module.exports["default"] = module.exports;
55
+ } });
56
+ var require_toPrimitive = __commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js"(exports, module) {
57
+ var _typeof$1 = require_typeof()["default"];
58
+ function toPrimitive$1(t, r) {
59
+ if (_typeof$1(t) != "object" || !t)
60
+ return t;
61
+ var e = t[Symbol.toPrimitive];
62
+ if (e !== undefined) {
63
+ var i = e.call(t, r || "default");
64
+ if (_typeof$1(i) != "object")
65
+ return i;
66
+ throw new TypeError("@@toPrimitive must return a primitive value.");
67
+ }
68
+ return (r === "string" ? String : Number)(t);
69
+ }
70
+ module.exports = toPrimitive$1, module.exports.__esModule = true, module.exports["default"] = module.exports;
71
+ } });
72
+ var require_toPropertyKey = __commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js"(exports, module) {
73
+ var _typeof = require_typeof()["default"];
74
+ var toPrimitive = require_toPrimitive();
75
+ function toPropertyKey$1(t) {
76
+ var i = toPrimitive(t, "string");
77
+ return _typeof(i) == "symbol" ? i : i + "";
78
+ }
79
+ module.exports = toPropertyKey$1, module.exports.__esModule = true, module.exports["default"] = module.exports;
80
+ } });
81
+ var require_defineProperty = __commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js"(exports, module) {
82
+ var toPropertyKey = require_toPropertyKey();
83
+ function _defineProperty(e, r, t) {
84
+ return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
85
+ value: t,
86
+ enumerable: true,
87
+ configurable: true,
88
+ writable: true
89
+ }) : e[r] = t, e;
90
+ }
91
+ module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports;
92
+ } });
93
+ var require_objectSpread2 = __commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/objectSpread2.js"(exports, module) {
94
+ var defineProperty = require_defineProperty();
95
+ function ownKeys(e, r) {
96
+ var t = Object.keys(e);
97
+ if (Object.getOwnPropertySymbols) {
98
+ var o = Object.getOwnPropertySymbols(e);
99
+ r && (o = o.filter(function(r$1) {
100
+ return Object.getOwnPropertyDescriptor(e, r$1).enumerable;
101
+ })), t.push.apply(t, o);
102
+ }
103
+ return t;
104
+ }
105
+ function _objectSpread2(e) {
106
+ for (var r = 1;r < arguments.length; r++) {
107
+ var t = arguments[r] != null ? arguments[r] : {};
108
+ r % 2 ? ownKeys(Object(t), true).forEach(function(r$1) {
109
+ defineProperty(e, r$1, t[r$1]);
110
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r$1) {
111
+ Object.defineProperty(e, r$1, Object.getOwnPropertyDescriptor(t, r$1));
112
+ });
113
+ }
114
+ return e;
115
+ }
116
+ module.exports = _objectSpread2, module.exports.__esModule = true, module.exports["default"] = module.exports;
117
+ } });
118
+
119
+ // ../../node_modules/.bun/@trpc+server@11.17.0+1fb4c65d43e298b9/node_modules/@trpc/server/dist/observable-UMO3vUa_.mjs
120
+ function observable(subscribe) {
121
+ const self = {
122
+ subscribe(observer) {
123
+ let teardownRef = null;
124
+ let isDone = false;
125
+ let unsubscribed = false;
126
+ let teardownImmediately = false;
127
+ function unsubscribe() {
128
+ if (teardownRef === null) {
129
+ teardownImmediately = true;
130
+ return;
131
+ }
132
+ if (unsubscribed)
133
+ return;
134
+ unsubscribed = true;
135
+ if (typeof teardownRef === "function")
136
+ teardownRef();
137
+ else if (teardownRef)
138
+ teardownRef.unsubscribe();
139
+ }
140
+ teardownRef = subscribe({
141
+ next(value) {
142
+ var _observer$next;
143
+ if (isDone)
144
+ return;
145
+ (_observer$next = observer.next) === null || _observer$next === undefined || _observer$next.call(observer, value);
146
+ },
147
+ error(err) {
148
+ var _observer$error;
149
+ if (isDone)
150
+ return;
151
+ isDone = true;
152
+ (_observer$error = observer.error) === null || _observer$error === undefined || _observer$error.call(observer, err);
153
+ unsubscribe();
154
+ },
155
+ complete() {
156
+ var _observer$complete;
157
+ if (isDone)
158
+ return;
159
+ isDone = true;
160
+ (_observer$complete = observer.complete) === null || _observer$complete === undefined || _observer$complete.call(observer);
161
+ unsubscribe();
162
+ }
163
+ });
164
+ if (teardownImmediately)
165
+ unsubscribe();
166
+ return { unsubscribe };
167
+ },
168
+ pipe(...operations) {
169
+ return operations.reduce(pipeReducer, self);
170
+ }
171
+ };
172
+ return self;
173
+ }
174
+ function pipeReducer(prev, fn) {
175
+ return fn(prev);
176
+ }
177
+ function observableToPromise(observable$1) {
178
+ const ac = new AbortController;
179
+ const promise = new Promise((resolve, reject) => {
180
+ let isDone = false;
181
+ function onDone() {
182
+ if (isDone)
183
+ return;
184
+ isDone = true;
185
+ obs$.unsubscribe();
186
+ }
187
+ ac.signal.addEventListener("abort", () => {
188
+ reject(ac.signal.reason);
189
+ });
190
+ const obs$ = observable$1.subscribe({
191
+ next(data) {
192
+ isDone = true;
193
+ resolve(data);
194
+ onDone();
195
+ },
196
+ error(data) {
197
+ reject(data);
198
+ },
199
+ complete() {
200
+ ac.abort();
201
+ onDone();
202
+ }
203
+ });
204
+ });
205
+ return promise;
206
+ }
207
+
208
+ // ../../node_modules/.bun/@trpc+server@11.17.0+1fb4c65d43e298b9/node_modules/@trpc/server/dist/observable-CUiPknO-.mjs
209
+ function share(_opts) {
210
+ return (source) => {
211
+ let refCount = 0;
212
+ let subscription = null;
213
+ const observers = [];
214
+ function startIfNeeded() {
215
+ if (subscription)
216
+ return;
217
+ subscription = source.subscribe({
218
+ next(value) {
219
+ for (const observer of observers) {
220
+ var _observer$next;
221
+ (_observer$next = observer.next) === null || _observer$next === undefined || _observer$next.call(observer, value);
222
+ }
223
+ },
224
+ error(error) {
225
+ for (const observer of observers) {
226
+ var _observer$error;
227
+ (_observer$error = observer.error) === null || _observer$error === undefined || _observer$error.call(observer, error);
228
+ }
229
+ },
230
+ complete() {
231
+ for (const observer of observers) {
232
+ var _observer$complete;
233
+ (_observer$complete = observer.complete) === null || _observer$complete === undefined || _observer$complete.call(observer);
234
+ }
235
+ }
236
+ });
237
+ }
238
+ function resetIfNeeded() {
239
+ if (refCount === 0 && subscription) {
240
+ const _sub = subscription;
241
+ subscription = null;
242
+ _sub.unsubscribe();
243
+ }
244
+ }
245
+ return observable((subscriber) => {
246
+ refCount++;
247
+ observers.push(subscriber);
248
+ startIfNeeded();
249
+ return { unsubscribe() {
250
+ refCount--;
251
+ resetIfNeeded();
252
+ const index = observers.findIndex((v) => v === subscriber);
253
+ if (index > -1)
254
+ observers.splice(index, 1);
255
+ } };
256
+ });
257
+ };
258
+ }
259
+ var distinctUnsetMarker = Symbol();
260
+ function behaviorSubject(initialValue) {
261
+ let value = initialValue;
262
+ const observerList = [];
263
+ const addObserver = (observer) => {
264
+ if (value !== undefined)
265
+ observer.next(value);
266
+ observerList.push(observer);
267
+ };
268
+ const removeObserver = (observer) => {
269
+ observerList.splice(observerList.indexOf(observer), 1);
270
+ };
271
+ const obs = observable((observer) => {
272
+ addObserver(observer);
273
+ return () => {
274
+ removeObserver(observer);
275
+ };
276
+ });
277
+ obs.next = (nextValue) => {
278
+ if (value === nextValue)
279
+ return;
280
+ value = nextValue;
281
+ for (const observer of observerList)
282
+ observer.next(nextValue);
283
+ };
284
+ obs.get = () => value;
285
+ return obs;
286
+ }
287
+
288
+ // ../../node_modules/.bun/@trpc+client@11.17.0+f02ef5e6ba82b535/node_modules/@trpc/client/dist/splitLink-B7Cuf2c_.mjs
289
+ function createChain(opts) {
290
+ return observable((observer) => {
291
+ function execute(index = 0, op = opts.op) {
292
+ const next = opts.links[index];
293
+ if (!next)
294
+ throw new Error("No more links to execute - did you forget to add an ending link?");
295
+ const subscription = next({
296
+ op,
297
+ next(nextOp) {
298
+ const nextObserver = execute(index + 1, nextOp);
299
+ return nextObserver;
300
+ }
301
+ });
302
+ return subscription;
303
+ }
304
+ const obs$ = execute();
305
+ return obs$.subscribe(observer);
306
+ });
307
+ }
308
+
309
+ // ../../node_modules/.bun/@trpc+server@11.17.0+1fb4c65d43e298b9/node_modules/@trpc/server/dist/codes-DagpWZLc.mjs
310
+ function isObject(value) {
311
+ return !!value && !Array.isArray(value) && typeof value === "object";
312
+ }
313
+ function emptyObject() {
314
+ return Object.create(null);
315
+ }
316
+ var TRPC_ERROR_CODES_BY_KEY = {
317
+ PARSE_ERROR: -32700,
318
+ BAD_REQUEST: -32600,
319
+ INTERNAL_SERVER_ERROR: -32603,
320
+ NOT_IMPLEMENTED: -32603,
321
+ BAD_GATEWAY: -32603,
322
+ SERVICE_UNAVAILABLE: -32603,
323
+ GATEWAY_TIMEOUT: -32603,
324
+ UNAUTHORIZED: -32001,
325
+ PAYMENT_REQUIRED: -32002,
326
+ FORBIDDEN: -32003,
327
+ NOT_FOUND: -32004,
328
+ METHOD_NOT_SUPPORTED: -32005,
329
+ TIMEOUT: -32008,
330
+ CONFLICT: -32009,
331
+ PRECONDITION_FAILED: -32012,
332
+ PAYLOAD_TOO_LARGE: -32013,
333
+ UNSUPPORTED_MEDIA_TYPE: -32015,
334
+ UNPROCESSABLE_CONTENT: -32022,
335
+ PRECONDITION_REQUIRED: -32028,
336
+ TOO_MANY_REQUESTS: -32029,
337
+ CLIENT_CLOSED_REQUEST: -32099
338
+ };
339
+ var retryableRpcCodes = [
340
+ TRPC_ERROR_CODES_BY_KEY.BAD_GATEWAY,
341
+ TRPC_ERROR_CODES_BY_KEY.SERVICE_UNAVAILABLE,
342
+ TRPC_ERROR_CODES_BY_KEY.GATEWAY_TIMEOUT,
343
+ TRPC_ERROR_CODES_BY_KEY.INTERNAL_SERVER_ERROR
344
+ ];
345
+
346
+ // ../../node_modules/.bun/@trpc+server@11.17.0+1fb4c65d43e298b9/node_modules/@trpc/server/dist/getErrorShape-BPSzUA7W.mjs
347
+ var __create2 = Object.create;
348
+ var __defProp2 = Object.defineProperty;
349
+ var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
350
+ var __getOwnPropNames2 = Object.getOwnPropertyNames;
351
+ var __getProtoOf2 = Object.getPrototypeOf;
352
+ var __hasOwnProp2 = Object.prototype.hasOwnProperty;
353
+ var __commonJS2 = (cb, mod) => function() {
354
+ return mod || (0, cb[__getOwnPropNames2(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
355
+ };
356
+ var __copyProps2 = (to, from, except, desc) => {
357
+ if (from && typeof from === "object" || typeof from === "function")
358
+ for (var keys = __getOwnPropNames2(from), i = 0, n = keys.length, key;i < n; i++) {
359
+ key = keys[i];
360
+ if (!__hasOwnProp2.call(to, key) && key !== except)
361
+ __defProp2(to, key, {
362
+ get: ((k) => from[k]).bind(null, key),
363
+ enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable
364
+ });
365
+ }
366
+ return to;
367
+ };
368
+ var __toESM2 = (mod, isNodeMode, target) => (target = mod != null ? __create2(__getProtoOf2(mod)) : {}, __copyProps2(isNodeMode || !mod || !mod.__esModule ? __defProp2(target, "default", {
369
+ value: mod,
370
+ enumerable: true
371
+ }) : target, mod));
372
+ var noop = () => {};
373
+ var freezeIfAvailable = (obj) => {
374
+ if (Object.freeze)
375
+ Object.freeze(obj);
376
+ };
377
+ function createInnerProxy(callback, path, memo) {
378
+ var _memo$cacheKey;
379
+ const cacheKey = path.join(".");
380
+ (_memo$cacheKey = memo[cacheKey]) !== null && _memo$cacheKey !== undefined || (memo[cacheKey] = new Proxy(noop, {
381
+ get(_obj, key) {
382
+ if (typeof key !== "string" || key === "then")
383
+ return;
384
+ return createInnerProxy(callback, [...path, key], memo);
385
+ },
386
+ apply(_1, _2, args) {
387
+ const lastOfPath = path[path.length - 1];
388
+ if (lastOfPath === "valueOf" || lastOfPath === "toString" || lastOfPath === "toJSON") {
389
+ const debugPath = path.slice(0, -1).join(".");
390
+ return `tRPC.proxy(${debugPath})`;
391
+ }
392
+ let opts = {
393
+ args,
394
+ path
395
+ };
396
+ if (lastOfPath === "call")
397
+ opts = {
398
+ args: args.length >= 2 ? [args[1]] : [],
399
+ path: path.slice(0, -1)
400
+ };
401
+ else if (lastOfPath === "apply")
402
+ opts = {
403
+ args: args.length >= 2 ? args[1] : [],
404
+ path: path.slice(0, -1)
405
+ };
406
+ freezeIfAvailable(opts.args);
407
+ freezeIfAvailable(opts.path);
408
+ return callback(opts);
409
+ }
410
+ }));
411
+ return memo[cacheKey];
412
+ }
413
+ var createRecursiveProxy = (callback) => createInnerProxy(callback, [], emptyObject());
414
+ var createFlatProxy = (callback) => {
415
+ return new Proxy(noop, { get(_obj, name) {
416
+ if (name === "then")
417
+ return;
418
+ return callback(name);
419
+ } });
420
+ };
421
+ var require_typeof2 = __commonJS2({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/typeof.js"(exports, module) {
422
+ function _typeof$2(o) {
423
+ "@babel/helpers - typeof";
424
+ return module.exports = _typeof$2 = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(o$1) {
425
+ return typeof o$1;
426
+ } : function(o$1) {
427
+ return o$1 && typeof Symbol == "function" && o$1.constructor === Symbol && o$1 !== Symbol.prototype ? "symbol" : typeof o$1;
428
+ }, module.exports.__esModule = true, module.exports["default"] = module.exports, _typeof$2(o);
429
+ }
430
+ module.exports = _typeof$2, module.exports.__esModule = true, module.exports["default"] = module.exports;
431
+ } });
432
+ var require_toPrimitive2 = __commonJS2({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js"(exports, module) {
433
+ var _typeof$1 = require_typeof2()["default"];
434
+ function toPrimitive$1(t, r) {
435
+ if (_typeof$1(t) != "object" || !t)
436
+ return t;
437
+ var e = t[Symbol.toPrimitive];
438
+ if (e !== undefined) {
439
+ var i = e.call(t, r || "default");
440
+ if (_typeof$1(i) != "object")
441
+ return i;
442
+ throw new TypeError("@@toPrimitive must return a primitive value.");
443
+ }
444
+ return (r === "string" ? String : Number)(t);
445
+ }
446
+ module.exports = toPrimitive$1, module.exports.__esModule = true, module.exports["default"] = module.exports;
447
+ } });
448
+ var require_toPropertyKey2 = __commonJS2({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js"(exports, module) {
449
+ var _typeof = require_typeof2()["default"];
450
+ var toPrimitive = require_toPrimitive2();
451
+ function toPropertyKey$1(t) {
452
+ var i = toPrimitive(t, "string");
453
+ return _typeof(i) == "symbol" ? i : i + "";
454
+ }
455
+ module.exports = toPropertyKey$1, module.exports.__esModule = true, module.exports["default"] = module.exports;
456
+ } });
457
+ var require_defineProperty2 = __commonJS2({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js"(exports, module) {
458
+ var toPropertyKey = require_toPropertyKey2();
459
+ function _defineProperty(e, r, t) {
460
+ return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
461
+ value: t,
462
+ enumerable: true,
463
+ configurable: true,
464
+ writable: true
465
+ }) : e[r] = t, e;
466
+ }
467
+ module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports;
468
+ } });
469
+ var require_objectSpread22 = __commonJS2({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/objectSpread2.js"(exports, module) {
470
+ var defineProperty = require_defineProperty2();
471
+ function ownKeys(e, r) {
472
+ var t = Object.keys(e);
473
+ if (Object.getOwnPropertySymbols) {
474
+ var o = Object.getOwnPropertySymbols(e);
475
+ r && (o = o.filter(function(r$1) {
476
+ return Object.getOwnPropertyDescriptor(e, r$1).enumerable;
477
+ })), t.push.apply(t, o);
478
+ }
479
+ return t;
480
+ }
481
+ function _objectSpread2(e) {
482
+ for (var r = 1;r < arguments.length; r++) {
483
+ var t = arguments[r] != null ? arguments[r] : {};
484
+ r % 2 ? ownKeys(Object(t), true).forEach(function(r$1) {
485
+ defineProperty(e, r$1, t[r$1]);
486
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r$1) {
487
+ Object.defineProperty(e, r$1, Object.getOwnPropertyDescriptor(t, r$1));
488
+ });
489
+ }
490
+ return e;
491
+ }
492
+ module.exports = _objectSpread2, module.exports.__esModule = true, module.exports["default"] = module.exports;
493
+ } });
494
+ var import_objectSpread2 = __toESM2(require_objectSpread22(), 1);
495
+
496
+ // ../../node_modules/.bun/@trpc+server@11.17.0+1fb4c65d43e298b9/node_modules/@trpc/server/dist/tracked-DWInO6EQ.mjs
497
+ var import_defineProperty = __toESM2(require_defineProperty2(), 1);
498
+ var import_objectSpread2$1 = __toESM2(require_objectSpread22(), 1);
499
+ function transformResultInner(response, transformer) {
500
+ if ("error" in response) {
501
+ const error = transformer.deserialize(response.error);
502
+ return {
503
+ ok: false,
504
+ error: (0, import_objectSpread2$1.default)((0, import_objectSpread2$1.default)({}, response), {}, { error })
505
+ };
506
+ }
507
+ const result = (0, import_objectSpread2$1.default)((0, import_objectSpread2$1.default)({}, response.result), (!response.result.type || response.result.type === "data") && {
508
+ type: "data",
509
+ data: transformer.deserialize(response.result.data)
510
+ });
511
+ return {
512
+ ok: true,
513
+ result
514
+ };
515
+ }
516
+ var TransformResultError = class extends Error {
517
+ constructor() {
518
+ super("Unable to transform response from server");
519
+ }
520
+ };
521
+ function transformResult(response, transformer) {
522
+ let result;
523
+ try {
524
+ result = transformResultInner(response, transformer);
525
+ } catch (_unused) {
526
+ throw new TransformResultError;
527
+ }
528
+ if (!result.ok && (!isObject(result.error.error) || typeof result.error.error["code"] !== "number"))
529
+ throw new TransformResultError;
530
+ if (result.ok && !isObject(result.result))
531
+ throw new TransformResultError;
532
+ return result;
533
+ }
534
+ var import_objectSpread22 = __toESM2(require_objectSpread22(), 1);
535
+ var trackedSymbol = Symbol();
536
+ // ../../node_modules/.bun/@trpc+client@11.17.0+f02ef5e6ba82b535/node_modules/@trpc/client/dist/TRPCClientError-apv8gw59.mjs
537
+ var import_defineProperty2 = __toESM(require_defineProperty(), 1);
538
+ var import_objectSpread23 = __toESM(require_objectSpread2(), 1);
539
+ function isTRPCClientError(cause) {
540
+ return cause instanceof TRPCClientError;
541
+ }
542
+ function isTRPCErrorResponse(obj) {
543
+ return isObject(obj) && isObject(obj["error"]) && typeof obj["error"]["code"] === "number" && typeof obj["error"]["message"] === "string";
544
+ }
545
+ function getMessageFromUnknownError(err, fallback) {
546
+ if (typeof err === "string")
547
+ return err;
548
+ if (isObject(err) && typeof err["message"] === "string")
549
+ return err["message"];
550
+ return fallback;
551
+ }
552
+ var TRPCClientError = class TRPCClientError2 extends Error {
553
+ constructor(message, opts) {
554
+ var _opts$result, _opts$result2;
555
+ const cause = opts === null || opts === undefined ? undefined : opts.cause;
556
+ super(message, { cause });
557
+ (0, import_defineProperty2.default)(this, "cause", undefined);
558
+ (0, import_defineProperty2.default)(this, "shape", undefined);
559
+ (0, import_defineProperty2.default)(this, "data", undefined);
560
+ (0, import_defineProperty2.default)(this, "meta", undefined);
561
+ this.meta = opts === null || opts === undefined ? undefined : opts.meta;
562
+ this.cause = cause;
563
+ this.shape = opts === null || opts === undefined || (_opts$result = opts.result) === null || _opts$result === undefined ? undefined : _opts$result.error;
564
+ this.data = opts === null || opts === undefined || (_opts$result2 = opts.result) === null || _opts$result2 === undefined ? undefined : _opts$result2.error.data;
565
+ this.name = "TRPCClientError";
566
+ Object.setPrototypeOf(this, TRPCClientError2.prototype);
567
+ }
568
+ static from(_cause, opts = {}) {
569
+ const cause = _cause;
570
+ if (isTRPCClientError(cause)) {
571
+ if (opts.meta)
572
+ cause.meta = (0, import_objectSpread23.default)((0, import_objectSpread23.default)({}, cause.meta), opts.meta);
573
+ return cause;
574
+ }
575
+ if (isTRPCErrorResponse(cause))
576
+ return new TRPCClientError2(cause.error.message, (0, import_objectSpread23.default)((0, import_objectSpread23.default)({}, opts), {}, {
577
+ result: cause,
578
+ cause: opts.cause
579
+ }));
580
+ return new TRPCClientError2(getMessageFromUnknownError(cause, "Unknown error"), (0, import_objectSpread23.default)((0, import_objectSpread23.default)({}, opts), {}, { cause }));
581
+ }
582
+ };
583
+
584
+ // ../../node_modules/.bun/@trpc+client@11.17.0+f02ef5e6ba82b535/node_modules/@trpc/client/dist/unstable-internals-Bg7n9BBj.mjs
585
+ function getTransformer(transformer) {
586
+ const _transformer = transformer;
587
+ if (!_transformer)
588
+ return {
589
+ input: {
590
+ serialize: (data) => data,
591
+ deserialize: (data) => data
592
+ },
593
+ output: {
594
+ serialize: (data) => data,
595
+ deserialize: (data) => data
596
+ }
597
+ };
598
+ if ("input" in _transformer)
599
+ return _transformer;
600
+ return {
601
+ input: _transformer,
602
+ output: _transformer
603
+ };
604
+ }
605
+
606
+ // ../../node_modules/.bun/@trpc+client@11.17.0+f02ef5e6ba82b535/node_modules/@trpc/client/dist/httpUtils-pyf5RF99.mjs
607
+ var isFunction2 = (fn) => typeof fn === "function";
608
+ function getFetch(customFetchImpl) {
609
+ if (customFetchImpl)
610
+ return customFetchImpl;
611
+ if (typeof window !== "undefined" && isFunction2(window.fetch))
612
+ return window.fetch;
613
+ if (typeof globalThis !== "undefined" && isFunction2(globalThis.fetch))
614
+ return globalThis.fetch;
615
+ throw new Error("No fetch implementation found");
616
+ }
617
+ var import_objectSpread24 = __toESM(require_objectSpread2(), 1);
618
+ function resolveHTTPLinkOptions(opts) {
619
+ return {
620
+ url: opts.url.toString(),
621
+ fetch: opts.fetch,
622
+ transformer: getTransformer(opts.transformer),
623
+ methodOverride: opts.methodOverride
624
+ };
625
+ }
626
+ function arrayToDict(array) {
627
+ const dict = {};
628
+ for (let index = 0;index < array.length; index++) {
629
+ const element = array[index];
630
+ dict[index] = element;
631
+ }
632
+ return dict;
633
+ }
634
+ var METHOD = {
635
+ query: "GET",
636
+ mutation: "POST",
637
+ subscription: "PATCH"
638
+ };
639
+ function getInput(opts) {
640
+ return "input" in opts ? opts.transformer.input.serialize(opts.input) : arrayToDict(opts.inputs.map((_input) => opts.transformer.input.serialize(_input)));
641
+ }
642
+ var getUrl = (opts) => {
643
+ const parts = opts.url.split("?");
644
+ const base = parts[0].replace(/\/$/, "");
645
+ let url = base + "/" + opts.path;
646
+ const queryParts = [];
647
+ if (parts[1])
648
+ queryParts.push(parts[1]);
649
+ if ("inputs" in opts)
650
+ queryParts.push("batch=1");
651
+ if (opts.type === "query" || opts.type === "subscription") {
652
+ const input = getInput(opts);
653
+ if (input !== undefined && opts.methodOverride !== "POST")
654
+ queryParts.push(`input=${encodeURIComponent(JSON.stringify(input))}`);
655
+ }
656
+ if (queryParts.length)
657
+ url += "?" + queryParts.join("&");
658
+ return url;
659
+ };
660
+ var getBody = (opts) => {
661
+ if (opts.type === "query" && opts.methodOverride !== "POST")
662
+ return;
663
+ const input = getInput(opts);
664
+ return input !== undefined ? JSON.stringify(input) : undefined;
665
+ };
666
+ var jsonHttpRequester = (opts) => {
667
+ return httpRequest((0, import_objectSpread24.default)((0, import_objectSpread24.default)({}, opts), {}, {
668
+ contentTypeHeader: "application/json",
669
+ getUrl,
670
+ getBody
671
+ }));
672
+ };
673
+ var AbortError = class extends Error {
674
+ constructor() {
675
+ const name = "AbortError";
676
+ super(name);
677
+ this.name = name;
678
+ this.message = name;
679
+ }
680
+ };
681
+ var throwIfAborted = (signal) => {
682
+ var _signal$throwIfAborte;
683
+ if (!(signal === null || signal === undefined ? undefined : signal.aborted))
684
+ return;
685
+ (_signal$throwIfAborte = signal.throwIfAborted) === null || _signal$throwIfAborte === undefined || _signal$throwIfAborte.call(signal);
686
+ if (typeof DOMException !== "undefined")
687
+ throw new DOMException("AbortError", "AbortError");
688
+ throw new AbortError;
689
+ };
690
+ async function fetchHTTPResponse(opts) {
691
+ var _opts$methodOverride, _opts$trpcAcceptHeade;
692
+ throwIfAborted(opts.signal);
693
+ const url = opts.getUrl(opts);
694
+ const body = opts.getBody(opts);
695
+ const method = (_opts$methodOverride = opts.methodOverride) !== null && _opts$methodOverride !== undefined ? _opts$methodOverride : METHOD[opts.type];
696
+ const resolvedHeaders = await (async () => {
697
+ const heads = await opts.headers();
698
+ if (Symbol.iterator in heads)
699
+ return Object.fromEntries(heads);
700
+ return heads;
701
+ })();
702
+ const headers = (0, import_objectSpread24.default)((0, import_objectSpread24.default)((0, import_objectSpread24.default)({}, opts.contentTypeHeader && method !== "GET" ? { "content-type": opts.contentTypeHeader } : {}), opts.trpcAcceptHeader ? { [(_opts$trpcAcceptHeade = opts.trpcAcceptHeaderKey) !== null && _opts$trpcAcceptHeade !== undefined ? _opts$trpcAcceptHeade : "trpc-accept"]: opts.trpcAcceptHeader } : undefined), resolvedHeaders);
703
+ return getFetch(opts.fetch)(url, {
704
+ method,
705
+ signal: opts.signal,
706
+ body,
707
+ headers
708
+ });
709
+ }
710
+ async function httpRequest(opts) {
711
+ const meta = {};
712
+ const res = await fetchHTTPResponse(opts);
713
+ meta.response = res;
714
+ const json = await res.json();
715
+ meta.responseJSON = json;
716
+ return {
717
+ json,
718
+ meta
719
+ };
720
+ }
721
+
722
+ // ../../node_modules/.bun/@trpc+client@11.17.0+f02ef5e6ba82b535/node_modules/@trpc/client/dist/httpLink-lG_6juPY.mjs
723
+ var import_objectSpread25 = __toESM(require_objectSpread2(), 1);
724
+
725
+ // ../../node_modules/.bun/@trpc+client@11.17.0+f02ef5e6ba82b535/node_modules/@trpc/client/dist/httpBatchLink-LhidKAPw.mjs
726
+ var throwFatalError = () => {
727
+ throw new Error("Something went wrong. Please submit an issue at https://github.com/trpc/trpc/issues/new");
728
+ };
729
+ function dataLoader(batchLoader) {
730
+ let pendingItems = null;
731
+ let dispatchTimer = null;
732
+ const destroyTimerAndPendingItems = () => {
733
+ clearTimeout(dispatchTimer);
734
+ dispatchTimer = null;
735
+ pendingItems = null;
736
+ };
737
+ function groupItems(items) {
738
+ const groupedItems = [[]];
739
+ let index = 0;
740
+ while (true) {
741
+ const item = items[index];
742
+ if (!item)
743
+ break;
744
+ const lastGroup = groupedItems[groupedItems.length - 1];
745
+ if (item.aborted) {
746
+ var _item$reject;
747
+ (_item$reject = item.reject) === null || _item$reject === undefined || _item$reject.call(item, new Error("Aborted"));
748
+ index++;
749
+ continue;
750
+ }
751
+ const isValid = batchLoader.validate(lastGroup.concat(item).map((it) => it.key));
752
+ if (isValid) {
753
+ lastGroup.push(item);
754
+ index++;
755
+ continue;
756
+ }
757
+ if (lastGroup.length === 0) {
758
+ var _item$reject2;
759
+ (_item$reject2 = item.reject) === null || _item$reject2 === undefined || _item$reject2.call(item, new Error("Input is too big for a single dispatch"));
760
+ index++;
761
+ continue;
762
+ }
763
+ groupedItems.push([]);
764
+ }
765
+ return groupedItems;
766
+ }
767
+ function dispatch() {
768
+ const groupedItems = groupItems(pendingItems);
769
+ destroyTimerAndPendingItems();
770
+ for (const items of groupedItems) {
771
+ if (!items.length)
772
+ continue;
773
+ const batch = { items };
774
+ for (const item of items)
775
+ item.batch = batch;
776
+ const promise = batchLoader.fetch(batch.items.map((_item) => _item.key));
777
+ promise.then(async (result) => {
778
+ await Promise.all(result.map(async (valueOrPromise, index) => {
779
+ const item = batch.items[index];
780
+ try {
781
+ var _item$resolve;
782
+ const value = await Promise.resolve(valueOrPromise);
783
+ (_item$resolve = item.resolve) === null || _item$resolve === undefined || _item$resolve.call(item, value);
784
+ } catch (cause) {
785
+ var _item$reject3;
786
+ (_item$reject3 = item.reject) === null || _item$reject3 === undefined || _item$reject3.call(item, cause);
787
+ }
788
+ item.batch = null;
789
+ item.reject = null;
790
+ item.resolve = null;
791
+ }));
792
+ for (const item of batch.items) {
793
+ var _item$reject4;
794
+ (_item$reject4 = item.reject) === null || _item$reject4 === undefined || _item$reject4.call(item, new Error("Missing result"));
795
+ item.batch = null;
796
+ }
797
+ }).catch((cause) => {
798
+ for (const item of batch.items) {
799
+ var _item$reject5;
800
+ (_item$reject5 = item.reject) === null || _item$reject5 === undefined || _item$reject5.call(item, cause);
801
+ item.batch = null;
802
+ }
803
+ });
804
+ }
805
+ }
806
+ function load(key) {
807
+ var _dispatchTimer;
808
+ const item = {
809
+ aborted: false,
810
+ key,
811
+ batch: null,
812
+ resolve: throwFatalError,
813
+ reject: throwFatalError
814
+ };
815
+ const promise = new Promise((resolve, reject) => {
816
+ var _pendingItems;
817
+ item.reject = reject;
818
+ item.resolve = resolve;
819
+ (_pendingItems = pendingItems) !== null && _pendingItems !== undefined || (pendingItems = []);
820
+ pendingItems.push(item);
821
+ });
822
+ (_dispatchTimer = dispatchTimer) !== null && _dispatchTimer !== undefined || (dispatchTimer = setTimeout(dispatch));
823
+ return promise;
824
+ }
825
+ return { load };
826
+ }
827
+ function allAbortSignals(...signals) {
828
+ const ac = new AbortController;
829
+ const count = signals.length;
830
+ let abortedCount = 0;
831
+ const onAbort = () => {
832
+ if (++abortedCount === count)
833
+ ac.abort();
834
+ };
835
+ for (const signal of signals)
836
+ if (signal === null || signal === undefined ? undefined : signal.aborted)
837
+ onAbort();
838
+ else
839
+ signal === null || signal === undefined || signal.addEventListener("abort", onAbort, { once: true });
840
+ return ac.signal;
841
+ }
842
+ var import_objectSpread26 = __toESM(require_objectSpread2(), 1);
843
+ function httpBatchLink(opts) {
844
+ var _opts$maxURLLength, _opts$maxItems;
845
+ const resolvedOpts = resolveHTTPLinkOptions(opts);
846
+ const maxURLLength = (_opts$maxURLLength = opts.maxURLLength) !== null && _opts$maxURLLength !== undefined ? _opts$maxURLLength : Infinity;
847
+ const maxItems = (_opts$maxItems = opts.maxItems) !== null && _opts$maxItems !== undefined ? _opts$maxItems : Infinity;
848
+ return () => {
849
+ const batchLoader = (type) => {
850
+ return {
851
+ validate(batchOps) {
852
+ if (maxURLLength === Infinity && maxItems === Infinity)
853
+ return true;
854
+ if (batchOps.length > maxItems)
855
+ return false;
856
+ const path = batchOps.map((op) => op.path).join(",");
857
+ const inputs = batchOps.map((op) => op.input);
858
+ const url = getUrl((0, import_objectSpread26.default)((0, import_objectSpread26.default)({}, resolvedOpts), {}, {
859
+ type,
860
+ path,
861
+ inputs,
862
+ signal: null
863
+ }));
864
+ return url.length <= maxURLLength;
865
+ },
866
+ async fetch(batchOps) {
867
+ const path = batchOps.map((op) => op.path).join(",");
868
+ const inputs = batchOps.map((op) => op.input);
869
+ const signal = allAbortSignals(...batchOps.map((op) => op.signal));
870
+ const res = await jsonHttpRequester((0, import_objectSpread26.default)((0, import_objectSpread26.default)({}, resolvedOpts), {}, {
871
+ path,
872
+ inputs,
873
+ type,
874
+ headers() {
875
+ if (!opts.headers)
876
+ return {};
877
+ if (typeof opts.headers === "function")
878
+ return opts.headers({ opList: batchOps });
879
+ return opts.headers;
880
+ },
881
+ signal
882
+ }));
883
+ const resJSON = Array.isArray(res.json) ? res.json : batchOps.map(() => res.json);
884
+ const result = resJSON.map((item) => ({
885
+ meta: res.meta,
886
+ json: item
887
+ }));
888
+ return result;
889
+ }
890
+ };
891
+ };
892
+ const query = dataLoader(batchLoader("query"));
893
+ const mutation = dataLoader(batchLoader("mutation"));
894
+ const loaders = {
895
+ query,
896
+ mutation
897
+ };
898
+ return ({ op }) => {
899
+ return observable((observer) => {
900
+ if (op.type === "subscription")
901
+ throw new Error("Subscriptions are unsupported by `httpLink` - use `httpSubscriptionLink` or `wsLink`");
902
+ const loader = loaders[op.type];
903
+ const promise = loader.load(op);
904
+ let _res = undefined;
905
+ promise.then((res) => {
906
+ _res = res;
907
+ const transformed = transformResult(res.json, resolvedOpts.transformer.output);
908
+ if (!transformed.ok) {
909
+ observer.error(TRPCClientError.from(transformed.error, { meta: res.meta }));
910
+ return;
911
+ }
912
+ observer.next({
913
+ context: res.meta,
914
+ result: transformed.result
915
+ });
916
+ observer.complete();
917
+ }).catch((err) => {
918
+ observer.error(TRPCClientError.from(err, { meta: _res === null || _res === undefined ? undefined : _res.meta }));
919
+ });
920
+ return () => {};
921
+ });
922
+ };
923
+ };
924
+ }
925
+
926
+ // ../../node_modules/.bun/@trpc+client@11.17.0+f02ef5e6ba82b535/node_modules/@trpc/client/dist/loggerLink-ineCN1PO.mjs
927
+ var import_objectSpread27 = __toESM(require_objectSpread2(), 1);
928
+
929
+ // ../../node_modules/.bun/@trpc+client@11.17.0+f02ef5e6ba82b535/node_modules/@trpc/client/dist/wsLink-DSf4KOdW.mjs
930
+ var resultOf = (value, ...args) => {
931
+ return typeof value === "function" ? value(...args) : value;
932
+ };
933
+ var import_defineProperty$3 = __toESM(require_defineProperty(), 1);
934
+ function withResolvers() {
935
+ let resolve;
936
+ let reject;
937
+ const promise = new Promise((res, rej) => {
938
+ resolve = res;
939
+ reject = rej;
940
+ });
941
+ return {
942
+ promise,
943
+ resolve,
944
+ reject
945
+ };
946
+ }
947
+ async function prepareUrl(urlOptions) {
948
+ const url = await resultOf(urlOptions.url);
949
+ if (!urlOptions.connectionParams)
950
+ return url;
951
+ const prefix = url.includes("?") ? "&" : "?";
952
+ const connectionParams = `${prefix}connectionParams=1`;
953
+ return url + connectionParams;
954
+ }
955
+ async function buildConnectionMessage(connectionParams, encoder) {
956
+ const message = {
957
+ method: "connectionParams",
958
+ data: await resultOf(connectionParams)
959
+ };
960
+ return encoder.encode(message);
961
+ }
962
+ var import_defineProperty$2 = __toESM(require_defineProperty(), 1);
963
+ var import_defineProperty$1 = __toESM(require_defineProperty(), 1);
964
+ function asyncWsOpen(ws) {
965
+ const { promise, resolve, reject } = withResolvers();
966
+ ws.addEventListener("open", () => {
967
+ ws.removeEventListener("error", reject);
968
+ resolve();
969
+ });
970
+ ws.addEventListener("error", reject);
971
+ return promise;
972
+ }
973
+ function setupPingInterval(ws, { intervalMs, pongTimeoutMs }) {
974
+ let pingTimeout;
975
+ let pongTimeout;
976
+ function start() {
977
+ pingTimeout = setTimeout(() => {
978
+ ws.send("PING");
979
+ pongTimeout = setTimeout(() => {
980
+ ws.close();
981
+ }, pongTimeoutMs);
982
+ }, intervalMs);
983
+ }
984
+ function reset() {
985
+ clearTimeout(pingTimeout);
986
+ start();
987
+ }
988
+ function pong() {
989
+ clearTimeout(pongTimeout);
990
+ reset();
991
+ }
992
+ ws.addEventListener("open", start);
993
+ ws.addEventListener("message", ({ data }) => {
994
+ clearTimeout(pingTimeout);
995
+ start();
996
+ if (data === "PONG")
997
+ pong();
998
+ });
999
+ ws.addEventListener("close", () => {
1000
+ clearTimeout(pingTimeout);
1001
+ clearTimeout(pongTimeout);
1002
+ });
1003
+ }
1004
+ var WsConnection = class WsConnection2 {
1005
+ constructor(opts) {
1006
+ var _opts$WebSocketPonyfi;
1007
+ (0, import_defineProperty$1.default)(this, "id", ++WsConnection2.connectCount);
1008
+ (0, import_defineProperty$1.default)(this, "WebSocketPonyfill", undefined);
1009
+ (0, import_defineProperty$1.default)(this, "urlOptions", undefined);
1010
+ (0, import_defineProperty$1.default)(this, "keepAliveOpts", undefined);
1011
+ (0, import_defineProperty$1.default)(this, "encoder", undefined);
1012
+ (0, import_defineProperty$1.default)(this, "wsObservable", behaviorSubject(null));
1013
+ (0, import_defineProperty$1.default)(this, "openPromise", null);
1014
+ this.WebSocketPonyfill = (_opts$WebSocketPonyfi = opts.WebSocketPonyfill) !== null && _opts$WebSocketPonyfi !== undefined ? _opts$WebSocketPonyfi : WebSocket;
1015
+ if (!this.WebSocketPonyfill)
1016
+ throw new Error("No WebSocket implementation found - you probably don't want to use this on the server, but if you do you need to pass a `WebSocket`-ponyfill");
1017
+ this.urlOptions = opts.urlOptions;
1018
+ this.keepAliveOpts = opts.keepAlive;
1019
+ this.encoder = opts.encoder;
1020
+ }
1021
+ get ws() {
1022
+ return this.wsObservable.get();
1023
+ }
1024
+ set ws(ws) {
1025
+ this.wsObservable.next(ws);
1026
+ }
1027
+ isOpen() {
1028
+ return !!this.ws && this.ws.readyState === this.WebSocketPonyfill.OPEN && !this.openPromise;
1029
+ }
1030
+ isClosed() {
1031
+ return !!this.ws && (this.ws.readyState === this.WebSocketPonyfill.CLOSING || this.ws.readyState === this.WebSocketPonyfill.CLOSED);
1032
+ }
1033
+ async open() {
1034
+ var _this = this;
1035
+ if (_this.openPromise)
1036
+ return _this.openPromise;
1037
+ _this.id = ++WsConnection2.connectCount;
1038
+ const wsPromise = prepareUrl(_this.urlOptions).then((url) => new _this.WebSocketPonyfill(url));
1039
+ _this.openPromise = wsPromise.then(async (ws) => {
1040
+ _this.ws = ws;
1041
+ ws.binaryType = "arraybuffer";
1042
+ ws.addEventListener("message", function({ data }) {
1043
+ if (data === "PING")
1044
+ this.send("PONG");
1045
+ });
1046
+ if (_this.keepAliveOpts.enabled)
1047
+ setupPingInterval(ws, _this.keepAliveOpts);
1048
+ ws.addEventListener("close", () => {
1049
+ if (_this.ws === ws)
1050
+ _this.ws = null;
1051
+ });
1052
+ await asyncWsOpen(ws);
1053
+ if (_this.urlOptions.connectionParams)
1054
+ ws.send(await buildConnectionMessage(_this.urlOptions.connectionParams, _this.encoder));
1055
+ });
1056
+ try {
1057
+ await _this.openPromise;
1058
+ } finally {
1059
+ _this.openPromise = null;
1060
+ }
1061
+ }
1062
+ async close() {
1063
+ var _this2 = this;
1064
+ try {
1065
+ await _this2.openPromise;
1066
+ } finally {
1067
+ var _this$ws;
1068
+ (_this$ws = _this2.ws) === null || _this$ws === undefined || _this$ws.close();
1069
+ }
1070
+ }
1071
+ };
1072
+ (0, import_defineProperty$1.default)(WsConnection, "connectCount", 0);
1073
+ var import_defineProperty3 = __toESM(require_defineProperty(), 1);
1074
+ var import_objectSpread28 = __toESM(require_objectSpread2(), 1);
1075
+
1076
+ // ../../node_modules/.bun/@trpc+client@11.17.0+f02ef5e6ba82b535/node_modules/@trpc/client/dist/index.mjs
1077
+ var import_defineProperty4 = __toESM(require_defineProperty(), 1);
1078
+ var import_objectSpread2$4 = __toESM(require_objectSpread2(), 1);
1079
+ var TRPCUntypedClient = class {
1080
+ constructor(opts) {
1081
+ (0, import_defineProperty4.default)(this, "links", undefined);
1082
+ (0, import_defineProperty4.default)(this, "runtime", undefined);
1083
+ (0, import_defineProperty4.default)(this, "requestId", undefined);
1084
+ this.requestId = 0;
1085
+ this.runtime = {};
1086
+ this.links = opts.links.map((link) => link(this.runtime));
1087
+ }
1088
+ $request(opts) {
1089
+ var _opts$context;
1090
+ const chain$ = createChain({
1091
+ links: this.links,
1092
+ op: (0, import_objectSpread2$4.default)((0, import_objectSpread2$4.default)({}, opts), {}, {
1093
+ context: (_opts$context = opts.context) !== null && _opts$context !== undefined ? _opts$context : {},
1094
+ id: ++this.requestId
1095
+ })
1096
+ });
1097
+ return chain$.pipe(share());
1098
+ }
1099
+ async requestAsPromise(opts) {
1100
+ var _this = this;
1101
+ try {
1102
+ const req$ = _this.$request(opts);
1103
+ const envelope = await observableToPromise(req$);
1104
+ const data = envelope.result.data;
1105
+ return data;
1106
+ } catch (err) {
1107
+ throw TRPCClientError.from(err);
1108
+ }
1109
+ }
1110
+ query(path, input, opts) {
1111
+ return this.requestAsPromise({
1112
+ type: "query",
1113
+ path,
1114
+ input,
1115
+ context: opts === null || opts === undefined ? undefined : opts.context,
1116
+ signal: opts === null || opts === undefined ? undefined : opts.signal
1117
+ });
1118
+ }
1119
+ mutation(path, input, opts) {
1120
+ return this.requestAsPromise({
1121
+ type: "mutation",
1122
+ path,
1123
+ input,
1124
+ context: opts === null || opts === undefined ? undefined : opts.context,
1125
+ signal: opts === null || opts === undefined ? undefined : opts.signal
1126
+ });
1127
+ }
1128
+ subscription(path, input, opts) {
1129
+ const observable$ = this.$request({
1130
+ type: "subscription",
1131
+ path,
1132
+ input,
1133
+ context: opts.context,
1134
+ signal: opts.signal
1135
+ });
1136
+ return observable$.subscribe({
1137
+ next(envelope) {
1138
+ switch (envelope.result.type) {
1139
+ case "state": {
1140
+ var _opts$onConnectionSta;
1141
+ (_opts$onConnectionSta = opts.onConnectionStateChange) === null || _opts$onConnectionSta === undefined || _opts$onConnectionSta.call(opts, envelope.result);
1142
+ break;
1143
+ }
1144
+ case "started": {
1145
+ var _opts$onStarted;
1146
+ (_opts$onStarted = opts.onStarted) === null || _opts$onStarted === undefined || _opts$onStarted.call(opts, { context: envelope.context });
1147
+ break;
1148
+ }
1149
+ case "stopped": {
1150
+ var _opts$onStopped;
1151
+ (_opts$onStopped = opts.onStopped) === null || _opts$onStopped === undefined || _opts$onStopped.call(opts);
1152
+ break;
1153
+ }
1154
+ case "data":
1155
+ case undefined: {
1156
+ var _opts$onData;
1157
+ (_opts$onData = opts.onData) === null || _opts$onData === undefined || _opts$onData.call(opts, envelope.result.data);
1158
+ break;
1159
+ }
1160
+ }
1161
+ },
1162
+ error(err) {
1163
+ var _opts$onError;
1164
+ (_opts$onError = opts.onError) === null || _opts$onError === undefined || _opts$onError.call(opts, err);
1165
+ },
1166
+ complete() {
1167
+ var _opts$onComplete;
1168
+ (_opts$onComplete = opts.onComplete) === null || _opts$onComplete === undefined || _opts$onComplete.call(opts);
1169
+ }
1170
+ });
1171
+ }
1172
+ };
1173
+ var untypedClientSymbol = Symbol.for("trpc_untypedClient");
1174
+ var clientCallTypeMap = {
1175
+ query: "query",
1176
+ mutate: "mutation",
1177
+ subscribe: "subscription"
1178
+ };
1179
+ var clientCallTypeToProcedureType = (clientCallType) => {
1180
+ return clientCallTypeMap[clientCallType];
1181
+ };
1182
+ function createTRPCClientProxy(client) {
1183
+ const proxy = createRecursiveProxy(({ path, args }) => {
1184
+ const pathCopy = [...path];
1185
+ const procedureType = clientCallTypeToProcedureType(pathCopy.pop());
1186
+ const fullPath = pathCopy.join(".");
1187
+ return client[procedureType](fullPath, ...args);
1188
+ });
1189
+ return createFlatProxy((key) => {
1190
+ if (key === untypedClientSymbol)
1191
+ return client;
1192
+ return proxy[key];
1193
+ });
1194
+ }
1195
+ function createTRPCClient(opts) {
1196
+ const client = new TRPCUntypedClient(opts);
1197
+ const proxy = createTRPCClientProxy(client);
1198
+ return proxy;
1199
+ }
1200
+ var import_objectSpread2$3 = __toESM(require_objectSpread2(), 1);
1201
+ var import_objectSpread2$2 = __toESM(require_objectSpread2(), 1);
1202
+ var require_asyncIterator = __commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncIterator.js"(exports, module) {
1203
+ function _asyncIterator$1(r) {
1204
+ var n, t, o, e = 2;
1205
+ for (typeof Symbol != "undefined" && (t = Symbol.asyncIterator, o = Symbol.iterator);e--; ) {
1206
+ if (t && (n = r[t]) != null)
1207
+ return n.call(r);
1208
+ if (o && (n = r[o]) != null)
1209
+ return new AsyncFromSyncIterator(n.call(r));
1210
+ t = "@@asyncIterator", o = "@@iterator";
1211
+ }
1212
+ throw new TypeError("Object is not async iterable");
1213
+ }
1214
+ function AsyncFromSyncIterator(r) {
1215
+ function AsyncFromSyncIteratorContinuation(r$1) {
1216
+ if (Object(r$1) !== r$1)
1217
+ return Promise.reject(new TypeError(r$1 + " is not an object."));
1218
+ var n = r$1.done;
1219
+ return Promise.resolve(r$1.value).then(function(r$2) {
1220
+ return {
1221
+ value: r$2,
1222
+ done: n
1223
+ };
1224
+ });
1225
+ }
1226
+ return AsyncFromSyncIterator = function AsyncFromSyncIterator$1(r$1) {
1227
+ this.s = r$1, this.n = r$1.next;
1228
+ }, AsyncFromSyncIterator.prototype = {
1229
+ s: null,
1230
+ n: null,
1231
+ next: function next() {
1232
+ return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));
1233
+ },
1234
+ return: function _return(r$1) {
1235
+ var n = this.s["return"];
1236
+ return n === undefined ? Promise.resolve({
1237
+ value: r$1,
1238
+ done: true
1239
+ }) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments));
1240
+ },
1241
+ throw: function _throw(r$1) {
1242
+ var n = this.s["return"];
1243
+ return n === undefined ? Promise.reject(r$1) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments));
1244
+ }
1245
+ }, new AsyncFromSyncIterator(r);
1246
+ }
1247
+ module.exports = _asyncIterator$1, module.exports.__esModule = true, module.exports["default"] = module.exports;
1248
+ } });
1249
+ var import_asyncIterator = __toESM(require_asyncIterator(), 1);
1250
+ var import_objectSpread2$12 = __toESM(require_objectSpread2(), 1);
1251
+ var require_usingCtx = __commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/usingCtx.js"(exports, module) {
1252
+ function _usingCtx() {
1253
+ var r = typeof SuppressedError == "function" ? SuppressedError : function(r$1, e$1) {
1254
+ var n$1 = Error();
1255
+ return n$1.name = "SuppressedError", n$1.error = r$1, n$1.suppressed = e$1, n$1;
1256
+ }, e = {}, n = [];
1257
+ function using(r$1, e$1) {
1258
+ if (e$1 != null) {
1259
+ if (Object(e$1) !== e$1)
1260
+ throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");
1261
+ if (r$1)
1262
+ var o = e$1[Symbol.asyncDispose || Symbol["for"]("Symbol.asyncDispose")];
1263
+ if (o === undefined && (o = e$1[Symbol.dispose || Symbol["for"]("Symbol.dispose")], r$1))
1264
+ var t = o;
1265
+ if (typeof o != "function")
1266
+ throw new TypeError("Object is not disposable.");
1267
+ t && (o = function o$1() {
1268
+ try {
1269
+ t.call(e$1);
1270
+ } catch (r$2) {
1271
+ return Promise.reject(r$2);
1272
+ }
1273
+ }), n.push({
1274
+ v: e$1,
1275
+ d: o,
1276
+ a: r$1
1277
+ });
1278
+ } else
1279
+ r$1 && n.push({
1280
+ d: e$1,
1281
+ a: r$1
1282
+ });
1283
+ return e$1;
1284
+ }
1285
+ return {
1286
+ e,
1287
+ u: using.bind(null, false),
1288
+ a: using.bind(null, true),
1289
+ d: function d() {
1290
+ var o, t = this.e, s = 0;
1291
+ function next() {
1292
+ for (;o = n.pop(); )
1293
+ try {
1294
+ if (!o.a && s === 1)
1295
+ return s = 0, n.push(o), Promise.resolve().then(next);
1296
+ if (o.d) {
1297
+ var r$1 = o.d.call(o.v);
1298
+ if (o.a)
1299
+ return s |= 2, Promise.resolve(r$1).then(next, err);
1300
+ } else
1301
+ s |= 1;
1302
+ } catch (r$2) {
1303
+ return err(r$2);
1304
+ }
1305
+ if (s === 1)
1306
+ return t !== e ? Promise.reject(t) : Promise.resolve();
1307
+ if (t !== e)
1308
+ throw t;
1309
+ }
1310
+ function err(n$1) {
1311
+ return t = t !== e ? new r(n$1, t) : n$1, next();
1312
+ }
1313
+ return next();
1314
+ }
1315
+ };
1316
+ }
1317
+ module.exports = _usingCtx, module.exports.__esModule = true, module.exports["default"] = module.exports;
1318
+ } });
1319
+ var require_OverloadYield = __commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/OverloadYield.js"(exports, module) {
1320
+ function _OverloadYield(e, d) {
1321
+ this.v = e, this.k = d;
1322
+ }
1323
+ module.exports = _OverloadYield, module.exports.__esModule = true, module.exports["default"] = module.exports;
1324
+ } });
1325
+ var require_awaitAsyncGenerator = __commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/awaitAsyncGenerator.js"(exports, module) {
1326
+ var OverloadYield$1 = require_OverloadYield();
1327
+ function _awaitAsyncGenerator$1(e) {
1328
+ return new OverloadYield$1(e, 0);
1329
+ }
1330
+ module.exports = _awaitAsyncGenerator$1, module.exports.__esModule = true, module.exports["default"] = module.exports;
1331
+ } });
1332
+ var require_wrapAsyncGenerator = __commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/wrapAsyncGenerator.js"(exports, module) {
1333
+ var OverloadYield = require_OverloadYield();
1334
+ function _wrapAsyncGenerator$1(e) {
1335
+ return function() {
1336
+ return new AsyncGenerator(e.apply(this, arguments));
1337
+ };
1338
+ }
1339
+ function AsyncGenerator(e) {
1340
+ var r, t;
1341
+ function resume(r$1, t$1) {
1342
+ try {
1343
+ var n = e[r$1](t$1), o = n.value, u = o instanceof OverloadYield;
1344
+ Promise.resolve(u ? o.v : o).then(function(t$2) {
1345
+ if (u) {
1346
+ var i = r$1 === "return" ? "return" : "next";
1347
+ if (!o.k || t$2.done)
1348
+ return resume(i, t$2);
1349
+ t$2 = e[i](t$2).value;
1350
+ }
1351
+ settle(n.done ? "return" : "normal", t$2);
1352
+ }, function(e$1) {
1353
+ resume("throw", e$1);
1354
+ });
1355
+ } catch (e$1) {
1356
+ settle("throw", e$1);
1357
+ }
1358
+ }
1359
+ function settle(e$1, n) {
1360
+ switch (e$1) {
1361
+ case "return":
1362
+ r.resolve({
1363
+ value: n,
1364
+ done: true
1365
+ });
1366
+ break;
1367
+ case "throw":
1368
+ r.reject(n);
1369
+ break;
1370
+ default:
1371
+ r.resolve({
1372
+ value: n,
1373
+ done: false
1374
+ });
1375
+ }
1376
+ (r = r.next) ? resume(r.key, r.arg) : t = null;
1377
+ }
1378
+ this._invoke = function(e$1, n) {
1379
+ return new Promise(function(o, u) {
1380
+ var i = {
1381
+ key: e$1,
1382
+ arg: n,
1383
+ resolve: o,
1384
+ reject: u,
1385
+ next: null
1386
+ };
1387
+ t ? t = t.next = i : (r = t = i, resume(e$1, n));
1388
+ });
1389
+ }, typeof e["return"] != "function" && (this["return"] = undefined);
1390
+ }
1391
+ AsyncGenerator.prototype[typeof Symbol == "function" && Symbol.asyncIterator || "@@asyncIterator"] = function() {
1392
+ return this;
1393
+ }, AsyncGenerator.prototype.next = function(e) {
1394
+ return this._invoke("next", e);
1395
+ }, AsyncGenerator.prototype["throw"] = function(e) {
1396
+ return this._invoke("throw", e);
1397
+ }, AsyncGenerator.prototype["return"] = function(e) {
1398
+ return this._invoke("return", e);
1399
+ };
1400
+ module.exports = _wrapAsyncGenerator$1, module.exports.__esModule = true, module.exports["default"] = module.exports;
1401
+ } });
1402
+ var import_usingCtx = __toESM(require_usingCtx(), 1);
1403
+ var import_awaitAsyncGenerator = __toESM(require_awaitAsyncGenerator(), 1);
1404
+ var import_wrapAsyncGenerator = __toESM(require_wrapAsyncGenerator(), 1);
1405
+ var import_objectSpread29 = __toESM(require_objectSpread2(), 1);
1406
+
1407
+ // ../../packages/sdk/src/index.ts
1408
+ async function createAuthorizationHeaders(getAuthToken) {
1409
+ const token = await getAuthToken?.();
1410
+ if (!token) {
1411
+ return {};
1412
+ }
1413
+ return {
1414
+ authorization: `Bearer ${token}`
1415
+ };
1416
+ }
1417
+ async function getCadenceHealth(options = {}) {
1418
+ const baseUrl = options.baseUrl ?? getDefaultApiBaseUrl();
1419
+ const requestFetch = options.fetch ?? fetch;
1420
+ const response = await requestFetch(`${baseUrl}/health`, {
1421
+ headers: await createAuthorizationHeaders(options.getAuthToken)
1422
+ });
1423
+ if (!response.ok) {
1424
+ throw new Error(`Cadence API health check failed with HTTP ${response.status}.`);
1425
+ }
1426
+ return await response.json();
1427
+ }
1428
+ function createCadenceClient(options = {}) {
1429
+ const baseUrl = options.baseUrl ?? getDefaultApiBaseUrl();
1430
+ const healthOptions = {
1431
+ baseUrl,
1432
+ ...options.getAuthToken ? { getAuthToken: options.getAuthToken } : {},
1433
+ ...options.fetch ? { fetch: options.fetch } : {}
1434
+ };
1435
+ const rpc = createTRPCClient({
1436
+ links: [
1437
+ httpBatchLink({
1438
+ url: `${baseUrl}/trpc`,
1439
+ ...options.fetch ? { fetch: options.fetch } : {},
1440
+ headers: () => createAuthorizationHeaders(options.getAuthToken)
1441
+ })
1442
+ ]
1443
+ });
1444
+ return {
1445
+ packageName: "@cadence/sdk",
1446
+ baseUrl,
1447
+ rpc,
1448
+ health: () => getCadenceHealth(healthOptions),
1449
+ auth: {
1450
+ login: (input) => rpc.auth.login.mutate(input)
1451
+ },
1452
+ events: {
1453
+ list: (input) => rpc.events.list.query(input)
1454
+ },
1455
+ work: {
1456
+ overview: (input) => rpc.work.overview.query(input)
1457
+ },
1458
+ tickets: {
1459
+ get: (input) => rpc.tickets.get.query(input),
1460
+ list: (input) => rpc.tickets.list.query(input),
1461
+ create: (input) => rpc.tickets.create.mutate(input),
1462
+ attach: (input) => rpc.tickets.attach.mutate(input),
1463
+ update: (input) => rpc.tickets.update.mutate(input),
1464
+ changeStatus: (input) => rpc.tickets.changeStatus.mutate(input),
1465
+ complete: (input) => rpc.tickets.complete.mutate(input)
1466
+ },
1467
+ intake: {
1468
+ create: (input) => rpc.intake.create.mutate(input),
1469
+ dismiss: (input) => rpc.intake.dismiss.mutate(input)
1470
+ },
1471
+ sessions: {
1472
+ start: (input) => rpc.sessions.start.mutate(input),
1473
+ end: (input) => rpc.sessions.end.mutate(input),
1474
+ current: (input) => rpc.sessions.current.query(input),
1475
+ leases: {
1476
+ create: (input) => rpc.sessions.leases.create.mutate(input),
1477
+ release: (input) => rpc.sessions.leases.release.mutate(input)
1478
+ }
1479
+ },
1480
+ changesets: {
1481
+ create: (input) => rpc.changesets.create.mutate(input),
1482
+ get: (input) => rpc.changesets.get.query(input),
1483
+ list: (input) => rpc.changesets.list.query(input)
1484
+ }
1485
+ };
1486
+ }
1487
+
1488
+ // src/index.ts
1489
+ import { spawnSync } from "child_process";
1490
+ import { mkdir, writeFile } from "fs/promises";
1491
+ import { dirname, join, parse } from "path";
1492
+ import { createInterface } from "readline/promises";
1493
+ var ticketPriorities = ["low", "normal", "high", "urgent"];
1494
+ var ticketStatuses = ["backlog", "ready", "in_progress", "blocked", "review", "done", "abandoned"];
1495
+ var defaultLeaseTtlSeconds = 5 * 60 * 60;
1496
+ var defaultCliApiBaseUrl = "https://cadenceapi.deploy.lvl8studios.com";
1497
+
1498
+ class CliError extends Error {
1499
+ code;
1500
+ details;
1501
+ constructor(code, message, details = {}) {
1502
+ super(message);
1503
+ this.name = "CliError";
1504
+ this.code = code;
1505
+ this.details = details;
1506
+ }
1507
+ }
1508
+ function readFlagValue(argv, index, flag) {
1509
+ const value = argv[index + 1];
1510
+ if (!value || value.startsWith("--")) {
1511
+ throw new CliError("CLI_USAGE", `${flag} requires a value.`);
1512
+ }
1513
+ return value;
1514
+ }
1515
+ var knownCommandPaths = [
1516
+ ["auth", "login"],
1517
+ ["auth", "status"],
1518
+ ["auth", "logout"],
1519
+ ["changesets", "create"],
1520
+ ["changesets", "list"],
1521
+ ["changesets", "get"],
1522
+ ["sessions", "start"],
1523
+ ["sessions", "end"],
1524
+ ["sessions", "current"],
1525
+ ["intake", "dismiss"],
1526
+ ["intake"],
1527
+ ["tickets", "attach"],
1528
+ ["tickets", "complete"],
1529
+ ["tickets", "release"],
1530
+ ["tickets", "claim"],
1531
+ ["tickets", "update"],
1532
+ ["tickets", "create"],
1533
+ ["tickets", "list"],
1534
+ ["tickets", "get"],
1535
+ ["events", "list"],
1536
+ ["work", "overview"],
1537
+ ["init"],
1538
+ ["status"],
1539
+ ["help"]
1540
+ ];
1541
+ function isCommandMatch(words, commandPath) {
1542
+ return commandPath.every((part, index) => words[index] === part);
1543
+ }
1544
+ function resolveCommandPath(words) {
1545
+ if (words.length === 0) {
1546
+ return {
1547
+ path: ["help"],
1548
+ args: []
1549
+ };
1550
+ }
1551
+ const commandPath = knownCommandPaths.find((candidate) => isCommandMatch(words, candidate));
1552
+ if (!commandPath) {
1553
+ return {
1554
+ path: words,
1555
+ args: []
1556
+ };
1557
+ }
1558
+ return {
1559
+ path: [...commandPath],
1560
+ args: words.slice(commandPath.length)
1561
+ };
1562
+ }
1563
+ function parseCliArgs(argv) {
1564
+ const words = [];
1565
+ const options = {};
1566
+ let json = false;
1567
+ let help = false;
1568
+ let server;
1569
+ let project;
1570
+ for (let index = 0;index < argv.length; index += 1) {
1571
+ const arg = argv[index];
1572
+ if (!arg) {
1573
+ continue;
1574
+ }
1575
+ if (arg === "--json") {
1576
+ json = true;
1577
+ continue;
1578
+ }
1579
+ if (arg === "--help" || arg === "-h") {
1580
+ help = true;
1581
+ continue;
1582
+ }
1583
+ if (arg === "--server") {
1584
+ server = readFlagValue(argv, index, arg);
1585
+ index += 1;
1586
+ continue;
1587
+ }
1588
+ if (arg === "--project") {
1589
+ project = readFlagValue(argv, index, arg);
1590
+ index += 1;
1591
+ continue;
1592
+ }
1593
+ if (arg.startsWith("--")) {
1594
+ options[arg.slice(2)] = readFlagValue(argv, index, arg);
1595
+ index += 1;
1596
+ continue;
1597
+ }
1598
+ words.push(arg);
1599
+ }
1600
+ const command = resolveCommandPath(words);
1601
+ return {
1602
+ command: {
1603
+ path: command.path,
1604
+ name: command.path.join(".")
1605
+ },
1606
+ args: command.args,
1607
+ flags: {
1608
+ json,
1609
+ help,
1610
+ ...server ? { server } : {},
1611
+ ...project ? { project } : {}
1612
+ },
1613
+ options
1614
+ };
1615
+ }
1616
+ function safeJsonParse(source, filePath) {
1617
+ const parsed = JSON.parse(source);
1618
+ if (!parsed || typeof parsed !== "object") {
1619
+ throw new CliError("CONFIG_ERROR", `${filePath} must contain a JSON object.`);
1620
+ }
1621
+ const record = parsed;
1622
+ const server = typeof record.server === "string" ? record.server : undefined;
1623
+ const projectId = typeof record.projectId === "string" ? record.projectId : typeof record.project === "string" ? record.project : undefined;
1624
+ return {
1625
+ ...server ? { server } : {},
1626
+ ...projectId ? { projectId } : {}
1627
+ };
1628
+ }
1629
+ async function readOptionalConfig(filePath) {
1630
+ const file = Bun.file(filePath);
1631
+ if (!await file.exists()) {
1632
+ return {};
1633
+ }
1634
+ return safeJsonParse(await file.text(), filePath);
1635
+ }
1636
+ async function writeConfigFile(filePath, config) {
1637
+ await mkdir(dirname(filePath), { recursive: true });
1638
+ await writeFile(filePath, `${JSON.stringify(config, null, 2)}
1639
+ `);
1640
+ }
1641
+ async function mergeConfigFile(filePath, updates) {
1642
+ const existing = await readOptionalConfig(filePath);
1643
+ await writeConfigFile(filePath, {
1644
+ ...existing,
1645
+ ...updates
1646
+ });
1647
+ }
1648
+ async function findRepoConfigPath(cwd) {
1649
+ let current = cwd;
1650
+ while (true) {
1651
+ const candidate = join(current, ".cadence", "config.json");
1652
+ if (await Bun.file(candidate).exists()) {
1653
+ return candidate;
1654
+ }
1655
+ const parent = dirname(current);
1656
+ if (parent === current) {
1657
+ return null;
1658
+ }
1659
+ current = parent;
1660
+ }
1661
+ }
1662
+ function getConfigHome(env) {
1663
+ return env.CADENCE_CONFIG_HOME ?? (env.HOME ? join(env.HOME, ".config", "cadence") : join(parse(process.cwd()).root, ".config", "cadence"));
1664
+ }
1665
+ async function resolveCliConfig(flags, options = {}) {
1666
+ const env = options.env ?? process.env;
1667
+ const cwd = options.cwd ?? process.cwd();
1668
+ const globalConfigPath = join(getConfigHome(env), "config.json");
1669
+ const repoConfigPath = await findRepoConfigPath(cwd);
1670
+ const repoConfigPromise = repoConfigPath ? readOptionalConfig(repoConfigPath) : Promise.resolve({});
1671
+ const [globalConfig, repoConfig] = await Promise.all([
1672
+ readOptionalConfig(globalConfigPath),
1673
+ repoConfigPromise
1674
+ ]);
1675
+ const server = flags.server ?? repoConfig.server ?? globalConfig.server ?? defaultCliApiBaseUrl;
1676
+ const projectId = flags.project ?? repoConfig.projectId ?? globalConfig.projectId ?? null;
1677
+ return {
1678
+ server,
1679
+ projectId,
1680
+ repoConfigPath,
1681
+ globalConfigPath
1682
+ };
1683
+ }
1684
+ function runSecurity(args, input) {
1685
+ return spawnSync("security", [...args], {
1686
+ encoding: "utf8",
1687
+ ...input ? { input } : {}
1688
+ });
1689
+ }
1690
+ function createMacOsKeychainCredentialStore() {
1691
+ const service = "cadence-cli";
1692
+ return {
1693
+ async isAvailable() {
1694
+ if (process.platform !== "darwin") {
1695
+ return false;
1696
+ }
1697
+ const result = runSecurity(["-h"]);
1698
+ return result.error === undefined;
1699
+ },
1700
+ async getCredential(server) {
1701
+ const result = runSecurity(["find-generic-password", "-a", server, "-s", service, "-w"]);
1702
+ if (result.status !== 0) {
1703
+ return null;
1704
+ }
1705
+ return result.stdout.trim() || null;
1706
+ },
1707
+ async setCredential(server, credential) {
1708
+ const result = runSecurity(["add-generic-password", "-a", server, "-s", service, "-w", credential, "-U"]);
1709
+ if (result.status !== 0) {
1710
+ throw new CliError("CREDENTIAL_STORE_ERROR", "Could not store credential in the OS secure credential store.");
1711
+ }
1712
+ },
1713
+ async deleteCredential(server) {
1714
+ const result = runSecurity(["delete-generic-password", "-a", server, "-s", service]);
1715
+ if (result.status !== 0 && !String(result.stderr).includes("could not be found")) {
1716
+ throw new CliError("CREDENTIAL_STORE_ERROR", "Could not delete credential from the OS secure credential store.");
1717
+ }
1718
+ }
1719
+ };
1720
+ }
1721
+ function getCredentialStore(options) {
1722
+ return options.credentialStore ?? createMacOsKeychainCredentialStore();
1723
+ }
1724
+ async function readPromptText(options, message) {
1725
+ return options.readText ? options.readText(message) : promptText(message);
1726
+ }
1727
+ async function readPromptSecret(options, message) {
1728
+ return options.readSecret ? options.readSecret(message) : promptSecret(message);
1729
+ }
1730
+ function encodeCredential(credential) {
1731
+ return JSON.stringify(credential);
1732
+ }
1733
+ function decodeCredential(rawCredential) {
1734
+ try {
1735
+ const parsed = JSON.parse(rawCredential);
1736
+ if (parsed && typeof parsed === "object" && typeof parsed.accessToken === "string") {
1737
+ const record = parsed;
1738
+ return {
1739
+ accessToken: record.accessToken,
1740
+ ...typeof record.refreshToken === "string" ? { refreshToken: record.refreshToken } : {},
1741
+ ...typeof record.expiresAt === "string" ? { expiresAt: record.expiresAt } : {},
1742
+ ...typeof record.tokenType === "string" ? { tokenType: record.tokenType } : {}
1743
+ };
1744
+ }
1745
+ } catch {}
1746
+ return {
1747
+ accessToken: rawCredential
1748
+ };
1749
+ }
1750
+ async function readStoredCredential(store, server) {
1751
+ if (!await store.isAvailable()) {
1752
+ return null;
1753
+ }
1754
+ const rawCredential = await store.getCredential(server);
1755
+ return rawCredential ? decodeCredential(rawCredential) : null;
1756
+ }
1757
+ async function requireCredentialStore(store) {
1758
+ if (!await store.isAvailable()) {
1759
+ throw new CliError("CREDENTIAL_STORE_UNAVAILABLE", "OS secure credential storage is unavailable.");
1760
+ }
1761
+ }
1762
+ async function promptText(message) {
1763
+ if (!process.stdin.isTTY || !process.stderr.isTTY) {
1764
+ throw new CliError("AUTH_INTERACTIVE_REQUIRED", "Interactive auth requires a TTY.");
1765
+ }
1766
+ const readline = createInterface({
1767
+ input: process.stdin,
1768
+ output: process.stderr
1769
+ });
1770
+ try {
1771
+ return await readline.question(message);
1772
+ } finally {
1773
+ readline.close();
1774
+ }
1775
+ }
1776
+ async function promptSecret(message) {
1777
+ if (!process.stdin.isTTY || !process.stderr.isTTY) {
1778
+ throw new CliError("AUTH_INTERACTIVE_REQUIRED", "Interactive auth requires a TTY.");
1779
+ }
1780
+ spawnSync("stty", ["-echo"], { stdio: ["inherit", "ignore", "ignore"] });
1781
+ try {
1782
+ return await promptText(message);
1783
+ } finally {
1784
+ spawnSync("stty", ["echo"], { stdio: ["inherit", "ignore", "ignore"] });
1785
+ process.stderr.write(`
1786
+ `);
1787
+ }
1788
+ }
1789
+ function successEnvelope(data, meta) {
1790
+ return {
1791
+ success: true,
1792
+ data,
1793
+ error: null,
1794
+ meta
1795
+ };
1796
+ }
1797
+ function errorEnvelope(error, meta) {
1798
+ const cliError = error instanceof CliError ? error : new CliError("API_ERROR", error.message || "Unexpected CLI error.");
1799
+ return {
1800
+ success: false,
1801
+ data: null,
1802
+ error: {
1803
+ code: cliError.code,
1804
+ message: cliError.message,
1805
+ details: cliError.details
1806
+ },
1807
+ meta
1808
+ };
1809
+ }
1810
+ function formatJson(envelope) {
1811
+ return `${JSON.stringify(envelope, null, 2)}
1812
+ `;
1813
+ }
1814
+ function helpText() {
1815
+ return [
1816
+ "Cadence CLI",
1817
+ "",
1818
+ "Usage:",
1819
+ " cadence init --project <project-id> [--json]",
1820
+ " cadence auth login [--json]",
1821
+ " cadence auth status [--json]",
1822
+ " cadence auth logout [--json]",
1823
+ " cadence status [--project <project-id>] [--json]",
1824
+ " cadence work overview [--project <project-id>] [--json]",
1825
+ " cadence tickets get <ticket-id> [--project <project-id>] [--json]",
1826
+ " cadence tickets list [--project <project-id>] [--status <status>] [--json]",
1827
+ ' cadence intake "<request>" [--project <project-id>] [--json]',
1828
+ " cadence tickets attach <ticket-id> --from-intake <intake-id> --if-version <version> [--project <project-id>] [--json]",
1829
+ " cadence tickets create --title <text> [--from-intake <intake-id>] [--project <project-id>] [--json]",
1830
+ " cadence tickets update <ticket-id> --if-version <version> [--title <text>] [--description <text>] [--priority <priority>] [--status <status>] [--project <project-id>] [--json]",
1831
+ " cadence tickets claim <ticket-id> --session <session-id> [--project <project-id>] [--json]",
1832
+ " cadence tickets release <ticket-id> --lease <lease-id> [--project <project-id>] [--json]",
1833
+ " cadence tickets complete <ticket-id> --if-version <version> [--summary <summary>] [--project <project-id>] [--json]",
1834
+ " cadence sessions start --ticket <ticket-id> [--changeset <changeset-id>] [--project <project-id>] [--json]",
1835
+ " cadence sessions end <session-id> --summary <summary> [--project <project-id>] [--json]",
1836
+ " cadence changesets create --ticket <ticket-id> --branch <branch> [--base-branch <branch>] [--project <project-id>] [--json]",
1837
+ " cadence intake dismiss <intake-id> --reason <reason> [--project <project-id>] [--json]",
1838
+ " cadence sessions current [--project <project-id>] [--ticket <ticket-id>] [--changeset <changeset-id>] [--json]",
1839
+ " cadence changesets get <changeset-id> [--project <project-id>] [--json]",
1840
+ " cadence changesets list [--project <project-id>] [--ticket <ticket-id>] [--status <status>] [--json]",
1841
+ " cadence events list [--project <project-id>] [--ticket <ticket-id>] [--changeset <changeset-id>] [--session <session-id>] [--json]",
1842
+ "",
1843
+ "Global flags:",
1844
+ " --project <id> Cadence project ID",
1845
+ " --json Print stable JSON envelope",
1846
+ "",
1847
+ "Auth options:",
1848
+ " --email <email> Email for auth login"
1849
+ ].join(`
1850
+ `);
1851
+ }
1852
+ async function createClient(config, options) {
1853
+ if (options.client) {
1854
+ return options.client;
1855
+ }
1856
+ const store = getCredentialStore(options);
1857
+ const credential = await readStoredCredential(store, config.server);
1858
+ return createCadenceClient({
1859
+ baseUrl: config.server,
1860
+ ...credential ? { getAuthToken: async () => (await readStoredCredential(store, config.server))?.accessToken ?? "" } : {},
1861
+ ...options.fetch ? { fetch: options.fetch } : {}
1862
+ });
1863
+ }
1864
+ function commandMeta(parsed, config) {
1865
+ return {
1866
+ command: parsed.command.name,
1867
+ server: config.server,
1868
+ projectId: config.projectId
1869
+ };
1870
+ }
1871
+ function requireProjectId(config) {
1872
+ if (!config.projectId) {
1873
+ throw new CliError("CONFIG_ERROR", "Project ID is required. Pass --project or configure .cadence/config.json.");
1874
+ }
1875
+ return config.projectId;
1876
+ }
1877
+ function requireArg(parsed, index, label) {
1878
+ const value = parsed.args[index];
1879
+ if (!value) {
1880
+ throw new CliError("CLI_USAGE", `${parsed.command.path.join(" ")} requires ${label}.`);
1881
+ }
1882
+ return value;
1883
+ }
1884
+ function requireOption(parsed, key, label = `--${key}`) {
1885
+ const value = parsed.options[key];
1886
+ if (!value) {
1887
+ throw new CliError("CLI_USAGE", `${parsed.command.path.join(" ")} requires ${label}.`);
1888
+ }
1889
+ return value;
1890
+ }
1891
+ function parsePositiveInteger(value, flag) {
1892
+ if (!value) {
1893
+ return;
1894
+ }
1895
+ const limit = Number(value);
1896
+ if (!Number.isInteger(limit) || limit <= 0) {
1897
+ throw new CliError("CLI_USAGE", `${flag} must be a positive integer.`);
1898
+ }
1899
+ return limit;
1900
+ }
1901
+ function parseRequiredPositiveInteger(value, flag) {
1902
+ const parsed = parsePositiveInteger(value, flag);
1903
+ if (!parsed) {
1904
+ throw new CliError("CLI_USAGE", `${flag} must be a positive integer.`);
1905
+ }
1906
+ return parsed;
1907
+ }
1908
+ function parseLimit(value) {
1909
+ return parsePositiveInteger(value, "--limit");
1910
+ }
1911
+ function parseTicketPriority(value) {
1912
+ if (!value) {
1913
+ return;
1914
+ }
1915
+ if (!ticketPriorities.includes(value)) {
1916
+ throw new CliError("CLI_USAGE", "--priority must be one of low, normal, high, urgent.");
1917
+ }
1918
+ return value;
1919
+ }
1920
+ function parseTicketStatus(value) {
1921
+ if (!value) {
1922
+ return;
1923
+ }
1924
+ if (!ticketStatuses.includes(value)) {
1925
+ throw new CliError("CLI_USAGE", "--status must be one of backlog, ready, in_progress, blocked, review, done, abandoned.");
1926
+ }
1927
+ return value;
1928
+ }
1929
+ function leaseExpiresAt(ttlSeconds) {
1930
+ return new Date(Date.now() + ttlSeconds * 1000).toISOString();
1931
+ }
1932
+ function compactOptions(options) {
1933
+ return Object.fromEntries(Object.entries(options).filter(([, value]) => value !== undefined));
1934
+ }
1935
+ function commandMetadata() {
1936
+ return {
1937
+ occurredAt: new Date().toISOString(),
1938
+ source: "cli"
1939
+ };
1940
+ }
1941
+ async function runStatus(parsed, options) {
1942
+ const config = await resolveCliConfig(parsed.flags, options);
1943
+ const store = getCredentialStore(options);
1944
+ const credential = await readStoredCredential(store, config.server);
1945
+ const client = await createClient(config, options);
1946
+ const health = await client.health();
1947
+ const data = {
1948
+ server: config.server,
1949
+ projectId: config.projectId,
1950
+ credentialConfigured: Boolean(credential),
1951
+ authTokenConfigured: Boolean(credential),
1952
+ health,
1953
+ config: {
1954
+ repoConfigPath: config.repoConfigPath,
1955
+ globalConfigPath: config.globalConfigPath
1956
+ }
1957
+ };
1958
+ const meta = commandMeta(parsed, config);
1959
+ if (parsed.flags.json) {
1960
+ return {
1961
+ stdout: formatJson(successEnvelope(data, meta)),
1962
+ stderr: "",
1963
+ exitCode: 0
1964
+ };
1965
+ }
1966
+ return {
1967
+ stdout: `Cadence API ${health.ok ? "ok" : "unavailable"} at ${config.server}
1968
+ `,
1969
+ stderr: "",
1970
+ exitCode: 0
1971
+ };
1972
+ }
1973
+ async function runInit(parsed, options) {
1974
+ const cwd = options.cwd ?? process.cwd();
1975
+ const repoConfigPath = join(cwd, ".cadence", "config.json");
1976
+ const projectId = parsed.flags.project;
1977
+ if (!projectId) {
1978
+ throw new CliError("CLI_USAGE", "init requires --project.");
1979
+ }
1980
+ const updates = {
1981
+ projectId,
1982
+ ...parsed.flags.server ? { server: parsed.flags.server } : {}
1983
+ };
1984
+ await mergeConfigFile(repoConfigPath, updates);
1985
+ const config = await resolveCliConfig(parsed.flags, {
1986
+ ...options,
1987
+ cwd
1988
+ });
1989
+ const data = {
1990
+ repoConfigPath,
1991
+ projectId,
1992
+ ...parsed.flags.server ? { server: parsed.flags.server } : {}
1993
+ };
1994
+ const meta = commandMeta(parsed, config);
1995
+ if (parsed.flags.json) {
1996
+ return {
1997
+ stdout: formatJson(successEnvelope(data, meta)),
1998
+ stderr: "",
1999
+ exitCode: 0
2000
+ };
2001
+ }
2002
+ return {
2003
+ stdout: `Initialized Cadence config at ${repoConfigPath}
2004
+ `,
2005
+ stderr: "",
2006
+ exitCode: 0
2007
+ };
2008
+ }
2009
+ async function runAuthCommand(parsed, options) {
2010
+ const config = await resolveCliConfig(parsed.flags, options);
2011
+ const store = getCredentialStore(options);
2012
+ const meta = commandMeta(parsed, config);
2013
+ let data;
2014
+ switch (parsed.command.name) {
2015
+ case "auth.login":
2016
+ {
2017
+ await requireCredentialStore(store);
2018
+ const client = await createClient(config, options);
2019
+ const credential = await client.auth.login({
2020
+ email: parsed.options.email ?? await readPromptText(options, "Email: "),
2021
+ password: await readPromptSecret(options, "Password: ")
2022
+ });
2023
+ await store.setCredential(config.server, encodeCredential(credential));
2024
+ await mergeConfigFile(config.globalConfigPath, { server: config.server });
2025
+ data = {
2026
+ server: config.server,
2027
+ credentialStored: true,
2028
+ globalConfigPath: config.globalConfigPath
2029
+ };
2030
+ }
2031
+ break;
2032
+ case "auth.status":
2033
+ {
2034
+ const credentialStoreAvailable = await store.isAvailable();
2035
+ const credential = credentialStoreAvailable ? await readStoredCredential(store, config.server) : null;
2036
+ data = {
2037
+ server: config.server,
2038
+ projectId: config.projectId,
2039
+ credentialStoreAvailable,
2040
+ credentialConfigured: Boolean(credential),
2041
+ config: {
2042
+ repoConfigPath: config.repoConfigPath,
2043
+ globalConfigPath: config.globalConfigPath
2044
+ }
2045
+ };
2046
+ }
2047
+ break;
2048
+ case "auth.logout":
2049
+ await requireCredentialStore(store);
2050
+ await store.deleteCredential(config.server);
2051
+ data = {
2052
+ server: config.server,
2053
+ credentialRemoved: true
2054
+ };
2055
+ break;
2056
+ default:
2057
+ throw new CliError("CLI_USAGE", `Unknown command: ${parsed.command.path.join(" ")}`);
2058
+ }
2059
+ if (parsed.flags.json) {
2060
+ return {
2061
+ stdout: formatJson(successEnvelope(data, meta)),
2062
+ stderr: "",
2063
+ exitCode: 0
2064
+ };
2065
+ }
2066
+ return {
2067
+ stdout: `${JSON.stringify(data, null, 2)}
2068
+ `,
2069
+ stderr: "",
2070
+ exitCode: 0
2071
+ };
2072
+ }
2073
+ async function runReadCommand(parsed, options) {
2074
+ const config = await resolveCliConfig(parsed.flags, options);
2075
+ const projectId = requireProjectId(config);
2076
+ const client = await createClient(config, options);
2077
+ const meta = commandMeta(parsed, config);
2078
+ let data;
2079
+ switch (parsed.command.name) {
2080
+ case "events.list":
2081
+ data = await client.events.list({
2082
+ projectId,
2083
+ filters: compactOptions({
2084
+ type: parsed.options.type,
2085
+ ticketId: parsed.options.ticket,
2086
+ changesetId: parsed.options.changeset,
2087
+ sessionId: parsed.options.session,
2088
+ limit: parseLimit(parsed.options.limit)
2089
+ })
2090
+ });
2091
+ break;
2092
+ case "work.overview":
2093
+ data = await client.work.overview({ projectId });
2094
+ break;
2095
+ case "tickets.get":
2096
+ data = await client.tickets.get({
2097
+ projectId,
2098
+ ticketId: requireArg(parsed, 0, "<ticket-id>")
2099
+ });
2100
+ break;
2101
+ case "tickets.list":
2102
+ data = await client.tickets.list({
2103
+ projectId,
2104
+ filters: compactOptions({
2105
+ status: parsed.options.status,
2106
+ limit: parseLimit(parsed.options.limit)
2107
+ })
2108
+ });
2109
+ break;
2110
+ case "sessions.current":
2111
+ data = await client.sessions.current({
2112
+ projectId,
2113
+ filters: compactOptions({
2114
+ ticketId: parsed.options.ticket,
2115
+ changesetId: parsed.options.changeset,
2116
+ sessionId: parsed.options.session,
2117
+ actorId: parsed.options.actor,
2118
+ limit: parseLimit(parsed.options.limit)
2119
+ })
2120
+ });
2121
+ break;
2122
+ case "changesets.get":
2123
+ data = await client.changesets.get({
2124
+ projectId,
2125
+ changesetId: requireArg(parsed, 0, "<changeset-id>")
2126
+ });
2127
+ break;
2128
+ case "changesets.list":
2129
+ data = await client.changesets.list({
2130
+ projectId,
2131
+ filters: compactOptions({
2132
+ ticketId: parsed.options.ticket,
2133
+ branchName: parsed.options.branch,
2134
+ status: parsed.options.status,
2135
+ limit: parseLimit(parsed.options.limit)
2136
+ })
2137
+ });
2138
+ break;
2139
+ default:
2140
+ throw new CliError("CLI_USAGE", `Unknown command: ${parsed.command.path.join(" ")}`);
2141
+ }
2142
+ if (parsed.flags.json) {
2143
+ return {
2144
+ stdout: formatJson(successEnvelope(data, meta)),
2145
+ stderr: "",
2146
+ exitCode: 0
2147
+ };
2148
+ }
2149
+ return {
2150
+ stdout: `${JSON.stringify(data, null, 2)}
2151
+ `,
2152
+ stderr: "",
2153
+ exitCode: 0
2154
+ };
2155
+ }
2156
+ async function runIntakeCommand(parsed, options) {
2157
+ const config = await resolveCliConfig(parsed.flags, options);
2158
+ const projectId = requireProjectId(config);
2159
+ const client = await createClient(config, options);
2160
+ const meta = commandMeta(parsed, config);
2161
+ let data;
2162
+ const ifVersion = () => parseRequiredPositiveInteger(requireOption(parsed, "if-version"), "--if-version");
2163
+ switch (parsed.command.name) {
2164
+ case "intake":
2165
+ data = await client.intake.create({
2166
+ projectId,
2167
+ intake: {
2168
+ request: requireArg(parsed, 0, '"<request>"'),
2169
+ ...commandMetadata()
2170
+ }
2171
+ });
2172
+ break;
2173
+ case "intake.dismiss":
2174
+ data = await client.intake.dismiss({
2175
+ projectId,
2176
+ intakeId: requireArg(parsed, 0, "<intake-id>"),
2177
+ dismissal: {
2178
+ reason: requireOption(parsed, "reason"),
2179
+ ...commandMetadata()
2180
+ }
2181
+ });
2182
+ break;
2183
+ case "tickets.attach":
2184
+ data = await client.tickets.attach({
2185
+ projectId,
2186
+ ticketId: requireArg(parsed, 0, "<ticket-id>"),
2187
+ fromIntakeId: requireOption(parsed, "from-intake"),
2188
+ ifVersion: ifVersion()
2189
+ });
2190
+ break;
2191
+ case "tickets.create":
2192
+ {
2193
+ const priority = parseTicketPriority(parsed.options.priority);
2194
+ data = await client.tickets.create({
2195
+ projectId,
2196
+ ticket: {
2197
+ title: requireOption(parsed, "title"),
2198
+ ...parsed.options["from-intake"] ? { fromIntakeId: parsed.options["from-intake"] } : {},
2199
+ ...parsed.options.description ? { description: parsed.options.description } : {},
2200
+ ...priority ? { priority } : {},
2201
+ ...commandMetadata()
2202
+ }
2203
+ });
2204
+ }
2205
+ break;
2206
+ case "tickets.update":
2207
+ {
2208
+ const ticketId = requireArg(parsed, 0, "<ticket-id>");
2209
+ const priority = parseTicketPriority(parsed.options.priority);
2210
+ const status = parseTicketStatus(parsed.options.status);
2211
+ const hasUpdateFields = Boolean(parsed.options.title) || Boolean(parsed.options.description) || Boolean(priority) || Boolean(parsed.options["current-summary"]);
2212
+ if (status && hasUpdateFields) {
2213
+ throw new CliError("CLI_USAGE", "tickets update cannot combine --status with field updates.");
2214
+ }
2215
+ if (status) {
2216
+ data = await client.tickets.changeStatus({
2217
+ projectId,
2218
+ ticketId,
2219
+ ifVersion: ifVersion(),
2220
+ status: {
2221
+ toStatus: status,
2222
+ ...parsed.options.reason ? { reason: parsed.options.reason } : {},
2223
+ ...commandMetadata()
2224
+ }
2225
+ });
2226
+ break;
2227
+ }
2228
+ if (!hasUpdateFields) {
2229
+ throw new CliError("CLI_USAGE", "tickets update requires at least one update field.");
2230
+ }
2231
+ data = await client.tickets.update({
2232
+ projectId,
2233
+ ticketId,
2234
+ ifVersion: ifVersion(),
2235
+ ticket: {
2236
+ ...parsed.options.title ? { title: parsed.options.title } : {},
2237
+ ...parsed.options.description ? { description: parsed.options.description } : {},
2238
+ ...priority ? { priority } : {},
2239
+ ...parsed.options["current-summary"] ? { currentSummary: parsed.options["current-summary"] } : {},
2240
+ ...commandMetadata()
2241
+ }
2242
+ });
2243
+ }
2244
+ break;
2245
+ case "tickets.claim":
2246
+ data = await client.sessions.leases.create({
2247
+ projectId,
2248
+ lease: {
2249
+ ticketId: requireArg(parsed, 0, "<ticket-id>"),
2250
+ sessionId: requireOption(parsed, "session"),
2251
+ ...parsed.options.changeset ? { changesetId: parsed.options.changeset } : {},
2252
+ expiresAt: leaseExpiresAt(parsePositiveInteger(parsed.options["ttl-seconds"], "--ttl-seconds") ?? defaultLeaseTtlSeconds),
2253
+ ...commandMetadata()
2254
+ }
2255
+ });
2256
+ break;
2257
+ case "tickets.release":
2258
+ requireArg(parsed, 0, "<ticket-id>");
2259
+ data = await client.sessions.leases.release({
2260
+ projectId,
2261
+ leaseId: requireOption(parsed, "lease"),
2262
+ lease: {
2263
+ ...parsed.options.reason ? { reason: parsed.options.reason } : {},
2264
+ ...commandMetadata()
2265
+ }
2266
+ });
2267
+ break;
2268
+ case "tickets.complete":
2269
+ data = await client.tickets.complete({
2270
+ projectId,
2271
+ ticketId: requireArg(parsed, 0, "<ticket-id>"),
2272
+ ifVersion: ifVersion(),
2273
+ completion: {
2274
+ ...parsed.options.summary ? { currentSummary: parsed.options.summary } : {},
2275
+ ...commandMetadata()
2276
+ }
2277
+ });
2278
+ break;
2279
+ case "sessions.start":
2280
+ data = await client.sessions.start({
2281
+ projectId,
2282
+ session: {
2283
+ ticketId: requireOption(parsed, "ticket"),
2284
+ ...parsed.options.changeset ? { changesetId: parsed.options.changeset } : {},
2285
+ ...parsed.options["local-session-ref"] ? { localSessionRef: parsed.options["local-session-ref"] } : {},
2286
+ ...commandMetadata()
2287
+ }
2288
+ });
2289
+ break;
2290
+ case "sessions.end":
2291
+ data = await client.sessions.end({
2292
+ projectId,
2293
+ sessionId: requireArg(parsed, 0, "<session-id>"),
2294
+ session: {
2295
+ summary: requireOption(parsed, "summary"),
2296
+ ...commandMetadata()
2297
+ }
2298
+ });
2299
+ break;
2300
+ case "changesets.create":
2301
+ data = await client.changesets.create({
2302
+ projectId,
2303
+ changeset: {
2304
+ ticketId: requireOption(parsed, "ticket"),
2305
+ branchName: requireOption(parsed, "branch"),
2306
+ baseBranch: parsed.options["base-branch"] ?? "main",
2307
+ ...parsed.options.session ? { sessionId: parsed.options.session } : {},
2308
+ ...commandMetadata()
2309
+ }
2310
+ });
2311
+ break;
2312
+ default:
2313
+ throw new CliError("CLI_USAGE", `Unknown command: ${parsed.command.path.join(" ")}`);
2314
+ }
2315
+ if (parsed.flags.json) {
2316
+ return {
2317
+ stdout: formatJson(successEnvelope(data, meta)),
2318
+ stderr: "",
2319
+ exitCode: 0
2320
+ };
2321
+ }
2322
+ return {
2323
+ stdout: `${JSON.stringify(data, null, 2)}
2324
+ `,
2325
+ stderr: "",
2326
+ exitCode: 0
2327
+ };
2328
+ }
2329
+ function normalizeError(error) {
2330
+ if (error instanceof CliError) {
2331
+ return error;
2332
+ }
2333
+ if (error.message === "INTAKE_ALREADY_DECIDED" || error.message.includes("INTAKE_ALREADY_DECIDED")) {
2334
+ return new CliError("INTAKE_ALREADY_DECIDED", "INTAKE_ALREADY_DECIDED");
2335
+ }
2336
+ return new CliError("API_ERROR", error.message || "Unexpected CLI error.");
2337
+ }
2338
+ function commandNameFromArgv(argv) {
2339
+ try {
2340
+ return parseCliArgs(argv).command.name;
2341
+ } catch {
2342
+ return argv.filter((arg) => !arg.startsWith("--"))[0] ?? "unknown";
2343
+ }
2344
+ }
2345
+ async function runCli(argv, options = {}) {
2346
+ const wantsJson = argv.includes("--json");
2347
+ try {
2348
+ const parsed = parseCliArgs(argv);
2349
+ const meta = {
2350
+ command: parsed.command.name
2351
+ };
2352
+ if (parsed.flags.help || parsed.command.name === "help") {
2353
+ if (parsed.flags.json) {
2354
+ return {
2355
+ stdout: formatJson(successEnvelope({ help: helpText() }, meta)),
2356
+ stderr: "",
2357
+ exitCode: 0
2358
+ };
2359
+ }
2360
+ return {
2361
+ stdout: `${helpText()}
2362
+ `,
2363
+ stderr: "",
2364
+ exitCode: 0
2365
+ };
2366
+ }
2367
+ if (parsed.command.name === "status") {
2368
+ return await runStatus(parsed, options);
2369
+ }
2370
+ if (parsed.command.name === "init") {
2371
+ return await runInit(parsed, options);
2372
+ }
2373
+ if (parsed.command.name === "auth.login" || parsed.command.name === "auth.status" || parsed.command.name === "auth.logout") {
2374
+ return await runAuthCommand(parsed, options);
2375
+ }
2376
+ if (parsed.command.name === "events.list" || parsed.command.name === "work.overview" || parsed.command.name === "tickets.get" || parsed.command.name === "tickets.list" || parsed.command.name === "sessions.current" || parsed.command.name === "changesets.get" || parsed.command.name === "changesets.list") {
2377
+ return await runReadCommand(parsed, options);
2378
+ }
2379
+ if (parsed.command.name === "intake" || parsed.command.name === "intake.dismiss" || parsed.command.name === "tickets.attach" || parsed.command.name === "tickets.create" || parsed.command.name === "tickets.update" || parsed.command.name === "tickets.claim" || parsed.command.name === "tickets.release" || parsed.command.name === "tickets.complete" || parsed.command.name === "sessions.start" || parsed.command.name === "sessions.end" || parsed.command.name === "changesets.create") {
2380
+ return await runIntakeCommand(parsed, options);
2381
+ }
2382
+ throw new CliError("CLI_USAGE", `Unknown command: ${parsed.command.path.join(" ")}`);
2383
+ } catch (error) {
2384
+ const normalized = error instanceof Error ? normalizeError(error) : new CliError("API_ERROR", "Unexpected CLI error.");
2385
+ const meta = {
2386
+ command: commandNameFromArgv(argv)
2387
+ };
2388
+ if (wantsJson) {
2389
+ return {
2390
+ stdout: formatJson(errorEnvelope(normalized, meta)),
2391
+ stderr: "",
2392
+ exitCode: 1
2393
+ };
2394
+ }
2395
+ return {
2396
+ stdout: "",
2397
+ stderr: `${normalized.message}
2398
+ `,
2399
+ exitCode: 1
2400
+ };
2401
+ }
2402
+ }
2403
+ if (import.meta.main) {
2404
+ const result = await runCli(Bun.argv.slice(2));
2405
+ if (result.stdout) {
2406
+ process.stdout.write(result.stdout);
2407
+ }
2408
+ if (result.stderr) {
2409
+ process.stderr.write(result.stderr);
2410
+ }
2411
+ process.exit(result.exitCode);
2412
+ }
2413
+ export {
2414
+ runCli,
2415
+ resolveCliConfig,
2416
+ parseCliArgs
2417
+ };