@crewx/app 0.1.0-rc.1 → 0.1.0-rc.100
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 +71 -4
- package/build-app/index.d.mts +64 -0
- package/build-app/index.mjs +7 -0
- package/build-app/load.cjs +1 -0
- package/build-app/manifest.mjs +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +3 -88
- package/dist/src/engine.d.ts +7 -2
- package/dist/src/engine.js +8 -493
- package/dist/src/image-artifact.d.ts +24 -0
- package/dist/src/image-artifact.js +1 -0
- package/dist/src/receipt-wait.d.ts +24 -0
- package/dist/src/receipt-wait.js +1 -0
- package/dist/src/usage.d.ts +27 -0
- package/dist/src/usage.js +8 -0
- package/package.json +6 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/src/engine.d.ts.map +0 -1
- package/dist/src/engine.js.map +0 -1
package/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: crewx/app
|
|
3
|
-
description: Open a CrewX App and run
|
|
3
|
+
description: Open a CrewX App and run actions in this task's conversation.
|
|
4
4
|
metadata:
|
|
5
5
|
version: 0.1.0
|
|
6
6
|
built-in: true
|
|
@@ -12,13 +12,80 @@ metadata:
|
|
|
12
12
|
|---|---|
|
|
13
13
|
| `crewx app list` | List Apps available to this task |
|
|
14
14
|
| `crewx app open <appId>` | Open an App in this conversation |
|
|
15
|
-
| `crewx app state <instanceId>` | Read AI-visible state
|
|
16
|
-
| `crewx app run <instanceId|appId> <actionId> [--input <JSON>|-] [--request-id <id>]` | Run one
|
|
17
|
-
| `crewx app receipt <receiptId
|
|
15
|
+
| `crewx app state <instanceId>` | Read AI-visible state, buttons, and agent access |
|
|
16
|
+
| `crewx app run <instanceId|appId> <actionId> [--input <JSON>|-] [--request-id <id>]` | Run one available action |
|
|
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
|
+
## Open a captured image before describing marks
|
|
32
|
+
|
|
33
|
+
For the read-only `captureFeedback` action, send exactly `documentId`, `viewRef`, and `expectedAnnotationRevision`; use `--request-id` for the retry identity. A delivered image appears in `crewx app run` or `crewx app receipt` as a validated local PNG path, dimensions, byte count, and SHA-256. The image ref is replaced by that local path. The PNG is stored under `<cwd>/.crewx/app-captures/`; owned files older than 24 hours are pruned when another image is materialized. The cache holds at most 32 owned artifacts; a new artifact fails with `IMAGE_WRITE_FAILED` while 32 recent artifacts remain.
|
|
34
|
+
|
|
35
|
+
The capture folder's `.gitignore` must keep its generated contents (`*` followed by `!.gitignore`). If it is edited or replaced, image materialization fails with `IMAGE_WRITE_FAILED`; restore that file before retrying. The CLI never changes the workspace's `.gitignore` and never prunes unrelated files.
|
|
36
|
+
|
|
37
|
+
The pixels are not yet in model context. Open the exact printed path with the provider's image-reading tool before describing a marked target. If the provider has no image-reading tool, report that limitation; do not infer pixels from the path, counts, or note text, and do not claim an OCR fallback.
|
|
38
|
+
|
|
39
|
+
`crewx app state <instanceId>` may include a separate top-level `feedback` field for the task-bound Viewer. Its optional `summary` describes the loaded document and its `modelRevision`; it is not saved App state and it does not provide a replacement `viewRef`. Counts are last-known and updates may be coalesced for up to 750 ms. Do not decline a relevant user request solely because an older summary reports zero marks.
|
|
40
|
+
|
|
41
|
+
After a known `STALE` result, refresh with `crewx app state <instanceId>`, keep the same `viewRef` from the task prompt, and use `documentId` and `modelRevision` from the loaded `feedback.summary` rather than the saved document selection. Retry with a new `--request-id`. If the action outcome is unknown, recover the same receipt with `crewx app receipt <receiptId>`; do not rerun the capture. A receipt carrying the server-owned `viewCall: true` marker fails with exit 4 and an `IMAGE_*` code when its result expired or its top-level image descriptor is missing, while preserving the receipt and result text. Plain actions keep their existing behavior even if they share the name `captureFeedback`. If the output has no `image` field, no pixels were delivered; older servers may not expose the image result.
|
|
42
|
+
|
|
43
|
+
`IMAGE_EXPIRED` cannot be recovered from the same receipt; if the image is still needed, refresh state and send a new request ID for the same prompt-bound view using the loaded summary's `documentId` and `modelRevision`. If that view or its summary is unavailable, report that and do not substitute another view. The CLI never starts a new capture automatically.
|
|
44
|
+
|
|
45
|
+
## Build a `@Tool` App
|
|
46
|
+
|
|
47
|
+
`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.
|
|
48
|
+
|
|
49
|
+
**`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.
|
|
50
|
+
|
|
51
|
+
**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.
|
|
52
|
+
|
|
53
|
+
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.
|
|
54
|
+
|
|
55
|
+
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.
|
|
56
|
+
|
|
57
|
+
## App development
|
|
58
|
+
|
|
59
|
+
Run the watcher from a developer terminal and leave it in the foreground until you stop it with Ctrl-C:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
crewx app dev <app>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Use `--no-open` when a browser tab is not needed. The watcher runs `npm run build` when the App has a `build` script,
|
|
66
|
+
then reloads the dev tab after each build. Without a build script, file changes trigger a manual reload.
|
|
67
|
+
|
|
68
|
+
For a one-shot agent run, build and check before calling an action:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
cd apps/<app>
|
|
72
|
+
npm run build
|
|
73
|
+
cd ../..
|
|
74
|
+
crewx app check <app> --json
|
|
75
|
+
crewx app run --dev <app> <actionId> --input '{"key":"value"}'
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
`check` exits with code 13 when errors remain. `run --dev` prints the server result and checks; it exits non-zero when the
|
|
79
|
+
action did not succeed. A one-shot agent should use this build/check/run loop instead of holding the foreground watcher.
|
|
19
80
|
|
|
20
81
|
## When blocked
|
|
21
82
|
|
|
22
83
|
- 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.
|
|
84
|
+
- 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
85
|
- Exit 4: do not retry; report the failure.
|
|
86
|
+
- Use `agentAccess` from `crewx app state`: `allowed` can run, `approval_required` can request human approval, and `denied` must not run.
|
|
87
|
+
- 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.
|
|
88
|
+
- `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.
|
|
89
|
+
- `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.
|
|
90
|
+
- 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`.
|
|
24
91
|
- 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
package/dist/cli.js
CHANGED
|
@@ -1,89 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
|
|
4
|
-
|
|
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()}
|
package/dist/src/engine.d.ts
CHANGED
|
@@ -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[]
|
|
7
|
-
|
|
9
|
+
export declare function executeAppCommand(args: string[], { clock }?: {
|
|
10
|
+
clock?: WaitClock;
|
|
11
|
+
}): Promise<AppCommandOutcome>;
|
|
12
|
+
|
package/dist/src/engine.js
CHANGED
|
@@ -1,493 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
return failure(7, responseErrorCode(data, 'CONFLICT'), status);
|
|
178
|
-
return failure(1, responseErrorCode(data, 'ERROR'), status);
|
|
179
|
-
}
|
|
180
|
-
function networkFailure(error) {
|
|
181
|
-
const errorCode = isRecord(error) && typeof error['code'] === 'string'
|
|
182
|
-
? error['code']
|
|
183
|
-
: '';
|
|
184
|
-
const codexBlocked = process.env['CODEX_SANDBOX_NETWORK_DISABLED'] === '1';
|
|
185
|
-
const errnoBlocked = !codexBlocked && (errorCode === 'EPERM' || errorCode === 'EACCES');
|
|
186
|
-
return codexBlocked || errnoBlocked
|
|
187
|
-
? failure(11, 'SANDBOX_BLOCKED', null)
|
|
188
|
-
: failure(10, 'SERVER_UNREACHABLE', null);
|
|
189
|
-
}
|
|
190
|
-
function requestJson(context, method, requestPath, body) {
|
|
191
|
-
const requestFunction = context.endpoint.protocol === 'https:' ? https.request : http.request;
|
|
192
|
-
const hostname = context.endpoint.hostname === '[::1]'
|
|
193
|
-
? '::1'
|
|
194
|
-
: context.endpoint.hostname;
|
|
195
|
-
const port = context.endpoint.port ? Number(context.endpoint.port) : undefined;
|
|
196
|
-
const bodyText = body === undefined ? undefined : JSON.stringify(body);
|
|
197
|
-
const request = requestFunction({
|
|
198
|
-
protocol: context.endpoint.protocol,
|
|
199
|
-
hostname,
|
|
200
|
-
...(port !== undefined ? { port } : {}),
|
|
201
|
-
method,
|
|
202
|
-
path: requestPath,
|
|
203
|
-
headers: {
|
|
204
|
-
Authorization: `Bearer ${context.ticket}`,
|
|
205
|
-
Accept: 'application/json',
|
|
206
|
-
...(bodyText !== undefined ? { 'Content-Type': 'application/json' } : {}),
|
|
207
|
-
},
|
|
208
|
-
}, (response) => {
|
|
209
|
-
const status = response.statusCode ?? 0;
|
|
210
|
-
if (status >= 300 && status < 400) {
|
|
211
|
-
response.destroy();
|
|
212
|
-
clearTimeout(timeout);
|
|
213
|
-
resolveResponse({ status, data: undefined, invalidJson: false });
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
const chunks = [];
|
|
217
|
-
response.setEncoding('utf8');
|
|
218
|
-
response.on('data', (chunk) => chunks.push(chunk));
|
|
219
|
-
response.once('error', (error) => failResponse(error));
|
|
220
|
-
response.once('end', () => {
|
|
221
|
-
clearTimeout(timeout);
|
|
222
|
-
const raw = chunks.join('');
|
|
223
|
-
try {
|
|
224
|
-
resolveResponse({ status, data: JSON.parse(raw), invalidJson: false });
|
|
225
|
-
}
|
|
226
|
-
catch {
|
|
227
|
-
resolveResponse({ status, data: undefined, invalidJson: true });
|
|
228
|
-
}
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
let socketError;
|
|
232
|
-
let resolveResponse;
|
|
233
|
-
let failResponse;
|
|
234
|
-
const result = new Promise((resolve, reject) => {
|
|
235
|
-
resolveResponse = resolve;
|
|
236
|
-
failResponse = reject;
|
|
237
|
-
});
|
|
238
|
-
const timeout = setTimeout(() => {
|
|
239
|
-
const error = new Error('Request timed out');
|
|
240
|
-
error.code = 'ETIMEDOUT';
|
|
241
|
-
request.destroy(error);
|
|
242
|
-
}, REQUEST_TIMEOUT_MS);
|
|
243
|
-
request.on('socket', (socket) => {
|
|
244
|
-
socket.once('error', (error) => {
|
|
245
|
-
socketError = error;
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
|
-
request.once('error', (error) => {
|
|
249
|
-
clearTimeout(timeout);
|
|
250
|
-
failResponse(socketError ?? error);
|
|
251
|
-
});
|
|
252
|
-
if (bodyText !== undefined)
|
|
253
|
-
request.write(bodyText);
|
|
254
|
-
request.end();
|
|
255
|
-
return result;
|
|
256
|
-
}
|
|
257
|
-
async function performRequest(context, method, requestPath, body) {
|
|
258
|
-
try {
|
|
259
|
-
const response = await requestJson(context, method, requestPath, body);
|
|
260
|
-
if (response.status < 200 || response.status >= 300) {
|
|
261
|
-
return { ok: false, outcome: classifyHttpFailure(response) };
|
|
262
|
-
}
|
|
263
|
-
if (response.invalidJson || !isRecord(response.data) || response.data['success'] !== true) {
|
|
264
|
-
return {
|
|
265
|
-
ok: false,
|
|
266
|
-
outcome: failure(1, responseErrorCode(response.data, 'ERROR'), response.status),
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
const data = response.data['data'];
|
|
270
|
-
if (!isRecord(data)) {
|
|
271
|
-
return { ok: false, outcome: failure(1, 'ERROR', response.status) };
|
|
272
|
-
}
|
|
273
|
-
return { ok: true, value: data, status: response.status };
|
|
274
|
-
}
|
|
275
|
-
catch (error) {
|
|
276
|
-
return { ok: false, outcome: networkFailure(error) };
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
function appIdFrom(value) {
|
|
280
|
-
const direct = value['appId'] ?? value['id'];
|
|
281
|
-
if (typeof direct === 'string' && direct.length > 0)
|
|
282
|
-
return direct;
|
|
283
|
-
const definition = value['definition'];
|
|
284
|
-
if (isRecord(definition) && typeof definition['id'] === 'string')
|
|
285
|
-
return definition['id'];
|
|
286
|
-
return undefined;
|
|
287
|
-
}
|
|
288
|
-
function hashFrom(value) {
|
|
289
|
-
const direct = value['definitionHash'];
|
|
290
|
-
if (typeof direct === 'string' && direct.length > 0)
|
|
291
|
-
return direct;
|
|
292
|
-
const definition = value['definition'];
|
|
293
|
-
if (isRecord(definition) && typeof definition['hash'] === 'string') {
|
|
294
|
-
return definition['hash'];
|
|
295
|
-
}
|
|
296
|
-
return undefined;
|
|
297
|
-
}
|
|
298
|
-
function projectLauncher(value) {
|
|
299
|
-
if (!isRecord(value))
|
|
300
|
-
return undefined;
|
|
301
|
-
const appId = appIdFrom(value);
|
|
302
|
-
const definitionHash = hashFrom(value);
|
|
303
|
-
if (!appId || !definitionHash)
|
|
304
|
-
return undefined;
|
|
305
|
-
const actions = value['agentActions'];
|
|
306
|
-
return {
|
|
307
|
-
appId,
|
|
308
|
-
name: typeof value['name'] === 'string' ? value['name'] : '',
|
|
309
|
-
description: typeof value['description'] === 'string' ? value['description'] : '',
|
|
310
|
-
definitionHash,
|
|
311
|
-
agentActions: Array.isArray(actions) ? actions : [],
|
|
312
|
-
};
|
|
313
|
-
}
|
|
314
|
-
async function loadLaunchers(context) {
|
|
315
|
-
const response = await performRequest(context, 'GET', pathFor(context, 'ui-instances', 'apps'));
|
|
316
|
-
if (!response.ok)
|
|
317
|
-
return response;
|
|
318
|
-
const apps = response.value['apps'];
|
|
319
|
-
if (!Array.isArray(apps)) {
|
|
320
|
-
return { ok: false, outcome: failure(1, 'ERROR', response.status) };
|
|
321
|
-
}
|
|
322
|
-
const projected = apps.map(projectLauncher);
|
|
323
|
-
if (projected.some((item) => item === undefined)) {
|
|
324
|
-
return { ok: false, outcome: failure(1, 'ERROR', response.status) };
|
|
325
|
-
}
|
|
326
|
-
return { ok: true, value: projected, status: response.status };
|
|
327
|
-
}
|
|
328
|
-
function findLauncher(apps, appId) {
|
|
329
|
-
return apps.find((app) => app.appId === appId);
|
|
330
|
-
}
|
|
331
|
-
async function openLauncher(context, launcher) {
|
|
332
|
-
const response = await performRequest(context, 'POST', pathFor(context, 'ui-instances', 'open'), {
|
|
333
|
-
appId: launcher.appId,
|
|
334
|
-
expectedDefinitionHash: launcher.definitionHash,
|
|
335
|
-
});
|
|
336
|
-
if (!response.ok)
|
|
337
|
-
return response;
|
|
338
|
-
const instance = isRecord(response.value['instance']) ? response.value['instance'] : response.value;
|
|
339
|
-
if (!isRecord(instance)) {
|
|
340
|
-
return { ok: false, outcome: failure(1, 'ERROR', response.status) };
|
|
341
|
-
}
|
|
342
|
-
const instanceId = instance['instanceId'] ?? instance['id'];
|
|
343
|
-
const revision = instance['revision'];
|
|
344
|
-
if (typeof instanceId !== 'string' || typeof revision !== 'number') {
|
|
345
|
-
return { ok: false, outcome: failure(1, 'ERROR', response.status) };
|
|
346
|
-
}
|
|
347
|
-
const ai = isRecord(response.value['ai'])
|
|
348
|
-
? response.value['ai']
|
|
349
|
-
: isRecord(instance['ai']) ? instance['ai'] : undefined;
|
|
350
|
-
return {
|
|
351
|
-
ok: true,
|
|
352
|
-
status: response.status,
|
|
353
|
-
value: {
|
|
354
|
-
appId: launcher.appId,
|
|
355
|
-
definitionHash: launcher.definitionHash,
|
|
356
|
-
instanceId,
|
|
357
|
-
revision,
|
|
358
|
-
state: ai && Object.prototype.hasOwnProperty.call(ai, 'state') ? ai['state'] : null,
|
|
359
|
-
},
|
|
360
|
-
};
|
|
361
|
-
}
|
|
362
|
-
async function readInstanceState(context, instanceId) {
|
|
363
|
-
const response = await performRequest(context, 'GET', pathFor(context, 'ui-instances', instanceId));
|
|
364
|
-
if (!response.ok)
|
|
365
|
-
return response;
|
|
366
|
-
const value = response.value;
|
|
367
|
-
const responseInstanceId = value['instanceId'];
|
|
368
|
-
const revision = value['revision'];
|
|
369
|
-
if (typeof responseInstanceId !== 'string' || typeof revision !== 'number') {
|
|
370
|
-
return { ok: false, outcome: failure(1, 'ERROR', response.status) };
|
|
371
|
-
}
|
|
372
|
-
const ai = isRecord(value['ai']) ? value['ai'] : undefined;
|
|
373
|
-
return {
|
|
374
|
-
ok: true,
|
|
375
|
-
status: response.status,
|
|
376
|
-
value: {
|
|
377
|
-
instanceId: responseInstanceId,
|
|
378
|
-
revision,
|
|
379
|
-
state: ai && Object.prototype.hasOwnProperty.call(ai, 'state') ? ai['state'] : null,
|
|
380
|
-
buttons: ai && Object.prototype.hasOwnProperty.call(ai, 'buttons') ? ai['buttons'] : null,
|
|
381
|
-
},
|
|
382
|
-
};
|
|
383
|
-
}
|
|
384
|
-
async function runAction(context, instanceId, actionId, requestId, input) {
|
|
385
|
-
const response = await performRequest(context, 'POST', pathFor(context, 'ui-instances', instanceId, 'actions'), { actionId, requestId, input });
|
|
386
|
-
if (!response.ok)
|
|
387
|
-
return response;
|
|
388
|
-
const receipt = response.value['receipt'];
|
|
389
|
-
if (!isRecord(receipt)) {
|
|
390
|
-
return { ok: false, outcome: failure(1, 'ERROR', response.status) };
|
|
391
|
-
}
|
|
392
|
-
const receiptId = receipt['receiptId'] ?? receipt['id'];
|
|
393
|
-
const status = receipt['status'] ?? (response.status === 202 ? 'requested' : 'settled');
|
|
394
|
-
const resolve = response.value['resolve'];
|
|
395
|
-
const ai = isRecord(resolve) && isRecord(resolve['ai']) ? resolve['ai'] : undefined;
|
|
396
|
-
return {
|
|
397
|
-
ok: true,
|
|
398
|
-
status: response.status,
|
|
399
|
-
value: {
|
|
400
|
-
receiptId: typeof receiptId === 'string' ? receiptId : '',
|
|
401
|
-
requestId: typeof receipt['requestId'] === 'string' ? receipt['requestId'] : requestId,
|
|
402
|
-
instanceId,
|
|
403
|
-
actionId: typeof receipt['actionId'] === 'string' ? receipt['actionId'] : actionId,
|
|
404
|
-
status,
|
|
405
|
-
outcome: Object.prototype.hasOwnProperty.call(receipt, 'outcome') ? receipt['outcome'] : null,
|
|
406
|
-
state: ai && Object.prototype.hasOwnProperty.call(ai, 'state') ? ai['state'] : null,
|
|
407
|
-
},
|
|
408
|
-
};
|
|
409
|
-
}
|
|
410
|
-
function contextFromEnvironment() {
|
|
411
|
-
const ticket = process.env['CREWX_TASK_TICKET'] ?? '';
|
|
412
|
-
const workspaceSlug = process.env['CREWX_WORKSPACE_SLUG'] ?? '';
|
|
413
|
-
const threadId = process.env['CREWX_THREAD_ID'] ?? '';
|
|
414
|
-
if (!ticket.startsWith('crewxtk_') || !workspaceSlug || !threadId) {
|
|
415
|
-
return failure(3, 'NO_TICKET', null);
|
|
416
|
-
}
|
|
417
|
-
const endpoint = getEndpoint(process.env['CREWX_ENDPOINT']);
|
|
418
|
-
if (!endpoint)
|
|
419
|
-
return failure(9, 'ENDPOINT_REJECTED', null);
|
|
420
|
-
return {
|
|
421
|
-
ticket,
|
|
422
|
-
workspaceSlug,
|
|
423
|
-
threadId,
|
|
424
|
-
endpoint,
|
|
425
|
-
basePath: basePath(workspaceSlug, threadId),
|
|
426
|
-
};
|
|
427
|
-
}
|
|
428
|
-
function isAppCommandOutcome(value) {
|
|
429
|
-
return 'exitCode' in value;
|
|
430
|
-
}
|
|
431
|
-
async function executeAppCommand(args) {
|
|
432
|
-
const parsed = parseCommand(args);
|
|
433
|
-
if (!parsed)
|
|
434
|
-
return usageFailure();
|
|
435
|
-
const context = contextFromEnvironment();
|
|
436
|
-
if (isAppCommandOutcome(context))
|
|
437
|
-
return context;
|
|
438
|
-
if (parsed.command === 'list') {
|
|
439
|
-
const result = await loadLaunchers(context);
|
|
440
|
-
if (!result.ok)
|
|
441
|
-
return result.outcome;
|
|
442
|
-
return success({ ok: true, apps: result.value });
|
|
443
|
-
}
|
|
444
|
-
if (parsed.command === 'receipt') {
|
|
445
|
-
const receiptId = parsed.positional[0];
|
|
446
|
-
const response = await performRequest(context, 'GET', pathFor(context, 'ui-action-receipts', receiptId));
|
|
447
|
-
if (!response.ok)
|
|
448
|
-
return response.outcome;
|
|
449
|
-
const receipt = response.value['receipt'];
|
|
450
|
-
if (!isRecord(receipt))
|
|
451
|
-
return failure(1, 'ERROR', response.status);
|
|
452
|
-
return success({ ok: true, receipt });
|
|
453
|
-
}
|
|
454
|
-
if (parsed.command === 'state') {
|
|
455
|
-
const result = await readInstanceState(context, parsed.positional[0]);
|
|
456
|
-
if (!result.ok)
|
|
457
|
-
return result.outcome;
|
|
458
|
-
return success({ ok: true, ...result.value });
|
|
459
|
-
}
|
|
460
|
-
if (parsed.command === 'open') {
|
|
461
|
-
const appId = parsed.positional[0];
|
|
462
|
-
const list = await loadLaunchers(context);
|
|
463
|
-
if (!list.ok)
|
|
464
|
-
return list.outcome;
|
|
465
|
-
const launcher = findLauncher(list.value, appId);
|
|
466
|
-
if (!launcher)
|
|
467
|
-
return failure(6, 'MCP_APP_NOT_FOUND', null);
|
|
468
|
-
const opened = await openLauncher(context, launcher);
|
|
469
|
-
if (!opened.ok)
|
|
470
|
-
return opened.outcome;
|
|
471
|
-
return success({ ok: true, ...opened.value });
|
|
472
|
-
}
|
|
473
|
-
const [target, actionId] = parsed.positional;
|
|
474
|
-
const requestId = parsed.requestId ?? `cxa_${(0, node_crypto_1.randomBytes)(16).toString('base64url')}`;
|
|
475
|
-
let instanceId = target;
|
|
476
|
-
if (!target.startsWith(APP_ID_PREFIX)) {
|
|
477
|
-
const list = await loadLaunchers(context);
|
|
478
|
-
if (!list.ok)
|
|
479
|
-
return list.outcome;
|
|
480
|
-
const launcher = findLauncher(list.value, target);
|
|
481
|
-
if (!launcher)
|
|
482
|
-
return failure(6, 'MCP_APP_NOT_FOUND', null);
|
|
483
|
-
const opened = await openLauncher(context, launcher);
|
|
484
|
-
if (!opened.ok)
|
|
485
|
-
return opened.outcome;
|
|
486
|
-
instanceId = opened.value.instanceId;
|
|
487
|
-
}
|
|
488
|
-
const action = await runAction(context, instanceId, actionId, requestId, parsed.input);
|
|
489
|
-
if (!action.ok)
|
|
490
|
-
return action.outcome;
|
|
491
|
-
return success({ ok: true, ...action.value });
|
|
492
|
-
}
|
|
493
|
-
//# sourceMappingURL=engine.js.map
|
|
1
|
+
"use strict";var We=exports&&exports.__createBinding||(Object.create?(function(e,n,t,r){if(r===void 0)r=t;var o=Object.getOwnPropertyDescriptor(n,t);if(!o||("get"in o?!n.__esModule:o.writable||o.configurable)){o={enumerable:true,get:function(){return n[t]}}}Object.defineProperty(e,r,o)}):(function(e,n,t,r){if(r===void 0)r=t;e[r]=n[t]}));var Ve=exports&&exports.__setModuleDefault||(Object.create?(function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}):function(e,n){e["default"]=n});var U=exports&&exports.__importStar||(function(){var e=function(n){e=Object.getOwnPropertyNames||function(t){var r=[];for(var o in t)if(Object.prototype.hasOwnProperty.call(t,o))r[r.length]=o;return r};return e(n)};return function(n){if(n&&n.__esModule)return n;var t={};if(n!=null){for(var r=e(n),o=0;o<r.length;o++)if(r[o]!=="default")We(t,n,r[o])}Ve(t,n);return t}})();Object.defineProperty(exports,"__esModule",{value:true});exports.executeAppCommand=zt;const pe=require("node:crypto");const de=require("node:child_process");const v=U(require("node:fs"));const le=U(require("node:http"));const fe=U(require("node:https"));const E=U(require("node:path"));const he=require("node:url");const te=require("@crewx/shared/crewx-api-credential");const D=require("./image-artifact.js");const j=require("./receipt-wait.js");const L=require("./usage.js");const N=15e3;const ne=3e4;const Je=6e4;const me=64*1024;const ye="uic_";const Ke="/api/v1";const He="/api/v1/app-dev/capabilities";const Xe="/api/v1/app-dev/sessions";const ze=12;const Ye=13;const Ze=/^[A-Za-z0-9_-]{8,128}$/;const Qe=new Set(["127.0.0.1","[::1]","localhost"]);const et="http://localhost:8150";const tt="Do not work around this by clicking the screen or using another browser. Report that you could not use the App route.";const nt="Do not retry. Report the failure.";const rt="The server did not answer in time. Retry once; if it happens again, report it.";function u(e){return e!==null&&typeof e==="object"&&!Array.isArray(e)}function d(e,n,t,r){let o=r;if(!o&&(e===3||e===9||e===10||e===11)){o=tt}else if(!o&&e===4){o=nt}return{exitCode:e,payload:{ok:false,exit:e,error:{code:n,status:t}},...o?{stderr:o}:{}}}function P(e){return{exitCode:0,payload:e}}function B(){return d(2,"USAGE",null)}function ge(e){const n=e[0];if(n!=="list"&&n!=="open"&&n!=="state"&&n!=="run"&&n!=="receipt"){return null}const t=[];const r=new Map;for(let a=1;a<e.length;a+=1){const c=e[a];if(!c.startsWith("--")){t.push(c);continue}const p=c.indexOf("=");const l=p>=0?c.slice(2,p):c.slice(2);const f=p>=0?c.slice(p+1):void 0;if(l!=="input"&&l!=="request-id"&&l!=="wait"||r.has(l))return null;const y=f??e[a+1];if(y===void 0)return null;if(f===void 0)a+=1;r.set(l,y)}if(n==="list"&&t.length!==0||n==="open"&&t.length!==1||n==="state"&&(t.length!==1||!t[0].startsWith(ye))||n==="run"&&t.length!==2||n==="receipt"&&t.length!==1){return null}if(n!=="run"&&(r.has("input")||r.has("request-id")))return null;if(n!=="receipt"&&r.has("wait"))return null;let o={};if(r.has("input")){const a=r.get("input");try{const c=JSON.parse(a==="-"?v.readFileSync(0,"utf8"):a);if(!u(c))return null;o=c}catch{return null}}const i=r.get("request-id");if(i!==void 0&&!Ze.test(i))return null;const s=r.has("wait")?(0,j.parseWaitSeconds)(r.get("wait")):void 0;if(s===null)return null;return{command:n,positional:t,input:o,...i!==void 0?{requestId:i}:{},...s!==void 0?{waitSeconds:s}:{}}}function re(e){if(!e)return null;let n;try{n=new he.URL(e)}catch{return null}if(!Qe.has(n.hostname)||n.protocol!=="http:"&&n.protocol!=="https:"||n.username!==""||n.password!==""||n.search!==""||n.hash!==""||n.pathname!==""&&n.pathname!=="/"){return null}return n}function J(e){return encodeURIComponent(e)}function ot(e,n){return["api","v1","ws",J(e),"threads",J(n)].join("/")}function $(e,...n){return`/${e.basePath}/${n.map(J).join("/")}`}function x(e,n){if(!u(e)||!u(e["error"]))return n;const t=e["error"]["code"];return typeof t==="string"&&t.length>0?t:n}function K(e){const{status:n,data:t}=e;if(n>=300&&n<400)return d(9,"ENDPOINT_REJECTED",n);if(n===401)return d(4,x(t,"UNAUTHORIZED"),n);if(n===403)return d(5,x(t,"FORBIDDEN"),n);if(n===404)return d(6,x(t,"NOT_FOUND"),n);if(n===409){const r=x(t,"CONFLICT");if(r==="APPROVAL_ALREADY_PENDING"){const o=u(t)&&u(t["error"])?t["error"]:void 0;const i=o&&u(o["details"])?o["details"]:void 0;const s=o?.["receiptId"]??i?.["receiptId"]??(u(t)?t["receiptId"]:void 0);return{exitCode:8,payload:{ok:false,exit:8,error:{code:r,status:n},...typeof s==="string"?{receiptId:s}:{}}}}return d(7,r,n)}return d(1,x(t,"ERROR"),n)}function F(e,n=true){const t=u(e)&&typeof e["code"]==="string"?e["code"]:"";const r=process.env["CODEX_SANDBOX_NETWORK_DISABLED"]==="1";const o=!r&&(t==="EPERM"||t==="EACCES");if(r||o)return d(11,"SANDBOX_BLOCKED",null);if(n&&t==="ETIMEDOUT"&&u(e)&&e["connectionEstablished"]===true){return d(14,"TIMED_OUT",null,rt)}return d(10,"SERVER_UNREACHABLE",null)}function oe(e,n){if(e.exitCode!==14)return e;return{...e,payload:{...e.payload,requestId:n},stderr:["The request timed out and its outcome is unknown.",`Retry the same command once with --request-id ${n}; 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 ${n}.`,"Do not report success or failure, click the screen, or use another route."].join("\n")}}function q(e,n,t,r,o,i=N){const s=e.protocol==="https:"?fe.request:le.request;const a=e.hostname==="[::1]"?"::1":e.hostname;const c=e.port?Number(e.port):void 0;const p=o===void 0?void 0:JSON.stringify(o);const l=s({protocol:e.protocol,hostname:a,...c!==void 0?{port:c}:{},method:t,path:r,headers:{Authorization:`Bearer ${n}`,Accept:"application/json",...p!==void 0?{"Content-Type":"application/json"}:{}}},m=>{const _=m.statusCode??0;if(_>=300&&_<400){m.destroy();clearTimeout(g);h({status:_,data:void 0,invalidJson:false,rawText:""});return}const b=[];m.setEncoding("utf8");m.on("data",R=>b.push(R));m.once("error",R=>w(R));m.once("end",()=>{clearTimeout(g);const R=b.join("");try{h({status:_,data:JSON.parse(R),invalidJson:false,rawText:R})}catch{h({status:_,data:void 0,invalidJson:true,rawText:R})}})});let f;let y=false;let h;let w;const A=new Promise((m,_)=>{h=m;w=_});const g=setTimeout(()=>{const m=new Error("Request timed out");m.code="ETIMEDOUT";m.connectionEstablished=y;l.destroy(m)},i);l.on("socket",m=>{const _=()=>{y=true};if(e.protocol==="https:"){const b=m;if(b.authorized)_();else b.once("secureConnect",_)}else{if(m.connecting)m.once("connect",_);else _()}m.once("error",b=>{f=b})});l.once("error",m=>{clearTimeout(g);w(f??m)});if(p!==void 0)l.write(p);l.end();return A}function st(e,n,t,r,o=N){const i=e.protocol==="https:"?fe.request:le.request;const s=e.hostname==="[::1]"?"::1":e.hostname;const a=e.port?Number(e.port):void 0;let c;let p;let l=false;let f;const y=new Promise((g,m)=>{c=g;p=m});const h=g=>{if(l)return;l=true;clearTimeout(f);c(g)};const w=g=>{if(l)return;l=true;clearTimeout(f);p(g)};const A=i({protocol:e.protocol,hostname:s,...a!==void 0?{port:a}:{},method:"GET",path:t,headers:{Authorization:`Bearer ${n}`,Accept:"image/png"}},g=>{const m=g.statusCode??0;const _=typeof g.headers["content-type"]==="string"?g.headers["content-type"]:void 0;if(m>=300&&m<400){g.destroy();h({status:m,contentType:_,bytes:new Uint8Array(0),rawText:""});return}if(m>=200&&m<300&&_?.split(";",1)[0]?.trim().toLowerCase()!=="image/png"){g.destroy();h({status:m,contentType:_,bytes:new Uint8Array(0),rawText:""});return}const b=[];let R=0;const W=m>=200&&m<300?r:64*1024;g.on("data",T=>{if(l)return;const I=typeof T==="string"?Buffer.from(T):T;const O=new Uint8Array(I.byteLength);O.set(I);R+=O.byteLength;if(R>W){g.destroy();w(new D.AppCaptureImageError(m>=200&&m<300?"IMAGE_BYTE_COUNT_MISMATCH":"IMAGE_DOWNLOAD_FAILED",m));return}b.push(O)});g.once("aborted",()=>w(new Error("Image response was interrupted")));g.once("error",T=>w(T));g.once("end",()=>{const T=new Uint8Array(R);let I=0;for(const O of b){T.set(O,I);I+=O.byteLength}h({status:m,contentType:_,bytes:T,rawText:m>=200&&m<300?"":Buffer.from(T).toString("utf8")})})});f=setTimeout(()=>{const g=new Error("Image request timed out");g.code="ETIMEDOUT";A.destroy(g)},o);A.once("error",g=>w(g));A.end();return y}function it(e){try{const n=JSON.parse(e);if(!u(n))return void 0;const t=u(n["error"])?n["error"]:void 0;return t&&typeof t["code"]==="string"?t["code"]:void 0}catch{return void 0}}async function at(e,n,t){let r;try{r=await st(e.endpoint,e.ticket,$(e,"ui-action-receipts",n,"image"),t)}catch(o){if(o instanceof D.AppCaptureImageError)throw o;throw new D.AppCaptureImageError("IMAGE_DOWNLOAD_FAILED")}if(r.status<200||r.status>=300){throw new D.AppCaptureImageError(it(r.rawText)==="IMAGE_EXPIRED"?"IMAGE_EXPIRED":"IMAGE_DOWNLOAD_FAILED",r.status)}if(r.contentType?.split(";",1)[0]?.trim().toLowerCase()!=="image/png"){throw new D.AppCaptureImageError("IMAGE_INVALID_MIME",r.status)}if(r.bytes.byteLength!==t){throw new D.AppCaptureImageError("IMAGE_BYTE_COUNT_MISMATCH",r.status)}return r.bytes}async function G(e,n,t,r,o=N){try{const i=await q(e.endpoint,e.ticket,n,t,r,o);if(i.status<200||i.status>=300){return{ok:false,outcome:K(i)}}if(i.invalidJson||!u(i.data)||i.data["success"]!==true){return{ok:false,outcome:d(1,x(i.data,"ERROR"),i.status)}}const s=i.data["data"];if(!u(s)){return{ok:false,outcome:d(1,"ERROR",i.status)}}return{ok:true,value:s,status:i.status}}catch(i){return{ok:false,outcome:F(i)}}}function we(e){return d(ze,"SERVER_TOO_OLD",e,"The running CrewX does not support App dev mode.")}function Ee(e){if(e instanceof te.CrewxCredentialError){return d(e.exitCode,e.code,null,e.message)}return d(1,"ERROR",null)}function ct(){const e=process.env["CREWX_ENDPOINT"]?.trim()||et;return re(e)}function H(e){try{return v.statSync(e).isDirectory()}catch{return false}}function se(e){try{return v.statSync(e).isFile()}catch{return false}}function Ie(e=process.cwd()){let n=E.resolve(e);while(true){if(H(E.join(n,"apps"))||se(E.join(n,"crewx.yaml"))){try{return v.realpathSync(n)}catch{return void 0}}const t=E.dirname(n);if(t===n)return void 0;n=t}}const Ae="manifest.json";const _e="ui-plugin.json";const ut="dev.crewx";function Oe(e){try{const n=JSON.parse(v.readFileSync(e,"utf8"));return u(n)?n:void 0}catch{return void 0}}function ie(e){const n=Oe(E.join(e,_e));const t=E.join(e,Ae);if(!se(t))return n;const r=Oe(t);if(!r)return void 0;const o=r["_meta"];const i=u(o)?o[ut]:void 0;const s={pluginId:r["name"],entry:u(i)?i["entry"]:void 0};if(n&&n["pluginId"]!==s["pluginId"])return void 0;return s}function be(e,n){const t=E.relative(e,n);return t!==""&&t!==".."&&!t.startsWith(`..${E.sep}`)&&!E.isAbsolute(t)}function pt(e,n){if(!n||n==="."||n===".."||/[\\/]/.test(n)){return d(2,"USAGE",null,"App must be a folder name or pluginId.")}const t=E.join(e,"apps");const r=E.join(t,n);let o=H(r)?r:void 0;if(!o&&H(t)){try{for(const s of v.readdirSync(t,{withFileTypes:true})){if(!s.isDirectory())continue;const a=E.join(t,s.name);const c=ie(a);if(c?.["pluginId"]===n){o=a;break}}}catch{}}let i=n;if(o){try{o=v.realpathSync(o)}catch{return d(6,"APP_INVALID",null)}if(!be(v.realpathSync(t),o)){return d(2,"USAGE",null,"App folder must be inside the workspace apps directory.")}const s=ie(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:K(e)}}if(e.invalidJson||!u(e.data)||e.data["success"]!==true||!u(e.data["data"])){return{ok:false,outcome:d(1,x(e.data,"ERROR"),e.status)}}return{ok:true,value:e.data,status:e.status,rawText:e.rawText}}async function dt(e,n){try{const t=await q(e,n,"GET",He);if(t.status===404||t.status>=300&&t.status<400||t.invalidJson){return{ok:false,outcome:we(t.status)}}if(t.status<200||t.status>=300){return{ok:false,outcome:K(t)}}if(!u(t.data)||t.data["success"]!==true||!u(t.data["data"])||t.data["data"]["appDev"]!==1){return{ok:false,outcome:we(t.status)}}return{ok:true,value:t.data,status:t.status,rawText:t.rawText}}catch(t){return{ok:false,outcome:F(t,false)}}}async function ae(e){const n=ct();if(!n)return{ok:false,outcome:d(9,"ENDPOINT_REJECTED",null)};let t;try{t=(0,te.resolveCrewxApiCredential)("app-dev").token}catch(p){return{ok:false,outcome:Ee(p)}}const r=await dt(n,t);if(!r.ok)return{ok:false,outcome:r.outcome};const o=Ie();if(!o){return{ok:false,outcome:d(2,"WORKSPACE_NOT_FOUND",null,"No workspace root with apps/ or crewx.yaml was found.")}}const i=pt(o,e);if("exitCode"in i)return{ok:false,outcome:i};let s;try{s=await q(n,t,"POST",Xe,{workspacePath:o,appId:i.appId})}catch(p){return{ok:false,outcome:F(p,false)}}const a=ve(s);if(!a.ok)return{ok:false,outcome:a.outcome};const c=a.value["data"];if(!u(c)||typeof c["workspaceSlug"]!=="string"||typeof c["appId"]!=="string"||typeof c["devPath"]!=="string"||!c["devPath"].startsWith("/ws/")){return{ok:false,outcome:d(1,"ERROR",s.status)}}if(!H(i.appDirectory)){return{ok:false,outcome:d(6,"APP_INVALID",s.status)}}return{ok:true,context:{endpoint:n,token:t,workspacePath:o,appId:c["appId"],appDirectory:i.appDirectory,devPath:c["devPath"]}}}function X(e,...n){return`${Ke}${e.devPath}${n.length>0?`/${n.map(J).join("/")}`:""}`}async function z(e,n,t,r,o=N){try{const i=await q(e.endpoint,e.token,n,t,r,o);return ve(i)}catch(i){return{ok:false,outcome:F(i,false)}}}function lt(e){const n=e["appId"]??e["id"];if(typeof n==="string"&&n.length>0)return n;const t=e["definition"];if(u(t)&&typeof t["id"]==="string")return t["id"];return void 0}function ft(e){const n=e["definitionHash"];if(typeof n==="string"&&n.length>0)return n;const t=e["definition"];if(u(t)&&typeof t["hash"]==="string"){return t["hash"]}return void 0}function ht(e){if(!u(e))return void 0;const n=lt(e);const t=ft(e);if(!n||!t)return void 0;const r=e["agentActions"];const o=yt(e["agentAccess"]);return{appId:n,name:typeof e["name"]==="string"?e["name"]:"",description:typeof e["description"]==="string"?e["description"]:"",definitionHash:t,agentActions:Array.isArray(r)?r:[],...o===void 0?{}:{agentAccess:o}}}const mt=new Set(["allowed","approval_required","denied"]);function yt(e){if(!u(e))return void 0;const n=new Map;for(const[t,r]of Object.entries(e)){if(mt.has(r))n.set(t,r)}return n.size>0?n:void 0}async function Y(e,n=N){const t=await G(e,"GET",$(e,"ui-instances","apps"),void 0,n);if(!t.ok)return t;const r=t.value["apps"];if(!Array.isArray(r)){return{ok:false,outcome:d(1,"ERROR",t.status)}}const o=r.map(ht);if(o.some(i=>i===void 0)){return{ok:false,outcome:d(1,"ERROR",t.status)}}return{ok:true,value:o,status:t.status}}function ce(e,n){return e.find(t=>t.appId===n)}async function Re(e,n,t=N){const r=await G(e,"POST",$(e,"ui-instances","open"),{appId:n.appId,expectedDefinitionHash:n.definitionHash},t);if(!r.ok)return r;const o=u(r.value["instance"])?r.value["instance"]:r.value;if(!u(o)){return{ok:false,outcome:d(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:d(1,"ERROR",r.status)}}const a=u(r.value["ai"])?r.value["ai"]:u(o["ai"])?o["ai"]:void 0;return{ok:true,status:r.status,value:{appId:n.appId,definitionHash:n.definitionHash,instanceId:i,revision:s,state:a&&Object.prototype.hasOwnProperty.call(a,"state")?a["state"]:null}}}const gt=new Set(["ready","unknown","hidden","expired","stale","ambiguous","unsupported"]);const wt=new Set(["native","activation-required","unsupported"]);const Et=new Set(["top-left","top-center","top-right","middle-left","middle-center","middle-right","bottom-left","bottom-center","bottom-right"]);const It=2*1024;const At=3*1024;function M(e,n,t=[]){const r=new Set([...n,...t]);return n.every(o=>Object.prototype.hasOwnProperty.call(e,o))&&Object.keys(e).every(o=>r.has(o))}function Te(e){return Number.isSafeInteger(e)&&e>=0}function Z(e){return Te(e)&&e<=1e5}function _t(e){const n=["schema","documentId","documentName","truncated","modelRevision","asOf","open","measured","counts","placement","regions"];if(!u(e)||!M(e,n,["unfinishedInput"]))return void 0;if(e["schema"]!=="html-viewer-feedback/v1"||typeof e["documentId"]!=="string"||!/^[A-Za-z0-9_-]{1,64}$/.test(e["documentId"])||e["documentName"]!==null&&(typeof e["documentName"]!=="string"||e["documentName"].length>256||/[\\/\u0000-\u001f\u007f]/.test(e["documentName"]))||typeof e["truncated"]!=="boolean"||typeof e["modelRevision"]!=="string"||!/^[A-Za-z0-9_-]{1,64}$/.test(e["modelRevision"])||typeof e["asOf"]!=="string"||e["asOf"].length>40||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$/.test(e["asOf"])||!Number.isFinite(Date.parse(e["asOf"]))||typeof e["open"]!=="boolean"||typeof e["measured"]!=="boolean"||Object.prototype.hasOwnProperty.call(e,"unfinishedInput")&&typeof e["unfinishedInput"]!=="boolean"){return void 0}const t=e["counts"];const r=e["placement"];if(!u(t)||!M(t,["drawings","notes","byKind","descriptionPresent"])||!u(t["byKind"])||!M(t["byKind"],["pen","highlighter","arrow","rectangle"])||!u(r)||!M(r,["visible","partial","offscreen","uncertain","total"])||!Array.isArray(e["regions"])||e["regions"].length>9){return void 0}const o=t["byKind"];const i=[t["drawings"],t["notes"],o["pen"],o["highlighter"],o["arrow"],o["rectangle"]];const s=[r["visible"],r["partial"],r["offscreen"],r["uncertain"],r["total"]];if(!i.every(Z)||typeof t["descriptionPresent"]!=="boolean"||!s.every(Z)){return void 0}const a=o["pen"]+o["highlighter"]+o["arrow"]+o["rectangle"];const c=r["visible"]+r["partial"]+r["offscreen"]+r["uncertain"];if(!Number.isSafeInteger(a)||t["drawings"]!==a||!Number.isSafeInteger(c)||r["total"]!==c||r["total"]!==t["drawings"]+t["notes"]){return void 0}const p=[];const l=new Set;for(const y of e["regions"]){if(!u(y)||!M(y,["region","drawings","notes"])||!Et.has(y["region"])||l.has(y["region"])||!Z(y["drawings"])||!Z(y["notes"])){return void 0}l.add(y["region"]);p.push({region:y["region"],drawings:y["drawings"],notes:y["notes"]})}const f={schema:"html-viewer-feedback/v1",documentId:e["documentId"],documentName:e["documentName"],truncated:e["truncated"],modelRevision:e["modelRevision"],asOf:e["asOf"],open:e["open"],measured:e["measured"],counts:{drawings:t["drawings"],notes:t["notes"],byKind:{pen:o["pen"],highlighter:o["highlighter"],arrow:o["arrow"],rectangle:o["rectangle"]},descriptionPresent:t["descriptionPresent"]},placement:{visible:r["visible"],partial:r["partial"],offscreen:r["offscreen"],uncertain:r["uncertain"],total:r["total"]},regions:p,...Object.prototype.hasOwnProperty.call(e,"unfinishedInput")?{unfinishedInput:e["unfinishedInput"]}:{}};return Buffer.byteLength(JSON.stringify(f),"utf8")<=It?f:void 0}function Ot(e){if(!u(e)||!M(e,["status"],["receivedAt","summary","capability"])||!gt.has(e["status"])||Object.prototype.hasOwnProperty.call(e,"receivedAt")&&!Te(e["receivedAt"])||Object.prototype.hasOwnProperty.call(e,"capability")&&!wt.has(e["capability"])){return void 0}const n=Object.prototype.hasOwnProperty.call(e,"summary")?_t(e["summary"]):void 0;if(Object.prototype.hasOwnProperty.call(e,"summary")&&n===void 0)return void 0;const t={status:e["status"],...Object.prototype.hasOwnProperty.call(e,"receivedAt")?{receivedAt:e["receivedAt"]}:{},...n===void 0?{}:{summary:n},...Object.prototype.hasOwnProperty.call(e,"capability")?{capability:e["capability"]}:{}};return Buffer.byteLength(JSON.stringify(t),"utf8")<=At?t:void 0}async function bt(e,n){const t=await G(e,"GET",$(e,"ui-instances",n));if(!t.ok)return t;const r=t.value;const o=r["instanceId"];const i=r["revision"];if(typeof o!=="string"||typeof i!=="number"){return{ok:false,outcome:d(1,"ERROR",t.status)}}const s=u(r["ai"])?r["ai"]:void 0;const a=p=>{if(Object.prototype.hasOwnProperty.call(r,p))return{[p]:r[p]};if(s&&Object.prototype.hasOwnProperty.call(s,p))return{[p]:s[p]};return{}};const c=Ot(r["feedback"]);return{ok:true,status:t.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"),...c===void 0?{}:{feedback:c}}}}const De="the pixels are not yet in model context; open this exact PNG with the provider's image-reading tool before describing a marked target.";async function Se(e,n,t,r){if(!Pe(n))return void 0;const o=u(t)?t:void 0;if(!o||!Object.prototype.hasOwnProperty.call(o,"crewxImage")){if(n["viewCall"]===true)throw new D.AppCaptureImageError("IMAGE_INVALID_DESCRIPTOR");return void 0}if(r.length===0){throw new D.AppCaptureImageError("IMAGE_INVALID_DESCRIPTOR")}const i=await(0,D.materializeAppCaptureImage)({cwd:process.cwd(),receiptId:r,descriptor:o["crewxImage"],download:s=>at(e,r,s)});return{result:{...o,crewxImage:i},image:i}}function Pe(e){return e["status"]==="settled"&&e["outcome"]==="succeeded"}function Ce(e){return Pe(e)&&e["viewCall"]===true}function Q(e,n,t,r){const o=t instanceof D.AppCaptureImageError?t:new D.AppCaptureImageError("IMAGE_WRITE_FAILED");const i=o.code==="IMAGE_EXPIRED"?["The App action receipt is preserved, but its image has expired on the server (IMAGE_EXPIRED).",`Reading this receipt again will not return the pixels. If you still need the image, refresh with crewx app state ${r??"<instanceId>"} and request a new capture with a NEW --request-id: keep the same viewRef from the task prompt and use documentId/modelRevision from feedback.summary.`,"If that bound view or a ready summary is unavailable, report that a new capture cannot currently be made; do not substitute another view.","The pixels are not in model context; do not describe them from metadata or text."].join("\n"):[`The App action receipt is preserved, but its image was not delivered (${o.code}).`,`Recover the same result with crewx app receipt ${n}; do not rerun the action.`,"The pixels are not in model context. Do not describe them from metadata or text. If the image is still retrievable, open the returned local PNG with the provider's image-reading tool before describing a marked target."].join("\n");return{exitCode:4,payload:{...e,ok:false,exit:4,error:{code:o.code,status:o.status},receiptId:n},stderr:i}}async function vt(e,n,t,r,o,i=N){const s=await G(e,"POST",$(e,"ui-instances",n,"actions"),{actionId:t,requestId:r,input:o},i);if(!s.ok)return s;const a=s.value["receipt"];if(!u(a)){return{ok:false,outcome:d(1,"ERROR",s.status)}}const c=a["receiptId"]??a["id"];const p=s.value["approval"];if(s.status===202&&u(p)){const h=p["approvalId"];const w=p["expiresAt"];const A=typeof a["requestId"]==="string"?a["requestId"]:typeof p["requestId"]==="string"?p["requestId"]:r;if(typeof c!=="string"||typeof h!=="string"||typeof w!=="string"&&typeof w!=="number"){return{ok:false,outcome:d(1,"ERROR",s.status)}}return{ok:false,outcome:{exitCode:8,payload:{ok:false,exit:8,error:{code:"APPROVAL_PENDING",status:202},receiptId:c,requestId:A,approvalId:h,expiresAt:w}}}}const l=a["status"]??(s.status===202?"requested":"settled");const f=s.value["resolve"];const y=u(f)&&u(f["ai"])?f["ai"]:void 0;return{ok:true,status:s.status,value:{receiptId:typeof c==="string"?c:"",requestId:typeof a["requestId"]==="string"?a["requestId"]:r,instanceId:n,actionId:typeof a["actionId"]==="string"?a["actionId"]:t,status:l,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"]}:{},receipt:a}}}function Rt(e){const n=e.payload["error"];return e.exitCode===14||u(n)&&n["status"]===429}async function ke(e,n){const t=await G(e,"GET",$(e,"ui-action-receipts",n));if(!t.ok){return{state:"failed",retryable:Rt(t.outcome),value:t.outcome}}const r=t.value["receipt"];if(!u(r))return{state:"failed",retryable:false,value:d(1,"ERROR",t.status)};const o={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(t.value,"result")?{result:t.value["result"]}:{},...Object.prototype.hasOwnProperty.call(t.value,"resultExpired")?{resultExpired:t.value["resultExpired"]}:{}};if(t.value["resultExpired"]===true&&Ce(r)){return{state:"failed",retryable:false,value:Q(o,n,new D.AppCaptureImageError("IMAGE_EXPIRED"))}}if(t.value["resultExpired"]!==true){try{const i=await Se(e,r,t.value["result"],n);if(i){return{state:"settled",value:{...P({...o,result:i.result,image:i.image}),stderr:De}}}}catch(i){return{state:"failed",retryable:false,value:Q(o,n,i)}}}return{state:r["status"]==="requested"?"pending":"settled",value:P(o)}}function Tt(e,n){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 ${n}s. Do not end your turn: run crewx app receipt ${e} --wait=${(0,j.nextWaitSeconds)(n)} again.`}}function Ne(){const e=process.env["CREWX_TASK_TICKET"]??"";const n=process.env["CREWX_WORKSPACE_SLUG"]??"";const t=process.env["CREWX_THREAD_ID"]??"";if(!e.startsWith("crewxtk_")||!n||!t){return d(3,"NO_TICKET",null)}const r=re(process.env["CREWX_ENDPOINT"]);if(!r)return d(9,"ENDPOINT_REJECTED",null);return{ticket:e,workspaceSlug:n,threadId:t,endpoint:r,basePath:ot(n,t)}}function xe(e){return"exitCode"in e}function je(e){return String(e).padStart(2,"0")}function Dt(e){const n=typeof e==="number"?new Date(e):typeof e==="string"?new Date(/^\d+$/.test(e)?Number(e):e):void 0;if(!n||Number.isNaN(n.getTime()))return void 0;return`${je(n.getHours())}:${je(n.getMinutes())}`}function St(e){if(e.exitCode!==8)return e;const n=Dt(e.payload["expiresAt"]);const t=e.payload["receiptId"];const r=[`\u2192 Waiting for the user's approval in the App window${n?` (expires ${n})`:""}. Do not end your turn: ending it cancels the request.`,...typeof t==="string"&&t.length>0?[`\u2192 Wait: crewx app receipt ${t} --wait=${j.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 Ct(e){try{const n=v.realpathSync(e);const t=v.realpathSync(E.join(n,"SKILL.md"));if(!be(n,t)||!se(t))return void 0;const r=v.openSync(t,"r");try{const o=new Uint8Array(Pt);const i=v.readSync(r,o,0,o.length,0);return(0,L.manualBody)(Buffer.from(o.buffer,0,i).toString("utf8"))}finally{v.closeSync(r)}}catch{return void 0}}async function kt(e){const n=Ie();if(!n)return void 0;try{const t=await Promise.resolve().then(()=>U(require("@crewx/sdk")));const r=await t.discoverWorkspaceApps(n);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:E.join(n,o.relativePath),resolveAccess:t.resolveAgentAccess}}catch{return void 0}}async function Nt(e){if(e.length!==2||e[1].startsWith("--"))return B();const n=e[1];const t=Ne();if(xe(t))return t;const r=await Y(t);if(!r.ok)return r.outcome;const o=ce(r.value,n);if(!o)return d(6,"MCP_APP_NOT_FOUND",null);const i=o.agentActions.filter(c=>typeof c==="string");const s=await kt(n);const a=s?(0,L.renderUsage)(Ct(s.directory),(0,L.renderActionsSection)(n,s.candidate,(0,L.buildActionRows)(s.candidate,new Set(i),c=>s.resolveAccess(c),o.agentAccess)),s.candidate.manifest.csp?.connectDomains):(0,L.renderUsage)(void 0,(0,L.renderServerOnlyActions)(n,i));return{exitCode:0,payload:{ok:true},stdout:a}}function Le(e,n){if(e[0]!==n)return null;const t=[];let r=false;for(const o of e.slice(1)){if(o===(n==="dev"?"--no-open":"--json")){if(r)return null;r=true}else if(o.startsWith("--")){return null}else{t.push(o)}}if(t.length!==1)return null;return{appSelector:t[0],flag:r}}function $e(e){return`${JSON.stringify(e.payload)}
|
|
2
|
+
`}function xt(e){const n=e["detail"];if(e["rule"]!=="manifest"||!u(n))return"";const t=typeof n["path"]==="string"?n["path"]:"";const r=typeof n["rule"]==="string"?n["rule"]:"";if(!r)return"";return` ${t?`${t} `:""}(${r})`}async function jt(e){const n=Le(e,"check");if(!n)return B();const t=await ae(n.appSelector);if(!t.ok)return t.outcome;const r=await z(t.context,"GET",X(t.context,"check"));if(!r.ok)return r.outcome;const o=r.value["data"];if(!u(o))return d(1,"ERROR",r.status);const i=u(o["summary"])?o["summary"]:{};const s=Array.isArray(o["items"])?o["items"]:[];const a=typeof i["errors"]==="number"?i["errors"]:s.filter(f=>u(f)&&f["severity"]==="error").length;const c=typeof i["warnings"]==="number"?i["warnings"]:s.filter(f=>u(f)&&f["severity"]==="warning").length;const p=a===0?0:Ye;if(n.flag){return{exitCode:p,payload:r.value,stdout:`${r.rawText??$e({exitCode:p,payload:r.value})}`+(r.rawText?.endsWith("\n")?"":"\n"),suppressOutput:true}}const l=s.flatMap(f=>{if(!u(f))return[];const y=f["severity"];const h=y==="error"?"\u2715":y==="ok"?"\u2713":"!";const w=typeof f["where"]==="string"?f["where"]:"";const A=typeof f["code"]==="string"?f["code"]:"";return[`${h} ${w} ${A}${xt(f)}`]});l.push(`Summary: ${a} errors, ${c} warnings`);return{exitCode:p,payload:{},stdout:`${l.join("\n")}
|
|
3
|
+
`,suppressOutput:true}}async function Lt(e){let n;try{n=(0,te.resolveCrewxApiCredential)("pairing").token}catch(r){return Ee(r)}let t;try{t=await q(e.endpoint,n,"POST","/api/v1/auth/local/code")}catch(r){return F(r,false)}if(t.status<200||t.status>=300){return K(t)}if(t.invalidJson||!u(t.data)||typeof t.data["url"]!=="string"){return d(1,"PAIRING_CODE_INVALID",t.status)}try{const r=new he.URL(t.data["url"]);const o=re(r.origin);const i=r.hash.match(/^#pair=(.+)$/);if(!o||!i)return d(1,"PAIRING_CODE_INVALID",t.status);return`${o.origin}${e.devPath}#pair=${encodeURIComponent(i[1])}`}catch{return d(1,"PAIRING_CODE_INVALID",t.status)}}async function $t(e){const n=process.platform==="darwin"?"open":process.platform==="win32"?"explorer.exe":"xdg-open";const t=(0,de.spawn)(n,[e],{detached:true,stdio:"ignore"});await new Promise((r,o)=>{t.once("error",o);t.once("spawn",()=>{t.unref();r()})})}async function Mt(e){const n=ge(["run",...e.slice(2)]);if(!n||n.command!=="run")return B();const[t,r]=n.positional;const o=await ae(t);if(!o.ok)return o.outcome;const i=await z(o.context,"GET",X(o.context,"state"));if(!i.ok)return i.outcome;const s=i.value["data"];if(!u(s)||typeof s["revision"]!=="number"){return d(1,"APP_DEV_RESPONSE_INVALID",i.status)}const a=n.requestId??`cxa_${(0,pe.randomBytes)(16).toString("base64url")}`;const c=await z(o.context,"POST",X(o.context,"actions"),{actionId:r,requestId:a,input:n.input,expectedRevision:s["revision"]},Je);if(!c.ok)return c.outcome;const p=c.value["data"];const l=u(p)&&u(p["receipt"])?p["receipt"]:void 0;return{exitCode:l?.["outcome"]==="succeeded"?0:1,payload:c.value,stdout:`${c.rawText??$e({exitCode:0,payload:c.value})}`+(c.rawText?.endsWith("\n")?"":"\n"),suppressOutput:true}}function Ut(e){try{const n=JSON.parse(v.readFileSync(E.join(e,"package.json"),"utf8"));if(!u(n)||!u(n["scripts"]))return false;const t=n["scripts"]["build"];return typeof t==="string"&&t.trim().length>0}catch{return false}}function Me(e){const n=new Set([E.normalize(Ae),E.normalize(_e)]);const t=ie(e);const r=t?.["entry"];if(typeof r==="string"&&r.length>0&&!E.isAbsolute(r)){const o=E.normalize(r);if(o!==".."&&!o.startsWith(`..${E.sep}`))n.add(o)}return n}function Bt(e,n){try{const t=v.statSync(E.join(e,n));return`${t.size}:${t.mtimeMs}:${t.ino}`}catch{return null}}function Ue(e,n){return new Map([...n].map(t=>[t,Bt(e,t)]))}function Ft(e,n){const t=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>me?a.subarray(a.length-me).toString("utf8"):a.toString("utf8")};return new Promise(s=>{const a=(0,de.spawn)("npm",["run","build"],{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]});n(a);a.stdout?.on("data",i);a.stderr?.on("data",i);const c=p=>{if(o)return;o=true;n(void 0);s({ok:p,ms:Math.max(0,Date.now()-t),output:r})};a.once("error",p=>{i(`${p.message}
|
|
4
|
+
`);c(false)});a.once("close",p=>c(p===0))})}function qt(e){const n=e.payload["error"];return u(n)&&typeof n["code"]==="string"?n["code"]:"ERROR"}async function Gt(e,n){const t=await z(e,"POST",X(e,"reload"),n);if(!t.ok)return{errorCode:qt(t.outcome)};const r=t.value["data"];return u(r)&&typeof r["generation"]==="number"?{generation:r["generation"]}:{errorCode:"APP_DEV_RESPONSE_INVALID"}}async function Wt(e,n){const t=process.ppid;let r;try{r=v.watch(e.appDirectory,{recursive:true},(I,O)=>{R(O)})}catch(I){return d(1,"WATCH_FAILED",null,I instanceof Error?I.message:"Unable to watch the App folder.")}let o=false;let i=false;let s=false;let a=false;let c="";let p="";let l;let f;let y;let h={exitCode:0,payload:{},suppressOutput:true};const w=new Map;let A;const g=new Promise(I=>{A=I});const m=I=>{process.stdout.write(`${I}
|
|
5
|
+
`)};const _=()=>{if(o)return;o=true;if(l)clearTimeout(l);if(f)clearInterval(f);process.removeListener("SIGINT",b);process.removeListener("SIGTERM",b);A(h)};const b=()=>{if(i)return;i=true;r.close();if(l)clearTimeout(l);if(y&&y.exitCode===null)y.kill("SIGTERM");if(!s)_()};const R=I=>{if(i||o)return;const O=I===null?"":E.normalize(I.toString());const C=O.split(E.sep);if(C.some(k=>k==="node_modules"||k===".crewx"||k==="dist"))return;const ee=n?Me(e.appDirectory):new Set;if(y&&ee.has(O))return;const S=w.get(O);if(S!==void 0){if(Date.now()<=S)return;w.delete(O)}if(s){a=true;c=O||"App files";return}p=O||"App files";if(l)clearTimeout(l);l=setTimeout(()=>{l=void 0;const k=p||"App files";p="";void T(k,false)},200)};const W=async I=>{const O=await Gt(e,I);return O.generation===void 0?`failed ${O.errorCode??"ERROR"}`:String(O.generation)};const T=async(I,O)=>{if(i||o)return;s=true;if(n){const C=Me(e.appDirectory);const ee=Ue(e.appDirectory,C);const S=await Ft(e.appDirectory,V=>{y=V});const k=Ue(e.appDirectory,C);for(const[V,Ge]of k){if(ee.get(V)!==Ge){w.set(V,Date.now()+1e3)}}if(i){s=false;_();return}const Fe={reason:"build",build:{ok:S.ok,ms:S.ms,...!S.ok?{output:S.output}:{}}};const qe=await W(Fe);m(`${O?"initial":I} -> build ${S.ok?"ok":"failed"} ${S.ms}ms -> reload ${qe}`)}else if(!O){const C=await W({reason:"manual"});m(`${I} -> reload ${C}`)}s=false;if(i){_();return}if(a){const C=c||"App files";a=false;c="";void T(C,false);return}if(i)_()};r.once("error",I=>{h=d(1,"WATCH_FAILED",null,I.message);b()});process.once("SIGINT",b);process.once("SIGTERM",b);f=setInterval(()=>{if(process.ppid!==t)b()},1e3);f.unref();if(n)void T("initial",true);return g}async function Vt(e){const n=Le(e,"dev");if(!n)return B();const t=await ae(n.appSelector);if(!t.ok)return t.outcome;const r=`${t.context.endpoint.origin}${t.context.devPath}`;process.stdout.write(`${r}
|
|
6
|
+
`);if(!n.flag){const o=await Lt(t.context);if(typeof o!=="string")return o;try{await $t(o)}catch(i){return d(1,"BROWSER_OPEN_FAILED",null,i instanceof Error?i.message:"Could not open the App dev tab.")}}return Wt(t.context,Ut(t.context.appDirectory))}const Be="usage: crewx app build [<appDir>] [--check | --watch]";const Jt=["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 Kt=[Be,""," 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 Ht(){const e=[E.join(__dirname,"..","..","build-app","load.cjs"),E.join(__dirname,"..","build-app","load.cjs")];const n=e.find(t=>v.existsSync(t));if(!n)return Promise.reject(new Error("the App build is not part of this install"));return require(n).loadAppBuilder()}function ue(e){return e instanceof Error?e.message:String(e)}async function Xt(e){if(e.slice(1).some(s=>s==="--help"||s==="-h")){return{exitCode:0,payload:{ok:true},stdout:Kt}}let n;try{n=await Ht()}catch(s){return d(1,"BUILD_UNAVAILABLE",null,ue(s))}let t;try{t=n.parseArguments(e.slice(1))}catch(s){return d(2,"USAGE",null,`${ue(s)} \u2192 ${Be}`)}const{appDirectory:r}=t;const o=E.relative(process.cwd(),r);const i=o===""?"crewx app build":`crewx app build ${o}`;if(t.watch){const s=new AbortController;const a=()=>s.abort();process.once("SIGINT",a);process.once("SIGTERM",a);try{await n.watchApp(r,c=>process.stdout.write(`${c}
|
|
7
|
+
`),{signal:s.signal})}finally{process.removeListener("SIGINT",a);process.removeListener("SIGTERM",a)}return{exitCode:0,payload:{},suppressOutput:true}}try{const s=await n.buildApp({appDirectory:r,check:t.check});if(t.check&&s.staleFiles.length>0){return{...d(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(t.check){return P({ok:true,appDir:r,check:true,inSync:true,files:s.files,actions:s.actions})}const a=E.basename(r);const c=E.basename(E.dirname(r))==="apps";return{...P({ok:true,appDir:r,files:s.files,actions:s.actions}),stderr:c?`\u2192 Next: crewx app check ${a}`:`\u2192 Next: put ${a} in the workspace apps/ folder, then crewx app check ${a}`}}catch(s){return d(1,"BUILD_FAILED",null,ue(s))}}async function zt(e,{clock:n=j.realClock}={}){if(e.length===1&&(e[0]==="--help"||e[0]==="-h")){return{exitCode:0,payload:{ok:true},stdout:Jt}}if(e[0]==="build")return Xt(e);if(e[0]==="dev")return Vt(e);if(e[0]==="check")return jt(e);if(e[0]==="run"&&e[1]==="--dev")return Mt(e);if(e[0]==="usage")return Nt(e);const t=ge(e);if(!t)return B();const r=Ne();if(xe(r))return r;if(t.command==="list"){const h=await Y(r);if(!h.ok)return h.outcome;return P({ok:true,apps:h.value})}if(t.command==="receipt"){const h=t.positional[0];const w=(0,j.clampWaitSeconds)(t.waitSeconds??0);if(w===0)return(await ke(r,h)).value;const A=await(0,j.pollUntilSettled)(()=>ke(r,h),w,n);if(A.state!=="pending")return A.value;return Tt(h,w)}if(t.command==="state"){const h=await bt(r,t.positional[0]);if(!h.ok)return h.outcome;return P({ok:true,...h.value})}if(t.command==="open"){const h=t.positional[0];const w=await Y(r);if(!w.ok)return w.outcome;const A=ce(w.value,h);if(!A)return d(6,"MCP_APP_NOT_FOUND",null);const g=await Re(r,A);if(!g.ok)return g.outcome;return P({ok:true,...g.value})}const[o,i]=t.positional;const s=t.requestId??`cxa_${(0,pe.randomBytes)(16).toString("base64url")}`;let a=o;if(!o.startsWith(ye)){const h=await Y(r,ne);if(!h.ok)return oe(h.outcome,s);const w=ce(h.value,o);if(!w)return d(6,"MCP_APP_NOT_FOUND",null);const A=await Re(r,w,ne);if(!A.ok)return oe(A.outcome,s);a=A.value.instanceId}const c=await vt(r,a,i,s,t.input,ne);if(!c.ok)return St(oe(c.outcome,s));const{receipt:p,...l}=c.value;const f={ok:true,...l};const y=typeof l["receiptId"]==="string"?l["receiptId"]:"";if(l["resultExpired"]===true&&u(p)&&Ce(p)){return Q({...f,receipt:p},y,new D.AppCaptureImageError("IMAGE_EXPIRED"),a)}if(u(p)&&l["resultExpired"]!==true){try{const h=await Se(r,p,l["result"],y);if(h){return{...P({...f,receipt:p,result:h.result,image:h.image}),stderr:`\u2192 Check: crewx app state ${c.value.instanceId}
|
|
8
|
+
${De}`}}}catch(h){return Q({...f,receipt:p},y,h,a)}}return{...P(f),stderr:`\u2192 Check: crewx app state ${c.value.instanceId}`}}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type AppCaptureImageErrorCode = 'IMAGE_INVALID_DESCRIPTOR' | 'IMAGE_INVALID_MIME' | 'IMAGE_TOO_LARGE' | 'IMAGE_BYTE_COUNT_MISMATCH' | 'IMAGE_DIMENSIONS_MISMATCH' | 'IMAGE_DIGEST_MISMATCH' | 'IMAGE_INVALID_PNG' | 'IMAGE_VALIDATION_FAILED' | 'IMAGE_DOWNLOAD_FAILED' | 'IMAGE_EXPIRED' | 'IMAGE_WRITE_FAILED';
|
|
2
|
+
export declare class AppCaptureImageError extends Error {
|
|
3
|
+
readonly code: AppCaptureImageErrorCode;
|
|
4
|
+
readonly status: number | null;
|
|
5
|
+
constructor(code: AppCaptureImageErrorCode, status?: number | null);
|
|
6
|
+
}
|
|
7
|
+
export interface LocalAppCaptureImage {
|
|
8
|
+
readonly path: string;
|
|
9
|
+
readonly mediaType: 'image/png';
|
|
10
|
+
readonly width: number;
|
|
11
|
+
readonly height: number;
|
|
12
|
+
readonly bytes: number;
|
|
13
|
+
readonly sha256: string;
|
|
14
|
+
}
|
|
15
|
+
interface MaterializeAppCaptureImageOptions {
|
|
16
|
+
readonly cwd: string;
|
|
17
|
+
readonly receiptId: string;
|
|
18
|
+
readonly descriptor: unknown;
|
|
19
|
+
readonly download: (maxBytes: number) => Promise<Uint8Array>;
|
|
20
|
+
readonly now?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function materializeAppCaptureImage(options: MaterializeAppCaptureImageOptions): Promise<LocalAppCaptureImage>;
|
|
23
|
+
export {};
|
|
24
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var N=exports&&exports.__createBinding||(Object.create?(function(t,e,n,i){if(i===void 0)i=n;var o=Object.getOwnPropertyDescriptor(e,n);if(!o||("get"in o?!e.__esModule:o.writable||o.configurable)){o={enumerable:true,get:function(){return e[n]}}}Object.defineProperty(t,i,o)}):(function(t,e,n,i){if(i===void 0)i=n;t[i]=e[n]}));var C=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(n){var i=[];for(var o in n)if(Object.prototype.hasOwnProperty.call(n,o))i[i.length]=o;return i};return t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null){for(var i=t(e),o=0;o<i.length;o++)if(i[o]!=="default")N(n,e,i[o])}C(n,e);return n}})();Object.defineProperty(exports,"__esModule",{value:true});exports.AppCaptureImageError=void 0;exports.materializeAppCaptureImage=V;const w=require("node:crypto");const r=A(require("node:fs"));const E=A(require("node:path"));const f=require("@crewx/sdk");const T=E.join(".crewx","app-captures");const p="*\n!.gitignore\n";const D=24*60*60*1e3;const g=32;const b=g*f.UI_VIEW_CALL_IMAGE_MAX_BYTES;const F=/^capture-[a-f0-9]{24}-[a-f0-9]{64}\.png$/;const G=/^capture-tmp-[a-f0-9]{32}\.part$/;class l extends Error{constructor(e,n=null){super(e);this.name="AppCaptureImageError";this.code=e;this.status=n}}exports.AppCaptureImageError=l;function R(t){if(t===null||typeof t!=="object"||Array.isArray(t))return false;const e=t;const n=e["width"];const i=e["height"];const o=e["bytes"];if(Number.isSafeInteger(o)&&o>f.UI_VIEW_CALL_IMAGE_MAX_BYTES)return true;if(Number.isSafeInteger(n)&&n>f.UI_VIEW_CALL_IMAGE_MAX_DIMENSION)return true;if(Number.isSafeInteger(i)&&i>f.UI_VIEW_CALL_IMAGE_MAX_DIMENSION)return true;return Number.isSafeInteger(n)&&Number.isSafeInteger(i)&&n*i>f.UI_VIEW_CALL_IMAGE_MAX_PIXELS}function W(t,e){return t instanceof l?t:new l(e)}function P(t){const e=t instanceof Error?t.message.toLowerCase():"";if(e.includes("digest"))return"IMAGE_DIGEST_MISMATCH";if(e.includes("byte count"))return"IMAGE_BYTE_COUNT_MISMATCH";if(e.includes("dimensions"))return"IMAGE_DIMENSIONS_MISMATCH";if(e.includes("size"))return"IMAGE_INVALID_PNG";if(e.includes("sha-256 validation is unavailable"))return"IMAGE_VALIDATION_FAILED";return"IMAGE_INVALID_PNG"}function d(t){try{return r.lstatSync(t)}catch(e){if(e.code==="ENOENT")return void 0;throw e}}function S(t,e,n){try{r.mkdirSync(t,{mode:e})}catch(o){if(o.code!=="EEXIST")throw o}const i=r.lstatSync(t);if(i.isSymbolicLink()||!i.isDirectory())throw new Error("Capture directory is not a real directory");if(n)r.chmodSync(t,e)}function O(t,e,n){const i=r.constants.O_NOFOLLOW??0;const o=r.openSync(t,r.constants.O_RDONLY|i);try{const c=r.fstatSync(o);if(!c.isFile()||c.size>e)throw new Error("Capture file is not a bounded regular file");if(n!==void 0)r.fchmodSync(o,n);return r.readFileSync(o)}finally{r.closeSync(o)}}function v(t){const e=E.join(t,".gitignore");let n=d(e);if(n===void 0){const o=r.constants.O_NOFOLLOW??0;let c;try{c=r.openSync(e,r.constants.O_WRONLY|r.constants.O_CREAT|r.constants.O_EXCL|o,384)}catch(a){if(a.code!=="EEXIST")throw a}if(c!==void 0){try{r.writeFileSync(c,p,"utf8");r.fsyncSync(c)}finally{r.closeSync(c)}}n=d(e)}if(!n||n.isSymbolicLink()||!n.isFile())throw new Error("Capture ignore file is not a regular file");const i=O(e,1024,384).toString("utf8");if(i!==p)throw new Error("Capture ignore file has unexpected contents")}function j(t){const e=r.realpathSync(E.resolve(t));const n=E.join(e,".crewx");const i=E.join(e,T);S(n,448,false);S(i,448,true);v(i);return i}function U(t,e){let n=0;let i=0;for(const o of r.readdirSync(t)){const c=F.test(o);if(!c&&!G.test(o))continue;const a=E.join(t,o);const s=d(a);if(!s||s.isSymbolicLink()||!s.isFile())continue;if(e-s.mtimeMs>D){r.unlinkSync(a);continue}n+=1;i+=s.size}return{count:n,bytes:i}}function X(t,e,n){const i=d(e);if(i&&(i.isSymbolicLink()||!i.isFile())){throw new Error("Capture target is not a regular file")}const o=E.join(t,`capture-tmp-${(0,w.randomBytes)(16).toString("hex")}.part`);const c=r.constants.O_NOFOLLOW??0;let a;try{a=r.openSync(o,r.constants.O_WRONLY|r.constants.O_CREAT|r.constants.O_EXCL|c,384);let s=0;while(s<n.byteLength){const I=r.writeSync(a,n,s,n.byteLength-s);if(I<=0)throw new Error("Capture write made no progress");s+=I}r.fsyncSync(a);r.closeSync(a);a=void 0;r.renameSync(o,e);const _=r.openSync(e,r.constants.O_RDONLY|c);try{const I=r.fstatSync(_);if(!I.isFile())throw new Error("Capture target is not a regular file");r.fchmodSync(_,384);r.fsyncSync(_)}finally{r.closeSync(_)}const y=r.openSync(t,r.constants.O_RDONLY);try{r.fsyncSync(y)}finally{r.closeSync(y)}}finally{if(a!==void 0)r.closeSync(a);try{r.unlinkSync(o)}catch(s){if(s.code!=="ENOENT")throw s}}}function L(t,e){return{path:E.resolve(t),mediaType:e.mediaType,width:e.width,height:e.height,bytes:e.bytes,sha256:e.sha256}}async function V(t){let e;try{e=(0,f.validateUiActionImageDescriptor)(t.descriptor)}catch{throw new l(R(t.descriptor)?"IMAGE_TOO_LARGE":"IMAGE_INVALID_DESCRIPTOR")}if(typeof t.receiptId!=="string"||t.receiptId.length===0){throw new l("IMAGE_INVALID_DESCRIPTOR")}let n;try{n=j(t.cwd)}catch{throw new l("IMAGE_WRITE_FAILED")}const i=(0,w.createHash)("sha256").update(t.receiptId).digest("hex").slice(0,24);const o=`capture-${i}-${e.sha256}.png`;const c=E.join(n,o);const a=t.now??Date.now();let s;try{s=U(n,a)}catch{throw new l("IMAGE_WRITE_FAILED")}let _=false;let y=0;try{const u=d(c);if(u!==void 0){if(u.isSymbolicLink()||!u.isFile())throw new Error("Capture target is not a regular file");y=u.size;if(u.size>f.UI_VIEW_CALL_IMAGE_MAX_BYTES){_=true}else{const m=O(c,f.UI_VIEW_CALL_IMAGE_MAX_BYTES,384);try{await(0,f.validateUiActionImagePng)(new Uint8Array(m),e);return L(c,e)}catch{_=true}}}}catch(u){if(u instanceof l)throw u;throw new l("IMAGE_WRITE_FAILED")}const I=s.count-(_?1:0);const M=s.bytes-(_?y:0);if(I>=g||M+e.bytes>b){throw new l("IMAGE_WRITE_FAILED")}let h;try{h=await t.download(e.bytes)}catch(u){throw W(u,"IMAGE_DOWNLOAD_FAILED")}try{await(0,f.validateUiActionImagePng)(h,e)}catch(u){throw new l(P(u))}try{X(n,c,h);return L(c,e)}catch{throw new l("IMAGE_WRITE_FAILED")}}
|
|
@@ -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 v(e){return e.replace(/\|/g,"\\|").replace(/\r?\n/g," ")}function y(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]=y(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 per task or per conversation (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=>`\`${v(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
|
+
"version": "0.1.0-rc.100",
|
|
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.219"
|
|
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"}
|
package/dist/src/engine.d.ts.map
DELETED
|
@@ -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;AA+cD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2DlF"}
|
package/dist/src/engine.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"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"}
|