crewx 0.8.0-rc.82 → 0.8.0-rc.83

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 (188) hide show
  1. package/package.json +7 -7
  2. package/packages/cli/package.json +1 -1
  3. package/dist-server/packages/sdk/src/adapter/context-builder.js +0 -86
  4. package/dist-server/packages/sdk/src/adapter/scoped-store.js +0 -42
  5. package/dist-server/packages/sdk/src/adapter/types.js +0 -22
  6. package/dist-server/packages/sdk/src/agent/resolver.js +0 -45
  7. package/dist-server/packages/sdk/src/config/loader.js +0 -94
  8. package/dist-server/packages/sdk/src/conversation/sqlite-provider.js +0 -177
  9. package/dist-server/packages/sdk/src/conversation/to-template-messages.js +0 -33
  10. package/dist-server/packages/sdk/src/conversation/types.js +0 -9
  11. package/dist-server/packages/sdk/src/events/TypedEventEmitter.js +0 -64
  12. package/dist-server/packages/sdk/src/events/types.js +0 -8
  13. package/dist-server/packages/sdk/src/facade/Crewx.js +0 -1295
  14. package/dist-server/packages/sdk/src/layout/loader.js +0 -308
  15. package/dist-server/packages/sdk/src/layout/props-validator.js +0 -300
  16. package/dist-server/packages/sdk/src/layout/renderer.js +0 -192
  17. package/dist-server/packages/sdk/src/layout/types.js +0 -35
  18. package/dist-server/packages/sdk/src/parsers/agent-call.util.js +0 -18
  19. package/dist-server/packages/sdk/src/parsers/claude.parser.js +0 -66
  20. package/dist-server/packages/sdk/src/parsers/codex.parser.js +0 -99
  21. package/dist-server/packages/sdk/src/parsers/copilot.parser.js +0 -65
  22. package/dist-server/packages/sdk/src/parsers/gemini.parser.js +0 -45
  23. package/dist-server/packages/sdk/src/parsers/opencode.parser.js +0 -75
  24. package/dist-server/packages/sdk/src/parsers/router.js +0 -55
  25. package/dist-server/packages/sdk/src/paths.js +0 -51
  26. package/dist-server/packages/sdk/src/platform/IFsAdapter.js +0 -2
  27. package/dist-server/packages/sdk/src/platform/NodeFsAdapter.js +0 -37
  28. package/dist-server/packages/sdk/src/plugin/plugin-provider.js +0 -206
  29. package/dist-server/packages/sdk/src/plugin/types.js +0 -8
  30. package/dist-server/packages/sdk/src/plugin.js +0 -28
  31. package/dist-server/packages/sdk/src/plugins/conversation.js +0 -58
  32. package/dist-server/packages/sdk/src/provider/bridge.js +0 -380
  33. package/dist-server/packages/sdk/src/provider/parse-usage.js +0 -82
  34. package/dist-server/packages/sdk/src/provider/register-api.js +0 -23
  35. package/dist-server/packages/sdk/src/provider/vercel-runtime.js +0 -346
  36. package/dist-server/packages/sdk/src/remote/remote-agent-manager.js +0 -197
  37. package/dist-server/packages/sdk/src/remote/remote-provider.js +0 -140
  38. package/dist-server/packages/sdk/src/remote/remote-transport.js +0 -82
  39. package/dist-server/packages/sdk/src/remote/types.js +0 -8
  40. package/dist-server/packages/sdk/src/server/auth.js +0 -34
  41. package/dist-server/packages/sdk/src/server/handler.js +0 -74
  42. package/dist-server/packages/sdk/src/server/tool-adapter.js +0 -94
  43. package/dist-server/packages/sdk/src/template/engine.js +0 -136
  44. package/dist-server/packages/sdk/src/template/helpers/exec.js +0 -229
  45. package/dist-server/packages/sdk/src/template/helpers/fenced_code.js +0 -19
  46. package/dist-server/packages/sdk/src/template/helpers/format-conversation.js +0 -52
  47. package/dist-server/packages/sdk/src/template/helpers/include.js +0 -22
  48. package/dist-server/packages/sdk/src/template/helpers/p1p2.js +0 -89
  49. package/dist-server/packages/sdk/src/template/loader/DocumentLoader.js +0 -127
  50. package/dist-server/packages/sdk/src/template/types.js +0 -5
  51. package/dist-server/packages/sdk/src/types/index.js +0 -31
  52. package/dist-server/packages/sdk/src/types/task-log.types.js +0 -5
  53. package/dist-server/packages/sdk/src/utils/glob-match.js +0 -41
  54. package/dist-server/packages/sdk/src/utils/id.js +0 -49
  55. package/dist-server/packages/sdk/src/utils/timestamp.js +0 -12
  56. package/dist-server/packages/sdk/src/utils/workspace.js +0 -57
  57. /package/dist-server/{src/server/adapters → adapters}/adapter.module.js +0 -0
  58. /package/dist-server/{src/server/adapters → adapters}/adapter.service.js +0 -0
  59. /package/dist-server/{src/server/adapters → adapters}/http-router.service.js +0 -0
  60. /package/dist-server/{src/server/app.module.js → app.module.js} +0 -0
  61. /package/dist-server/{src/server/bootstrap → bootstrap}/crewx-server.js +0 -0
  62. /package/dist-server/{src/server/common → common}/decorators/project.decorator.js +0 -0
  63. /package/dist-server/{src/server/common → common}/decorators/workspace.decorator.js +0 -0
  64. /package/dist-server/{src/server/common → common}/interceptor/api-id-header.interceptor.js +0 -0
  65. /package/dist-server/{src/server/common → common}/interceptor/http-logging.interceptor.js +0 -0
  66. /package/dist-server/{src/server/common → common}/limits/defaults.js +0 -0
  67. /package/dist-server/{src/server/common → common}/limits/limits-provider.js +0 -0
  68. /package/dist-server/{src/server/common → common}/limits/limits.controller.js +0 -0
  69. /package/dist-server/{src/server/common → common}/limits/limits.module.js +0 -0
  70. /package/dist-server/{src/server/common → common}/limits/local-limits.provider.js +0 -0
  71. /package/dist-server/{src/server/common → common}/middleware/workspace.middleware.js +0 -0
  72. /package/dist-server/{src/server/common → common}/workspace-context.store.js +0 -0
  73. /package/dist-server/{src/server/domain → domain}/agent/agent.controller.js +0 -0
  74. /package/dist-server/{src/server/domain → domain}/agent/agent.module.js +0 -0
  75. /package/dist-server/{src/server/domain → domain}/agent/agent.service.js +0 -0
  76. /package/dist-server/{src/server/domain → domain}/agent/agent.types.js +0 -0
  77. /package/dist-server/{src/server/domain → domain}/agent/dto/create-agent.dto.js +0 -0
  78. /package/dist-server/{src/server/domain → domain}/agent/dto/preview-prompt.dto.js +0 -0
  79. /package/dist-server/{src/server/domain → domain}/agent/dto/update-agent.dto.js +0 -0
  80. /package/dist-server/{src/server/domain → domain}/agent/template-processor.service.js +0 -0
  81. /package/dist-server/{src/server/domain → domain}/box/box.controller.js +0 -0
  82. /package/dist-server/{src/server/domain → domain}/box/box.module.js +0 -0
  83. /package/dist-server/{src/server/domain → domain}/box/box.service.js +0 -0
  84. /package/dist-server/{src/server/domain → domain}/box/dto/create-box.dto.js +0 -0
  85. /package/dist-server/{src/server/domain → domain}/cli/cli.controller.js +0 -0
  86. /package/dist-server/{src/server/domain → domain}/cli/cli.module.js +0 -0
  87. /package/dist-server/{src/server/domain → domain}/cli/cli.service.js +0 -0
  88. /package/dist-server/{src/server/domain → domain}/cli/dto/update-cli.dto.js +0 -0
  89. /package/dist-server/{src/server/domain → domain}/doc/doc.controller.js +0 -0
  90. /package/dist-server/{src/server/domain → domain}/doc/doc.module.js +0 -0
  91. /package/dist-server/{src/server/domain → domain}/doc/doc.service.js +0 -0
  92. /package/dist-server/{src/server/domain → domain}/doc/dto/doc.dto.js +0 -0
  93. /package/dist-server/{src/server/domain → domain}/document/document.controller.js +0 -0
  94. /package/dist-server/{src/server/domain → domain}/document/document.module.js +0 -0
  95. /package/dist-server/{src/server/domain → domain}/document/document.service.js +0 -0
  96. /package/dist-server/{src/server/domain → domain}/document/dto/register-document.dto.js +0 -0
  97. /package/dist-server/{src/server/domain → domain}/fs/dto/tree-node.dto.js +0 -0
  98. /package/dist-server/{src/server/domain → domain}/fs/dto/tree-query.dto.js +0 -0
  99. /package/dist-server/{src/server/domain → domain}/fs/fs.controller.js +0 -0
  100. /package/dist-server/{src/server/domain → domain}/fs/fs.module.js +0 -0
  101. /package/dist-server/{src/server/domain → domain}/fs/fs.service.js +0 -0
  102. /package/dist-server/{src/server/domain → domain}/git/git.module.js +0 -0
  103. /package/dist-server/{src/server/domain → domain}/git/git.service.js +0 -0
  104. /package/dist-server/{src/server/domain → domain}/health/health.controller.js +0 -0
  105. /package/dist-server/{src/server/domain → domain}/health/health.module.js +0 -0
  106. /package/dist-server/{src/server/domain → domain}/knowledge/dto/graph-knowledge.dto.js +0 -0
  107. /package/dist-server/{src/server/domain → domain}/knowledge/dto/knowledge.dto.js +0 -0
  108. /package/dist-server/{src/server/domain → domain}/knowledge/knowledge.controller.js +0 -0
  109. /package/dist-server/{src/server/domain → domain}/knowledge/knowledge.module.js +0 -0
  110. /package/dist-server/{src/server/domain → domain}/knowledge/knowledge.service.js +0 -0
  111. /package/dist-server/{src/server/domain → domain}/mcp/crewx-tool.factory.js +0 -0
  112. /package/dist-server/{src/server/domain → domain}/mcp/mcp-auth.guard.js +0 -0
  113. /package/dist-server/{src/server/domain → domain}/mcp/mcp.constants.js +0 -0
  114. /package/dist-server/{src/server/domain → domain}/mcp/mcp.controller.js +0 -0
  115. /package/dist-server/{src/server/domain → domain}/mcp/mcp.dto.js +0 -0
  116. /package/dist-server/{src/server/domain → domain}/mcp/mcp.module.js +0 -0
  117. /package/dist-server/{src/server/domain → domain}/mcp/mcp.service.js +0 -0
  118. /package/dist-server/{src/server/domain → domain}/message/dto/list-messages.dto.js +0 -0
  119. /package/dist-server/{src/server/domain → domain}/message/dto/send-message.dto.js +0 -0
  120. /package/dist-server/{src/server/domain → domain}/message/message.controller.js +0 -0
  121. /package/dist-server/{src/server/domain → domain}/message/message.module.js +0 -0
  122. /package/dist-server/{src/server/domain → domain}/message/message.service.js +0 -0
  123. /package/dist-server/{src/server/domain → domain}/onboarding/onboarding.controller.js +0 -0
  124. /package/dist-server/{src/server/domain → domain}/onboarding/onboarding.module.js +0 -0
  125. /package/dist-server/{src/server/domain → domain}/onboarding/onboarding.service.js +0 -0
  126. /package/dist-server/{src/server/domain → domain}/onboarding/onboarding.types.js +0 -0
  127. /package/dist-server/{src/server/domain → domain}/onboarding/presets/custom.js +0 -0
  128. /package/dist-server/{src/server/domain → domain}/onboarding/presets/dev-team.js +0 -0
  129. /package/dist-server/{src/server/domain → domain}/onboarding/presets/index.js +0 -0
  130. /package/dist-server/{src/server/domain → domain}/onboarding/presets/marketing-team.js +0 -0
  131. /package/dist-server/{src/server/domain → domain}/onboarding/presets/planning-team.js +0 -0
  132. /package/dist-server/{src/server/domain → domain}/onboarding/presets/solo.js +0 -0
  133. /package/dist-server/{src/server/domain → domain}/project/dto/create-project.dto.js +0 -0
  134. /package/dist-server/{src/server/domain → domain}/project/dto/update-project.dto.js +0 -0
  135. /package/dist-server/{src/server/domain → domain}/project/project.controller.js +0 -0
  136. /package/dist-server/{src/server/domain → domain}/project/project.module.js +0 -0
  137. /package/dist-server/{src/server/domain → domain}/project/project.service.js +0 -0
  138. /package/dist-server/{src/server/domain → domain}/skill/dto/add-registry.dto.js +0 -0
  139. /package/dist-server/{src/server/domain → domain}/skill/dto/install-skill.dto.js +0 -0
  140. /package/dist-server/{src/server/domain → domain}/skill/skill.controller.js +0 -0
  141. /package/dist-server/{src/server/domain → domain}/skill/skill.module.js +0 -0
  142. /package/dist-server/{src/server/domain → domain}/skill/skill.service.js +0 -0
  143. /package/dist-server/{src/server/domain → domain}/task/dto/all-tasks.dto.js +0 -0
  144. /package/dist-server/{src/server/domain → domain}/task/dto/list-tasks.dto.js +0 -0
  145. /package/dist-server/{src/server/domain → domain}/task/dto/search-tasks.dto.js +0 -0
  146. /package/dist-server/{src/server/domain → domain}/task/dto/send-message.dto.js +0 -0
  147. /package/dist-server/{src/server/domain → domain}/task/dto/task-status.dto.js +0 -0
  148. /package/dist-server/{src/server/domain → domain}/task/dto/workspace-usage.dto.js +0 -0
  149. /package/dist-server/{src/server/domain → domain}/task/task.constants.js +0 -0
  150. /package/dist-server/{src/server/domain → domain}/task/task.controller.js +0 -0
  151. /package/dist-server/{src/server/domain → domain}/task/task.module.js +0 -0
  152. /package/dist-server/{src/server/domain → domain}/task/task.service.js +0 -0
  153. /package/dist-server/{src/server/domain → domain}/thread/dto/build-context.dto.js +0 -0
  154. /package/dist-server/{src/server/domain → domain}/thread/dto/list-messages.dto.js +0 -0
  155. /package/dist-server/{src/server/domain → domain}/thread/dto/list-threads.dto.js +0 -0
  156. /package/dist-server/{src/server/domain → domain}/thread/dto/search-threads.dto.js +0 -0
  157. /package/dist-server/{src/server/domain → domain}/thread/thread.controller.js +0 -0
  158. /package/dist-server/{src/server/domain → domain}/thread/thread.module.js +0 -0
  159. /package/dist-server/{src/server/domain → domain}/thread/thread.service.js +0 -0
  160. /package/dist-server/{src/server/domain → domain}/usage/usage.controller.js +0 -0
  161. /package/dist-server/{src/server/domain → domain}/usage/usage.module.js +0 -0
  162. /package/dist-server/{src/server/domain → domain}/usage/usage.service.js +0 -0
  163. /package/dist-server/{src/server/domain → domain}/usage/usage.types.js +0 -0
  164. /package/dist-server/{src/server/domain → domain}/wbs/wbs.controller.js +0 -0
  165. /package/dist-server/{src/server/domain → domain}/wbs/wbs.module.js +0 -0
  166. /package/dist-server/{src/server/domain → domain}/wbs/wbs.service.js +0 -0
  167. /package/dist-server/{src/server/domain → domain}/workflow/workflow.controller.js +0 -0
  168. /package/dist-server/{src/server/domain → domain}/workflow/workflow.module.js +0 -0
  169. /package/dist-server/{src/server/domain → domain}/workflow/workflow.service.js +0 -0
  170. /package/dist-server/{src/server/domain → domain}/workspace/dto/create-workspace.dto.js +0 -0
  171. /package/dist-server/{src/server/domain → domain}/workspace/dto/switch-workspace.dto.js +0 -0
  172. /package/dist-server/{src/server/domain → domain}/workspace/dto/workspace-info.dto.js +0 -0
  173. /package/dist-server/{src/server/domain → domain}/workspace/workspace.controller.js +0 -0
  174. /package/dist-server/{src/server/domain → domain}/workspace/workspace.module.js +0 -0
  175. /package/dist-server/{src/server/domain → domain}/workspace/workspace.service.js +0 -0
  176. /package/dist-server/{src/server/main.js → main.js} +0 -0
  177. /package/dist-server/{src/server/modules → modules}/crewx.module.js +0 -0
  178. /package/dist-server/{src/server/repository → repository}/base-sqlite.repository.js +0 -0
  179. /package/dist-server/{src/server/repository → repository}/box.repository.js +0 -0
  180. /package/dist-server/{src/server/repository → repository}/message.repository.js +0 -0
  181. /package/dist-server/{src/server/repository → repository}/project.repository.js +0 -0
  182. /package/dist-server/{src/server/repository → repository}/repository.module.js +0 -0
  183. /package/dist-server/{src/server/repository → repository}/request-log.repository.js +0 -0
  184. /package/dist-server/{src/server/repository → repository}/task.repository.js +0 -0
  185. /package/dist-server/{src/server/repository → repository}/thread.repository.js +0 -0
  186. /package/dist-server/{src/server/shared → shared}/crewx-home.js +0 -0
  187. /package/dist-server/{src/server/shared → shared}/crewx-state.js +0 -0
  188. /package/dist-server/{src/server/utils → utils}/tokenizer.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crewx",
3
- "version": "0.8.0-rc.82",
3
+ "version": "0.8.0-rc.83",
4
4
  "description": "CrewX — AI agent team dashboard with Electron UI and CLI (Web + Electron + Global CLI)",
5
5
  "main": "server.js",
6
6
  "bin": {
@@ -92,16 +92,16 @@
92
92
  "yargs": "^17.7.0",
93
93
  "zod": "^3.22.0",
94
94
  "zustand": "^4.5.0",
95
- "@crewx/cli": "0.8.0-rc.82",
96
- "@crewx/cron": "0.1.6",
95
+ "@crewx/cli": "0.8.0-rc.83",
97
96
  "@crewx/doc": "0.1.6",
98
- "@crewx/sdk": "0.8.0-rc.82",
97
+ "@crewx/cron": "0.1.6",
98
+ "@crewx/sdk": "0.8.0-rc.83",
99
99
  "@crewx/memory": "0.1.8",
100
100
  "@crewx/search": "0.1.6",
101
- "@crewx/shared": "0.0.4",
102
- "@crewx/wbs": "0.1.7",
101
+ "@crewx/skill": "0.1.5",
103
102
  "@crewx/workflow": "0.3.6",
104
- "@crewx/skill": "0.1.5"
103
+ "@crewx/wbs": "0.1.7",
104
+ "@crewx/shared": "0.0.4"
105
105
  },
106
106
  "devDependencies": {
107
107
  "@nestjs/cli": "^11.0.16",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewx/cli",
3
- "version": "0.8.0-rc.82",
3
+ "version": "0.8.0-rc.83",
4
4
  "license": "UNLICENSED",
5
5
  "engines": {
6
6
  "node": ">=20.19.0"
@@ -1,86 +0,0 @@
1
- "use strict";
2
- /**
3
- * createAdapterContext — builds an AdapterContext for an adapter instance.
4
- *
5
- * M1: respondSync uses AsyncLocalStorage to bind the current HTTP response.
6
- * When called inside a registerRoute handler (sync window), respondSync writes
7
- * to the HTTP res. When called outside the sync window, it performs graceful
8
- * degradation: logs a warning instead of throwing (PoC correction #3).
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.getSyncWindowStore = getSyncWindowStore;
12
- exports.runInSyncWindow = runInSyncWindow;
13
- exports.createAdapterContext = createAdapterContext;
14
- const async_hooks_1 = require("async_hooks");
15
- const syncWindowStore = new async_hooks_1.AsyncLocalStorage();
16
- function getSyncWindowStore() {
17
- return syncWindowStore;
18
- }
19
- function runInSyncWindow(window, fn) {
20
- return syncWindowStore.run(window, fn);
21
- }
22
- function createAdapterContext(opts) {
23
- const log = opts.log ?? opts.logger ?? {
24
- debug: () => { },
25
- info: () => { },
26
- warn: () => { },
27
- error: () => { },
28
- };
29
- const agentRunner = opts.agentRunner ?? {
30
- run: async () => ({ output: '' }),
31
- };
32
- const db = opts.db ?? {
33
- get: async () => undefined,
34
- set: async () => { },
35
- delete: async () => false,
36
- list: async () => [],
37
- };
38
- const storage = opts.storage ?? {
39
- put: async () => '',
40
- get: async () => undefined,
41
- delete: async () => false,
42
- };
43
- const audit = opts.audit ?? {
44
- log: async () => { },
45
- };
46
- const inbound = opts.onInbound ?? (async () => ({ accepted: true }));
47
- const emitEventFn = opts.onEmitEvent ?? (async () => ({ accepted: true }));
48
- const updateMessage = opts.onUpdateMessage ?? (async () => { });
49
- const resolveUser = opts.onResolveUser ?? (async (userId) => ({
50
- userId,
51
- displayName: userId,
52
- }));
53
- const respondSync = async (payload) => {
54
- const window = syncWindowStore.getStore();
55
- if (!window) {
56
- log.warn('respondSync called outside sync window — graceful degradation (no-op)', {
57
- textPreview: typeof payload === 'object' && 'text' in payload ? payload.text.slice(0, 80) : undefined,
58
- });
59
- return;
60
- }
61
- const text = 'text' in payload ? payload.text : '';
62
- window.res.status(200).json({ text });
63
- };
64
- const httpRouter = opts.httpRouter ?? {
65
- registerRoute: () => {
66
- log.warn('httpRouter not configured — registerRoute is a no-op');
67
- },
68
- };
69
- return {
70
- instanceId: opts.instanceId,
71
- config: opts.config,
72
- capabilities: opts.capabilities,
73
- log,
74
- agentRunner,
75
- db,
76
- storage,
77
- audit,
78
- abortSignal: opts.abortSignal ?? new AbortController().signal,
79
- httpRouter,
80
- inbound,
81
- emitEvent: emitEventFn,
82
- updateMessage,
83
- resolveUser,
84
- respondSync,
85
- };
86
- }
@@ -1,42 +0,0 @@
1
- "use strict";
2
- /**
3
- * ScopedAdapterStore — adapter key-value store with mandatory instanceId prefix.
4
- *
5
- * Security: Uses Map closure pattern (RT-1 defense).
6
- * The internal Map is captured in a function closure — no public or private
7
- * property on the returned AdapterStore object holds the raw Map reference.
8
- * Reflect / Object.getPrototypeOf / (ctx.db as any)['_rawStore'] all fail
9
- * because the Map only exists in the createScopedAdapterStore function scope.
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.createScopedAdapterStore = createScopedAdapterStore;
13
- function createScopedAdapterStore(instanceId) {
14
- const store = new Map();
15
- const prefixKey = (key) => {
16
- if (key.startsWith(`${instanceId}::`))
17
- return key;
18
- return `${instanceId}::${key}`;
19
- };
20
- return {
21
- async get(key) {
22
- const entry = store.get(prefixKey(key));
23
- return entry ? entry.value : undefined;
24
- },
25
- async set(key, value) {
26
- store.set(prefixKey(key), { value });
27
- },
28
- async delete(key) {
29
- return store.delete(prefixKey(key));
30
- },
31
- async list(prefix) {
32
- const fullPrefix = prefix ? prefixKey(prefix) : `${instanceId}::`;
33
- const keys = [];
34
- for (const k of store.keys()) {
35
- if (k.startsWith(fullPrefix)) {
36
- keys.push(k.slice(instanceId.length + 2));
37
- }
38
- }
39
- return keys;
40
- },
41
- };
42
- }
@@ -1,22 +0,0 @@
1
- "use strict";
2
- /**
3
- * Adapter Platform v0.4 — core types.
4
- * PoC corrections applied:
5
- * 1. AdapterError: class only (interface removed)
6
- * 2. kind: added 'config' for configuration errors
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.AdapterError = void 0;
10
- class AdapterError extends Error {
11
- code;
12
- kind;
13
- retryAfterMs;
14
- constructor(code, kind, retryAfterMs) {
15
- super(`AdapterError: ${code}`);
16
- this.name = 'AdapterError';
17
- this.code = code;
18
- this.kind = kind;
19
- this.retryAfterMs = retryAfterMs;
20
- }
21
- }
22
- exports.AdapterError = AdapterError;
@@ -1,45 +0,0 @@
1
- "use strict";
2
- /**
3
- * Agent resolver: looks up an agent from a list by ref.
4
- * Supports both bare id ('claude') and @mention format ('@claude').
5
- * Falls back to built-in provider shorthands (claude, gemini, copilot, codex).
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.AgentNotFoundError = void 0;
9
- exports.resolveAgent = resolveAgent;
10
- class AgentNotFoundError extends Error {
11
- constructor(agentRef, availableIds) {
12
- const available = availableIds.length > 0
13
- ? ` Available: ${availableIds.join(', ')}`
14
- : '';
15
- super(`Agent not found: "${agentRef}".${available}`);
16
- this.name = 'AgentNotFoundError';
17
- }
18
- }
19
- exports.AgentNotFoundError = AgentNotFoundError;
20
- /** Built-in provider shorthands that can be used without a crewx.yaml entry. */
21
- const BUILTIN_PROVIDERS = {
22
- claude: { id: 'claude', provider: 'cli/claude' },
23
- gemini: { id: 'gemini', provider: 'cli/gemini' },
24
- copilot: { id: 'copilot', provider: 'cli/copilot' },
25
- codex: { id: 'codex', provider: 'cli/codex' },
26
- };
27
- /**
28
- * Resolve an agent by reference.
29
- * @param agentRef - Agent reference: '@claude', 'claude', '@my_agent', etc.
30
- * @param agents - List of available agent configs.
31
- * @returns The matching AgentConfig.
32
- * @throws AgentNotFoundError when no match is found.
33
- */
34
- function resolveAgent(agentRef, agents) {
35
- const agentId = agentRef.startsWith('@') ? agentRef.slice(1) : agentRef;
36
- // 1. Look in YAML-defined agents first
37
- const agent = agents.find(a => a.id === agentId);
38
- if (agent)
39
- return agent;
40
- // 2. Fall back to built-in provider shorthands
41
- const builtin = BUILTIN_PROVIDERS[agentId];
42
- if (builtin)
43
- return builtin;
44
- throw new AgentNotFoundError(agentRef, agents.map(a => a.id));
45
- }
@@ -1,94 +0,0 @@
1
- "use strict";
2
- /**
3
- * YAML configuration loader for CrewX projects.
4
- * Reads crewx.yaml and validates it with Zod schema.
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.ConfigLoadError = void 0;
8
- exports.parseYamlContent = parseYamlContent;
9
- exports.loadYamlFile = loadYamlFile;
10
- const js_yaml_1 = require("js-yaml");
11
- const fs_1 = require("fs");
12
- const types_1 = require("../types");
13
- class ConfigLoadError extends Error {
14
- cause;
15
- constructor(message, cause) {
16
- super(message);
17
- this.cause = cause;
18
- this.name = 'ConfigLoadError';
19
- }
20
- }
21
- exports.ConfigLoadError = ConfigLoadError;
22
- /**
23
- * Parse YAML string into a validated CrewxProjectConfig.
24
- * Converts the agents record (keyed by id) into an array.
25
- */
26
- function parseYamlContent(yamlString) {
27
- if (!yamlString || typeof yamlString !== 'string' || !yamlString.trim()) {
28
- throw new ConfigLoadError('YAML content must be a non-empty string');
29
- }
30
- let raw;
31
- try {
32
- raw = (0, js_yaml_1.load)(yamlString);
33
- }
34
- catch (err) {
35
- throw new ConfigLoadError(`YAML parse error: ${err.message}`, err);
36
- }
37
- // Normalize agents: YAML has agents as a map (Record<id, config>),
38
- // but our type uses an array with 'id' field.
39
- const normalized = normalizeRaw(raw);
40
- const result = types_1.CrewxProjectConfigSchema.safeParse(normalized);
41
- if (!result.success) {
42
- throw new ConfigLoadError(`Config validation error: ${result.error.message}`);
43
- }
44
- return result.data;
45
- }
46
- /**
47
- * Load and parse crewx.yaml from a file path.
48
- */
49
- function loadYamlFile(filePath) {
50
- let content;
51
- try {
52
- content = (0, fs_1.readFileSync)(filePath, 'utf-8');
53
- }
54
- catch (err) {
55
- throw new ConfigLoadError(`Cannot read file: ${filePath}`, err);
56
- }
57
- return parseYamlContent(content);
58
- }
59
- /**
60
- * Normalize raw YAML output:
61
- * - agents map (Record<id, agentConfig>) → agents array ([{ id, ...agentConfig }])
62
- */
63
- function normalizeRaw(raw) {
64
- if (!raw || typeof raw !== 'object') {
65
- return { agents: [] };
66
- }
67
- const obj = raw;
68
- // Gather agents as array (support map form and array form)
69
- let agentsArray;
70
- if (obj.agents && typeof obj.agents === 'object' && !Array.isArray(obj.agents)) {
71
- const agentsMap = obj.agents;
72
- agentsArray = Object.entries(agentsMap).map(([id, cfg]) => {
73
- const agentCfg = (cfg && typeof cfg === 'object' ? cfg : {});
74
- return { id, ...agentCfg };
75
- });
76
- }
77
- else if (Array.isArray(obj.agents)) {
78
- agentsArray = obj.agents;
79
- }
80
- else {
81
- return { ...obj, agents: [] };
82
- }
83
- // Normalize inline.provider → top-level provider (fallback for cross-repo yaml compat)
84
- const normalizedAgents = agentsArray.map(agent => {
85
- if (agent.provider === undefined && agent.inline && typeof agent.inline === 'object') {
86
- const inline = agent.inline;
87
- if (inline.provider !== undefined) {
88
- return { ...agent, provider: inline.provider };
89
- }
90
- }
91
- return agent;
92
- });
93
- return { ...obj, agents: normalizedAgents };
94
- }
@@ -1,177 +0,0 @@
1
- "use strict";
2
- /**
3
- * SqliteConversationProvider — reads/writes conversation history from ~/.crewx/crewx.db.
4
- *
5
- * Security:
6
- * - SEC-1: SELECT columns are explicitly whitelisted (no rendered_prompt, command, logs, metadata).
7
- * - SEC-2: All queries use parameterized bindings (? placeholders).
8
- * - Writes target `threads` table ONLY — `tasks` table writes are owned by SqliteTracingPlugin.
9
- */
10
- var __importDefault = (this && this.__importDefault) || function (mod) {
11
- return (mod && mod.__esModule) ? mod : { "default": mod };
12
- };
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.SqliteConversationProvider = void 0;
15
- const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
16
- const path_1 = require("path");
17
- const os_1 = require("os");
18
- const THREADS_DDL = `
19
- CREATE TABLE IF NOT EXISTS threads (
20
- id TEXT PRIMARY KEY,
21
- workspace_id TEXT,
22
- platform TEXT NOT NULL DEFAULT 'cli',
23
- title TEXT,
24
- first_message TEXT,
25
- last_message TEXT,
26
- message_count INTEGER NOT NULL DEFAULT 0,
27
- created_at TEXT NOT NULL,
28
- updated_at TEXT NOT NULL,
29
- metadata TEXT
30
- )
31
- `;
32
- const COLUMNS = [
33
- 'id', 'thread_id', 'prompt', 'result', 'started_at',
34
- 'trace_id', 'status', 'parent_task_id', 'agent_id',
35
- ];
36
- function stripCliNoise(content) {
37
- let cleaned = content.replace(/<conversation_history[^>]*>[\s\S]*?<\/conversation_history>/g, '');
38
- const lines = cleaned.split('\n');
39
- const cleanLines = lines.filter(line => {
40
- if (line.startsWith('Loaded ') && line.includes('layouts from'))
41
- return false;
42
- if (line.includes('[dotenv@'))
43
- return false;
44
- if (line.includes('[Nest]') && line.includes('DEBUG'))
45
- return false;
46
- if (line.startsWith('Registered custom layout:'))
47
- return false;
48
- if (line.startsWith('Updated custom layout:'))
49
- return false;
50
- return true;
51
- });
52
- return cleanLines.join('\n').trim();
53
- }
54
- function cleanResult(raw) {
55
- if (!raw)
56
- return '';
57
- let content = raw;
58
- try {
59
- const parsed = JSON.parse(content);
60
- if (Array.isArray(parsed)) {
61
- content = parsed
62
- .filter((c) => c?.type === 'text' && c?.text)
63
- .map((c) => c.text)
64
- .join('\n');
65
- }
66
- else if (parsed && typeof parsed === 'object' && parsed.result !== undefined) {
67
- content = parsed.result || '';
68
- }
69
- }
70
- catch {
71
- content = stripCliNoise(content);
72
- }
73
- return content;
74
- }
75
- class SqliteConversationProvider {
76
- db;
77
- constructor(dbPath) {
78
- const resolved = dbPath ?? (0, path_1.join)((0, os_1.homedir)(), '.crewx', 'crewx.db');
79
- this.db = new better_sqlite3_1.default(resolved);
80
- this.init();
81
- }
82
- init() {
83
- this.db.pragma('journal_mode = WAL');
84
- this.db.exec(THREADS_DDL);
85
- }
86
- async ensureThread(threadId, platform, workspaceId) {
87
- const row = this.db.prepare('SELECT platform FROM threads WHERE id = ?').get(threadId);
88
- if (row) {
89
- if (row.platform !== platform) {
90
- throw new Error(`Thread '${threadId}' already exists with platform '${row.platform}' — cannot change to '${platform}' (platform is immutable)`);
91
- }
92
- // Backfill workspace_id if missing on existing thread (WI-CONV-003)
93
- if (workspaceId) {
94
- this.db.prepare('UPDATE threads SET workspace_id = COALESCE(workspace_id, ?) WHERE id = ?').run(workspaceId, threadId);
95
- }
96
- return;
97
- }
98
- const now = new Date().toISOString();
99
- this.db.prepare('INSERT INTO threads (id, platform, workspace_id, message_count, created_at, updated_at) VALUES (?, ?, ?, 0, ?, ?)').run(threadId, platform, workspaceId ?? null, now, now);
100
- }
101
- async fetchHistory(threadId, options) {
102
- const limit = options?.limit ?? 100;
103
- const conditions = [
104
- 'thread_id = ?',
105
- '(parent_task_id IS NULL OR parent_task_id = \'\')',
106
- '(status IN (\'done\', \'completed\', \'success\') OR status IS NULL)',
107
- ];
108
- const params = [threadId];
109
- if (options?.currentTraceId) {
110
- conditions.push('trace_id != ?');
111
- params.push(options.currentTraceId);
112
- }
113
- const where = conditions.join(' AND ');
114
- const selectCols = COLUMNS.join(', ');
115
- const sql = `SELECT ${selectCols} FROM tasks WHERE ${where} ORDER BY started_at ASC LIMIT ?`;
116
- params.push(limit);
117
- const rows = this.db.prepare(sql).all(...params);
118
- const threadRow = this.db.prepare('SELECT platform, title, first_message, last_message, message_count, updated_at FROM threads WHERE id = ?').get(threadId);
119
- const platform = threadRow?.platform ?? 'cli';
120
- const messages = this.rowsToMessages(rows);
121
- return {
122
- threadId,
123
- platform: platform,
124
- messages,
125
- metadata: {
126
- title: threadRow?.title ?? undefined,
127
- firstMessage: threadRow?.first_message ?? undefined,
128
- lastMessage: threadRow?.last_message ?? undefined,
129
- messageCount: threadRow?.message_count ?? 0,
130
- updatedAt: threadRow?.updated_at ? new Date(threadRow.updated_at).getTime() : undefined,
131
- },
132
- };
133
- }
134
- async saveUserMessage(threadId, text, _userId, _metadata) {
135
- const now = new Date().toISOString();
136
- this.db.prepare(`UPDATE threads
137
- SET first_message = COALESCE(first_message, ?),
138
- last_message = ?,
139
- message_count = message_count + 1,
140
- updated_at = ?
141
- WHERE id = ?`).run(text, text, now, threadId);
142
- }
143
- async saveAssistantMessage(threadId, text, _agentId, _metadata) {
144
- const now = new Date().toISOString();
145
- this.db.prepare(`UPDATE threads
146
- SET last_message = ?,
147
- updated_at = ?
148
- WHERE id = ?`).run(text, now, threadId);
149
- }
150
- close() {
151
- this.db.close();
152
- }
153
- rowsToMessages(rows) {
154
- const messages = [];
155
- for (const row of rows) {
156
- if (row.prompt) {
157
- messages.push({
158
- id: `${row.id}-user`,
159
- text: row.prompt,
160
- isAssistant: false,
161
- timestamp: new Date(row.started_at).getTime(),
162
- });
163
- }
164
- const cleaned = cleanResult(row.result);
165
- if (cleaned) {
166
- messages.push({
167
- id: `${row.id}-assistant`,
168
- text: cleaned,
169
- isAssistant: true,
170
- timestamp: new Date(row.started_at).getTime(),
171
- });
172
- }
173
- }
174
- return messages;
175
- }
176
- }
177
- exports.SqliteConversationProvider = SqliteConversationProvider;
@@ -1,33 +0,0 @@
1
- "use strict";
2
- /**
3
- * toTemplateMessages — maps ConversationThread messages to TemplateMessage[]
4
- * for consumption by the formatConversation block helper.
5
- *
6
- * Includes SEC-M1 sanitization at the provider boundary:
7
- * <, > are entity-escaped to prevent XML structure tag injection in the
8
- * <conversation_history> block.
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.toTemplateMessages = toTemplateMessages;
12
- /**
13
- * SEC-M1: sanitize message text to prevent conversation_history XML block pollution.
14
- * User input containing </conversation_history> or <system_prompt> could be
15
- * misinterpreted by the LLM as breaking out of the structured block.
16
- */
17
- function sanitizeMessageText(text) {
18
- if (typeof text !== 'string')
19
- return '';
20
- return text.replace(/</g, '&lt;').replace(/>/g, '&gt;');
21
- }
22
- /**
23
- * Convert a ConversationThread to a TemplateMessage array suitable for
24
- * formatConversation block helper consumption.
25
- */
26
- function toTemplateMessages(thread) {
27
- return thread.messages.map(m => ({
28
- text: sanitizeMessageText(m.text),
29
- isAssistant: m.isAssistant,
30
- metadata: m.metadata,
31
- files: undefined,
32
- }));
33
- }
@@ -1,9 +0,0 @@
1
- "use strict";
2
- /**
3
- * Conversation history types — SDK public API for reading/writing thread history.
4
- *
5
- * **Security (SEC-3):** history content is untrusted user input.
6
- * Consumers (e.g. Phase 2 CLI wiring) MUST delimit history from system prompts
7
- * using structured blocks (e.g. `[HISTORY START]...[HISTORY END]`).
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,64 +0,0 @@
1
- "use strict";
2
- /**
3
- * TypedEventEmitter — typed wrapper around Node's EventEmitter.
4
- *
5
- * Design:
6
- * - `on` / `once` are public (callers subscribe)
7
- * - `emit` is protected (only subclasses like Crewx can emit)
8
- * - Async listeners are supported (fire-and-forget, errors isolated)
9
- * - Returns an UnsubscribeFn from on/once for easy cleanup
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.TypedEventEmitter = void 0;
13
- const events_1 = require("events");
14
- /**
15
- * Wraps a listener to isolate errors and support async fire-and-forget.
16
- */
17
- function makeSafeListener(event, listener) {
18
- return (payload) => {
19
- try {
20
- const result = listener(payload);
21
- if (result instanceof Promise) {
22
- result.catch((err) => {
23
- // Fire-and-forget: isolate async listener errors
24
- console.error(`[crewx] event listener error (${event}): ${err instanceof Error ? err.message : String(err)}`);
25
- });
26
- }
27
- }
28
- catch (err) {
29
- // Synchronous listener error — log and continue
30
- console.error(`[crewx] event listener error (${event}): ${err instanceof Error ? err.message : String(err)}`);
31
- }
32
- };
33
- }
34
- class TypedEventEmitter {
35
- _emitter = new events_1.EventEmitter();
36
- /**
37
- * Subscribe to an event. Returns an unsubscribe function.
38
- *
39
- * @example
40
- * const unsub = crewx.on('task:start', (e) => console.log(e.agentRef));
41
- * // later:
42
- * unsub();
43
- */
44
- on(event, listener) {
45
- const safeListener = makeSafeListener(event, listener);
46
- this._emitter.on(event, safeListener);
47
- return () => this._emitter.off(event, safeListener);
48
- }
49
- /**
50
- * Subscribe to an event exactly once.
51
- */
52
- once(event, listener) {
53
- const safeListener = makeSafeListener(event, listener);
54
- this._emitter.once(event, safeListener);
55
- return () => this._emitter.off(event, safeListener);
56
- }
57
- /**
58
- * Emit an event with payload. Only accessible to subclasses.
59
- */
60
- emit(event, payload) {
61
- this._emitter.emit(event, payload);
62
- }
63
- }
64
- exports.TypedEventEmitter = TypedEventEmitter;
@@ -1,8 +0,0 @@
1
- "use strict";
2
- /**
3
- * Event types for the CrewX SDK event system.
4
- *
5
- * SDK emits events; callers (CLI, users) subscribe to persist or react.
6
- * No DB dependencies in the SDK — storage is the caller's responsibility.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });