@crewx/sdk 0.8.0-rc.80 → 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 (217) hide show
  1. package/dist/__tests__/adapter/context-builder.test.d.ts +1 -0
  2. package/dist/__tests__/adapter/plugin-helper.test.d.ts +1 -0
  3. package/dist/__tests__/adapter/registration-integration.test.d.ts +1 -0
  4. package/dist/__tests__/adapter/scoped-store.test.d.ts +1 -0
  5. package/dist/__tests__/plugins/conversation.test.d.ts +1 -0
  6. package/dist/__tests__/testing/createMockContext.test.d.ts +1 -0
  7. package/dist/adapter/context-builder.d.ts +0 -9
  8. package/dist/adapter/index.d.ts +0 -1
  9. package/dist/adapter/plugin-helper.d.ts +0 -7
  10. package/dist/adapter/scoped-store.d.ts +0 -10
  11. package/dist/adapter/types.d.ts +0 -7
  12. package/dist/agent/resolver.d.ts +0 -13
  13. package/dist/boxing/box-storage.interface.d.ts +0 -4
  14. package/dist/boxing/box.service.d.ts +0 -4
  15. package/dist/boxing/box.types.d.ts +0 -4
  16. package/dist/boxing/context-builder.d.ts +0 -4
  17. package/dist/client/CrewxClient.d.ts +0 -32
  18. package/dist/client/index.d.ts +0 -1
  19. package/dist/client/index.js +1 -6
  20. package/dist/config/loader.browser.d.ts +0 -8
  21. package/dist/config/loader.d.ts +0 -12
  22. package/dist/conversation/__tests__/sqlite-provider.test.d.ts +1 -0
  23. package/dist/conversation/__tests__/to-task-reader.test.d.ts +1 -0
  24. package/dist/conversation/index.d.ts +0 -1
  25. package/dist/conversation/sqlite-provider.d.ts +0 -9
  26. package/dist/conversation/to-task-reader.d.ts +0 -11
  27. package/dist/conversation/to-template-messages.d.ts +0 -13
  28. package/dist/conversation/types.d.ts +0 -58
  29. package/dist/esm/client/index.js +1 -0
  30. package/dist/esm/hooks/index.js +7 -0
  31. package/dist/esm/index.js +79 -0
  32. package/dist/esm/plugins/index.js +52 -0
  33. package/dist/esm/testing/index.js +1 -0
  34. package/dist/esm/tools/node/index.js +36 -0
  35. package/dist/events/TypedEventEmitter.d.ts +0 -24
  36. package/dist/events/types.d.ts +0 -43
  37. package/dist/facade/Crewx.browser.d.ts +0 -40
  38. package/dist/facade/Crewx.d.ts +0 -163
  39. package/dist/hooks/define.d.ts +0 -1
  40. package/dist/hooks/dispatch.d.ts +0 -12
  41. package/dist/hooks/index.d.ts +0 -1
  42. package/dist/hooks/index.js +7 -24
  43. package/dist/hooks/observer.d.ts +0 -1
  44. package/dist/hooks/plugin.d.ts +0 -1
  45. package/dist/hooks/tool-normalize.d.ts +0 -26
  46. package/dist/hooks/types.d.ts +0 -1
  47. package/dist/hooks/yaml-plugin.d.ts +0 -1
  48. package/dist/index.browser.d.ts +0 -7
  49. package/dist/index.browser.js +2 -25
  50. package/dist/index.d.ts +0 -4
  51. package/dist/index.js +79 -151
  52. package/dist/layout/loader.d.ts +0 -20
  53. package/dist/layout/props-validator.d.ts +0 -6
  54. package/dist/layout/renderer.d.ts +0 -24
  55. package/dist/layout/types.d.ts +0 -42
  56. package/dist/parallel/agent-runtime.d.ts +0 -11
  57. package/dist/parallel/helpers.d.ts +0 -1
  58. package/dist/parallel/index.d.ts +0 -1
  59. package/dist/parallel/parallel-runner.d.ts +0 -8
  60. package/dist/parallel/types.d.ts +0 -24
  61. package/dist/parsers/agent-call.util.d.ts +0 -3
  62. package/dist/parsers/claude.parser.d.ts +0 -8
  63. package/dist/parsers/codex.parser.d.ts +0 -8
  64. package/dist/parsers/copilot.parser.d.ts +0 -9
  65. package/dist/parsers/gemini.parser.d.ts +0 -10
  66. package/dist/parsers/opencode.parser.d.ts +0 -10
  67. package/dist/parsers/router.d.ts +0 -5
  68. package/dist/paths.d.ts +1 -0
  69. package/dist/platform/BrowserFsAdapter.d.ts +0 -20
  70. package/dist/platform/IFsAdapter.d.ts +0 -23
  71. package/dist/platform/NodeFsAdapter.d.ts +0 -8
  72. package/dist/plugin/plugin-provider.d.ts +0 -22
  73. package/dist/plugin/types.d.ts +0 -31
  74. package/dist/plugin.d.ts +0 -27
  75. package/dist/plugins/conversation.d.ts +0 -2
  76. package/dist/plugins/file-logger.d.ts +0 -13
  77. package/dist/plugins/index.d.ts +0 -10
  78. package/dist/plugins/index.js +52 -19
  79. package/dist/plugins/sqlite-tracing.d.ts +0 -13
  80. package/dist/plugins/sqlite-tracing.spec.d.ts +1 -0
  81. package/dist/provider/bridge.browser.d.ts +0 -20
  82. package/dist/provider/bridge.d.ts +0 -47
  83. package/dist/provider/parse-usage.d.ts +0 -14
  84. package/dist/provider/register-api.d.ts +0 -7
  85. package/dist/provider/vercel-runtime.d.ts +0 -29
  86. package/dist/remote/index.d.ts +0 -6
  87. package/dist/remote/remote-agent-manager.d.ts +0 -31
  88. package/dist/remote/remote-provider.d.ts +0 -15
  89. package/dist/remote/remote-transport.d.ts +0 -17
  90. package/dist/remote/types.d.ts +0 -59
  91. package/dist/server/auth.d.ts +0 -16
  92. package/dist/server/handler.d.ts +0 -17
  93. package/dist/server/index.d.ts +0 -4
  94. package/dist/server/tool-adapter.d.ts +0 -16
  95. package/dist/template/engine.d.ts +0 -19
  96. package/dist/template/helpers/exec.browser.d.ts +0 -7
  97. package/dist/template/helpers/exec.d.ts +0 -45
  98. package/dist/template/helpers/fenced_code.d.ts +0 -16
  99. package/dist/template/helpers/format-conversation.d.ts +0 -22
  100. package/dist/template/helpers/include.d.ts +0 -15
  101. package/dist/template/helpers/p1p2.d.ts +0 -32
  102. package/dist/template/loader/DocumentLoader.d.ts +0 -30
  103. package/dist/template/types.d.ts +0 -30
  104. package/dist/testing/index.d.ts +0 -1
  105. package/dist/testing/index.js +1 -16
  106. package/dist/testing/mock-audit.d.ts +0 -1
  107. package/dist/testing/mock-context.d.ts +0 -1
  108. package/dist/testing/mock-logger.d.ts +0 -1
  109. package/dist/testing/mock-router.d.ts +0 -1
  110. package/dist/testing/mock-storage.d.ts +0 -1
  111. package/dist/testing/mock-store.d.ts +0 -1
  112. package/dist/tools/delegate.d.ts +0 -7
  113. package/dist/tools/index.d.ts +0 -4
  114. package/dist/tools/node/builtin.d.ts +0 -16
  115. package/dist/tools/node/index.d.ts +0 -20
  116. package/dist/tools/node/index.js +36 -59
  117. package/dist/types/index.d.ts +0 -20
  118. package/dist/types/task-log.types.d.ts +0 -4
  119. package/dist/utils/env-defaults.d.ts +0 -16
  120. package/dist/utils/glob-match.d.ts +0 -16
  121. package/dist/utils/id.d.ts +0 -15
  122. package/dist/utils/timestamp.d.ts +0 -1
  123. package/dist/utils/workspace.d.ts +0 -4
  124. package/package.json +24 -25
  125. package/dist/adapter/context-builder.js +0 -87
  126. package/dist/adapter/index.js +0 -21
  127. package/dist/adapter/plugin-helper.js +0 -45
  128. package/dist/adapter/scoped-store.js +0 -43
  129. package/dist/adapter/types.js +0 -23
  130. package/dist/agent/resolver.js +0 -46
  131. package/dist/boxing/box-storage.interface.js +0 -6
  132. package/dist/boxing/box.service.js +0 -73
  133. package/dist/boxing/box.types.js +0 -6
  134. package/dist/boxing/context-builder.js +0 -79
  135. package/dist/client/CrewxClient.js +0 -86
  136. package/dist/config/loader.browser.js +0 -59
  137. package/dist/config/loader.js +0 -95
  138. package/dist/conversation/index.js +0 -25
  139. package/dist/conversation/sqlite-provider.js +0 -178
  140. package/dist/conversation/to-task-reader.js +0 -28
  141. package/dist/conversation/to-template-messages.js +0 -34
  142. package/dist/conversation/types.js +0 -10
  143. package/dist/events/TypedEventEmitter.js +0 -65
  144. package/dist/events/types.js +0 -9
  145. package/dist/facade/Crewx.browser.js +0 -314
  146. package/dist/facade/Crewx.js +0 -1299
  147. package/dist/hooks/define.js +0 -13
  148. package/dist/hooks/dispatch.js +0 -147
  149. package/dist/hooks/observer.js +0 -60
  150. package/dist/hooks/plugin.js +0 -17
  151. package/dist/hooks/tool-normalize.js +0 -110
  152. package/dist/hooks/types.js +0 -12
  153. package/dist/hooks/yaml-plugin.js +0 -356
  154. package/dist/layout/loader.js +0 -305
  155. package/dist/layout/props-validator.js +0 -301
  156. package/dist/layout/renderer.js +0 -193
  157. package/dist/layout/types.js +0 -36
  158. package/dist/parallel/agent-runtime.js +0 -25
  159. package/dist/parallel/helpers.js +0 -219
  160. package/dist/parallel/index.js +0 -13
  161. package/dist/parallel/parallel-runner.js +0 -226
  162. package/dist/parallel/types.js +0 -6
  163. package/dist/parsers/agent-call.util.js +0 -19
  164. package/dist/parsers/claude.parser.js +0 -67
  165. package/dist/parsers/codex.parser.js +0 -100
  166. package/dist/parsers/copilot.parser.js +0 -66
  167. package/dist/parsers/gemini.parser.js +0 -46
  168. package/dist/parsers/opencode.parser.js +0 -76
  169. package/dist/parsers/router.js +0 -56
  170. package/dist/platform/BrowserFsAdapter.js +0 -84
  171. package/dist/platform/IFsAdapter.js +0 -3
  172. package/dist/platform/NodeFsAdapter.js +0 -38
  173. package/dist/plugin/plugin-provider.js +0 -207
  174. package/dist/plugin/types.js +0 -9
  175. package/dist/plugin.js +0 -29
  176. package/dist/plugins/conversation.js +0 -59
  177. package/dist/plugins/file-logger.js +0 -87
  178. package/dist/plugins/sqlite-tracing.js +0 -112
  179. package/dist/provider/bridge.browser.js +0 -49
  180. package/dist/provider/bridge.js +0 -381
  181. package/dist/provider/parse-usage.js +0 -83
  182. package/dist/provider/register-api.js +0 -24
  183. package/dist/provider/vercel-runtime.js +0 -347
  184. package/dist/remote/index.js +0 -32
  185. package/dist/remote/remote-agent-manager.js +0 -198
  186. package/dist/remote/remote-provider.js +0 -141
  187. package/dist/remote/remote-transport.js +0 -83
  188. package/dist/remote/types.js +0 -9
  189. package/dist/server/auth.js +0 -35
  190. package/dist/server/handler.js +0 -75
  191. package/dist/server/index.js +0 -9
  192. package/dist/server/tool-adapter.js +0 -95
  193. package/dist/template/engine.js +0 -137
  194. package/dist/template/helpers/exec.browser.js +0 -41
  195. package/dist/template/helpers/exec.js +0 -230
  196. package/dist/template/helpers/fenced_code.js +0 -20
  197. package/dist/template/helpers/format-conversation.js +0 -53
  198. package/dist/template/helpers/include.js +0 -23
  199. package/dist/template/helpers/p1p2.js +0 -90
  200. package/dist/template/loader/DocumentLoader.js +0 -128
  201. package/dist/template/types.js +0 -6
  202. package/dist/testing/mock-audit.js +0 -13
  203. package/dist/testing/mock-context.js +0 -68
  204. package/dist/testing/mock-logger.js +0 -27
  205. package/dist/testing/mock-router.js +0 -67
  206. package/dist/testing/mock-storage.js +0 -21
  207. package/dist/testing/mock-store.js +0 -8
  208. package/dist/tools/delegate.js +0 -60
  209. package/dist/tools/index.js +0 -9
  210. package/dist/tools/node/builtin.js +0 -547
  211. package/dist/types/index.js +0 -32
  212. package/dist/types/task-log.types.js +0 -6
  213. package/dist/utils/env-defaults.js +0 -27
  214. package/dist/utils/glob-match.js +0 -42
  215. package/dist/utils/id.js +0 -50
  216. package/dist/utils/timestamp.js +0 -13
  217. package/dist/utils/workspace.js +0 -58
@@ -1,24 +1,7 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatDenyOutput = exports.formatInjectOutput = exports.buildHookContext = exports.isPathSafe = exports.sanitizeInjectMessage = exports.sanitizeDenyReason = exports.evaluateHook = exports.Tools = exports.validateHooksSchema = exports.YamlHookPlugin = exports.definePlugin = exports.defineHookPlugin = exports.HookPlugin = exports.ToolObserverPlugin = void 0;
4
- var observer_1 = require("./observer");
5
- Object.defineProperty(exports, "ToolObserverPlugin", { enumerable: true, get: function () { return observer_1.ToolObserverPlugin; } });
6
- var plugin_1 = require("./plugin");
7
- Object.defineProperty(exports, "HookPlugin", { enumerable: true, get: function () { return plugin_1.HookPlugin; } });
8
- Object.defineProperty(exports, "defineHookPlugin", { enumerable: true, get: function () { return plugin_1.defineHookPlugin; } });
9
- var define_1 = require("./define");
10
- Object.defineProperty(exports, "definePlugin", { enumerable: true, get: function () { return define_1.definePlugin; } });
11
- var yaml_plugin_1 = require("./yaml-plugin");
12
- Object.defineProperty(exports, "YamlHookPlugin", { enumerable: true, get: function () { return yaml_plugin_1.YamlHookPlugin; } });
13
- Object.defineProperty(exports, "validateHooksSchema", { enumerable: true, get: function () { return yaml_plugin_1.validateHooksSchema; } });
14
- var types_1 = require("./types");
15
- Object.defineProperty(exports, "Tools", { enumerable: true, get: function () { return types_1.Tools; } });
16
- var dispatch_1 = require("./dispatch");
17
- Object.defineProperty(exports, "evaluateHook", { enumerable: true, get: function () { return dispatch_1.evaluateHook; } });
18
- Object.defineProperty(exports, "sanitizeDenyReason", { enumerable: true, get: function () { return dispatch_1.sanitizeDenyReason; } });
19
- Object.defineProperty(exports, "sanitizeInjectMessage", { enumerable: true, get: function () { return dispatch_1.sanitizeInjectMessage; } });
20
- Object.defineProperty(exports, "isPathSafe", { enumerable: true, get: function () { return dispatch_1.isPathSafe; } });
21
- Object.defineProperty(exports, "buildHookContext", { enumerable: true, get: function () { return dispatch_1.buildHookContext; } });
22
- Object.defineProperty(exports, "formatInjectOutput", { enumerable: true, get: function () { return dispatch_1.formatInjectOutput; } });
23
- Object.defineProperty(exports, "formatDenyOutput", { enumerable: true, get: function () { return dispatch_1.formatDenyOutput; } });
24
- //# sourceMappingURL=index.js.map
1
+ 'use strict';var crypto=require('crypto'),path=require('path'),os=require('os'),fs=require('fs');var F=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var f=class{detach(e){}};var p=class extends f{unsubs=[];attach(e){if(this.on.beforeTool){let t=e.on("tool:observed:before",async o=>{if(!this.matchesTool(this.on.beforeTool,o.tool.name))return;let r=this.buildContext("beforeTool",o);await this.run(r);});this.unsubs.push(t);}if(this.on.afterTool){let t=e.on("tool:observed:after",async o=>{if(!this.matchesTool(this.on.afterTool,o.tool.name))return;let r=this.buildContext("afterTool",o);await this.run(r);});this.unsubs.push(t);}}async detach(e){for(let t of this.unsubs)t();this.unsubs=[];}matchesTool(e,t){return e===true?true:e.includes(t)}buildContext(e,t){return {event:e,traceId:t.traceId,agent:{id:t.agentId||t.agentRef,role:"",team:""},provider:t.provider,thread:{id:t.threadId||""},tool:{name:t.tool.name,rawName:t.tool.rawName,input:"input"in t.tool?t.tool.input:void 0},cwd:process.cwd(),sessionId:t.sessionId||"",pass:()=>({type:"pass"})}}};var c=class{capabilities={required:[]}};function D(n){return new class extends c{name=n.name;version=n.version;capabilities=n.capabilities??{required:[]};run=n.run}}function j(n){return new class extends p{name=n.name;version=n.version;on=n.on;run=n.run}}function M(n){let e=r=>r.replace(/[.+^${}()|[\]\\]/g,"\\$&"),o=n.split("/").map(r=>r==="**"?".*":r.split("*").map(e).join("[^/]*"));return new RegExp(`^${o.join("\\/")}$`)}function h(n,e){try{return M(e).test(n)}catch{return false}}var i={FileRead:"file.read",FileWrite:"file.write",FileEdit:"file.edit",Shell:"shell",Search:"search",Other:"other"};var A={Read:i.FileRead,Write:i.FileWrite,Edit:i.FileEdit,MultiEdit:i.FileEdit,NotebookEdit:i.FileEdit,Bash:i.Shell,Grep:i.Search,Glob:i.Search},z={read_file:i.FileRead,write_file:i.FileWrite,replace:i.FileEdit,edit:i.FileEdit,run_shell_command:i.Shell,search_file_content:i.Search,glob:i.Search},W={read:i.FileRead,write:i.FileWrite,edit:i.FileEdit,shell:i.Shell,bash:i.Shell,search:i.Search,grep:i.Search},L={"file.read":i.FileRead,"file.write":i.FileWrite,"file.edit":i.FileEdit,read:i.FileRead,write:i.FileWrite,edit:i.FileEdit,bash:i.Shell,shell:i.Shell,grep:i.Search,glob:i.Search},$={Bash:i.Shell,bash:i.Shell},G={claude:A,codex:$,gemini:z,copilot:W,opencode:L};function v(n,e){let t=X(e);if(t){let o=G[t][n];if(o)return o}return Object.values(i).includes(n)?n:i.Other}function X(n){let e=n.toLowerCase();return e.includes("claude")?"claude":e.includes("codex")?"codex":e.includes("gemini")?"gemini":e.includes("copilot")?"copilot":e.includes("opencode")?"opencode":null}var x=200,H=2e3;function R(n){let e=n.replace(/[\x00-\x1f\x7f\u2028\u2029]/g,"");return e.length<=x?e:e.slice(0,x-11)+" [redacted]"}function m(n){let e=n.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f\u2028\u2029]/g,"");return e.length<=H?e:e.slice(0,H-11)+" [redacted]"}function Y(n,e){let t=path.resolve(n),o=path.resolve(e);return !(path.relative(o,t).startsWith("..")||path.resolve(t).startsWith("/etc/")||path.resolve(t).startsWith("/usr/")||t.includes("node_modules"))}function q(n){return n==="codex"?"codex":"claude"}function w(n,e,t){return n==="codex"?{hookSpecificOutput:{hookEventName:e,permissionDecision:"allow",systemMessage:t}}:{hookSpecificOutput:{hookEventName:e,permissionDecision:"allow",additionalContext:t}}}function C(n,e,t){return {hookSpecificOutput:{hookEventName:e,permissionDecision:"deny",permissionDecisionReason:t}}}function O(n,e,t="cli/claude"){let o=t||process.env.CREWX_PROVIDER||"cli/claude";return {event:"beforeTool",traceId:n.tool_use_id||"",agent:{id:process.env.CREWX_AGENT_ID||"",role:process.env.CREWX_AGENT_ROLE||"",team:process.env.CREWX_AGENT_TEAM||""},provider:o,thread:{id:process.env.CREWX_THREAD_ID||""},tool:{name:v(n.tool_name,o),rawName:n.tool_name,input:n.tool_input},cwd:e||n.cwd,sessionId:n.session_id||process.env.CREWX_SESSION_ID||"",pass:()=>({type:"pass"}),deny:r=>({type:"deny",reason:r}),inject:r=>({type:"inject",message:r}),modify:r=>({type:"modify",patch:r})}}async function J(n,e,t,o="cli/claude"){let r=O(e,t,o),s=await n.run(r),l=q(o),a={hookSpecificOutput:{hookEventName:e.hook_event_name,permissionDecision:"allow"}};switch(s.type){case "pass":return {exitCode:0,stdout:a,injected:false};case "deny":{let d=R(s.reason);return {exitCode:2,stdout:C(l,e.hook_event_name,d),injected:false}}case "inject":{let d=m(s.message);return {exitCode:0,stdout:w(l,e.hook_event_name,d),injected:true}}case "modify":return console.error(`[crewx] Hook result type '${s.type}' is not supported in Phase 0. Plugin: ${n.name}. Treating as pass.`),{exitCode:0,stdout:a,injected:false};default:return {exitCode:0,stdout:a,injected:false}}}var ne=10*1024*1024,oe={b:1,kb:1024,mb:1024*1024,gb:1024*1024*1024};function y(n,e){return n===void 0?true:Array.isArray(n)?n.includes(e):n===e}function re(n,e){return n===void 0?true:Array.isArray(n)?n.some(t=>e.includes(t)):e.includes(n)}function E(n){if(typeof n=="number")return n;let e=n.match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/i);if(!e)return 0;let t=parseFloat(e[1]),o=(e[2]??"b").toLowerCase();return Math.floor(t*(oe[o]??1))}function P(n){return typeof n=="string"}function T(n){try{let e=fs.statSync(n);return e.size>ne?(process.stderr.write(`[YamlHookPlugin] File too large for line count: ${n} (${e.size} bytes)
2
+ `),null):fs.readFileSync(n,"utf8").split(`
3
+ `).length}catch{return null}}function _(n){try{return fs.statSync(n).size}catch{return null}}function ie(n,e,t){if(!n)return true;let o=e,r=o?.path??o?.file_path??o?.filePath??o?.filename;if(typeof r!="string")return false;if(h(r,n))return true;if(t&&r.startsWith("/")){let{relative:s,isAbsolute:l}=F("path");if(l(r)){let a=s(t,r);if(a&&!a.startsWith("..")&&h(a,n))return true}}return false}function se(n,e){return n?JSON.stringify(e).includes(n):true}function ae(n,e){if(!n)return true;try{let t=new RegExp(n),o=JSON.stringify(e);return t.test(o)}catch{return false}}function ue(n,e){if(!n)return true;try{let t=new RegExp(n),o=JSON.stringify(e);return t.test(o)}catch{return false}}function le(n,e){if(n.pathSizeMin===void 0&&n.pathSizeMax===void 0)return true;let t=e,o=t?.path??t?.file_path??t?.filePath??t?.filename;if(typeof o!="string")return false;if(n.pathSizeMin!==void 0)if(P(n.pathSizeMin)){let r=_(o);if(r===null||r<E(n.pathSizeMin))return false}else {let r=T(o);if(r===null||r<n.pathSizeMin)return false}if(n.pathSizeMax!==void 0)if(P(n.pathSizeMax)){let r=_(o);if(r===null||r>E(n.pathSizeMax))return false}else {let r=T(o);if(r===null||r>n.pathSizeMax)return false}return true}function ce(n){let e=[],t=[];for(let o=0;o<n.length;o++){let r=n[o];if(!r||typeof r!="object"){t.push(`Hook at index ${o}: not an object, skipping`);continue}let s=r;if(typeof s.name!="string"||!s.name){t.push(`Hook at index ${o}: missing or invalid "name", skipping`);continue}let l=s.guide&&typeof s.guide=="object",a=s.deny&&typeof s.deny=="object",d=typeof s.plugin=="string";if(!l&&!a&&!d){t.push(`Hook "${s.name}": missing guide/deny/plugin, skipping`);continue}if(l&&typeof s.guide.say!="string"){t.push(`Hook "${s.name}": guide.say is required and must be string, skipping`);continue}if(a&&typeof s.deny.reason!="string"){t.push(`Hook "${s.name}": deny.reason is required and must be string, skipping`);continue}e.push(s);}return {valid:e,warnings:t}}var k=class extends c{name="@crewx/yaml-hook-plugin";version="0.1.0";capabilities={required:["inject"]};hooks;agentMap;constructor(e){super(),this.hooks=e.hooks,this.agentMap=new Map((e.agents??[]).map(t=>[t.id,t]));}async run(e){let t=[],o=process.env.CREWX_TASK_LOG_PATH,r=process.env.CREWX_HOOK_LOG_VERBOSE==="1";for(let s of this.hooks)if(this.matchEntryLevel(s,e)&&s.guide){if(!this.matchRuleLevel(s.guide,e)){r&&o&&this.appendHookLog(o,{rule:s.name,action:"pass",once:s.guide.once??false,ctx:e,matched:false});continue}s.guide.once&&this.hasFired(e.sessionId,s.name)||(s.guide.once&&this.markFired(e.sessionId,s.name),t.push(s.guide.say),o&&this.appendHookLog(o,{rule:s.name,action:"inject",once:s.guide.once??false,ctx:e,matched:true,message:s.guide.say}));}return t.length?e.inject(t.join(`
4
+
5
+ `)):e.pass()}appendHookLog(e,t){try{let o={rule:t.rule,action:t.action,once:t.once,sessionId:t.ctx.sessionId,provider:t.ctx.provider,agent:t.ctx.agent.id,toolName:t.ctx.tool.name,rawToolName:t.ctx.tool.rawName};t.message&&(o.chars=t.message.length,process.env.CREWX_HOOK_LOG_VERBOSE==="1"&&(o.message=m(t.message).slice(0,500)));let r=`[${new Date().toISOString()}] HOOK: ${JSON.stringify(o)}
6
+ `;fs.appendFileSync(e,r,{encoding:"utf8",mode:384});}catch{}}matchEntryLevel(e,t){if(e.provider!==void 0){let o=t.provider.replace(/^cli\//,"");if(!y(e.provider,o))return false}if(e.team!==void 0){let r=this.agentMap.get(t.agent.id)?.team??t.agent.team;if(!y(e.team,r))return false}if(e.role!==void 0){let r=this.agentMap.get(t.agent.id)?.role??t.agent.role;if(!y(e.role,r))return false}if(e.tag!==void 0){let r=this.agentMap.get(t.agent.id)?.tags??[];if(!re(e.tag,r))return false}return !(e.agents!==void 0&&!e.agents.includes(t.agent.id))}matchRuleLevel(e,t){return !(e.when!==void 0&&e.when.length>0&&!e.when.includes(t.tool.name)&&!e.when.includes(t.tool.rawName)||!se(e.pattern,t.tool.input)||!ae(e.regex,t.tool.input)||!ie(e.pathPattern,t.tool.input,t.cwd)||!le(e,t.tool.input)||!ue(e.whenInputRegex,t.tool.input))}hasFired(e,t){try{let o=this.firedFilePath(e);if(!fs.existsSync(o))return !1;let r=JSON.parse(fs.readFileSync(o,"utf8"));return Array.isArray(r.fired)&&r.fired.includes(t)}catch{return false}}markFired(e,t){try{let o=this.firedFilePath(e);fs.mkdirSync(path.dirname(o),{recursive:!0,mode:448});let r=fs.existsSync(o)?JSON.parse(fs.readFileSync(o,"utf8")):{fired:[]};Array.isArray(r.fired)||(r.fired=[]),r.fired.includes(t)||(r.fired.push(t),fs.writeFileSync(o,JSON.stringify(r),{mode:384}));}catch(o){process.stderr.write(`[YamlHookPlugin] once state write failed: ${o}
7
+ `);}}firedFilePath(e){let t=crypto.createHash("sha1").update(e).digest("hex");return path.join(os.homedir(),".crewx","sessions",t,"fired-rules.json")}};exports.HookPlugin=c;exports.ToolObserverPlugin=p;exports.Tools=i;exports.YamlHookPlugin=k;exports.buildHookContext=O;exports.defineHookPlugin=D;exports.definePlugin=j;exports.evaluateHook=J;exports.formatDenyOutput=C;exports.formatInjectOutput=w;exports.isPathSafe=Y;exports.sanitizeDenyReason=R;exports.sanitizeInjectMessage=m;exports.validateHooksSchema=ce;
@@ -17,4 +17,3 @@ export declare abstract class ToolObserverPlugin extends CrewxPlugin {
17
17
  private matchesTool;
18
18
  private buildContext;
19
19
  }
20
- //# sourceMappingURL=observer.d.ts.map
@@ -16,4 +16,3 @@ export interface HookPluginDefinition {
16
16
  run(ctx: HookContext): Promise<HookResult>;
17
17
  }
18
18
  export declare function defineHookPlugin(def: HookPluginDefinition): HookPlugin;
19
- //# sourceMappingURL=plugin.d.ts.map
@@ -1,29 +1,3 @@
1
- /**
2
- * Tool name normalization — 5-provider raw tool names → Tools.* enum.
3
- *
4
- * Design: docs/hook-설계서.md §8.1 Tools.* 정규화 enum.
5
- *
6
- * Raw tool names come from each provider's PreToolUse stdin payload:
7
- * - Claude: "Read" / "Write" / "Edit" / "Bash" / "Grep" / "Glob" / ...
8
- * - Codex: everything routed through "Bash" (shell command) — parsing optional
9
- * - Gemini: "read_file" / "write_file" / "replace" / "run_shell_command" / ...
10
- * - Copilot: "read" / "write" / "shell" / ...
11
- * - OpenCode: "file.read" / "file.write" / "file.edit" / "bash" / ...
12
- *
13
- * Unknown tools fall through to Tools.Other (still usable via `rawName` in rules).
14
- */
15
1
  import { type ToolName } from './types';
16
2
  export type ProviderKey = 'claude' | 'codex' | 'gemini' | 'copilot' | 'opencode';
17
- /**
18
- * Normalize a provider's raw tool name to the Tools.* enum.
19
- *
20
- * Matching priority:
21
- * 1. Exact key lookup in the provider's table.
22
- * 2. Fallback: if rawName already looks like a Tools.* value (contains a dot), accept it.
23
- * 3. Otherwise → Tools.Other.
24
- *
25
- * @param rawName provider-specific tool name (e.g. "Read", "read_file")
26
- * @param provider provider key; accepts 'cli/claude' style prefix too.
27
- */
28
3
  export declare function normalizeToolName(rawName: string, provider: string): ToolName;
29
- //# sourceMappingURL=tool-normalize.d.ts.map
@@ -76,4 +76,3 @@ export interface ToolInputPatch {
76
76
  systemPromptPrepend?: string;
77
77
  }
78
78
  export type Capability = 'inject' | 'deny' | 'modify' | 'ask';
79
- //# sourceMappingURL=types.d.ts.map
@@ -26,4 +26,3 @@ export declare class YamlHookPlugin extends HookPlugin {
26
26
  private markFired;
27
27
  firedFilePath(sessionId: string): string;
28
28
  }
29
- //# sourceMappingURL=yaml-plugin.d.ts.map
@@ -1,9 +1,3 @@
1
- /**
2
- * @crewx/sdk browser entry point.
3
- *
4
- * Exports only browser-safe modules — no Node.js dependencies
5
- * (child_process, fs, path, crypto, events).
6
- */
7
1
  export { Crewx } from './facade/Crewx.browser.js';
8
2
  export type { ToolDefinition, BrowserQueryOptions, BrowserFromConfigOptions } from './facade/Crewx.browser.js';
9
3
  export { registerProviderFactory, createProvider, ProviderError } from './provider/bridge.browser.js';
@@ -12,4 +6,3 @@ export { parseYamlContent, ConfigLoadError } from './config/loader.browser.js';
12
6
  export { BrowserFsAdapter } from './platform/BrowserFsAdapter.js';
13
7
  export type { IFsAdapter } from './platform/IFsAdapter.js';
14
8
  export type { AgentConfig, CrewxProjectConfig, CrewxOptions, QueryOptions, QueryResult, ExecuteOptions, ExecuteResult, } from './types/index.js';
15
- //# sourceMappingURL=index.browser.d.ts.map
@@ -1,25 +1,2 @@
1
- "use strict";
2
- /**
3
- * @crewx/sdk browser entry point.
4
- *
5
- * Exports only browser-safe modules — no Node.js dependencies
6
- * (child_process, fs, path, crypto, events).
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.BrowserFsAdapter = exports.ConfigLoadError = exports.parseYamlContent = exports.ProviderError = exports.createProvider = exports.registerProviderFactory = exports.Crewx = void 0;
10
- // Browser-safe facade
11
- var Crewx_browser_js_1 = require("./facade/Crewx.browser.js");
12
- Object.defineProperty(exports, "Crewx", { enumerable: true, get: function () { return Crewx_browser_js_1.Crewx; } });
13
- // Browser-safe provider bridge (registry only, no CLI spawn)
14
- var bridge_browser_js_1 = require("./provider/bridge.browser.js");
15
- Object.defineProperty(exports, "registerProviderFactory", { enumerable: true, get: function () { return bridge_browser_js_1.registerProviderFactory; } });
16
- Object.defineProperty(exports, "createProvider", { enumerable: true, get: function () { return bridge_browser_js_1.createProvider; } });
17
- Object.defineProperty(exports, "ProviderError", { enumerable: true, get: function () { return bridge_browser_js_1.ProviderError; } });
18
- // Config — browser-safe (no fs import)
19
- var loader_browser_js_1 = require("./config/loader.browser.js");
20
- Object.defineProperty(exports, "parseYamlContent", { enumerable: true, get: function () { return loader_browser_js_1.parseYamlContent; } });
21
- Object.defineProperty(exports, "ConfigLoadError", { enumerable: true, get: function () { return loader_browser_js_1.ConfigLoadError; } });
22
- // Platform adapters
23
- var BrowserFsAdapter_js_1 = require("./platform/BrowserFsAdapter.js");
24
- Object.defineProperty(exports, "BrowserFsAdapter", { enumerable: true, get: function () { return BrowserFsAdapter_js_1.BrowserFsAdapter; } });
25
- //# sourceMappingURL=index.browser.js.map
1
+ import {load}from'js-yaml';import {z}from'zod';var m=class extends Error{constructor(e,o){let r=o.length>0?` Available: ${o.join(", ")}`:"";super(`Agent not found: "${e}".${r}`),this.name="AgentNotFoundError";}},I={claude:{id:"claude",provider:"cli/claude"},gemini:{id:"gemini",provider:"cli/gemini"},copilot:{id:"copilot",provider:"cli/copilot"},codex:{id:"codex",provider:"cli/codex"}};function x(a,e){let o=a.startsWith("@")?a.slice(1):a,r=e.find(t=>t.id===o);if(r)return r;let i=I[o];if(i)return i;throw new m(a,e.map(t=>t.id))}var l=class extends Error{constructor(o,r){super(o);this.providerStr=r;this.name="ProviderError";}providerStr},O=new Map;function P(a,e){O.set(a,e);}function w(a){let e=a.split("/");if(e.length!==2)throw new l(`Invalid provider format: "${a}". Expected namespace/id (e.g., api/webllm)`,a);let[o,r]=e,i=O.get(o);if(i)return i(r,a);throw new l(`Unsupported provider namespace: "${o}". Register a factory with registerProviderFactory('${o}', factory).`,a)}var j=new Function("u","return import(u)"),C=class a{_agents;_config;_tools=new Map;_apiProviders=new Map;constructor(e,o){this._agents=new Map(e.map(r=>[r.id,r])),this._config=o;}static async fromConfig(e,o){let r=new a(e.agents??[],e),i=e.agents??[],t=s=>Array.isArray(s.provider)?s.provider[0]:s.provider,c=i.filter(s=>t(s)==="api/webllm"),g=i.filter(s=>t(s)==="api/openrouter");if(c.length>0&&await r._initWebLLM(c,o?.onProgress),g.length>0){if(!o?.openrouterApiKey)throw new Error("openrouterApiKey is required when using api/openrouter provider");r._initOpenRouter(g,o.openrouterApiKey);}return r._apiProviders.size>0&&P("api",(s,d)=>{let p=r._apiProviders.get(s);if(!p)throw new l(`Unknown api provider: ${s}`,d);return p}),r}async _initWebLLM(e,o){if(typeof navigator>"u"||!navigator.gpu)throw new Error("WebGPU is not available. Chrome 113+ or Edge 113+ required.");let r=await j("https://esm.run/@mlc-ai/web-llm"),i=e[0]?.inline?.model??"gemma-2-2b-it-q4f16_1-MLC",t=await r.CreateMLCEngine(i,{initProgressCallback:o?g=>o(g):void 0}),c=[];this._apiProviders.set("webllm",{async query(g,s){let d=[];s?.systemPrompt&&d.push({role:"system",content:s.systemPrompt}),d.push(...c),d.push({role:"user",content:g});let p="",u=await t.chat.completions.create({messages:d,stream:true,temperature:.7,max_tokens:4096});for await(let y of u){let v=y.choices?.[0]?.delta?.content??"";p+=v,s?.onOutput&&s.onOutput(p,"stdout");}return c.push({role:"user",content:g}),c.push({role:"assistant",content:p}),p},async execute(g,s){return this.query(g,s)}});}_initOpenRouter(e,o){let r=e[0]?.inline?.model??"google/gemma-2-2b-it",i=[];this._apiProviders.set("openrouter",{async query(t,c){let g=[];c?.systemPrompt&&g.push({role:"system",content:c.systemPrompt}),g.push(...i),g.push({role:"user",content:t});let s=await fetch("https://openrouter.ai/api/v1/chat/completions",{method:"POST",headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"},body:JSON.stringify({model:c?.model||r,messages:g,stream:true})});if(!s.ok){let v=await s.text();throw new Error(`OpenRouter API error (${s.status}): ${v}`)}let d=s.body.getReader(),p=new TextDecoder,u="",y="";for(;;){let{done:v,value:M}=await d.read();if(v)break;y+=p.decode(M,{stream:true});let b=y.split(`
2
+ `);y=b.pop();for(let _ of b){let h=_.trim();if(!h||!h.startsWith("data: "))continue;let R=h.slice(6);if(R!=="[DONE]")try{let k=JSON.parse(R).choices?.[0]?.delta?.content??"";u+=k,k&&c?.onOutput&&c.onOutput(u,"stdout");}catch{}}}return i.push({role:"user",content:t}),i.push({role:"assistant",content:u}),u},async execute(t,c){return this.query(t,c)}});}get agents(){return this._agents}get config(){return this._config}get tools(){return this._tools}registerTool(e,o){this._tools.set(e,{name:e,...o});}async query(e,o,r){let i=Date.now(),t;try{t=x(e,Array.from(this._agents.values()));}catch(p){if(p instanceof m)return {ok:false,data:"",error:{code:"AGENT_NOT_FOUND",message:p.message},meta:{agentId:e.replace(/^@/,""),provider:"",durationMs:Date.now()-i}};throw p}let c=Array.isArray(t.provider)?t.provider[0]??"api/default":t.provider,g=r?.provider??c,s=r?.model??t.inline?.model,d;try{d=w(g);}catch(p){return {ok:false,data:"",error:{code:"PROVIDER_ERROR",message:p.message},meta:{agentId:t.id,provider:g,model:s,durationMs:Date.now()-i}}}try{return {ok:!0,data:await d.query(o,{model:s,context:r?.context,systemPrompt:t.inline?.system_prompt??t.inline?.prompt,onOutput:r?.onOutput?u=>r.onOutput(u):void 0}),meta:{agentId:t.id,provider:g,model:s,durationMs:Date.now()-i}}}catch(p){return {ok:false,data:"",error:{code:"QUERY_FAILED",message:p.message},meta:{agentId:t.id,provider:g,model:s,durationMs:Date.now()-i}}}}async execute(e,o,r){let i=Date.now(),t;try{t=x(e,Array.from(this._agents.values()));}catch(p){if(p instanceof m)return {ok:false,data:"",error:{code:"AGENT_NOT_FOUND",message:p.message},meta:{agentId:e.replace(/^@/,""),provider:"",durationMs:Date.now()-i}};throw p}let c=Array.isArray(t.provider)?t.provider[0]??"api/default":t.provider,g=r?.provider??c,s=r?.model??t.inline?.model,d;try{d=w(g);}catch(p){return {ok:false,data:"",error:{code:"PROVIDER_ERROR",message:p.message},meta:{agentId:t.id,provider:g,model:s,durationMs:Date.now()-i}}}try{return {ok:!0,data:await d.execute(o,{model:s,context:r?.context,systemPrompt:t.inline?.system_prompt??t.inline?.prompt}),meta:{agentId:t.id,provider:g,model:s,durationMs:Date.now()-i}}}catch(p){return {ok:false,data:"",error:{code:"EXECUTE_FAILED",message:p.message},meta:{agentId:t.id,provider:g,model:s,durationMs:Date.now()-i}}}}};var F=z.object({model:z.string().optional(),system_prompt:z.string().optional(),prompt:z.string().optional(),layout:z.union([z.string(),z.object({id:z.string(),props:z.record(z.unknown()).optional()})]).optional()}).catchall(z.unknown()),D=z.object({id:z.string(),name:z.string().optional(),role:z.string().optional(),team:z.string().optional(),provider:z.union([z.string(),z.array(z.string())]),working_directory:z.string().optional(),description:z.string().optional(),tags:z.array(z.string()).optional(),inline:F.optional()}).catchall(z.unknown()),E=z.object({agents:z.array(D).optional(),hooks:z.array(z.unknown()).optional(),settings:z.record(z.unknown()).optional(),skills:z.unknown().optional(),layouts:z.record(z.unknown()).optional(),documents:z.record(z.unknown()).optional()}).catchall(z.unknown());var f=class extends Error{constructor(o,r){super(o);this.cause=r;this.name="ConfigLoadError";}cause};function Q(a){if(!a||typeof a!="string"||!a.trim())throw new f("YAML content must be a non-empty string");let e;try{e=load(a);}catch(i){throw new f(`YAML parse error: ${i.message}`,i)}let o=$(e),r=E.safeParse(o);if(!r.success)throw new f(`Config validation error: ${r.error.message}`);return r.data}function $(a){if(!a||typeof a!="object")return {agents:[]};let e=a;if(e.agents&&typeof e.agents=="object"&&!Array.isArray(e.agents)){let o=e.agents,r=Object.entries(o).map(([i,t])=>({id:i,...t&&typeof t=="object"?t:{}}));return {...e,agents:r}}return e.agents?e:{...e,agents:[]}}var L="crewx:fs:",A=class{prefix;store;constructor(e){this.prefix=e?.prefix??L,this.store=e?.storage??new Map;}async readFile(e){let o=this.toKey(e),r=this.store.get(o);if(r===void 0)throw new Error(`BrowserFsAdapter: file not found: ${e}`);return r}async exists(e){return this.store.has(this.toKey(e))}resolvePath(...e){let o=e.map(c=>c.replace(/\\/g,"/")).join("/").replace(/\/+/g,"/"),r=o.split("/"),i=[];for(let c of r)c==="."||c===""||(c===".."?i.pop():i.push(c));let t=i.join("/");return o.startsWith("/")?`/${t}`:t}isAbsolute(e){return e.startsWith("/")}setItem(e,o){this.store.set(this.toKey(e),o);}removeItem(e){this.store.delete(this.toKey(e));}keys(){return Array.from(this.store.keys()).filter(e=>e.startsWith(this.prefix)).map(e=>e.slice(this.prefix.length))}toKey(e){return `${this.prefix}${e.replace(/\\/g,"/")}`}};export{A as BrowserFsAdapter,f as ConfigLoadError,C as Crewx,l as ProviderError,w as createProvider,Q as parseYamlContent,P as registerProviderFactory};
package/dist/index.d.ts CHANGED
@@ -1,6 +1,3 @@
1
- /**
2
- * @crewx/sdk public API surface.
3
- */
4
1
  export { Crewx } from './facade/Crewx';
5
2
  export type { ToolDefinition } from './facade/Crewx';
6
3
  export { CrewxPlugin } from './plugin';
@@ -68,4 +65,3 @@ export { createScopedAdapterStore } from './adapter/scoped-store';
68
65
  export { createAdapterContext, runInSyncWindow, getSyncWindowStore } from './adapter/context-builder';
69
66
  export type { SyncWindow, AdapterContextOptions } from './adapter/context-builder';
70
67
  export type { ChannelAdapterPluginSpec } from './adapter/plugin-helper';
71
- //# sourceMappingURL=index.d.ts.map