@crewx/sdk 0.9.0-rc.4 → 0.9.0-rc.41

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 (70) hide show
  1. package/README.md +1 -1
  2. package/dist/config/canonicalize-agent-options.d.ts +16 -0
  3. package/dist/config/global-settings.d.ts +19 -0
  4. package/dist/config/models.generated.d.ts +22 -0
  5. package/dist/config/models.remote.d.ts +4 -0
  6. package/dist/config/overdrive.d.ts +29 -0
  7. package/dist/config/pricing.d.ts +8 -8
  8. package/dist/config/pricing.generated.d.ts +2 -0
  9. package/dist/config/pricing.remote.d.ts +4 -0
  10. package/dist/config/pricing.types.d.ts +5 -0
  11. package/dist/config/timeout.config.d.ts +3 -0
  12. package/dist/config/wi-boards.d.ts +15 -0
  13. package/dist/esm/index.js +125 -82
  14. package/dist/esm/plugins/index.js +118 -71
  15. package/dist/esm/repository/index.js +122 -75
  16. package/dist/esm/testing/index.js +1 -1
  17. package/dist/events/types.d.ts +2 -0
  18. package/dist/facade/Crewx.d.ts +12 -0
  19. package/dist/index.browser.d.ts +1 -1
  20. package/dist/index.browser.js +2 -2
  21. package/dist/index.d.ts +17 -6
  22. package/dist/index.js +126 -83
  23. package/dist/internal/windows-spawn.d.ts +10 -0
  24. package/dist/migrations/0008_careful_black_bird.sql +17 -0
  25. package/dist/migrations/0009_hot_dark_phoenix.sql +1 -0
  26. package/dist/migrations/0010_analyze_stats.sql +6 -0
  27. package/dist/migrations/0011_far_black_tarantula.sql +1 -0
  28. package/dist/migrations/0012_blue_turbo.sql +23 -0
  29. package/dist/migrations/0013_hesitant_adam_destine.sql +15 -0
  30. package/dist/migrations/meta/0008_snapshot.json +1327 -0
  31. package/dist/migrations/meta/0009_snapshot.json +1335 -0
  32. package/dist/migrations/meta/0010_snapshot.json +1335 -0
  33. package/dist/migrations/meta/0011_snapshot.json +1342 -0
  34. package/dist/migrations/meta/0012_snapshot.json +1494 -0
  35. package/dist/migrations/meta/0013_snapshot.json +1592 -0
  36. package/dist/migrations/meta/_journal.json +42 -0
  37. package/dist/plugin/types.d.ts +1 -0
  38. package/dist/plugins/index.js +118 -71
  39. package/dist/provider/acp/adapters/claude.d.ts +0 -4
  40. package/dist/provider/acp/connection.d.ts +4 -0
  41. package/dist/provider/acp/meta.d.ts +4 -0
  42. package/dist/provider/bridge.d.ts +13 -1
  43. package/dist/provider/cli/adapter.types.d.ts +1 -0
  44. package/dist/provider/cli/adapters/claude.d.ts +0 -1
  45. package/dist/provider/cli/adapters/cli-knob.util.d.ts +2 -0
  46. package/dist/provider/cli/meta.d.ts +10 -2
  47. package/dist/provider/errors.d.ts +1 -0
  48. package/dist/provider/idle-watchdog.d.ts +19 -0
  49. package/dist/provider/models.d.ts +23 -0
  50. package/dist/provider/order.d.ts +1 -0
  51. package/dist/provider/parse-usage.d.ts +6 -0
  52. package/dist/provider/provider-selection.d.ts +8 -0
  53. package/dist/repository/agent-suggestion.repository.d.ts +34 -0
  54. package/dist/repository/index.d.ts +7 -1
  55. package/dist/repository/index.js +122 -75
  56. package/dist/repository/notification.repository.d.ts +58 -0
  57. package/dist/repository/task.repository.d.ts +79 -0
  58. package/dist/repository/thread.repository.d.ts +16 -2
  59. package/dist/repository/usage-report.repository.d.ts +27 -0
  60. package/dist/schema/agent-suggestions.d.ts +199 -0
  61. package/dist/schema/index.d.ts +3 -0
  62. package/dist/schema/notifications.d.ts +303 -0
  63. package/dist/schema/usage-reports.d.ts +252 -0
  64. package/dist/testing/index.d.ts +2 -0
  65. package/dist/testing/index.js +1 -1
  66. package/dist/types/index.d.ts +141 -3
  67. package/dist/utils/id.d.ts +1 -1
  68. package/package.json +3 -2
  69. package/templates/agents/default.yaml +175 -117
  70. package/templates/documents/crewx-manual.md +138 -138
@@ -1 +1 @@
1
- function y(){let e=[];return {events:e,async log(t,r){e.push({event:t,payload:r});}}}function R(){let e={debug:[],info:[],warn:[],error:[]};return {entries:e,debug(t,r){e.debug.push({msg:t,meta:r});},info(t,r){e.info.push({msg:t,meta:r});},warn(t,r){e.warn.push({msg:t,meta:r});},error(t,r){e.error.push({msg:t,meta:r});}}}function E(){let e=200,t,r,n={},o={status(s){return e=s,o},set(s,i){return n[s]=i,o},send(s){return r=s,o},json(s){return t=s,o},end(){return o},getStatusCode:()=>e,getJsonBody:()=>t,getSentBody:()=>r,getHeaders:()=>({...n})};return o}function k(){let e=[];return {routes:e,registerRoute(r,n,o){e.push({path:r,handler:n,opts:o});},async simulate(r,n,o=Buffer.alloc(0),s={},i={},p={}){let d=e.find(m=>m.path===n);if(!d)return {status:404,body:{error:"Not found"},headers:{}};let f={method:r,url:n,headers:s,body:o,params:i,query:p},u=E();return await d.handler(f,u),{status:u.getStatusCode(),body:u.getJsonBody()??u.getSentBody(),headers:u.getHeaders()}}}}function b(e){let t=new Map,r=n=>n.startsWith(`${e}::`)?n:`${e}::${n}`;return {async get(n){let o=t.get(r(n));return o?o.value:void 0},async set(n,o){t.set(r(n),{value:o});},async delete(n){return t.delete(r(n))},async list(n){let o=n?r(n):`${e}::`,s=[];for(let i of t.keys())i.startsWith(o)&&s.push(i.slice(e.length+2));return s}}}function l(e){return b(e)}function M(){let e=new Map;return {blobs:e,async put(t,r,n){return e.set(t,{data:r,contentType:n}),t},async get(t){let r=e.get(t);return r?r.data:void 0},async delete(t){return e.delete(t)}}}function P(e){let t=e.instanceId??"mock-instance",r=y(),n=R(),o=k(),s=l(t),i=M(),p=[],d=[],f=[],u={run:async()=>({output:""}),...e.agentRunner},m=new AbortController,x=async a=>(p.push(a),{accepted:true}),S=async a=>(d.push(a),{accepted:true}),w=async(a,h)=>{f.push({messageId:a,patch:h});},A=async a=>({userId:a,displayName:a}),v=async()=>{},C=async()=>({messageId:"mock-proactive",sentAt:Date.now()});return {instanceId:t,installationId:e.installationId,config:e.config,capabilities:new Set(e.capabilities??[]),log:n,agentRunner:u,db:s,storage:i,audit:r,abortSignal:e.abortSignal??m.signal,httpRouter:o,router:o,inbound:x,emitEvent:S,updateMessage:w,resolveUser:A,respondSync:v,proactive:C,inboundCalls:p,emittedEvents:d,sentMessages:f}}export{y as createMockAudit,P as createMockContext,R as createMockLogger,k as createMockRouter,M as createMockStorage,l as createMockStore};
1
+ function f(){let e=[];return {events:e,async log(t,r){e.push({event:t,payload:r});}}}function h(){let e={debug:[],info:[],warn:[],error:[]};return {entries:e,debug(t,r){e.debug.push({msg:t,meta:r});},info(t,r){e.info.push({msg:t,meta:r});},warn(t,r){e.warn.push({msg:t,meta:r});},error(t,r){e.error.push({msg:t,meta:r});}}}function A(){let e=200,t,r,n={},o={status(i){return e=i,o},set(i,s){return n[i]=s,o},send(i){return r=i,o},json(i){return t=i,o},end(){return o},getStatusCode:()=>e,getJsonBody:()=>t,getSentBody:()=>r,getHeaders:()=>({...n})};return o}function y(){let e=[];return {routes:e,registerRoute(r,n,o){e.push({path:r,handler:n,opts:o});},async simulate(r,n,o=Buffer.alloc(0),i={},s={},p={}){let g=e.find(m=>m.path===n);if(!g)return {status:404,body:{error:"Not found"},headers:{}};let l={method:r,url:n,headers:i,body:o,params:s,query:p},c=A();return await g.handler(l,c),{status:c.getStatusCode(),body:c.getJsonBody()??c.getSentBody(),headers:c.getHeaders()}}}}function R(e){let t=new Map,r=n=>n.startsWith(`${e}::`)?n:`${e}::${n}`;return {async get(n){let o=t.get(r(n));return o?o.value:void 0},async set(n,o){t.set(r(n),{value:o});},async delete(n){return t.delete(r(n))},async list(n){let o=n?r(n):`${e}::`,i=[];for(let s of t.keys())s.startsWith(o)&&i.push(s.slice(e.length+2));return i}}}function x(e){return R(e)}function M(){let e=new Map;return {blobs:e,async put(t,r,n){return e.set(t,{data:r,contentType:n}),t},async get(t){let r=e.get(t);return r?r.data:void 0},async delete(t){return e.delete(t)}}}function S(e){let t=e.instanceId??"mock-instance",r=f(),n=h(),o=y(),i=x(t),s=M(),p=[],g=[],l=[],c={run:async()=>({output:""}),...e.agentRunner},m=new AbortController,C=async u=>(p.push(u),{accepted:true}),v=async u=>(g.push(u),{accepted:true}),E=async(u,w)=>{l.push({messageId:u,patch:w});},k=async u=>({userId:u,displayName:u}),b=async()=>{},O=async()=>({messageId:"mock-proactive",sentAt:Date.now()});return {instanceId:t,installationId:e.installationId,config:e.config,capabilities:new Set(e.capabilities??[]),log:n,agentRunner:c,db:i,storage:s,audit:r,abortSignal:e.abortSignal??m.signal,httpRouter:o,router:o,inbound:C,emitEvent:v,updateMessage:E,resolveUser:k,respondSync:b,proactive:O,inboundCalls:p,emittedEvents:g,sentMessages:l}}function T(){}var P={claude:{models:[{id:"claude-fable-5",name:"Claude Fable 5"},{id:"claude-opus-5",name:"Claude Opus 5"},{id:"claude-sonnet-5",name:"Claude Sonnet 5"},{id:"claude-opus-4-8[1m]",name:"Claude Opus 4.8 (Extended)"},{id:"claude-opus-4-8",name:"Claude Opus 4.8"},{id:"claude-opus-4-7[1m]",name:"Claude Opus 4.7 (Extended)"},{id:"claude-opus-4-7",name:"Claude Opus 4.7"},{id:"claude-opus-4-6[1m]",name:"Claude Opus 4.6 (Extended)"},{id:"claude-opus-4-6",name:"Claude Opus 4.6"},{id:"claude-sonnet-4-6[1m]",name:"Claude Sonnet 4.6 (Extended)"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6"},{id:"claude-haiku-4-5",name:"Claude Haiku 4.5"}],modes:[{id:"default",name:"Default"},{id:"acceptEdits",name:"Accept Edits"},{id:"plan",name:"Plan"},{id:"auto",name:"Auto"},{id:"dontAsk",name:"Don't Ask"},{id:"bypassPermissions",name:"Bypass Permissions"}],effort:["low","medium","high"],modelOverrides:{"claude-fable-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-sonnet-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-8[1m]":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-8":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-7[1m]":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-7":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-6[1m]":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-opus-4-6":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-sonnet-4-6[1m]":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-sonnet-4-6":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-haiku-4-5":{effort:[]}}},codex:{models:[{id:"gpt-5.6-sol",name:"GPT-5.6 Sol"},{id:"gpt-5.6-terra",name:"GPT-5.6 Terra"},{id:"gpt-5.6-luna",name:"GPT-5.6 Luna"},{id:"gpt-5.5",name:"GPT-5.5"},{id:"gpt-5.4",name:"GPT-5.4"},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini"},{id:"gpt-5.3-codex",name:"GPT-5.3 Codex"},{id:"gpt-5.3-codex-spark",name:"GPT-5.3 Codex Spark"}],modes:[{id:"agent",name:"Agent"},{id:"read-only",name:"Read Only"},{id:"plan",name:"Plan"},{id:"agent-full-access",name:"Agent Full Access"},{id:"yolo",name:"YOLO"}],effort:["minimal","low","medium","high"],modelOverrides:{"gpt-5.6-sol":{effort:["none","low","medium","high","xhigh","max"],defaultEffort:"xhigh"},"gpt-5.6-terra":{effort:["none","low","medium","high","xhigh","max"],defaultEffort:"high"},"gpt-5.6-luna":{effort:["none","low","medium","high","xhigh","max"],defaultEffort:"high"},"gpt-5.5":{effort:["minimal","low","medium","high","xhigh"],defaultEffort:"high"}}},copilot:{models:[{id:"auto",name:"Auto"},{id:"claude-sonnet-5",name:"Claude Sonnet 5"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6"},{id:"gpt-5.5",name:"GPT-5.5"},{id:"gpt-5.4",name:"GPT-5.4"},{id:"gemini-3.1-pro",name:"Gemini 3.1 Pro"}],modes:[{id:"interactive",name:"Interactive"},{id:"plan",name:"Plan"},{id:"autopilot",name:"Autopilot"}],effort:["none","low","medium","high","xhigh","max"],modelOverrides:{}},antigravity:{models:[{id:"Gemini 3.5 Flash (Medium)",name:"Gemini 3.5 Flash (Medium)"},{id:"Gemini 3.5 Flash (High)",name:"Gemini 3.5 Flash (High)"},{id:"Gemini 3.5 Flash (Low)",name:"Gemini 3.5 Flash (Low)"},{id:"Gemini 3.1 Pro (Low)",name:"Gemini 3.1 Pro (Low)"},{id:"Gemini 3.1 Pro (High)",name:"Gemini 3.1 Pro (High)"},{id:"Claude Sonnet 4.6 (Thinking)",name:"Claude Sonnet 4.6 (Thinking)"},{id:"Claude Opus 4.6 (Thinking)",name:"Claude Opus 4.6 (Thinking)"},{id:"GPT-OSS 120B (Medium)",name:"GPT-OSS 120B (Medium)"}],modes:[],effort:[],modelOverrides:{}}};Object.fromEntries(Object.entries(P).map(([e,t])=>[e,t.models]));function B(){}export{f as createMockAudit,S as createMockContext,h as createMockLogger,y as createMockRouter,M as createMockStorage,x as createMockStore,B as resetModelsOverride,T as resetPricingOverride};
@@ -37,6 +37,8 @@ export interface TaskEndEvent extends BaseEvent {
37
37
  costUsd?: number;
38
38
  model?: string;
39
39
  metadata?: Record<string, unknown>;
40
+ workspaceId?: string;
41
+ workspaceName?: string;
40
42
  }
41
43
  export interface TaskOutputEvent extends BaseEvent {
42
44
  agentRef: string;
@@ -8,6 +8,7 @@ import type { CustomLayoutDefinition } from '../layout/types';
8
8
  import type { TemplateMessage } from '../conversation/types';
9
9
  import type { HandlerOptions, CrewxHandler } from '../server/handler';
10
10
  import type { RemoteProviderConfig } from '../remote/types.js';
11
+ import type { CrewxEventName, CrewxEventPayload } from '../events/types';
11
12
  export interface ToolDefinition {
12
13
  name: string;
13
14
  description: string;
@@ -55,8 +56,11 @@ export declare class Crewx extends TypedEventEmitter {
55
56
  private readonly _tools;
56
57
  private readonly _activeAdapters;
57
58
  private readonly _pendingThreads;
59
+ private readonly _activeTasks;
58
60
  private readonly _remoteFactory?;
59
61
  private readonly _remoteTargets;
62
+ private readonly _additionalArgsProvider?;
63
+ private readonly _callerIdentityOverrides;
60
64
  private constructor();
61
65
  private resolveFileRemoteTarget;
62
66
  private static loadBuiltInConfig;
@@ -80,6 +84,8 @@ export declare class Crewx extends TypedEventEmitter {
80
84
  stopAllAdapters(opts?: {
81
85
  timeoutMs?: number;
82
86
  }): Promise<void>;
87
+ private abortAll;
88
+ private _drainActiveTasks;
83
89
  close(): Promise<void>;
84
90
  filterAgents(filters: {
85
91
  role?: string;
@@ -97,9 +103,15 @@ export declare class Crewx extends TypedEventEmitter {
97
103
  private _getConversationProvider;
98
104
  private _fetchHistoryMessages;
99
105
  private _resolveTimeout;
106
+ private _resolveIdleTimeout;
100
107
  private _lookupCliAdapter;
108
+ private _resolveEffectiveCost;
101
109
  private _resolveEffectiveCwd;
102
110
  private _buildFileRemoteOptions;
111
+ private _registerCallerIdentityOverride;
112
+ private _clearCallerIdentityOverride;
113
+ private _rewriteCallerFacingPayload;
114
+ protected emit<K extends CrewxEventName>(event: K, payload: CrewxEventPayload<K>): void;
103
115
  private emitToolEvents;
104
116
  private emitTaskLogEntries;
105
117
  private tryParseJson;
@@ -5,5 +5,5 @@ export type { ProviderRuntime, ProviderFactory, ProviderQueryOptions } from './p
5
5
  export { parseYamlContent, ConfigLoadError } from './config/loader.browser.js';
6
6
  export { BrowserFsAdapter } from './platform/BrowserFsAdapter.js';
7
7
  export type { IFsAdapter } from './platform/IFsAdapter.js';
8
- export { PROVIDER_ORDER, providerRank, compareProviders } from './provider/order.js';
8
+ export { PROVIDER_ORDER, providerRank, compareProviders, normalizeProviderId } from './provider/order.js';
9
9
  export type { AgentConfig, CrewxProjectConfig, CrewxOptions, QueryOptions, QueryResult, ExecuteOptions, ExecuteResult, } from './types/index.js';
@@ -1,2 +1,2 @@
1
- import {load}from'js-yaml';import {z}from'zod';var m=class extends Error{constructor(e,r){let t=r.length>0?` Available: ${r.join(", ")}`:"";super(`Agent not found: "${e}".${t}`),this.name="AgentNotFoundError";}},D={claude:{id:"claude",provider:"cli/claude"},copilot:{id:"copilot",provider:"cli/copilot"},codex:{id:"codex",provider:"cli/codex"}};function w(s,e){let r=s.startsWith("@")?s.slice(1):s,t=e.find(o=>o.id===r);if(t)return t;let i=D[r];if(i)return i;throw new m(s,e.map(o=>o.id))}var u=class extends Error{constructor(r,t,i){super(r);this.providerStr=t;this.name="ProviderError",this.code=i?.code??"UNKNOWN",this.kind=i?.kind??(this.code==="UNKNOWN"?"transient":void 0),this.retryAfterMs=i?.retryAfterMs;}providerStr;code;kind;retryAfterMs};var I=new Map;function P(s,e){I.set(s,e);}function x(s){let e=s.split("/");if(e.length!==2)throw new u(`Invalid provider format: "${s}". Expected namespace/id (e.g., api/webllm)`,s);let[r,t]=e,i=I.get(r);if(i)return i(t,s);throw new u(`Unsupported provider namespace: "${r}". Register a factory with registerProviderFactory('${r}', factory).`,s)}var j=new Function("u","return import(u)"),A=class s{_agents;_config;_tools=new Map;_apiProviders=new Map;constructor(e,r){this._agents=new Map(e.map(t=>[t.id,t])),this._config=r;}static async fromConfig(e,r){let t=new s(e.agents??[],e),i=e.agents??[],o=a=>Array.isArray(a.provider)?a.provider[0]:a.provider,p=i.filter(a=>o(a)==="api/webllm"),c=i.filter(a=>o(a)==="api/openrouter");if(p.length>0&&await t._initWebLLM(p,r?.onProgress),c.length>0){if(!r?.openrouterApiKey)throw new Error("openrouterApiKey is required when using api/openrouter provider");t._initOpenRouter(c,r.openrouterApiKey);}return t._apiProviders.size>0&&P("api",(a,g)=>{let d=t._apiProviders.get(a);if(!d)throw new u(`Unknown api provider: ${a}`,g);return d}),t}async _initWebLLM(e,r){if(typeof navigator>"u"||!navigator.gpu)throw new Error("WebGPU is not available. Chrome 113+ or Edge 113+ required.");let t=await j("https://esm.run/@mlc-ai/web-llm"),i=e[0]?.inline?.model??"gemma-2-2b-it-q4f16_1-MLC",o=await t.CreateMLCEngine(i,{initProgressCallback:r?c=>r(c):void 0}),p=[];this._apiProviders.set("webllm",{async query(c,a){let g=[];a?.systemPrompt&&g.push({role:"system",content:a.systemPrompt}),g.push(...p),g.push({role:"user",content:c});let d="",l=await o.chat.completions.create({messages:g,stream:true,temperature:.7,max_tokens:4096});for await(let y of l){let v=y.choices?.[0]?.delta?.content??"";d+=v,a?.onOutput&&a.onOutput(d,"stdout");}return p.push({role:"user",content:c}),p.push({role:"assistant",content:d}),d},async execute(c,a){return this.query(c,a)}});}_initOpenRouter(e,r){let t=e[0]?.inline?.model??"google/gemma-2-2b-it",i=[];this._apiProviders.set("openrouter",{async query(o,p){let c=[];p?.systemPrompt&&c.push({role:"system",content:p.systemPrompt}),c.push(...i),c.push({role:"user",content:o});let a=await fetch("https://openrouter.ai/api/v1/chat/completions",{method:"POST",headers:{Authorization:`Bearer ${r}`,"Content-Type":"application/json"},body:JSON.stringify({model:p?.model||t,messages:c,stream:true})});if(!a.ok){let v=await a.text();throw new Error(`OpenRouter API error (${a.status}): ${v}`)}let g=a.body.getReader(),d=new TextDecoder,l="",y="";for(;;){let{done:v,value:T}=await g.read();if(v)break;y+=d.decode(T,{stream:true});let O=y.split(`
2
- `);y=O.pop();for(let M of O){let h=M.trim();if(!h||!h.startsWith("data: "))continue;let k=h.slice(6);if(k!=="[DONE]")try{let b=JSON.parse(k).choices?.[0]?.delta?.content??"";l+=b,b&&p?.onOutput&&p.onOutput(l,"stdout");}catch{}}}return i.push({role:"user",content:o}),i.push({role:"assistant",content:l}),l},async execute(o,p){return this.query(o,p)}});}get agents(){return this._agents}get config(){return this._config}get tools(){return this._tools}registerTool(e,r){this._tools.set(e,{name:e,...r});}async query(e,r,t){let i=Date.now(),o;try{o=w(e,Array.from(this._agents.values()));}catch(d){if(d instanceof m)return {ok:false,data:"",error:{code:"AGENT_NOT_FOUND",message:d.message},meta:{agentId:e.replace(/^@/,""),provider:"",durationMs:Date.now()-i}};throw d}let p=Array.isArray(o.provider)?o.provider[0]??"api/default":o.provider,c=t?.provider??p,a=t?.model??o.inline?.model,g;try{g=x(c);}catch(d){return {ok:false,data:"",error:{code:"PROVIDER_ERROR",message:d.message},meta:{agentId:o.id,provider:c,model:a,durationMs:Date.now()-i}}}try{return {ok:!0,data:await g.query(r,{model:a,context:t?.context,systemPrompt:o.inline?.system_prompt??o.inline?.prompt,onOutput:t?.onOutput?l=>t.onOutput(l):void 0}),meta:{agentId:o.id,provider:c,model:a,durationMs:Date.now()-i}}}catch(d){return {ok:false,data:"",error:{code:"QUERY_FAILED",message:d.message},meta:{agentId:o.id,provider:c,model:a,durationMs:Date.now()-i}}}}async execute(e,r,t){let i=Date.now(),o;try{o=w(e,Array.from(this._agents.values()));}catch(d){if(d instanceof m)return {ok:false,data:"",error:{code:"AGENT_NOT_FOUND",message:d.message},meta:{agentId:e.replace(/^@/,""),provider:"",durationMs:Date.now()-i}};throw d}let p=Array.isArray(o.provider)?o.provider[0]??"api/default":o.provider,c=t?.provider??p,a=t?.model??o.inline?.model,g;try{g=x(c);}catch(d){return {ok:false,data:"",error:{code:"PROVIDER_ERROR",message:d.message},meta:{agentId:o.id,provider:c,model:a,durationMs:Date.now()-i}}}try{return {ok:!0,data:await g.execute(r,{model:a,context:t?.context,systemPrompt:o.inline?.system_prompt??o.inline?.prompt}),meta:{agentId:o.id,provider:c,model:a,durationMs:Date.now()-i}}}catch(d){return {ok:false,data:"",error:{code:"EXECUTE_FAILED",message:d.message},meta:{agentId:o.id,provider:c,model:a,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()}),z.object({props:z.record(z.unknown())}),z.object({template:z.string()})]).optional()}).catchall(z.unknown()),U=z.object({include:z.array(z.string()).optional()}).optional(),N=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(),skills:U}).catchall(z.unknown()),_=z.object({agents:z.array(N).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(r,t){super(r);this.cause=t;this.name="ConfigLoadError";}cause};function Q(s){if(!s||typeof s!="string"||!s.trim())throw new f("YAML content must be a non-empty string");let e;try{e=load(s);}catch(i){throw new f(`YAML parse error: ${i.message}`,i)}let r=S(e),t=_.safeParse(r);if(!t.success)throw new f(`Config validation error: ${t.error.message}`);return t.data}function S(s){if(!s||typeof s!="object")return {agents:[]};let e=s;if(e.agents&&typeof e.agents=="object"&&!Array.isArray(e.agents)){let r=e.agents,t=Object.entries(r).map(([i,o])=>({id:i,...o&&typeof o=="object"?o:{}}));return {...e,agents:t}}return e.agents?e:{...e,agents:[]}}var K="crewx:fs:",E=class{prefix;store;constructor(e){this.prefix=e?.prefix??K,this.store=e?.storage??new Map;}async readFile(e){let r=this.toKey(e),t=this.store.get(r);if(t===void 0)throw new Error(`BrowserFsAdapter: file not found: ${e}`);return t}async exists(e){return this.store.has(this.toKey(e))}resolvePath(...e){let r=e.map(p=>p.replace(/\\/g,"/")).join("/").replace(/\/+/g,"/"),t=r.split("/"),i=[];for(let p of t)p==="."||p===""||(p===".."?i.pop():i.push(p));let o=i.join("/");return r.startsWith("/")?`/${o}`:o}isAbsolute(e){return e.startsWith("/")}setItem(e,r){this.store.set(this.toKey(e),r);}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))}async readdir(e){let r=e.replace(/\\/g,"/").replace(/\/$/,""),t=this.toKey(r+"/"),i=[];for(let o of this.store.keys())if(o.startsWith(t)){let c=o.slice(t.length).split("/")[0];c&&!i.includes(c)&&i.push(c);}return i}toKey(e){return `${this.prefix}${e.replace(/\\/g,"/")}`}};var C=["codex","claude","opencode","antigravity","copilot"];function $(s){let e=s.indexOf("/");return e===-1?s:s.slice(e+1)}function R(s){let e=$(s),r=C.indexOf(e);return r===-1?C.length:r}function B(s,e){return R(s)-R(e)}export{E as BrowserFsAdapter,f as ConfigLoadError,A as Crewx,C as PROVIDER_ORDER,u as ProviderError,B as compareProviders,x as createProvider,Q as parseYamlContent,R as providerRank,P as registerProviderFactory};
1
+ import {load}from'js-yaml';import {z as z$1}from'zod';var m=class extends Error{constructor(e,t){let o=t.length>0?` Available: ${t.join(", ")}`:"";super(`Agent not found: "${e}".${o}`),this.name="AgentNotFoundError";}},D={claude:{id:"claude",provider:"cli/claude"},copilot:{id:"copilot",provider:"cli/copilot"},codex:{id:"codex",provider:"cli/codex"}};function w(s,e){let t=s.startsWith("@")?s.slice(1):s,o=e.find(n=>n.id===t);if(o)return o;let i=D[t];if(i)return i;throw new m(s,e.map(n=>n.id))}var l=class extends Error{constructor(t,o,i){super(t);this.providerStr=o;this.name="ProviderError",this.code=i?.code??"UNKNOWN",this.kind=i?.kind??(this.code==="UNKNOWN"?"transient":void 0),this.retryAfterMs=i?.retryAfterMs;}providerStr;code;kind;retryAfterMs;stdout};var I=new Map;function P(s,e){I.set(s,e);}function x(s){let e=s.split("/");if(e.length!==2)throw new l(`Invalid provider format: "${s}". Expected namespace/id (e.g., api/webllm)`,s);let[t,o]=e,i=I.get(t);if(i)return i(o,s);throw new l(`Unsupported provider namespace: "${t}". Register a factory with registerProviderFactory('${t}', factory).`,s)}var j=new Function("u","return import(u)"),A=class s{_agents;_config;_tools=new Map;_apiProviders=new Map;constructor(e,t){this._agents=new Map(e.map(o=>[o.id,o])),this._config=t;}static async fromConfig(e,t){let o=new s(e.agents??[],e),i=e.agents??[],n=a=>Array.isArray(a.provider)?a.provider[0]:a.provider,d=i.filter(a=>n(a)==="api/webllm"),c=i.filter(a=>n(a)==="api/openrouter");if(d.length>0&&await o._initWebLLM(d,t?.onProgress),c.length>0){if(!t?.openrouterApiKey)throw new Error("openrouterApiKey is required when using api/openrouter provider");o._initOpenRouter(c,t.openrouterApiKey);}return o._apiProviders.size>0&&P("api",(a,g)=>{let p=o._apiProviders.get(a);if(!p)throw new l(`Unknown api provider: ${a}`,g);return p}),o}async _initWebLLM(e,t){if(typeof navigator>"u"||!navigator.gpu)throw new Error("WebGPU is not available. Chrome 113+ or Edge 113+ required.");let o=await j("https://esm.run/@mlc-ai/web-llm"),i=e[0]?.inline?.model??"gemma-2-2b-it-q4f16_1-MLC",n=await o.CreateMLCEngine(i,{initProgressCallback:t?c=>t(c):void 0}),d=[];this._apiProviders.set("webllm",{async query(c,a){let g=[];a?.systemPrompt&&g.push({role:"system",content:a.systemPrompt}),g.push(...d),g.push({role:"user",content:c});let p="",u=await n.chat.completions.create({messages:g,stream:true,temperature:.7,max_tokens:4096});for await(let y of u){let v=y.choices?.[0]?.delta?.content??"";p+=v,a?.onOutput&&a.onOutput(p,"stdout");}return d.push({role:"user",content:c}),d.push({role:"assistant",content:p}),p},async execute(c,a){return this.query(c,a)}});}_initOpenRouter(e,t){let o=e[0]?.inline?.model??"google/gemma-2-2b-it",i=[];this._apiProviders.set("openrouter",{async query(n,d){let c=[];d?.systemPrompt&&c.push({role:"system",content:d.systemPrompt}),c.push(...i),c.push({role:"user",content:n});let a=await fetch("https://openrouter.ai/api/v1/chat/completions",{method:"POST",headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},body:JSON.stringify({model:d?.model||o,messages:c,stream:true})});if(!a.ok){let v=await a.text();throw new Error(`OpenRouter API error (${a.status}): ${v}`)}let g=a.body.getReader(),p=new TextDecoder,u="",y="";for(;;){let{done:v,value:T}=await g.read();if(v)break;y+=p.decode(T,{stream:true});let b=y.split(`
2
+ `);y=b.pop();for(let M of b){let h=M.trim();if(!h||!h.startsWith("data: "))continue;let k=h.slice(6);if(k!=="[DONE]")try{let O=JSON.parse(k).choices?.[0]?.delta?.content??"";u+=O,O&&d?.onOutput&&d.onOutput(u,"stdout");}catch{}}}return i.push({role:"user",content:n}),i.push({role:"assistant",content:u}),u},async execute(n,d){return this.query(n,d)}});}get agents(){return this._agents}get config(){return this._config}get tools(){return this._tools}registerTool(e,t){this._tools.set(e,{name:e,...t});}async query(e,t,o){let i=Date.now(),n;try{n=w(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 d=Array.isArray(n.provider)?n.provider[0]??"api/default":n.provider,c=o?.provider??d,a=o?.model??n.inline?.model,g;try{g=x(c);}catch(p){return {ok:false,data:"",error:{code:"PROVIDER_ERROR",message:p.message},meta:{agentId:n.id,provider:c,model:a,durationMs:Date.now()-i}}}try{return {ok:!0,data:await g.query(t,{model:a,context:o?.context,systemPrompt:n.inline?.system_prompt??n.inline?.prompt,onOutput:o?.onOutput?u=>o.onOutput(u):void 0}),meta:{agentId:n.id,provider:c,model:a,durationMs:Date.now()-i}}}catch(p){return {ok:false,data:"",error:{code:"QUERY_FAILED",message:p.message},meta:{agentId:n.id,provider:c,model:a,durationMs:Date.now()-i}}}}async execute(e,t,o){let i=Date.now(),n;try{n=w(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 d=Array.isArray(n.provider)?n.provider[0]??"api/default":n.provider,c=o?.provider??d,a=o?.model??n.inline?.model,g;try{g=x(c);}catch(p){return {ok:false,data:"",error:{code:"PROVIDER_ERROR",message:p.message},meta:{agentId:n.id,provider:c,model:a,durationMs:Date.now()-i}}}try{return {ok:!0,data:await g.execute(t,{model:a,context:o?.context,systemPrompt:n.inline?.system_prompt??n.inline?.prompt}),meta:{agentId:n.id,provider:c,model:a,durationMs:Date.now()-i}}}catch(p){return {ok:false,data:"",error:{code:"EXECUTE_FAILED",message:p.message},meta:{agentId:n.id,provider:c,model:a,durationMs:Date.now()-i}}}}};var F=z$1.object({model:z$1.string().optional(),system_prompt:z$1.string().optional(),prompt:z$1.string().optional(),layout:z$1.union([z$1.string(),z$1.object({id:z$1.string(),props:z$1.record(z$1.unknown()).optional()}),z$1.object({props:z$1.record(z$1.unknown())}),z$1.object({template:z$1.string()})]).optional()}).catchall(z$1.unknown()),U=z$1.object({include:z$1.array(z$1.string()).optional()}).optional(),N=z$1.object({id:z$1.string(),name:z$1.string().optional(),role:z$1.string().optional(),team:z$1.string().optional(),provider:z$1.union([z$1.string(),z$1.array(z$1.string())]),working_directory:z$1.string().optional(),description:z$1.string().optional(),tags:z$1.array(z$1.string()).optional(),inline:F.optional(),skills:U}).catchall(z$1.unknown());z$1.object({id:z$1.string(),name:z$1.string(),workflow_id:z$1.string(),description:z$1.string().optional(),goal_id:z$1.string().optional()});var L=z$1.object({bin_resolution:z$1.enum(["global_first","local_first"]).optional(),wi:z$1.object({boards:z$1.array(z$1.unknown()).optional().catch(()=>{})}).catchall(z$1.unknown()).optional().catch(()=>{})}).catchall(z$1.unknown()),_=z$1.object({agents:z$1.array(N).optional(),hooks:z$1.array(z$1.unknown()).optional(),settings:L.optional(),skills:z$1.unknown().optional(),layouts:z$1.record(z$1.unknown()).optional(),documents:z$1.record(z$1.unknown()).optional()}).catchall(z$1.unknown());var f=class extends Error{constructor(t,o){super(t);this.cause=o;this.name="ConfigLoadError";}cause};function Q(s){if(!s||typeof s!="string"||!s.trim())throw new f("YAML content must be a non-empty string");let e;try{e=load(s);}catch(i){throw new f(`YAML parse error: ${i.message}`,i)}let t=W(e),o=_.safeParse(t);if(!o.success)throw new f(`Config validation error: ${o.error.message}`);return o.data}function W(s){if(!s||typeof s!="object")return {agents:[]};let e=s;if(e.agents&&typeof e.agents=="object"&&!Array.isArray(e.agents)){let t=e.agents,o=Object.entries(t).map(([i,n])=>({id:i,...n&&typeof n=="object"?n:{}}));return {...e,agents:o}}return e.agents?e:{...e,agents:[]}}var $="crewx:fs:",C=class{prefix;store;constructor(e){this.prefix=e?.prefix??$,this.store=e?.storage??new Map;}async readFile(e){let t=this.toKey(e),o=this.store.get(t);if(o===void 0)throw new Error(`BrowserFsAdapter: file not found: ${e}`);return o}async exists(e){return this.store.has(this.toKey(e))}resolvePath(...e){let t=e.map(d=>d.replace(/\\/g,"/")).join("/").replace(/\/+/g,"/"),o=t.split("/"),i=[];for(let d of o)d==="."||d===""||(d===".."?i.pop():i.push(d));let n=i.join("/");return t.startsWith("/")?`/${n}`:n}isAbsolute(e){return e.startsWith("/")}setItem(e,t){this.store.set(this.toKey(e),t);}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))}async readdir(e){let t=e.replace(/\\/g,"/").replace(/\/$/,""),o=this.toKey(t+"/"),i=[];for(let n of this.store.keys())if(n.startsWith(o)){let c=n.slice(o.length).split("/")[0];c&&!i.includes(c)&&i.push(c);}return i}toKey(e){return `${this.prefix}${e.replace(/\\/g,"/")}`}};var E=["codex","claude","opencode","antigravity","copilot"];function B(s){let e=s.indexOf("/");return e===-1?s:s.slice(e+1)}function R(s){let e=B(s),t=E.indexOf(e);return t===-1?E.length:t}function K(s,e){return R(s)-R(e)}var z=new Set(["claude","copilot","codex","opencode"]);function q(s){if(!s)return "";if(s.startsWith("acp/")){let e=s.slice(4);if(z.has(e))return `cli/${e}`}return s}export{C as BrowserFsAdapter,f as ConfigLoadError,A as Crewx,E as PROVIDER_ORDER,l as ProviderError,K as compareProviders,x as createProvider,q as normalizeProviderId,Q as parseYamlContent,R as providerRank,P as registerProviderFactory};
package/dist/index.d.ts CHANGED
@@ -18,14 +18,25 @@ export { NodeFsAdapter, defaultFsAdapter } from './platform/NodeFsAdapter';
18
18
  export { BrowserFsAdapter } from './platform/BrowserFsAdapter';
19
19
  export { truncateHelper, lengthHelper, escapeHandlebarsHelper, formatFileSizeHelper, formatTimestampHelper, } from './template/helpers/p1p2';
20
20
  export { setAuditVerbose } from './template/helpers/exec';
21
- export type { AgentConfig, CrewxProjectConfig, CrewxOptions, QueryOptions, QueryResult, ExecuteOptions, ExecuteResult, TraceContext, YamlHookEntry, GuideRule, } from './types';
22
- export { AgentSkillsSchema } from './types';
21
+ export type { AgentConfig, CrewxProjectConfig, CrewxOptions, QueryOptions, QueryResult, ExecuteOptions, ExecuteResult, TraceContext, YamlHookEntry, GuideRule, WiBoardConfig, } from './types';
22
+ export { AgentSkillsSchema, WiBoardSchema } from './types';
23
23
  export { loadYamlFile, parseYamlContent, ConfigLoadError } from './config/loader';
24
+ export { resolveWiBoards, isReservedWiBoardId, WI_BOARD_ID_PATTERN, DEFAULT_WI_BOARD_ID, ARCHIVE_WI_BOARD_ID, } from './config/wi-boards';
25
+ export type { ResolvedWiBoard } from './config/wi-boards';
26
+ export { createGlobalSettingsStore } from './config/global-settings';
27
+ export type { GlobalSettings, GlobalSettingsStore, DeepPartial, CreateGlobalSettingsStoreOptions } from './config/global-settings';
28
+ export { resolveOverdrive, parseOverdriveProfile, parseOverdriveSignal, } from './config/overdrive';
29
+ export type { OverdriveProfile, OverdriveSignal, OverdriveSignalInput, OverdriveResolution, } from './config/overdrive';
30
+ export { canonicalizeAgentOptions } from './config/canonicalize-agent-options';
31
+ export type { AgentOptionsLike, CanonicalizeAgentOptionsInput, CanonicalizeAgentOptionsResult, } from './config/canonicalize-agent-options';
32
+ export { initPricingRemote } from './config/pricing.remote';
33
+ export { initModelsRemote } from './config/models.remote';
24
34
  export { resolveAgent, AgentNotFoundError } from './agent/resolver';
25
35
  export { resolveAgentSkills } from './agent/resolve-skills';
26
- export { PROVIDER_ORDER, providerRank, compareProviders } from './provider/order';
27
- export { createProvider, ProviderError, ClientToolCallRequiredError, registerProviderFactory } from './provider/bridge';
28
- export type { ProviderRuntime, ProviderQueryOptions, ProviderFactory, ProviderUsage, ClientToolCall, ContinuationState } from './provider/bridge';
36
+ export { PROVIDER_ORDER, providerRank, compareProviders, normalizeProviderId } from './provider/order';
37
+ export { getProviderModels, getClaudeModels, getCodexModels, getCopilotModels, getAntigravityModels, setModelsOverride, clearModelsOverride, mergeModels, type ModelCatalogEntry, } from './provider/models';
38
+ export { createProvider, ProviderError, ClientToolCallRequiredError, registerProviderFactory, mergeAdditionalArgs } from './provider/bridge';
39
+ export type { ProviderRuntime, ProviderQueryOptions, ProviderFactory, ProviderUsage, ClientToolCall, ContinuationState, AdditionalArgsProvider } from './provider/bridge';
29
40
  export { VercelProviderRuntime } from './provider/vercel-runtime';
30
41
  export type { VercelProviderConfig } from './provider/vercel-runtime';
31
42
  export { registerApiProviders } from './provider/register-api';
@@ -33,7 +44,7 @@ export * from './provider/acp/index.js';
33
44
  export type { CliProviderAdapter } from './provider/cli/adapter.types';
34
45
  export { RateLimitError } from './provider/cli/adapter.types';
35
46
  export { BUILTIN_ADAPTERS, claudeAdapter, copilotAdapter, codexAdapter, opencodeAdapter } from './provider/cli/adapters/index';
36
- export { queryAllCliProviderMetas } from './provider/cli/meta';
47
+ export { queryAllCliProviderMetas, queryOpencodeModels } from './provider/cli/meta';
37
48
  export { createDelegateTool } from './tools/delegate';
38
49
  export { resolveTemplatesPath, resolveDefaultAgentsYaml } from './paths';
39
50
  export { resolveCrewxCli, resolveCrewxWorkspace } from './utils/env-defaults';