@intutic/cli 1.3.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 (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -0
  3. package/dist/cli.d.ts +14 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +348 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/benchmark.d.ts +31 -0
  8. package/dist/commands/benchmark.d.ts.map +1 -0
  9. package/dist/commands/benchmark.js +211 -0
  10. package/dist/commands/benchmark.js.map +1 -0
  11. package/dist/commands/budget.d.ts +7 -0
  12. package/dist/commands/budget.d.ts.map +1 -0
  13. package/dist/commands/budget.js +68 -0
  14. package/dist/commands/budget.js.map +1 -0
  15. package/dist/commands/budgetCompatibility.test.d.ts +2 -0
  16. package/dist/commands/budgetCompatibility.test.d.ts.map +1 -0
  17. package/dist/commands/budgetCompatibility.test.js +19 -0
  18. package/dist/commands/budgetCompatibility.test.js.map +1 -0
  19. package/dist/commands/connect.d.ts +20 -0
  20. package/dist/commands/connect.d.ts.map +1 -0
  21. package/dist/commands/connect.js +1010 -0
  22. package/dist/commands/connect.js.map +1 -0
  23. package/dist/commands/doctor.d.ts +23 -0
  24. package/dist/commands/doctor.d.ts.map +1 -0
  25. package/dist/commands/doctor.js +429 -0
  26. package/dist/commands/doctor.js.map +1 -0
  27. package/dist/commands/enterprise-install.d.ts +36 -0
  28. package/dist/commands/enterprise-install.d.ts.map +1 -0
  29. package/dist/commands/enterprise-install.js +289 -0
  30. package/dist/commands/enterprise-install.js.map +1 -0
  31. package/dist/commands/eval.d.ts +13 -0
  32. package/dist/commands/eval.d.ts.map +1 -0
  33. package/dist/commands/eval.js +67 -0
  34. package/dist/commands/eval.js.map +1 -0
  35. package/dist/commands/exec.d.ts +34 -0
  36. package/dist/commands/exec.d.ts.map +1 -0
  37. package/dist/commands/exec.js +114 -0
  38. package/dist/commands/exec.js.map +1 -0
  39. package/dist/commands/exec.test.d.ts +2 -0
  40. package/dist/commands/exec.test.d.ts.map +1 -0
  41. package/dist/commands/exec.test.js +29 -0
  42. package/dist/commands/exec.test.js.map +1 -0
  43. package/dist/commands/export.d.ts +21 -0
  44. package/dist/commands/export.d.ts.map +1 -0
  45. package/dist/commands/export.js +116 -0
  46. package/dist/commands/export.js.map +1 -0
  47. package/dist/commands/init.d.ts +13 -0
  48. package/dist/commands/init.d.ts.map +1 -0
  49. package/dist/commands/init.js +110 -0
  50. package/dist/commands/init.js.map +1 -0
  51. package/dist/commands/install-daemon.d.ts +61 -0
  52. package/dist/commands/install-daemon.d.ts.map +1 -0
  53. package/dist/commands/install-daemon.js +696 -0
  54. package/dist/commands/install-daemon.js.map +1 -0
  55. package/dist/commands/install-daemon.test.d.ts +2 -0
  56. package/dist/commands/install-daemon.test.d.ts.map +1 -0
  57. package/dist/commands/install-daemon.test.js +93 -0
  58. package/dist/commands/install-daemon.test.js.map +1 -0
  59. package/dist/commands/login.d.ts +14 -0
  60. package/dist/commands/login.d.ts.map +1 -0
  61. package/dist/commands/login.js +121 -0
  62. package/dist/commands/login.js.map +1 -0
  63. package/dist/commands/logout.d.ts +8 -0
  64. package/dist/commands/logout.d.ts.map +1 -0
  65. package/dist/commands/logout.js +13 -0
  66. package/dist/commands/logout.js.map +1 -0
  67. package/dist/commands/mdm.d.ts +23 -0
  68. package/dist/commands/mdm.d.ts.map +1 -0
  69. package/dist/commands/mdm.js +134 -0
  70. package/dist/commands/mdm.js.map +1 -0
  71. package/dist/commands/policy.d.ts +19 -0
  72. package/dist/commands/policy.d.ts.map +1 -0
  73. package/dist/commands/policy.js +232 -0
  74. package/dist/commands/policy.js.map +1 -0
  75. package/dist/commands/prompt.d.ts +11 -0
  76. package/dist/commands/prompt.d.ts.map +1 -0
  77. package/dist/commands/prompt.js +71 -0
  78. package/dist/commands/prompt.js.map +1 -0
  79. package/dist/commands/skill.d.ts +31 -0
  80. package/dist/commands/skill.d.ts.map +1 -0
  81. package/dist/commands/skill.js +349 -0
  82. package/dist/commands/skill.js.map +1 -0
  83. package/dist/commands/sop-audit.d.ts +17 -0
  84. package/dist/commands/sop-audit.d.ts.map +1 -0
  85. package/dist/commands/sop-audit.js +136 -0
  86. package/dist/commands/sop-audit.js.map +1 -0
  87. package/dist/commands/sops.d.ts +4 -0
  88. package/dist/commands/sops.d.ts.map +1 -0
  89. package/dist/commands/sops.js +88 -0
  90. package/dist/commands/sops.js.map +1 -0
  91. package/dist/commands/status.d.ts +11 -0
  92. package/dist/commands/status.d.ts.map +1 -0
  93. package/dist/commands/status.js +107 -0
  94. package/dist/commands/status.js.map +1 -0
  95. package/dist/commands/syncContext.d.ts +18 -0
  96. package/dist/commands/syncContext.d.ts.map +1 -0
  97. package/dist/commands/syncContext.js +37 -0
  98. package/dist/commands/syncContext.js.map +1 -0
  99. package/dist/commands/traces.d.ts +32 -0
  100. package/dist/commands/traces.d.ts.map +1 -0
  101. package/dist/commands/traces.js +207 -0
  102. package/dist/commands/traces.js.map +1 -0
  103. package/dist/commands/whoami.d.ts +12 -0
  104. package/dist/commands/whoami.d.ts.map +1 -0
  105. package/dist/commands/whoami.js +34 -0
  106. package/dist/commands/whoami.js.map +1 -0
  107. package/dist/config/keychain.d.ts +28 -0
  108. package/dist/config/keychain.d.ts.map +1 -0
  109. package/dist/config/keychain.js +98 -0
  110. package/dist/config/keychain.js.map +1 -0
  111. package/dist/config/paths.d.ts +30 -0
  112. package/dist/config/paths.d.ts.map +1 -0
  113. package/dist/config/paths.js +53 -0
  114. package/dist/config/paths.js.map +1 -0
  115. package/dist/config/store.d.ts +25 -0
  116. package/dist/config/store.d.ts.map +1 -0
  117. package/dist/config/store.js +93 -0
  118. package/dist/config/store.js.map +1 -0
  119. package/dist/harness/aider.d.ts +13 -0
  120. package/dist/harness/aider.d.ts.map +1 -0
  121. package/dist/harness/aider.js +48 -0
  122. package/dist/harness/aider.js.map +1 -0
  123. package/dist/harness/antigravity.d.ts +12 -0
  124. package/dist/harness/antigravity.d.ts.map +1 -0
  125. package/dist/harness/antigravity.js +69 -0
  126. package/dist/harness/antigravity.js.map +1 -0
  127. package/dist/harness/base.d.ts +20 -0
  128. package/dist/harness/base.d.ts.map +1 -0
  129. package/dist/harness/base.js +73 -0
  130. package/dist/harness/base.js.map +1 -0
  131. package/dist/harness/claudeCode.d.ts +2 -0
  132. package/dist/harness/claudeCode.d.ts.map +1 -0
  133. package/dist/harness/claudeCode.js +9 -0
  134. package/dist/harness/claudeCode.js.map +1 -0
  135. package/dist/harness/claudeDesktop.d.ts +18 -0
  136. package/dist/harness/claudeDesktop.d.ts.map +1 -0
  137. package/dist/harness/claudeDesktop.js +69 -0
  138. package/dist/harness/claudeDesktop.js.map +1 -0
  139. package/dist/harness/cline.d.ts +13 -0
  140. package/dist/harness/cline.d.ts.map +1 -0
  141. package/dist/harness/cline.js +75 -0
  142. package/dist/harness/cline.js.map +1 -0
  143. package/dist/harness/codex.d.ts +13 -0
  144. package/dist/harness/codex.d.ts.map +1 -0
  145. package/dist/harness/codex.js +86 -0
  146. package/dist/harness/codex.js.map +1 -0
  147. package/dist/harness/continue.d.ts +14 -0
  148. package/dist/harness/continue.d.ts.map +1 -0
  149. package/dist/harness/continue.js +97 -0
  150. package/dist/harness/continue.js.map +1 -0
  151. package/dist/harness/cursor.d.ts +14 -0
  152. package/dist/harness/cursor.d.ts.map +1 -0
  153. package/dist/harness/cursor.js +65 -0
  154. package/dist/harness/cursor.js.map +1 -0
  155. package/dist/harness/detector.d.ts +29 -0
  156. package/dist/harness/detector.d.ts.map +1 -0
  157. package/dist/harness/detector.js +81 -0
  158. package/dist/harness/detector.js.map +1 -0
  159. package/dist/harness/githubCopilot.d.ts +12 -0
  160. package/dist/harness/githubCopilot.d.ts.map +1 -0
  161. package/dist/harness/githubCopilot.js +54 -0
  162. package/dist/harness/githubCopilot.js.map +1 -0
  163. package/dist/harness/goose.d.ts +13 -0
  164. package/dist/harness/goose.d.ts.map +1 -0
  165. package/dist/harness/goose.js +45 -0
  166. package/dist/harness/goose.js.map +1 -0
  167. package/dist/harness/hermes.d.ts +12 -0
  168. package/dist/harness/hermes.d.ts.map +1 -0
  169. package/dist/harness/hermes.js +51 -0
  170. package/dist/harness/hermes.js.map +1 -0
  171. package/dist/harness/n8n.d.ts +17 -0
  172. package/dist/harness/n8n.d.ts.map +1 -0
  173. package/dist/harness/n8n.js +125 -0
  174. package/dist/harness/n8n.js.map +1 -0
  175. package/dist/harness/openWebUI.d.ts +13 -0
  176. package/dist/harness/openWebUI.d.ts.map +1 -0
  177. package/dist/harness/openWebUI.js +25 -0
  178. package/dist/harness/openWebUI.js.map +1 -0
  179. package/dist/harness/openclaw.d.ts +12 -0
  180. package/dist/harness/openclaw.d.ts.map +1 -0
  181. package/dist/harness/openclaw.js +51 -0
  182. package/dist/harness/openclaw.js.map +1 -0
  183. package/dist/harness/openhands.d.ts +12 -0
  184. package/dist/harness/openhands.d.ts.map +1 -0
  185. package/dist/harness/openhands.js +67 -0
  186. package/dist/harness/openhands.js.map +1 -0
  187. package/dist/harness/pi.d.ts +12 -0
  188. package/dist/harness/pi.d.ts.map +1 -0
  189. package/dist/harness/pi.js +51 -0
  190. package/dist/harness/pi.js.map +1 -0
  191. package/dist/harness/rooCode.d.ts +14 -0
  192. package/dist/harness/rooCode.d.ts.map +1 -0
  193. package/dist/harness/rooCode.js +77 -0
  194. package/dist/harness/rooCode.js.map +1 -0
  195. package/dist/harness/types.d.ts +30 -0
  196. package/dist/harness/types.d.ts.map +1 -0
  197. package/dist/harness/types.js +32 -0
  198. package/dist/harness/types.js.map +1 -0
  199. package/dist/harness/vscodeSettingsWriter.d.ts +40 -0
  200. package/dist/harness/vscodeSettingsWriter.d.ts.map +1 -0
  201. package/dist/harness/vscodeSettingsWriter.js +116 -0
  202. package/dist/harness/vscodeSettingsWriter.js.map +1 -0
  203. package/dist/harness/windsurf.d.ts +14 -0
  204. package/dist/harness/windsurf.d.ts.map +1 -0
  205. package/dist/harness/windsurf.js +64 -0
  206. package/dist/harness/windsurf.js.map +1 -0
  207. package/dist/lib/api.d.ts +48 -0
  208. package/dist/lib/api.d.ts.map +1 -0
  209. package/dist/lib/api.js +128 -0
  210. package/dist/lib/api.js.map +1 -0
  211. package/dist/lib/envInjector.d.ts +24 -0
  212. package/dist/lib/envInjector.d.ts.map +1 -0
  213. package/dist/lib/envInjector.js +149 -0
  214. package/dist/lib/envInjector.js.map +1 -0
  215. package/dist/lib/envInjector.test.d.ts +2 -0
  216. package/dist/lib/envInjector.test.d.ts.map +1 -0
  217. package/dist/lib/envInjector.test.js +32 -0
  218. package/dist/lib/envInjector.test.js.map +1 -0
  219. package/dist/lib/gitHooks.d.ts +19 -0
  220. package/dist/lib/gitHooks.d.ts.map +1 -0
  221. package/dist/lib/gitHooks.js +58 -0
  222. package/dist/lib/gitHooks.js.map +1 -0
  223. package/dist/lib/hash.d.ts +11 -0
  224. package/dist/lib/hash.d.ts.map +1 -0
  225. package/dist/lib/hash.js +18 -0
  226. package/dist/lib/hash.js.map +1 -0
  227. package/dist/lib/logger.d.ts +18 -0
  228. package/dist/lib/logger.d.ts.map +1 -0
  229. package/dist/lib/logger.js +33 -0
  230. package/dist/lib/logger.js.map +1 -0
  231. package/dist/lib/onboarding.d.ts +10 -0
  232. package/dist/lib/onboarding.d.ts.map +1 -0
  233. package/dist/lib/onboarding.js +178 -0
  234. package/dist/lib/onboarding.js.map +1 -0
  235. package/dist/lib/process.d.ts +53 -0
  236. package/dist/lib/process.d.ts.map +1 -0
  237. package/dist/lib/process.js +181 -0
  238. package/dist/lib/process.js.map +1 -0
  239. package/dist/lib/process.test.d.ts +2 -0
  240. package/dist/lib/process.test.d.ts.map +1 -0
  241. package/dist/lib/process.test.js +44 -0
  242. package/dist/lib/process.test.js.map +1 -0
  243. package/package.json +55 -0
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `intutic status` — Show workspace status.
3
+ *
4
+ * Displays auth state, detected harnesses, last sync time,
5
+ * and config version.
6
+ *
7
+ * LLD #8 — Sync Daemon / CLI
8
+ * @module
9
+ */
10
+ export declare function runStatus(): Promise<void>;
11
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAyBH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAgF/C"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * `intutic status` — Show workspace status.
3
+ *
4
+ * Displays auth state, detected harnesses, last sync time,
5
+ * and config version.
6
+ *
7
+ * LLD #8 — Sync Daemon / CLI
8
+ * @module
9
+ */
10
+ import { log } from '../lib/logger.js';
11
+ import { loadCredentials, loadConfig, loadIntegrity } from '../config/store.js';
12
+ import { getActiveAgentProcesses, isSyncDaemonRunning } from '../lib/process.js';
13
+ import pc from 'picocolors';
14
+ const HARNESS_TO_PROCESS_NAME = {
15
+ cursor: ['Cursor'],
16
+ 'claude-code': ['Claude Code'],
17
+ antigravity: ['Antigravity'],
18
+ n8n: ['n8n'],
19
+ codex: ['Codex'],
20
+ windsurf: ['Windsurf'],
21
+ aider: ['Aider'],
22
+ openhands: ['OpenHands'],
23
+ openclaw: ['OpenClaw'],
24
+ cline: ['VS Code'],
25
+ 'roo-code': ['VS Code'],
26
+ continue: ['VS Code', 'JetBrains IDE'],
27
+ 'claude-desktop': ['Claude Desktop'],
28
+ goose: ['Goose'],
29
+ 'open-webui': ['OpenWebUI'],
30
+ };
31
+ export async function runStatus() {
32
+ log.header('Intutic — Workspace Status');
33
+ // Auth
34
+ const creds = await loadCredentials();
35
+ if (creds) {
36
+ log.field('Email', creds.email);
37
+ log.field('Workspace', creds.workspaceId);
38
+ log.field('Control Plane', creds.controlPlaneUrl);
39
+ }
40
+ else {
41
+ log.warn('Not authenticated. Run `intutic login` first.');
42
+ }
43
+ // Config
44
+ const config = loadConfig();
45
+ if (config) {
46
+ log.field('Workspace Root', config.workspaceRoot);
47
+ log.field('Dev Mode', config.devMode ? 'yes' : 'no');
48
+ log.field('Config Version', String(config.configVersion));
49
+ console.log('');
50
+ log.info('Detected harnesses:');
51
+ if (config.harnesses.length === 0) {
52
+ log.dim(' (none)');
53
+ }
54
+ else {
55
+ for (const h of config.harnesses) {
56
+ console.log(` ${pc.green('✔')} ${h}`);
57
+ }
58
+ }
59
+ // Integrity
60
+ const integrity = loadIntegrity(config.workspaceRoot);
61
+ if (integrity) {
62
+ log.field('Last Sync', integrity.lastSyncAt);
63
+ log.field('Tracked Files', String(Object.keys(integrity.files).length));
64
+ }
65
+ else {
66
+ log.dim(' No sync data yet. Run `intutic connect` to start syncing.');
67
+ }
68
+ // Active Processes
69
+ const activeProcs = getActiveAgentProcesses();
70
+ const daemonRunning = isSyncDaemonRunning();
71
+ console.log('');
72
+ log.info('Active Running Processes:');
73
+ if (activeProcs.length === 0) {
74
+ log.dim(' (none detected)');
75
+ }
76
+ else {
77
+ for (const p of activeProcs) {
78
+ console.log(` ${pc.yellow('●')} ${pc.bold(p.name)} (PID: ${p.pid}) — ${pc.dim(p.command)}`);
79
+ }
80
+ }
81
+ console.log('');
82
+ log.field('Sync Daemon State', daemonRunning ? pc.green('Running') : pc.red('Stopped'));
83
+ // Warning highlights
84
+ if (!daemonRunning && activeProcs.length > 0) {
85
+ const runningNames = new Set(activeProcs.map(p => p.name));
86
+ const configuredHarnesses = config.harnesses;
87
+ let runningConfiguredHarness = false;
88
+ for (const h of configuredHarnesses) {
89
+ const procNames = HARNESS_TO_PROCESS_NAME[h] || [];
90
+ if (procNames.some(name => runningNames.has(name))) {
91
+ runningConfiguredHarness = true;
92
+ break;
93
+ }
94
+ }
95
+ if (runningConfiguredHarness) {
96
+ console.log('');
97
+ log.warn(pc.yellow(pc.bold('Active agent process(es) detected, but the sync daemon ("intutic connect") is NOT running.')));
98
+ log.dim(' Configuration changes or SOP rules will not be synced to these agents until you start the daemon.');
99
+ log.dim(' Run `intutic connect` to start the sync daemon.');
100
+ }
101
+ }
102
+ }
103
+ else {
104
+ log.warn('Not initialized. Run `intutic init` first.');
105
+ }
106
+ }
107
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * syncContext.ts — CLI command to sync Git context (branch, commit) to daemon.
3
+ *
4
+ * Saves current Git status details locally to `.intutic/git-context.json`
5
+ * which is picked up by the sync daemon and reported to the control plane.
6
+ *
7
+ * LLD #14 — gitHooks.ts & syncContext.ts
8
+ * HLD §3.14 — Real-Time State Mirroring (Git hooks context integration)
9
+ *
10
+ * @module
11
+ */
12
+ export interface SyncContextOpts {
13
+ git?: boolean;
14
+ branch?: string;
15
+ commit?: string;
16
+ }
17
+ export declare function runSyncContext(opts: SyncContextOpts): Promise<void>;
18
+ //# sourceMappingURL=syncContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncContext.d.ts","sourceRoot":"","sources":["../../src/commands/syncContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBzE"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * syncContext.ts — CLI command to sync Git context (branch, commit) to daemon.
3
+ *
4
+ * Saves current Git status details locally to `.intutic/git-context.json`
5
+ * which is picked up by the sync daemon and reported to the control plane.
6
+ *
7
+ * LLD #14 — gitHooks.ts & syncContext.ts
8
+ * HLD §3.14 — Real-Time State Mirroring (Git hooks context integration)
9
+ *
10
+ * @module
11
+ */
12
+ import * as node_fs from 'node:fs/promises';
13
+ import * as node_path from 'node:path';
14
+ import { log } from '../lib/logger.js';
15
+ import { newIso } from '@intutic/id';
16
+ export async function runSyncContext(opts) {
17
+ const workspaceRoot = process.cwd();
18
+ const intuticDir = node_path.join(workspaceRoot, '.intutic');
19
+ try {
20
+ await node_fs.mkdir(intuticDir, { recursive: true });
21
+ const contextPath = node_path.join(intuticDir, 'git-context.json');
22
+ const contextData = {
23
+ git: {
24
+ branch: opts.branch || '',
25
+ commit: opts.commit || '',
26
+ },
27
+ updatedAt: newIso(),
28
+ };
29
+ await node_fs.writeFile(contextPath, JSON.stringify(contextData, null, 2) + '\n', 'utf-8');
30
+ log.dim(`Saved Git context to .intutic/git-context.json: branch=${opts.branch}, commit=${opts.commit}`);
31
+ }
32
+ catch (err) {
33
+ log.error(`Failed to write Git context: ${err instanceof Error ? err.message : String(err)}`);
34
+ process.exit(1);
35
+ }
36
+ }
37
+ //# sourceMappingURL=syncContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncContext.js","sourceRoot":"","sources":["../../src/commands/syncContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAQpC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAqB;IACxD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACnC,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA;IAE5D,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACpD,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAA;QAElE,MAAM,WAAW,GAAG;YAClB,GAAG,EAAE;gBACH,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;gBACzB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;aAC1B;YACD,SAAS,EAAE,MAAM,EAAE;SACpB,CAAA;QAED,MAAM,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA;QAC1F,GAAG,CAAC,GAAG,CAAC,0DAA0D,IAAI,CAAC,MAAM,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;IACzG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * `intutic traces` — List and inspect execution traces.
3
+ *
4
+ * Subcommands:
5
+ * - `intutic traces list [--limit N] [--since 24h] [--action TYPE] [--model NAME] [--json]`
6
+ * - `intutic traces inspect <trace_id>`
7
+ *
8
+ * LLD #9 — PLG Self-Serve (Appendix: CLI Traces Commands)
9
+ * TD-059
10
+ *
11
+ * @module
12
+ */
13
+ interface TraceListCliOpts {
14
+ limit?: string;
15
+ since?: string;
16
+ action?: string;
17
+ model?: string;
18
+ json?: boolean;
19
+ dev?: boolean;
20
+ }
21
+ /**
22
+ * `intutic traces list` — List execution traces for the authenticated workspace.
23
+ */
24
+ export declare function runTracesList(opts: TraceListCliOpts): Promise<void>;
25
+ /**
26
+ * `intutic traces inspect <trace_id>` — Show full detail of a single trace.
27
+ */
28
+ export declare function runTracesInspect(traceId: string, opts: {
29
+ dev?: boolean;
30
+ }): Promise<void>;
31
+ export {};
32
+ //# sourceMappingURL=traces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traces.d.ts","sourceRoot":"","sources":["../../src/commands/traces.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,UAAU,gBAAgB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AA2HD;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgEzE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GACtB,OAAO,CAAC,IAAI,CAAC,CAmCf"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * `intutic traces` — List and inspect execution traces.
3
+ *
4
+ * Subcommands:
5
+ * - `intutic traces list [--limit N] [--since 24h] [--action TYPE] [--model NAME] [--json]`
6
+ * - `intutic traces inspect <trace_id>`
7
+ *
8
+ * LLD #9 — PLG Self-Serve (Appendix: CLI Traces Commands)
9
+ * TD-059
10
+ *
11
+ * @module
12
+ */
13
+ import { log } from '../lib/logger.js';
14
+ import { loadCredentials } from '../config/store.js';
15
+ import { resolveControlPlaneUrl } from '../config/paths.js';
16
+ import { createApiClient } from '../lib/api.js';
17
+ import pc from 'picocolors';
18
+ // ─── Duration Parser ────────────────────────────────────────────────
19
+ /**
20
+ * Parses a human-friendly duration string (e.g. "24h", "7d", "30m")
21
+ * into an ISO timestamp for the `since` query parameter.
22
+ */
23
+ function parseSince(since) {
24
+ const match = since.match(/^(\d+)(m|h|d)$/i);
25
+ if (!match) {
26
+ // Treat as raw ISO timestamp if not a duration
27
+ return since;
28
+ }
29
+ const value = parseInt(match[1], 10);
30
+ const unit = match[2].toLowerCase();
31
+ const now = Date.now();
32
+ let ms;
33
+ switch (unit) {
34
+ case 'm':
35
+ ms = value * 60 * 1000;
36
+ break;
37
+ case 'h':
38
+ ms = value * 60 * 60 * 1000;
39
+ break;
40
+ case 'd':
41
+ ms = value * 24 * 60 * 60 * 1000;
42
+ break;
43
+ default:
44
+ ms = 24 * 60 * 60 * 1000;
45
+ }
46
+ return new Date(now - ms).toISOString();
47
+ }
48
+ // ─── Formatting Helpers ─────────────────────────────────────────────
49
+ /** Truncate a trace ID for table display (e.g. "tr_abc123..." → 14 chars). */
50
+ function truncateId(id) {
51
+ if (id.length <= 14)
52
+ return id;
53
+ return id.slice(0, 11) + '...';
54
+ }
55
+ /** Format ISO timestamp for compact table display. */
56
+ function formatTimestamp(iso) {
57
+ const d = new Date(iso);
58
+ const pad = (n) => String(n).padStart(2, '0');
59
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
60
+ }
61
+ /** Color enforcement action based on severity. */
62
+ function colorAction(action) {
63
+ switch (action) {
64
+ case 'BYPASS':
65
+ return pc.green(action);
66
+ case 'ENHANCE':
67
+ return pc.cyan(action);
68
+ case 'HIJACK':
69
+ return pc.yellow(action);
70
+ case 'KILL':
71
+ return pc.red(action);
72
+ default:
73
+ return action;
74
+ }
75
+ }
76
+ /** Color compliance score (green ≥0.8, yellow ≥0.5, red <0.5). */
77
+ function colorScore(score) {
78
+ const s = score.toFixed(2);
79
+ if (score >= 0.8)
80
+ return pc.green(s);
81
+ if (score >= 0.5)
82
+ return pc.yellow(s);
83
+ return pc.red(s);
84
+ }
85
+ /** Format cost as USD with dollar sign. */
86
+ function formatCost(usd) {
87
+ return `$${usd.toFixed(4)}`;
88
+ }
89
+ /** Pad a string to a fixed width (right-pad with spaces). */
90
+ function pad(str, width) {
91
+ if (str.length >= width)
92
+ return str.slice(0, width);
93
+ return str + ' '.repeat(width - str.length);
94
+ }
95
+ /** Render a simple table with borders. */
96
+ function renderTable(headers, widths, rows) {
97
+ const top = '┌' + widths.map((w) => '─'.repeat(w + 2)).join('┬') + '┐';
98
+ const mid = '├' + widths.map((w) => '─'.repeat(w + 2)).join('┼') + '┤';
99
+ const bot = '└' + widths.map((w) => '─'.repeat(w + 2)).join('┴') + '┘';
100
+ const fmtRow = (cells) => '│ ' + cells.map((c, i) => pad(c, widths[i])).join(' │ ') + ' │';
101
+ console.log(top);
102
+ console.log(fmtRow(headers));
103
+ console.log(mid);
104
+ for (const row of rows) {
105
+ console.log(fmtRow(row));
106
+ }
107
+ console.log(bot);
108
+ }
109
+ // ─── Friendly duration label (for footer) ───────────────────────────
110
+ function friendlyDuration(since) {
111
+ const match = since.match(/^(\d+)(m|h|d)$/i);
112
+ if (!match)
113
+ return since;
114
+ const val = match[1];
115
+ const unit = match[2].toLowerCase();
116
+ const labels = { m: 'minute', h: 'hour', d: 'day' };
117
+ const label = labels[unit] ?? unit;
118
+ return `${val} ${label}${Number(val) !== 1 ? 's' : ''}`;
119
+ }
120
+ // ─── Commands ───────────────────────────────────────────────────────
121
+ /**
122
+ * `intutic traces list` — List execution traces for the authenticated workspace.
123
+ */
124
+ export async function runTracesList(opts) {
125
+ const creds = await loadCredentials();
126
+ if (!creds) {
127
+ log.error('Not authenticated. Run `intutic login` first.');
128
+ process.exit(1);
129
+ }
130
+ const controlPlaneUrl = resolveControlPlaneUrl(opts.dev);
131
+ const client = createApiClient(controlPlaneUrl, creds.apiKey);
132
+ // Build query params
133
+ const params = new URLSearchParams();
134
+ if (opts.limit)
135
+ params.set('limit', opts.limit);
136
+ if (opts.since)
137
+ params.set('since', parseSince(opts.since));
138
+ if (opts.action)
139
+ params.set('enforcement', opts.action);
140
+ if (opts.model)
141
+ params.set('model', opts.model);
142
+ try {
143
+ const data = await client.get(`/api/v1/traces?${params.toString()}`);
144
+ // ── JSON output mode ──
145
+ if (opts.json) {
146
+ console.log(JSON.stringify(data, null, 2));
147
+ return;
148
+ }
149
+ // ── Table output mode ──
150
+ log.header('Intutic — Execution Traces');
151
+ if (data.traces.length === 0) {
152
+ log.dim(' No traces found matching your filters.');
153
+ return;
154
+ }
155
+ const headers = ['Trace ID', 'Timestamp', 'Model', 'Action', 'Score', 'Cost'];
156
+ const widths = [14, 19, 16, 8, 5, 9];
157
+ const rows = data.traces.map((t) => [
158
+ truncateId(t.traceId),
159
+ formatTimestamp(t.timestamp),
160
+ t.requestedModel.length > 16
161
+ ? t.requestedModel.slice(0, 15) + '…'
162
+ : t.requestedModel,
163
+ colorAction(t.enforcementAction),
164
+ colorScore(t.complianceScore),
165
+ formatCost(t.actualCostUsd),
166
+ ]);
167
+ renderTable(headers, widths, rows);
168
+ const sinceLabel = opts.since ?? '24h';
169
+ console.log(pc.dim(`Showing ${data.traces.length} of ${data.total} traces (last ${friendlyDuration(sinceLabel)})`));
170
+ }
171
+ catch (err) {
172
+ log.error(`Failed to list traces: ${err instanceof Error ? err.message : String(err)}`);
173
+ process.exit(1);
174
+ }
175
+ }
176
+ /**
177
+ * `intutic traces inspect <trace_id>` — Show full detail of a single trace.
178
+ */
179
+ export async function runTracesInspect(traceId, opts) {
180
+ const creds = await loadCredentials();
181
+ if (!creds) {
182
+ log.error('Not authenticated. Run `intutic login` first.');
183
+ process.exit(1);
184
+ }
185
+ const controlPlaneUrl = resolveControlPlaneUrl(opts.dev);
186
+ const client = createApiClient(controlPlaneUrl, creds.apiKey);
187
+ try {
188
+ const data = await client.get(`/api/v1/traces/${encodeURIComponent(traceId)}`);
189
+ log.header(`Intutic — Trace Detail`);
190
+ log.field('Trace ID', String(data.traceId));
191
+ console.log('');
192
+ // Syntax-highlighted JSON output
193
+ const json = JSON.stringify(data, null, 2);
194
+ const highlighted = json
195
+ .replace(/"([^"]+)":/g, (_, key) => `${pc.cyan(`"${key}"`)}:`)
196
+ .replace(/: "([^"]+)"/g, (_, val) => `: ${pc.green(`"${val}"`)}`)
197
+ .replace(/: (\d+\.?\d*)/g, (_, num) => `: ${pc.yellow(num)}`)
198
+ .replace(/: (true|false)/g, (_, b) => `: ${pc.magenta(b)}`)
199
+ .replace(/: (null)/g, (_, n) => `: ${pc.dim(n)}`);
200
+ console.log(highlighted);
201
+ }
202
+ catch (err) {
203
+ log.error(`Failed to inspect trace: ${err instanceof Error ? err.message : String(err)}`);
204
+ process.exit(1);
205
+ }
206
+ }
207
+ //# sourceMappingURL=traces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traces.js","sourceRoot":"","sources":["../../src/commands/traces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `intutic whoami` — Show current authenticated identity.
3
+ *
4
+ * Calls GET /api/v1/auth/me to fetch fresh identity info.
5
+ *
6
+ * LLD #8 — Sync Daemon / CLI
7
+ * @module
8
+ */
9
+ export declare function runWhoami(opts: {
10
+ dev?: boolean;
11
+ }): Promise<void>;
12
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,wBAAsB,SAAS,CAAC,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBtE"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `intutic whoami` — Show current authenticated identity.
3
+ *
4
+ * Calls GET /api/v1/auth/me to fetch fresh identity info.
5
+ *
6
+ * LLD #8 — Sync Daemon / CLI
7
+ * @module
8
+ */
9
+ import { log } from '../lib/logger.js';
10
+ import { loadCredentials } from '../config/store.js';
11
+ import { resolveControlPlaneUrl } from '../config/paths.js';
12
+ import { createApiClient } from '../lib/api.js';
13
+ export async function runWhoami(opts) {
14
+ const creds = await loadCredentials();
15
+ if (!creds) {
16
+ log.error('Not authenticated. Run `intutic login` first.');
17
+ process.exit(1);
18
+ }
19
+ const controlPlaneUrl = resolveControlPlaneUrl(opts.dev);
20
+ const client = createApiClient(controlPlaneUrl, creds.apiKey);
21
+ try {
22
+ const me = await client.getMe();
23
+ log.header('Intutic — Identity');
24
+ log.field('Email', me.email);
25
+ log.field('Member ID', me.memberId);
26
+ log.field('Workspace', me.workspaceId);
27
+ log.field('Role', me.role);
28
+ }
29
+ catch (err) {
30
+ log.error(`Failed to fetch identity: ${err instanceof Error ? err.message : String(err)}`);
31
+ process.exit(1);
32
+ }
33
+ }
34
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAE/C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAuB;IACrD,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;IACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,GAAG,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAA;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,eAAe,GAAG,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,eAAe,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IAE7D,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QAC/B,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA;QAChC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,CAAA;QAC5B,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAA;QACnC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,CAAA;QACtC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * keychain.ts — Secure credential storage using native OS commands.
3
+ *
4
+ * Utilizes:
5
+ * - macOS: `security` command line tool
6
+ * - Linux: `secret-tool` (libsecret-tools package)
7
+ * - Windows: `cmdkey` (Credential Manager CLI) and PowerShell fallback
8
+ *
9
+ * Falls back to local credentials.json if OS keychain utility is unavailable.
10
+ *
11
+ * LLD #14 — keychain.ts
12
+ * HLD §3.14 — OS Keychain Storage
13
+ *
14
+ * @module
15
+ */
16
+ /**
17
+ * Stores token in OS Keychain. Returns true on success, false on failure/fallback.
18
+ */
19
+ export declare function storeToken(workspaceId: string, token: string): Promise<boolean>;
20
+ /**
21
+ * Retrieves token from OS Keychain. Returns null if absent/fallback.
22
+ */
23
+ export declare function retrieveToken(workspaceId: string): Promise<string | null>;
24
+ /**
25
+ * Deletes token from OS Keychain. Returns true on success.
26
+ */
27
+ export declare function deleteToken(workspaceId: string): Promise<boolean>;
28
+ //# sourceMappingURL=keychain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../../src/config/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH;;GAEG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiCrF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+B/E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BvE"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * keychain.ts — Secure credential storage using native OS commands.
3
+ *
4
+ * Utilizes:
5
+ * - macOS: `security` command line tool
6
+ * - Linux: `secret-tool` (libsecret-tools package)
7
+ * - Windows: `cmdkey` (Credential Manager CLI) and PowerShell fallback
8
+ *
9
+ * Falls back to local credentials.json if OS keychain utility is unavailable.
10
+ *
11
+ * LLD #14 — keychain.ts
12
+ * HLD §3.14 — OS Keychain Storage
13
+ *
14
+ * @module
15
+ */
16
+ import { execFileSync } from 'node:child_process';
17
+ import { log } from '../lib/logger.js';
18
+ const SERVICE_NAME = 'intutic';
19
+ const ACCOUNT_NAME = 'token';
20
+ /**
21
+ * Stores token in OS Keychain. Returns true on success, false on failure/fallback.
22
+ */
23
+ export async function storeToken(workspaceId, token) {
24
+ const target = `${SERVICE_NAME}:workspace:${workspaceId}`;
25
+ try {
26
+ if (process.platform === 'darwin') {
27
+ // macOS keychain
28
+ execFileSync('security', ['add-generic-password', '-a', ACCOUNT_NAME, '-s', target, '-w', token, '-U'], { stdio: 'ignore' });
29
+ return true;
30
+ }
31
+ else if (process.platform === 'linux') {
32
+ // Linux libsecret (secret-tool)
33
+ // Pass token via stdin to avoid exposing it in process tree
34
+ execFileSync('secret-tool', ['store', `--label=Intutic Workspace ${workspaceId}`, 'workspace', workspaceId, 'service', SERVICE_NAME], { input: token, stdio: 'pipe' });
35
+ return true;
36
+ }
37
+ else if (process.platform === 'win32') {
38
+ // Windows cmdkey (Credential Manager)
39
+ execFileSync('cmdkey', [`/generic:${target}`, `/user:${ACCOUNT_NAME}`, `/pass:${token}`], { stdio: 'ignore' });
40
+ return true;
41
+ }
42
+ }
43
+ catch (err) {
44
+ log.dim(`OS Keychain save failed (falling back to credentials.json): ${err instanceof Error ? err.message : String(err)}`);
45
+ }
46
+ return false;
47
+ }
48
+ /**
49
+ * Retrieves token from OS Keychain. Returns null if absent/fallback.
50
+ */
51
+ export async function retrieveToken(workspaceId) {
52
+ const target = `${SERVICE_NAME}:workspace:${workspaceId}`;
53
+ try {
54
+ if (process.platform === 'darwin') {
55
+ const output = execFileSync('security', ['find-generic-password', '-a', ACCOUNT_NAME, '-s', target, '-w'], { encoding: 'utf-8', stdio: 'pipe' });
56
+ return output.trim();
57
+ }
58
+ else if (process.platform === 'linux') {
59
+ const output = execFileSync('secret-tool', ['lookup', 'workspace', workspaceId, 'service', SERVICE_NAME], { encoding: 'utf-8', stdio: 'pipe' });
60
+ return output.trim();
61
+ }
62
+ else if (process.platform === 'win32') {
63
+ // Windows Credential Manager lookup via PowerShell
64
+ const psCommand = `[void][Windows.Security.Credentials.PasswordVault,Windows.Security.Credentials,ContentType=WindowsRuntime]; $v = New-Object Windows.Security.Credentials.PasswordVault; try { $c = $v.Retrieve("${target.replace(/"/g, '')}", "${ACCOUNT_NAME}"); $c.RetrievePassword(); $c.Password } catch { exit 1 }`;
65
+ const output = execFileSync('powershell', ['-Command', psCommand], { encoding: 'utf-8', stdio: 'pipe' });
66
+ return output.trim();
67
+ }
68
+ }
69
+ catch {
70
+ // Normal case: key doesn't exist, or tool unavailable. Fallback handles it.
71
+ }
72
+ return null;
73
+ }
74
+ /**
75
+ * Deletes token from OS Keychain. Returns true on success.
76
+ */
77
+ export async function deleteToken(workspaceId) {
78
+ const target = `${SERVICE_NAME}:workspace:${workspaceId}`;
79
+ try {
80
+ if (process.platform === 'darwin') {
81
+ execFileSync('security', ['delete-generic-password', '-a', ACCOUNT_NAME, '-s', target], { stdio: 'ignore' });
82
+ return true;
83
+ }
84
+ else if (process.platform === 'linux') {
85
+ execFileSync('secret-tool', ['clear', 'workspace', workspaceId, 'service', SERVICE_NAME], { stdio: 'ignore' });
86
+ return true;
87
+ }
88
+ else if (process.platform === 'win32') {
89
+ execFileSync('cmdkey', [`/delete:${target}`], { stdio: 'ignore' });
90
+ return true;
91
+ }
92
+ }
93
+ catch {
94
+ // Key might not exist or tool unavailable
95
+ }
96
+ return false;
97
+ }
98
+ //# sourceMappingURL=keychain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/config/keychain.ts"],"names":[],"mappings":"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"}