@crewx/app 0.1.0-rc.3 → 0.1.0-rc.31

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/SKILL.md CHANGED
@@ -14,14 +14,64 @@ metadata:
14
14
  | `crewx app open <appId>` | Open an App in this conversation |
15
15
  | `crewx app state <instanceId>` | Read AI-visible state, buttons, and agent access |
16
16
  | `crewx app run <instanceId|appId> <actionId> [--input <JSON>|-] [--request-id <id>]` | Run one available action |
17
- | `crewx app receipt <receiptId>` | Read a safe action receipt |
17
+ | `crewx app receipt <receiptId> [--wait=<seconds>]` | Read a safe action receipt. With `--wait`, poll until it settles or the wait ends |
18
+ | `crewx app build [<appDir>] [--check | --watch]` | Build a `@Tool` App: bundle `server.ts` into `dist/` and regenerate its actions (in `manifest.json`, or in `dist/tools.json` for a `server.ts`-only App). `--check` writes nothing and fails on a stale file; `--watch` rebuilds on every change |
19
+ | `crewx app dev <app> [--no-open]` | Start a foreground App dev session with build and reload watching |
20
+ | `crewx app check <app> [--json]` | Run the App dev checks |
21
+ | `crewx app run --dev <app> <actionId> [--input <JSON>|-]` | Run an App action through the dev checks |
18
22
  | `crewx app usage` | Show this guide |
23
+ | `crewx app usage <appId>` | Show one App's manual (its SKILL.md) and an action table generated from its declaration: inputs with real types, agent access, confirmation |
24
+
25
+ `<app>` is the App folder name under `apps/` or its App id (`name` in `manifest.json`, or `pluginId` in `ui-plugin.json`).
26
+
27
+ ## Read the manual before the first run
28
+
29
+ `crewx app usage <appId>` prints the App's manual, then a table of every action: its inputs (`*` = required, real types, limits, allowed values), the agent access (`allowed`, `approval_required`, `denied`, the same words `crewx app state` prints) and the confirmation mode. Send exactly the keys listed. After a successful `crewx app run`, stderr suggests `→ Check: crewx app state <instanceId>`.
30
+
31
+ ## Build a `@Tool` App
32
+
33
+ `crewx app build` needs nothing but the CrewX CLI: it ships the bundler and the SDK that `server.ts` imports as `@crewx/sdk/app`. Run it in the App folder (or pass the folder). The folder needs `server.ts` (default-exports a `CrewXApp` subclass) and a `package.json`; `manifest.json` is created when missing.
34
+
35
+ **`server.ts` only (the default for a new App).** Leave `bin` and `crewx.app.command` out of `package.json` and `server.ts` is the whole backend: there is no CLI, no launcher file and nothing to write in the manifest. The build writes `dist/server.mjs`, a self-starting `dist/main.mjs` and `dist/tools.json` (the `@Tool` declarations), and removes `actions` from `manifest.json`, which keeps the name, version, screen, size and outside connections. Never write `actions` or a `backend` yourself: a `manifest.json` that still has `actions` next to `dist/tools.json`, or an action that names an `entry`, is refused. Inside a `@Tool` method `this.context` says who is calling: `{ instanceId, threadId, actor, requestId, nowMs }`. `threadId` is `null` when the App was opened outside a conversation, `actor` is `'user'` or `'agent'`, and the Host sets all of it, never the request. `crewx.app.env` is not allowed here, because the Host always passes the instance and the thread.
36
+
37
+ **An App that is also a CLI.** With a `bin` name (or `crewx.app.command`) in `package.json`, the actions run that skill command, and the build rewrites only `_meta["dev.crewx"].actions` of `manifest.json`. Set `crewx.app.env` to `["CREWX_APP_INSTANCE_ID", "CREWX_THREAD_ID"]` (one or both, no repeats, nothing else) when your `@Tool` code reads those values from `process.env`: the build writes the list to every action's `backend.env` and the Host then puts exactly those values in the backend process; without it the backend gets neither and no `env` key is written. `this.context` works there too, with the values the Host put in the environment.
38
+
39
+ To take or send a text body (an action that only the screen may call), declare `content: { in: { mediaType, required? }, out: { mediaType, range? } }` on the `@Tool` (`mediaType` is `text/plain` or `application/json`): the method then gets `(input, content)`, reads `content.in.text`, and answers with `this.setContent(body)`; the build copies the declaration into the action and the runtime writes the bytes, lines and SHA-256.
40
+
41
+ stdout is one JSON line with the written `files` and the `actions` found; after a build, stderr says the next command. Exit 0 = built (or in sync with `--check`), 1 = `BUILD_FAILED` (stderr says why) or `BUILD_STALE` (`--check` found a stale file; run `crewx app build`), 2 = usage. `--watch` stays in the foreground and prints one plain line per build until Ctrl-C.
42
+
43
+ ## App development
44
+
45
+ Run the watcher from a developer terminal and leave it in the foreground until you stop it with Ctrl-C:
46
+
47
+ ```bash
48
+ crewx app dev <app>
49
+ ```
50
+
51
+ Use `--no-open` when a browser tab is not needed. The watcher runs `npm run build` when the App has a `build` script,
52
+ then reloads the dev tab after each build. Without a build script, file changes trigger a manual reload.
53
+
54
+ For a one-shot agent run, build and check before calling an action:
55
+
56
+ ```bash
57
+ cd apps/<app>
58
+ npm run build
59
+ cd ../..
60
+ crewx app check <app> --json
61
+ crewx app run --dev <app> <actionId> --input '{"key":"value"}'
62
+ ```
63
+
64
+ `check` exits with code 13 when errors remain. `run --dev` prints the server result and checks; it exits non-zero when the
65
+ action did not succeed. A one-shot agent should use this build/check/run loop instead of holding the foreground watcher.
19
66
 
20
67
  ## When blocked
21
68
 
22
69
  - Exit 3, 9, 10, or 11: do not click the screen, use CUA, or open another browser. Report that you could not use the App route.
70
+ - Exit 14: the server did not answer after the connection was established, so the outcome is unknown. For `run`, retry the same command once with the `requestId` from the JSON payload as `--request-id`; within 15 minutes the server returns the same receipt and result without running the action twice. If it times out again, report `server response delayed, outcome unknown` with the `requestId`. Do not report success or failure, click the screen, or use another route. For other commands, retry once; if it happens again, report it.
23
71
  - Exit 4: do not retry; report the failure.
24
72
  - Use `agentAccess` from `crewx app state`: `allowed` can run, `approval_required` can request human approval, and `denied` must not run.
25
- - Exit 8 means **pending approval**, not success. Never claim the work is done and never work around it with screen clicks or another route.
26
- - Check later with `crewx app receipt <receiptId>`. If the turn must end first, report **pending approval** and include the `receiptId`.
73
+ - Exit 8 = waiting for the user's one-time approval in the App window. Keep this turn running and wait with `crewx app receipt <receiptId> --wait=60` (repeat on exit 124); ending the turn cancels the request. Report success only if the receipt settles as `succeeded`. Never claim the work is done and never work around it with screen clicks or another route. stderr adds `→ Waiting for the user's approval in the App window (expires HH:MM)` and `→ Wait: crewx app receipt <receiptId> --wait=60 (repeat on exit 124 until it settles)`; the JSON on stdout is unchanged.
74
+ - `crewx app receipt <receiptId> --wait=<seconds>` asks the server every 3 seconds until the receipt settles (`succeeded`, `rejected`, `failed`, `conflicted`, `expired`). A settled receipt is printed exactly as `receipt` without `--wait` prints it, with the same exit code. If the wait ends first, it exits 124 with nothing on stdout and one stderr line naming the next command. `<seconds>` is capped at 900, the 15 minutes an approval lives. `--wait=0` or no `--wait` reads the receipt once.
75
+ - `crewx app run` returns the settled receipt, resulting state, and the declared public `result` when one exists. Check `outcome`; if it is `failed` or `rejected`, read `errorCode` to understand the failure. A 202 request returns the pending receipt without a result.
76
+ - Read the receipt again with `crewx app receipt <receiptId>`. The same actor can read the same public `result` repeatedly for 15 minutes after success. After the result expires or the server restarts, the receipt reports `resultExpired: true` without returning the result. An approval that settles as anything but `succeeded` (`rejected`, `expired`, `failed`, `conflicted`) is not done: report the outcome and the `receiptId`.
27
77
  - Include the `receiptId` in your report. Citing an ID is not proof; the checker compares the receipt's `actor.task` with this task.
@@ -0,0 +1,64 @@
1
+ export const SDK_APP_SOURCE_ENTRY: string;
2
+
3
+ export interface BuildOptions {
4
+ appDirectory: string;
5
+ check: boolean;
6
+ watch: boolean;
7
+ }
8
+
9
+ export interface AppConfig {
10
+ /** The skill command the actions run; absent for a server.ts-only App (tool mode). */
11
+ command?: string[];
12
+ external: string[];
13
+ /** crewx.app.env; present only when package.json sets it. */
14
+ env?: string[];
15
+ }
16
+
17
+ export interface BuildResult {
18
+ /** Stale generated files relative to the current directory; empty unless `check`. */
19
+ stale: string[];
20
+ /** The same files relative to the app folder; empty unless `check`. */
21
+ staleFiles: string[];
22
+ /** Every generated file, relative to the app folder. */
23
+ files: string[];
24
+ /** The actionId of every `@Tool` method. */
25
+ actions: string[];
26
+ /** `tool` for an App with neither a bin nor crewx.app.command, `bridge` otherwise. */
27
+ mode: 'tool' | 'bridge';
28
+ /** The file `@crewx/sdk/app` resolved to: the SDK source in the repository, the shipped SDK elsewhere. */
29
+ sdkEntry: string | undefined;
30
+ /** Absolute paths of the source files the bundle read (the shipped SDK is not among them). */
31
+ inputs: string[];
32
+ }
33
+
34
+ export function parseArguments(argv: string[], cwd?: string): BuildOptions;
35
+ export function readAppConfig(appDirectory: string): AppConfig;
36
+ export function usesSdkSource(appDirectory: string): boolean;
37
+ export function renderActionDeclarations(
38
+ imported: { default: unknown; generateManifest: (app: unknown, command: string[]) => { actions?: unknown } },
39
+ command: string[],
40
+ existingText?: string,
41
+ backendEnv?: readonly string[],
42
+ ): { fileName: string; text: string };
43
+ export function renderToolDeclarations(
44
+ imported: { default: { definition: unknown }; generateToolDeclarations: (app: unknown) => unknown[] },
45
+ existingText?: string,
46
+ ): { fileName: string; text: string; toolsFileName: string; toolsText: string };
47
+ export function buildApp(options: {
48
+ appDirectory: string;
49
+ check?: boolean;
50
+ log?: (message: string) => void;
51
+ }): Promise<BuildResult>;
52
+ export function watchApp(
53
+ appDirectory: string,
54
+ log: (message: string) => void,
55
+ options?: { signal?: AbortSignal },
56
+ ): Promise<void>;
57
+ export function runScript(
58
+ argv: string[],
59
+ options?: {
60
+ cwd?: string;
61
+ stdout?: { write(text: string): unknown };
62
+ stderr?: { write(text: string): unknown };
63
+ },
64
+ ): Promise<number>;
@@ -0,0 +1,7 @@
1
+ import{existsSync as x,mkdirSync as z,mkdtempSync as Q,readFileSync as R,realpathSync as W,rmSync as C,watch as Z,writeFileSync as O}from"node:fs";import{createRequire as F}from"node:module";import{tmpdir as ee}from"node:os";import{basename as te,dirname as _,isAbsolute as re,join as c,relative as h,resolve as N,sep as U}from"node:path";import{fileURLToPath as ne,pathToFileURL as T}from"node:url";import{CREWX_META_NAMESPACE as S,convertV2ToManifest as J}from"./manifest.mjs";const D=_(ne(import.meta.url));const oe=F(import.meta.url);const se=c("packages","built-in","app","build-app");const L=N(D,"..","..","..","..");const $=c(L,"packages","sdk","src","app","index.ts");const V=_($);const E="server.ts";const k="dist/server.mjs";const q="dist/entry.mjs";const I="dist/main.mjs";const K="dist/tools.json";const ae=1;const y="manifest.json";const ie=100;const ce=[`import App from './${E}';`,`export * from './${E}';`,"export default App;","export { AppError, CrewXApp, Tool, executeAppRequest, generateManifest, getToolDeclarations, runSkillApp } from '@crewx/sdk/app';",""].join("\n");const le="export { runAppEntry } from '@crewx/sdk/app';\n";const fe=["import { runAppEntry } from '@crewx/sdk/app';","await runAppEntry(() => import('./server.mjs'));",""].join("\n");const ue=[`import App from './${E}';`,"export default App;","export { generateToolDeclarations } from '@crewx/sdk/app';",""].join("\n");const de="export { SKILL_BACKEND_ENV_NAMES, isSkillBackendEnv } from '@crewx/sdk/app';\n";const pe="dist/.env-rule.mjs";const me="import { createRequire as __crewxCreateRequire } from 'node:module'; const require = __crewxCreateRequire(import.meta.url);";const we={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Bundler",experimentalDecorators:false,emitDecoratorMetadata:false,useDefineForClassFields:true,lib:["ES2022","esnext.decorators"],allowJs:true,checkJs:false}};function he(e,r,n,o){let s=e.generateManifest(e.default,r);if(o!==void 0&&Array.isArray(s.actions)){s={...s,actions:s.actions.map(a=>({...a,backend:{...a.backend,env:[...o]}}))}}let t;if(n===void 0){t=J(s)}else{try{t=JSON.parse(n)}catch(i){throw new Error(`${y} is not valid JSON: ${i instanceof Error?i.message:String(i)}`)}const a=t?._meta?.[S];if(a===null||typeof a!=="object"||Array.isArray(a)){throw new Error(`${y} must have an object at _meta["${S}"]`)}a.actions=s.actions}return{fileName:y,text:`${JSON.stringify(t,null,2)}
2
+ `}}function xe(e,r){const n=e.generateToolDeclarations(e.default);let o;if(r===void 0){o=J({...e.default.definition})}else{try{o=JSON.parse(r)}catch(t){throw new Error(`${y} is not valid JSON: ${t instanceof Error?t.message:String(t)}`)}const s=o?._meta?.[S];if(s===null||typeof s!=="object"||Array.isArray(s)){throw new Error(`${y} must have an object at _meta["${S}"]`)}delete s.actions}return{fileName:y,text:`${JSON.stringify(o,null,2)}
3
+ `,toolsFileName:K,toolsText:`${JSON.stringify({schemaVersion:ae,actions:n},null,2)}
4
+ `}}function Ee(e,r=process.cwd()){let n;let o=false;let s=false;const t=a=>{if(n!==void 0)throw new Error("Give the app folder only once");n=N(r,a)};for(const a of e){if(a==="--check")o=true;else if(a==="--watch")s=true;else if(a.startsWith("--app-dir="))t(a.slice("--app-dir=".length));else if(a.startsWith("-"))throw new Error(`Unknown argument: ${a}`);else t(a)}if(o&&s)throw new Error("--check and --watch cannot be combined");return{appDirectory:n??r,check:o,watch:s}}function ye(e){const r=c(e,"package.json");if(!x(r))throw new Error(`${r} not found; run the build from an app folder or give the app folder`);const n=JSON.parse(R(r,"utf8"));const o=n.crewx?.app??{};if(Ae(n)){if(o.env!==void 0){throw new Error("crewx.app.env is only for an App with a bin or crewx.app.command; a server.ts-only App always gets its instance and thread as this.context")}const i=o.external??[];if(!Array.isArray(i)||!i.every(d=>typeof d==="string")){throw new Error("crewx.app.external must be an array of globs")}return{external:i}}const s=o.command??ve(n);if(!Array.isArray(s)||s.length===0||!s.every(i=>typeof i==="string"&&i!=="")){throw new Error("crewx.app.command must be a non-empty array of strings")}const t=o.external??[];if(!Array.isArray(t)||!t.every(i=>typeof i==="string")){throw new Error("crewx.app.external must be an array of globs")}const a=o.env;if(a!==void 0&&(!Array.isArray(a)||!a.every(i=>typeof i==="string"))){throw new Error("crewx.app.env must be an array of environment variable names")}return{command:s,external:t,...a===void 0?{}:{env:a}}}function Ae(e){return e.bin===void 0&&e.crewx?.app?.command===void 0}async function ge(e,r,n){let o;try{o=await b(e,r,n,{contents:de,sourcefile:"crewx-app-env-rule.ts",outfile:pe})}catch(t){if(t.errors?.some(({text:a})=>/No matching export/u.test(a))){throw new Error("crewx.app.env needs a newer @crewx/sdk: reinstall the CrewX CLI")}throw t}const s=Q(c(ee(),"crewx-app-env-"));try{const t=c(s,"rule.mjs");O(t,o.text,"utf8");const a=await import(T(t).href);if(!a.isSkillBackendEnv(n.env)){throw new Error(`crewx.app.env must be a non-empty list of distinct names from ${a.SKILL_BACKEND_ENV_NAMES.join(", ")}`)}}finally{C(s,{recursive:true,force:true})}}function ve(e){const r=e.bin;const n=typeof r==="string"?[String(e.name??"").replace(/^@[^/]+\//u,"")]:Object.keys(r??{});if(n.length!==1||n[0]===""){throw new Error('cannot derive the skill command: give package.json exactly one "bin" name, or set crewx.app.command')}return[n[0],"app"]}function Se(e){let r="^";for(let n=0;n<e.length;n+=1){const o=e[n];if(o==="*"&&e[n+1]==="*"){r+=".*";n+=1}else if(o==="*"){r+="[^/]*"}else if(o==="?"){r+="[^/]"}else{r+=o.replace(/[\\^$+{}()[\].|]/g,"\\$&")}}return new RegExp(`${r}$`)}function be(e,r){const n=h(e,r);return n!==""&&!n.startsWith("..")&&!re(n)}function P(e){if(D!==c(L,se))return false;if(!x($))return false;return be(W(L),W(e))}async function Re(e){try{const r=F(c(e,"package.json")).resolve("esbuild");return await import(T(r).href)}catch{}try{return await import("esbuild")}catch{throw new Error("cannot load esbuild: it comes with @crewx/app, so reinstall the CrewX CLI")}}const M="crewx-sdk";const _e="app/index.js";function X(){try{return oe.resolve("@crewx/sdk/app")}catch{return void 0}}function Ne(e,r){const n=r.external.map(Se);const o=P(e);return[{name:"crewx-sdk-app",setup(s){s.onResolve({filter:/^@crewx\/sdk\/app$/},()=>{if(o)return{path:$};const t=X();if(t===void 0){return{errors:[{text:"cannot resolve @crewx/sdk/app: it comes with the CrewX CLI, so reinstall the CLI"}]}}return{path:_e,namespace:M,pluginData:{file:t}}});s.onLoad({filter:/.*/,namespace:M},({pluginData:t})=>({contents:R(t.file,"utf8"),loader:"js",resolveDir:_(t.file)}))}},{name:"crewx-app-external-files",setup(s){if(n.length===0)return;s.onResolve({filter:/^\.\.?\//},({path:t,resolveDir:a})=>{const i=N(a,t);const d=h(e,i).split(U).join("/");if(d.startsWith("..")||!n.some(l=>l.test(d)))return void 0;const p=h(c(e,"dist"),i).split(U).join("/");return{path:p.startsWith(".")?p:`./${p}`,external:true}})}}]}const $e={name:"crewx-app-server-import",setup(e){e.onResolve({filter:/^\.\/server\.mjs$/},({path:r})=>({path:r,external:true}))}};async function b(e,r,n,{contents:o,sourcefile:s,outfile:t,metafile:a=false,plugins:i=[]}){const d=await e.build({...P(r)?{}:{banner:{js:me}},absWorkingDir:r,stdin:{contents:o,resolveDir:r,sourcefile:s,loader:"ts"},outfile:t,bundle:true,write:false,metafile:a,format:"esm",platform:"node",target:"node22",packages:"external",plugins:[...Ne(r,n),...i],tsconfigRaw:we,logLevel:"silent"}).catch(f=>{if(f.errors?.some(({text:w})=>/No matching export in ".*server\.ts" for import "default"/u.test(w))){throw new Error(`${E} must default-export a CrewXApp subclass with a static definition`)}throw f});const p=c(r,t);const l=d.outputFiles.find(f=>f.path===p)?.text;if(l===void 0)throw new Error(`esbuild did not produce ${t}`);if(/@crewx\/sdk(?:['"/])/u.test(l.replace(/^\s*\/\/.*$/gmu,""))){throw new Error(`${t} still imports @crewx/sdk; server.ts may import only @crewx/sdk/app`)}return{text:l,inputs:d.metafile?Object.keys(d.metafile.inputs):[]}}async function Y({appDirectory:e,check:r=false,log:n=()=>{}}){if(!x(c(e,E)))throw new Error(`${c(e,E)} not found`);const o=ye(e);const s=o.command===void 0;const t=await Re(e);if(o.env!==void 0)await ge(t,e,o);const a=c(e,"dist");const i=x(a);const d=c(a,`.server-build-${process.pid}.mjs`);try{const p=await b(t,e,o,{contents:ce,sourcefile:"crewx-app-server.ts",outfile:k,metafile:true});const l=s?await b(t,e,o,{contents:fe,sourcefile:"crewx-app-main.ts",outfile:I,plugins:[$e]}):await b(t,e,o,{contents:le,sourcefile:"crewx-app-entry.ts",outfile:q});const f=s?await ke(t,e,o):p;z(a,{recursive:true});O(d,f.text,"utf8");const w=await import(`${T(d).href}?build=${Date.now()}`);if(typeof w.default!=="function"||w.default.definition===void 0){throw new Error(`${E} must default-export a CrewXApp subclass with a static definition`)}const g=c(e,y);const A=x(g)?R(g,"utf8"):void 0;const m=s?xe(w,A):he(w,o.command,A,o.env);const j=[{path:c(e,k),text:p.text},{path:c(e,s?I:q),text:l.text},...s?[{path:c(e,m.toolsFileName),text:m.toolsText}]:[],{path:c(e,m.fileName),text:m.text}];const B=j.filter(({path:u,text:v})=>!x(u)||R(u,"utf8")!==v);const H=B.map(({path:u})=>h(process.cwd(),u));if(!r){for(const{path:v,text:G}of j)O(v,G,"utf8");const u=v=>h(process.cwd(),c(e,v));n(s?`Built ${u(k)} and ${u(I)}, wrote ${u(K)} and regenerated ${u(m.fileName)}.`:`Built ${h(process.cwd(),c(e,k))} and regenerated ${h(process.cwd(),c(e,m.fileName))}.`)}return{stale:r?H:[],staleFiles:r?B.map(({path:u})=>h(e,u)):[],files:j.map(({path:u})=>h(e,u)),actions:s?Pe(m.toolsText):je(m.text),mode:s?"tool":"bridge",sdkEntry:P(e)?$:X(),inputs:p.inputs.filter(u=>!u.startsWith(`${M}:`)).map(u=>N(e,u))}}finally{C(d,{force:true});if(!i&&r)C(a,{recursive:true,force:true})}}async function ke(e,r,n){try{return await b(e,r,n,{contents:ue,sourcefile:"crewx-app-declarations.ts",outfile:"dist/.declarations-build.mjs"})}catch(o){if(o.errors?.some(({text:s})=>/No matching export/u.test(s)&&/generateToolDeclarations/u.test(s))){throw new Error("a server.ts-only App (no bin, no crewx.app.command) needs a newer @crewx/sdk: reinstall the CrewX CLI")}throw o}}function Pe(e){const r=JSON.parse(e)?.actions;return Array.isArray(r)?r.map(n=>n?.actionId).filter(n=>typeof n==="string"):[]}function je(e){const r=JSON.parse(e)?._meta?.[S]?.actions;return Array.isArray(r)?r.map(n=>n?.actionId).filter(n=>typeof n==="string"):[]}async function Ce(e,r,{signal:n}={}){const o=new Map;let s=false;let t=false;let a;let i=new Set;const d=async()=>{if(s){t=true;return}s=true;try{const l=await Y({appDirectory:e,log:r});i=new Set(l.inputs)}catch(l){r(`Build failed: ${l instanceof Error?l.message:String(l)}`)}finally{s=false;if(!n?.aborted)p();if(t&&!n?.aborted){t=false;void d()}}};const p=()=>{const l=new Set([e,...[...i].map(f=>_(f))]);if(P(e))l.add(V);for(const[f,w]of o){if(!l.has(f)){w.close();o.delete(f)}}for(const f of l){if(o.has(f)||!x(f))continue;o.set(f,Z(f,(w,g)=>{if(g===null)return;const A=c(f,g.toString());const m=i.has(A)||A===c(e,"package.json")||f===V&&/\.tsx?$/u.test(A);if(!m)return;clearTimeout(a);a=setTimeout(()=>void d(),ie)}))}};await d();r("Watching for changes. Press Ctrl+C to stop.");await new Promise(l=>{if(n===void 0)return;if(n.aborted)l();else n.addEventListener("abort",l,{once:true})});clearTimeout(a);for(const l of o.values())l.close();o.clear()}async function We(e,{cwd:r=process.cwd(),stdout:n=process.stdout,stderr:o=process.stderr}={}){const s=t=>n.write(`${t}
5
+ `);try{const t=Ee(e,r);if(t.watch){await Ce(t.appDirectory,s);return 0}const{stale:a}=await Y({appDirectory:t.appDirectory,check:t.check,log:s});if(!t.check)return 0;if(a.length>0){o.write(`Stale generated files: ${a.join(", ")}
6
+ `);return 1}s(`${te(t.appDirectory)} App build artifacts are in sync.`);return 0}catch(t){o.write(`${t instanceof Error?t.message:String(t)}
7
+ `);return 1}}export{$ as SDK_APP_SOURCE_ENTRY,Y as buildApp,Ee as parseArguments,ye as readAppConfig,he as renderActionDeclarations,xe as renderToolDeclarations,We as runScript,P as usesSdkSource,Ce as watchApp};
@@ -0,0 +1 @@
1
+ var l=Object.create;var i=Object.defineProperty;var t=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var m=Object.getPrototypeOf;var s=Object.prototype.hasOwnProperty;var u=(p,o,r,e)=>{if(o&&typeof o==="object"||typeof o==="function"){for(let d of a(o))if(!s.call(p,d)&&d!==r)i(p,d,{get:()=>o[d],enumerable:!(e=t(o,d))||e.enumerable})}return p};var x=(p,o,r)=>(r=p!=null?l(m(p)):{},u(o||!p||!p.__esModule?i(r,"default",{value:p,enumerable:true}):r,p));module.exports={loadAppBuilder:()=>import("./index.mjs")};
@@ -0,0 +1 @@
1
+ const a="0.3";const t="dev.crewx";const f="0.1.0";const d=new Set(["manifestVersion","pluginId","definitionId","version","name","description","_meta"]);function o(e){return e!==null&&typeof e==="object"&&!Array.isArray(e)}function u(e,r={}){if(!o(e)||e.manifestVersion!==2){throw new Error("only a manifestVersion 2 ui-plugin.json can be converted")}for(const n of["pluginId","definitionId","name","description"]){if(typeof e[n]!=="string")throw new Error(`ui-plugin.json ${n} must be a string`)}if(!Number.isSafeInteger(e.version)||e.version<1){throw new Error("ui-plugin.json version must be a positive integer")}if(e._meta!==void 0&&!o(e._meta)){throw new Error("ui-plugin.json _meta must be an object")}if(e._meta!==void 0&&Object.hasOwn(e._meta,t)){throw new Error(`ui-plugin.json _meta already uses the "${t}" key`)}const i={};if(e.definitionId!==e.pluginId)i.definitionId=e.definitionId;i.definitionVersion=e.version;for(const[n,s]of Object.entries(e)){if(!d.has(n))i[n]=s}return{manifest_version:a,name:e.pluginId,display_name:e.name,version:r.version??f,description:e.description,_meta:{...e._meta??{},[t]:i}}}export{t as CREWX_META_NAMESPACE,f as INITIAL_RELEASE_VERSION,a as MCPB_MANIFEST_VERSION,u as convertV2ToManifest};
package/dist/cli.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  export declare function main(inputArgs?: string[]): Promise<void>;
3
- //# sourceMappingURL=cli.d.ts.map
3
+
package/dist/cli.js CHANGED
@@ -1,89 +1,4 @@
1
1
  #!/usr/bin/env node
2
- "use strict";
3
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
- if (k2 === undefined) k2 = k;
5
- var desc = Object.getOwnPropertyDescriptor(m, k);
6
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
- desc = { enumerable: true, get: function() { return m[k]; } };
8
- }
9
- Object.defineProperty(o, k2, desc);
10
- }) : (function(o, m, k, k2) {
11
- if (k2 === undefined) k2 = k;
12
- o[k2] = m[k];
13
- }));
14
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
- Object.defineProperty(o, "default", { enumerable: true, value: v });
16
- }) : function(o, v) {
17
- o["default"] = v;
18
- });
19
- var __importStar = (this && this.__importStar) || (function () {
20
- var ownKeys = function(o) {
21
- ownKeys = Object.getOwnPropertyNames || function (o) {
22
- var ar = [];
23
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
- return ar;
25
- };
26
- return ownKeys(o);
27
- };
28
- return function (mod) {
29
- if (mod && mod.__esModule) return mod;
30
- var result = {};
31
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
- __setModuleDefault(result, mod);
33
- return result;
34
- };
35
- })();
36
- Object.defineProperty(exports, "__esModule", { value: true });
37
- exports.main = main;
38
- const fs = __importStar(require("node:fs"));
39
- const path = __importStar(require("node:path"));
40
- const engine_js_1 = require("./src/engine.js");
41
- function emitOutcome(outcome) {
42
- const ticket = process.env['CREWX_TASK_TICKET'] ?? '';
43
- const json = JSON.stringify(outcome.payload);
44
- process.stdout.write(`${ticket ? json.split(ticket).join('[redacted]') : json}\n`);
45
- if (outcome.stderr) {
46
- const stderr = ticket ? outcome.stderr.split(ticket).join('[redacted]') : outcome.stderr;
47
- process.stderr.write(`${stderr}\n`);
48
- }
49
- if (outcome.exitCode !== 0)
50
- process.exitCode = outcome.exitCode;
51
- }
52
- function printSkill() {
53
- const candidates = [
54
- path.join(__dirname, '..', 'SKILL.md'),
55
- path.join(__dirname, 'SKILL.md'),
56
- ];
57
- const skillPath = candidates.find((candidate) => fs.existsSync(candidate));
58
- if (!skillPath)
59
- throw new Error('SKILL.md is not available');
60
- process.stdout.write(fs.readFileSync(skillPath, 'utf8'));
61
- }
62
- async function main(inputArgs) {
63
- const args = inputArgs ?? process.argv.slice(2);
64
- if (args[0] === 'usage' && args.length === 1) {
65
- try {
66
- printSkill();
67
- }
68
- catch {
69
- emitOutcome({
70
- exitCode: 1,
71
- payload: { ok: false, exit: 1, error: { code: 'ERROR', status: null } },
72
- });
73
- }
74
- return;
75
- }
76
- try {
77
- emitOutcome(await (0, engine_js_1.executeAppCommand)(args));
78
- }
79
- catch {
80
- emitOutcome({
81
- exitCode: 1,
82
- payload: { ok: false, exit: 1, error: { code: 'ERROR', status: null } },
83
- });
84
- }
85
- }
86
- if (require.main === module) {
87
- void main();
88
- }
89
- //# sourceMappingURL=cli.js.map
2
+ "use strict";var d=exports&&exports.__createBinding||(Object.create?(function(t,e,r,n){if(n===void 0)n=r;var i=Object.getOwnPropertyDescriptor(e,r);if(!i||("get"in i?!e.__esModule:i.writable||i.configurable)){i={enumerable:true,get:function(){return e[r]}}}Object.defineProperty(t,n,i)}):(function(t,e,r,n){if(n===void 0)n=r;t[n]=e[r]}));var f=exports&&exports.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:true,value:e})}):function(t,e){t["default"]=e});var a=exports&&exports.__importStar||(function(){var t=function(e){t=Object.getOwnPropertyNames||function(r){var n=[];for(var i in r)if(Object.prototype.hasOwnProperty.call(r,i))n[n.length]=i;return n};return t(e)};return function(e){if(e&&e.__esModule)return e;var r={};if(e!=null){for(var n=t(e),i=0;i<n.length;i++)if(n[i]!=="default")d(r,e,n[i])}f(r,e);return r}})();Object.defineProperty(exports,"__esModule",{value:true});exports.main=o;const u=a(require("node:fs"));const c=a(require("node:path"));const l=require("./src/engine.js");function s(t){const e=process.env["CREWX_TASK_TICKET"]??"";const r=t.stdout??(t.suppressOutput?"":`${JSON.stringify(t.payload)}
3
+ `);const n=e?r.split(e).join("[redacted]"):r;if(n)process.stdout.write(n);if(t.stderr){const i=e?t.stderr.split(e).join("[redacted]"):t.stderr;process.stderr.write(`${i}
4
+ `)}if(t.exitCode!==0)process.exitCode=t.exitCode}function _(){const t=[c.join(__dirname,"..","SKILL.md"),c.join(__dirname,"SKILL.md")];const e=t.find(r=>u.existsSync(r));if(!e)throw new Error("SKILL.md is not available");process.stdout.write(u.readFileSync(e,"utf8"))}async function o(t){const e=t??process.argv.slice(2);if(e[0]==="usage"&&e.length===1){try{_()}catch{s({exitCode:1,payload:{ok:false,exit:1,error:{code:"ERROR",status:null}}})}return}try{s(await(0,l.executeAppCommand)(e))}catch{s({exitCode:1,payload:{ok:false,exit:1,error:{code:"ERROR",status:null}}})}}if(require.main===module){void o()}
@@ -1,7 +1,12 @@
1
+ import { type WaitClock } from './receipt-wait.js';
1
2
  export interface AppCommandOutcome {
2
3
  exitCode: number;
3
4
  payload: Record<string, unknown>;
4
5
  stderr?: string;
6
+ stdout?: string;
7
+ suppressOutput?: boolean;
5
8
  }
6
- export declare function executeAppCommand(args: string[]): Promise<AppCommandOutcome>;
7
- //# sourceMappingURL=engine.d.ts.map
9
+ export declare function executeAppCommand(args: string[], { clock }?: {
10
+ clock?: WaitClock;
11
+ }): Promise<AppCommandOutcome>;
12
+
@@ -1,549 +1,7 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.executeAppCommand = executeAppCommand;
37
- const node_crypto_1 = require("node:crypto");
38
- const fs = __importStar(require("node:fs"));
39
- const http = __importStar(require("node:http"));
40
- const https = __importStar(require("node:https"));
41
- const node_url_1 = require("node:url");
42
- const REQUEST_TIMEOUT_MS = 15000;
43
- const APP_ID_PREFIX = 'uic_';
44
- const REQUEST_ID_PATTERN = /^[A-Za-z0-9_-]{8,128}$/;
45
- const LOOPBACK_HOSTS = new Set(['127.0.0.1', '[::1]', 'localhost']);
46
- const BLOCKED_ROUTE_MESSAGE = 'Do not work around this by clicking the screen or using another browser. Report that you could not use the App route.';
47
- const UNAUTHORIZED_MESSAGE = 'Do not retry. Report the failure.';
48
- function isRecord(value) {
49
- return value !== null && typeof value === 'object' && !Array.isArray(value);
50
- }
51
- function failure(exitCode, code, status) {
52
- let stderr;
53
- if (exitCode === 3 || exitCode === 9 || exitCode === 10 || exitCode === 11) {
54
- stderr = BLOCKED_ROUTE_MESSAGE;
55
- }
56
- else if (exitCode === 4) {
57
- stderr = UNAUTHORIZED_MESSAGE;
58
- }
59
- return {
60
- exitCode,
61
- payload: { ok: false, exit: exitCode, error: { code, status } },
62
- ...(stderr ? { stderr } : {}),
63
- };
64
- }
65
- function success(payload) {
66
- return { exitCode: 0, payload };
67
- }
68
- function usageFailure() {
69
- return failure(2, 'USAGE', null);
70
- }
71
- function parseCommand(args) {
72
- const command = args[0];
73
- if (command !== 'list' && command !== 'open' && command !== 'state' && command !== 'run' && command !== 'receipt') {
74
- return null;
75
- }
76
- const positional = [];
77
- const options = new Map();
78
- for (let index = 1; index < args.length; index += 1) {
79
- const arg = args[index];
80
- if (!arg.startsWith('--')) {
81
- positional.push(arg);
82
- continue;
83
- }
84
- const separator = arg.indexOf('=');
85
- const key = separator >= 0 ? arg.slice(2, separator) : arg.slice(2);
86
- const inlineValue = separator >= 0 ? arg.slice(separator + 1) : undefined;
87
- if ((key !== 'input' && key !== 'request-id') || options.has(key))
88
- return null;
89
- const value = inlineValue ?? args[index + 1];
90
- if (value === undefined)
91
- return null;
92
- if (inlineValue === undefined)
93
- index += 1;
94
- options.set(key, value);
95
- }
96
- if ((command === 'list' && positional.length !== 0)
97
- || (command === 'open' && positional.length !== 1)
98
- || (command === 'state' && (positional.length !== 1 || !positional[0].startsWith(APP_ID_PREFIX)))
99
- || (command === 'run' && positional.length !== 2)
100
- || (command === 'receipt' && positional.length !== 1)) {
101
- return null;
102
- }
103
- if (command !== 'run' && (options.has('input') || options.has('request-id')))
104
- return null;
105
- let input = {};
106
- if (options.has('input')) {
107
- const raw = options.get('input');
108
- try {
109
- const parsed = JSON.parse(raw === '-' ? fs.readFileSync(0, 'utf8') : raw);
110
- if (!isRecord(parsed))
111
- return null;
112
- input = parsed;
113
- }
114
- catch {
115
- return null;
116
- }
117
- }
118
- const requestId = options.get('request-id');
119
- if (requestId !== undefined && !REQUEST_ID_PATTERN.test(requestId))
120
- return null;
121
- return {
122
- command,
123
- positional,
124
- input,
125
- ...(requestId !== undefined ? { requestId } : {}),
126
- };
127
- }
128
- function getEndpoint(raw) {
129
- if (!raw)
130
- return null;
131
- let endpoint;
132
- try {
133
- endpoint = new node_url_1.URL(raw);
134
- }
135
- catch {
136
- return null;
137
- }
138
- if (!LOOPBACK_HOSTS.has(endpoint.hostname)
139
- || (endpoint.protocol !== 'http:' && endpoint.protocol !== 'https:')
140
- || endpoint.username !== ''
141
- || endpoint.password !== ''
142
- || endpoint.search !== ''
143
- || endpoint.hash !== ''
144
- || (endpoint.pathname !== '' && endpoint.pathname !== '/')) {
145
- return null;
146
- }
147
- return endpoint;
148
- }
149
- function segment(value) {
150
- return encodeURIComponent(value);
151
- }
152
- function basePath(workspaceSlug, threadId) {
153
- return [
154
- 'api', 'v1', 'ws', segment(workspaceSlug), 'threads', segment(threadId),
155
- ].join('/');
156
- }
157
- function pathFor(context, ...segments) {
158
- return `/${context.basePath}/${segments.map(segment).join('/')}`;
159
- }
160
- function responseErrorCode(data, fallback) {
161
- if (!isRecord(data) || !isRecord(data['error']))
162
- return fallback;
163
- const code = data['error']['code'];
164
- return typeof code === 'string' && code.length > 0 ? code : fallback;
165
- }
166
- function classifyHttpFailure(response) {
167
- const { status, data } = response;
168
- if (status >= 300 && status < 400)
169
- return failure(9, 'ENDPOINT_REJECTED', status);
170
- if (status === 401)
171
- return failure(4, responseErrorCode(data, 'UNAUTHORIZED'), status);
172
- if (status === 403)
173
- return failure(5, responseErrorCode(data, 'FORBIDDEN'), status);
174
- if (status === 404)
175
- return failure(6, responseErrorCode(data, 'NOT_FOUND'), status);
176
- if (status === 409) {
177
- const code = responseErrorCode(data, 'CONFLICT');
178
- if (code === 'APPROVAL_ALREADY_PENDING') {
179
- const error = isRecord(data) && isRecord(data['error']) ? data['error'] : undefined;
180
- const details = error && isRecord(error['details']) ? error['details'] : undefined;
181
- const receiptId = error?.['receiptId'] ?? details?.['receiptId']
182
- ?? (isRecord(data) ? data['receiptId'] : undefined);
183
- return {
184
- exitCode: 8,
185
- payload: {
186
- ok: false,
187
- exit: 8,
188
- error: { code, status },
189
- ...(typeof receiptId === 'string' ? { receiptId } : {}),
190
- },
191
- };
192
- }
193
- return failure(7, code, status);
194
- }
195
- return failure(1, responseErrorCode(data, 'ERROR'), status);
196
- }
197
- function networkFailure(error) {
198
- const errorCode = isRecord(error) && typeof error['code'] === 'string'
199
- ? error['code']
200
- : '';
201
- const codexBlocked = process.env['CODEX_SANDBOX_NETWORK_DISABLED'] === '1';
202
- const errnoBlocked = !codexBlocked && (errorCode === 'EPERM' || errorCode === 'EACCES');
203
- return codexBlocked || errnoBlocked
204
- ? failure(11, 'SANDBOX_BLOCKED', null)
205
- : failure(10, 'SERVER_UNREACHABLE', null);
206
- }
207
- function requestJson(context, method, requestPath, body) {
208
- const requestFunction = context.endpoint.protocol === 'https:' ? https.request : http.request;
209
- const hostname = context.endpoint.hostname === '[::1]'
210
- ? '::1'
211
- : context.endpoint.hostname;
212
- const port = context.endpoint.port ? Number(context.endpoint.port) : undefined;
213
- const bodyText = body === undefined ? undefined : JSON.stringify(body);
214
- const request = requestFunction({
215
- protocol: context.endpoint.protocol,
216
- hostname,
217
- ...(port !== undefined ? { port } : {}),
218
- method,
219
- path: requestPath,
220
- headers: {
221
- Authorization: `Bearer ${context.ticket}`,
222
- Accept: 'application/json',
223
- ...(bodyText !== undefined ? { 'Content-Type': 'application/json' } : {}),
224
- },
225
- }, (response) => {
226
- const status = response.statusCode ?? 0;
227
- if (status >= 300 && status < 400) {
228
- response.destroy();
229
- clearTimeout(timeout);
230
- resolveResponse({ status, data: undefined, invalidJson: false });
231
- return;
232
- }
233
- const chunks = [];
234
- response.setEncoding('utf8');
235
- response.on('data', (chunk) => chunks.push(chunk));
236
- response.once('error', (error) => failResponse(error));
237
- response.once('end', () => {
238
- clearTimeout(timeout);
239
- const raw = chunks.join('');
240
- try {
241
- resolveResponse({ status, data: JSON.parse(raw), invalidJson: false });
242
- }
243
- catch {
244
- resolveResponse({ status, data: undefined, invalidJson: true });
245
- }
246
- });
247
- });
248
- let socketError;
249
- let resolveResponse;
250
- let failResponse;
251
- const result = new Promise((resolve, reject) => {
252
- resolveResponse = resolve;
253
- failResponse = reject;
254
- });
255
- const timeout = setTimeout(() => {
256
- const error = new Error('Request timed out');
257
- error.code = 'ETIMEDOUT';
258
- request.destroy(error);
259
- }, REQUEST_TIMEOUT_MS);
260
- request.on('socket', (socket) => {
261
- socket.once('error', (error) => {
262
- socketError = error;
263
- });
264
- });
265
- request.once('error', (error) => {
266
- clearTimeout(timeout);
267
- failResponse(socketError ?? error);
268
- });
269
- if (bodyText !== undefined)
270
- request.write(bodyText);
271
- request.end();
272
- return result;
273
- }
274
- async function performRequest(context, method, requestPath, body) {
275
- try {
276
- const response = await requestJson(context, method, requestPath, body);
277
- if (response.status < 200 || response.status >= 300) {
278
- return { ok: false, outcome: classifyHttpFailure(response) };
279
- }
280
- if (response.invalidJson || !isRecord(response.data) || response.data['success'] !== true) {
281
- return {
282
- ok: false,
283
- outcome: failure(1, responseErrorCode(response.data, 'ERROR'), response.status),
284
- };
285
- }
286
- const data = response.data['data'];
287
- if (!isRecord(data)) {
288
- return { ok: false, outcome: failure(1, 'ERROR', response.status) };
289
- }
290
- return { ok: true, value: data, status: response.status };
291
- }
292
- catch (error) {
293
- return { ok: false, outcome: networkFailure(error) };
294
- }
295
- }
296
- function appIdFrom(value) {
297
- const direct = value['appId'] ?? value['id'];
298
- if (typeof direct === 'string' && direct.length > 0)
299
- return direct;
300
- const definition = value['definition'];
301
- if (isRecord(definition) && typeof definition['id'] === 'string')
302
- return definition['id'];
303
- return undefined;
304
- }
305
- function hashFrom(value) {
306
- const direct = value['definitionHash'];
307
- if (typeof direct === 'string' && direct.length > 0)
308
- return direct;
309
- const definition = value['definition'];
310
- if (isRecord(definition) && typeof definition['hash'] === 'string') {
311
- return definition['hash'];
312
- }
313
- return undefined;
314
- }
315
- function projectLauncher(value) {
316
- if (!isRecord(value))
317
- return undefined;
318
- const appId = appIdFrom(value);
319
- const definitionHash = hashFrom(value);
320
- if (!appId || !definitionHash)
321
- return undefined;
322
- const actions = value['agentActions'];
323
- return {
324
- appId,
325
- name: typeof value['name'] === 'string' ? value['name'] : '',
326
- description: typeof value['description'] === 'string' ? value['description'] : '',
327
- definitionHash,
328
- agentActions: Array.isArray(actions) ? actions : [],
329
- };
330
- }
331
- async function loadLaunchers(context) {
332
- const response = await performRequest(context, 'GET', pathFor(context, 'ui-instances', 'apps'));
333
- if (!response.ok)
334
- return response;
335
- const apps = response.value['apps'];
336
- if (!Array.isArray(apps)) {
337
- return { ok: false, outcome: failure(1, 'ERROR', response.status) };
338
- }
339
- const projected = apps.map(projectLauncher);
340
- if (projected.some((item) => item === undefined)) {
341
- return { ok: false, outcome: failure(1, 'ERROR', response.status) };
342
- }
343
- return { ok: true, value: projected, status: response.status };
344
- }
345
- function findLauncher(apps, appId) {
346
- return apps.find((app) => app.appId === appId);
347
- }
348
- async function openLauncher(context, launcher) {
349
- const response = await performRequest(context, 'POST', pathFor(context, 'ui-instances', 'open'), {
350
- appId: launcher.appId,
351
- expectedDefinitionHash: launcher.definitionHash,
352
- });
353
- if (!response.ok)
354
- return response;
355
- const instance = isRecord(response.value['instance']) ? response.value['instance'] : response.value;
356
- if (!isRecord(instance)) {
357
- return { ok: false, outcome: failure(1, 'ERROR', response.status) };
358
- }
359
- const instanceId = instance['instanceId'] ?? instance['id'];
360
- const revision = instance['revision'];
361
- if (typeof instanceId !== 'string' || typeof revision !== 'number') {
362
- return { ok: false, outcome: failure(1, 'ERROR', response.status) };
363
- }
364
- const ai = isRecord(response.value['ai'])
365
- ? response.value['ai']
366
- : isRecord(instance['ai']) ? instance['ai'] : undefined;
367
- return {
368
- ok: true,
369
- status: response.status,
370
- value: {
371
- appId: launcher.appId,
372
- definitionHash: launcher.definitionHash,
373
- instanceId,
374
- revision,
375
- state: ai && Object.prototype.hasOwnProperty.call(ai, 'state') ? ai['state'] : null,
376
- },
377
- };
378
- }
379
- async function readInstanceState(context, instanceId) {
380
- const response = await performRequest(context, 'GET', pathFor(context, 'ui-instances', instanceId));
381
- if (!response.ok)
382
- return response;
383
- const value = response.value;
384
- const responseInstanceId = value['instanceId'];
385
- const revision = value['revision'];
386
- if (typeof responseInstanceId !== 'string' || typeof revision !== 'number') {
387
- return { ok: false, outcome: failure(1, 'ERROR', response.status) };
388
- }
389
- const ai = isRecord(value['ai']) ? value['ai'] : undefined;
390
- const passthrough = (key) => {
391
- if (Object.prototype.hasOwnProperty.call(value, key))
392
- return { [key]: value[key] };
393
- if (ai && Object.prototype.hasOwnProperty.call(ai, key))
394
- return { [key]: ai[key] };
395
- return {};
396
- };
397
- return {
398
- ok: true,
399
- status: response.status,
400
- value: {
401
- instanceId: responseInstanceId,
402
- revision,
403
- state: ai && Object.prototype.hasOwnProperty.call(ai, 'state') ? ai['state'] : null,
404
- buttons: ai && Object.prototype.hasOwnProperty.call(ai, 'buttons') ? ai['buttons'] : null,
405
- ...passthrough('agentAccess'),
406
- ...passthrough('modelContext'),
407
- ...passthrough('pendingApproval'),
408
- },
409
- };
410
- }
411
- async function runAction(context, instanceId, actionId, requestId, input) {
412
- const response = await performRequest(context, 'POST', pathFor(context, 'ui-instances', instanceId, 'actions'), { actionId, requestId, input });
413
- if (!response.ok)
414
- return response;
415
- const receipt = response.value['receipt'];
416
- if (!isRecord(receipt)) {
417
- return { ok: false, outcome: failure(1, 'ERROR', response.status) };
418
- }
419
- const receiptId = receipt['receiptId'] ?? receipt['id'];
420
- const approval = response.value['approval'];
421
- if (response.status === 202 && isRecord(approval)) {
422
- const approvalId = approval['approvalId'];
423
- const expiresAt = approval['expiresAt'];
424
- const resolvedRequestId = typeof receipt['requestId'] === 'string'
425
- ? receipt['requestId']
426
- : typeof approval['requestId'] === 'string'
427
- ? approval['requestId']
428
- : requestId;
429
- if (typeof receiptId !== 'string' || typeof approvalId !== 'string'
430
- || (typeof expiresAt !== 'string' && typeof expiresAt !== 'number')) {
431
- return { ok: false, outcome: failure(1, 'ERROR', response.status) };
432
- }
433
- return {
434
- ok: false,
435
- outcome: {
436
- exitCode: 8,
437
- payload: {
438
- ok: false,
439
- exit: 8,
440
- error: { code: 'APPROVAL_PENDING', status: 202 },
441
- receiptId,
442
- requestId: resolvedRequestId,
443
- approvalId,
444
- expiresAt,
445
- },
446
- },
447
- };
448
- }
449
- const status = receipt['status'] ?? (response.status === 202 ? 'requested' : 'settled');
450
- const resolve = response.value['resolve'];
451
- const ai = isRecord(resolve) && isRecord(resolve['ai']) ? resolve['ai'] : undefined;
452
- return {
453
- ok: true,
454
- status: response.status,
455
- value: {
456
- receiptId: typeof receiptId === 'string' ? receiptId : '',
457
- requestId: typeof receipt['requestId'] === 'string' ? receipt['requestId'] : requestId,
458
- instanceId,
459
- actionId: typeof receipt['actionId'] === 'string' ? receipt['actionId'] : actionId,
460
- status,
461
- outcome: Object.prototype.hasOwnProperty.call(receipt, 'outcome') ? receipt['outcome'] : null,
462
- state: ai && Object.prototype.hasOwnProperty.call(ai, 'state') ? ai['state'] : null,
463
- },
464
- };
465
- }
466
- function contextFromEnvironment() {
467
- const ticket = process.env['CREWX_TASK_TICKET'] ?? '';
468
- const workspaceSlug = process.env['CREWX_WORKSPACE_SLUG'] ?? '';
469
- const threadId = process.env['CREWX_THREAD_ID'] ?? '';
470
- if (!ticket.startsWith('crewxtk_') || !workspaceSlug || !threadId) {
471
- return failure(3, 'NO_TICKET', null);
472
- }
473
- const endpoint = getEndpoint(process.env['CREWX_ENDPOINT']);
474
- if (!endpoint)
475
- return failure(9, 'ENDPOINT_REJECTED', null);
476
- return {
477
- ticket,
478
- workspaceSlug,
479
- threadId,
480
- endpoint,
481
- basePath: basePath(workspaceSlug, threadId),
482
- };
483
- }
484
- function isAppCommandOutcome(value) {
485
- return 'exitCode' in value;
486
- }
487
- async function executeAppCommand(args) {
488
- const parsed = parseCommand(args);
489
- if (!parsed)
490
- return usageFailure();
491
- const context = contextFromEnvironment();
492
- if (isAppCommandOutcome(context))
493
- return context;
494
- if (parsed.command === 'list') {
495
- const result = await loadLaunchers(context);
496
- if (!result.ok)
497
- return result.outcome;
498
- return success({ ok: true, apps: result.value });
499
- }
500
- if (parsed.command === 'receipt') {
501
- const receiptId = parsed.positional[0];
502
- const response = await performRequest(context, 'GET', pathFor(context, 'ui-action-receipts', receiptId));
503
- if (!response.ok)
504
- return response.outcome;
505
- const receipt = response.value['receipt'];
506
- if (!isRecord(receipt))
507
- return failure(1, 'ERROR', response.status);
508
- return success({ ok: true, receipt });
509
- }
510
- if (parsed.command === 'state') {
511
- const result = await readInstanceState(context, parsed.positional[0]);
512
- if (!result.ok)
513
- return result.outcome;
514
- return success({ ok: true, ...result.value });
515
- }
516
- if (parsed.command === 'open') {
517
- const appId = parsed.positional[0];
518
- const list = await loadLaunchers(context);
519
- if (!list.ok)
520
- return list.outcome;
521
- const launcher = findLauncher(list.value, appId);
522
- if (!launcher)
523
- return failure(6, 'MCP_APP_NOT_FOUND', null);
524
- const opened = await openLauncher(context, launcher);
525
- if (!opened.ok)
526
- return opened.outcome;
527
- return success({ ok: true, ...opened.value });
528
- }
529
- const [target, actionId] = parsed.positional;
530
- const requestId = parsed.requestId ?? `cxa_${(0, node_crypto_1.randomBytes)(16).toString('base64url')}`;
531
- let instanceId = target;
532
- if (!target.startsWith(APP_ID_PREFIX)) {
533
- const list = await loadLaunchers(context);
534
- if (!list.ok)
535
- return list.outcome;
536
- const launcher = findLauncher(list.value, target);
537
- if (!launcher)
538
- return failure(6, 'MCP_APP_NOT_FOUND', null);
539
- const opened = await openLauncher(context, launcher);
540
- if (!opened.ok)
541
- return opened.outcome;
542
- instanceId = opened.value.instanceId;
543
- }
544
- const action = await runAction(context, instanceId, actionId, requestId, parsed.input);
545
- if (!action.ok)
546
- return action.outcome;
547
- return success({ ok: true, ...action.value });
548
- }
549
- //# sourceMappingURL=engine.js.map
1
+ "use strict";var xe=exports&&exports.__createBinding||(Object.create?(function(e,t,n,r){if(r===void 0)r=n;var o=Object.getOwnPropertyDescriptor(t,n);if(!o||("get"in o?!t.__esModule:o.writable||o.configurable)){o={enumerable:true,get:function(){return t[n]}}}Object.defineProperty(e,r,o)}):(function(e,t,n,r){if(r===void 0)r=n;e[r]=t[n]}));var Ne=exports&&exports.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}):function(e,t){e["default"]=t});var j=exports&&exports.__importStar||(function(){var e=function(t){e=Object.getOwnPropertyNames||function(n){var r=[];for(var o in n)if(Object.prototype.hasOwnProperty.call(n,o))r[r.length]=o;return r};return e(t)};return function(t){if(t&&t.__esModule)return t;var n={};if(t!=null){for(var r=e(t),o=0;o<r.length;o++)if(r[o]!=="default")xe(n,t,r[o])}Ne(n,t);return n}})();Object.defineProperty(exports,"__esModule",{value:true});exports.executeAppCommand=bt;const ie=require("node:crypto");const ae=require("node:child_process");const v=j(require("node:fs"));const je=j(require("node:http"));const $e=j(require("node:https"));const h=j(require("node:path"));const ue=require("node:url");const z=require("@crewx/shared/crewx-api-credential");const b=require("./receipt-wait.js");const C=require("./usage.js");const x=15e3;const Q=3e4;const Le=6e4;const ce=64*1024;const le="uic_";const Ue="/api/v1";const qe="/api/v1/app-dev/capabilities";const Me="/api/v1/app-dev/sessions";const Be=12;const Fe=13;const We=/^[A-Za-z0-9_-]{8,128}$/;const Ge=new Set(["127.0.0.1","[::1]","localhost"]);const Ve="http://localhost:8150";const Je="Do not work around this by clicking the screen or using another browser. Report that you could not use the App route.";const He="Do not retry. Report the failure.";const Xe="The server did not answer in time. Retry once; if it happens again, report it.";function l(e){return e!==null&&typeof e==="object"&&!Array.isArray(e)}function p(e,t,n,r){let o=r;if(!o&&(e===3||e===9||e===10||e===11)){o=Je}else if(!o&&e===4){o=He}return{exitCode:e,payload:{ok:false,exit:e,error:{code:t,status:n}},...o?{stderr:o}:{}}}function P(e){return{exitCode:0,payload:e}}function $(){return p(2,"USAGE",null)}function pe(e){const t=e[0];if(t!=="list"&&t!=="open"&&t!=="state"&&t!=="run"&&t!=="receipt"){return null}const n=[];const r=new Map;for(let a=1;a<e.length;a+=1){const u=e[a];if(!u.startsWith("--")){n.push(u);continue}const c=u.indexOf("=");const d=c>=0?u.slice(2,c):u.slice(2);const f=c>=0?u.slice(c+1):void 0;if(d!=="input"&&d!=="request-id"&&d!=="wait"||r.has(d))return null;const y=f??e[a+1];if(y===void 0)return null;if(f===void 0)a+=1;r.set(d,y)}if(t==="list"&&n.length!==0||t==="open"&&n.length!==1||t==="state"&&(n.length!==1||!n[0].startsWith(le))||t==="run"&&n.length!==2||t==="receipt"&&n.length!==1){return null}if(t!=="run"&&(r.has("input")||r.has("request-id")))return null;if(t!=="receipt"&&r.has("wait"))return null;let o={};if(r.has("input")){const a=r.get("input");try{const u=JSON.parse(a==="-"?v.readFileSync(0,"utf8"):a);if(!l(u))return null;o=u}catch{return null}}const i=r.get("request-id");if(i!==void 0&&!We.test(i))return null;const s=r.has("wait")?(0,b.parseWaitSeconds)(r.get("wait")):void 0;if(s===null)return null;return{command:t,positional:n,input:o,...i!==void 0?{requestId:i}:{},...s!==void 0?{waitSeconds:s}:{}}}function Y(e){if(!e)return null;let t;try{t=new ue.URL(e)}catch{return null}if(!Ge.has(t.hostname)||t.protocol!=="http:"&&t.protocol!=="https:"||t.username!==""||t.password!==""||t.search!==""||t.hash!==""||t.pathname!==""&&t.pathname!=="/"){return null}return t}function F(e){return encodeURIComponent(e)}function Ke(e,t){return["api","v1","ws",F(e),"threads",F(t)].join("/")}function L(e,...t){return`/${e.basePath}/${t.map(F).join("/")}`}function k(e,t){if(!l(e)||!l(e["error"]))return t;const n=e["error"]["code"];return typeof n==="string"&&n.length>0?n:t}function W(e){const{status:t,data:n}=e;if(t>=300&&t<400)return p(9,"ENDPOINT_REJECTED",t);if(t===401)return p(4,k(n,"UNAUTHORIZED"),t);if(t===403)return p(5,k(n,"FORBIDDEN"),t);if(t===404)return p(6,k(n,"NOT_FOUND"),t);if(t===409){const r=k(n,"CONFLICT");if(r==="APPROVAL_ALREADY_PENDING"){const o=l(n)&&l(n["error"])?n["error"]:void 0;const i=o&&l(o["details"])?o["details"]:void 0;const s=o?.["receiptId"]??i?.["receiptId"]??(l(n)?n["receiptId"]:void 0);return{exitCode:8,payload:{ok:false,exit:8,error:{code:r,status:t},...typeof s==="string"?{receiptId:s}:{}}}}return p(7,r,t)}return p(1,k(n,"ERROR"),t)}function U(e,t=true){const n=l(e)&&typeof e["code"]==="string"?e["code"]:"";const r=process.env["CODEX_SANDBOX_NETWORK_DISABLED"]==="1";const o=!r&&(n==="EPERM"||n==="EACCES");if(r||o)return p(11,"SANDBOX_BLOCKED",null);if(t&&n==="ETIMEDOUT"&&l(e)&&e["connectionEstablished"]===true){return p(14,"TIMED_OUT",null,Xe)}return p(10,"SERVER_UNREACHABLE",null)}function Z(e,t){if(e.exitCode!==14)return e;return{...e,payload:{...e.payload,requestId:t},stderr:["The request timed out and its outcome is unknown.",`Retry the same command once with --request-id ${t}; the server will return the same request's receipt without running the action twice.`,`If it times out again, report "server response delayed, outcome unknown" with requestId ${t}.`,"Do not report success or failure, click the screen, or use another route."].join("\n")}}function q(e,t,n,r,o,i=x){const s=e.protocol==="https:"?$e.request:je.request;const a=e.hostname==="[::1]"?"::1":e.hostname;const u=e.port?Number(e.port):void 0;const c=o===void 0?void 0:JSON.stringify(o);const d=s({protocol:e.protocol,hostname:a,...u!==void 0?{port:u}:{},method:n,path:r,headers:{Authorization:`Bearer ${t}`,Accept:"application/json",...c!==void 0?{"Content-Type":"application/json"}:{}}},m=>{const w=m.statusCode??0;if(w>=300&&w<400){m.destroy();clearTimeout(N);_({status:w,data:void 0,invalidJson:false,rawText:""});return}const A=[];m.setEncoding("utf8");m.on("data",O=>A.push(O));m.once("error",O=>I(O));m.once("end",()=>{clearTimeout(N);const O=A.join("");try{_({status:w,data:JSON.parse(O),invalidJson:false,rawText:O})}catch{_({status:w,data:void 0,invalidJson:true,rawText:O})}})});let f;let y=false;let _;let I;const S=new Promise((m,w)=>{_=m;I=w});const N=setTimeout(()=>{const m=new Error("Request timed out");m.code="ETIMEDOUT";m.connectionEstablished=y;d.destroy(m)},i);d.on("socket",m=>{const w=()=>{y=true};if(e.protocol==="https:"){const A=m;if(A.authorized)w();else A.once("secureConnect",w)}else{if(m.connecting)m.once("connect",w);else w()}m.once("error",A=>{f=A})});d.once("error",m=>{clearTimeout(N);I(f??m)});if(c!==void 0)d.write(c);d.end();return S}async function M(e,t,n,r,o=x){try{const i=await q(e.endpoint,e.ticket,t,n,r,o);if(i.status<200||i.status>=300){return{ok:false,outcome:W(i)}}if(i.invalidJson||!l(i.data)||i.data["success"]!==true){return{ok:false,outcome:p(1,k(i.data,"ERROR"),i.status)}}const s=i.data["data"];if(!l(s)){return{ok:false,outcome:p(1,"ERROR",i.status)}}return{ok:true,value:s,status:i.status}}catch(i){return{ok:false,outcome:U(i)}}}function de(e){return p(Be,"SERVER_TOO_OLD",e,"The running CrewX does not support App dev mode.")}function fe(e){if(e instanceof z.CrewxCredentialError){return p(e.exitCode,e.code,null,e.message)}return p(1,"ERROR",null)}function ze(){const e=process.env["CREWX_ENDPOINT"]?.trim()||Ve;return Y(e)}function G(e){try{return v.statSync(e).isDirectory()}catch{return false}}function ee(e){try{return v.statSync(e).isFile()}catch{return false}}function he(e=process.cwd()){let t=h.resolve(e);while(true){if(G(h.join(t,"apps"))||ee(h.join(t,"crewx.yaml"))){try{return v.realpathSync(t)}catch{return void 0}}const n=h.dirname(t);if(n===t)return void 0;t=n}}const ye="manifest.json";const me="ui-plugin.json";const Qe="dev.crewx";function we(e){try{const t=JSON.parse(v.readFileSync(e,"utf8"));return l(t)?t:void 0}catch{return void 0}}function te(e){const t=we(h.join(e,me));const n=h.join(e,ye);if(!ee(n))return t;const r=we(n);if(!r)return void 0;const o=r["_meta"];const i=l(o)?o[Qe]:void 0;const s={pluginId:r["name"],entry:l(i)?i["entry"]:void 0};if(t&&t["pluginId"]!==s["pluginId"])return void 0;return s}function Ee(e,t){const n=h.relative(e,t);return n!==""&&n!==".."&&!n.startsWith(`..${h.sep}`)&&!h.isAbsolute(n)}function Ye(e,t){if(!t||t==="."||t===".."||/[\\/]/.test(t)){return p(2,"USAGE",null,"App must be a folder name or pluginId.")}const n=h.join(e,"apps");const r=h.join(n,t);let o=G(r)?r:void 0;if(!o&&G(n)){try{for(const s of v.readdirSync(n,{withFileTypes:true})){if(!s.isDirectory())continue;const a=h.join(n,s.name);const u=te(a);if(u?.["pluginId"]===t){o=a;break}}}catch{}}let i=t;if(o){try{o=v.realpathSync(o)}catch{return p(6,"APP_INVALID",null)}if(!Ee(v.realpathSync(n),o)){return p(2,"USAGE",null,"App folder must be inside the workspace apps directory.")}const s=te(o);if(typeof s?.["pluginId"]==="string"&&s["pluginId"].length>0){i=s["pluginId"]}}else{o=r}return{appId:i,appDirectory:o}}function ve(e){if(e.status<200||e.status>=300){return{ok:false,outcome:W(e)}}if(e.invalidJson||!l(e.data)||e.data["success"]!==true||!l(e.data["data"])){return{ok:false,outcome:p(1,k(e.data,"ERROR"),e.status)}}return{ok:true,value:e.data,status:e.status,rawText:e.rawText}}async function Ze(e,t){try{const n=await q(e,t,"GET",qe);if(n.status===404||n.status>=300&&n.status<400||n.invalidJson){return{ok:false,outcome:de(n.status)}}if(n.status<200||n.status>=300){return{ok:false,outcome:W(n)}}if(!l(n.data)||n.data["success"]!==true||!l(n.data["data"])||n.data["data"]["appDev"]!==1){return{ok:false,outcome:de(n.status)}}return{ok:true,value:n.data,status:n.status,rawText:n.rawText}}catch(n){return{ok:false,outcome:U(n,false)}}}async function ne(e){const t=ze();if(!t)return{ok:false,outcome:p(9,"ENDPOINT_REJECTED",null)};let n;try{n=(0,z.resolveCrewxApiCredential)("app-dev").token}catch(c){return{ok:false,outcome:fe(c)}}const r=await Ze(t,n);if(!r.ok)return{ok:false,outcome:r.outcome};const o=he();if(!o){return{ok:false,outcome:p(2,"WORKSPACE_NOT_FOUND",null,"No workspace root with apps/ or crewx.yaml was found.")}}const i=Ye(o,e);if("exitCode"in i)return{ok:false,outcome:i};let s;try{s=await q(t,n,"POST",Me,{workspacePath:o,appId:i.appId})}catch(c){return{ok:false,outcome:U(c,false)}}const a=ve(s);if(!a.ok)return{ok:false,outcome:a.outcome};const u=a.value["data"];if(!l(u)||typeof u["workspaceSlug"]!=="string"||typeof u["appId"]!=="string"||typeof u["devPath"]!=="string"||!u["devPath"].startsWith("/ws/")){return{ok:false,outcome:p(1,"ERROR",s.status)}}if(!G(i.appDirectory)){return{ok:false,outcome:p(6,"APP_INVALID",s.status)}}return{ok:true,context:{endpoint:t,token:n,workspacePath:o,appId:u["appId"],appDirectory:i.appDirectory,devPath:u["devPath"]}}}function V(e,...t){return`${Ue}${e.devPath}${t.length>0?`/${t.map(F).join("/")}`:""}`}async function J(e,t,n,r,o=x){try{const i=await q(e.endpoint,e.token,t,n,r,o);return ve(i)}catch(i){return{ok:false,outcome:U(i,false)}}}function et(e){const t=e["appId"]??e["id"];if(typeof t==="string"&&t.length>0)return t;const n=e["definition"];if(l(n)&&typeof n["id"]==="string")return n["id"];return void 0}function tt(e){const t=e["definitionHash"];if(typeof t==="string"&&t.length>0)return t;const n=e["definition"];if(l(n)&&typeof n["hash"]==="string"){return n["hash"]}return void 0}function nt(e){if(!l(e))return void 0;const t=et(e);const n=tt(e);if(!t||!n)return void 0;const r=e["agentActions"];const o=ot(e["agentAccess"]);return{appId:t,name:typeof e["name"]==="string"?e["name"]:"",description:typeof e["description"]==="string"?e["description"]:"",definitionHash:n,agentActions:Array.isArray(r)?r:[],...o===void 0?{}:{agentAccess:o}}}const rt=new Set(["allowed","approval_required","denied"]);function ot(e){if(!l(e))return void 0;const t=new Map;for(const[n,r]of Object.entries(e)){if(rt.has(r))t.set(n,r)}return t.size>0?t:void 0}async function H(e,t=x){const n=await M(e,"GET",L(e,"ui-instances","apps"),void 0,t);if(!n.ok)return n;const r=n.value["apps"];if(!Array.isArray(r)){return{ok:false,outcome:p(1,"ERROR",n.status)}}const o=r.map(nt);if(o.some(i=>i===void 0)){return{ok:false,outcome:p(1,"ERROR",n.status)}}return{ok:true,value:o,status:n.status}}function re(e,t){return e.find(n=>n.appId===t)}async function ge(e,t,n=x){const r=await M(e,"POST",L(e,"ui-instances","open"),{appId:t.appId,expectedDefinitionHash:t.definitionHash},n);if(!r.ok)return r;const o=l(r.value["instance"])?r.value["instance"]:r.value;if(!l(o)){return{ok:false,outcome:p(1,"ERROR",r.status)}}const i=o["instanceId"]??o["id"];const s=o["revision"];if(typeof i!=="string"||typeof s!=="number"){return{ok:false,outcome:p(1,"ERROR",r.status)}}const a=l(r.value["ai"])?r.value["ai"]:l(o["ai"])?o["ai"]:void 0;return{ok:true,status:r.status,value:{appId:t.appId,definitionHash:t.definitionHash,instanceId:i,revision:s,state:a&&Object.prototype.hasOwnProperty.call(a,"state")?a["state"]:null}}}async function st(e,t){const n=await M(e,"GET",L(e,"ui-instances",t));if(!n.ok)return n;const r=n.value;const o=r["instanceId"];const i=r["revision"];if(typeof o!=="string"||typeof i!=="number"){return{ok:false,outcome:p(1,"ERROR",n.status)}}const s=l(r["ai"])?r["ai"]:void 0;const a=u=>{if(Object.prototype.hasOwnProperty.call(r,u))return{[u]:r[u]};if(s&&Object.prototype.hasOwnProperty.call(s,u))return{[u]:s[u]};return{}};return{ok:true,status:n.status,value:{instanceId:o,revision:i,state:s&&Object.prototype.hasOwnProperty.call(s,"state")?s["state"]:null,buttons:s&&Object.prototype.hasOwnProperty.call(s,"buttons")?s["buttons"]:null,...a("agentAccess"),...a("modelContext"),...a("pendingApproval")}}}async function it(e,t,n,r,o,i=x){const s=await M(e,"POST",L(e,"ui-instances",t,"actions"),{actionId:n,requestId:r,input:o},i);if(!s.ok)return s;const a=s.value["receipt"];if(!l(a)){return{ok:false,outcome:p(1,"ERROR",s.status)}}const u=a["receiptId"]??a["id"];const c=s.value["approval"];if(s.status===202&&l(c)){const _=c["approvalId"];const I=c["expiresAt"];const S=typeof a["requestId"]==="string"?a["requestId"]:typeof c["requestId"]==="string"?c["requestId"]:r;if(typeof u!=="string"||typeof _!=="string"||typeof I!=="string"&&typeof I!=="number"){return{ok:false,outcome:p(1,"ERROR",s.status)}}return{ok:false,outcome:{exitCode:8,payload:{ok:false,exit:8,error:{code:"APPROVAL_PENDING",status:202},receiptId:u,requestId:S,approvalId:_,expiresAt:I}}}}const d=a["status"]??(s.status===202?"requested":"settled");const f=s.value["resolve"];const y=l(f)&&l(f["ai"])?f["ai"]:void 0;return{ok:true,status:s.status,value:{receiptId:typeof u==="string"?u:"",requestId:typeof a["requestId"]==="string"?a["requestId"]:r,instanceId:t,actionId:typeof a["actionId"]==="string"?a["actionId"]:n,status:d,outcome:Object.prototype.hasOwnProperty.call(a,"outcome")?a["outcome"]:null,...typeof a["errorCode"]==="string"?{errorCode:a["errorCode"]}:{},state:y&&Object.prototype.hasOwnProperty.call(y,"state")?y["state"]:null,...Object.prototype.hasOwnProperty.call(s.value,"result")?{result:s.value["result"]}:{},...Object.prototype.hasOwnProperty.call(s.value,"resultExpired")?{resultExpired:s.value["resultExpired"]}:{}}}}function at(e){const t=e.payload["error"];return e.exitCode===14||l(t)&&t["status"]===429}async function Ae(e,t){const n=await M(e,"GET",L(e,"ui-action-receipts",t));if(!n.ok){return{state:"failed",retryable:at(n.outcome),value:n.outcome}}const r=n.value["receipt"];if(!l(r))return{state:"failed",retryable:false,value:p(1,"ERROR",n.status)};return{state:r["status"]==="requested"?"pending":"settled",value:P({ok:true,receipt:r,outcome:Object.prototype.hasOwnProperty.call(r,"outcome")?r["outcome"]:null,...typeof r["errorCode"]==="string"?{errorCode:r["errorCode"]}:{},...Object.prototype.hasOwnProperty.call(n.value,"result")?{result:n.value["result"]}:{},...Object.prototype.hasOwnProperty.call(n.value,"resultExpired")?{resultExpired:n.value["resultExpired"]}:{}})}}function ut(e,t){return{exitCode:124,payload:{ok:false,exit:124,error:{code:"WAIT_TIMEOUT",status:null},receiptId:e},suppressOutput:true,stderr:`\u2192 Receipt ${e} is still pending after ${t}s. Do not end your turn: run crewx app receipt ${e} --wait=${(0,b.nextWaitSeconds)(t)} again.`}}function Ie(){const e=process.env["CREWX_TASK_TICKET"]??"";const t=process.env["CREWX_WORKSPACE_SLUG"]??"";const n=process.env["CREWX_THREAD_ID"]??"";if(!e.startsWith("crewxtk_")||!t||!n){return p(3,"NO_TICKET",null)}const r=Y(process.env["CREWX_ENDPOINT"]);if(!r)return p(9,"ENDPOINT_REJECTED",null);return{ticket:e,workspaceSlug:t,threadId:n,endpoint:r,basePath:Ke(t,n)}}function _e(e){return"exitCode"in e}function Oe(e){return String(e).padStart(2,"0")}function ct(e){const t=typeof e==="number"?new Date(e):typeof e==="string"?new Date(/^\d+$/.test(e)?Number(e):e):void 0;if(!t||Number.isNaN(t.getTime()))return void 0;return`${Oe(t.getHours())}:${Oe(t.getMinutes())}`}function lt(e){if(e.exitCode!==8)return e;const t=ct(e.payload["expiresAt"]);const n=e.payload["receiptId"];const r=[`\u2192 Waiting for the user's approval in the App window${t?` (expires ${t})`:""}. Do not end your turn: ending it cancels the request.`,...typeof n==="string"&&n.length>0?[`\u2192 Wait: crewx app receipt ${n} --wait=${b.RECEIPT_WAIT_DEFAULT_SECONDS} (repeat on exit 124 until it settles)`]:[],"\u2192 Report success only if it settles as succeeded."];return{...e,stderr:[e.stderr,...r].filter(Boolean).join("\n")}}const pt=256*1024;function dt(e){try{const t=v.realpathSync(e);const n=v.realpathSync(h.join(t,"SKILL.md"));if(!Ee(t,n)||!ee(n))return void 0;const r=v.openSync(n,"r");try{const o=new Uint8Array(pt);const i=v.readSync(r,o,0,o.length,0);return(0,C.manualBody)(Buffer.from(o.buffer,0,i).toString("utf8"))}finally{v.closeSync(r)}}catch{return void 0}}async function ft(e){const t=he();if(!t)return void 0;try{const n=await Promise.resolve().then(()=>j(require("@crewx/sdk")));const r=await n.discoverWorkspaceApps(t);const o=r.apps.find(i=>i.appId===e)??r.apps.find(i=>i.pluginId===e);if(!o)return void 0;return{candidate:o,directory:h.join(t,o.relativePath),resolveAccess:n.resolveAgentAccess}}catch{return void 0}}async function ht(e){if(e.length!==2||e[1].startsWith("--"))return $();const t=e[1];const n=Ie();if(_e(n))return n;const r=await H(n);if(!r.ok)return r.outcome;const o=re(r.value,t);if(!o)return p(6,"MCP_APP_NOT_FOUND",null);const i=o.agentActions.filter(u=>typeof u==="string");const s=await ft(t);const a=s?(0,C.renderUsage)(dt(s.directory),(0,C.renderActionsSection)(t,s.candidate,(0,C.buildActionRows)(s.candidate,new Set(i),u=>s.resolveAccess(u),o.agentAccess)),s.candidate.manifest.csp?.connectDomains):(0,C.renderUsage)(void 0,(0,C.renderServerOnlyActions)(t,i));return{exitCode:0,payload:{ok:true},stdout:a}}function Re(e,t){if(e[0]!==t)return null;const n=[];let r=false;for(const o of e.slice(1)){if(o===(t==="dev"?"--no-open":"--json")){if(r)return null;r=true}else if(o.startsWith("--")){return null}else{n.push(o)}}if(n.length!==1)return null;return{appSelector:n[0],flag:r}}function Se(e){return`${JSON.stringify(e.payload)}
2
+ `}function yt(e){const t=e["detail"];if(e["rule"]!=="manifest"||!l(t))return"";const n=typeof t["path"]==="string"?t["path"]:"";const r=typeof t["rule"]==="string"?t["rule"]:"";if(!r)return"";return` ${n?`${n} `:""}(${r})`}async function mt(e){const t=Re(e,"check");if(!t)return $();const n=await ne(t.appSelector);if(!n.ok)return n.outcome;const r=await J(n.context,"GET",V(n.context,"check"));if(!r.ok)return r.outcome;const o=r.value["data"];if(!l(o))return p(1,"ERROR",r.status);const i=l(o["summary"])?o["summary"]:{};const s=Array.isArray(o["items"])?o["items"]:[];const a=typeof i["errors"]==="number"?i["errors"]:s.filter(f=>l(f)&&f["severity"]==="error").length;const u=typeof i["warnings"]==="number"?i["warnings"]:s.filter(f=>l(f)&&f["severity"]==="warning").length;const c=a===0?0:Fe;if(t.flag){return{exitCode:c,payload:r.value,stdout:`${r.rawText??Se({exitCode:c,payload:r.value})}`+(r.rawText?.endsWith("\n")?"":"\n"),suppressOutput:true}}const d=s.flatMap(f=>{if(!l(f))return[];const y=f["severity"];const _=y==="error"?"\u2715":y==="ok"?"\u2713":"!";const I=typeof f["where"]==="string"?f["where"]:"";const S=typeof f["code"]==="string"?f["code"]:"";return[`${_} ${I} ${S}${yt(f)}`]});d.push(`Summary: ${a} errors, ${u} warnings`);return{exitCode:c,payload:{},stdout:`${d.join("\n")}
3
+ `,suppressOutput:true}}async function wt(e){let t;try{t=(0,z.resolveCrewxApiCredential)("pairing").token}catch(r){return fe(r)}let n;try{n=await q(e.endpoint,t,"POST","/api/v1/auth/local/code")}catch(r){return U(r,false)}if(n.status<200||n.status>=300){return W(n)}if(n.invalidJson||!l(n.data)||typeof n.data["url"]!=="string"){return p(1,"PAIRING_CODE_INVALID",n.status)}try{const r=new ue.URL(n.data["url"]);const o=Y(r.origin);const i=r.hash.match(/^#pair=(.+)$/);if(!o||!i)return p(1,"PAIRING_CODE_INVALID",n.status);return`${o.origin}${e.devPath}#pair=${encodeURIComponent(i[1])}`}catch{return p(1,"PAIRING_CODE_INVALID",n.status)}}async function Et(e){const t=process.platform==="darwin"?"open":process.platform==="win32"?"explorer.exe":"xdg-open";const n=(0,ae.spawn)(t,[e],{detached:true,stdio:"ignore"});await new Promise((r,o)=>{n.once("error",o);n.once("spawn",()=>{n.unref();r()})})}async function vt(e){const t=pe(["run",...e.slice(2)]);if(!t||t.command!=="run")return $();const[n,r]=t.positional;const o=await ne(n);if(!o.ok)return o.outcome;const i=await J(o.context,"GET",V(o.context,"state"));if(!i.ok)return i.outcome;const s=i.value["data"];if(!l(s)||typeof s["revision"]!=="number"){return p(1,"APP_DEV_RESPONSE_INVALID",i.status)}const a=t.requestId??`cxa_${(0,ie.randomBytes)(16).toString("base64url")}`;const u=await J(o.context,"POST",V(o.context,"actions"),{actionId:r,requestId:a,input:t.input,expectedRevision:s["revision"]},Le);if(!u.ok)return u.outcome;const c=u.value["data"];const d=l(c)&&l(c["receipt"])?c["receipt"]:void 0;return{exitCode:d?.["outcome"]==="succeeded"?0:1,payload:u.value,stdout:`${u.rawText??Se({exitCode:0,payload:u.value})}`+(u.rawText?.endsWith("\n")?"":"\n"),suppressOutput:true}}function gt(e){try{const t=JSON.parse(v.readFileSync(h.join(e,"package.json"),"utf8"));if(!l(t)||!l(t["scripts"]))return false;const n=t["scripts"]["build"];return typeof n==="string"&&n.trim().length>0}catch{return false}}function De(e){const t=new Set([h.normalize(ye),h.normalize(me)]);const n=te(e);const r=n?.["entry"];if(typeof r==="string"&&r.length>0&&!h.isAbsolute(r)){const o=h.normalize(r);if(o!==".."&&!o.startsWith(`..${h.sep}`))t.add(o)}return t}function At(e,t){try{const n=v.statSync(h.join(e,t));return`${n.size}:${n.mtimeMs}:${n.ino}`}catch{return null}}function Te(e,t){return new Map([...t].map(n=>[n,At(e,n)]))}function It(e,t){const n=Date.now();let r="";let o=false;const i=s=>{const a=Buffer.from(r+(Buffer.isBuffer(s)?s.toString("utf8"):s),"utf8");r=a.length>ce?a.subarray(a.length-ce).toString("utf8"):a.toString("utf8")};return new Promise(s=>{const a=(0,ae.spawn)("npm",["run","build"],{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]});t(a);a.stdout?.on("data",i);a.stderr?.on("data",i);const u=c=>{if(o)return;o=true;t(void 0);s({ok:c,ms:Math.max(0,Date.now()-n),output:r})};a.once("error",c=>{i(`${c.message}
4
+ `);u(false)});a.once("close",c=>u(c===0))})}function _t(e){const t=e.payload["error"];return l(t)&&typeof t["code"]==="string"?t["code"]:"ERROR"}async function Ot(e,t){const n=await J(e,"POST",V(e,"reload"),t);if(!n.ok)return{errorCode:_t(n.outcome)};const r=n.value["data"];return l(r)&&typeof r["generation"]==="number"?{generation:r["generation"]}:{errorCode:"APP_DEV_RESPONSE_INVALID"}}async function Rt(e,t){const n=process.ppid;let r;try{r=v.watch(e.appDirectory,{recursive:true},(E,g)=>{O(g)})}catch(E){return p(1,"WATCH_FAILED",null,E instanceof Error?E.message:"Unable to watch the App folder.")}let o=false;let i=false;let s=false;let a=false;let u="";let c="";let d;let f;let y;let _={exitCode:0,payload:{},suppressOutput:true};const I=new Map;let S;const N=new Promise(E=>{S=E});const m=E=>{process.stdout.write(`${E}
5
+ `)};const w=()=>{if(o)return;o=true;if(d)clearTimeout(d);if(f)clearInterval(f);process.removeListener("SIGINT",A);process.removeListener("SIGTERM",A);S(_)};const A=()=>{if(i)return;i=true;r.close();if(d)clearTimeout(d);if(y&&y.exitCode===null)y.kill("SIGTERM");if(!s)w()};const O=E=>{if(i||o)return;const g=E===null?"":h.normalize(E.toString());const D=g.split(h.sep);if(D.some(T=>T==="node_modules"||T===".crewx"||T==="dist"))return;const K=t?De(e.appDirectory):new Set;if(y&&K.has(g))return;const R=I.get(g);if(R!==void 0){if(Date.now()<=R)return;I.delete(g)}if(s){a=true;u=g||"App files";return}c=g||"App files";if(d)clearTimeout(d);d=setTimeout(()=>{d=void 0;const T=c||"App files";c="";void X(T,false)},200)};const se=async E=>{const g=await Ot(e,E);return g.generation===void 0?`failed ${g.errorCode??"ERROR"}`:String(g.generation)};const X=async(E,g)=>{if(i||o)return;s=true;if(t){const D=De(e.appDirectory);const K=Te(e.appDirectory,D);const R=await It(e.appDirectory,B=>{y=B});const T=Te(e.appDirectory,D);for(const[B,Ce]of T){if(K.get(B)!==Ce){I.set(B,Date.now()+1e3)}}if(i){s=false;w();return}const ke={reason:"build",build:{ok:R.ok,ms:R.ms,...!R.ok?{output:R.output}:{}}};const be=await se(ke);m(`${g?"initial":E} -> build ${R.ok?"ok":"failed"} ${R.ms}ms -> reload ${be}`)}else if(!g){const D=await se({reason:"manual"});m(`${E} -> reload ${D}`)}s=false;if(i){w();return}if(a){const D=u||"App files";a=false;u="";void X(D,false);return}if(i)w()};r.once("error",E=>{_=p(1,"WATCH_FAILED",null,E.message);A()});process.once("SIGINT",A);process.once("SIGTERM",A);f=setInterval(()=>{if(process.ppid!==n)A()},1e3);f.unref();if(t)void X("initial",true);return N}async function St(e){const t=Re(e,"dev");if(!t)return $();const n=await ne(t.appSelector);if(!n.ok)return n.outcome;const r=`${n.context.endpoint.origin}${n.context.devPath}`;process.stdout.write(`${r}
6
+ `);if(!t.flag){const o=await wt(n.context);if(typeof o!=="string")return o;try{await Et(o)}catch(i){return p(1,"BROWSER_OPEN_FAILED",null,i instanceof Error?i.message:"Could not open the App dev tab.")}}return Rt(n.context,gt(n.context.appDirectory))}const Pe="usage: crewx app build [<appDir>] [--check | --watch]";const Dt=["crewx app <command>",""," list List Apps available to this task"," open <appId> Open an App in this conversation"," state <instanceId> Read AI-visible state, buttons, and agent access"," run <instanceId|appId> <actionId> [--input <JSON>|-] [--request-id <id>] Run one available action"," receipt <receiptId> [--wait=<seconds>] Read a safe action receipt"," build [<appDir>] [--check | --watch] Build a @Tool App: server.ts -> dist/ and the actions (manifest.json, or dist/tools.json)"," dev <app> [--no-open] Start a foreground App dev session"," check <app> [--json] Run the App dev checks"," run --dev <app> <actionId> [--input <JSON>|-] Run an App action through the dev checks"," usage [<appId>] Show the guide, or one App's manual and action table",""].join("\n");const Tt=[Pe,""," Builds <appDir> (default: the current directory) from its server.ts: dist/server.mjs, dist/entry.mjs,",' and the actions of manifest.json. With no "bin" and no crewx.app.command in package.json the App is'," server.ts only (tool mode): dist/server.mjs, dist/main.mjs and dist/tools.json, and manifest.json"," carries no actions. --check writes nothing and exits 1 when a generated file is stale."," --watch rebuilds on every change until Ctrl-C.",""].join("\n");function Pt(){const e=[h.join(__dirname,"..","..","build-app","load.cjs"),h.join(__dirname,"..","build-app","load.cjs")];const t=e.find(n=>v.existsSync(n));if(!t)return Promise.reject(new Error("the App build is not part of this install"));return require(t).loadAppBuilder()}function oe(e){return e instanceof Error?e.message:String(e)}async function kt(e){if(e.slice(1).some(s=>s==="--help"||s==="-h")){return{exitCode:0,payload:{ok:true},stdout:Tt}}let t;try{t=await Pt()}catch(s){return p(1,"BUILD_UNAVAILABLE",null,oe(s))}let n;try{n=t.parseArguments(e.slice(1))}catch(s){return p(2,"USAGE",null,`${oe(s)} \u2192 ${Pe}`)}const{appDirectory:r}=n;const o=h.relative(process.cwd(),r);const i=o===""?"crewx app build":`crewx app build ${o}`;if(n.watch){const s=new AbortController;const a=()=>s.abort();process.once("SIGINT",a);process.once("SIGTERM",a);try{await t.watchApp(r,u=>process.stdout.write(`${u}
7
+ `),{signal:s.signal})}finally{process.removeListener("SIGINT",a);process.removeListener("SIGTERM",a)}return{exitCode:0,payload:{},suppressOutput:true}}try{const s=await t.buildApp({appDirectory:r,check:n.check});if(n.check&&s.staleFiles.length>0){return{...p(1,"BUILD_STALE",null,`Stale generated files: ${s.staleFiles.join(", ")} \u2192 Fix: ${i}`),payload:{ok:false,exit:1,error:{code:"BUILD_STALE",status:null},appDir:r,stale:s.staleFiles}}}if(n.check){return P({ok:true,appDir:r,check:true,inSync:true,files:s.files,actions:s.actions})}const a=h.basename(r);const u=h.basename(h.dirname(r))==="apps";return{...P({ok:true,appDir:r,files:s.files,actions:s.actions}),stderr:u?`\u2192 Next: crewx app check ${a}`:`\u2192 Next: put ${a} in the workspace apps/ folder, then crewx app check ${a}`}}catch(s){return p(1,"BUILD_FAILED",null,oe(s))}}async function bt(e,{clock:t=b.realClock}={}){if(e.length===1&&(e[0]==="--help"||e[0]==="-h")){return{exitCode:0,payload:{ok:true},stdout:Dt}}if(e[0]==="build")return kt(e);if(e[0]==="dev")return St(e);if(e[0]==="check")return mt(e);if(e[0]==="run"&&e[1]==="--dev")return vt(e);if(e[0]==="usage")return ht(e);const n=pe(e);if(!n)return $();const r=Ie();if(_e(r))return r;if(n.command==="list"){const c=await H(r);if(!c.ok)return c.outcome;return P({ok:true,apps:c.value})}if(n.command==="receipt"){const c=n.positional[0];const d=(0,b.clampWaitSeconds)(n.waitSeconds??0);if(d===0)return(await Ae(r,c)).value;const f=await(0,b.pollUntilSettled)(()=>Ae(r,c),d,t);if(f.state!=="pending")return f.value;return ut(c,d)}if(n.command==="state"){const c=await st(r,n.positional[0]);if(!c.ok)return c.outcome;return P({ok:true,...c.value})}if(n.command==="open"){const c=n.positional[0];const d=await H(r);if(!d.ok)return d.outcome;const f=re(d.value,c);if(!f)return p(6,"MCP_APP_NOT_FOUND",null);const y=await ge(r,f);if(!y.ok)return y.outcome;return P({ok:true,...y.value})}const[o,i]=n.positional;const s=n.requestId??`cxa_${(0,ie.randomBytes)(16).toString("base64url")}`;let a=o;if(!o.startsWith(le)){const c=await H(r,Q);if(!c.ok)return Z(c.outcome,s);const d=re(c.value,o);if(!d)return p(6,"MCP_APP_NOT_FOUND",null);const f=await ge(r,d,Q);if(!f.ok)return Z(f.outcome,s);a=f.value.instanceId}const u=await it(r,a,i,s,n.input,Q);if(!u.ok)return lt(Z(u.outcome,s));return{...P({ok:true,...u.value}),stderr:`\u2192 Check: crewx app state ${u.value.instanceId}`}}
@@ -0,0 +1,24 @@
1
+ export declare const RECEIPT_POLL_INTERVAL_MS = 3000;
2
+ export declare const RECEIPT_WAIT_MAX_SECONDS: number;
3
+ export declare const RECEIPT_WAIT_DEFAULT_SECONDS = 60;
4
+ export declare function parseWaitSeconds(raw: string): number | null;
5
+ export declare function clampWaitSeconds(seconds: number): number;
6
+ export declare function nextWaitSeconds(waitedSeconds: number): number;
7
+ export interface WaitClock {
8
+ now(): number;
9
+ sleep(ms: number): Promise<void>;
10
+ }
11
+ export declare const realClock: WaitClock;
12
+ export type PollResult<T> = {
13
+ state: 'settled';
14
+ value: T;
15
+ } | {
16
+ state: 'pending';
17
+ value: T;
18
+ } | {
19
+ state: 'failed';
20
+ retryable: boolean;
21
+ value: T;
22
+ };
23
+ export declare function pollUntilSettled<T>(poll: () => Promise<PollResult<T>>, waitSeconds: number, clock?: WaitClock, intervalMs?: number): Promise<PollResult<T>>;
24
+
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.realClock=exports.RECEIPT_WAIT_DEFAULT_SECONDS=exports.RECEIPT_WAIT_MAX_SECONDS=exports.RECEIPT_POLL_INTERVAL_MS=void 0;exports.parseWaitSeconds=T;exports.clampWaitSeconds=r;exports.nextWaitSeconds=S;exports.pollUntilSettled=l;exports.RECEIPT_POLL_INTERVAL_MS=3e3;exports.RECEIPT_WAIT_MAX_SECONDS=15*60;exports.RECEIPT_WAIT_DEFAULT_SECONDS=60;const s=/^\d{1,9}$/;function T(e){return s.test(e)?Number(e):null}function r(e){return Math.min(e,exports.RECEIPT_WAIT_MAX_SECONDS)}function S(e){return Math.min(exports.RECEIPT_WAIT_MAX_SECONDS,Math.max(exports.RECEIPT_WAIT_DEFAULT_SECONDS,e))}exports.realClock={now:()=>Date.now(),sleep:e=>new Promise(E=>setTimeout(E,e))};async function l(e,E,n=exports.realClock,_=exports.RECEIPT_POLL_INTERVAL_MS){const a=n.now()+E*1e3;for(;;){const t=await e();if(t.state==="settled"||t.state==="failed"&&!t.retryable)return t;const i=n.now();if(i+_>a){const o=a-i;if(o>0)await n.sleep(o);return t}await n.sleep(_)}}
@@ -0,0 +1,27 @@
1
+ import type { McpAppAgentAccess, McpAppAgentAccessAction, UiPluginJsonSchema, WorkspaceAppCandidate } from '@crewx/sdk';
2
+ export type UsageAccess = McpAppAgentAccess;
3
+ export type UsageAccessSource = 'server' | 'declaration';
4
+ export interface UsageActionRow {
5
+ readonly actionId: string;
6
+ readonly backend: string;
7
+ readonly inputs: readonly string[];
8
+ readonly access: UsageAccess;
9
+ readonly source: UsageAccessSource;
10
+ readonly disputed: boolean;
11
+ readonly confirmation: string;
12
+ }
13
+ export declare const NO_MANUAL_TEXT = "No manual for this App.";
14
+ export declare function describeSchema(schema: UiPluginJsonSchema): string;
15
+ export declare function describeInputs(schema: UiPluginJsonSchema): string[];
16
+ export declare function effectiveAccess(policy: McpAppAgentAccess, serverCallable: boolean): {
17
+ readonly access: UsageAccess;
18
+ readonly disputed: boolean;
19
+ };
20
+ export declare function describeBackend(backend: WorkspaceAppCandidate['manifest']['actions'][number]['backend']): string;
21
+ export declare function buildActionRows(candidate: WorkspaceAppCandidate, serverAgentActions: ReadonlySet<string>, resolveAccess: (action: McpAppAgentAccessAction) => McpAppAgentAccess, serverAccess?: ReadonlyMap<string, McpAppAgentAccess>): UsageActionRow[];
22
+ export declare function renderActionsSection(appId: string, candidate: WorkspaceAppCandidate, rows: readonly UsageActionRow[]): string;
23
+ export declare function renderServerOnlyActions(appId: string, agentActions: readonly string[]): string;
24
+ export declare function manualBody(raw: string): string;
25
+ export declare function renderConnectsTo(connectDomains: readonly string[] | undefined): string;
26
+ export declare function renderUsage(manual: string | undefined, actionsSection: string, connectDomains?: readonly string[]): string;
27
+
@@ -0,0 +1,8 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.NO_MANUAL_TEXT=void 0;exports.describeSchema=d;exports.describeInputs=h;exports.effectiveAccess=$;exports.describeBackend=m;exports.buildActionRows=g;exports.renderActionsSection=j;exports.renderServerOnlyActions=w;exports.manualBody=q;exports.renderConnectsTo=A;exports.renderUsage=O;exports.NO_MANUAL_TEXT="No manual for this App.";const f="## Actions (generated from this App's declaration; * = required)";const p=128*1024;function l(e,n,t){if(e!==void 0&&n!==void 0)return` ${e}\u2013${n}`;if(n!==void 0)return` \u2264${n}`;if(e!==void 0&&!(t&&e===0))return` \u2265${e}`;return""}function b(e){return JSON.stringify(e)}function d(e){if(Array.isArray(e.enum))return`one of ${e.enum.map(b).join(", ")}`;switch(e.type){case"string":return`string${l(e.minLength,e.maxLength,true)}`;case"integer":case"number":return`${e.type}${l(e.minimum,e.maximum,false)}`;case"boolean":return"boolean";case"null":return"null";case"array":{const n=e.items?` of ${d(e.items)}`:"";return`array${l(e.minItems,e.maxItems,true)}${n}`}case"object":{const n=Object.entries(e.properties??{});if(n.length===0)return"object";const t=new Set(e.required??[]);return`{${n.map(([r,s])=>`${r}${t.has(r)?"*":""}: ${d(s)}`).join(", ")}}`}default:return String(e.type)}}function h(e){const n=new Set(e.required??[]);return Object.entries(e.properties??{}).map(([t,r])=>`${t}${n.has(t)?"*":""}: ${d(r)}`)}function $(e,n){if(e==="allowed")return{access:n?"allowed":"denied",disputed:false};if(e==="approval_required")return{access:"approval_required",disputed:false};return n?{access:"approval_required",disputed:true}:{access:"denied",disputed:false}}function m(e){if(e.type==="core")return e.handler;return e.entry!==void 0?"server.ts":e.command.join(" ")}function g(e,n,t,r){return e.manifest.actions.map(s=>{const c=e.definition.actions[s.actionId];const a=c?.confirmation;const i=r?.get(s.actionId);const o=i!==void 0?{access:i,disputed:false}:$(t({actionId:s.actionId,confirmation:a,content:c?.content,backend:e.handlers[s.actionId]?.backend??s.backend}),n.has(s.actionId));return{actionId:s.actionId,backend:m(e.handlers[s.actionId]?.backend??s.backend),inputs:h(s.inputSchema),access:o.access,source:i!==void 0?"server":"declaration",disputed:o.disputed,confirmation:a??"native"}})}function y(e){return e.replace(/\|/g,"\\|").replace(/\r?\n/g," ")}function v(e){if(Array.isArray(e.enum))return e.enum[0];switch(e.type){case"string":return"\u2026";case"integer":case"number":return e.minimum??0;case"boolean":return true;case"null":return null;case"array":return[];case"object":return{};default:return null}}function S(e,n,t){const r=t.filter(o=>o.access!=="denied");const s=o=>n.manifest.actions.find(u=>u.actionId===o.actionId);const c=r.find(o=>(s(o)?.inputSchema.required??[]).length>0)??r[0];const a=c&&s(c);if(!c||!a)return void 0;const i={};for(const o of a.inputSchema.required??[]){const u=a.inputSchema.properties[o];if(u)i[o]=v(u)}return`crewx app run ${e} ${c.actionId} --input '${JSON.stringify(i)}'`}const I="agent: allowed = `crewx app run` runs it now; approval_required = the user approves once per task (exit 8 until then); denied = only the user operates it.";function _(e){if(e.length>0&&e.every(n=>n.source==="server"))return"Access source: the server, per action.";return"Access source: this App's declaration, checked against the server's agent-callable list. `crewx app state <instanceId>` shows the server's value per action once the App is open."}function j(e,n,t){const r=[f,"","| actionId | input | agent | confirmation |","|---|---|---|---|"];for(const i of t){const o=i.inputs.length>0?i.inputs.map(u=>`\`${y(u)}\``).join("<br>"):"(none)";r.push(`| \`${i.actionId}\` | ${o} | ${i.access} | ${i.confirmation} |`)}if(t.length===0)r.push("| (this App declares no actions) | | | |");r.push("",I,_(t));if(t.some(i=>i.backend==="server.ts"))r.push("Backend: server.ts (this App has no CLI command; its actions run from the App itself).");const s=t.filter(i=>i.disputed).map(i=>`\`${i.actionId}\``);if(s.length>0){r.push(`${s.join(", ")}: this directory's declaration denies the action but the server lists it as callable, so it is shown as approval_required. Open the App and read \`crewx app state <instanceId>\` for the server's value.`)}const c=n.manifest.actions.every(i=>i.inputSchema.additionalProperties===false);if(c&&t.length>0)r.push("Send exactly the keys listed; any other key is rejected.");const a=S(e,n,t);if(a)r.push(`Example: \`${a}\``);return r.join("\n")}function w(e,n){const t=n.length>0?`Agent-callable actions according to \`crewx app list\`: ${n.map(r=>`\`${r}\``).join(", ")}.`:"The server lists no agent-callable actions for this App; only the user operates it.";return[f,"","This App's declaration is not readable from this directory, so input shapes are not available here.",t,`To see the inputs and access of each action: \`crewx app open ${e}\`, then \`crewx app state <instanceId>\`.`].join("\n")}function q(e){const n=e.replace(/^?---\r?\n[\s\S]*?\r?\n---\r?\n?/,"");const t=Buffer.from(n,"utf8");if(t.length<=p)return n.trimEnd();return`${t.subarray(0,p).toString("utf8").replace(/�$/,"").trimEnd()}
2
+
3
+ (manual truncated at ${p} bytes)`}function A(e){return e!==void 0&&e.length>0?`Connects to: ${e.join(", ")}
4
+
5
+ `:""}function O(e,n,t){return`${e!==void 0&&e.length>0?e:exports.NO_MANUAL_TEXT}
6
+
7
+ ${A(t)}${n}
8
+ `}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewx/app",
3
- "version": "0.1.0-rc.3",
3
+ "version": "0.1.0-rc.31",
4
4
  "description": "Task-scoped CLI access to CrewX Apps",
5
5
  "type": "commonjs",
6
6
  "main": "dist/src/engine.js",
@@ -23,8 +23,13 @@
23
23
  },
24
24
  "files": [
25
25
  "dist",
26
+ "build-app",
26
27
  "SKILL.md"
27
28
  ],
29
+ "dependencies": {
30
+ "esbuild": "0.27.7",
31
+ "@crewx/sdk": "0.9.0-rc.150"
32
+ },
28
33
  "keywords": [
29
34
  "crewx",
30
35
  "app"
package/dist/cli.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":";AA2BA,wBAAsB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB9D"}
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,oBAsBC;AA/CD,4CAA8B;AAC9B,gDAAkC;AAClC,+CAAuE;AAEvE,SAAS,WAAW,CAAC,OAA0B;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACnF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACzF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;AAClE,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;KACjC,CAAC;IACF,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AAC3D,CAAC;AAEM,KAAK,UAAU,IAAI,CAAC,SAAoB;IAC7C,MAAM,IAAI,GAAG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,UAAU,EAAE,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,CAAC;gBACV,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;aACxE,CAAC,CAAC;QACL,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,WAAW,CAAC,MAAM,IAAA,6BAAiB,EAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,CAAC;YACV,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;SACxE,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,KAAK,IAAI,EAAE,CAAC;AACd,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA8gBD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2DlF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"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"}