@crewx/cli 0.9.0-rc.160 → 0.9.0-rc.162
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/bootstrap/crewx-cli.js +1 -1
- package/dist/bootstrap/rate-limit-snapshot.d.ts +15 -0
- package/dist/bootstrap/rate-limit-snapshot.js +1 -0
- package/dist/commands/agent.d.ts +1 -0
- package/dist/commands/agent.js +5 -3
- package/dist/commands/ai-account.d.ts +4 -0
- package/dist/commands/ai-account.js +27 -0
- package/dist/commands/detached.d.ts +7 -0
- package/dist/commands/detached.js +12 -12
- package/dist/commands/execute.js +8 -8
- package/dist/commands/query.js +11 -11
- package/dist/commands/registry.js +1 -1
- package/dist/main.js +9 -4
- package/package.json +15 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.createCliCrewx=
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.createCliCrewx=m;const n=require("fs");const t=require("path");const x=require("os");const s=require("@crewx/sdk");const h=require("@crewx/workflow/list");const a=require("@crewx/sdk/plugins");const l=require("@crewx/sdk/repository");const y=require("../register-builtin-tools");const _=require("../utils/version");const R=require("../utils/inherited-trace");const d=require("./codex-writable-roots");const k=require("./rate-limit-snapshot");async function m(v=process.env.CREWX_CONFIG??"crewx.yaml"){const o=(0,t.resolve)(v);const u=process.cwd();const C=Boolean(process.env.CREWX_CONFIG);const P=(0,n.existsSync)(o);let e;if(P){e=o}else if(C){throw new Error(`[crewx] Config file not found: ${o} (set via CREWX_CONFIG)`)}else{e=void 0}const f=e!==void 0?(0,t.dirname)(o):void 0;const c=process.env.CREWX_DB||(0,t.join)((0,x.homedir)(),".crewx","crewx.db");(0,n.mkdirSync)((0,t.dirname)(c),{recursive:true});const w=(0,l.openDrizzleDb)(c);try{(0,l.runMigrations)(w.db)}finally{w.close()}const r=await s.Crewx.loadYaml(e,{remoteFactory:m,inheritWorktreeOwner:true,additionalArgsProvider:(0,d.composeAdditionalArgsProviders)((0,d.createCodexWritableRootsProvider)(),(0,d.createCodexSkipGitRepoCheckProvider)(f)),onRateLimitObserved:(0,k.createRateLimitSnapshotObserver)()});(0,y.registerBuiltinToolsIfNeeded)(r);r.registerPromptListProvider(s.Crewx.createAgentListPromptResolver(e));r.registerPromptListProvider((0,h.createWorkflowListPromptResolver)(e));await r.use(new a.ConversationPlugin({dbPath:c}));await r.use(new a.FileLoggerPlugin({version:_.CLI_VERSION,workspaceRoot:u}));await r.use(new a.SqliteTracingPlugin({version:_.CLI_VERSION,runnerIdentity:(0,R.consumeInheritedRunnerIdentity)(),inheritWorktreeOwner:true}));const p=e!==void 0?(0,t.dirname)(e):u;const g=(0,s.normalizeWorkspacePath)(p);const i=(0,s.resolveWorkspaceOwnerPath)(p);if(i!==g&&((0,n.existsSync)((0,t.join)(i,"crewx.yaml"))||(0,n.existsSync)((0,t.join)(i,"crewx.yml")))){try{new l.WorkspaceRepository().registerWorkspace(i)}catch{}}return r}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ProviderRateLimitObservation } from '@crewx/sdk';
|
|
2
|
+
import { UsageLimitSnapshotRepository } from '@crewx/sdk/repository';
|
|
3
|
+
/** At most one snapshot write per account and window within this window of observations. */
|
|
4
|
+
export declare const RATE_LIMIT_SNAPSHOT_THROTTLE_MS = 30000;
|
|
5
|
+
/**
|
|
6
|
+
* Persists the Claude usage windows observed during a run into usage_limit_snapshots,
|
|
7
|
+
* keyed by the named account that ran it. The server reads tokens only for the default login,
|
|
8
|
+
* so named accounts get their limit history from these observations.
|
|
9
|
+
*
|
|
10
|
+
* Only named accounts are written. The default login's rows belong to the server's oauth
|
|
11
|
+
* writer, which uses the same unique key; writing them here would make the source flip.
|
|
12
|
+
*
|
|
13
|
+
* Observation only: a failed write is logged and never fails or slows the run.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createRateLimitSnapshotObserver(sink?: Pick<UsageLimitSnapshotRepository, 'upsert'>): (observation: ProviderRateLimitObservation) => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.RATE_LIMIT_SNAPSHOT_THROTTLE_MS=void 0;exports.createRateLimitSnapshotObserver=S;const u=require("@crewx/sdk");const _=require("@crewx/sdk/repository");exports.RATE_LIMIT_SNAPSHOT_THROTTLE_MS=3e4;const T=[["five_hour","five_hour"],["seven_day","weekly"]];function S(e=new _.UsageLimitSnapshotRepository){const n=new Map;return t=>{if(t.provider!=="cli/claude")return;if(t.accountId===u.DEFAULT_AI_ACCOUNT_ID)return;const r=t.observedAt.getTime();for(const[a,o]of T){const i=t.windows[a];if(!i)continue;const s=`${t.accountId}:${o}`;const c=n.get(s);if(c!==void 0&&r-c<exports.RATE_LIMIT_SNAPSHOT_THROTTLE_MS)continue;n.set(s,r);try{e.upsert(f(t,o,i))}catch(d){console.error(`[crewx] rate-limit snapshot write failed (${o}): ${I(d)}`)}}}}function f(e,n,t){const r=A(t.utilization);return{id:(0,u.generateId)("uls"),provider:"claude",accountRef:e.accountId,limitWindow:n,bucketStartMs:e.observedAt.getTime(),capturedAt:e.observedAt.toISOString(),usedPercent:r,remainingPercent:100-r,resetsAt:p(t.resetsAt),source:"cli_observed"}}function A(e){return Math.round(Math.min(1,Math.max(0,e))*100)}function p(e){return new Date(e*1e3).toISOString()}function I(e){return e instanceof Error?e.message:String(e)}
|
package/dist/commands/agent.d.ts
CHANGED
package/dist/commands/agent.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.handleAgent=
|
|
2
|
-
\u{1F916} **Rendered Prompt for Agent: ${
|
|
3
|
-
`);console.log("--- BEGIN PROMPT ---");console.log(e);console.log("--- END PROMPT ---")}catch(e){const
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.handleAgent=v;const u=require("fs");const f=require("../bootstrap/crewx-cli");const d=require("@crewx/sdk");function l(n,o){const t=`--${o}=`;for(let e=0;e<n.length;e++){if(n[e].startsWith(t)){return n[e].slice(t.length)}if(n[e]===`--${o}`&&e+1<n.length){return n[e+1]}}return void 0}function m(n,o,t){console.log((0,d.formatAgentList)({agents:n,total:o,isFiltered:t,configPath:process.env.CREWX_CONFIG??null}))}async function p(n,o){const t=l(o,"role");const e=l(o,"team");const r=l(o,"provider");const c=!!(t||e||r);const g=n.agents.size;const i=n.filterAgents({role:t,team:e,provider:r});m(i,g,c)}async function x(n,o){const t=o.find(e=>!e.startsWith("--"));if(!t){console.error("Missing agent ID. Usage: crewx agent prompt @agent_name");process.exit(1)}try{const e=await n.renderAgentPromptFull(t,{env:process.env,session:{mode:"query",platform:"cli"}});const r=t.startsWith("@")?t.slice(1):t;console.log(`
|
|
2
|
+
\u{1F916} **Rendered Prompt for Agent: ${r}**
|
|
3
|
+
`);console.log("--- BEGIN PROMPT ---");console.log(e);console.log("--- END PROMPT ---")}catch(e){const r=e instanceof Error?e.message:String(e);console.error(`Failed to get agent prompt: ${r}`);process.exit(1)}}function w(n){const o=[];for(let t=0;t<n.length;t++){const e=n[t];if(e==="--json")continue;if(e.startsWith("--")){if(!e.includes("="))t++;continue}o.push(e)}return o}async function h(n,o){if((o[0]??"").toLowerCase()!=="test"){console.error('Usage: crewx agent interceptor test <agentId> --phase request|response --text "<text>" [--json]');process.exit(1)}const t=o.slice(1);const e=w(t)[0];const r=l(t,"phase");const c=l(t,"text");const g=t.includes("--json");if(!e||r!=="request"&&r!=="response"||c===void 0){console.error('Usage: crewx agent interceptor test <agentId> --phase request|response --text "<text>" [--json]');process.exit(1)}const i=e.startsWith("@")?e.slice(1):e;let a;try{a=await n.testAgentInterceptors(i,r,c)}catch(s){if(s instanceof d.AgentInterceptorConfigError){console.error(`${s.code}: ${s.message}`);process.exit(1)}throw s}if(!a){if(g){console.log(JSON.stringify({agentId:i,phase:r,status:"passed",text:c,changed:false,steps:[]},null,2))}else{console.log(`@${i} has no enabled ${r} interceptors; the text passes unchanged.`)}return}if(g){console.log(JSON.stringify({agentId:i,...a},null,2))}else{console.log(`Interceptor test: @${i} ${r} lane`);for(const s of a.steps){console.log(` [${s.outcome}] ${s.name} (${s.type}, ${s.mode}, failOpen=${s.failOpen}) ${s.durationMs}ms`);if(s.error)console.log(` error ${s.error.code}: ${s.error.message}`);if(s.verdict)console.log(` verdict valid=${s.verdict.valid}${s.verdict.severity?` severity=${s.verdict.severity}`:""}`)}if(a.status==="passed"){console.log(`Final text${a.changed?" (changed)":""}:`);console.log(a.text)}else{console.log(`INTERCEPTOR_BLOCKED: ${a.blocked?.message??"blocked"}`)}}if(a.status==="blocked")process.exit(1)}async function v(n){const o=process.env.CREWX_CONFIG??"crewx.yaml";let t;try{t=await(0,f.createCliCrewx)(o)}catch(r){if(r instanceof d.ConfigLoadError&&!(0,u.existsSync)(o)){const c=(n[0]??"").toLowerCase();if(!c||c==="ls"||c==="list"){console.log("WARNING: No agents configured.");console.log(`No crewx.yaml found. Run 'crewx init' to create one.`);return}}throw r}const e=(n[0]??"").toLowerCase();switch(e){case"ls":case"list":await p(t,n.slice(1));return;case"":await p(t,n.slice(1));return;case"prompt":case"p":await x(t,n.slice(1));return;case"interceptor":await h(t,n.slice(1));return;default:console.error(`Unknown agent subcommand: ${e}`);y();process.exit(1)}}function y(){console.log(`
|
|
4
4
|
CrewX Agent Management
|
|
5
5
|
|
|
6
6
|
Usage:
|
|
@@ -8,6 +8,8 @@ Usage:
|
|
|
8
8
|
crewx agent ls # List configured agents
|
|
9
9
|
crewx agent list # Alias for ls
|
|
10
10
|
crewx agent prompt <id> # Inspect rendered agent prompt
|
|
11
|
+
crewx agent interceptor test <id> --phase request|response --text "<text>" [--json]
|
|
12
|
+
# Dry-run an agent's interceptor chain on a text (no agent start)
|
|
11
13
|
|
|
12
14
|
Filter Options (for agent ls):
|
|
13
15
|
--role <value> Filter by agent role (comma-separated for multiple: PM,Dev)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.runAiAccountCommand=w;exports.handleAiAccount=y;const f=require("child_process");const s=require("@crewx/sdk");const d=require("./parse-common-flags");const v={claude:"cli/claude","cli/claude":"cli/claude",codex:"cli/codex","cli/codex":"cli/codex"};const u=`Usage:
|
|
2
|
+
crewx ai-account list [--provider claude|codex] [--json]
|
|
3
|
+
crewx ai-account add --provider claude|codex --label <name> [--json]
|
|
4
|
+
crewx ai-account login <id> [--provider claude|codex]
|
|
5
|
+
crewx ai-account status <id> [--provider claude|codex] [--json]
|
|
6
|
+
crewx ai-account use <id> --provider claude|codex
|
|
7
|
+
crewx ai-account remove <id>`;function g(o){if(o===void 0)return void 0;const t=v[o];if(!t)throw new d.UnknownOptionError(`Unknown provider: ${o} (use claude or codex)`);return t}function m(o){const t={positional:[],json:false};for(let i=0;i<o.length;i+=1){const e=o[i];if(e==="--json"){t.json=true}else if(e==="--provider"||e.startsWith("--provider=")){const n=e.includes("=")?e.slice("--provider=".length):o[++i];t.provider=g(n)}else if(e==="--label"||e.startsWith("--label=")){t.label=e.includes("=")?e.slice("--label=".length):o[++i]}else if(e.startsWith("--")){throw new d.UnknownOptionError(`Unknown option: ${e}`)}else{t.positional.push(e)}}return t}function p(o){let t=0;for(const i of o){const e=i.codePointAt(0)??0;const n=e>=4352&&e<=4447||e>=11904&&e<=42191||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65280&&e<=65376;t+=n?2:1}return t}function h(o){const t=o.map(r=>[r.provider,r.id,r.active?"*":"",r.label,r.dir]);const i=["PROVIDER","ID","ACTIVE","LABEL","DIR"];const e=i.map((r,c)=>Math.max(p(r),...t.map(a=>p(a[c]))));const n=r=>r.map((c,a)=>c+" ".repeat(e[a]-p(c))).join(" ").trimEnd();return[n(i),...t.map(n)].join("\n")}function x(o){return o?[o]:["cli/claude","cli/codex"]}function $(o,t,i,e){if(o==="cli/codex"){const a=t.trim();return{loggedIn:i===0,lines:[...a?[a]:[],`loggedIn:${i===0}`,`configDirectory:${e}`]}}let n={};try{n=JSON.parse(t)}catch{}const r=n.loggedIn===true;const c=[`loggedIn:${r}`];if(typeof n.authMethod==="string")c.push(`authMethod:${n.authMethod}`);if(typeof n.subscriptionType==="string")c.push(`subscriptionType:${n.subscriptionType}`);c.push(`configDirectory:${e}`);return{loggedIn:r,lines:c}}function A(o,t,i){const e=(0,s.getStatusInvocation)(o,t);const n=(0,f.spawnSync)(e.command,e.argv,{env:(0,s.applyAiAccountEnv)(process.env,e),encoding:"utf8",timeout:3e4});if(n.error){process.stderr.write(`Could not start ${e.command}: ${n.error.message}
|
|
8
|
+
`);return 2}const r=e.command==="codex"?"cli/codex":"cli/claude";const c=e.env.CLAUDE_CONFIG_DIR??e.env.CODEX_HOME??E(r);const a=r==="cli/codex"?`${n.stdout??""}${n.stderr??""}`:n.stdout??"";const l=$(r,a,n.status??1,c);if(i){process.stdout.write(`${JSON.stringify({id:o,provider:r,loggedIn:l.loggedIn,configDirectory:c})}
|
|
9
|
+
`)}else{process.stdout.write(`${l.lines.join("\n")}
|
|
10
|
+
`)}return l.loggedIn?0:1}function E(o){return(0,s.listAiAccounts)(o).find(t=>t.builtIn)?.dir??""}function O(o,t){const i=(0,s.getLoginInvocation)(o,t);process.stdout.write(`Running official login: ${i.command} ${i.argv.join(" ")}
|
|
11
|
+
`);const e=(0,f.spawnSync)(i.command,i.argv,{env:(0,s.applyAiAccountEnv)(process.env,i),stdio:"inherit"});if(e.error){process.stderr.write(`Could not start ${i.command}: ${e.error.message}
|
|
12
|
+
`);return 2}return e.status??1}function w(o){const[t,...i]=o;const e=m(i);const n=e.positional[0];try{switch(t){case"list":{const r=x(e.provider).flatMap(c=>(0,s.listAiAccounts)(c));process.stdout.write(e.json?`${JSON.stringify(r)}
|
|
13
|
+
`:`${h(r)}
|
|
14
|
+
`);return 0}case"add":{if(!e.provider)throw new d.UnknownOptionError("add requires --provider claude|codex");if(e.label===void 0)throw new d.UnknownOptionError("add requires --label <name>");const r=(0,s.addAiAccount)(e.provider,e.label);if(e.json){process.stdout.write(`${JSON.stringify({provider:e.provider,...r})}
|
|
15
|
+
`)}else{process.stdout.write(`added ${r.id} for ${e.provider}
|
|
16
|
+
configDirectory:${r.dir}
|
|
17
|
+
next: crewx ai-account login ${r.id}
|
|
18
|
+
`)}return 0}case"login":{if(!n)throw new d.UnknownOptionError(`login requires an account id
|
|
19
|
+
${u}`);return O(n,e.provider)}case"status":{if(!n)throw new d.UnknownOptionError(`status requires an account id
|
|
20
|
+
${u}`);return A(n,e.provider,e.json)}case"use":{if(!n)throw new d.UnknownOptionError(`use requires an account id
|
|
21
|
+
${u}`);if(!e.provider)throw new d.UnknownOptionError("use requires --provider claude|codex");(0,s.setActiveAiAccount)(e.provider,n);process.stdout.write(`active account for ${e.provider}: ${n}
|
|
22
|
+
`);return 0}case"remove":{if(!n)throw new d.UnknownOptionError(`remove requires an account id
|
|
23
|
+
${u}`);const r=(0,s.removeAiAccount)(n);process.stdout.write(`removed ${n} (${r.provider}); its config directory was kept on disk
|
|
24
|
+
`);return 0}default:process.stderr.write(`${u}
|
|
25
|
+
`);return 2}}catch(r){if(r instanceof s.AiAccountError){process.stderr.write(`Error [${r.code}]: ${r.message}
|
|
26
|
+
`);return 2}if(r instanceof d.UnknownOptionError){process.stderr.write(`${r.message}
|
|
27
|
+
`);return 2}throw r}}async function y(o){process.exitCode=w(o)}
|
|
@@ -71,6 +71,13 @@ export type AssignedTaskAdoption = {
|
|
|
71
71
|
export declare function adoptAssignedTask(taskRepo: Pick<TaskRepository, 'adoptPendingTask'>, taskId: string, detachedRunner: boolean): AssignedTaskAdoption;
|
|
72
72
|
/** Read the actor persisted on the receipt after the runner adopts it. */
|
|
73
73
|
export declare function readAssignedTaskActor(taskRepo: Pick<TaskRepository, 'getTask'>, taskId: string): TaskActor;
|
|
74
|
+
/**
|
|
75
|
+
* Provider account id recorded on the adopted task row. The detached child runs
|
|
76
|
+
* on that account instead of whatever is active when it starts. The value comes
|
|
77
|
+
* from the row, never from process.env. Absent or unreadable metadata means
|
|
78
|
+
* "no pin": the SDK resolves the account as for any other run.
|
|
79
|
+
*/
|
|
80
|
+
export declare function readAssignedTaskProviderAccountId(taskRepo: Pick<TaskRepository, 'getTask'>, taskId: string): string | undefined;
|
|
74
81
|
export interface DetachedMiddleHop {
|
|
75
82
|
taskId: string;
|
|
76
83
|
logPath: string;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.resolveCliTaskActor=V;exports.resolveReceiptActor=X;exports.reportAdmissionBlocked=B;exports.extractReceiptFlags=he;exports.resolveReceiptMode=_e;exports.buildDetachedRunnerArgs=Y;exports.adoptAssignedTask=we;exports.readAssignedTaskActor=me;exports.readDetachedMiddleHop=Ee;exports.runDetachedMiddle=xe;exports.runDetached=
|
|
2
|
-
`)}const le=200;const
|
|
3
|
-
`);return false}const s=e.getTask(t);if(s&&s.status!=="pending")return true}catch(
|
|
4
|
-
`);return false}function
|
|
5
|
-
`);return}if(s)process.stderr.write(`mode=receipt reason=${
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.resolveCliTaskActor=V;exports.resolveReceiptActor=X;exports.reportAdmissionBlocked=B;exports.extractReceiptFlags=he;exports.resolveReceiptMode=_e;exports.buildDetachedRunnerArgs=Y;exports.adoptAssignedTask=we;exports.readAssignedTaskActor=me;exports.readAssignedTaskProviderAccountId=Te;exports.readDetachedMiddleHop=Ee;exports.runDetachedMiddle=xe;exports.runDetached=ye;const F=require("child_process");const l=require("fs");const y=require("path");const ne=require("os");const v=require("@crewx/sdk");const se=require("@crewx/sdk/node");const oe=require("@crewx/sdk/repository");const ie=require("./parse-agent-message");const j=require("./parse-common-flags");const ce=require("./resolve-recipient");const ae=require("./resolve-prompt");const de=require("../utils/version");const G=require("../utils/inherited-trace");const U=require("./cal");const ue=require("./emit-trailer");function b(e){return typeof e==="string"&&e.trim().length>0?e.trim():void 0}function V(e,t=process.env["CREWX_AGENT_ID"]){const n=b(e.schedule_id);if(n)return{actorKind:"system",actorId:`cron:${n}`};const r=e.workflow;const s=r!==null&&typeof r==="object"&&!Array.isArray(r)?r:void 0;const o=b(s?.exec_id);if(o)return{actorKind:"system",actorId:`workflow:${o}`};const i=b(t);if(i)return{actorKind:"agent",actorId:i};if(process.stdin.isTTY===true||process.stderr.isTTY===true){return{actorKind:"human",actorId:(0,se.getLocalActorId)()}}return{actorKind:"unknown",actorId:null}}function X(e,t=process.env["CREWX_AGENT_ID"]){const n=V(e,t);return{kind:n.actorKind,id:n.actorId}}function B(e){process.stderr.write(`${e.message}
|
|
2
|
+
`)}const le=200;const J=3e4;const fe=["--to","--thread","--provider","--model","--metadata","--config","-c","--output-format","--effort","--prompt-file","-f","--out","-o"];const z="--__crewx-detached-middle";const q="--__crewx-detached-task";const C="--__crewx-detached-log";const L="--__crewx-detached-token";const M="CREWX_DETACHED_HOP_TOKEN";function pe(e){return fe.some(t=>e===t||e.startsWith(`${t}=`))}function ge(e){return e==="--prompt-file"||e==="-f"||e.startsWith("--prompt-file=")||e.startsWith("-f=")}function he(e){const t=[];let n=false;let r=false;let s=false;for(const o of e){if(!s&&o==="--"){s=true;t.push(o);continue}if(!s&&(o==="--detach"||o==="--async")){n=true;continue}if(!s&&(o==="--wait"||o.startsWith("--wait="))){r=true;continue}t.push(o)}return{detach:n,wait:r,rest:t}}function _e(e){if(e.wait)return{receipt:false,reason:"wait"};if(e.detachedRunner)return{receipt:false,reason:"detached-runner"};if(e.detach)return{receipt:true,reason:"explicit-detach"};if(e.agentContext)return{receipt:true,reason:"agent-context"};return{receipt:false,reason:"default"}}function h(e){return e instanceof Error?e.message:String(e)}function ke(e,t,n,r={}){return new Promise((s,o)=>{let i=false;let c;let _;const T=()=>{if(c!==void 0)clearInterval(c);if(_!==void 0)clearTimeout(_)};const A=a=>{if(i)return;i=true;T();s(a)};const k=(a,g=false)=>{try{const f=e.getTask(t);if(f&&f.status!=="pending"){A({kind:"adopted"});return}if(a!==void 0){A({kind:"exited",reason:a});return}if(g)A({kind:"timeout"})}catch(f){if(i)return;i=true;T();o(f)}};n.on("error",a=>{k(`Runner failed before adopting task: ${h(a)}`)});n.on("exit",(a,g)=>{if(r.ignoreSuccessfulExit&&a===0&&g===null)return;const f=g?`signal ${g}`:`exit ${a??"unknown"}`;k(`Runner exited before adopting task (${f})`)});c=setInterval(()=>k(),le);_=setTimeout(()=>k(void 0,true),J);k()})}function P(e,t,n){try{const r=e.failPendingTask(t,n);if(r){process.stderr.write(`Detached task ${t} failed: ${n}
|
|
3
|
+
`);return false}const s=e.getTask(t);if(s&&s.status!=="pending")return true}catch(r){n+=`; could not persist failure: ${h(r)}`}process.stderr.write(`Detached task ${t} failed: ${n}
|
|
4
|
+
`);return false}function I(e,t,n,r,s,o,i){let c="pending";try{const T=e.getTask(t);c=T?.status==="pending"?"pending":"running"}catch{}if(o==="json"){process.stdout.write(`${JSON.stringify({taskId:t,status:c,mode:"receipt",logPath:n})}
|
|
5
|
+
`);return}if(s)process.stderr.write(`mode=receipt reason=${r}
|
|
6
6
|
`);process.stdout.write(`${t}
|
|
7
7
|
`);process.stderr.write(`Task ${t} accepted. This ID is the handle (not a PID).
|
|
8
8
|
`);if(i&&s)process.stderr.write(`${i}
|
|
9
|
-
`);const _=(0,U.suggestWaitSeconds)({startedAt:null});(0,U.writeCalFooter)({commandId:"crewx.receipt",params:{taskId:t,wait:String(_)}})}function Y(e,t,
|
|
10
|
-
`);return{kind:"failed"}}process.stderr.write(`${
|
|
11
|
-
`);return{kind:"stale"}}function me(e,t){const
|
|
12
|
-
`);process.exit(1);return}process.exit(0)}async function
|
|
13
|
-
`);(0,ue.emitDelegationResult)({command:e,trace:(0,G.readInheritedTrace)(),isError:true});process.exit(2);return}if(!a){console.error("Usage: crewx q|x --to <agent> <message> [options]");console.error(" @agent is a positional shorthand for selecting a recipient.");console.error(" Task body can also be supplied via stdin pipe or --prompt-file.");process.exit(1);return}let
|
|
14
|
-
`);process.exit(2);return}const
|
|
15
|
-
`);process.exit(1);return}
|
|
9
|
+
`);const _=(0,U.suggestWaitSeconds)({startedAt:null});(0,U.writeCalFooter)({commandId:"crewx.receipt",params:{taskId:t,wait:String(_)}})}function Y(e,t,n){const r=[];for(let s=0;s<e.length;s+=1){const o=e[s];if(o==="--")break;if(o==="--verbose"||o==="--overdrive"){r.push(o);continue}if(o==="--var"){const i=e[s+1];if(i!==void 0){r.push(o,i);s+=1}continue}if(o.startsWith("--var=")){r.push(o);continue}if(o==="--to"){s+=1;continue}if(o.startsWith("--to="))continue;if(!pe(o))continue;if(ge(o)){if(!o.includes("="))s+=1;continue}r.push(o);if(!o.includes("=")){const i=e[s+1];if(i!==void 0){r.push(i);s+=1}}}return[...r,...t?[t]:[],"--",n]}function Q(e){if(e==="execute")return"x";if(e==="query")return"q";return e}function Z(e){const t={...process.env};delete t[M];if(process.versions.electron){t.ELECTRON_RUN_AS_NODE="1"}t.CREWX_DETACHED_RUNNER="1";t.CREWX_ASSIGNED_TASK_ID=e;return t}function we(e,t,n){if(e.adoptPendingTask(t)){return{kind:"adopted",taskId:t}}const r=`stale assigned id ${t}: expected pending task with pid NULL`;if(n){process.stderr.write(`Detached runner failed to adopt task ${t}: ${r}
|
|
10
|
+
`);return{kind:"failed"}}process.stderr.write(`${r}
|
|
11
|
+
`);return{kind:"stale"}}function me(e,t){const n=e.getTask(t);const r=n?.actor_kind;if(r===null||r===void 0){return{actorKind:"unknown",actorId:null}}if(r==="human"||r==="agent"||r==="system"||r==="unknown"){return{actorKind:r,actorId:n?.actor_id??null}}return{actorKind:"unknown",actorId:n?.actor_id??null}}function Te(e,t){const n=e.getTask(t)?.metadata;if(!n)return void 0;try{const r=JSON.parse(n);if(typeof r!=="object"||r===null||Array.isArray(r))return void 0;const s=r.provider_account_id;return typeof s==="string"&&s.trim().length>0?s.trim():void 0}catch{return void 0}}function Ae(e){const t={...process.env};if(process.versions.electron){t.ELECTRON_RUN_AS_NODE="1"}t[M]=e;return t}function Ee(e){let t=false;let n;let r;let s;let o=false;const i=[];for(const c of e){if(!o&&c==="--"){o=true;i.push(c);continue}if(!o&&c===z){t=true;continue}if(!o&&c.startsWith(`${q}=`)){n=c.slice(`${q}=`.length);continue}if(!o&&c.startsWith(`${C}=`)){r=c.slice(`${C}=`.length);continue}if(!o&&c.startsWith(`${L}=`)){s=c.slice(`${L}=`.length);continue}i.push(c)}if(!t||!n||!r||!s||s!==process.env[M]){return void 0}return{taskId:n,logPath:r,runnerArgs:i}}async function xe(e,t){let n;try{const r=(0,y.dirname)(t.logPath);if(!(0,l.existsSync)(r))(0,l.mkdirSync)(r,{recursive:true});n=(0,l.openSync)(t.logPath,"a");const s=process.argv[1];const o=(0,F.spawn)(process.execPath,[s,Q(e),...t.runnerArgs],{detached:true,windowsHide:true,stdio:["ignore",n,n],env:Z(t.taskId)});(0,l.closeSync)(n);n=void 0;o.unref()}catch(r){if(n!==void 0)(0,l.closeSync)(n);process.stderr.write(`Runner failed before adopting task: ${h(r)}
|
|
12
|
+
`);process.exit(1);return}process.exit(0)}async function ye(e,t,n,r=t){const s=(0,j.parseCommonFlags)(t);const{thread:o,metadata:i,promptFile:c,rest:_,to:T}=s;const{agentRef:A,message:k}=(0,ie.parseAgentMessage)(_);const a=await(0,ae.resolvePrompt)(k,c);let g;try{({agentRef:g}=(0,ce.resolveRecipient)({positionalRef:A,toFlag:T,agentContext:Boolean(process.env["CREWX_AGENT_ID"]),bodyForHint:a,command:e,invocationArgs:r}))}catch(u){const x=h(u);process.stderr.write(`Error: ${x}
|
|
13
|
+
`);(0,ue.emitDelegationResult)({command:e,trace:(0,G.readInheritedTrace)(),isError:true});process.exit(2);return}if(!a){console.error("Usage: crewx q|x --to <agent> <message> [options]");console.error(" @agent is a positional shorthand for selecting a recipient.");console.error(" Task body can also be supplied via stdin pipe or --prompt-file.");process.exit(1);return}let f;try{f=(0,j.parseMetadata)(i)}catch(u){process.stderr.write(`Error: ${h(u)}
|
|
14
|
+
`);process.exit(2);return}const E=(0,v.admitDurableTask)(`direct-cli:${e}`);if(!E.ok){B(E);process.exit(1);return}const d=E.taskId;const ee=new Date().toISOString();const R=process.cwd();const te=(0,l.existsSync)((0,y.join)(R,"crewx.yaml"))||(0,l.existsSync)((0,y.join)(R,"crewx.yml"));const N=(0,G.readInheritedTrace)();const re=N?.rootTraceId||d;const p=new oe.TaskRepository;const O=X(f);try{p.startTask({id:d,agentId:g.replace(/^@/,""),actorKind:O.kind,actorId:O.id,prompt:a,mode:e==="q"||e==="query"?"query":"execute",status:"pending",startedAt:ee,pid:null,parentTaskId:N?.parentTaskId??null,callerAgentId:N?.callerAgentId??null,traceId:re,command:process.argv.join(" "),metadata:Object.keys(f).length>0?JSON.stringify(f):null,workspaceId:te?(0,v.hashWorkspaceId)((0,v.resolveWorkspaceOwnerPath)(R)):null,cwd:(0,v.normalizeWorkspacePath)(R),projectId:null,platform:"cli",crewxVersion:de.CLI_VERSION,threadId:o??null})}catch(u){E.release();process.stderr.write(`Failed to create detached task receipt: ${h(u)}
|
|
15
|
+
`);process.exit(1);return}E.release();const W=Y(t,g,a);const K=Q(e);const S=(0,y.join)((0,ne.homedir)(),".crewx","logs");const w=(0,y.join)(S,`${d}.log`);let m;let D;let H=false;try{if(!(0,l.existsSync)(S))(0,l.mkdirSync)(S,{recursive:true});if(process.platform==="win32"){H=true;const u=(0,v.generateId)("req");D=(0,F.spawn)(process.execPath,[process.argv[1],K,z,`${q}=${d}`,`${C}=${w}`,`${L}=${u}`,...W],{detached:true,windowsHide:true,stdio:"ignore",env:Ae(u)})}else{m=(0,l.openSync)(w,"a");D=(0,F.spawn)(process.execPath,[process.argv[1],K,...W],{detached:true,windowsHide:true,stdio:["ignore",m,m],env:Z(d)});(0,l.closeSync)(m);m=void 0}D.unref()}catch(u){if(m!==void 0)(0,l.closeSync)(m);const x=`Runner failed before adopting task: ${h(u)}`;if(!P(p,d,x))process.exit(1);else{I(p,d,w,n,s.verbose,s.outputFormat);process.exit(0)}return}let $;try{$=await ke(p,d,D,{ignoreSuccessfulExit:H})}catch(u){const x=`Runner adoption check failed: ${h(u)}`;if(!P(p,d,x))process.exit(1);else{I(p,d,w,n,s.verbose,s.outputFormat);process.exit(0)}return}if($.kind==="adopted"){I(p,d,w,n,s.verbose,s.outputFormat);process.exit(0);return}if($.kind==="timeout"){I(p,d,w,n,s.verbose,s.outputFormat,`Warning: runner alive, row not yet adopted after ${J/1e3}s.`);process.exit(0);return}if(!P(p,d,$.reason))process.exit(1);else{I(p,d,w,n,s.verbose,s.outputFormat);process.exit(0)}}
|
package/dist/commands/execute.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.runDetachedMiddle=void 0;exports.handleExecute=
|
|
2
|
-
`);(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(2);return}if(!c){console.error("Usage: crewx execute --to <agent> <task> [options]");console.error(" crewx x --to <agent> <task> [options]");console.error(' Human-terminal shorthand: crewx x "@agent <task>"');console.error("");console.error(" Agent calls require --to or a positional @agent recipient.");console.error(" Human terminal and cron calls default to @crewx when omitted.");console.error(" Task body can also be supplied via stdin pipe or --prompt-file.");console.error("");console.error("Examples:");console.error(' crewx x --to agent "do something"');console.error(" crewx x --to agent -f task.md");console.error(" Prompt files contain only the body; set the recipient separately with --to.");console.error("");console.error("Options:");console.error(" --to <agent> Explicit agent recipient");console.error(" --thread <name> Conversation thread name");console.error(" --provider <cli/xxx> Provider override");console.error(" --model <name> Model override (e.g. claude-sonnet-5)");console.error(" --metadata <json> Extra metadata (JSON object, double-quoted).");console.error(" Propagated to events/hooks/tracing.");console.error(" Invalid JSON aborts with exit code 2.");console.error(` e.g. --metadata='{"workflow_id":"wf-1"}'`);console.error(" --verbose Debug output mode");console.error(" --config/-c <path> Config file path");console.error(" --output-format <fmt> Output format (json|text|stream-json)");console.error(" --out/-o <path> Save result to file (stdout suppressed)");console.error(" --effort <level> Model effort (high|medium|low)");console.error(" -f/--prompt-file <path> Read body only from file; set recipient separately with --to");console.error(" --var key=value Template variable (repeatable)");console.error(" --overdrive Activate overdrive (boost) profile for this request");(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(1);return}const
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.runDetachedMiddle=void 0;exports.handleExecute=Y;const F=require("@crewx/sdk");const V=require("@crewx/sdk/repository");const z=require("./parse-agent-message");const j=require("./parse-common-flags");const K=require("./resolve-recipient");const L=require("./resolve-prompt");const Q=require("../bootstrap/crewx-cli");const v=require("../utils/inherited-trace");const D=require("./write-output");const i=require("./detached");const s=require("./emit-trailer");var S=require("./detached");Object.defineProperty(exports,"runDetachedMiddle",{enumerable:true,get:function(){return S.runDetachedMiddle}});async function Y(u,r="execute",a=(0,s.createDelegationEmitState)()){const I=(0,i.readDetachedMiddleHop)(u);if(I){await(0,i.runDetachedMiddle)(r,I);return}const p=(0,i.extractReceiptFlags)(u);const m=(0,i.resolveReceiptMode)({detach:p.detach,wait:p.wait,detachedRunner:(0,v.isDetachedRunner)(),agentContext:Boolean(process.env["CREWX_AGENT_ID"])});if(m.receipt){await(0,i.runDetached)(r,p.rest,m.reason,u);return}let b;try{b=(0,j.parseCommonFlags)(p.rest)}catch(e){(0,s.emitDelegationResult)({command:r,isError:true,state:a});throw e}const{thread:x,provider:k,model:E,metadata:N,verbose:f,config:H,outputFormat:A,effort:R,promptFile:B,overdrive:M,vars:T,out:_,rest:G,to:W}=b;const n=(0,v.readInheritedTrace)();let $;let q;let c;try{({agentRef:$,message:q}=(0,z.parseAgentMessage)(G));c=await(0,L.resolvePrompt)(q,B)}catch(e){(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});throw e}let g;try{({agentRef:g}=(0,K.resolveRecipient)({positionalRef:$,toFlag:W,agentContext:Boolean(process.env["CREWX_AGENT_ID"]),bodyForHint:c,command:r,invocationArgs:u}))}catch(e){const t=e instanceof Error?e.message:String(e);process.stderr.write(`Error: ${t}
|
|
2
|
+
`);(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(2);return}if(!c){console.error("Usage: crewx execute --to <agent> <task> [options]");console.error(" crewx x --to <agent> <task> [options]");console.error(' Human-terminal shorthand: crewx x "@agent <task>"');console.error("");console.error(" Agent calls require --to or a positional @agent recipient.");console.error(" Human terminal and cron calls default to @crewx when omitted.");console.error(" Task body can also be supplied via stdin pipe or --prompt-file.");console.error("");console.error("Examples:");console.error(' crewx x --to agent "do something"');console.error(" crewx x --to agent -f task.md");console.error(" Prompt files contain only the body; set the recipient separately with --to.");console.error("");console.error("Options:");console.error(" --to <agent> Explicit agent recipient");console.error(" --thread <name> Conversation thread name");console.error(" --provider <cli/xxx> Provider override");console.error(" --model <name> Model override (e.g. claude-sonnet-5)");console.error(" --metadata <json> Extra metadata (JSON object, double-quoted).");console.error(" Propagated to events/hooks/tracing.");console.error(" Invalid JSON aborts with exit code 2.");console.error(` e.g. --metadata='{"workflow_id":"wf-1"}'`);console.error(" --verbose Debug output mode");console.error(" --config/-c <path> Config file path");console.error(" --output-format <fmt> Output format (json|text|stream-json)");console.error(" --out/-o <path> Save result to file (stdout suppressed)");console.error(" --effort <level> Model effort (high|medium|low)");console.error(" -f/--prompt-file <path> Read body only from file; set recipient separately with --to");console.error(" --var key=value Template variable (repeatable)");console.error(" --overdrive Activate overdrive (boost) profile for this request");(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(1);return}const X=H??process.env.CREWX_CONFIG??"crewx.yaml";(0,F.setAuditVerbose)(f);let y;try{y=await(0,Q.createCliCrewx)(X)}catch(e){(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});throw e}if(f){process.stderr.write(`mode=sync reason=${m.reason}
|
|
3
3
|
`);process.stderr.write(`\u{1F4CB} Task: ${c}
|
|
4
4
|
`);process.stderr.write(`\u{1F916} Agent: ${g}
|
|
5
5
|
`);if(x)process.stderr.write(`\u{1F517} Thread: ${x}
|
|
6
6
|
`);if(k)process.stderr.write(`\u{1F50C} Provider: ${k}
|
|
7
7
|
`);if(E)process.stderr.write(`\u{1F9E0} Model: ${E}
|
|
8
|
-
`);if(
|
|
8
|
+
`);if(A)process.stderr.write(`\u{1F4C4} Output-format: ${A}
|
|
9
9
|
`);if(R)process.stderr.write(`\u26A1 Effort: ${R}
|
|
10
|
-
`);if(
|
|
11
|
-
`);(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(2);return}const
|
|
10
|
+
`);if(M)process.stderr.write("\u{1F680} Overdrive: ON\n");process.stderr.write("\u2500".repeat(60)+"\n")}let h={};try{h=(0,j.parseMetadata)(N)}catch(e){const t=e instanceof Error?e.message:String(e);process.stderr.write(`Error: ${t}
|
|
11
|
+
`);(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(2);return}const J=(0,i.resolveCliTaskActor)(h);const U=(0,v.isDetachedRunner)();const C=(0,v.readRunnerAssignment)();let w;let O;let P;if(C!==void 0){const e=new V.TaskRepository;const t=(0,i.adoptAssignedTask)(e,C,U);if(t.kind==="failed"){(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(1);return}if(t.kind==="adopted"){w=t.taskId;O=(0,i.readAssignedTaskActor)(e,t.taskId);P=(0,i.readAssignedTaskProviderAccountId)(e,t.taskId)}}let d;if(w===void 0){d=(0,F.admitDurableTask)(`direct-cli:${r}`);if(!d.ok){(0,i.reportAdmissionBlocked)(d);(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(1);return}}let l=0;let o;try{try{o=await y.execute(g,c,{provider:k,model:E,effort:R||void 0,overdrive:M||void 0,threadId:x,taskId:w,actor:w===void 0?J:O,metadata:Object.keys(h).length>0?h:void 0,vars:Object.keys(T).length>0?T:void 0,trace:n,providerAccountId:P});if(!o.ok){const e=o.error?.message??"Execute failed";console.error(e);(0,D.appendError)(_,e);l=1}else{if(f){process.stderr.write(`
|
|
12
12
|
\u{1F4CA} Results from ${g}:
|
|
13
|
-
`);process.stderr.write("\u2550".repeat(60)+"\n");process.stderr.write("\u{1F7E2} Status: Success\n");process.stderr.write(`\u{1F916} Provider: ${
|
|
14
|
-
`);process.stderr.write(`\u23F1\uFE0F Duration: ${
|
|
15
|
-
`);process.stderr.write("\n\u{1F4C4} Response:\n");process.stderr.write("\u2500".repeat(40)+"\n")}(0,D.writeResult)(_,
|
|
13
|
+
`);process.stderr.write("\u2550".repeat(60)+"\n");process.stderr.write("\u{1F7E2} Status: Success\n");process.stderr.write(`\u{1F916} Provider: ${o.meta.provider}
|
|
14
|
+
`);process.stderr.write(`\u23F1\uFE0F Duration: ${o.meta.durationMs}ms
|
|
15
|
+
`);process.stderr.write("\n\u{1F4C4} Response:\n");process.stderr.write("\u2500".repeat(40)+"\n")}(0,D.writeResult)(_,o.data);if(f)process.stderr.write("\n\u2705 Execute completed successfully\n")}}catch(e){const t=e instanceof Error?e.message:String(e);console.error(`Error: ${t}`);(0,D.appendError)(_,`Error: ${t}`);l=1}finally{try{await y.close()}catch(e){(0,s.emitDelegationResult)({command:r,trace:n,taskId:o?.meta.taskId,agentId:o?.meta.agentId,isError:true,state:a});throw e}}}finally{if(d?.ok)d.release()}(0,s.emitDelegationResult)({command:r,trace:n,taskId:o?.meta.taskId,agentId:o?.meta.agentId,isError:l!==0||o?.ok===false,state:a});if(l!==0)process.exit(l)}
|
package/dist/commands/query.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.handleQuery=
|
|
2
|
-
`);(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(2);return}if(!c){console.error("Usage: crewx query --to <agent> <message> [options]");console.error(" crewx q --to <agent> <message> [options]");console.error(' Human-terminal shorthand: crewx q "@agent <message>"');console.error("");console.error(" Agent calls require --to or a positional @agent recipient.");console.error(" Human terminal and cron calls default to @crewx when omitted.");console.error(" Prompt can also be supplied via stdin pipe or --prompt-file.");console.error("");console.error("Examples:");console.error(' crewx q --to agent "hello"');console.error(" crewx q --to agent -f brief.md");console.error(" Prompt files contain only the body; set the recipient separately with --to.");console.error("");console.error("Options:");console.error(" --to <agent> Explicit agent recipient");console.error(" --thread <name> Conversation thread name");console.error(" --provider <cli/xxx> Provider override");console.error(" --model <name> Model override (e.g. claude-sonnet-5)");console.error(" --metadata <json> Extra metadata (JSON object, double-quoted).");console.error(" Propagated to events/hooks/tracing.");console.error(" Invalid JSON aborts with exit code 2.");console.error(` e.g. --metadata='{"workflow_id":"wf-1"}'`);console.error(" --verbose Debug output mode");console.error(" --config/-c <path> Config file path");console.error(" --output-format <fmt> Output format (json|text|stream-json)");console.error(" --out/-o <path> Save result to file (stdout suppressed)");console.error(" --effort <level> Model effort (high|medium|low)");console.error(" -f/--prompt-file <path> Read body only from file; set recipient separately with --to");console.error(" --var key=value Template variable (repeatable)");console.error(" --overdrive Activate overdrive (boost) profile for this request");(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(1);return}const
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.handleQuery=S;const F=require("@crewx/sdk");const U=require("@crewx/sdk/repository");const V=require("./parse-agent-message");const j=require("./parse-common-flags");const z=require("./resolve-recipient");const K=require("./resolve-prompt");const L=require("../bootstrap/crewx-cli");const v=require("../utils/inherited-trace");const I=require("./write-output");const i=require("./detached");const s=require("./emit-trailer");async function S(p,r="query",a=(0,s.createDelegationEmitState)()){const q=(0,i.readDetachedMiddleHop)(p);if(q){await(0,i.runDetachedMiddle)(r,q);return}const u=(0,i.extractReceiptFlags)(p);const m=(0,i.resolveReceiptMode)({detach:u.detach,wait:u.wait,detachedRunner:(0,v.isDetachedRunner)(),agentContext:Boolean(process.env["CREWX_AGENT_ID"])});if(m.receipt){await(0,i.runDetached)(r,u.rest,m.reason,p);return}let D;try{D=(0,j.parseCommonFlags)(u.rest)}catch(e){(0,s.emitDelegationResult)({command:r,isError:true,state:a});throw e}const{thread:y,provider:k,model:R,metadata:N,verbose:f,config:H,outputFormat:A,effort:E,promptFile:Q,overdrive:b,vars:$,out:_,rest:B,to:G}=D;const n=(0,v.readInheritedTrace)();let M;let T;let c;try{({agentRef:M,message:T}=(0,V.parseAgentMessage)(B));c=await(0,K.resolvePrompt)(T,Q)}catch(e){(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});throw e}let g;try{({agentRef:g}=(0,z.resolveRecipient)({positionalRef:M,toFlag:G,agentContext:Boolean(process.env["CREWX_AGENT_ID"]),bodyForHint:c,command:r,invocationArgs:p}))}catch(e){const t=e instanceof Error?e.message:String(e);process.stderr.write(`Error: ${t}
|
|
2
|
+
`);(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(2);return}if(!c){console.error("Usage: crewx query --to <agent> <message> [options]");console.error(" crewx q --to <agent> <message> [options]");console.error(' Human-terminal shorthand: crewx q "@agent <message>"');console.error("");console.error(" Agent calls require --to or a positional @agent recipient.");console.error(" Human terminal and cron calls default to @crewx when omitted.");console.error(" Prompt can also be supplied via stdin pipe or --prompt-file.");console.error("");console.error("Examples:");console.error(' crewx q --to agent "hello"');console.error(" crewx q --to agent -f brief.md");console.error(" Prompt files contain only the body; set the recipient separately with --to.");console.error("");console.error("Options:");console.error(" --to <agent> Explicit agent recipient");console.error(" --thread <name> Conversation thread name");console.error(" --provider <cli/xxx> Provider override");console.error(" --model <name> Model override (e.g. claude-sonnet-5)");console.error(" --metadata <json> Extra metadata (JSON object, double-quoted).");console.error(" Propagated to events/hooks/tracing.");console.error(" Invalid JSON aborts with exit code 2.");console.error(` e.g. --metadata='{"workflow_id":"wf-1"}'`);console.error(" --verbose Debug output mode");console.error(" --config/-c <path> Config file path");console.error(" --output-format <fmt> Output format (json|text|stream-json)");console.error(" --out/-o <path> Save result to file (stdout suppressed)");console.error(" --effort <level> Model effort (high|medium|low)");console.error(" -f/--prompt-file <path> Read body only from file; set recipient separately with --to");console.error(" --var key=value Template variable (repeatable)");console.error(" --overdrive Activate overdrive (boost) profile for this request");(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(1);return}const W=H??process.env.CREWX_CONFIG??"crewx.yaml";(0,F.setAuditVerbose)(f);let x;try{x=await(0,L.createCliCrewx)(W)}catch(e){(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});throw e}if(f){process.stderr.write(`mode=sync reason=${m.reason}
|
|
3
3
|
`);process.stderr.write(`\u{1F4CB} Task: ${c}
|
|
4
4
|
`);process.stderr.write(`\u{1F916} Agent: ${g}
|
|
5
5
|
`);if(y)process.stderr.write(`\u{1F517} Thread: ${y}
|
|
6
|
-
`);if(
|
|
7
|
-
`);if(
|
|
8
|
-
`);if(
|
|
6
|
+
`);if(k)process.stderr.write(`\u{1F50C} Provider: ${k}
|
|
7
|
+
`);if(R)process.stderr.write(`\u{1F9E0} Model: ${R}
|
|
8
|
+
`);if(A)process.stderr.write(`\u{1F4C4} Output-format: ${A}
|
|
9
9
|
`);if(E)process.stderr.write(`\u26A1 Effort: ${E}
|
|
10
|
-
`);if(
|
|
11
|
-
`);process.stderr.write("\u2500".repeat(60)+"\n")}let w={};try{w=(0,
|
|
12
|
-
`);(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(2);return}const
|
|
10
|
+
`);if(b)process.stderr.write(`\u{1F680} Overdrive: ON
|
|
11
|
+
`);process.stderr.write("\u2500".repeat(60)+"\n")}let w={};try{w=(0,j.parseMetadata)(N)}catch(e){const t=e instanceof Error?e.message:String(e);process.stderr.write(`Error: ${t}
|
|
12
|
+
`);(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(2);return}const X=(0,i.resolveCliTaskActor)(w);const J=(0,v.isDetachedRunner)();const C=(0,v.readRunnerAssignment)();let h;let O;let P;if(C!==void 0){const e=new U.TaskRepository;const t=(0,i.adoptAssignedTask)(e,C,J);if(t.kind==="failed"){(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(1);return}if(t.kind==="adopted"){h=t.taskId;O=(0,i.readAssignedTaskActor)(e,t.taskId);P=(0,i.readAssignedTaskProviderAccountId)(e,t.taskId)}}let l;if(h===void 0){l=(0,F.admitDurableTask)(`direct-cli:${r}`);if(!l.ok){(0,i.reportAdmissionBlocked)(l);(0,s.emitDelegationResult)({command:r,trace:n,isError:true,state:a});process.exit(1);return}}let d=0;let o;try{try{o=await x.query(g,c,{provider:k,model:R,effort:E||void 0,overdrive:b||void 0,threadId:y,taskId:h,actor:h===void 0?X:O,metadata:Object.keys(w).length>0?w:void 0,vars:Object.keys($).length>0?$:void 0,trace:n,providerAccountId:P});if(!o.ok){const e=o.error?.message??"Query failed";console.error(e);(0,I.appendError)(_,e);d=1}else{if(f){process.stderr.write(`
|
|
13
13
|
\u{1F4CA} Results from ${g}:
|
|
14
|
-
`);process.stderr.write("\u2550".repeat(60)+"\n");process.stderr.write("\u{1F7E2} Status: Success\n");process.stderr.write(`\u{1F916} Provider: ${
|
|
15
|
-
`);process.stderr.write(`\u23F1\uFE0F Duration: ${
|
|
16
|
-
`);process.stderr.write("\n\u{1F4C4} Response:\n");process.stderr.write("\u2500".repeat(40)+"\n")}(0,
|
|
14
|
+
`);process.stderr.write("\u2550".repeat(60)+"\n");process.stderr.write("\u{1F7E2} Status: Success\n");process.stderr.write(`\u{1F916} Provider: ${o.meta.provider}
|
|
15
|
+
`);process.stderr.write(`\u23F1\uFE0F Duration: ${o.meta.durationMs}ms
|
|
16
|
+
`);process.stderr.write("\n\u{1F4C4} Response:\n");process.stderr.write("\u2500".repeat(40)+"\n")}(0,I.writeResult)(_,o.data);if(f){process.stderr.write("\n\u2705 Query completed successfully\n")}}}catch(e){const t=e instanceof Error?e.message:String(e);console.error(`Error: ${t}`);(0,I.appendError)(_,`Error: ${t}`);d=1}finally{try{await x.close()}catch(e){(0,s.emitDelegationResult)({command:r,trace:n,taskId:o?.meta.taskId,agentId:o?.meta.agentId,isError:true,state:a});throw e}}}finally{if(l?.ok)l.release()}(0,s.emitDelegationResult)({command:r,trace:n,taskId:o?.meta.taskId,agentId:o?.meta.agentId,isError:d!==0||o?.ok===false,state:a});if(d!==0)process.exit(d)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.NOT_YET_MIGRATED=exports.BUILTIN_COMMAND_NAMES=exports.KNOWN_COMMANDS=void 0;exports.KNOWN_COMMANDS=new Set(["q","query","x","execute","agent","ps","stop","kill","result","log","restart","doctor","init","db","help","shortcut","publish","slack","slack:files","hook","hook-dispatch"]);exports.BUILTIN_COMMAND_NAMES=new Set(["memory","search","doc","wbs","cron","workflow","skill","dreaming","wi","chromex","notify","app"]);exports.NOT_YET_MIGRATED=new Set(["template","templates","chat","mcp"]);
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.NOT_YET_MIGRATED=exports.BUILTIN_COMMAND_NAMES=exports.KNOWN_COMMANDS=void 0;exports.KNOWN_COMMANDS=new Set(["q","query","x","execute","agent","ps","stop","kill","result","log","restart","doctor","init","db","help","shortcut","ai-account","publish","slack","slack:files","hook","hook-dispatch"]);exports.BUILTIN_COMMAND_NAMES=new Set(["memory","search","doc","wbs","cron","workflow","skill","dreaming","wi","chromex","notify","app"]);exports.NOT_YET_MIGRATED=new Set(["template","templates","chat","mcp"]);
|
package/dist/main.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var w=exports&&exports.__createBinding||(Object.create?(function(
|
|
2
|
+
"use strict";var w=exports&&exports.__createBinding||(Object.create?(function(o,e,r,t){if(t===void 0)t=r;var s=Object.getOwnPropertyDescriptor(e,r);if(!s||("get"in s?!e.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return e[r]}}}Object.defineProperty(o,t,s)}):(function(o,e,r,t){if(t===void 0)t=r;o[t]=e[r]}));var v=exports&&exports.__setModuleDefault||(Object.create?(function(o,e){Object.defineProperty(o,"default",{enumerable:true,value:e})}):function(o,e){o["default"]=e});var k=exports&&exports.__importStar||(function(){var o=function(e){o=Object.getOwnPropertyNames||function(r){var t=[];for(var s in r)if(Object.prototype.hasOwnProperty.call(r,s))t[t.length]=s;return t};return o(e)};return function(e){if(e&&e.__esModule)return e;var r={};if(e!=null){for(var t=o(e),s=0;s<t.length;s++)if(t[s]!=="default")w(r,e,t[s])}v(r,e);return r}})();Object.defineProperty(exports,"__esModule",{value:true});const u=require("./utils/sdk-compat");const _=require("@crewx/sdk/account");const y=require("@crewx/sdk");const b=require("./utils/inherited-trace");process.env.CREWX_CLI??=u.sdkCompat.resolveCrewxCli();process.env.CREWX_WORKSPACE??=u.sdkCompat.resolveCrewxWorkspace();(0,_.loadCrewxEnvFiles)();(0,b.consumeInheritedRunnerIdentity)();u.sdkCompat.initPricingRemote();const x=require("./commands/query");const q=require("./commands/execute");const S=require("./commands/agent");const C=require("./commands/ps");const d=require("./commands/stop");const O=require("./commands/result");const P=require("./commands/restart");const I=require("./commands/log");const D=require("./commands/doctor");const h=require("./commands/init");const E=require("./commands/shortcut");const R=require("./commands/ai-account");const M=require("./commands/publish");const p=require("./builtin");const j=require("./commands/slack");const N=require("./commands/hook/install");const A=require("./commands/hook/uninstall");const L=require("./commands/hook/status");const T=require("./commands/hook-dispatch");const U=require("./commands/db");const B=require("./commands/parse-common-flags");const c=require("./commands/registry");const W=require("./utils/version");const $=require("./utils/product-package-root");const g=require("./commands/emit-trailer");async function F(){const{join:o}=await Promise.resolve().then(()=>k(require("path")));const{createRequire:e}=require("module");const r=e(__filename);const t=o(__dirname,"../../../bin/cli-commands.js");const{CLI_SUBCOMMANDS:s}=r(t);const i=new Set([...c.KNOWN_COMMANDS,...c.BUILTIN_COMMAND_NAMES,...c.NOT_YET_MIGRATED]);const a=[...i].filter(l=>!s.has(l));const n=[...s].filter(l=>!i.has(l));if(a.length>0||n.length>0){throw new Error(`[crewx dev] SSOT drift detected!
|
|
3
3
|
`+(a.length?` registry has, CLI_SUBCOMMANDS missing: ${a.join(", ")}
|
|
4
|
-
`:"")+(n.length?` CLI_SUBCOMMANDS has, registry missing: ${n.join(", ")}`:""))}}async function
|
|
5
|
-
CrewX CLI v${
|
|
4
|
+
`:"")+(n.length?` CLI_SUBCOMMANDS has, registry missing: ${n.join(", ")}`:""))}}async function H(o){if(process.env["NODE_ENV"]==="development"){await F()}const e=process.argv.slice(2);const r=e[0];if(!r){f();process.exit(0)}if(p.BUILTIN_COMMANDS.has(r)){const t=r==="skill"?(0,$.resolveProductRootFromCliEntry)(process.argv[1]):void 0;await(0,p.handleBuiltin)(r,e.slice(1),t);return}switch(r){case"q":case"query":await(0,x.handleQuery)(e.slice(1),r,o);return;case"x":case"execute":await(0,q.handleExecute)(e.slice(1),r,o);return;case"agent":await(0,S.handleAgent)(e.slice(1));return;case"ps":await(0,C.handlePs)(e.slice(1));return;case"stop":await(0,d.handleStop)(e.slice(1),"stop");return;case"kill":await(0,d.handleStop)(e.slice(1),"kill");return;case"result":await(0,O.handleResult)(e.slice(1));return;case"restart":await(0,P.handleRestart)(e.slice(1));return;case"log":await(0,I.handleLog)(e.slice(1));return;case"doctor":await(0,D.handleDoctor)(e.slice(1));return;case"init":{const t=e.slice(1);const s=t.includes("--force")||t.includes("-f");try{const i=(0,h.parseInitProvider)(t);const a=await(0,h.handleInit)({path:process.cwd(),force:s,provider:i});if(a.skippedReason==="yaml-exists"){console.log("\u2713 crewx.yaml already exists (use --force to overwrite)")}else{console.log(a.yamlCreated?"\u2713 crewx.yaml created":"\u2713 yaml skipped");console.log(a.hookInstalled?"\u2713 hook installed":"\u26A0 hook skipped");if(a.errors.length>0)console.warn("Warnings:",a.errors.join("; "))}const n=(0,y.getDefaultAgentProfile)(a.provider);if(n){console.log(`\u2713 default agents: ${a.provider} (${n.planner.model} / ${n.worker.model})`)}if(a.workspaceId)console.log(`\u2713 workspace registered (id=${a.workspaceId}, slug=${a.slug})`);console.log("\u2713 done")}catch(i){console.error("\u2717 init failed:",i.message);process.exit(1)}return}case"db":await(0,U.handleDb)(e.slice(1));return;case"shortcut":await(0,E.handleShortcut)(e.slice(1));return;case"ai-account":await(0,R.handleAiAccount)(e.slice(1));return;case"publish":await(0,M.handlePublish)(e.slice(1));return;case"slack":case"slack:files":await(0,j.handleSlack)(e.slice(1));return;case"hook-dispatch":await(0,T.handleHookDispatch)(e.slice(1));return;case"help":case"--help":case"-h":f();return;case"--version":case"-v":{const t=require("../package.json");console.log(t.version);return}}if(c.NOT_YET_MIGRATED.has(r)){console.error(`Command '${r}' is not yet migrated in SDK refactor round. See packages/cli-bak for reference.`);process.exit(1)}if(r==="hook"){const t=e[1];const s=e.slice(2);switch(t){case"install":await(0,N.handleHookInstall)(s);return;case"uninstall":await(0,A.handleHookUninstall)(s);return;case"status":await(0,L.handleHookStatus)(s);return;default:console.error(`Unknown hook subcommand: ${t??"(none)"}`);console.error("Usage: crewx hook install|uninstall|status");process.exit(1)}}console.error(`Unknown command: ${r}`);console.error("Run `crewx --help` for usage.");process.exit(1)}function f(){console.log(`
|
|
5
|
+
CrewX CLI v${W.CLI_VERSION}
|
|
6
6
|
|
|
7
7
|
Usage:
|
|
8
8
|
crewx Launch web dashboard + open browser (default)
|
|
@@ -50,6 +50,11 @@ Agent Management:
|
|
|
50
50
|
--provider <value> Filter by provider (comma-separated for OR match)
|
|
51
51
|
agent prompt <@id> Show rendered system prompt for an agent
|
|
52
52
|
|
|
53
|
+
Provider Accounts:
|
|
54
|
+
ai-account list|add|login|status|use|remove
|
|
55
|
+
Several official-login accounts for cli/claude and cli/codex
|
|
56
|
+
--provider claude|codex Provider (required for add and use; for default)
|
|
57
|
+
|
|
53
58
|
Task Management:
|
|
54
59
|
ps List running tasks
|
|
55
60
|
stop <task-id> Stop a running task (cooperative, then forced)
|
|
@@ -107,4 +112,4 @@ Hook Platform:
|
|
|
107
112
|
Global Options:
|
|
108
113
|
--help, -h Show this help
|
|
109
114
|
--version, -v Show version
|
|
110
|
-
`.trim())}function
|
|
115
|
+
`.trim())}function G(o){if(o instanceof B.UnknownOptionError)return 2;if(typeof o==="object"&&o!==null&&"exitCode"in o){const e=o.exitCode;if(typeof e==="number")return e}return 1}const m=(0,g.createDelegationEmitState)();H(m).catch(o=>{console.error(o instanceof Error?o.message:String(o));(0,g.emitDelegationResult)({command:process.argv[2],isError:true,state:m});process.exit(G(o))});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crewx/cli",
|
|
3
|
-
"version": "0.9.0-rc.
|
|
3
|
+
"version": "0.9.0-rc.162",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=20.19.0"
|
|
@@ -25,20 +25,20 @@
|
|
|
25
25
|
"better-sqlite3": "*",
|
|
26
26
|
"dotenv": "17.2.3",
|
|
27
27
|
"isomorphic-git": "1.37.1",
|
|
28
|
-
"@crewx/sdk": "0.9.0-rc.
|
|
29
|
-
"@crewx/
|
|
30
|
-
"@crewx/
|
|
31
|
-
"@crewx/
|
|
32
|
-
"@crewx/
|
|
33
|
-
"@crewx/
|
|
34
|
-
"@crewx/cron": "0.1.10-rc.
|
|
35
|
-
"@crewx/
|
|
36
|
-
"@crewx/
|
|
37
|
-
"@crewx/
|
|
38
|
-
"@crewx/
|
|
39
|
-
"@crewx/
|
|
40
|
-
"@crewx/
|
|
41
|
-
"@crewx/
|
|
28
|
+
"@crewx/sdk": "0.9.0-rc.162",
|
|
29
|
+
"@crewx/knowledge-core": "0.1.17-rc.172",
|
|
30
|
+
"@crewx/memory": "0.1.23-rc.179",
|
|
31
|
+
"@crewx/search": "0.1.10-rc.158",
|
|
32
|
+
"@crewx/doc": "0.1.9-rc.155",
|
|
33
|
+
"@crewx/wbs": "0.1.10-rc.188",
|
|
34
|
+
"@crewx/cron": "0.1.10-rc.197",
|
|
35
|
+
"@crewx/skill": "0.1.20-rc.56",
|
|
36
|
+
"@crewx/workflow": "0.3.22-rc.208",
|
|
37
|
+
"@crewx/chromex": "0.1.0-rc.195",
|
|
38
|
+
"@crewx/wi": "0.1.10-rc.182",
|
|
39
|
+
"@crewx/shared": "0.0.6-rc.77",
|
|
40
|
+
"@crewx/notify": "0.1.0-rc.133",
|
|
41
|
+
"@crewx/app": "0.1.0-rc.43"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/better-sqlite3": "*",
|