@kittl/cli 0.0.7 → 0.0.9

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 (40) hide show
  1. package/bin/run.js +4 -1
  2. package/dist/chunk-CT7IDOZX.js +71 -0
  3. package/dist/chunk-CT7IDOZX.js.map +1 -0
  4. package/dist/chunk-FRAFJMJ5.js +117 -0
  5. package/dist/chunk-FRAFJMJ5.js.map +1 -0
  6. package/dist/{chunk-E5EOPARA.js → chunk-GOOP3XEU.js} +3 -3
  7. package/dist/{chunk-344EUO2O.js → chunk-LEELFFFY.js} +2 -2
  8. package/dist/{chunk-7OPTDFSA.js → chunk-LZM72TST.js} +2 -2
  9. package/dist/{chunk-F62NYF5U.js → chunk-X67IL4KU.js} +24 -68
  10. package/dist/chunk-X67IL4KU.js.map +1 -0
  11. package/dist/chunk-ZS7NZCD4.js +36 -0
  12. package/dist/chunk-ZS7NZCD4.js.map +1 -0
  13. package/dist/commands/app/init.js +7 -4
  14. package/dist/commands/app/init.js.map +1 -1
  15. package/dist/commands/app/release.js +5 -3
  16. package/dist/commands/app/release.js.map +1 -1
  17. package/dist/commands/app/update.js +7 -4
  18. package/dist/commands/app/update.js.map +1 -1
  19. package/dist/commands/app/upload.js +6 -3
  20. package/dist/commands/app/upload.js.map +1 -1
  21. package/dist/commands/auth/login.js +5 -2
  22. package/dist/commands/auth/login.js.map +1 -1
  23. package/dist/commands/auth/logout.js +5 -2
  24. package/dist/commands/auth/logout.js.map +1 -1
  25. package/dist/commands/auth/whoami.js +4 -2
  26. package/dist/commands/whoami.js +4 -2
  27. package/dist/dist-3OYSVDTD.js +546 -0
  28. package/dist/dist-3OYSVDTD.js.map +1 -0
  29. package/dist/hooks/finally/telemetry.js +9 -0
  30. package/dist/hooks/finally/telemetry.js.map +1 -0
  31. package/dist/hooks/finally/telemetry.test.js +16242 -0
  32. package/dist/hooks/finally/telemetry.test.js.map +1 -0
  33. package/dist/magic-string.es-APUP3ZXW.js +1389 -0
  34. package/dist/magic-string.es-APUP3ZXW.js.map +1 -0
  35. package/oclif.manifest.json +1 -1
  36. package/package.json +14 -5
  37. package/dist/chunk-F62NYF5U.js.map +0 -1
  38. /package/dist/{chunk-E5EOPARA.js.map → chunk-GOOP3XEU.js.map} +0 -0
  39. /package/dist/{chunk-344EUO2O.js.map → chunk-LEELFFFY.js.map} +0 -0
  40. /package/dist/{chunk-7OPTDFSA.js.map → chunk-LZM72TST.js.map} +0 -0
package/bin/run.js CHANGED
@@ -1,6 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import './bootstrap.js';
4
- import { execute } from '@oclif/core';
4
+ import { execute, settings } from '@oclif/core';
5
+
6
+ // ref https://oclif.io/docs/performance/ opt out via KITTL_TELEMETRY_DISABLED=1
7
+ settings.performanceEnabled = process.env.KITTL_TELEMETRY_DISABLED !== '1';
5
8
 
6
9
  await execute({ dir: import.meta.url });
@@ -0,0 +1,71 @@
1
+ import {
2
+ API_CONFIG,
3
+ authService,
4
+ getKittlEnvEntries,
5
+ kittlApiService
6
+ } from "./chunk-X67IL4KU.js";
7
+
8
+ // src/core/core.command.ts
9
+ import { Command } from "@oclif/core";
10
+
11
+ // src/ui/renderer.ts
12
+ import { render } from "ink";
13
+ import React from "react";
14
+ async function runInteractiveView(View, ...args) {
15
+ const props = args[0];
16
+ return new Promise((resolve, reject) => {
17
+ const app = render(
18
+ React.createElement(View, {
19
+ ...props ?? {},
20
+ onDone: (result) => {
21
+ void (async () => {
22
+ app.unmount();
23
+ await app.waitUntilExit();
24
+ resolve(result);
25
+ })().catch(reject);
26
+ }
27
+ })
28
+ );
29
+ });
30
+ }
31
+
32
+ // src/core/core.command.ts
33
+ var BaseCommand = class extends Command {
34
+ session = null;
35
+ async init() {
36
+ await super.init();
37
+ this.session = await authService.getSession();
38
+ kittlApiService.setAccessTokenProvider(
39
+ async () => authService.getAccessToken()
40
+ );
41
+ const envEntries = getKittlEnvEntries();
42
+ this.debug(`API base URL: ${API_CONFIG.baseUrl}`);
43
+ this.debug(`KITTL_* variables:
44
+ ${envEntries.join("\n") || "(none)"}`);
45
+ }
46
+ getKittlApiClient() {
47
+ return kittlApiService.getClient();
48
+ }
49
+ /**
50
+ * Ensures a valid access token (+ refreshes when the accessToken is near expiry).
51
+ */
52
+ async ensureAuthenticated() {
53
+ const session = await authService.getSession();
54
+ if (!session?.accessToken) {
55
+ this.error(
56
+ `Session expired. Run \`${this.config.bin} auth login\` first.`,
57
+ { exit: 2 }
58
+ );
59
+ }
60
+ this.session = session;
61
+ return session;
62
+ }
63
+ async renderView(View, ...args) {
64
+ return runInteractiveView(View, ...args);
65
+ }
66
+ };
67
+
68
+ export {
69
+ BaseCommand
70
+ };
71
+ //# sourceMappingURL=chunk-CT7IDOZX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/core.command.ts","../src/ui/renderer.ts"],"sourcesContent":["import { Command } from '@oclif/core';\nimport type { AxiosInstance } from 'axios';\nimport type { FC } from 'react';\nimport { API_CONFIG } from '../constants';\nimport { kittlApiService } from '../services/api.service';\nimport { authService } from '../services/auth.service';\nimport type { Session } from '../types/session';\nimport { runInteractiveView, type ViewWithDone } from '../ui/renderer';\nimport { getKittlEnvEntries } from './utils';\n\nexport abstract class BaseCommand extends Command {\n protected session: Session | null = null;\n\n public override async init(): Promise<void> {\n await super.init();\n this.session = await authService.getSession();\n kittlApiService.setAccessTokenProvider(async () =>\n authService.getAccessToken(),\n );\n\n const envEntries = getKittlEnvEntries();\n this.debug(`API base URL: ${API_CONFIG.baseUrl}`);\n this.debug(`KITTL_* variables:\\n${envEntries.join('\\n') || '(none)'}`);\n }\n\n protected getKittlApiClient(): AxiosInstance {\n return kittlApiService.getClient();\n }\n\n /**\n * Ensures a valid access token (+ refreshes when the accessToken is near expiry).\n */\n protected async ensureAuthenticated(): Promise<Session> {\n const session = await authService.getSession();\n if (!session?.accessToken) {\n this.error(\n `Session expired. Run \\`${this.config.bin} auth login\\` first.`,\n { exit: 2 },\n );\n }\n\n this.session = session;\n return session;\n }\n\n /**\n * Run an Ink view that reports a result via `onDone`, then unmount and return.\n * PRO TIP: use `this.log` / `this.error` after this resolves, not inside the view!! for final line stays on stdout.\n */\n protected async renderView<R>(View: FC<ViewWithDone<R>>): Promise<R>;\n protected async renderView<R, P extends object>(\n View: FC<P & ViewWithDone<R>>,\n props: P,\n ): Promise<R>;\n protected async renderView<R, P extends object>(\n View: FC<P & ViewWithDone<R>>,\n ...args: Partial<P> extends P ? [props?: P] : [props: P]\n ): Promise<R> {\n return runInteractiveView<R, P>(View, ...args);\n }\n}\n","import { render } from 'ink';\nimport React, { type FC } from 'react';\n\n/**\n * Standard shape for a view that reports a result.\n */\nexport type ViewWithDone<R> = { onDone: (result: R) => void };\n\n/**\n * The entrypoint that touches Ink's render process.\n */\nexport async function runInteractiveView<R, P extends object>(\n View: FC<P & ViewWithDone<R>>,\n ...args: Partial<P> extends P ? [props?: P] : [props: P]\n): Promise<R> {\n const props = args[0];\n\n return new Promise<R>((resolve, reject) => {\n const app = render(\n React.createElement(View, {\n ...(props ?? ({} as P)),\n onDone: (result: R) => {\n void (async () => {\n app.unmount();\n await app.waitUntilExit();\n resolve(result);\n })().catch(reject);\n },\n } as P & ViewWithDone<R>),\n );\n });\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,eAAe;;;ACAxB,SAAS,cAAc;AACvB,OAAO,WAAwB;AAU/B,eAAsB,mBACpB,SACG,MACS;AACZ,QAAM,QAAQ,KAAK,CAAC;AAEpB,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACzC,UAAM,MAAM;AAAA,MACV,MAAM,cAAc,MAAM;AAAA,QACxB,GAAI,SAAU,CAAC;AAAA,QACf,QAAQ,CAAC,WAAc;AACrB,gBAAM,YAAY;AAChB,gBAAI,QAAQ;AACZ,kBAAM,IAAI,cAAc;AACxB,oBAAQ,MAAM;AAAA,UAChB,GAAG,EAAE,MAAM,MAAM;AAAA,QACnB;AAAA,MACF,CAAwB;AAAA,IAC1B;AAAA,EACF,CAAC;AACH;;;ADrBO,IAAe,cAAf,cAAmC,QAAQ;AAAA,EACtC,UAA0B;AAAA,EAEpC,MAAsB,OAAsB;AAC1C,UAAM,MAAM,KAAK;AACjB,SAAK,UAAU,MAAM,YAAY,WAAW;AAC5C,oBAAgB;AAAA,MAAuB,YACrC,YAAY,eAAe;AAAA,IAC7B;AAEA,UAAM,aAAa,mBAAmB;AACtC,SAAK,MAAM,iBAAiB,WAAW,OAAO,EAAE;AAChD,SAAK,MAAM;AAAA,EAAuB,WAAW,KAAK,IAAI,KAAK,QAAQ,EAAE;AAAA,EACvE;AAAA,EAEU,oBAAmC;AAC3C,WAAO,gBAAgB,UAAU;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,sBAAwC;AACtD,UAAM,UAAU,MAAM,YAAY,WAAW;AAC7C,QAAI,CAAC,SAAS,aAAa;AACzB,WAAK;AAAA,QACH,0BAA0B,KAAK,OAAO,GAAG;AAAA,QACzC,EAAE,MAAM,EAAE;AAAA,MACZ;AAAA,IACF;AAEA,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA,EAWA,MAAgB,WACd,SACG,MACS;AACZ,WAAO,mBAAyB,MAAM,GAAG,IAAI;AAAA,EAC/C;AACF;","names":[]}
@@ -0,0 +1,117 @@
1
+ import {
2
+ cloneToPlainJson,
3
+ kittlApiService
4
+ } from "./chunk-X67IL4KU.js";
5
+
6
+ // src/hooks/finally/telemetry.ts
7
+ import { Performance as Performance2 } from "@oclif/core";
8
+
9
+ // src/services/telemetry.service.ts
10
+ import { Performance } from "@oclif/core";
11
+
12
+ // src/core/schemas/telemetry.ts
13
+ import { z } from "zod";
14
+ var telemetryBodySchema = z.object({
15
+ commandId: z.string().min(1),
16
+ version: z.string().optional().nullable(),
17
+ durationMs: z.number().optional().nullable(),
18
+ success: z.boolean().optional().nullable(),
19
+ exitCode: z.number().int().optional().nullable(),
20
+ os: z.string().optional().nullable(),
21
+ arch: z.string().optional().nullable(),
22
+ nodeVersion: z.string().optional().nullable(),
23
+ isCI: z.boolean().optional().nullable(),
24
+ metadata: z.record(z.string(), z.unknown()).optional().nullable()
25
+ });
26
+
27
+ // src/services/telemetry.service.ts
28
+ var TELEMETRY_PATH = "/events/cli-usage";
29
+ var TELEMETRY_TIMEOUT_MS = 5e3;
30
+ function snapshotOclifPerf() {
31
+ if (!Performance.enabled)
32
+ return null;
33
+ const perf = Performance.oclifPerf;
34
+ return Object.keys(perf).length ? perf : null;
35
+ }
36
+ function oclifPerfAsPlainRecord(perf) {
37
+ const out = { ...perf };
38
+ delete out.hookRunTimes;
39
+ delete out.pluginLoadTimes;
40
+ return out;
41
+ }
42
+ function rawErrorMetadata(e) {
43
+ return {
44
+ name: e.name,
45
+ message: e.message,
46
+ code: e.code,
47
+ oclifExit: e.oclif?.exit,
48
+ exitCode: e.exitCode,
49
+ suggestions: e.suggestions
50
+ };
51
+ }
52
+ function jsonSafeTelemetryBody(body) {
53
+ return telemetryBodySchema.parse(cloneToPlainJson(body));
54
+ }
55
+ function buildTelemetryBody(input) {
56
+ const { error, Command: cmd } = input;
57
+ const e = error;
58
+ const exitCode = e == null ? 0 : e.oclif?.exit ?? e.exitCode ?? 1;
59
+ const perf = snapshotOclifPerf();
60
+ return telemetryBodySchema.parse({
61
+ commandId: input.commandId?.length ? input.commandId : "__none__",
62
+ version: input.version,
63
+ durationMs: perf?.["oclif.runMs"],
64
+ success: exitCode === 0,
65
+ exitCode,
66
+ os: input.platform,
67
+ arch: input.arch,
68
+ nodeVersion: process.version,
69
+ isCI: Boolean(process.env.CI || process.env.GITHUB_ACTIONS),
70
+ metadata: {
71
+ argv: input.argv,
72
+ pluginName: cmd?.pluginName ?? null,
73
+ pluginType: cmd?.pluginType ?? null,
74
+ commandRelativePath: cmd?.relativePath ?? null,
75
+ ...e ? { rawError: rawErrorMetadata(e) } : {},
76
+ ...perf ? { oclifPerf: oclifPerfAsPlainRecord(perf) } : {}
77
+ }
78
+ });
79
+ }
80
+ async function sendTelemetry(body) {
81
+ if (!Performance.enabled)
82
+ return;
83
+ try {
84
+ await kittlApiService.getClient().post(TELEMETRY_PATH, jsonSafeTelemetryBody(body), {
85
+ skipAuth: true,
86
+ timeout: TELEMETRY_TIMEOUT_MS
87
+ });
88
+ } catch (err) {
89
+ if (process.env.DEBUG?.includes("kittl"))
90
+ console.error(err);
91
+ }
92
+ }
93
+
94
+ // src/hooks/finally/telemetry.ts
95
+ var hook = async function(options) {
96
+ if (!Performance2.enabled)
97
+ return;
98
+ const body = buildTelemetryBody({
99
+ commandId: options.id,
100
+ argv: options.argv,
101
+ Command: options.Command,
102
+ error: options.error,
103
+ version: options.config.version,
104
+ platform: options.config.platform,
105
+ arch: options.config.arch
106
+ });
107
+ this.debug("[telemetry] payload: %j", body);
108
+ await sendTelemetry(body);
109
+ };
110
+ var telemetry_default = hook;
111
+
112
+ export {
113
+ buildTelemetryBody,
114
+ sendTelemetry,
115
+ telemetry_default
116
+ };
117
+ //# sourceMappingURL=chunk-FRAFJMJ5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/finally/telemetry.ts","../src/services/telemetry.service.ts","../src/core/schemas/telemetry.ts"],"sourcesContent":["import type { Hook } from '@oclif/core';\nimport { Performance } from '@oclif/core';\n\nimport {\n buildTelemetryBody,\n sendTelemetry,\n} from '../../services/telemetry.service';\n\nconst hook: Hook<'finally'> = async function (options) {\n if (!Performance.enabled) return;\n\n const body = buildTelemetryBody({\n commandId: options.id,\n argv: options.argv,\n Command: options.Command,\n error: options.error,\n version: options.config.version,\n platform: options.config.platform,\n arch: options.config.arch,\n });\n this.debug('[telemetry] payload: %j', body);\n await sendTelemetry(body);\n};\n\nexport default hook;\n","import type { Command } from '@oclif/core';\nimport { Performance } from '@oclif/core';\nimport type {\n CommandError,\n OclifError,\n PrettyPrintableError,\n} from '@oclif/core/interfaces';\n\nimport {\n type TelemetryBody,\n telemetryBodySchema,\n} from '../core/schemas/telemetry';\nimport { cloneToPlainJson } from '../core/utils';\nimport { kittlApiService } from './api.service';\n\ntype OclifPerfSnapshot = (typeof Performance)['oclifPerf'];\n\ntype TelemetryError = Error &\n Partial<OclifError> &\n Partial<PrettyPrintableError> &\n Partial<CommandError>;\n\nconst TELEMETRY_PATH = '/events/cli-usage' as const;\nconst TELEMETRY_TIMEOUT_MS = 5_000 as const;\n\n/**\n * oclif `Performance.oclifPerf` for telemetry metadata.\n */\nfunction snapshotOclifPerf(): OclifPerfSnapshot | null {\n if (!Performance.enabled) return null;\n const perf = Performance.oclifPerf;\n return Object.keys(perf).length ? perf : null;\n}\n\nfunction oclifPerfAsPlainRecord(\n perf: OclifPerfSnapshot,\n): Record<string, unknown> {\n const out = { ...(perf as Record<string, unknown>) };\n delete out.hookRunTimes;\n delete out.pluginLoadTimes;\n return out;\n}\n\nfunction rawErrorMetadata(e: TelemetryError): Record<string, unknown> {\n return {\n name: e.name,\n message: e.message,\n code: e.code,\n oclifExit: e.oclif?.exit,\n exitCode: e.exitCode,\n suggestions: e.suggestions,\n };\n}\n\nfunction jsonSafeTelemetryBody(body: TelemetryBody): TelemetryBody {\n return telemetryBodySchema.parse(cloneToPlainJson(body));\n}\n\nexport function buildTelemetryBody(input: {\n commandId: string | undefined;\n argv: string[];\n Command: Command.Loadable | undefined;\n error: Error | undefined;\n version: string;\n platform: string;\n arch: string;\n}): TelemetryBody {\n const { error, Command: cmd } = input;\n const e = error as TelemetryError | undefined;\n\n const exitCode = e == null ? 0 : (e.oclif?.exit ?? e.exitCode ?? 1);\n const perf = snapshotOclifPerf();\n\n return telemetryBodySchema.parse({\n commandId: input.commandId?.length ? input.commandId : '__none__',\n version: input.version,\n durationMs: perf?.['oclif.runMs'],\n success: exitCode === 0,\n exitCode,\n os: input.platform,\n arch: input.arch,\n nodeVersion: process.version,\n isCI: Boolean(process.env.CI || process.env.GITHUB_ACTIONS),\n metadata: {\n argv: input.argv,\n pluginName: cmd?.pluginName ?? null,\n pluginType: cmd?.pluginType ?? null,\n commandRelativePath: cmd?.relativePath ?? null,\n ...(e ? { rawError: rawErrorMetadata(e) } : {}),\n ...(perf ? { oclifPerf: oclifPerfAsPlainRecord(perf) } : {}),\n },\n });\n}\n\nexport async function sendTelemetry(body: TelemetryBody): Promise<void> {\n if (!Performance.enabled) return;\n try {\n await kittlApiService\n .getClient()\n .post(TELEMETRY_PATH, jsonSafeTelemetryBody(body), {\n skipAuth: true,\n timeout: TELEMETRY_TIMEOUT_MS,\n });\n } catch (err) {\n if (process.env.DEBUG?.includes('kittl')) console.error(err);\n }\n}\n","import { z } from 'zod';\n\n/**\n * Telemetry request body. Keep in sync with API `cliTelemetryBodySchema`.\n */\nexport const telemetryBodySchema = z.object({\n commandId: z.string().min(1),\n version: z.string().optional().nullable(),\n durationMs: z.number().optional().nullable(),\n success: z.boolean().optional().nullable(),\n exitCode: z.number().int().optional().nullable(),\n os: z.string().optional().nullable(),\n arch: z.string().optional().nullable(),\n nodeVersion: z.string().optional().nullable(),\n isCI: z.boolean().optional().nullable(),\n metadata: z.record(z.string(), z.unknown()).optional().nullable(),\n});\n\nexport type TelemetryBody = z.infer<typeof telemetryBodySchema>;\n"],"mappings":"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","names":["Performance","Performance"]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  formatZodErrorSummary
3
- } from "./chunk-344EUO2O.js";
3
+ } from "./chunk-LEELFFFY.js";
4
4
  import {
5
5
  parseJsonObjectFromFile
6
- } from "./chunk-F62NYF5U.js";
6
+ } from "./chunk-X67IL4KU.js";
7
7
 
8
8
  // src/services/extensions.service.ts
9
9
  import { z as z2 } from "zod";
@@ -99,4 +99,4 @@ export {
99
99
  createExtensionDraftVersion,
100
100
  markExtensionDraftReadyForReview
101
101
  };
102
- //# sourceMappingURL=chunk-E5EOPARA.js.map
102
+ //# sourceMappingURL=chunk-GOOP3XEU.js.map
@@ -2,7 +2,7 @@ import {
2
2
  API_CONFIG,
3
3
  CLI_CONFIG,
4
4
  parseJsonObjectFromFile
5
- } from "./chunk-F62NYF5U.js";
5
+ } from "./chunk-X67IL4KU.js";
6
6
 
7
7
  // src/core/error.ts
8
8
  import { isAxiosError } from "axios";
@@ -140,4 +140,4 @@ export {
140
140
  readInternalConfig,
141
141
  writeInternalConfig
142
142
  };
143
- //# sourceMappingURL=chunk-344EUO2O.js.map
143
+ //# sourceMappingURL=chunk-LEELFFFY.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  BaseCommand
3
- } from "./chunk-F62NYF5U.js";
3
+ } from "./chunk-CT7IDOZX.js";
4
4
 
5
5
  // src/commands/auth/whoami.ts
6
6
  import { jwtDecode } from "jwt-decode";
@@ -26,4 +26,4 @@ var AuthWhoAmI = class _AuthWhoAmI extends BaseCommand {
26
26
  export {
27
27
  AuthWhoAmI
28
28
  };
29
- //# sourceMappingURL=chunk-7OPTDFSA.js.map
29
+ //# sourceMappingURL=chunk-LZM72TST.js.map
@@ -43,6 +43,10 @@ async function parseJsonObjectFromFile(filePath) {
43
43
  const jsonText = await readFile(filePath, "utf8");
44
44
  return parseJsonObject(jsonText, filePath);
45
45
  }
46
+ var jsonStringifyBigIntReplacer = (_key, value) => typeof value === "bigint" ? Number(value) : value;
47
+ function cloneToPlainJson(value) {
48
+ return JSON.parse(JSON.stringify(value, jsonStringifyBigIntReplacer));
49
+ }
46
50
  async function ensureDirectory(dirPath) {
47
51
  try {
48
52
  const s = await stat(dirPath);
@@ -101,7 +105,7 @@ function chunkArray(items, chunkSize) {
101
105
  // package.json
102
106
  var package_default = {
103
107
  name: "@kittl/cli",
104
- version: "0.0.7",
108
+ version: "0.0.9",
105
109
  license: "Apache-2.0",
106
110
  private: false,
107
111
  type: "module",
@@ -112,6 +116,11 @@ var package_default = {
112
116
  kittl: "./bin/run.js",
113
117
  "kittl-dev": "./bin/dev.js"
114
118
  },
119
+ repository: {
120
+ type: "git",
121
+ url: "git+https://github.com/Kittl/sandboxed-extensions.git",
122
+ directory: "packages/cli"
123
+ },
115
124
  publishConfig: {
116
125
  access: "public",
117
126
  bin: {
@@ -135,7 +144,8 @@ var package_default = {
135
144
  "dev:watch": "node --watch --watch-path=./src --watch-path=./bin ./bin/dev.js",
136
145
  typecheck: "tsc --noEmit",
137
146
  test: "vitest run",
138
- "test:watch": "vitest"
147
+ "test:watch": "vitest",
148
+ deploy: "bash ./scripts/publish.sh"
139
149
  },
140
150
  dependencies: {
141
151
  "@oclif/core": "^4.10.2",
@@ -175,15 +185,19 @@ var package_default = {
175
185
  bin: "kittl",
176
186
  commands: "./dist/commands",
177
187
  dirname: "kittl",
188
+ topicSeparator: " ",
178
189
  plugins: [
179
190
  "@oclif/plugin-autocomplete",
180
191
  "@oclif/plugin-warn-if-update-available"
181
192
  ],
182
- topicSeparator: " ",
183
193
  "warn-if-update-available": {
184
- frequency: 10,
185
- frequencyUnit: "minutes",
186
- message: "\n<%= chalk.yellow('A newer Kittl CLI is available!') %> <%= chalk.dim(config.version) %> -> <%= chalk.greenBright(latest) %>\n<%= chalk.cyan('Update: npm i -g @kittl/cli@latest') %>\n"
194
+ timeoutInDays: 0,
195
+ message: "\n<%= chalk.yellow('A newer Kittl CLI is available:') %> <%= chalk.dim(config.version) %> -> <%= chalk.greenBright(latest) %>\n<%= chalk.cyan('Update: npm i -g @kittl/cli@latest') %>\n"
196
+ },
197
+ hooks: {
198
+ finally: [
199
+ "./dist/hooks/finally/telemetry.js"
200
+ ]
187
201
  }
188
202
  }
189
203
  };
@@ -665,9 +679,6 @@ var AuthService = class {
665
679
  };
666
680
  var authService = new AuthService();
667
681
 
668
- // src/core/core.command.ts
669
- import { Command } from "@oclif/core";
670
-
671
682
  // src/services/api.service.ts
672
683
  import axios, {
673
684
  AxiosHeaders
@@ -727,75 +738,20 @@ var KittlApiService = class {
727
738
  };
728
739
  var kittlApiService = new KittlApiService();
729
740
 
730
- // src/ui/renderer.ts
731
- import { render } from "ink";
732
- import React from "react";
733
- async function runInteractiveView(View, ...args) {
734
- const props = args[0];
735
- return new Promise((resolve, reject) => {
736
- const app = render(
737
- React.createElement(View, {
738
- ...props ?? {},
739
- onDone: (result) => {
740
- void (async () => {
741
- app.unmount();
742
- await app.waitUntilExit();
743
- resolve(result);
744
- })().catch(reject);
745
- }
746
- })
747
- );
748
- });
749
- }
750
-
751
- // src/core/core.command.ts
752
- var BaseCommand = class extends Command {
753
- session = null;
754
- async init() {
755
- await super.init();
756
- this.session = await authService.getSession();
757
- kittlApiService.setAccessTokenProvider(
758
- async () => authService.getAccessToken()
759
- );
760
- const envEntries = getKittlEnvEntries();
761
- this.debug(`API base URL: ${API_CONFIG.baseUrl}`);
762
- this.debug(`KITTL_* variables:
763
- ${envEntries.join("\n") || "(none)"}`);
764
- }
765
- getKittlApiClient() {
766
- return kittlApiService.getClient();
767
- }
768
- /**
769
- * Ensures a valid access token (+ refreshes when the accessToken is near expiry).
770
- */
771
- async ensureAuthenticated() {
772
- const session = await authService.getSession();
773
- if (!session?.accessToken) {
774
- this.error(
775
- `Session expired. Run \`${this.config.bin} auth login\` first.`,
776
- { exit: 2 }
777
- );
778
- }
779
- this.session = session;
780
- return session;
781
- }
782
- async renderView(View, ...args) {
783
- return runInteractiveView(View, ...args);
784
- }
785
- };
786
-
787
741
  export {
788
742
  getFileNameFromPath,
789
743
  listAllFilesUnderDir,
790
744
  contentTypeForPath,
791
745
  parseJsonObjectFromFile,
746
+ cloneToPlainJson,
792
747
  ensureDirectory,
793
748
  INK_VIEW_UNMOUNT_REASON,
749
+ getKittlEnvEntries,
794
750
  isSubmitKey,
795
751
  chunkArray,
796
752
  CLI_CONFIG,
797
753
  API_CONFIG,
798
754
  authService,
799
- BaseCommand
755
+ kittlApiService
800
756
  };
801
- //# sourceMappingURL=chunk-F62NYF5U.js.map
757
+ //# sourceMappingURL=chunk-X67IL4KU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/files.ts","../src/core/utils.ts","../package.json","../src/constants.ts","../src/services/auth.service.ts","../src/services/session-vault.service.ts","../src/services/api.service.ts"],"sourcesContent":["import { basename } from 'node:path';\nimport { lookup } from 'mime-types';\nimport { glob } from 'tinyglobby';\n\n/**\n * Last path segment\n */\nexport function getFileNameFromPath(filePath: string): string | undefined {\n const leaf = basename(filePath.trim());\n if (leaf === '' || leaf === '.' || leaf === '..') {\n return undefined;\n }\n return leaf;\n}\n\n/**\n * All files under `rootAbs` (recursive), absolute paths.\n * Does not traverse symlinked directories.\n */\nexport async function listAllFilesUnderDir(rootAbs: string): Promise<string[]> {\n return glob('**/*', {\n cwd: rootAbs,\n absolute: true,\n onlyFiles: true,\n dot: true,\n followSymbolicLinks: false,\n });\n}\n\n/**\n * Extension-based MIME for a path or basename. Unknown fallback to `application/octet-stream` (S3-safe).\n */\nexport function contentTypeForPath(filePath: string): string {\n const mime = lookup(filePath);\n return mime === false ? 'application/octet-stream' : mime;\n}\n","import { mkdir, readFile, stat } from 'node:fs/promises';\nimport type { Key } from 'ink';\nimport { getFileNameFromPath } from './files';\n\n/**\n * Parses a JSON string into a plain object.\n */\nexport function parseJsonObject(\n jsonText: string,\n errorContext: string,\n): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonText) as unknown;\n } catch {\n throw new Error(`Invalid JSON (${errorContext})`);\n }\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error(\n `JSON must be an object, not array or null (${errorContext})`,\n );\n }\n return parsed as Record<string, unknown>;\n}\n\n// Reads a file and parses its contents as a JSON object.\nexport async function parseJsonObjectFromFile(\n filePath: string,\n): Promise<Record<string, unknown>> {\n const jsonText = await readFile(filePath, 'utf8');\n return parseJsonObject(jsonText, filePath);\n}\n\nconst jsonStringifyBigIntReplacer = (_key: string, value: unknown): unknown =>\n typeof value === 'bigint' ? Number(value) : value;\n\n/**\n * Deep clone through JSON so the result is plain data.\n */\nexport function cloneToPlainJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value, jsonStringifyBigIntReplacer)) as T;\n}\n\n/**\n * Ensures `dirPath` exists as a directory: creates it (and parents) when\n * missing, or throws if the path exists and is not a directory.\n */\nexport async function ensureDirectory(dirPath: string): Promise<void> {\n try {\n const s = await stat(dirPath);\n if (!s.isDirectory()) {\n throw new Error(`${dirPath} exists and is not a directory.`);\n }\n } catch (e) {\n // Not `isSystemError` from `./error`: this module is imported by `constants.ts`.\n if (\n e instanceof Error &&\n 'code' in e &&\n (e as NodeJS.ErrnoException).code === 'ENOENT'\n ) {\n await mkdir(dirPath, { recursive: true });\n return;\n }\n throw e;\n }\n}\n\n// Silent UI teardown (e.g. Ink unmount). not user-initiated cancel.\nexport const INK_VIEW_UNMOUNT_REASON = Symbol('INK_VIEW_UNMOUNT_REASON');\n\n/**\n * Reads `process.env[envKey]` as a TCP port, or {@link defaultPort} when unset/blank.\n * Must be an integer in 1–65535 when set.\n */\nexport function parsePortFromEnv(envKey: string, defaultPort: number): number {\n const raw = process.env[envKey];\n const n = Number(raw?.trim() || defaultPort);\n if (!Number.isInteger(n) || n < 1 || n > 65_535) {\n throw new Error(\n `${envKey} must be an integer between 1 and 65535 (got ${JSON.stringify(raw)}).`,\n );\n }\n return n;\n}\n\n// Fixed localhost OAuth callback path for Authorization Code + PKCE.\nexport function localhostOAuthRedirectUri(port: number): string {\n return `http://localhost:${port}/callback`;\n}\n\nexport function getKittlEnvEntries(): string[] {\n return Object.entries(process.env)\n .filter(([key]) => key.startsWith('KITTL_'))\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, value]) => `${key}=${value ?? ''}`);\n}\n\n// Enter key across terminal variants (`return` + optional `enter`).\nexport function isSubmitKey(key: Key): boolean {\n if (key.return) {\n return true;\n }\n return Boolean((key as Key & { enter?: boolean }).enter);\n}\n\n/**\n * Resolves a file name from an env value via {@link getFileNameFromPath};\n * empty or invalid values fall back to `defaultFileName`.\n */\nexport function resolveFileNameFromEnv(\n envValue: string | undefined,\n defaultFileName: string,\n): string {\n const raw = envValue?.trim() ?? '';\n if (raw === '') {\n return defaultFileName;\n }\n return getFileNameFromPath(raw) ?? defaultFileName;\n}\n\n// Split an array into consecutive slices of at most `chunkSize` items.\nexport function chunkArray<T>(items: T[], chunkSize: number): T[][] {\n if (chunkSize < 1) {\n throw new Error('chunkSize must be at least 1');\n }\n const n = Math.ceil(items.length / chunkSize);\n return Array.from({ length: n }, (_, i) =>\n items.slice(i * chunkSize, i * chunkSize + chunkSize),\n );\n}\n","{\n \"name\": \"@kittl/cli\",\n \"version\": \"0.0.9\",\n \"license\": \"Apache-2.0\",\n \"private\": false,\n \"type\": \"module\",\n \"engines\": {\n \"node\": \">=18\"\n },\n \"bin\": {\n \"kittl\": \"./bin/run.js\",\n \"kittl-dev\": \"./bin/dev.js\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/Kittl/sandboxed-extensions.git\",\n \"directory\": \"packages/cli\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"bin\": {\n \"kittl\": \"./bin/run.js\"\n }\n },\n \"files\": [\n \"LICENSE\",\n \"oclif.manifest.json\",\n \"bin/bootstrap.js\",\n \"bin/run.cmd\",\n \"bin/run.js\",\n \"dist\"\n ],\n \"scripts\": {\n \"prepack\": \"npx --yes only-allow pnpm && pnpm run build && clean-package\",\n \"postpack\": \"clean-package restore\",\n \"build\": \"tsup && oclif manifest\",\n \"build:watch\": \"tsup --watch --onSuccess \\\"oclif manifest\\\"\",\n \"dev\": \"node ./bin/dev.js\",\n \"dev:watch\": \"node --watch --watch-path=./src --watch-path=./bin ./bin/dev.js\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"deploy\": \"bash ./scripts/publish.sh\"\n },\n \"dependencies\": {\n \"@oclif/core\": \"^4.10.2\",\n \"@oclif/plugin-autocomplete\": \"^3.2.45\",\n \"@oclif/plugin-warn-if-update-available\": \"^3.1.60\",\n \"axios\": \"^1.13.6\",\n \"cross-keychain\": \"^1.1.0\",\n \"ink\": \"^6.8.0\",\n \"ink-text-input\": \"^6.0.0\",\n \"jwt-decode\": \"^4.0.0\",\n \"mime-types\": \"^3.0.1\",\n \"open\": \"^11.0.0\",\n \"openid-client\": \"^6.8.2\",\n \"react\": \"catalog:\",\n \"tinyglobby\": \"^0.2.15\",\n \"zod\": \"catalog:\"\n },\n \"devDependencies\": {\n \"@types/mime-types\": \"^3.0.1\",\n \"@types/node\": \"^25.5.0\",\n \"@types/react\": \"catalog:\",\n \"clean-package\": \"^2.2.0\",\n \"ink-testing-library\": \"^4.0.0\",\n \"oclif\": \"^4.22.96\",\n \"tsup\": \"catalog:\",\n \"tsx\": \"catalog:\",\n \"typescript\": \"catalog:\",\n \"vitest\": \"^4.1.1\"\n },\n \"oclif\": {\n \"additionalHelpFlags\": [\n \"-h\"\n ],\n \"additionalVersionFlags\": [\n \"-v\"\n ],\n \"bin\": \"kittl\",\n \"commands\": \"./dist/commands\",\n \"dirname\": \"kittl\",\n \"topicSeparator\": \" \",\n \"plugins\": [\n \"@oclif/plugin-autocomplete\",\n \"@oclif/plugin-warn-if-update-available\"\n ],\n \"warn-if-update-available\": {\n \"timeoutInDays\": 0,\n \"message\": \"\\n<%= chalk.yellow('A newer Kittl CLI is available:') %> <%= chalk.dim(config.version) %> -> <%= chalk.greenBright(latest) %>\\n<%= chalk.cyan('Update: npm i -g @kittl/cli@latest') %>\\n\"\n },\n \"hooks\": {\n \"finally\": [\n \"./dist/hooks/finally/telemetry.js\"\n ]\n }\n }\n}\n","import pkg from '../package.json' with { type: 'json' };\nimport {\n localhostOAuthRedirectUri,\n parsePortFromEnv,\n resolveFileNameFromEnv,\n} from './core/utils';\n\nconst { version } = pkg;\n\nconst CLI_CONFIG_DIR = '.kittl' as const;\nconst CLI_CONFIG_DEFAULT_FILENAME = 'config.json' as const;\nconst CLI_MANIFEST_DEFAULT_FILENAME = 'manifest.json' as const;\n\nexport const PRODUCTION = {\n issuer: 'https://keycloak.kittl.dev/auth/realms/kittl',\n apiBaseUrl: 'https://api.kittl.com',\n clientId: 'kittl-cli',\n redirectPort: 51771,\n scaffoldViteDevPort: 5173,\n} as const;\n\n// -----------------------------------------------------------------------------\n// CLI configs\n// -----------------------------------------------------------------------------\n\nexport const CLI_CONFIG = {\n configDir: CLI_CONFIG_DIR,\n defaultConfigFileName: CLI_CONFIG_DEFAULT_FILENAME,\n configFileName: resolveFileNameFromEnv(\n process.env.KITTL_CONFIG_FILENAME,\n CLI_CONFIG_DEFAULT_FILENAME,\n ),\n defaultManifestFileName: CLI_MANIFEST_DEFAULT_FILENAME,\n manifestFileName: resolveFileNameFromEnv(\n process.env.KITTL_EXTENSION_MANIFEST_FILENAME,\n CLI_MANIFEST_DEFAULT_FILENAME,\n ),\n scaffoldViteDevPort: parsePortFromEnv(\n 'KITTL_SCAFFOLD_VITE_DEV_PORT',\n PRODUCTION.scaffoldViteDevPort,\n ),\n} as const;\n\n// -----------------------------------------------------------------------------\n// OAuth / OIDC (PKCE login, keychain session)\n// -----------------------------------------------------------------------------\n\nconst authRedirectPort = parsePortFromEnv(\n 'KITTL_REDIRECT_PORT',\n PRODUCTION.redirectPort,\n);\n\nexport const AUTH_CONFIG = {\n issuer: process.env.KITTL_OAUTH_ISSUER_URL ?? PRODUCTION.issuer,\n clientId: process.env.KITTL_OAUTH_CLIENT_ID ?? PRODUCTION.clientId,\n redirectPort: authRedirectPort,\n redirectUri: localhostOAuthRedirectUri(authRedirectPort),\n scope: process.env.KITTL_OAUTH_SCOPE ?? 'openid profile email offline_access',\n // https://www.keycloak.org/docs/latest/server_admin/index.html#_authentication-sessions\n authPrompt: process.env.KITTL_OAUTH_PROMPT || 'login',\n oauthCallbackTimeoutMs: Number(\n process.env.KITTL_OAUTH_CALLBACK_TIMEOUT_MS ?? 120_000,\n ),\n /** Optional 302 after OAuth; if undefined it renders a fallback HTML. */\n oauthSuccessRedirectUrl:\n process.env.KITTL_OAUTH_SUCCESS_REDIRECT_URL || undefined,\n serviceName: 'kittl-cli',\n accountName: 'oauth-session',\n} as const;\n\n// -----------------------------------------------------------------------------\n// HTTP API (Axios base URL for Kittl APIs)\n// -----------------------------------------------------------------------------\n\nexport const API_CONFIG = {\n baseUrl: process.env.KITTL_API_BASE_URL ?? PRODUCTION.apiBaseUrl,\n timeoutMs: 30_000,\n userAgent: `kittl-cli/${version}`,\n} as const;\n","import { createServer } from 'node:http';\nimport { URL } from 'node:url';\nimport open from 'open';\nimport * as oidc from 'openid-client';\nimport { z } from 'zod';\nimport { AUTH_CONFIG } from '../constants';\nimport type { Session } from '../types/session';\nimport { sessionVault } from './session-vault.service';\n\n// Seconds before access token expiry when we proactively refresh.\nconst ACCESS_TOKEN_REFRESH_BUFFER_SEC = 60;\n\nconst OAUTH2_TOKEN_ERROR_INVALID_GRANT = 'invalid_grant';\n\nexport type LoginOptions = {\n signal?: AbortSignal;\n};\n\nexport type CallbackResult = {\n callbackUrl: URL;\n};\n\nconst authConfigSchema = z.object({\n issuer: z.url(),\n clientId: z.string().min(1),\n redirectUri: z.url(),\n redirectPort: z.number().int().min(1).max(65_535),\n scope: z.string().min(1),\n authPrompt: z.string().min(1),\n oauthCallbackTimeoutMs: z.number().int().min(5_000).max(3_600_000),\n oauthSuccessRedirectUrl: z.url().optional(),\n});\n\nexport class LoginCancelledError extends Error {\n public constructor() {\n super('Login cancelled.');\n this.name = 'LoginCancelledError';\n }\n}\n\nexport class AuthService {\n private readonly config = authConfigSchema.parse(AUTH_CONFIG);\n\n // concurrent refresh attempts are merged into a single promise\n private refreshSessionPromise: Promise<Session | null> | null = null;\n\n /**\n * raw vault read.\n */\n public async getStoredSession(): Promise<Session | null> {\n return sessionVault.getSession();\n }\n\n /**\n * ensures token freshness (by silently refresh if needed)\n */\n public async getSession(): Promise<Session | null> {\n await this.getAccessToken();\n return this.getStoredSession();\n }\n\n /**\n * Returns a usable access token, silently refreshing when `expiresAt` is within {@link ACCESS_TOKEN_REFRESH_BUFFER_SEC}\n * seconds (or in the past). based on Session.expiresAt.\n */\n public async getAccessToken(): Promise<string | undefined> {\n const session = await this.getStoredSession();\n if (!session?.accessToken) return undefined;\n\n if (!this.shouldRefreshAccessToken(session)) {\n return session.accessToken;\n }\n\n if (!session.refreshToken) {\n await sessionVault.clear();\n return undefined;\n }\n\n const refreshed = await this.refreshSession();\n return refreshed?.accessToken;\n }\n\n /**\n * Refresh tokens via the OIDC token endpoint. On hard failure (e.g. `invalid_grant`), clears the vault.\n */\n public async refreshSession(): Promise<Session | null> {\n if (this.refreshSessionPromise) {\n return this.refreshSessionPromise;\n }\n this.refreshSessionPromise = this.performRefreshSession().finally(() => {\n this.refreshSessionPromise = null;\n });\n return this.refreshSessionPromise;\n }\n\n private shouldRefreshAccessToken(session: Session): boolean {\n if (session.expiresAt === undefined) return false;\n const now = Math.floor(Date.now() / 1000);\n return session.expiresAt <= now + ACCESS_TOKEN_REFRESH_BUFFER_SEC;\n }\n\n private async performRefreshSession(): Promise<Session | null> {\n const session = await this.getStoredSession();\n if (!session?.refreshToken) {\n await sessionVault.clear();\n return null;\n }\n\n try {\n const oidcConfig = await this.discoverOidcConfiguration();\n\n const tokenSet = await oidc.refreshTokenGrant(\n oidcConfig,\n session.refreshToken,\n { scope: this.config.scope },\n undefined,\n );\n\n const newSession = this.mapTokenSetToSession(tokenSet, session);\n\n await sessionVault.saveSession(newSession);\n return newSession;\n } catch (error) {\n if (\n error instanceof oidc.ResponseBodyError &&\n error.error === OAUTH2_TOKEN_ERROR_INVALID_GRANT\n ) {\n await sessionVault.clear();\n return null;\n }\n return null;\n }\n }\n\n private async discoverOidcConfiguration(): Promise<oidc.Configuration> {\n const issuerUrl = new URL(this.config.issuer);\n return oidc.discovery(\n issuerUrl,\n this.config.clientId,\n undefined,\n undefined,\n {\n ...(issuerUrl.protocol === 'http:'\n ? { execute: [oidc.allowInsecureRequests] as const }\n : {}),\n } as Parameters<typeof oidc.discovery>[4],\n );\n }\n\n public async login(options?: LoginOptions): Promise<Session> {\n const { signal } = options ?? {};\n\n const oidcConfig = await this.discoverOidcConfiguration();\n signal?.throwIfAborted();\n\n const codeVerifier = oidc.randomPKCECodeVerifier();\n const codeChallenge = await oidc.calculatePKCECodeChallenge(codeVerifier);\n const state = oidc.randomState();\n const nonce = oidc.randomNonce();\n\n const authorizationUrl = oidc.buildAuthorizationUrl(oidcConfig, {\n redirect_uri: this.config.redirectUri,\n response_type: 'code',\n scope: this.config.scope,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n state,\n nonce,\n prompt: this.config.authPrompt,\n });\n\n signal?.throwIfAborted();\n await this.openBrowser(authorizationUrl.toString());\n\n const callback = await this.waitForCallback(signal);\n\n const tokenSet = await oidc.authorizationCodeGrant(\n oidcConfig,\n callback.callbackUrl,\n {\n pkceCodeVerifier: codeVerifier,\n expectedState: state,\n expectedNonce: nonce,\n },\n );\n\n const session = this.mapTokenSetToSession(tokenSet);\n\n await sessionVault.saveSession(session);\n return session;\n }\n\n public async logout(): Promise<void> {\n await sessionVault.clear();\n }\n\n /**\n * Starts a short-lived `http` server on the host/port from the configured `redirectUri` so the IdP can\n * redirect the browser to `…/callback?code=…&state=…` (Authorization Code + PKCE). The first matching request\n * stops the server and resolves with that URL for the token exchange (`authorizationCodeGrant`).\n *\n * - **Success response:** HTTP 302 to {@link AUTH_CONFIG.oauthSuccessRedirectUrl} when set; otherwise a minimal inline HTML page.\n */\n private async waitForCallback(signal?: AbortSignal): Promise<CallbackResult> {\n const redirectUrl = new URL(this.config.redirectUri);\n const hostname = redirectUrl.hostname;\n const port = Number(redirectUrl.port);\n const pathname = redirectUrl.pathname;\n\n const timeoutSignal = AbortSignal.timeout(\n this.config.oauthCallbackTimeoutMs,\n );\n const combinedSignal =\n signal !== undefined\n ? AbortSignal.any([signal, timeoutSignal])\n : timeoutSignal;\n\n return new Promise((resolve, reject) => {\n let closed = false;\n\n const server = createServer((req, res) => {\n try {\n const requestUrl = new URL(req.url ?? '', this.config.redirectUri);\n if (requestUrl.pathname !== pathname) {\n res.statusCode = 404;\n res.end('Not Found');\n return;\n }\n\n const callbackUrl = new URL(this.config.redirectUri);\n callbackUrl.search = requestUrl.search;\n\n const brandUrl = this.config.oauthSuccessRedirectUrl;\n if (brandUrl) {\n res.writeHead(302, { Location: brandUrl });\n res.end();\n } else {\n res.statusCode = 200;\n res.setHeader('content-type', 'text/html; charset=utf-8');\n res.end(\n '<!doctype html><html><body><h2>Authentication complete.</h2><p>You can close this tab and return to the terminal.</p></body></html>',\n );\n }\n\n closeServer((closeErr?: Error) => {\n if (closeErr) {\n reject(closeErr);\n return;\n }\n resolve({ callbackUrl });\n });\n } catch (error) {\n closeServer(() => reject(error));\n }\n });\n\n const closeServer = (onClosed: (closeErr?: Error) => void): void => {\n if (closed) return;\n closed = true;\n combinedSignal.removeEventListener('abort', onCombinedAbort);\n if (!server.listening) {\n onClosed();\n return;\n }\n server.closeAllConnections();\n server.close((closeErr) => {\n onClosed(closeErr ?? undefined);\n });\n };\n\n function onCombinedAbort(): void {\n closeServer((closeErr?: Error) => {\n if (closeErr) {\n reject(closeErr);\n return;\n }\n if (signal?.aborted) {\n reject(signal.reason ?? new LoginCancelledError());\n return;\n }\n if (timeoutSignal.aborted) {\n reject(new Error('Login timed out. Please try again.'));\n return;\n }\n reject(new LoginCancelledError());\n });\n }\n\n server.on('error', (error: NodeJS.ErrnoException) => {\n closeServer(() => {\n if (error.code === 'EADDRINUSE') {\n const inUsePort =\n (error as NodeJS.ErrnoException & { port?: number }).port ?? port;\n reject(\n new Error(\n `Port ${String(inUsePort)} is already in use. Close the other app using it or set KITTL_REDIRECT_PORT to a free port, then try again.`,\n ),\n );\n return;\n }\n reject(error);\n });\n });\n\n // 1. Abort before any listen: avoids a half-started server; early exit skips `listen` entirely.\n combinedSignal.addEventListener('abort', onCombinedAbort, { once: true });\n if (combinedSignal.aborted) {\n onCombinedAbort();\n return;\n }\n\n server.listen(port, hostname);\n });\n }\n\n private async openBrowser(url: string): Promise<void> {\n await open(url);\n }\n\n private mapTokenSetToSession(\n tokenSet: oidc.TokenEndpointResponse,\n currentSession?: Session,\n ): Session {\n return {\n accessToken: tokenSet.access_token,\n refreshToken: tokenSet.refresh_token ?? currentSession?.refreshToken,\n idToken: tokenSet.id_token ?? currentSession?.idToken,\n tokenType: tokenSet.token_type ?? currentSession?.tokenType,\n expiresAt: tokenSet.expires_in\n ? Math.floor(Date.now() / 1000) + tokenSet.expires_in\n : undefined,\n };\n }\n}\n\nexport const authService = new AuthService();\n","import { deletePassword, getPassword, setPassword } from 'cross-keychain';\nimport { AUTH_CONFIG } from '../constants';\nimport type { Session } from '../types/session';\n\nconst SESSION_META_VERSION = 2 as const;\n\n// suffix for split v2 accounts: `{AUTH_CONFIG.accountName}.{suffix}`.\nconst SESSION_V2_KEY_SUFFIX = {\n meta: 'meta',\n access: 'access',\n refresh: 'refresh',\n id: 'id',\n} as const;\n\ntype SessionMetaV2 = {\n v: typeof SESSION_META_VERSION;\n tokenType?: string;\n expiresAt?: number;\n};\n\n/**\n * Persists OIDC session (tokens) in the OS credential store (e.g. Keychain).\n */\nexport class SessionVault {\n private readonly keychainService = this.buildKeychainServiceName();\n private readonly keychainAccount = AUTH_CONFIG.accountName;\n\n private buildKeychainServiceName(): string {\n try {\n const issuerUrl = new URL(AUTH_CONFIG.issuer);\n const issuerKey = this.sanitizeKeychainSegment(\n `${issuerUrl.hostname}${issuerUrl.port ? `-${issuerUrl.port}` : ''}`,\n );\n return `${AUTH_CONFIG.serviceName}-${issuerKey}`;\n } catch {\n // Keep previous behavior when issuer is not a valid URL.\n return AUTH_CONFIG.serviceName;\n }\n }\n\n private sanitizeKeychainSegment(value: string): string {\n return value.replace(/[^a-zA-Z0-9._@-]/g, '-');\n }\n\n private account(suffix: string): string {\n return `${this.keychainAccount}.${suffix}`;\n }\n\n public async getSession(): Promise<Session | null> {\n const metaRaw = await getPassword(\n this.keychainService,\n this.account(SESSION_V2_KEY_SUFFIX.meta),\n );\n\n let meta: SessionMetaV2 | null = null;\n if (metaRaw) {\n try {\n const parsed = JSON.parse(metaRaw) as SessionMetaV2;\n if (parsed.v === SESSION_META_VERSION) {\n meta = parsed;\n }\n } catch {\n meta = null;\n }\n }\n // if meta is present, read based on v2\n if (meta) {\n const accessRaw = await getPassword(\n this.keychainService,\n this.account(SESSION_V2_KEY_SUFFIX.access),\n );\n // fallback, if not defined, to legacy monolithic read\n const accessToken = accessRaw?.trim();\n if (accessToken) {\n const refreshRaw = await getPassword(\n this.keychainService,\n this.account(SESSION_V2_KEY_SUFFIX.refresh),\n );\n const idRaw = await getPassword(\n this.keychainService,\n this.account(SESSION_V2_KEY_SUFFIX.id),\n );\n\n return {\n accessToken,\n refreshToken: refreshRaw ?? undefined,\n idToken: idRaw ?? undefined,\n tokenType: meta.tokenType,\n expiresAt: meta.expiresAt,\n };\n }\n }\n // read based on legacy monolithic\n const raw = await getPassword(this.keychainService, this.keychainAccount);\n if (!raw) return null;\n\n try {\n return JSON.parse(raw) as Session;\n } catch {\n return null;\n }\n }\n\n public async saveSession(session: Session): Promise<void> {\n const meta: SessionMetaV2 = {\n v: SESSION_META_VERSION,\n tokenType: session.tokenType,\n expiresAt: session.expiresAt,\n };\n\n const accessToken = session.accessToken.trim();\n await setPassword(\n this.keychainService,\n this.account(SESSION_V2_KEY_SUFFIX.access),\n accessToken,\n );\n await this.setOrDeleteTokenAccount(\n SESSION_V2_KEY_SUFFIX.refresh,\n session.refreshToken,\n );\n await this.setOrDeleteTokenAccount(\n SESSION_V2_KEY_SUFFIX.id,\n session.idToken,\n );\n await setPassword(\n this.keychainService,\n this.account(SESSION_V2_KEY_SUFFIX.meta),\n JSON.stringify(meta),\n );\n\n await this.deleteLegacyMonolithicIfPresent();\n }\n\n // when auth omits an optional token, remove any previously stored value as well\n private async setOrDeleteTokenAccount(\n suffix:\n | typeof SESSION_V2_KEY_SUFFIX.refresh\n | typeof SESSION_V2_KEY_SUFFIX.id,\n token: string | undefined,\n ): Promise<void> {\n const acc = this.account(suffix);\n const trimmed = token?.trim();\n if (trimmed) {\n await setPassword(this.keychainService, acc, trimmed);\n return;\n }\n const existing = await getPassword(this.keychainService, acc);\n if (existing) {\n await deletePassword(this.keychainService, acc);\n }\n }\n\n // older releases stored the whole session JSON under {@link keychainAccount} only\n private async deleteLegacyMonolithicIfPresent(): Promise<void> {\n const legacy = await getPassword(\n this.keychainService,\n this.keychainAccount,\n );\n if (!legacy) return;\n try {\n await deletePassword(this.keychainService, this.keychainAccount);\n } catch {\n // ignore, best effort cleanup\n }\n }\n\n public async clear(): Promise<void> {\n const accounts = [\n ...Object.values(SESSION_V2_KEY_SUFFIX).map((suffix) =>\n this.account(suffix),\n ),\n this.keychainAccount,\n ];\n for (const account of accounts) {\n const existing = await getPassword(this.keychainService, account);\n if (existing) {\n try {\n await deletePassword(this.keychainService, account);\n } catch {\n // ignore\n }\n }\n }\n }\n}\n\nexport const sessionVault = new SessionVault();\n","import axios, {\n type AxiosError,\n AxiosHeaders,\n type AxiosInstance,\n type InternalAxiosRequestConfig,\n} from 'axios';\nimport { API_CONFIG } from '../constants';\nimport { authService } from './auth.service';\n\ntype AccessTokenProvider = () => Promise<string | undefined>;\ntype RetriableRequestConfig = InternalAxiosRequestConfig & {\n _retry?: boolean;\n};\n\nexport class KittlApiService {\n private readonly client: AxiosInstance;\n private accessTokenProvider?: AccessTokenProvider;\n\n public constructor() {\n this.client = axios.create({\n baseURL: API_CONFIG.baseUrl,\n timeout: API_CONFIG.timeoutMs,\n headers: {\n 'User-Agent': API_CONFIG.userAgent,\n },\n });\n\n this.client.interceptors.request.use(\n async (config: RetriableRequestConfig) => {\n if (config.skipAuth) {\n return config;\n }\n const token = await this.accessTokenProvider?.();\n if (token) {\n this.setAuthorizationHeader(config, token);\n }\n return config;\n },\n );\n\n this.client.interceptors.response.use(\n (response) => response,\n async (error: AxiosError) => {\n const originalRequest = error.config as\n | RetriableRequestConfig\n | undefined;\n // Retry only first-time 401 responses with a valid original request.\n if (\n error.response?.status !== 401 ||\n !originalRequest ||\n originalRequest.skipAuth ||\n originalRequest._retry\n ) {\n throw error;\n }\n\n // Mark as retried to avoid infinite retry loops.\n originalRequest._retry = true;\n // Force-refresh the token before replaying the request.\n const refreshedSession = await authService.refreshSession();\n const refreshedToken = refreshedSession?.accessToken;\n if (!refreshedToken) {\n throw error;\n }\n\n // Re-run the original request with updated Authorization header.\n this.setAuthorizationHeader(originalRequest, refreshedToken);\n return this.client.request(originalRequest);\n },\n );\n }\n\n public setAccessTokenProvider(provider: AccessTokenProvider): void {\n this.accessTokenProvider = provider;\n }\n\n public getClient(): AxiosInstance {\n return this.client;\n }\n\n private setAuthorizationHeader(\n config: InternalAxiosRequestConfig,\n token: string,\n ): void {\n const headers = AxiosHeaders.from(config.headers);\n headers.set('Authorization', `Bearer ${token}`);\n config.headers = headers;\n }\n}\n\nexport const kittlApiService = new KittlApiService();\n"],"mappings":"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","names":["URL","URL"]}
@@ -0,0 +1,36 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __commonJS = (cb, mod) => function __require() {
8
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9
+ };
10
+ var __export = (target, all) => {
11
+ for (var name in all)
12
+ __defProp(target, name, { get: all[name], enumerable: true });
13
+ };
14
+ var __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from))
17
+ if (!__hasOwnProp.call(to, key) && key !== except)
18
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
+ // If the importer is in node compatibility mode or this is not an ESM
24
+ // file that has been converted to a CommonJS file using a Babel-
25
+ // compatible transform (i.e. "__esModule" has not been set), then set
26
+ // "default" to the CommonJS "module.exports" for node compatibility.
27
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
+ mod
29
+ ));
30
+
31
+ export {
32
+ __commonJS,
33
+ __export,
34
+ __toESM
35
+ };
36
+ //# sourceMappingURL=chunk-ZS7NZCD4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  createExtensionDraftVersion
3
- } from "../../chunk-E5EOPARA.js";
3
+ } from "../../chunk-GOOP3XEU.js";
4
4
  import {
5
5
  formatHttpClientError,
6
6
  internalConfigExists,
7
7
  internalConfigPath,
8
8
  isSystemError,
9
9
  writeInternalConfig
10
- } from "../../chunk-344EUO2O.js";
10
+ } from "../../chunk-LEELFFFY.js";
11
11
  import {
12
12
  useTerminalWidth
13
13
  } from "../../chunk-EKU4DKQK.js";
@@ -18,12 +18,15 @@ import {
18
18
  textStyles
19
19
  } from "../../chunk-3BPIJLS7.js";
20
20
  import {
21
- BaseCommand,
21
+ BaseCommand
22
+ } from "../../chunk-CT7IDOZX.js";
23
+ import {
22
24
  CLI_CONFIG,
23
25
  ensureDirectory,
24
26
  getFileNameFromPath,
25
27
  isSubmitKey
26
- } from "../../chunk-F62NYF5U.js";
28
+ } from "../../chunk-X67IL4KU.js";
29
+ import "../../chunk-ZS7NZCD4.js";
27
30
 
28
31
  // src/commands/app/init.ts
29
32
  import { join as join2, relative, resolve } from "node:path";