@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.
- package/dist/__tests__/adapter/context-builder.test.d.ts +1 -0
- package/dist/__tests__/adapter/plugin-helper.test.d.ts +1 -0
- package/dist/__tests__/adapter/registration-integration.test.d.ts +1 -0
- package/dist/__tests__/adapter/scoped-store.test.d.ts +1 -0
- package/dist/__tests__/plugins/conversation.test.d.ts +1 -0
- package/dist/__tests__/testing/createMockContext.test.d.ts +1 -0
- package/dist/adapter/context-builder.d.ts +0 -9
- package/dist/adapter/index.d.ts +0 -1
- package/dist/adapter/plugin-helper.d.ts +0 -7
- package/dist/adapter/scoped-store.d.ts +0 -10
- package/dist/adapter/types.d.ts +0 -7
- package/dist/agent/resolver.d.ts +0 -13
- package/dist/boxing/box-storage.interface.d.ts +0 -4
- package/dist/boxing/box.service.d.ts +0 -4
- package/dist/boxing/box.types.d.ts +0 -4
- package/dist/boxing/context-builder.d.ts +0 -4
- package/dist/client/CrewxClient.d.ts +0 -32
- package/dist/client/index.d.ts +0 -1
- package/dist/client/index.js +1 -6
- package/dist/config/loader.browser.d.ts +0 -8
- package/dist/config/loader.d.ts +0 -12
- package/dist/conversation/__tests__/sqlite-provider.test.d.ts +1 -0
- package/dist/conversation/__tests__/to-task-reader.test.d.ts +1 -0
- package/dist/conversation/index.d.ts +0 -1
- package/dist/conversation/sqlite-provider.d.ts +0 -9
- package/dist/conversation/to-task-reader.d.ts +0 -11
- package/dist/conversation/to-template-messages.d.ts +0 -13
- package/dist/conversation/types.d.ts +0 -58
- package/dist/esm/client/index.js +1 -0
- package/dist/esm/hooks/index.js +7 -0
- package/dist/esm/index.js +79 -0
- package/dist/esm/plugins/index.js +52 -0
- package/dist/esm/testing/index.js +1 -0
- package/dist/esm/tools/node/index.js +36 -0
- package/dist/events/TypedEventEmitter.d.ts +0 -24
- package/dist/events/types.d.ts +0 -43
- package/dist/facade/Crewx.browser.d.ts +0 -40
- package/dist/facade/Crewx.d.ts +0 -163
- package/dist/hooks/define.d.ts +0 -1
- package/dist/hooks/dispatch.d.ts +0 -12
- package/dist/hooks/index.d.ts +0 -1
- package/dist/hooks/index.js +7 -24
- package/dist/hooks/observer.d.ts +0 -1
- package/dist/hooks/plugin.d.ts +0 -1
- package/dist/hooks/tool-normalize.d.ts +0 -26
- package/dist/hooks/types.d.ts +0 -1
- package/dist/hooks/yaml-plugin.d.ts +0 -1
- package/dist/index.browser.d.ts +0 -7
- package/dist/index.browser.js +2 -25
- package/dist/index.d.ts +0 -4
- package/dist/index.js +79 -151
- package/dist/layout/loader.d.ts +0 -20
- package/dist/layout/props-validator.d.ts +0 -6
- package/dist/layout/renderer.d.ts +0 -24
- package/dist/layout/types.d.ts +0 -42
- package/dist/parallel/agent-runtime.d.ts +0 -11
- package/dist/parallel/helpers.d.ts +0 -1
- package/dist/parallel/index.d.ts +0 -1
- package/dist/parallel/parallel-runner.d.ts +0 -8
- package/dist/parallel/types.d.ts +0 -24
- package/dist/parsers/agent-call.util.d.ts +0 -3
- package/dist/parsers/claude.parser.d.ts +0 -8
- package/dist/parsers/codex.parser.d.ts +0 -8
- package/dist/parsers/copilot.parser.d.ts +0 -9
- package/dist/parsers/gemini.parser.d.ts +0 -10
- package/dist/parsers/opencode.parser.d.ts +0 -10
- package/dist/parsers/router.d.ts +0 -5
- package/dist/paths.d.ts +1 -0
- package/dist/platform/BrowserFsAdapter.d.ts +0 -20
- package/dist/platform/IFsAdapter.d.ts +0 -23
- package/dist/platform/NodeFsAdapter.d.ts +0 -8
- package/dist/plugin/plugin-provider.d.ts +0 -22
- package/dist/plugin/types.d.ts +0 -31
- package/dist/plugin.d.ts +0 -27
- package/dist/plugins/conversation.d.ts +0 -2
- package/dist/plugins/file-logger.d.ts +0 -13
- package/dist/plugins/index.d.ts +0 -10
- package/dist/plugins/index.js +52 -19
- package/dist/plugins/sqlite-tracing.d.ts +0 -13
- package/dist/plugins/sqlite-tracing.spec.d.ts +1 -0
- package/dist/provider/bridge.browser.d.ts +0 -20
- package/dist/provider/bridge.d.ts +0 -47
- package/dist/provider/parse-usage.d.ts +0 -14
- package/dist/provider/register-api.d.ts +0 -7
- package/dist/provider/vercel-runtime.d.ts +0 -29
- package/dist/remote/index.d.ts +0 -6
- package/dist/remote/remote-agent-manager.d.ts +0 -31
- package/dist/remote/remote-provider.d.ts +0 -15
- package/dist/remote/remote-transport.d.ts +0 -17
- package/dist/remote/types.d.ts +0 -59
- package/dist/server/auth.d.ts +0 -16
- package/dist/server/handler.d.ts +0 -17
- package/dist/server/index.d.ts +0 -4
- package/dist/server/tool-adapter.d.ts +0 -16
- package/dist/template/engine.d.ts +0 -19
- package/dist/template/helpers/exec.browser.d.ts +0 -7
- package/dist/template/helpers/exec.d.ts +0 -45
- package/dist/template/helpers/fenced_code.d.ts +0 -16
- package/dist/template/helpers/format-conversation.d.ts +0 -22
- package/dist/template/helpers/include.d.ts +0 -15
- package/dist/template/helpers/p1p2.d.ts +0 -32
- package/dist/template/loader/DocumentLoader.d.ts +0 -30
- package/dist/template/types.d.ts +0 -30
- package/dist/testing/index.d.ts +0 -1
- package/dist/testing/index.js +1 -16
- package/dist/testing/mock-audit.d.ts +0 -1
- package/dist/testing/mock-context.d.ts +0 -1
- package/dist/testing/mock-logger.d.ts +0 -1
- package/dist/testing/mock-router.d.ts +0 -1
- package/dist/testing/mock-storage.d.ts +0 -1
- package/dist/testing/mock-store.d.ts +0 -1
- package/dist/tools/delegate.d.ts +0 -7
- package/dist/tools/index.d.ts +0 -4
- package/dist/tools/node/builtin.d.ts +0 -16
- package/dist/tools/node/index.d.ts +0 -20
- package/dist/tools/node/index.js +36 -59
- package/dist/types/index.d.ts +0 -20
- package/dist/types/task-log.types.d.ts +0 -4
- package/dist/utils/env-defaults.d.ts +0 -16
- package/dist/utils/glob-match.d.ts +0 -16
- package/dist/utils/id.d.ts +0 -15
- package/dist/utils/timestamp.d.ts +0 -1
- package/dist/utils/workspace.d.ts +0 -4
- package/package.json +24 -25
- package/dist/adapter/context-builder.js +0 -87
- package/dist/adapter/index.js +0 -21
- package/dist/adapter/plugin-helper.js +0 -45
- package/dist/adapter/scoped-store.js +0 -43
- package/dist/adapter/types.js +0 -23
- package/dist/agent/resolver.js +0 -46
- package/dist/boxing/box-storage.interface.js +0 -6
- package/dist/boxing/box.service.js +0 -73
- package/dist/boxing/box.types.js +0 -6
- package/dist/boxing/context-builder.js +0 -79
- package/dist/client/CrewxClient.js +0 -86
- package/dist/config/loader.browser.js +0 -59
- package/dist/config/loader.js +0 -95
- package/dist/conversation/index.js +0 -25
- package/dist/conversation/sqlite-provider.js +0 -178
- package/dist/conversation/to-task-reader.js +0 -28
- package/dist/conversation/to-template-messages.js +0 -34
- package/dist/conversation/types.js +0 -10
- package/dist/events/TypedEventEmitter.js +0 -65
- package/dist/events/types.js +0 -9
- package/dist/facade/Crewx.browser.js +0 -314
- package/dist/facade/Crewx.js +0 -1299
- package/dist/hooks/define.js +0 -13
- package/dist/hooks/dispatch.js +0 -147
- package/dist/hooks/observer.js +0 -60
- package/dist/hooks/plugin.js +0 -17
- package/dist/hooks/tool-normalize.js +0 -110
- package/dist/hooks/types.js +0 -12
- package/dist/hooks/yaml-plugin.js +0 -356
- package/dist/layout/loader.js +0 -305
- package/dist/layout/props-validator.js +0 -301
- package/dist/layout/renderer.js +0 -193
- package/dist/layout/types.js +0 -36
- package/dist/parallel/agent-runtime.js +0 -25
- package/dist/parallel/helpers.js +0 -219
- package/dist/parallel/index.js +0 -13
- package/dist/parallel/parallel-runner.js +0 -226
- package/dist/parallel/types.js +0 -6
- package/dist/parsers/agent-call.util.js +0 -19
- package/dist/parsers/claude.parser.js +0 -67
- package/dist/parsers/codex.parser.js +0 -100
- package/dist/parsers/copilot.parser.js +0 -66
- package/dist/parsers/gemini.parser.js +0 -46
- package/dist/parsers/opencode.parser.js +0 -76
- package/dist/parsers/router.js +0 -56
- package/dist/platform/BrowserFsAdapter.js +0 -84
- package/dist/platform/IFsAdapter.js +0 -3
- package/dist/platform/NodeFsAdapter.js +0 -38
- package/dist/plugin/plugin-provider.js +0 -207
- package/dist/plugin/types.js +0 -9
- package/dist/plugin.js +0 -29
- package/dist/plugins/conversation.js +0 -59
- package/dist/plugins/file-logger.js +0 -87
- package/dist/plugins/sqlite-tracing.js +0 -112
- package/dist/provider/bridge.browser.js +0 -49
- package/dist/provider/bridge.js +0 -381
- package/dist/provider/parse-usage.js +0 -83
- package/dist/provider/register-api.js +0 -24
- package/dist/provider/vercel-runtime.js +0 -347
- package/dist/remote/index.js +0 -32
- package/dist/remote/remote-agent-manager.js +0 -198
- package/dist/remote/remote-provider.js +0 -141
- package/dist/remote/remote-transport.js +0 -83
- package/dist/remote/types.js +0 -9
- package/dist/server/auth.js +0 -35
- package/dist/server/handler.js +0 -75
- package/dist/server/index.js +0 -9
- package/dist/server/tool-adapter.js +0 -95
- package/dist/template/engine.js +0 -137
- package/dist/template/helpers/exec.browser.js +0 -41
- package/dist/template/helpers/exec.js +0 -230
- package/dist/template/helpers/fenced_code.js +0 -20
- package/dist/template/helpers/format-conversation.js +0 -53
- package/dist/template/helpers/include.js +0 -23
- package/dist/template/helpers/p1p2.js +0 -90
- package/dist/template/loader/DocumentLoader.js +0 -128
- package/dist/template/types.js +0 -6
- package/dist/testing/mock-audit.js +0 -13
- package/dist/testing/mock-context.js +0 -68
- package/dist/testing/mock-logger.js +0 -27
- package/dist/testing/mock-router.js +0 -67
- package/dist/testing/mock-storage.js +0 -21
- package/dist/testing/mock-store.js +0 -8
- package/dist/tools/delegate.js +0 -60
- package/dist/tools/index.js +0 -9
- package/dist/tools/node/builtin.js +0 -547
- package/dist/types/index.js +0 -32
- package/dist/types/task-log.types.js +0 -6
- package/dist/utils/env-defaults.js +0 -27
- package/dist/utils/glob-match.js +0 -42
- package/dist/utils/id.js +0 -50
- package/dist/utils/timestamp.js +0 -13
- package/dist/utils/workspace.js +0 -58
package/dist/hooks/index.js
CHANGED
|
@@ -1,24 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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;
|
package/dist/hooks/observer.d.ts
CHANGED
package/dist/hooks/plugin.d.ts
CHANGED
|
@@ -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
|
package/dist/hooks/types.d.ts
CHANGED
package/dist/index.browser.d.ts
CHANGED
|
@@ -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
|
package/dist/index.browser.js
CHANGED
|
@@ -1,25 +1,2 @@
|
|
|
1
|
-
"
|
|
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
|