@openclaw-cloud/agent-controller 1.0.0-beta.2 → 1.0.0-beta.21

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 (134) hide show
  1. package/bin/agent-controller.js +11 -2
  2. package/dist/api.d.ts +4 -0
  3. package/dist/api.js +10 -2
  4. package/dist/api.js.map +1 -1
  5. package/dist/commands/bootstrap.js +9 -34
  6. package/dist/commands/bootstrap.js.map +1 -1
  7. package/dist/commands/channel-server.d.ts +17 -0
  8. package/dist/commands/channel-server.js +71 -0
  9. package/dist/commands/channel-server.js.map +1 -0
  10. package/dist/commands/heartbeat-cli.js +5 -4
  11. package/dist/commands/heartbeat-cli.js.map +1 -1
  12. package/dist/commands/install-deps.js +18 -8
  13. package/dist/commands/install-deps.js.map +1 -1
  14. package/dist/commands/install.js +8 -8
  15. package/dist/commands/install.js.map +1 -1
  16. package/dist/commands/self-update.js +2 -1
  17. package/dist/commands/self-update.js.map +1 -1
  18. package/dist/config-file.js +20 -4
  19. package/dist/config-file.js.map +1 -1
  20. package/dist/config.d.ts +39 -0
  21. package/dist/config.js +101 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/connection.d.ts +2 -0
  24. package/dist/connection.js +38 -7
  25. package/dist/connection.js.map +1 -1
  26. package/dist/debug.js +2 -1
  27. package/dist/debug.js.map +1 -1
  28. package/dist/handlers/backup.js +4 -1
  29. package/dist/handlers/backup.js.map +1 -1
  30. package/dist/handlers/board-handler.d.ts +4 -0
  31. package/dist/handlers/board-handler.js +127 -100
  32. package/dist/handlers/board-handler.js.map +1 -1
  33. package/dist/handlers/chat.d.ts +17 -0
  34. package/dist/handlers/chat.js +187 -6
  35. package/dist/handlers/chat.js.map +1 -1
  36. package/dist/handlers/deploy.js +16 -29
  37. package/dist/handlers/deploy.js.map +1 -1
  38. package/dist/handlers/diagnostics.js +12 -0
  39. package/dist/handlers/diagnostics.js.map +1 -1
  40. package/dist/handlers/knowledge-sync.js +21 -1
  41. package/dist/handlers/knowledge-sync.js.map +1 -1
  42. package/dist/handlers/memory.d.ts +13 -0
  43. package/dist/handlers/memory.js +128 -0
  44. package/dist/handlers/memory.js.map +1 -0
  45. package/dist/handlers/onboarding.js +18 -2
  46. package/dist/handlers/onboarding.js.map +1 -1
  47. package/dist/handlers/package-install.js +44 -12
  48. package/dist/handlers/package-install.js.map +1 -1
  49. package/dist/handlers/pair.js +14 -1
  50. package/dist/handlers/pair.js.map +1 -1
  51. package/dist/handlers/restart.js +3 -1
  52. package/dist/handlers/restart.js.map +1 -1
  53. package/dist/handlers/self-update.js +3 -1
  54. package/dist/handlers/self-update.js.map +1 -1
  55. package/dist/handlers/stop.js +7 -0
  56. package/dist/handlers/stop.js.map +1 -1
  57. package/dist/handlers/telegram-webhook.js +23 -0
  58. package/dist/handlers/telegram-webhook.js.map +1 -1
  59. package/dist/handlers/update-config.js +8 -2
  60. package/dist/handlers/update-config.js.map +1 -1
  61. package/dist/heartbeat.d.ts +7 -0
  62. package/dist/heartbeat.js +15 -65
  63. package/dist/heartbeat.js.map +1 -1
  64. package/dist/index.d.ts +1 -1
  65. package/dist/index.js +140 -29
  66. package/dist/index.js.map +1 -1
  67. package/dist/mcp-client.js.map +1 -1
  68. package/dist/memory-mcp-server.d.ts +8 -0
  69. package/dist/memory-mcp-server.js +291 -0
  70. package/dist/memory-mcp-server.js.map +1 -0
  71. package/dist/platform/linux.js +7 -3
  72. package/dist/platform/linux.js.map +1 -1
  73. package/dist/platform/macos.js +4 -2
  74. package/dist/platform/macos.js.map +1 -1
  75. package/dist/platform/windows.js +4 -2
  76. package/dist/platform/windows.js.map +1 -1
  77. package/dist/providers/claude-code/channel-server.d.ts +60 -0
  78. package/dist/providers/claude-code/channel-server.js +155 -0
  79. package/dist/providers/claude-code/channel-server.js.map +1 -0
  80. package/dist/providers/claude-code/index.d.ts +68 -0
  81. package/dist/providers/claude-code/index.js +280 -0
  82. package/dist/providers/claude-code/index.js.map +1 -0
  83. package/dist/providers/claude-code/login-flow.d.ts +26 -0
  84. package/dist/providers/claude-code/login-flow.js +135 -0
  85. package/dist/providers/claude-code/login-flow.js.map +1 -0
  86. package/dist/providers/claude-code/settings-writer.d.ts +29 -0
  87. package/dist/providers/claude-code/settings-writer.js +94 -0
  88. package/dist/providers/claude-code/settings-writer.js.map +1 -0
  89. package/dist/providers/claude-code/socket-bridge.d.ts +98 -0
  90. package/dist/providers/claude-code/socket-bridge.js +301 -0
  91. package/dist/providers/claude-code/socket-bridge.js.map +1 -0
  92. package/dist/providers/claude-code/spawn-claude.d.ts +48 -0
  93. package/dist/providers/claude-code/spawn-claude.js +108 -0
  94. package/dist/providers/claude-code/spawn-claude.js.map +1 -0
  95. package/dist/providers/index.d.ts +4 -2
  96. package/dist/providers/index.js +16 -0
  97. package/dist/providers/index.js.map +1 -1
  98. package/dist/providers/mock/index.js.map +1 -1
  99. package/dist/providers/openclaw/device-identity.js +2 -2
  100. package/dist/providers/openclaw/device-identity.js.map +1 -1
  101. package/dist/providers/openclaw/gateway-adapter.js +19 -8
  102. package/dist/providers/openclaw/gateway-adapter.js.map +1 -1
  103. package/dist/providers/openclaw/gateway-client.js +9 -3
  104. package/dist/providers/openclaw/gateway-client.js.map +1 -1
  105. package/dist/providers/openclaw/index.js +14 -3
  106. package/dist/providers/openclaw/index.js.map +1 -1
  107. package/dist/types.d.ts +1 -1
  108. package/dist/utils/agent-controller-bin.d.ts +8 -0
  109. package/dist/utils/agent-controller-bin.js +58 -0
  110. package/dist/utils/agent-controller-bin.js.map +1 -0
  111. package/dist/utils/anthropic-auth.d.ts +25 -0
  112. package/dist/utils/anthropic-auth.js +13 -0
  113. package/dist/utils/anthropic-auth.js.map +1 -0
  114. package/dist/utils/apply-config.d.ts +28 -0
  115. package/dist/utils/apply-config.js +234 -4
  116. package/dist/utils/apply-config.js.map +1 -1
  117. package/dist/utils/claude-env.js +20 -9
  118. package/dist/utils/claude-env.js.map +1 -1
  119. package/dist/utils/config-merge-paths.d.ts +21 -0
  120. package/dist/utils/config-merge-paths.js +27 -0
  121. package/dist/utils/config-merge-paths.js.map +1 -0
  122. package/dist/utils/env.js +2 -1
  123. package/dist/utils/env.js.map +1 -1
  124. package/dist/utils/knowledge-graph.d.ts +66 -0
  125. package/dist/utils/knowledge-graph.js +163 -0
  126. package/dist/utils/knowledge-graph.js.map +1 -0
  127. package/dist/utils/release-channel.js +2 -4
  128. package/dist/utils/release-channel.js.map +1 -1
  129. package/dist/utils/write-workspace-files.d.ts +15 -0
  130. package/dist/utils/write-workspace-files.js +48 -0
  131. package/dist/utils/write-workspace-files.js.map +1 -0
  132. package/dist/workspace.js +4 -5
  133. package/dist/workspace.js.map +1 -1
  134. package/package.json +24 -3
@@ -0,0 +1,163 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { EventEmitter } from 'node:events';
4
+ // ---------------------------------------------------------------------------
5
+ // KnowledgeGraphManager
6
+ // ---------------------------------------------------------------------------
7
+ /**
8
+ * In-memory knowledge graph with atomic persistence.
9
+ *
10
+ * Ported from @modelcontextprotocol/server-memory with key differences:
11
+ * - Graph stays in memory (this.graph), loaded once at init()
12
+ * - All mutations operate on this.graph, then call persist()
13
+ * - persist() uses atomic write: write to .tmp file, then fs.rename()
14
+ * - Extends EventEmitter, emits 'delta' event after each mutation
15
+ * - Query methods (readGraph, searchNodes, openNodes) are synchronous
16
+ */
17
+ export class KnowledgeGraphManager extends EventEmitter {
18
+ memoryFilePath;
19
+ graph = { entities: [], relations: [] };
20
+ persistQueue = Promise.resolve();
21
+ constructor(memoryFilePath) {
22
+ super();
23
+ this.memoryFilePath = memoryFilePath;
24
+ }
25
+ /** Load graph from disk into memory. Call once at startup. */
26
+ async init() {
27
+ this.graph = await this.readGraphFromDisk();
28
+ }
29
+ // -------------------------------------------------------------------------
30
+ // Disk I/O
31
+ // -------------------------------------------------------------------------
32
+ async readGraphFromDisk() {
33
+ try {
34
+ const data = await fs.readFile(this.memoryFilePath, 'utf-8');
35
+ const lines = data.split('\n').filter((line) => line.trim() !== '');
36
+ return lines.reduce((graph, line) => {
37
+ const item = JSON.parse(line);
38
+ if (item.type === 'entity') {
39
+ graph.entities.push({
40
+ name: item.name,
41
+ entityType: item.entityType,
42
+ observations: item.observations,
43
+ });
44
+ }
45
+ if (item.type === 'relation') {
46
+ graph.relations.push({
47
+ from: item.from,
48
+ to: item.to,
49
+ relationType: item.relationType,
50
+ });
51
+ }
52
+ return graph;
53
+ }, { entities: [], relations: [] });
54
+ }
55
+ catch (error) {
56
+ if (error?.code === 'ENOENT') {
57
+ return { entities: [], relations: [] };
58
+ }
59
+ throw error;
60
+ }
61
+ }
62
+ /** Serialized persist: enqueues writes so concurrent calls never interleave. */
63
+ persist() {
64
+ this.persistQueue = this.persistQueue.then(() => this.doPersist()).catch(() => { });
65
+ return this.persistQueue;
66
+ }
67
+ /** Atomic persist: write to .tmp, then fs.rename(). */
68
+ async doPersist() {
69
+ const lines = [
70
+ ...this.graph.entities.map((e) => JSON.stringify({
71
+ type: 'entity',
72
+ name: e.name,
73
+ entityType: e.entityType,
74
+ observations: e.observations,
75
+ })),
76
+ ...this.graph.relations.map((r) => JSON.stringify({ type: 'relation', from: r.from, to: r.to, relationType: r.relationType })),
77
+ ];
78
+ const tmpPath = this.memoryFilePath + '.tmp';
79
+ await fs.mkdir(path.dirname(this.memoryFilePath), { recursive: true });
80
+ await fs.writeFile(tmpPath, lines.join('\n'));
81
+ await fs.rename(tmpPath, this.memoryFilePath);
82
+ }
83
+ /** Emit delta event after mutation (for sync to backend). */
84
+ emitDelta(action, data) {
85
+ this.emit('delta', { action, data });
86
+ }
87
+ // -------------------------------------------------------------------------
88
+ // Mutations — operate on this.graph, persist, emit delta
89
+ // -------------------------------------------------------------------------
90
+ async createEntities(entities) {
91
+ const newEntities = entities.filter((e) => !this.graph.entities.some((existing) => existing.name === e.name));
92
+ this.graph.entities.push(...newEntities);
93
+ await this.persist();
94
+ this.emitDelta('entities_created', newEntities);
95
+ return newEntities;
96
+ }
97
+ async createRelations(relations) {
98
+ const newRelations = relations.filter((r) => !this.graph.relations.some((existing) => existing.from === r.from &&
99
+ existing.to === r.to &&
100
+ existing.relationType === r.relationType));
101
+ this.graph.relations.push(...newRelations);
102
+ await this.persist();
103
+ this.emitDelta('relations_created', newRelations);
104
+ return newRelations;
105
+ }
106
+ async addObservations(observations) {
107
+ const results = observations.map((o) => {
108
+ const entity = this.graph.entities.find((e) => e.name === o.entityName);
109
+ if (!entity) {
110
+ throw new Error(`Entity with name ${o.entityName} not found`);
111
+ }
112
+ const newObservations = o.contents.filter((content) => !entity.observations.includes(content));
113
+ entity.observations.push(...newObservations);
114
+ return { entityName: o.entityName, addedObservations: newObservations };
115
+ });
116
+ await this.persist();
117
+ this.emitDelta('observations_added', results);
118
+ return results;
119
+ }
120
+ async deleteEntities(names) {
121
+ this.graph.entities = this.graph.entities.filter((e) => !names.includes(e.name));
122
+ this.graph.relations = this.graph.relations.filter((r) => !names.includes(r.from) && !names.includes(r.to));
123
+ await this.persist();
124
+ this.emitDelta('entities_deleted', names);
125
+ }
126
+ async deleteObservations(deletions) {
127
+ deletions.forEach((d) => {
128
+ const entity = this.graph.entities.find((e) => e.name === d.entityName);
129
+ if (entity) {
130
+ entity.observations = entity.observations.filter((o) => !d.observations.includes(o));
131
+ }
132
+ });
133
+ await this.persist();
134
+ this.emitDelta('observations_deleted', deletions);
135
+ }
136
+ async deleteRelations(relations) {
137
+ this.graph.relations = this.graph.relations.filter((r) => !relations.some((del) => r.from === del.from && r.to === del.to && r.relationType === del.relationType));
138
+ await this.persist();
139
+ this.emitDelta('relations_deleted', relations);
140
+ }
141
+ // -------------------------------------------------------------------------
142
+ // Queries — read from this.graph in-memory, no disk I/O
143
+ // -------------------------------------------------------------------------
144
+ readGraph() {
145
+ return this.graph;
146
+ }
147
+ searchNodes(query) {
148
+ const lowerQuery = query.toLowerCase();
149
+ const filteredEntities = this.graph.entities.filter((e) => e.name.toLowerCase().includes(lowerQuery) ||
150
+ e.entityType.toLowerCase().includes(lowerQuery) ||
151
+ e.observations.some((o) => o.toLowerCase().includes(lowerQuery)));
152
+ const filteredEntityNames = new Set(filteredEntities.map((e) => e.name));
153
+ const filteredRelations = this.graph.relations.filter((r) => filteredEntityNames.has(r.from) && filteredEntityNames.has(r.to));
154
+ return { entities: filteredEntities, relations: filteredRelations };
155
+ }
156
+ openNodes(names) {
157
+ const filteredEntities = this.graph.entities.filter((e) => names.includes(e.name));
158
+ const filteredEntityNames = new Set(filteredEntities.map((e) => e.name));
159
+ const filteredRelations = this.graph.relations.filter((r) => filteredEntityNames.has(r.from) && filteredEntityNames.has(r.to));
160
+ return { entities: filteredEntities, relations: filteredRelations };
161
+ }
162
+ }
163
+ //# sourceMappingURL=knowledge-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-graph.js","sourceRoot":"","sources":["../../src/utils/knowledge-graph.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,5 @@
1
+ import { config } from '../config.js';
1
2
  export function getReleaseChannel() {
2
- const raw = process.env.AC_RELEASE_CHANNEL?.trim().toLowerCase();
3
- if (raw === 'beta')
4
- return 'beta';
5
- return 'stable';
3
+ return config.releaseChannel;
6
4
  }
7
5
  //# sourceMappingURL=release-channel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"release-channel.js","sourceRoot":"","sources":["../../src/utils/release-channel.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjE,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"release-channel.js","sourceRoot":"","sources":["../../src/utils/release-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAYtC,MAAM,UAAU,iBAAiB;IAC/B,OAAO,MAAM,CAAC,cAAc,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Write a map of workspace-relative paths → content into `workspaceDir`.
3
+ *
4
+ * Mirrors the exact behavior of the original inline block in `commands/bootstrap.ts`:
5
+ * - Creates parent directories recursively.
6
+ * - Writes each file as UTF-8.
7
+ * - `chmod 0o755` on any path ending in `.sh`.
8
+ * - Logs per-file success/failure and a skill-deployment summary.
9
+ * - Never throws on a single file's write error — logs and continues.
10
+ *
11
+ * Used by both the bootstrap CLI (one-shot startup) and the live `update_config`
12
+ * command path in `applyBootstrapConfig` (propagates shared-file updates from
13
+ * the backend without requiring a restart).
14
+ */
15
+ export declare function writeWorkspaceFiles(files: Record<string, string>, workspaceDir: string): Promise<void>;
@@ -0,0 +1,48 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ /**
4
+ * Write a map of workspace-relative paths → content into `workspaceDir`.
5
+ *
6
+ * Mirrors the exact behavior of the original inline block in `commands/bootstrap.ts`:
7
+ * - Creates parent directories recursively.
8
+ * - Writes each file as UTF-8.
9
+ * - `chmod 0o755` on any path ending in `.sh`.
10
+ * - Logs per-file success/failure and a skill-deployment summary.
11
+ * - Never throws on a single file's write error — logs and continues.
12
+ *
13
+ * Used by both the bootstrap CLI (one-shot startup) and the live `update_config`
14
+ * command path in `applyBootstrapConfig` (propagates shared-file updates from
15
+ * the backend without requiring a restart).
16
+ */
17
+ export async function writeWorkspaceFiles(files, workspaceDir) {
18
+ const fileNames = Object.keys(files);
19
+ if (fileNames.length === 0)
20
+ return;
21
+ await fs.mkdir(workspaceDir, { recursive: true });
22
+ for (const [filePath, content] of Object.entries(files)) {
23
+ const fullPath = path.join(workspaceDir, filePath);
24
+ await fs.mkdir(path.dirname(fullPath), { recursive: true });
25
+ try {
26
+ await fs.writeFile(fullPath, content);
27
+ console.log(` ✓ ${filePath}`);
28
+ }
29
+ catch (err) {
30
+ console.error(` ✗ ${filePath}: ${err instanceof Error ? err.message : err}`);
31
+ }
32
+ }
33
+ // Make .sh files executable
34
+ for (const filePath of fileNames) {
35
+ if (filePath.endsWith('.sh')) {
36
+ const fullPath = path.join(workspaceDir, filePath);
37
+ await fs.chmod(fullPath, 0o755);
38
+ }
39
+ }
40
+ // Summary for deployed skills (under .agents/skills/<name>/...)
41
+ const skillFiles = fileNames.filter((f) => f.startsWith('.agents/skills/'));
42
+ if (skillFiles.length > 0) {
43
+ const skills = [...new Set(skillFiles.map((f) => f.split('/')[2]))];
44
+ console.log(` ✓ skills deployed: ${skills.join(', ')}`);
45
+ }
46
+ console.log(` wrote ${fileNames.length} workspace files`);
47
+ }
48
+ //# sourceMappingURL=write-workspace-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-workspace-files.js","sourceRoot":"","sources":["../../src/utils/write-workspace-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAA6B,EAC7B,YAAoB;IAEpB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEnC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,OAAO,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YACnD,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC5E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,SAAS,CAAC,MAAM,kBAAkB,CAAC,CAAC;AAC7D,CAAC"}
package/dist/workspace.js CHANGED
@@ -1,5 +1,5 @@
1
- import os from 'node:os';
2
1
  import path from 'node:path';
2
+ import { config } from './config.js';
3
3
  /**
4
4
  * Returns the canonical workspace directory.
5
5
  *
@@ -12,9 +12,8 @@ import path from 'node:path';
12
12
  * (which used WORKSPACE_DIR) and backup/knowledge_sync (which used OPENCLAW_STATE_DIR).
13
13
  */
14
14
  export function getWorkspaceDir() {
15
- if (process.env.WORKSPACE_DIR)
16
- return process.env.WORKSPACE_DIR.trim();
17
- const stateDir = process.env.OPENCLAW_STATE_DIR?.trim() ?? path.join(os.homedir(), '.openclaw');
18
- return path.join(stateDir, 'workspace');
15
+ if (config.workspaceDir)
16
+ return config.workspaceDir;
17
+ return path.join(config.stateDir, 'workspace');
19
18
  }
20
19
  //# sourceMappingURL=workspace.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;IAChG,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,MAAM,CAAC,YAAY;QAAE,OAAO,MAAM,CAAC,YAAY,CAAC;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACjD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw-cloud/agent-controller",
3
- "version": "1.0.0-beta.2",
3
+ "version": "1.0.0-beta.21",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -11,7 +11,8 @@
11
11
  "prepublishOnly": "npm run build",
12
12
  "test": "node --experimental-vm-modules node_modules/.bin/jest --forceExit",
13
13
  "start": "node bin/agent-controller.js",
14
- "prepare": "[ -d .git ] && husky || true"
14
+ "prepare": "[ -d .git ] && husky || true",
15
+ "lint": "eslint --fix ./src"
15
16
  },
16
17
  "files": [
17
18
  "dist/",
@@ -29,15 +30,35 @@
29
30
  "@types/jest": "^30.0.0",
30
31
  "@types/node": "^25.2.3",
31
32
  "@types/ws": "^8.18.1",
33
+ "@typescript-eslint/eslint-plugin": "^8.58.0",
34
+ "@typescript-eslint/parser": "^8.58.0",
32
35
  "ajv": "^8.18.0",
36
+ "eslint": "^9.39.4",
37
+ "eslint-config-prettier": "^10.1.8",
38
+ "eslint-import-resolver-typescript": "^4.4.4",
39
+ "eslint-plugin-import-x": "^4.16.2",
40
+ "eslint-plugin-prettier": "^5.5.5",
41
+ "eslint-plugin-unused-imports": "^4.4.1",
33
42
  "husky": "^9.1.7",
34
43
  "jest": "^30.2.0",
44
+ "prettier": "^3.8.1",
35
45
  "semantic-release": "^24.0.0",
36
46
  "ts-jest": "^29.4.6",
37
- "typescript": "^5.9.3"
47
+ "typescript": "^5.9.3",
48
+ "typescript-eslint": "^8.58.0"
38
49
  },
39
50
  "publishConfig": {
40
51
  "access": "public",
41
52
  "registry": "https://registry.npmjs.org/"
53
+ },
54
+ "prettier": {
55
+ "semi": true,
56
+ "arrowParens": "always",
57
+ "singleQuote": true,
58
+ "bracketSpacing": true,
59
+ "printWidth": 100,
60
+ "quoteProps": "consistent",
61
+ "trailingComma": "all",
62
+ "tabWidth": 2
42
63
  }
43
64
  }