profclaw 0.0.1-beta.2 → 2.0.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 (156) hide show
  1. package/CHANGELOG.md +21 -38
  2. package/CONTRIBUTING.md +3 -5
  3. package/README.md +128 -63
  4. package/dist/chat/execution/tools/index.d.ts +1 -1
  5. package/dist/chat/execution/tools/index.js +41 -2
  6. package/dist/chat/providers/slack/index.d.ts +2 -2
  7. package/dist/cli/commands/models.js +39 -26
  8. package/dist/cli/commands/onboard.js +64 -79
  9. package/dist/cli/commands/setup.js +293 -90
  10. package/dist/cli/index.js +0 -6
  11. package/dist/cli/providers.d.ts +15 -0
  12. package/dist/cli/providers.js +41 -0
  13. package/dist/core/deployment.js +2 -0
  14. package/dist/providers/ai-sdk.js +26 -6
  15. package/dist/routes/channels.d.ts +12 -0
  16. package/dist/routes/channels.js +166 -0
  17. package/dist/server/route-loader.js +1 -0
  18. package/dist/server.js +115 -109
  19. package/package.json +1 -1
  20. package/skills/git-workflow/SKILL.md +3 -3
  21. package/ui/dist/assets/{ActivityView-DIPQSJ_d.js → ActivityView-BeshZXmE.js} +1 -1
  22. package/ui/dist/assets/{AgentList-CqyaYrcq.js → AgentList-QVHeldPi.js} +1 -1
  23. package/ui/dist/assets/{AnalyticsDashboard-C-mjuGHT.js → AnalyticsDashboard-C9R97dXE.js} +1 -1
  24. package/ui/dist/assets/{AreaChart-CfYWmbtr.js → AreaChart-B73gaiVQ.js} +1 -1
  25. package/ui/dist/assets/{CartesianChart-BaQ3It0c.js → CartesianChart-CXYL2R-A.js} +1 -1
  26. package/ui/dist/assets/{ChatView-DxxQy6pl.js → ChatView-qjZErlrp.js} +1 -1
  27. package/ui/dist/assets/{CostsDashboard-CDBBcGkg.js → CostsDashboard-O4DCLy1i.js} +1 -1
  28. package/ui/dist/assets/{EstimateSelect-CDjf5qKl.js → EstimateSelect-1hQf4Osk.js} +1 -1
  29. package/ui/dist/assets/{FloatingChatbot-CZHjvJIe.js → FloatingChatbot-BZBzrJxd.js} +1 -1
  30. package/ui/dist/assets/{InviteCodeManagement-DTm-IPTm.js → InviteCodeManagement-LEoGqYeA.js} +1 -1
  31. package/ui/dist/assets/{ProjectDetail-DlYUcOss.js → ProjectDetail--gPfvATB.js} +1 -1
  32. package/ui/dist/assets/{ProjectIcon-BMRpnM04.js → ProjectIcon-Chd_ofsw.js} +1 -1
  33. package/ui/dist/assets/{ProjectList-D85TN0i0.js → ProjectList-BvUfVB6c.js} +1 -1
  34. package/ui/dist/assets/{Settings-CgPqzUvj.js → Settings-1kaf7VHE.js} +1 -1
  35. package/ui/dist/assets/{StatusIndicator-yig0uZEA.js → StatusIndicator-pRfkNcdV.js} +1 -1
  36. package/ui/dist/assets/{SummaryDetail-CwLAfHgJ.js → SummaryDetail-DV3AmONk.js} +1 -1
  37. package/ui/dist/assets/{SummaryList-BvS5Idnu.js → SummaryList-B6kXiTxL.js} +1 -1
  38. package/ui/dist/assets/{TaskDetail-zarC1fOt.js → TaskDetail-CV6CzbOS.js} +1 -1
  39. package/ui/dist/assets/{TaskList-CyJq3ANE.js → TaskList-DL7brQKd.js} +1 -1
  40. package/ui/dist/assets/{TicketBoard-BlWr3-iH.js → TicketBoard-CrkkFj7C.js} +1 -1
  41. package/ui/dist/assets/{TicketDetail-DmqWKj2W.js → TicketDetail-hnnYclpD.js} +1 -1
  42. package/ui/dist/assets/{TicketList-Scj4pMWa.js → TicketList-CsDAyQCL.js} +1 -1
  43. package/ui/dist/assets/{UserManagement-BH7uG7dw.js → UserManagement-BGFQyTSr.js} +1 -1
  44. package/ui/dist/assets/{ViewSwitcher-3HzZUdWn.js → ViewSwitcher-CnL0OqA8.js} +1 -1
  45. package/ui/dist/assets/{alert-dialog-DWPb2IfQ.js → alert-dialog-SKM6Gjz4.js} +1 -1
  46. package/ui/dist/assets/{archive-CGck7gxR.js → archive-BsLa7brF.js} +1 -1
  47. package/ui/dist/assets/{badge-DEmc3Z_l.js → badge-CVHH1a-v.js} +1 -1
  48. package/ui/dist/assets/{brain-CfFdLVqb.js → brain-6o_RHVpe.js} +1 -1
  49. package/ui/dist/assets/{bug-DqSGPUUE.js → bug-CmZI7jqM.js} +1 -1
  50. package/ui/dist/assets/{calendar-BuZ4zbPW.js → calendar-Bf0t2B82.js} +1 -1
  51. package/ui/dist/assets/{chevron-up-DcJ4LL_N.js → chevron-up-CoUsOvZj.js} +1 -1
  52. package/ui/dist/assets/{circle-x-C78PNZjF.js → circle-x-Dgw11LgT.js} +1 -1
  53. package/ui/dist/assets/{constants-DhDjZe4P.js → constants-Q5Zivl-a.js} +1 -1
  54. package/ui/dist/assets/{cpu-Ck6AoG8c.js → cpu-DiPMQICV.js} +1 -1
  55. package/ui/dist/assets/{database-CA2w8Lvt.js → database-BwTfupDi.js} +1 -1
  56. package/ui/dist/assets/{dialog-BOdGWhgE.js → dialog-BUqN9Psj.js} +1 -1
  57. package/ui/dist/assets/{ellipsis-FhHKRbfl.js → ellipsis-UJx4Xnf6.js} +1 -1
  58. package/ui/dist/assets/{ellipsis-vertical-CO0UqE4-.js → ellipsis-vertical-DoULYEKn.js} +1 -1
  59. package/ui/dist/assets/{file-code-ChnhYYj1.js → file-code-B2UrJLwi.js} +1 -1
  60. package/ui/dist/assets/{folder-open-CHwA1-ve.js → folder-open-BJi577JH.js} +1 -1
  61. package/ui/dist/assets/{funnel-ByEjRFNB.js → funnel-PkaD_HSR.js} +1 -1
  62. package/ui/dist/assets/{git-branch-GTOPQgU4.js → git-branch-C_K30am0.js} +1 -1
  63. package/ui/dist/assets/{git-commit-horizontal-F5M84Kut.js → git-commit-horizontal-IT6ecxWQ.js} +1 -1
  64. package/ui/dist/assets/{globe-CQWfr7hT.js → globe-f-jjCa_g.js} +1 -1
  65. package/ui/dist/assets/{hash-nKC9gtLg.js → hash-DNEv8Elo.js} +1 -1
  66. package/ui/dist/assets/{history-DfFSA9xJ.js → history-BQSBo_1Q.js} +1 -1
  67. package/ui/dist/assets/{index-DHGvP9mp.js → index-BUmnwPQr.js} +1 -1
  68. package/ui/dist/assets/{index-Z4-RtZcs.js → index-BfF5G4Cw.js} +1 -1
  69. package/ui/dist/assets/{index-DeI8lKRR.js → index-C8N375c2.js} +1 -1
  70. package/ui/dist/assets/index-CuxnqVVz.css +1 -0
  71. package/ui/dist/assets/{index-Ca3vk7Gq.js → index-CzMM3QOk.js} +1 -1
  72. package/ui/dist/assets/{index--JkIxVXb.js → index-lJlNPFVJ.js} +3 -3
  73. package/ui/dist/assets/{index-a4Fxq0Hb.js → index-nS3EErDg.js} +1 -1
  74. package/ui/dist/assets/{layers-DFeLExSa.js → layers-jFqVrWMD.js} +1 -1
  75. package/ui/dist/assets/{layout-dashboard-WmgjMhWF.js → layout-dashboard-CcKt1hXw.js} +1 -1
  76. package/ui/dist/assets/{lightbulb-Bo8hEr7B.js → lightbulb-Jhp7FvbU.js} +1 -1
  77. package/ui/dist/assets/{link-2-YqrpQXBH.js → link-2-DdO7ostF.js} +1 -1
  78. package/ui/dist/assets/{markdown-renderer-Croje6Xe.js → markdown-renderer-n1ToC4XQ.js} +1 -1
  79. package/ui/dist/assets/{message-square-CD0H5hot.js → message-square-CBgH65X7.js} +1 -1
  80. package/ui/dist/assets/{pencil-DpFnj5dn.js → pencil-CYXCEPQh.js} +1 -1
  81. package/ui/dist/assets/{play-DVgea_jT.js → play-d1ONaH0-.js} +1 -1
  82. package/ui/dist/assets/{popover-JXecfWG5.js → popover-CrmZgoWu.js} +1 -1
  83. package/ui/dist/assets/{progress-C1ghf1Fu.js → progress-uv4SPkL5.js} +1 -1
  84. package/ui/dist/assets/{rocket-BFxPYGx9.js → rocket-DhvUetsk.js} +1 -1
  85. package/ui/dist/assets/{select-MADP8m6Q.js → select-CeQ8AHGy.js} +1 -1
  86. package/ui/dist/assets/{send-eYnW_7n-.js → send-P0r5D7td.js} +1 -1
  87. package/ui/dist/assets/{server-CPMaysH8.js → server-CVHTZB72.js} +1 -1
  88. package/ui/dist/assets/{settings-2-scXUOuE_.js → settings-2-ocj5uHGx.js} +1 -1
  89. package/ui/dist/assets/{sheet-r6NSOxi-.js → sheet-DuQExSho.js} +1 -1
  90. package/ui/dist/assets/{shield-check-PEr7nmVw.js → shield-check-DfVdE34l.js} +1 -1
  91. package/ui/dist/assets/{shield-off-CLtXio62.js → shield-off-8l0J6R-8.js} +1 -1
  92. package/ui/dist/assets/{skeleton-C9oEzNlU.js → skeleton-TFiFJ3nB.js} +1 -1
  93. package/ui/dist/assets/{smartphone-DusFfY0U.js → smartphone-77_g3SQn.js} +1 -1
  94. package/ui/dist/assets/{square-e1yxB2eR.js → square-Ckzsr3Rn.js} +1 -1
  95. package/ui/dist/assets/{switch-tNs0n-kz.js → switch-CAePkd6k.js} +1 -1
  96. package/ui/dist/assets/{table-CXxtLicg.js → table-ZjAZ7hkt.js} +1 -1
  97. package/ui/dist/assets/{tag-tAwMmQ9G.js → tag-C35mgoEv.js} +1 -1
  98. package/ui/dist/assets/{textarea-BjiEeIWh.js → textarea-DsVPnSgR.js} +1 -1
  99. package/ui/dist/assets/{timer-Vel1N3RP.js → timer-DHJBS2w1.js} +1 -1
  100. package/ui/dist/assets/{tooltip-ZMwtfr1J.js → tooltip-BYmQ331W.js} +1 -1
  101. package/ui/dist/assets/{trash-2-eM-CNwsZ.js → trash-2-keO5tKPE.js} +1 -1
  102. package/ui/dist/assets/{trending-up-BGafmjRo.js → trending-up-BBv8KbrY.js} +1 -1
  103. package/ui/dist/assets/{wand-sparkles-DPvcd9Pi.js → wand-sparkles-BusQ52ZK.js} +1 -1
  104. package/ui/dist/assets/{wrench-B8s3zYVV.js → wrench-02YaOSiK.js} +1 -1
  105. package/ui/dist/index.html +2 -2
  106. package/dist/chat/auto-reply.d.ts +0 -90
  107. package/dist/chat/auto-reply.js +0 -272
  108. package/dist/chat/execution/pty.d.ts +0 -92
  109. package/dist/chat/execution/pty.js +0 -285
  110. package/dist/chat/execution/tools/glinr-ops.d.ts +0 -202
  111. package/dist/chat/execution/tools/glinr-ops.js +0 -694
  112. package/dist/cli/commands/browser.d.ts +0 -3
  113. package/dist/cli/commands/browser.js +0 -138
  114. package/dist/cli/commands/canvas.d.ts +0 -3
  115. package/dist/cli/commands/canvas.js +0 -155
  116. package/dist/cli/commands/nodes.d.ts +0 -3
  117. package/dist/cli/commands/nodes.js +0 -193
  118. package/dist/diagnostics/exporters.d.ts +0 -21
  119. package/dist/diagnostics/exporters.js +0 -138
  120. package/dist/diagnostics/index.d.ts +0 -10
  121. package/dist/diagnostics/index.js +0 -9
  122. package/dist/diagnostics/middleware.d.ts +0 -12
  123. package/dist/diagnostics/middleware.js +0 -58
  124. package/dist/diagnostics/tracer.d.ts +0 -133
  125. package/dist/diagnostics/tracer.js +0 -257
  126. package/dist/discovery/index.d.ts +0 -8
  127. package/dist/discovery/index.js +0 -7
  128. package/dist/discovery/mdns.d.ts +0 -40
  129. package/dist/discovery/mdns.js +0 -249
  130. package/dist/plugins/registry.d.ts +0 -122
  131. package/dist/plugins/registry.js +0 -352
  132. package/dist/plugins/sandbox.d.ts +0 -77
  133. package/dist/plugins/sandbox.js +0 -287
  134. package/dist/plugins/search/brave.d.ts +0 -9
  135. package/dist/plugins/search/brave.js +0 -157
  136. package/dist/plugins/search/duckduckgo.d.ts +0 -9
  137. package/dist/plugins/search/duckduckgo.js +0 -171
  138. package/dist/plugins/search/index.d.ts +0 -13
  139. package/dist/plugins/search/index.js +0 -23
  140. package/dist/plugins/search/searxng.d.ts +0 -9
  141. package/dist/plugins/search/searxng.js +0 -170
  142. package/dist/plugins/search/serper.d.ts +0 -9
  143. package/dist/plugins/search/serper.js +0 -135
  144. package/dist/plugins/search/tavily.d.ts +0 -9
  145. package/dist/plugins/search/tavily.js +0 -146
  146. package/dist/providers/adapters/anthropic.d.ts +0 -26
  147. package/dist/providers/adapters/anthropic.js +0 -306
  148. package/dist/providers/adapters/base.d.ts +0 -53
  149. package/dist/providers/adapters/base.js +0 -99
  150. package/dist/providers/adapters/ollama.d.ts +0 -30
  151. package/dist/providers/adapters/ollama.js +0 -292
  152. package/dist/utils/ai-cache.d.ts +0 -72
  153. package/dist/utils/ai-cache.js +0 -204
  154. package/dist/utils/file-lock.d.ts +0 -85
  155. package/dist/utils/file-lock.js +0 -204
  156. package/ui/dist/assets/index-WclMPci1.css +0 -1
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function browserCommands(): Command;
3
- //# sourceMappingURL=browser.d.ts.map
@@ -1,138 +0,0 @@
1
- import { Command } from 'commander';
2
- import chalk from 'chalk';
3
- import { api } from '../utils/api.js';
4
- import { spinner, success, error, info, createTable, truncate } from '../utils/output.js';
5
- export function browserCommands() {
6
- const cmd = new Command('browser')
7
- .description('Control CDP browser sessions');
8
- cmd
9
- .command('open <url>')
10
- .description('Open a URL in the browser')
11
- .option('--json', 'Output as JSON')
12
- .action(async (url, options) => {
13
- const spin = spinner(`Opening ${url}...`).start();
14
- try {
15
- const result = await api.post('/api/browser/open', { url });
16
- spin.stop();
17
- if (!result.ok) {
18
- error(result.error || 'Failed to open URL');
19
- process.exit(1);
20
- }
21
- if (options.json) {
22
- console.log(JSON.stringify(result.data, null, 2));
23
- return;
24
- }
25
- const data = result.data;
26
- success(`Opened ${chalk.cyan(data.url)}`);
27
- console.log(chalk.dim(` Page ID: ${data.pageId}`));
28
- }
29
- catch (err) {
30
- spin.stop();
31
- error(err instanceof Error ? err.message : 'Unknown error');
32
- process.exit(1);
33
- }
34
- });
35
- cmd
36
- .command('screenshot [url]')
37
- .description('Take a screenshot of the current page or a URL')
38
- .option('--output <path>', 'Save screenshot to file path')
39
- .option('--json', 'Output as JSON')
40
- .action(async (url, options) => {
41
- const spin = spinner('Taking screenshot...').start();
42
- try {
43
- const body = {};
44
- if (url)
45
- body['url'] = url;
46
- if (options.output)
47
- body['outputPath'] = options.output;
48
- const result = await api.post('/api/browser/screenshot', body);
49
- spin.stop();
50
- if (!result.ok) {
51
- error(result.error || 'Failed to take screenshot');
52
- process.exit(1);
53
- }
54
- if (options.json) {
55
- console.log(JSON.stringify(result.data, null, 2));
56
- return;
57
- }
58
- const data = result.data;
59
- success('Screenshot taken');
60
- if (data.path)
61
- console.log(chalk.dim(` Saved to: ${data.path}`));
62
- if (data.url)
63
- console.log(chalk.dim(` Page: ${data.url}`));
64
- }
65
- catch (err) {
66
- spin.stop();
67
- error(err instanceof Error ? err.message : 'Unknown error');
68
- process.exit(1);
69
- }
70
- });
71
- cmd
72
- .command('close [pageId]')
73
- .description('Close browser page or all pages')
74
- .option('--json', 'Output as JSON')
75
- .action(async (pageId, options) => {
76
- const spin = spinner('Closing browser...').start();
77
- try {
78
- const path = pageId ? `/api/browser/pages/${pageId}` : '/api/browser/close';
79
- const result = await api.post(path);
80
- spin.stop();
81
- if (!result.ok) {
82
- error(result.error || 'Failed to close browser');
83
- process.exit(1);
84
- }
85
- if (options.json) {
86
- console.log(JSON.stringify(result.data, null, 2));
87
- return;
88
- }
89
- success(pageId ? `Page ${pageId} closed` : 'Browser closed');
90
- }
91
- catch (err) {
92
- spin.stop();
93
- error(err instanceof Error ? err.message : 'Unknown error');
94
- process.exit(1);
95
- }
96
- });
97
- cmd
98
- .command('pages')
99
- .description('List open browser pages')
100
- .option('--json', 'Output as JSON')
101
- .action(async (options) => {
102
- const spin = spinner('Fetching pages...').start();
103
- try {
104
- const result = await api.get('/api/browser/pages');
105
- spin.stop();
106
- if (!result.ok) {
107
- error(result.error || 'Failed to fetch pages');
108
- process.exit(1);
109
- }
110
- const { pages } = result.data;
111
- if (options.json) {
112
- console.log(JSON.stringify(pages, null, 2));
113
- return;
114
- }
115
- if (pages.length === 0) {
116
- info('No open browser pages.');
117
- return;
118
- }
119
- const table = createTable(['ID', 'Title', 'URL', 'Active']);
120
- for (const p of pages) {
121
- table.push([
122
- chalk.dim(truncate(p.id, 12)),
123
- truncate(p.title || '-', 30),
124
- truncate(p.url, 40),
125
- p.active ? chalk.green('yes') : chalk.dim('no'),
126
- ]);
127
- }
128
- console.log(table.toString());
129
- }
130
- catch (err) {
131
- spin.stop();
132
- error(err instanceof Error ? err.message : 'Unknown error');
133
- process.exit(1);
134
- }
135
- });
136
- return cmd;
137
- }
138
- //# sourceMappingURL=browser.js.map
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function canvasCommands(): Command;
3
- //# sourceMappingURL=canvas.d.ts.map
@@ -1,155 +0,0 @@
1
- import { Command } from 'commander';
2
- import chalk from 'chalk';
3
- import { api } from '../utils/api.js';
4
- import { spinner, success, error, info, createTable, formatRelativeTime, truncate } from '../utils/output.js';
5
- const VALID_TYPES = ['code', 'chart', 'diagram', 'table', 'html', 'markdown', 'mermaid', 'svg'];
6
- export function canvasCommands() {
7
- const cmd = new Command('canvas')
8
- .description('Manage canvas documents');
9
- cmd
10
- .command('list')
11
- .alias('ls')
12
- .description('List canvas documents')
13
- .option('--json', 'Output as JSON')
14
- .action(async (options) => {
15
- const spin = spinner('Fetching canvases...').start();
16
- try {
17
- const result = await api.get('/api/canvas');
18
- spin.stop();
19
- if (!result.ok) {
20
- error(result.error || 'Failed to fetch canvases');
21
- process.exit(1);
22
- }
23
- const { canvases } = result.data;
24
- if (options.json) {
25
- console.log(JSON.stringify(canvases, null, 2));
26
- return;
27
- }
28
- if (canvases.length === 0) {
29
- info('No canvas documents found.');
30
- return;
31
- }
32
- const table = createTable(['ID', 'Type', 'Title', 'Updated']);
33
- for (const c of canvases) {
34
- table.push([
35
- chalk.dim(truncate(c.id, 12)),
36
- chalk.cyan(c.type),
37
- truncate(c.title || '-', 40),
38
- formatRelativeTime(c.updatedAt),
39
- ]);
40
- }
41
- console.log(table.toString());
42
- }
43
- catch (err) {
44
- spin.stop();
45
- error(err instanceof Error ? err.message : 'Unknown error');
46
- process.exit(1);
47
- }
48
- });
49
- cmd
50
- .command('show <id>')
51
- .description('Show canvas document content')
52
- .option('--json', 'Output as JSON')
53
- .action(async (id, options) => {
54
- const spin = spinner('Fetching canvas...').start();
55
- try {
56
- const result = await api.get(`/api/canvas/${id}`);
57
- spin.stop();
58
- if (!result.ok) {
59
- error(result.error || 'Failed to fetch canvas');
60
- process.exit(1);
61
- }
62
- const { canvas, content } = result.data;
63
- if (options.json) {
64
- console.log(JSON.stringify(result.data, null, 2));
65
- return;
66
- }
67
- console.log(`\n${chalk.bold(canvas.title || canvas.id)} ${chalk.dim(`[${canvas.type}]`)}`);
68
- console.log(chalk.dim('─'.repeat(50)));
69
- console.log(content);
70
- console.log();
71
- }
72
- catch (err) {
73
- spin.stop();
74
- error(err instanceof Error ? err.message : 'Unknown error');
75
- process.exit(1);
76
- }
77
- });
78
- cmd
79
- .command('render <type> <content>')
80
- .description(`Render content as a canvas type (${VALID_TYPES.join('|')})`)
81
- .option('--title <title>', 'Canvas title')
82
- .option('--json', 'Output as JSON')
83
- .action(async (type, content, options) => {
84
- if (!VALID_TYPES.includes(type)) {
85
- error(`Invalid type. Must be one of: ${VALID_TYPES.join(', ')}`);
86
- process.exit(1);
87
- }
88
- const spin = spinner(`Rendering ${type} canvas...`).start();
89
- try {
90
- const result = await api.post('/api/canvas/render', {
91
- type,
92
- content,
93
- title: options.title,
94
- });
95
- spin.stop();
96
- if (!result.ok) {
97
- error(result.error || 'Failed to render canvas');
98
- process.exit(1);
99
- }
100
- if (options.json) {
101
- console.log(JSON.stringify(result.data, null, 2));
102
- return;
103
- }
104
- const data = result.data;
105
- success(`Canvas rendered (${data.type})`);
106
- console.log(chalk.dim(` ID: ${data.id}`));
107
- }
108
- catch (err) {
109
- spin.stop();
110
- error(err instanceof Error ? err.message : 'Unknown error');
111
- process.exit(1);
112
- }
113
- });
114
- cmd
115
- .command('clear [id]')
116
- .description('Clear canvas document(s)')
117
- .option('--yes', 'Skip confirmation')
118
- .option('--json', 'Output as JSON')
119
- .action(async (id, options) => {
120
- if (!options.yes) {
121
- const { createInterface } = await import('readline');
122
- const rl = createInterface({ input: process.stdin, output: process.stdout });
123
- const label = id ? `canvas ${id}` : 'all canvases';
124
- const confirmed = await new Promise((resolve) => {
125
- rl.question(`Clear ${label}? (y/N) `, (ans) => { rl.close(); resolve(ans.toLowerCase() === 'y'); });
126
- });
127
- if (!confirmed) {
128
- info('Aborted.');
129
- return;
130
- }
131
- }
132
- const spin = spinner('Clearing canvas...').start();
133
- try {
134
- const path = id ? `/api/canvas/${id}` : '/api/canvas';
135
- const result = await api.delete(path);
136
- spin.stop();
137
- if (!result.ok) {
138
- error(result.error || 'Failed to clear canvas');
139
- process.exit(1);
140
- }
141
- if (options.json) {
142
- console.log(JSON.stringify({ ok: true }, null, 2));
143
- return;
144
- }
145
- success(id ? `Canvas ${id} cleared` : 'All canvases cleared');
146
- }
147
- catch (err) {
148
- spin.stop();
149
- error(err instanceof Error ? err.message : 'Unknown error');
150
- process.exit(1);
151
- }
152
- });
153
- return cmd;
154
- }
155
- //# sourceMappingURL=canvas.js.map
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function nodesCommands(): Command;
3
- //# sourceMappingURL=nodes.d.ts.map
@@ -1,193 +0,0 @@
1
- import { Command } from 'commander';
2
- import chalk from 'chalk';
3
- import { api } from '../utils/api.js';
4
- import { spinner, success, error, info, createTable, formatRelativeTime, truncate } from '../utils/output.js';
5
- export function nodesCommands() {
6
- const cmd = new Command('nodes')
7
- .description('Manage distributed profClaw nodes');
8
- cmd
9
- .command('list')
10
- .alias('ls')
11
- .description('List connected nodes')
12
- .option('--json', 'Output as JSON')
13
- .action(async (options) => {
14
- const spin = spinner('Fetching nodes...').start();
15
- try {
16
- const result = await api.get('/api/nodes');
17
- spin.stop();
18
- if (!result.ok) {
19
- error(result.error || 'Failed to fetch nodes');
20
- process.exit(1);
21
- }
22
- const { nodes } = result.data;
23
- if (options.json) {
24
- console.log(JSON.stringify(nodes, null, 2));
25
- return;
26
- }
27
- if (nodes.length === 0) {
28
- info('No nodes connected. Add one: profclaw nodes add <url>');
29
- return;
30
- }
31
- const table = createTable(['ID', 'Name', 'URL', 'Version', 'Latency', 'Last Seen']);
32
- for (const n of nodes) {
33
- const healthDot = n.healthy ? chalk.green('●') : chalk.red('●');
34
- table.push([
35
- chalk.dim(truncate(n.id, 12)),
36
- healthDot + ' ' + (n.name || chalk.dim('-')),
37
- truncate(n.url, 35),
38
- n.version || chalk.dim('-'),
39
- n.latencyMs != null ? `${n.latencyMs}ms` : chalk.dim('-'),
40
- formatRelativeTime(n.lastSeen),
41
- ]);
42
- }
43
- console.log(table.toString());
44
- console.log(chalk.dim(`\n${nodes.length} node${nodes.length !== 1 ? 's' : ''}`));
45
- }
46
- catch (err) {
47
- spin.stop();
48
- error(err instanceof Error ? err.message : 'Unknown error');
49
- process.exit(1);
50
- }
51
- });
52
- cmd
53
- .command('add <url>')
54
- .description('Add a remote node by URL')
55
- .option('--name <name>', 'Friendly name for the node')
56
- .option('--json', 'Output as JSON')
57
- .action(async (url, options) => {
58
- const spin = spinner(`Adding node at ${url}...`).start();
59
- try {
60
- const result = await api.post('/api/nodes', { url, name: options.name });
61
- spin.stop();
62
- if (!result.ok) {
63
- error(result.error || 'Failed to add node');
64
- process.exit(1);
65
- }
66
- if (options.json) {
67
- console.log(JSON.stringify(result.data, null, 2));
68
- return;
69
- }
70
- const node = result.data.node;
71
- success(`Node added: ${chalk.cyan(node.name || node.url)}`);
72
- console.log(chalk.dim(` ID: ${node.id}`));
73
- if (node.version)
74
- console.log(chalk.dim(` Version: ${node.version}`));
75
- }
76
- catch (err) {
77
- spin.stop();
78
- error(err instanceof Error ? err.message : 'Unknown error');
79
- process.exit(1);
80
- }
81
- });
82
- cmd
83
- .command('remove <id>')
84
- .description('Remove a node by ID')
85
- .option('--yes', 'Skip confirmation')
86
- .option('--json', 'Output as JSON')
87
- .action(async (id, options) => {
88
- if (!options.yes) {
89
- const { createInterface } = await import('readline');
90
- const rl = createInterface({ input: process.stdin, output: process.stdout });
91
- const confirmed = await new Promise((resolve) => {
92
- rl.question(`Remove node ${id}? (y/N) `, (ans) => { rl.close(); resolve(ans.toLowerCase() === 'y'); });
93
- });
94
- if (!confirmed) {
95
- info('Aborted.');
96
- return;
97
- }
98
- }
99
- const spin = spinner('Removing node...').start();
100
- try {
101
- const result = await api.delete(`/api/nodes/${id}`);
102
- spin.stop();
103
- if (!result.ok) {
104
- error(result.error || 'Failed to remove node');
105
- process.exit(1);
106
- }
107
- if (options.json) {
108
- console.log(JSON.stringify({ ok: true, id }, null, 2));
109
- return;
110
- }
111
- success(`Node ${id} removed`);
112
- }
113
- catch (err) {
114
- spin.stop();
115
- error(err instanceof Error ? err.message : 'Unknown error');
116
- process.exit(1);
117
- }
118
- });
119
- cmd
120
- .command('sync')
121
- .description('Sync configuration across all nodes')
122
- .option('--json', 'Output as JSON')
123
- .action(async (options) => {
124
- const spin = spinner('Syncing nodes...').start();
125
- try {
126
- const result = await api.post('/api/nodes/sync');
127
- spin.stop();
128
- if (!result.ok) {
129
- error(result.error || 'Sync failed');
130
- process.exit(1);
131
- }
132
- if (options.json) {
133
- console.log(JSON.stringify(result.data, null, 2));
134
- return;
135
- }
136
- const { synced, failed } = result.data;
137
- success(`Synced ${synced} node${synced !== 1 ? 's' : ''}`);
138
- if (failed > 0)
139
- error(`Failed to sync ${failed} node${failed !== 1 ? 's' : ''}`);
140
- }
141
- catch (err) {
142
- spin.stop();
143
- error(err instanceof Error ? err.message : 'Unknown error');
144
- process.exit(1);
145
- }
146
- });
147
- cmd
148
- .command('status [id]')
149
- .description('Show status for all nodes or a specific node')
150
- .option('--json', 'Output as JSON')
151
- .action(async (id, options) => {
152
- const spin = spinner('Checking node status...').start();
153
- try {
154
- const path = id ? `/api/nodes/${id}/status` : '/api/nodes/status';
155
- const result = await api.get(path);
156
- spin.stop();
157
- if (!result.ok) {
158
- error(result.error || 'Failed to check status');
159
- process.exit(1);
160
- }
161
- if (options.json) {
162
- console.log(JSON.stringify(result.data, null, 2));
163
- return;
164
- }
165
- if (id) {
166
- const n = result.data;
167
- console.log(`\n${chalk.bold('Node Status')}`);
168
- console.log(` ${chalk.dim('ID:')} ${n.id}`);
169
- console.log(` ${chalk.dim('URL:')} ${n.url}`);
170
- console.log(` ${chalk.dim('Healthy:')} ${n.healthy ? chalk.green('yes') : chalk.red('no')}`);
171
- console.log(` ${chalk.dim('Latency:')} ${n.latencyMs != null ? `${n.latencyMs}ms` : '-'}`);
172
- console.log(` ${chalk.dim('Version:')} ${n.version || '-'}`);
173
- console.log();
174
- }
175
- else {
176
- const { nodes } = result.data;
177
- const healthy = nodes.filter((n) => n.healthy).length;
178
- console.log(`\n${chalk.bold('Node Status')}`);
179
- console.log(` Total: ${nodes.length}`);
180
- console.log(` Healthy: ${chalk.green(healthy)}`);
181
- console.log(` Unhealthy: ${nodes.length - healthy > 0 ? chalk.red(nodes.length - healthy) : chalk.dim('0')}`);
182
- console.log();
183
- }
184
- }
185
- catch (err) {
186
- spin.stop();
187
- error(err instanceof Error ? err.message : 'Unknown error');
188
- process.exit(1);
189
- }
190
- });
191
- return cmd;
192
- }
193
- //# sourceMappingURL=nodes.js.map
@@ -1,21 +0,0 @@
1
- /**
2
- * Span Exporters
3
- *
4
- * Pluggable export targets for collected spans.
5
- * Ready for OTEL collector integration.
6
- */
7
- import type { SpanExporter } from './tracer.js';
8
- /**
9
- * Console exporter - writes spans to the structured logger at debug level
10
- */
11
- export declare function createConsoleExporter(): SpanExporter;
12
- /**
13
- * File exporter - appends spans as JSONL to a date-stamped file
14
- */
15
- export declare function createFileExporter(outputDir?: string): SpanExporter;
16
- /**
17
- * OTLP HTTP exporter - sends spans to an OpenTelemetry collector endpoint.
18
- * Uses a 5-second abort timeout so export failures do not block the process.
19
- */
20
- export declare function createOTLPExporter(endpoint: string): SpanExporter;
21
- //# sourceMappingURL=exporters.d.ts.map
@@ -1,138 +0,0 @@
1
- /**
2
- * Span Exporters
3
- *
4
- * Pluggable export targets for collected spans.
5
- * Ready for OTEL collector integration.
6
- */
7
- import { writeFile, mkdir } from 'fs/promises';
8
- import { existsSync } from 'fs';
9
- import path from 'path';
10
- import { logger } from '../utils/logger.js';
11
- /**
12
- * Console exporter - writes spans to the structured logger at debug level
13
- */
14
- export function createConsoleExporter() {
15
- return {
16
- export: async (spans) => {
17
- for (const span of spans) {
18
- logger.debug('[Trace]', {
19
- traceId: span.traceId,
20
- spanId: span.spanId,
21
- name: span.name,
22
- durationMs: span.endTime !== undefined ? span.endTime - span.startTime : undefined,
23
- status: span.status,
24
- });
25
- }
26
- },
27
- };
28
- }
29
- /**
30
- * File exporter - appends spans as JSONL to a date-stamped file
31
- */
32
- export function createFileExporter(outputDir) {
33
- const dir = outputDir ?? path.resolve(process.cwd(), 'data', 'traces');
34
- return {
35
- export: async (spans) => {
36
- if (!existsSync(dir)) {
37
- await mkdir(dir, { recursive: true });
38
- }
39
- const date = new Date().toISOString().split('T')[0];
40
- const filePath = path.join(dir, `traces-${date}.jsonl`);
41
- const lines = spans.map(s => JSON.stringify(s)).join('\n') + '\n';
42
- await writeFile(filePath, lines, { flag: 'a' });
43
- logger.debug('[Trace] Exported to file', { file: filePath, count: spans.length });
44
- },
45
- };
46
- }
47
- function toOTLPValue(v) {
48
- if (typeof v === 'string')
49
- return { stringValue: v };
50
- if (typeof v === 'number')
51
- return { intValue: String(v) };
52
- return { boolValue: v };
53
- }
54
- function spanKindToOTLP(kind) {
55
- const map = {
56
- server: 2,
57
- client: 3,
58
- producer: 4,
59
- consumer: 5,
60
- internal: 1,
61
- };
62
- return map[kind] ?? 1;
63
- }
64
- function spanStatusToOTLP(status) {
65
- if (status === 'error')
66
- return 2;
67
- if (status === 'ok')
68
- return 1;
69
- return 0;
70
- }
71
- /**
72
- * OTLP HTTP exporter - sends spans to an OpenTelemetry collector endpoint.
73
- * Uses a 5-second abort timeout so export failures do not block the process.
74
- */
75
- export function createOTLPExporter(endpoint) {
76
- return {
77
- export: async (spans) => {
78
- try {
79
- const response = await fetch(endpoint, {
80
- method: 'POST',
81
- headers: { 'Content-Type': 'application/json' },
82
- body: JSON.stringify({
83
- resourceSpans: [
84
- {
85
- resource: {
86
- attributes: [
87
- { key: 'service.name', value: { stringValue: 'profclaw' } },
88
- { key: 'service.version', value: { stringValue: '2.0.0' } },
89
- ],
90
- },
91
- scopeSpans: [
92
- {
93
- spans: spans.map(s => ({
94
- traceId: s.traceId,
95
- spanId: s.spanId,
96
- parentSpanId: s.parentSpanId,
97
- name: s.name,
98
- kind: spanKindToOTLP(s.kind),
99
- startTimeUnixNano: BigInt(s.startTime * 1_000_000).toString(),
100
- endTimeUnixNano: s.endTime !== undefined
101
- ? BigInt(s.endTime * 1_000_000).toString()
102
- : undefined,
103
- status: { code: spanStatusToOTLP(s.status) },
104
- attributes: Object.entries(s.attributes).map(([k, v]) => ({
105
- key: k,
106
- value: toOTLPValue(v),
107
- })),
108
- events: s.events.map(e => ({
109
- name: e.name,
110
- timeUnixNano: BigInt(e.timestamp * 1_000_000).toString(),
111
- attributes: e.attributes
112
- ? Object.entries(e.attributes).map(([k, v]) => ({
113
- key: k,
114
- value: toOTLPValue(v),
115
- }))
116
- : [],
117
- })),
118
- })),
119
- },
120
- ],
121
- },
122
- ],
123
- }),
124
- signal: AbortSignal.timeout(5000),
125
- });
126
- if (!response.ok) {
127
- logger.warn('[OTLP] Export failed', { status: response.status });
128
- }
129
- }
130
- catch (err) {
131
- logger.warn('[OTLP] Export error', {
132
- error: err instanceof Error ? err.message : String(err),
133
- });
134
- }
135
- },
136
- };
137
- }
138
- //# sourceMappingURL=exporters.js.map
@@ -1,10 +0,0 @@
1
- /**
2
- * Diagnostics Module
3
- *
4
- * Lightweight OpenTelemetry-compatible tracing and metrics.
5
- */
6
- export { startSpan, endSpan, addSpanEvent, setSpanAttribute, trace, recordMetric, incrementCounter, getDiagnostics, getTraceSpans, configureDiagnostics, stopDiagnostics, parseTraceparent, formatTraceparent, } from './tracer.js';
7
- export type { Span, SpanEvent, SpanKind, SpanStatus, TraceContext, MetricPoint, SpanExporter, DiagnosticsConfig, MetricSummary, DiagnosticsSnapshot, } from './tracer.js';
8
- export { tracingMiddleware } from './middleware.js';
9
- export { createConsoleExporter, createFileExporter, createOTLPExporter, } from './exporters.js';
10
- //# sourceMappingURL=index.d.ts.map
@@ -1,9 +0,0 @@
1
- /**
2
- * Diagnostics Module
3
- *
4
- * Lightweight OpenTelemetry-compatible tracing and metrics.
5
- */
6
- export { startSpan, endSpan, addSpanEvent, setSpanAttribute, trace, recordMetric, incrementCounter, getDiagnostics, getTraceSpans, configureDiagnostics, stopDiagnostics, parseTraceparent, formatTraceparent, } from './tracer.js';
7
- export { tracingMiddleware } from './middleware.js';
8
- export { createConsoleExporter, createFileExporter, createOTLPExporter, } from './exporters.js';
9
- //# sourceMappingURL=index.js.map