@operator-labs/darwin 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -0
  3. package/dist/app.d.ts +5 -0
  4. package/dist/app.js +469 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/cli.d.ts +1 -0
  7. package/dist/cli.js +134 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/index.d.ts +2 -0
  10. package/dist/index.js +8 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/lib/auth.d.ts +15 -0
  13. package/dist/lib/auth.js +71 -0
  14. package/dist/lib/auth.js.map +1 -0
  15. package/dist/lib/autocomplete.d.ts +18 -0
  16. package/dist/lib/autocomplete.js +124 -0
  17. package/dist/lib/autocomplete.js.map +1 -0
  18. package/dist/lib/command-surface.d.ts +52 -0
  19. package/dist/lib/command-surface.js +198 -0
  20. package/dist/lib/command-surface.js.map +1 -0
  21. package/dist/lib/config.d.ts +25 -0
  22. package/dist/lib/config.js +99 -0
  23. package/dist/lib/config.js.map +1 -0
  24. package/dist/lib/darwin-local.d.ts +31 -0
  25. package/dist/lib/darwin-local.js +195 -0
  26. package/dist/lib/darwin-local.js.map +1 -0
  27. package/dist/lib/local-sessions.d.ts +66 -0
  28. package/dist/lib/local-sessions.js +357 -0
  29. package/dist/lib/local-sessions.js.map +1 -0
  30. package/dist/lib/operator-harness.d.ts +13 -0
  31. package/dist/lib/operator-harness.js +185 -0
  32. package/dist/lib/operator-harness.js.map +1 -0
  33. package/dist/lib/operator.d.ts +2 -0
  34. package/dist/lib/operator.js +13 -0
  35. package/dist/lib/operator.js.map +1 -0
  36. package/dist/lib/pi-tools.d.ts +19 -0
  37. package/dist/lib/pi-tools.js +73 -0
  38. package/dist/lib/pi-tools.js.map +1 -0
  39. package/dist/theme.d.ts +21 -0
  40. package/dist/theme.js +64 -0
  41. package/dist/theme.js.map +1 -0
  42. package/dist/ui/components/answer-box.d.ts +6 -0
  43. package/dist/ui/components/answer-box.js +17 -0
  44. package/dist/ui/components/answer-box.js.map +1 -0
  45. package/dist/ui/components/chat-log.d.ts +18 -0
  46. package/dist/ui/components/chat-log.js +72 -0
  47. package/dist/ui/components/chat-log.js.map +1 -0
  48. package/dist/ui/components/custom-editor.d.ts +6 -0
  49. package/dist/ui/components/custom-editor.js +17 -0
  50. package/dist/ui/components/custom-editor.js.map +1 -0
  51. package/dist/ui/components/footer.d.ts +6 -0
  52. package/dist/ui/components/footer.js +15 -0
  53. package/dist/ui/components/footer.js.map +1 -0
  54. package/dist/ui/components/intro.d.ts +11 -0
  55. package/dist/ui/components/intro.js +62 -0
  56. package/dist/ui/components/intro.js.map +1 -0
  57. package/dist/ui/components/note-box.d.ts +6 -0
  58. package/dist/ui/components/note-box.js +17 -0
  59. package/dist/ui/components/note-box.js.map +1 -0
  60. package/dist/ui/components/tool-event.d.ts +9 -0
  61. package/dist/ui/components/tool-event.js +58 -0
  62. package/dist/ui/components/tool-event.js.map +1 -0
  63. package/dist/ui/components/user-query.d.ts +6 -0
  64. package/dist/ui/components/user-query.js +16 -0
  65. package/dist/ui/components/user-query.js.map +1 -0
  66. package/dist/ui/components/working-indicator.d.ts +12 -0
  67. package/dist/ui/components/working-indicator.js +30 -0
  68. package/dist/ui/components/working-indicator.js.map +1 -0
  69. package/dist/utils/markdown-table.d.ts +8 -0
  70. package/dist/utils/markdown-table.js +123 -0
  71. package/dist/utils/markdown-table.js.map +1 -0
  72. package/package.json +41 -0
@@ -0,0 +1,123 @@
1
+ import chalk from "chalk";
2
+ const BOX = {
3
+ topLeft: "┌",
4
+ topRight: "┐",
5
+ bottomLeft: "└",
6
+ bottomRight: "┘",
7
+ horizontal: "─",
8
+ vertical: "│",
9
+ topT: "┬",
10
+ bottomT: "┴",
11
+ leftT: "├",
12
+ rightT: "┤",
13
+ cross: "┼",
14
+ };
15
+ function isNumeric(value) {
16
+ const trimmed = value.trim();
17
+ return /^[$]?[-+]?[\d,]+\.?\d*[%BMK]?$/.test(trimmed);
18
+ }
19
+ export function parseMarkdownTable(tableText) {
20
+ const lines = tableText.trim().split("\n").map((line) => line.trim());
21
+ if (lines.length < 2) {
22
+ return null;
23
+ }
24
+ const headerLine = lines[0];
25
+ if (!headerLine.includes("|")) {
26
+ return null;
27
+ }
28
+ const headers = headerLine
29
+ .split("|")
30
+ .map((cell) => cell.trim())
31
+ .filter((_, index, array) => (index > 0 && index < array.length - 1) || array.length === 1);
32
+ if (headers.length === 0) {
33
+ headers.push(...headerLine.split("|").map((cell) => cell.trim()));
34
+ }
35
+ const separatorLine = lines[1];
36
+ if (!separatorLine || !/^[\s|:-]+$/.test(separatorLine)) {
37
+ return null;
38
+ }
39
+ const rows = [];
40
+ for (let index = 2; index < lines.length; index += 1) {
41
+ const line = lines[index];
42
+ if (!line.includes("|")) {
43
+ continue;
44
+ }
45
+ const cells = line.split("|").map((cell) => cell.trim());
46
+ if (cells[0] === "") {
47
+ cells.shift();
48
+ }
49
+ if (cells[cells.length - 1] === "") {
50
+ cells.pop();
51
+ }
52
+ if (cells.length > 0) {
53
+ rows.push(cells);
54
+ }
55
+ }
56
+ return headers.length > 0 ? { headers, rows } : null;
57
+ }
58
+ export function renderBoxTable(headers, rows) {
59
+ const widths = headers.map((header) => header.length);
60
+ for (const row of rows) {
61
+ for (let index = 0; index < row.length; index += 1) {
62
+ if (index < widths.length) {
63
+ widths[index] = Math.max(widths[index], row[index].length);
64
+ }
65
+ }
66
+ }
67
+ const alignRight = headers.map((_, index) => {
68
+ let numericCount = 0;
69
+ for (const row of rows) {
70
+ if (row[index] && isNumeric(row[index])) {
71
+ numericCount += 1;
72
+ }
73
+ }
74
+ return numericCount > rows.length / 2;
75
+ });
76
+ const pad = (value, width, right) => right ? value.padStart(width) : value.padEnd(width);
77
+ const lines = [];
78
+ lines.push(BOX.topLeft + widths.map((width) => BOX.horizontal.repeat(width + 2)).join(BOX.topT) + BOX.topRight);
79
+ lines.push(BOX.vertical +
80
+ headers.map((header, index) => ` ${pad(header, widths[index], false)} `).join(BOX.vertical) +
81
+ BOX.vertical);
82
+ lines.push(BOX.leftT + widths.map((width) => BOX.horizontal.repeat(width + 2)).join(BOX.cross) + BOX.rightT);
83
+ for (const row of rows) {
84
+ lines.push(BOX.vertical +
85
+ widths
86
+ .map((width, index) => ` ${pad(row[index] || "", width, alignRight[index])} `)
87
+ .join(BOX.vertical) +
88
+ BOX.vertical);
89
+ }
90
+ lines.push(BOX.bottomLeft +
91
+ widths.map((width) => BOX.horizontal.repeat(width + 2)).join(BOX.bottomT) +
92
+ BOX.bottomRight);
93
+ return lines.join("\n");
94
+ }
95
+ export function transformMarkdownTables(content) {
96
+ const normalized = content
97
+ .replace(/\r\n/g, "\n")
98
+ .split("\n")
99
+ .map((line) => line.trimEnd())
100
+ .join("\n");
101
+ const tableRegex = /^(\|[^\n]+\|\n\|[-:| \t]+\|(?:\n\|[^\n]+\|)*)/gm;
102
+ const tableRegex2 = /^([^\n|]*\|[^\n]+\n[-:| \t]+(?:\n[^\n|]*\|[^\n]+)*)/gm;
103
+ let result = normalized;
104
+ result = result.replace(tableRegex, (match) => {
105
+ const parsed = parseMarkdownTable(match);
106
+ return parsed && parsed.rows.length > 0 ? renderBoxTable(parsed.headers, parsed.rows) : match;
107
+ });
108
+ result = result.replace(tableRegex2, (match) => {
109
+ if (match.includes(BOX.topLeft)) {
110
+ return match;
111
+ }
112
+ const parsed = parseMarkdownTable(match);
113
+ return parsed && parsed.rows.length > 0 ? renderBoxTable(parsed.headers, parsed.rows) : match;
114
+ });
115
+ return result;
116
+ }
117
+ export function transformBold(content) {
118
+ return content.replace(/\*\*([^*]+)\*\*/g, (_, text) => chalk.bold(text));
119
+ }
120
+ export function formatResponse(content) {
121
+ return transformBold(transformMarkdownTables(content));
122
+ }
123
+ //# sourceMappingURL=markdown-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-table.js","sourceRoot":"","sources":["../../src/utils/markdown-table.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@operator-labs/darwin",
3
+ "version": "0.1.0",
4
+ "description": "Darwin implements natural selection for OpenClaw agents on Operator.io",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "packageManager": "bun@1.2.15",
8
+ "main": "dist/index.js",
9
+ "bin": {
10
+ "darwin": "./dist/index.js"
11
+ },
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "dev": "tsx src/index.ts",
15
+ "prepack": "bun run build",
16
+ "start": "node dist/index.js",
17
+ "test": "bun test"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md",
22
+ "LICENSE"
23
+ ],
24
+ "engines": {
25
+ "node": ">=18"
26
+ },
27
+ "dependencies": {
28
+ "@mariozechner/pi-agent-core": "^0.58.3",
29
+ "@mariozechner/pi-ai": "^0.58.3",
30
+ "@mariozechner/pi-coding-agent": "^0.58.3",
31
+ "@mariozechner/pi-tui": "^0.58.3",
32
+ "@operator-labs/sdk": "^0.1.9",
33
+ "chalk": "^5.6.2",
34
+ "open": "^10.2.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^24.6.0",
38
+ "tsx": "^4.20.6",
39
+ "typescript": "^5.9.3"
40
+ }
41
+ }