@crewx/sdk 0.9.0-rc.179 → 0.9.0-rc.180

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/app/app-files/args.d.ts +12 -0
  2. package/dist/app/app-files/errors.d.ts +6 -0
  3. package/dist/app/app-files/index.d.ts +34 -0
  4. package/dist/app/app-files/lock.d.ts +26 -0
  5. package/dist/app/app-files/root.d.ts +22 -0
  6. package/dist/app/app-files/store.d.ts +47 -0
  7. package/dist/app/app-files/write.child.d.ts +1 -0
  8. package/dist/app/index.d.ts +2 -0
  9. package/dist/app/index.js +13 -12
  10. package/dist/app-ui/index.d.ts +17 -3
  11. package/dist/app-ui/index.js +1 -1
  12. package/dist/esm/app/index.js +13 -12
  13. package/dist/esm/index.js +274 -274
  14. package/dist/esm/plugins/index.js +108 -108
  15. package/dist/esm/publish/index.js +2 -2
  16. package/dist/esm/repository/index.js +159 -159
  17. package/dist/esm/skills/index.js +2 -2
  18. package/dist/index.js +271 -271
  19. package/dist/migrations/0046_acoustic_karnak.sql +49 -0
  20. package/dist/migrations/0047_doc_sync_connect_requests.sql +18 -0
  21. package/dist/migrations/meta/0046_snapshot.json +4733 -0
  22. package/dist/migrations/meta/0047_snapshot.json +4832 -0
  23. package/dist/migrations/meta/_journal.json +14 -0
  24. package/dist/plugins/index.js +108 -108
  25. package/dist/publish/index.js +2 -2
  26. package/dist/repository/index.d.ts +2 -0
  27. package/dist/repository/index.js +156 -156
  28. package/dist/schema/doc-sync-connect-requests.d.ts +140 -0
  29. package/dist/schema/doc-sync-links.d.ts +481 -0
  30. package/dist/schema/index.d.ts +2 -0
  31. package/dist/skills/index.js +2 -2
  32. package/dist/ui-plugin/app-manifest.d.ts +1 -1
  33. package/dist/ui-plugin/types.d.ts +1 -0
  34. package/package.json +1 -1
@@ -0,0 +1,12 @@
1
+ export declare const APP_FILES_LIMITS: {
2
+ readonly textBytes: number;
3
+ readonly refCodePoints: 200;
4
+ readonly refSegments: 3;
5
+ readonly pageSize: 200;
6
+ };
7
+ export declare const APP_FILES_SEGMENT: RegExp;
8
+ export declare function normalizeAppFilesRef(ref: string): string | undefined;
9
+ export declare function checkAppFilesRef(ref: unknown): string;
10
+ export declare function checkAppFilesPrefix(prefix: unknown): string;
11
+ export declare function checkAppFilesText(text: unknown): string;
12
+ export declare function checkAppFilesExpectedVersion(value: unknown): string | null;
@@ -0,0 +1,6 @@
1
+ export declare const APP_FILES_ERROR_CODES: readonly ["INVALID_REF", "FILE_NOT_FOUND", "DOCUMENT_CHANGED", "TOO_LARGE", "IO_ERROR", "FILE_BUSY"];
2
+ export type AppFilesErrorCode = (typeof APP_FILES_ERROR_CODES)[number];
3
+ export declare class AppFilesError extends Error {
4
+ readonly code: AppFilesErrorCode;
5
+ constructor(code: AppFilesErrorCode);
6
+ }
@@ -0,0 +1,34 @@
1
+ import { type AppFilesInstallOrigin, type AppFilesSource } from './root.js';
2
+ import { type AppFilesPage, type AppFilesRead, type AppFilesWritten } from './store.js';
3
+ export { APP_FILES_ERROR_CODES, AppFilesError, type AppFilesErrorCode } from './errors.js';
4
+ export { APP_FILES_LIMITS, normalizeAppFilesRef } from './args.js';
5
+ export type { AppFilesInstallOrigin, AppFilesSource } from './root.js';
6
+ export type { AppFilesPage, AppFilesRead, AppFilesWritten } from './store.js';
7
+ export { appFilesLockKeyOf } from './store.js';
8
+ export { appFilesRootSegmentsOf } from './root.js';
9
+ export { APP_FILES_LOCK_SUBPATH, acquireFileLock, releaseFileLock, resolveCrewxHome, type HeldFileLock } from './lock.js';
10
+ export declare const APP_FILES_ROOT_ENV = "CREWX_APP_FILES_ROOT";
11
+ export interface AppFilesHost {
12
+ readonly workspaceRoot: string;
13
+ readonly context?: {
14
+ readonly nowMs: number;
15
+ };
16
+ }
17
+ export interface AppFilesOptions {
18
+ readonly packageDir?: string;
19
+ readonly origin?: AppFilesInstallOrigin;
20
+ readonly source?: AppFilesSource;
21
+ readonly filesRoot?: string;
22
+ readonly env?: NodeJS.ProcessEnv;
23
+ readonly crewxHome?: string;
24
+ }
25
+ export interface AppFilesListInput {
26
+ readonly prefix?: string;
27
+ readonly after?: string;
28
+ }
29
+ export interface AppFiles {
30
+ list(input?: AppFilesListInput): Promise<AppFilesPage>;
31
+ read(ref: string): Promise<AppFilesRead>;
32
+ write(ref: string, text: string, expectedVersion: string | null): Promise<AppFilesWritten>;
33
+ }
34
+ export declare function appFiles(app: AppFilesHost, options?: AppFilesOptions): AppFiles;
@@ -0,0 +1,26 @@
1
+ export declare const APP_FILES_LOCK_SUBPATH: string;
2
+ export declare const APP_FILES_LOCK_WAIT_MS = 12000;
3
+ interface LockOwner {
4
+ readonly token: string;
5
+ readonly pid: number;
6
+ readonly startedAtMs: number | null;
7
+ }
8
+ export interface HeldFileLock {
9
+ readonly path: string;
10
+ readonly token: string;
11
+ }
12
+ export declare function resolveCrewxHome(env?: NodeJS.ProcessEnv): string;
13
+ export declare function acquireFileLock(options: {
14
+ readonly lockDir: string;
15
+ readonly key: string;
16
+ readonly waitMs: number;
17
+ }): Promise<HeldFileLock>;
18
+ export declare function releaseFileLock(held: HeldFileLock): Promise<void>;
19
+ export declare class OwnerLiveness {
20
+ private readonly check;
21
+ private readonly now;
22
+ private readonly answers;
23
+ constructor(check?: (owner: LockOwner) => Promise<boolean>, now?: () => number);
24
+ isDead(owner: LockOwner): Promise<boolean>;
25
+ }
26
+ export {};
@@ -0,0 +1,22 @@
1
+ export type AppFilesInstallOrigin = 'installed' | 'not_installed' | 'unknown';
2
+ export type AppFilesSource = 'workspace' | 'bundled' | 'unverified';
3
+ export type AppFilesRootWarning = 'FILES_ROOT_INVALID' | 'FILES_ROOT_FORBIDDEN';
4
+ export interface AppFilesRootDecision {
5
+ readonly segments: readonly string[];
6
+ readonly declared: boolean;
7
+ readonly warning?: AppFilesRootWarning;
8
+ }
9
+ export declare function defaultAppFilesRootSegments(appId: string): string[];
10
+ export declare function resolveAppFilesRoot(input: {
11
+ readonly appId: string;
12
+ readonly origin: AppFilesInstallOrigin;
13
+ readonly source: AppFilesSource;
14
+ readonly packageRelativePath?: string;
15
+ readonly declared: unknown;
16
+ }): AppFilesRootDecision;
17
+ export interface AppFilesPackageIdentity {
18
+ readonly appId: string | undefined;
19
+ readonly declared: unknown;
20
+ }
21
+ export declare function readAppFilesPackageIdentity(packageDir: string): Promise<AppFilesPackageIdentity>;
22
+ export declare function appFilesRootSegmentsOf(path: string): string[] | undefined;
@@ -0,0 +1,47 @@
1
+ export interface AppFilesLocation {
2
+ readonly workspaceReal: string;
3
+ readonly segments: readonly string[];
4
+ }
5
+ export interface AppFilesListItem {
6
+ readonly ref: string;
7
+ readonly version: string;
8
+ readonly bytes: number;
9
+ readonly modifiedAt: string;
10
+ }
11
+ export interface AppFilesPage {
12
+ readonly items: AppFilesListItem[];
13
+ readonly next: string | null;
14
+ }
15
+ export interface AppFilesRead {
16
+ readonly ref: string;
17
+ readonly text: string;
18
+ readonly version: string;
19
+ }
20
+ export interface AppFilesWritten {
21
+ readonly ref: string;
22
+ readonly version: string;
23
+ }
24
+ export interface AppFilesStoreHooks {
25
+ readonly beforeOpen?: (path: string) => Promise<void>;
26
+ readonly beforeMkdir?: (path: string) => Promise<void>;
27
+ }
28
+ export interface AppFilesStoreOptions {
29
+ readonly lockDir: string;
30
+ readonly lockWaitMs?: number;
31
+ }
32
+ export declare function versionOf(bytes: Uint8Array): string;
33
+ export declare function isPathInside(root: string, candidate: string): boolean;
34
+ export declare class AppFilesStore {
35
+ private readonly hooks;
36
+ private readonly lockDir;
37
+ private readonly lockWaitMs;
38
+ constructor(hooks: AppFilesStoreHooks | undefined, options: AppFilesStoreOptions);
39
+ list(location: AppFilesLocation, folder: string, after: string | undefined): Promise<AppFilesPage>;
40
+ read(location: AppFilesLocation, ref: string): Promise<AppFilesRead>;
41
+ write(location: AppFilesLocation, ref: string, text: string, expectedVersion: string | null): Promise<AppFilesWritten>;
42
+ private readVerified;
43
+ private createFolders;
44
+ private writeAtomically;
45
+ private withFileLock;
46
+ }
47
+ export declare function appFilesLockKeyOf(absolutePath: string): Promise<string>;
@@ -0,0 +1 @@
1
+ export {};
@@ -5,6 +5,8 @@ export { APP_SCHEDULE_ACTOR_KIND, APP_SCHEDULE_INERT_COMMAND, APP_SCHEDULE_INSTA
5
5
  export type { AppScheduleDirective, AppScheduleIntervalMinutes, AppSchedulePeriodic, AppSchedulePeriodicReason, AppScheduleRunVerdict, AppScheduleSnapshot, AppScheduleStatus, ScheduleTrigger, ToolScheduleDeclaration, } from './schedule-contract.js';
6
6
  export { APP_TOOLS_FILE, APP_TOOLS_SCHEMA_VERSION, APP_TOOL_ENTRY } from './tool-mode.js';
7
7
  export { SKILL_BACKEND_ENV_NAMES, isSkillBackendEnv } from './backend-env.js';
8
+ export { APP_FILES_ERROR_CODES, APP_FILES_LIMITS, APP_FILES_LOCK_SUBPATH, APP_FILES_ROOT_ENV, AppFilesError, acquireFileLock, appFiles, appFilesLockKeyOf, appFilesRootSegmentsOf, normalizeAppFilesRef, releaseFileLock, } from './app-files/index.js';
9
+ export type { AppFiles, AppFilesErrorCode, AppFilesHost, AppFilesInstallOrigin, AppFilesListInput, AppFilesOptions, AppFilesPage, AppFilesRead, AppFilesSource, AppFilesWritten, HeldFileLock, } from './app-files/index.js';
8
10
  export type { SkillBackendEnvName } from './backend-env.js';
9
11
  export { executeAppRequest, runSkillApp } from './runtime.js';
10
12
  export type { AppFailureInfo, RunSkillAppOptions } from './runtime.js';
package/dist/app/index.js CHANGED
@@ -1,12 +1,13 @@
1
- 'use strict';var util=require('util'),fs=require('fs'),crypto=require('crypto'),net=require('net'),console$1=require('console'),stream=require('stream');var N=["text/plain","application/json"];var q=[5,15,30,60],x=Object.freeze({min:15e3,max:6e5,default:3e5}),hn=1,Ae="schedule:",En="schedule",On="exit 78",Fe=["standby","disabled","draining","degraded"],gn=["cron","cron_manual","app_enable"],Sn=/^[A-Z][A-Z0-9_]{0,63}$/u;function qe(n){return typeof n=="string"&&Sn.test(n)}var Me=["status","everyMinutes","lastStartedAt","lastFinishedAt","lastOutcome","lastErrorCode","nextRunAt","periodic","periodicReason"],Tn=["unset","on","off"],Rn=["available","unavailable"],ye=64,In=128;function He(n){return q.includes(n)}function be(n){return Number.isSafeInteger(n)&&n>=x.min&&n<=x.max}function Xe(n){return Fe.includes(n)}function Ge(n){if(!Pn(n)||Object.keys(n).length!==Me.length||!Me.every(o=>Object.hasOwn(n,o))||typeof n.status!="string"||!Tn.includes(n.status)||!He(n.everyMinutes)||!Y(n.lastStartedAt,ye)||!Y(n.lastFinishedAt,ye)||!Y(n.lastOutcome,In)||!Y(n.nextRunAt,ye)||n.lastErrorCode!==null&&!qe(n.lastErrorCode)||typeof n.periodic!="string"||!Rn.includes(n.periodic))return;let t=n.periodic;if(!(t==="available"?n.periodicReason!==null:!Xe(n.periodicReason))&&!(n.nextRunAt!==null&&(n.status!=="on"||t!=="available")))return Object.freeze({status:n.status,everyMinutes:n.everyMinutes,lastStartedAt:n.lastStartedAt,lastFinishedAt:n.lastFinishedAt,lastOutcome:n.lastOutcome,lastErrorCode:n.lastErrorCode,nextRunAt:n.nextRunAt,periodic:t,periodicReason:n.periodicReason})}function Y(n,e){return n===null||typeof n=="string"&&n.length>0&&n.length<=e}function Pn(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var k=Object.freeze({min:6e4,max:18e5,default:6e5}),wn=Object.freeze({min:1e3,max:12e4,default:3e4}),Cn=1,Ve="crewx/appJobs",$e=1,me=["starting","running","stopping","finished"],_e=["succeeded","failed","timed_out","cancelled","shutdown","interrupted"],Q=["cancelled","timed_out","shutdown"],he=["manual","schedule"],Jn=/^[a-z][a-z0-9_]{0,63}$/u,Dn=/^[A-Z][A-Z0-9_]{0,63}$/u,Z=["start","status","cancel"],Ee=["APP_JOB_NOT_DECLARED","APP_JOB_NOT_AUTHORIZED","APP_JOB_SELF_START","APP_JOB_OWNER_INVALID","APP_JOB_DEFINITION_INVALID","APP_JOB_DEFINITION_CHANGED","APP_JOB_DEADLINE_INVALID","APP_JOB_SHUTTING_DOWN","APP_JOB_OWNER_MISMATCH","APP_JOB_STALE_HANDLE","APP_JOB_NOT_ACTIVE","APP_JOB_NOT_GRANTED"],Oe="APP_JOB_RUN_REQUIRED";function ge(n){return Number.isSafeInteger(n)&&n>=k.min&&n<=k.max}function j(n){return typeof n=="string"&&Dn.test(n)}function L(n){return typeof n=="string"&&Jn.test(n)}function H(n){return Z.includes(n)}function Nn(n){return n?.some(({name:e,version:t})=>e===Ve&&t===$e)===true}var ze=Symbol;ze.metadata===void 0&&Object.defineProperty(Symbol,"metadata",{configurable:false,value:Symbol.for("Symbol.metadata")});var xn=ze.metadata,X=Symbol.for("crewx.app.tool-metadata"),l=class extends Error{code;detail;outcome;constructor(e,t=null,o){super(e),this.name="AppError",this.code=e,this.detail=t,this.outcome=Te(o?.outcome);}};function Te(n){return n==="rejected"?"rejected":"failed"}var Se=class{static devtools=process.env.CREWX_APP_DEV==="1"?Object.freeze({log:true}):void 0;currentState;stateWasSet=false;answerBody;answerRange;callContext;callSchedule;callJobs;callJobRun;scheduleDirective;workspaceRoot;constructor(e={workspaceRoot:process.cwd()}){this.currentState=e.state??{},this.workspaceRoot=e.workspaceRoot,this.callContext=e.context===void 0?void 0:Mn(e.context),this.callSchedule=e.schedule===void 0?void 0:Object.freeze({...e.schedule}),this.callJobs=e.jobs,this.callJobRun=e.jobRun;}get jobs(){return this.callJobs}get jobRun(){return this.callJobRun}get schedule(){return this.callSchedule}requestSchedule(e){if(typeof e!="boolean")throw new TypeError("requestSchedule needs true or false");if(this.callSchedule===void 0)throw new l("SCHEDULE_UNSUPPORTED","this App has no schedule on this Host");let t=this.callContext?.actor;if(t==="schedule")throw new l("SCHEDULE_UNSUPPORTED","a scheduled run cannot change its own schedule",{outcome:"rejected"});if(e&&t!=="user")throw new l("SCHEDULE_ENABLE_DENIED","only the person at the screen can turn a schedule on",{outcome:"rejected"});this.scheduleDirective=Object.freeze({enabled:e});}get didRequestSchedule(){return this.scheduleDirective}get context(){if(this.callContext===void 0)throw new TypeError("this.context is only set when the Host runs the action; pass options.context when you construct the App in a test");return this.callContext}get state(){return this.currentState}get didSetState(){return this.stateWasSet}setState(e){this.currentState=e,this.stateWasSet=true;}get didSetContent(){return this.answerBody!==void 0}get producedContent(){return this.answerBody===void 0?void 0:{body:this.answerBody,...this.answerRange===void 0?{}:{range:this.answerRange}}}setContent(e,t){if(typeof e!="string"&&!(e instanceof Uint8Array))throw new TypeError("setContent needs a string or a Uint8Array");if(t!==void 0&&!qn(t))throw new TypeError("setContent range must be { startLine, lineCount, totalLines }, three integers of at least 1");this.answerBody=typeof e=="string"?new TextEncoder().encode(e):new Uint8Array(e),this.answerRange=t===void 0?void 0:{startLine:t.startLine,lineCount:t.lineCount,totalLines:t.totalLines};}emptyState(){return {}}validate(e,t,o){}mapError(e){return {code:"EXECUTION_FAILED",detail:null}}errorState(e,t,o){return {...h(o.state)?o.state:{},error:{code:e,detail:t}}}};function kn(n){return function(e,t){if(t.static||t.private||t.kind!=="method")throw new TypeError("@Tool can decorate public instance methods only");let o=t.metadata;if(!o)throw new TypeError("standard decorator metadata is unavailable");let r=Object.hasOwn(o,X)?o[X]:[];if(r.some(u=>u.methodName===String(t.name)))throw new TypeError(`@Tool is declared more than once for ${String(t.name)}`);let s=n.content===void 0?void 0:Ln(n.name,n.content),i=n.schedule===void 0?void 0:Bn(n);if(i!==void 0&&r.some(u=>u.options.schedule!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one scheduled action`);let a=n.job===void 0?void 0:Un(n);if(a!==void 0&&r.some(u=>u.options.job!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one job action`);let p=n.jobAccess===void 0?void 0:vn(n);o[X]=[...r,{methodName:String(t.name),options:Object.freeze({...n,...s===void 0?{}:{content:s},...i===void 0?{}:{schedule:i},...a===void 0?{}:{job:a},...p===void 0?{}:{jobAccess:p}})}];}}function G(n){let e=n[xn],t=e&&Object.hasOwn(e,X)?e[X]:[],o=new Map(t.map(s=>[s.methodName,s])),r=Object.getOwnPropertyNames(n.prototype).map(s=>o.get(s)).filter(s=>s!==void 0);if(r.length!==t.length)throw new TypeError("a @Tool method is missing from the App prototype");return r}function We(n){return G(n).some(({options:e})=>e.schedule!==void 0)}function Ke(n){let e=n.definition,t=G(n),o=new Set;return t.map(({options:r})=>{if(o.has(r.name))throw new TypeError(`duplicate @Tool name: ${r.name}`);return o.add(r.name),{actionId:r.name,...r.dataInputs===void 0?{}:{dataInputs:[...r.dataInputs]},confirmation:r.confirmation??"none",capability:r.capability??"app.read",mutation:r.mutation??true,inputSchema:r.inputSchema,...r.content===void 0?{}:{content:Fn(r.content)},...r.schedule===void 0?{}:{schedule:{...r.schedule}},...r.job===void 0?{}:{job:{...r.job}},...r.jobAccess===void 0?{}:{jobAccess:[...r.jobAccess]},resultProjection:r.resultProjection??{allow:[...e.stateProjection.allow]},_meta:{description:r.description}}})}function jn(n,e){if(e.length===0)throw new TypeError("backendCommand must name the skill command");let t=Ke(n).map(({_meta:o,...r})=>({...r,backend:{type:"skill",command:[...e]},_meta:o}));return {...n.definition,actions:t}}function Ln(n,e){let t=s=>{throw new TypeError(`@Tool ${n}: content ${s}`)},o=(s,i,a)=>{if(!h(a))return t(`${s} must be an object`);for(let p of Object.keys(a))if(p==="mediaType"){if(!N.includes(a[p]))return t(`${s}.mediaType must be one of ${N.join(", ")}`)}else if(p===i){if(typeof a[p]!="boolean")return t(`${s}.${p} must be true or false`)}else return t(`${s} has the unknown key "${p}"`);return Object.hasOwn(a,"mediaType")?Object.freeze({...a}):t(`${s}.mediaType is required`)};if(!h(e))return t("must be an object");let r={};for(let s of Object.keys(e))if(s==="in")r[s]=o("in","required",e[s]);else if(s==="out")r[s]=o("out","range",e[s]);else return t(`has the unknown key "${s}"; use "in" and/or "out"`);return Object.keys(r).length===0?t('needs "in" and/or "out"'):Object.freeze(r)}function Bn(n){let e=o=>{throw new TypeError(`@Tool ${n.name}: schedule ${o}`)},t=n.schedule;if(!h(t))return e("must be an object");for(let o of Object.keys(t))if(o!=="everyMinutes"&&o!=="timeoutMs")return e(`has the unknown key "${o}"`);return q.includes(t.everyMinutes)?t.timeoutMs!==void 0&&!be(t.timeoutMs)?e(`timeoutMs must be an integer from ${x.min} to ${x.max}`):n.content!==void 0?e("cannot be combined with content"):n.dataInputs!==void 0?e("cannot be combined with dataInputs"):n.confirmation!==void 0&&n.confirmation!=="none"?e("cannot require a native confirmation"):Object.freeze({everyMinutes:t.everyMinutes,...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}}):e(`everyMinutes must be one of ${q.join(", ")}`)}function Un(n){let e=o=>{throw new TypeError(`@Tool ${n.name}: job ${o}`)},t=n.job;if(!h(t))return e("must be an object");for(let o of Object.keys(t))if(o!=="deadlineMs")return e(`has the unknown key "${o}"`);return t.deadlineMs!==void 0&&!ge(t.deadlineMs)?e(`deadlineMs must be an integer from ${k.min} to ${k.max}`):n.content!==void 0?e("cannot be combined with content"):n.dataInputs!==void 0?e("cannot be combined with dataInputs"):n.confirmation!==void 0&&n.confirmation!=="none"?e("cannot require a native confirmation"):n.schedule!==void 0?e("cannot be the scheduled action too"):n.jobAccess!==void 0?e("cannot also be a control action: a run does not control itself"):Object.freeze({...t.deadlineMs===void 0?{}:{deadlineMs:t.deadlineMs}})}function vn(n){let e=o=>{throw new TypeError(`@Tool ${n.name}: jobAccess ${o}`)},t=n.jobAccess;return !Array.isArray(t)||t.length===0?e("must list at least one operation"):new Set(t).size!==t.length?e("must not repeat an operation"):t.every(H)?n.job!==void 0?e("cannot be set on the job action, which runs the job and cannot control it"):n.content!==void 0?e("cannot be combined with content"):Object.freeze([...t]):e("names an unknown operation")}function Mn(n){return Object.freeze({instanceId:n.instanceId,threadId:n.threadId,actor:n.actor,requestId:n.requestId,nowMs:n.nowMs})}function Fn(n){let e={};for(let[t,o]of Object.entries(n))e[t]={...o};return e}function qn(n){return h(n)&&["startLine","lineCount","totalLines"].every(e=>Number.isSafeInteger(n[e])&&n[e]>=1)}function h(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var Hn=/^[A-Za-z0-9._:-]{1,128}$/u,Xn=/[\u0000-\u001f\u007f\u2028\u2029]/u,Gn=512;function Re(n=process.env){let e=Ye(n.CREWX_APP_INSTANCE_ID),t=n.CREWX_APP_REQUEST_ID,o=n.CREWX_APP_ACTOR_KIND,r=n.CREWX_APP_NOW_MS;if(e===void 0||typeof t!="string"||!Hn.test(t)||o!=="user"&&o!=="agent"&&o!=="schedule"||typeof r!="string"||!/^\d{1,16}$/u.test(r))return;let s=Number(r);if(!Number.isSafeInteger(s))return;let i=n.CREWX_THREAD_ID===void 0?null:Ye(n.CREWX_THREAD_ID);if(i!==void 0&&!(o==="schedule"&&(i!==null||!e.startsWith(Ae))))return Object.freeze({instanceId:e,threadId:i,actor:o,requestId:t,nowMs:s})}function Ye(n){if(!(typeof n!="string"||n.length===0||Xn.test(n)))return new TextEncoder().encode(n).byteLength<=Gn?n:void 0}var Vn="dist/tools.json",$n=1,zn="dist/main.mjs";var Qe=["CREWX_APP_INSTANCE_ID","CREWX_THREAD_ID"];function Wn(n){if(!Array.isArray(n)||n.length===0)return false;let e=new Set;for(let t of n){if(!Qe.some(o=>o===t)||e.has(t))return false;e.add(t);}return true}var ee=2,ne=2097152;var B=2*1024*1024,te=2e4;function Ie(n){return crypto.createHash("sha256").update(n).digest("hex")}function oe(n){if(n.byteLength===0)return 0;let e=0;for(let t of n)t===10&&(e+=1);return n[n.byteLength-1]!==10&&(e+=1),e}var Qn=ne+1+B,Zn=64*1024,et=10,re={kind:"invalid"};function nt(n,e){try{let t=[],o=0;for(;;){let i=new Uint8Array(Zn),a=fs.readSync(n,i,0,i.length,null);if(a===0)break;if(o+=a,o>e)return;t.push(i.subarray(0,a));}let r=new Uint8Array(o),s=0;for(let i of t)r.set(i,s),s+=i.byteLength;return r}catch{return}}function ie(n){return tt(nt(n,Qn))}function tt(n){if(n===void 0)return re;let e=n.indexOf(et);if(n.byteLength<=ne){let o=dt(Buffer.from(n.buffer,n.byteOffset,n.byteLength).toString("utf8"));if(o.ok&&!(e>=0&&J(o.value)&&o.value.schemaVersion===ee))return {kind:"v1",value:o.value}}if(e<=0||e>ne)return re;let t;try{t=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(n.subarray(0,e)));}catch{return re}return !J(t)||t.schemaVersion!==ee?re:{kind:"v2",header:t,body:n.subarray(e+1)}}var ot="actionId,content,input,schemaVersion,state",rt="bytes,lines,mediaType,sha256",it="mediaType,range",st=/^[a-f0-9]{64}$/u,at=new TextDecoder("utf-8",{fatal:true,ignoreBOM:true});function nn(n,e){let t=p=>({code:p,outcome:"rejected"});if(V(n)!==ot||n.schemaVersion!==ee||typeof n.actionId!="string"||!J(n.input)||!J(n.state)||!J(n.content)||V(n.content)!=="in,out")return {code:"INPUT_INVALID",outcome:"failed"};let o=n.content,r,s=o.in;if(s===null){if(e.byteLength!==0)return t(e.byteLength>B?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH")}else {if(!J(s)||V(s)!==rt||!Ze(s.mediaType)||!en(s.bytes,B)||!en(s.lines,te)||typeof s.sha256!="string"||!st.test(s.sha256)||e.byteLength!==s.bytes)return t(e.byteLength>B?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH");if(Ie(e)!==s.sha256||oe(e)!==s.lines)return t("CONTENT_DIGEST_MISMATCH");let p;try{p=at.decode(e);}catch{return t("CONTENT_ENCODING_INVALID")}r={mediaType:s.mediaType,text:p};}let i,a=o.out;if(a!==null){if(!J(a)||V(a)!==it||!Ze(a.mediaType))return t("CONTENT_SOURCE_UNSUPPORTED");let p=a.range;if(p!==null&&!ut(p))return t("CONTENT_SOURCE_UNSUPPORTED");i={mediaType:a.mediaType,...p===null?{}:{range:{startLine:p.startLine,lineCount:p.lineCount}}};}return {actionId:n.actionId,input:n.input,state:n.state,content:{...r===void 0?{}:{in:r},...i===void 0?{}:{out:i}}}}function tn(n){return Object.hasOwn(n,"code")}function on(n,e){let t=o=>({code:o,outcome:"rejected"});if(n?.in===void 0){if(e.in!==void 0)return t("CONTENT_SOURCE_UNSUPPORTED")}else if(e.in===void 0){if(n.in.required===true)return t("CONTENT_REQUIRED")}else if(e.in.mediaType!==n.in.mediaType)return t("CONTENT_SOURCE_UNSUPPORTED");if(n?.out===void 0){if(e.out!==void 0)return t("CONTENT_SOURCE_UNSUPPORTED")}else {if(e.out===void 0)return t("CONTENT_REQUIRED");if(e.out.mediaType!==n.out.mediaType||e.out.range!==void 0&&n.out.range!==true)return t("CONTENT_SOURCE_UNSUPPORTED")}}function se(n,e){let{content:t,...o}=n,r=e===void 0?o:{...o,content:{bytes:e.body.byteLength,lines:oe(e.body),sha256:Ie(e.body),...e.range===void 0?{}:{range:e.range}}},s=new TextEncoder().encode(`${JSON.stringify(r)}
2
- `);if(e===void 0)return s;let i=new Uint8Array(s.byteLength+e.body.byteLength);return i.set(s,0),i.set(e.body,s.byteLength),i}function rn(n){if(n.body.byteLength>B||oe(n.body)>te)return {code:"CONTENT_TOO_LARGE",outcome:"failed"}}function dt(n){try{return {ok:!0,value:JSON.parse(n)}}catch{return {ok:false}}}function V(n){return Object.keys(n).sort().join(",")}function J(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function Ze(n){return typeof n=="string"&&N.includes(n)}function en(n,e){return Number.isSafeInteger(n)&&n>=0&&n<=e}function ut(n){return J(n)&&V(n)==="lineCount,startLine"&&Number.isSafeInteger(n.startLine)&&n.startLine>=1&&Number.isSafeInteger(n.lineCount)&&n.lineCount>=1&&n.lineCount<=te}var an="CREWX_APP_JOB_CHANNEL",S=1,$=4096,Ce=1e4,Je=5e3,De=512,Pe=Object.freeze({min:3,max:16}),pt=["APP_JOB_BRIDGE_UNAVAILABLE","APP_JOB_BRIDGE_INVALID","APP_JOB_BRIDGE_TIMEOUT","APP_JOB_BRIDGE_CLOSED"],W=/^[A-Za-z0-9._:-]{1,128}$/u,lt=64,dn=2147483647,z=class{#e="";#n=false;push(e){let t=[],o=e;for(;;){let r=o.indexOf(`
3
- `);if(r===-1)return this.#n||(this.#e+=o,U(this.#e)>$&&(t.push({kind:"oversized"}),this.#e="",this.#n=true)),t;let s=o.slice(0,r);if(o=o.slice(r+1),this.#n){this.#n=false;continue}let i=this.#e+s;this.#e="",t.push(U(i)>$?{kind:"oversized"}:{kind:"line",line:i});}}};function ue(n){let e=JSON.stringify(n);if(U(e)>$)throw new TypeError("App job bridge message is over the line bound");return e}function ct(n){let e=pe(n);if(e===void 0||e.v!==S||!un(e.requestId)||!pn(e.seq))return;let t={v:S,requestId:e.requestId,seq:e.seq};switch(e.op){case "start":return _(e,["v","op","requestId","seq"],[])?{...t,op:"start"}:void 0;case "status":{if(!_(e,["v","op","requestId","seq"],["handle"]))return;if(e.handle===void 0)return {...t,op:"status"};let o=we(e.handle);return o===void 0?void 0:{...t,op:"status",handle:o}}case "cancel":{if(!_(e,["v","op","requestId","seq","handle"],[]))return;let o=we(e.handle);return o===void 0?void 0:{...t,op:"cancel",handle:o}}default:return}}function Ne(n){let e=pe(n);if(e===void 0||e.v!==S||!un(e.requestId)||!pn(e.seq))return;let t={v:S,requestId:e.requestId,seq:e.seq};if(e.ok===false)return _(e,["v","requestId","seq","ok","code"],[])&&Ee.includes(e.code)?{...t,ok:false,code:e.code}:void 0;if(e.ok===true)switch(e.op){case "start":{if(!_(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let o=ae(e.job),r=e.outcome;return o===void 0||r!=="started"&&r!=="attached"?void 0:{...t,ok:true,op:"start",outcome:r,job:o}}case "status":{if(!_(e,["v","requestId","seq","ok","op","job"],[]))return;if(e.job===null)return {...t,ok:true,op:"status",job:null};let o=ae(e.job);return o===void 0?void 0:{...t,ok:true,op:"status",job:o}}case "cancel":{if(!_(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let o=ae(e.job);return o===void 0||e.outcome!=="stopping"?void 0:{...t,ok:true,op:"cancel",outcome:"stopping",job:o}}default:return}}function ft(n){let e=pe(n);if(e===void 0||e.v!==S||typeof e.runId!="string"||!W.test(e.runId)||!ce(e.generation))return;let t={v:S,runId:e.runId,generation:e.generation};switch(e.kind){case "heartbeat":return _(e,["v","kind","runId","generation"],[])?{...t,kind:"heartbeat"}:void 0;case "completed":return _(e,["v","kind","runId","generation"],[])?{...t,kind:"completed"}:void 0;case "progress":{if(!_(e,["v","kind","runId","generation","phase"],["completed","total","resumable"]))return;let{completed:o,total:r,resumable:s}=e;return !L(e.phase)||o!==void 0&&!de(o)||r!==void 0&&!de(r)||o!==void 0&&r!==void 0&&o>r||s!==void 0&&typeof s!="boolean"?void 0:{...t,kind:"progress",phase:e.phase,...o===void 0?{}:{completed:o},...r===void 0?{}:{total:r},...s===void 0?{}:{resumable:s}}}case "failed":return _(e,["v","kind","runId","generation","code","recoverable"],[])&&j(e.code)&&typeof e.recoverable=="boolean"?{...t,kind:"failed",code:e.code,recoverable:e.recoverable}:void 0;default:return}}function xe(n){let e=pe(n);if(!(e===void 0||!_(e,["v","kind","runId","generation","reason"],[])||e.v!==S||e.kind!=="stop"||typeof e.runId!="string"||!W.test(e.runId)||!ce(e.generation)||!Q.includes(e.reason)))return {v:S,kind:"stop",runId:e.runId,generation:e.generation,reason:e.reason}}function ke(n){let e=le(n)?n:void 0;if(!(e===void 0||e.v!==S||!mt(e.fd))){if(e.role==="control"){let t=e.operations;return !_(e,["v","role","fd","operations"],[])||!Array.isArray(t)||t.length===0||new Set(t).size!==t.length||!t.every(H)?void 0:{v:1,role:"control",fd:e.fd,operations:[...t]}}if(e.role==="run")return !_(e,["v","role","fd","runId","generation"],[])||typeof e.runId!="string"||!W.test(e.runId)||!ce(e.generation)?void 0:{v:1,role:"run",fd:e.fd,runId:e.runId,generation:e.generation}}}function je(n){let e=n[an];if(typeof e!="string"||U(e)>De)return;let t;try{t=JSON.parse(e);}catch{return}return ke(t)}function yt(n){let e=ke(JSON.parse(JSON.stringify(n)));if(e===void 0)throw new TypeError("App job channel descriptor is invalid");let t=JSON.stringify(e);if(U(t)>De)throw new TypeError("App job channel descriptor is over its bound");return Object.freeze({CREWX_APP_JOB_CHANNEL:t})}function At(n){return n==="schedule"?"schedule":"manual"}function bt(n){return ae(n)}function ae(n){let e=le(n)?n:void 0;if(e===void 0||!_(e,["handle","state","stopReason","trigger","outcome","phase","completed","total","resumable","lastHeartbeatAt","startedAt","finishedAt","errorCode","recoverable"],[]))return;let t=we(e.handle),o=e.stopReason,r=e.outcome,s=e.phase,i=e.errorCode,a=e.recoverable;if(!(t===void 0||!me.includes(e.state)||!(o===null||Q.includes(o))||o!==null&&e.state!=="stopping"||!he.includes(e.trigger)||!(r===null||_e.includes(r))||!(s===null||L(s))||!(e.completed===null||de(e.completed))||!(e.total===null||de(e.total))||typeof e.resumable!="boolean"||!sn(e.lastHeartbeatAt)||!ln(e.startedAt)||!sn(e.finishedAt)||!(i===null||j(i))||!(a===null||typeof a=="boolean")))return {handle:t,state:e.state,stopReason:o,trigger:e.trigger,outcome:r,phase:s,completed:e.completed,total:e.total,resumable:e.resumable,lastHeartbeatAt:e.lastHeartbeatAt,startedAt:e.startedAt,finishedAt:e.finishedAt,errorCode:i,recoverable:a}}function we(n){if(!(!le(n)||!_(n,["runId","generation"],[]))&&!(typeof n.runId!="string"||!W.test(n.runId)||!ce(n.generation)))return {runId:n.runId,generation:n.generation}}function pe(n){if(U(n)>$)return;let e;try{e=JSON.parse(n);}catch{return}return le(e)?e:void 0}function _(n,e,t){let o=new Set([...e,...t]);return Object.keys(n).every(r=>o.has(r))&&e.every(r=>Object.hasOwn(n,r))}function le(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function un(n){return typeof n=="string"&&W.test(n)}function pn(n){return Number.isSafeInteger(n)&&n>=1&&n<=dn}function ce(n){return Number.isSafeInteger(n)&&n>=1&&n<=dn}function mt(n){return Number.isSafeInteger(n)&&n>=Pe.min&&n<=Pe.max}function de(n){return Number.isSafeInteger(n)&&n>=0}function ln(n){return typeof n=="string"&&n.length>0&&n.length<=lt}function sn(n){return n===null||ln(n)}function U(n){return new TextEncoder().encode(n).byteLength}var Et=2147483647,v=class{#e;#n;#p;#y=crypto.randomUUID();#A=new z;#r=new Map;#s=new Set;#t;#l=0;#o=false;#c=false;#a=false;#d=null;constructor(e){this.#e=e.channel,this.#n=e.open??fn,this.#p=e.replyTimeoutMs??Ce;}jobsFor(e){let t=this.#e;if(t.role!=="control"||e===void 0)return;let o=t.operations,r=Z.filter(i=>e.includes(i)&&o.includes(i));if(r.length===0)return;let s=i=>{if(!r.includes(i))throw new l("APP_JOB_NOT_GRANTED",null,{outcome:"rejected"})};return Object.freeze({granted:Object.freeze(r),start:async()=>{s("start");let i=await this.#u("start",{});if(i.ok===false)return {kind:"refused",code:i.code};if(i.op!=="start")throw new l("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:i.outcome,job:i.job}},status:async i=>{s("status");let a=await this.#u("status",i===void 0?{}:{handle:i});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="status")throw new l("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"status",job:a.job}},cancel:async i=>{s("cancel");let a=await this.#u("cancel",{handle:i});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="cancel")throw new l("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"stopping",job:a.job}}})}runFor(e){let t=this.#e;if(t.role!=="run"||!e)return;try{this.#f();}catch{return}let o={v:S,runId:t.runId,generation:t.generation},r=()=>this.#d,s=i=>{this.#o||this.#c||this.#t===void 0||this.#t.write(ue({...o,...i}));};return Object.freeze({handle:Object.freeze({runId:t.runId,generation:t.generation}),get stopRequested(){return r()!==null},get stopReason(){return r()},progress:i=>{if(!L(i.phase))throw new TypeError("progress phase must be a lower snake case name");if(i.completed!==void 0&&!cn(i.completed))throw new TypeError("progress completed must be a count");if(i.total!==void 0&&!cn(i.total))throw new TypeError("progress total must be a count");if(i.completed!==void 0&&i.total!==void 0&&i.completed>i.total)throw new TypeError("progress completed cannot exceed total");if(i.resumable!==void 0&&typeof i.resumable!="boolean")throw new TypeError("progress resumable must be boolean");this.#a||s({kind:"progress",phase:i.phase,...i.completed===void 0?{}:{completed:i.completed},...i.total===void 0?{}:{total:i.total},...i.resumable===void 0?{}:{resumable:i.resumable}});},heartbeat:()=>{this.#a||s({kind:"heartbeat"});},complete:()=>{s({kind:"completed"}),this.#a=true;},fail:(i,a)=>{if(!j(i))throw new TypeError("fail code must be an upper snake case code");if(typeof a!="boolean")throw new TypeError("fail recoverable must be boolean");s({kind:"failed",code:i,recoverable:a}),this.#a=true;},onStop:i=>{let a=r();return a!==null?(i(a),()=>{}):(this.#s.add(i),()=>{this.#s.delete(i);})}})}close(){this.#i("APP_JOB_BRIDGE_CLOSED");}async drain(e=Je){if(this.#o)return;this.#c=true;let t=this.#t,o;try{if(t!==void 0){let r;try{r=t.drain();}catch{r=Promise.resolve();}await Promise.race([r.catch(()=>{}),new Promise(s=>{o=setTimeout(s,e);})]);}}finally{clearTimeout(o),this.close();}}#u(e,t){let o=this.#f(),r=this.#l+1;if(r>Et)throw new l("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});this.#l=r;let s=`${this.#y}.${r}`,i=ue({v:S,op:e,requestId:s,seq:r,...t});return new Promise((a,p)=>{let u=setTimeout(()=>this.#i("APP_JOB_BRIDGE_TIMEOUT"),this.#p);this.#r.set(r,{op:e,requestId:s,resolve:a,reject:p,timer:u}),o.write(i);})}#f(){if(this.#o)throw new l("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});if(this.#t!==void 0)return this.#t;let e;try{e=this.#n(this.#e.fd);}catch{throw new l("APP_JOB_BRIDGE_UNAVAILABLE",null,{outcome:"failed"})}return e.onData(t=>this.#b(t)),e.onEnd(()=>this.#i("APP_JOB_BRIDGE_CLOSED")),this.#t=e,e}#b(e){for(let t of this.#A.push(e)){if(this.#o)return;if(this.#e.role==="run")t.kind==="line"&&this.#_(t.line);else if(t.kind==="oversized"){this.#i("APP_JOB_BRIDGE_INVALID");return}else this.#m(t.line);}}#m(e){let t=Ne(e),o=t===void 0?void 0:this.#r.get(t.seq);if(t===void 0||o===void 0||o.requestId!==t.requestId||t.ok&&t.op!==o.op){this.#i("APP_JOB_BRIDGE_INVALID");return}clearTimeout(o.timer),this.#r.delete(t.seq),o.resolve(t);}#_(e){let t=this.#e;if(t.role!=="run")return;let o=xe(e);if(!(o===void 0||o.runId!==t.runId||o.generation!==t.generation)&&this.#d===null){this.#d=o.reason;for(let r of [...this.#s])try{r(o.reason);}catch{}}}#i(e){if(this.#o)return;this.#o=true;let t=[...this.#r.values()];this.#r.clear();for(let r of t)clearTimeout(r.timer),r.reject(new l(e,null,{outcome:"failed"}));this.#s.clear();let o=this.#t;this.#t=void 0,o?.close();}};function fn(n){let e=new net.Socket({fd:n,readable:true,writable:true});return e.setEncoding("utf8"),e.on("error",()=>{}),{write:t=>{e.write(`${t}
4
- `);},drain:()=>new Promise(t=>{if(e.destroyed){t();return}e.write("",()=>t());}),onData:t=>{e.on("data",t);},onEnd:t=>{e.on("close",t);},close:()=>{e.destroy();}}}function cn(n){return Number.isSafeInteger(n)&&n>=0}var gt=1;async function St(n,e,t=process.env.CREWX_WORKSPACE_ROOT??process.cwd(),o){return (await bn(n,e,t,void 0,true,void 0,o)).response}async function bn(n,e,t,o,r=true,s,i,a){let p=s!==void 0,u=h(e)?e:void 0,b=u?.input,m=u?.state,d=new n({state:h(m)?m:{},workspaceRoot:t,...i===void 0?{}:{context:i}}),E=h(b)?b:{},c=h(m)?m:d.emptyState(),f={},T=u!==void 0&&Object.hasOwn(u,"schedule"),R;try{let A;if(p){if(u===void 0||T)throw new l("INPUT_INVALID");let O=nn(u,s);if(tn(O))throw new l(O.code,null,{outcome:O.outcome});(({actionId:A,input:E,state:c}=O)),f=O.content;}else {let O=T&&u!==void 0?Ge(u.schedule):void 0;if(!u||Object.keys(u).length!==(T?5:4)||!["schemaVersion","actionId","input","state"].every(_n=>Object.hasOwn(u,_n))||u.schemaVersion!==gt||typeof u.actionId!="string"||!h(b)||!h(m)||T&&O===void 0)throw new l("INPUT_INVALID");A=u.actionId,E=b,c=m,R=O;}let y=G(n).find(({options:O})=>O.name===A),C=y===void 0?void 0:a?.jobsFor(y.options.jobAccess),I=y===void 0?void 0:a?.runFor(y.options.job!==void 0);if(d=new n({state:c,workspaceRoot:t,...i===void 0?{}:{context:i},...R===void 0?{}:{schedule:R},...C===void 0?{}:{jobs:C},...I===void 0?{}:{jobRun:I}}),await d.validate(A,E,c),!y)throw new l("INPUT_INVALID");if(R!==void 0&&(y.options.content!==void 0||!We(n)))throw new l("INPUT_INVALID");let M=d[y.methodName];if(typeof M!="function")throw new l("EXECUTION_FAILED");let D=on(y.options.content,f);if(D)throw new l(D.code,null,{outcome:D.outcome});if(y.options.job!==void 0&&I===void 0)throw new l(Oe,null,{outcome:"rejected"});let K=Object.freeze({...f.in===void 0?{}:{in:Object.freeze({text:f.in.text})},...f.out===void 0?{}:{out:Object.freeze(f.out.range===void 0?{}:{range:Object.freeze({...f.out.range})})}}),F=()=>M.call(d,E,K),P=r?await Pt(F):await F();if(P!==void 0&&!h(P))throw new l("EXECUTION_FAILED");let w;if(f.out!==void 0){if(w=d.producedContent,w===void 0)throw new l("EXECUTION_FAILED","content.out was requested but setContent was never called");let O=rn(w);if(O)throw new l(O.code,null,{outcome:O.outcome})}else if(d.didSetContent)throw new l("EXECUTION_FAILED","setContent was called but the request asked for no content.out");let ve=d.didRequestSchedule;return {response:{...d.didSetState?{state:d.state}:{},...P===void 0?{}:{result:P},...ve===void 0?{}:{schedule:{enabled:ve.enabled}}},...w===void 0?{}:{answer:w}}}catch(A){let y,C=A,I=A instanceof l?A:void 0;if(I)y={code:I.code,detail:I.detail,outcome:I.outcome};else try{y=d.mapError(A);}catch(w){y={code:"EXECUTION_FAILED",detail:null},C=w;}let M=Ct(y?.code),D=M?y.code:"EXECUTION_FAILED",K=typeof y?.detail=="string"?y.detail:null,F=M?Te(y.outcome):"failed",P;try{P=d.errorState(D,K,{input:E,state:c});}catch(w){C=new AggregateError([C,w],"App error handling failed"),P=d.emptyState();}return o?.(D,C,{outcome:F,detail:K,expected:I!==void 0&&C===I}),{response:{outcome:F,errorCode:D,state:h(P)?P:d.emptyState()}}}}async function Tt(n,e={}){let t=Rt(e.jobBridge);try{await It(n,e,t);}finally{await t?.drain();}}function Rt(n){if(n===null)return;if(n!==void 0)return new v(n);let e=je(process.env);return e===void 0?void 0:new v({channel:e})}async function It(n,e,t){let o=e.output??process.stdout,r,s;if(e.preloadedInput!==void 0)r=e.preloadedInput.value,s=e.preloadedInput.body;else {let d=ie(e.inputFd??0);d.kind==="v1"?r=d.value:d.kind==="v2"&&(r=d.header,s=d.body);}let i=s!==void 0,a=e.context??Re(),p=false,u=(d,E,c)=>{p=true,e.onFailure?.(d,E,c);},b;try{b=await bn(n,r,process.env.CREWX_WORKSPACE_ROOT??process.cwd(),u,e.consoleManaged!==!0,s,a,t);}catch(d){u("EXECUTION_FAILED",d),b={response:yn(e.emptyState)};}wt(b.response)&&!p&&u(b.response.errorCode,void 0,{outcome:b.response.outcome,detail:null,expected:false});let m;try{let d=(e.sanitize??An)(b.response);m=i?se(d,b.answer):`${JSON.stringify(d)}
5
- `;}catch(d){u("EXECUTION_FAILED",d);let E=yn(e.emptyState);try{let c=(e.sanitize??An)(E);m=i?se(c):`${JSON.stringify(c)}
6
- `;}catch(c){u("EXECUTION_FAILED",c),m=i?se(E):`${JSON.stringify(E)}
7
- `;}}o.write(m);}async function Pt(n){let e=["log","info","debug"],t=new Map;for(let o of e)t.set(o,console[o]),console[o]=(...r)=>process.stderr.write(`${util.format(...r)}
8
- `);try{return await n()}finally{for(let o of e)console[o]=t.get(o);}}function yn(n={}){return {outcome:"failed",errorCode:"EXECUTION_FAILED",state:{...n,error:{code:"EXECUTION_FAILED",detail:null}}}}function wt(n){return (n.outcome==="failed"||n.outcome==="rejected")&&typeof n.errorCode=="string"}function Ct(n){return typeof n=="string"&&/^[A-Z][A-Z0-9_]{0,127}$/u.test(n)}function An(n){return n}var Le={depth:null,maxArrayLength:null,maxStringLength:null},Ue=class extends stream.Writable{#e="buffer";#n=[];_write(e,t,o){if(this.#e==="buffer"){this.#n.push(typeof e=="string"?e:Uint8Array.from(e)),o();return}if(this.#e==="discard"){o();return}process.stderr.write(e,o);}flushToStderr(){this.#e="stderr";for(let e of this.#n)process.stderr.write(e);this.#n=[];}discard(){this.#e="discard",this.#n=[];}};async function Nt(n,e={}){let t=process.stdout,o=t.write.bind(t),r=new Ue,s=new console$1.Console({stdout:r,stderr:r,inspectOptions:{...Le}});globalThis.console=s;let i=false,a="-",p="-",u,b=false,m,d;try{let f=kt(e.inputFd??0);a=jt(f.value),p=fe(process.env.CREWX_APP_REQUEST_ID),u=new Date().toISOString();try{m=await n();}catch(A){b=!0,d=A;}let T=m?.default;if(!b&&T?.devtools?.log===!0?(Object.assign(util.inspect.defaultOptions,Le),E(u),r.flushToStderr()):r.discard(),b){c("EXECUTION_FAILED",d),Be(o,e,c);return}try{if(typeof m?.runSkillApp!="function")throw new TypeError("App module does not export runSkillApp");let A={sanitize:e.sanitize,emptyState:e.emptyState??xt(T),preloadedInput:f.body===void 0?{value:f.value}:{value:f.value,body:f.body},onFailure:c,consoleManaged:!0,output:{write:o},jobBridge:e.jobBridge};await m.runSkillApp(T,A);}catch(A){c("EXECUTION_FAILED",A),Be(o,e,c);}}catch(f){c("EXECUTION_FAILED",f),Be(o,e,c);}finally{process.exitCode=0;}function E(f){i||(process.stderr.write(`[crewx-app] ${f??new Date().toISOString()} ${fe(a)} req=${p}
9
- `),i=true);}function c(f,T,R){E();let A=R?.expected===true&&R.detail?` ${fe(R.detail)}`:"";process.stderr.write(`[crewx-app] ${R?.outcome??"failed"} ${fe(f)}${A}
10
- `),T!==void 0&&R?.expected!==true&&process.stderr.write(`${util.inspect(T,Le)}
11
- `);}}function xt(n){if(typeof n=="function")try{let t=new n({workspaceRoot:process.cwd()}).emptyState();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}catch{return}}function kt(n){let e=ie(n);return e.kind==="v1"?{value:e.value}:e.kind==="v2"?{value:e.header,body:e.body}:{value:void 0}}function jt(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)&&typeof n.actionId=="string"?n.actionId:"-"}function fe(n){return typeof n!="string"||n.length===0?"-":n.replace(/[\u0000-\u001f\u007f\u2028\u2029]/gu,"_")}function Be(n,e,t){let o={code:"EXECUTION_FAILED",detail:null},s={outcome:"failed",errorCode:"EXECUTION_FAILED",state:e.emptyState!==null&&typeof e.emptyState=="object"&&!Array.isArray(e.emptyState)?{...e.emptyState,error:o}:{error:o}},i=s;try{i=(e.sanitize??Lt)(s);}catch(a){t("EXECUTION_FAILED",a);}n(`${JSON.stringify(i)}
12
- `);}function Lt(n){return n}exports.APP_JOB_BRIDGE_CHANNEL_MAX_BYTES=De;exports.APP_JOB_BRIDGE_DRAIN_TIMEOUT_MS=Je;exports.APP_JOB_BRIDGE_ENV=an;exports.APP_JOB_BRIDGE_ERROR_CODES=pt;exports.APP_JOB_BRIDGE_FD=Pe;exports.APP_JOB_BRIDGE_MAX_LINE_BYTES=$;exports.APP_JOB_BRIDGE_REPLY_TIMEOUT_MS=Ce;exports.APP_JOB_BRIDGE_VERSION=S;exports.APP_JOB_CAPABILITY=Ve;exports.APP_JOB_CAPABILITY_VERSION=$e;exports.APP_JOB_DEADLINE_MS=k;exports.APP_JOB_MAX_PER_APP=Cn;exports.APP_JOB_OPERATIONS=Z;exports.APP_JOB_OUTCOMES=_e;exports.APP_JOB_REFUSAL_CODES=Ee;exports.APP_JOB_RUN_REQUIRED=Oe;exports.APP_JOB_STATES=me;exports.APP_JOB_STOP_GRACE_MS=wn;exports.APP_JOB_STOP_REASONS=Q;exports.APP_JOB_TRIGGERS=he;exports.APP_SCHEDULE_ACTOR_KIND=En;exports.APP_SCHEDULE_INERT_COMMAND=On;exports.APP_SCHEDULE_INSTANCE_PREFIX=Ae;exports.APP_SCHEDULE_INTERVALS_MINUTES=q;exports.APP_SCHEDULE_MAX_PER_APP=hn;exports.APP_SCHEDULE_PERIODIC_REASONS=Fe;exports.APP_SCHEDULE_TIMEOUT_MS=x;exports.APP_TOOLS_FILE=Vn;exports.APP_TOOLS_SCHEMA_VERSION=$n;exports.APP_TOOL_ENTRY=zn;exports.AppError=l;exports.AppJobBridge=v;exports.AppJobLineReader=z;exports.CrewXApp=Se;exports.SCHEDULE_TRIGGERS=gn;exports.SKILL_BACKEND_ENV_NAMES=Qe;exports.Tool=kn;exports.appJobTriggerForActor=At;exports.buildAppJobChannelEnvironment=yt;exports.encodeAppJobLine=ue;exports.executeAppRequest=St;exports.generateManifest=jn;exports.generateToolDeclarations=Ke;exports.getToolDeclarations=G;exports.hasAppJobCapability=Nn;exports.isAppJobCode=j;exports.isAppJobDeadlineMs=ge;exports.isAppJobOperation=H;exports.isAppJobPhase=L;exports.isAppScheduleCode=qe;exports.isAppScheduleIntervalMinutes=He;exports.isAppSchedulePeriodicReason=Xe;exports.isAppScheduleTimeoutMs=be;exports.isSkillBackendEnv=Wn;exports.openInheritedAppJobTransport=fn;exports.parseAppJobChannel=ke;exports.parseAppJobControlReply=Ne;exports.parseAppJobControlRequest=ct;exports.parseAppJobRunPush=xe;exports.parseAppJobRunReport=ft;exports.parseAppJobView=bt;exports.readAppContext=Re;exports.readAppJobChannel=je;exports.runAppEntry=Nt;exports.runSkillApp=Tt;
1
+ 'use strict';var fs=require('fs'),path=require('path'),util=require('util'),child_process=require('child_process'),crypto=require('crypto'),os=require('os'),net=require('net'),console$1=require('console'),stream=require('stream');var L=["text/plain","application/json"];var W=[5,15,30,60],v=Object.freeze({min:15e3,max:6e5,default:3e5}),Pt=1,Le="schedule:",It="schedule",Tt="exit 78",wn=["standby","disabled","draining","degraded"],Ct=["cron","cron_manual","app_enable"],kt=/^[A-Z][A-Z0-9_]{0,63}$/u;function Sn(n){return typeof n=="string"&&kt.test(n)}var On=["status","everyMinutes","lastStartedAt","lastFinishedAt","lastOutcome","lastErrorCode","nextRunAt","periodic","periodicReason"],Jt=["unset","on","off"],Nt=["available","unavailable"],Fe=64,Dt=128;function Rn(n){return W.includes(n)}function ve(n){return Number.isSafeInteger(n)&&n>=v.min&&n<=v.max}function Pn(n){return wn.includes(n)}function In(n){if(!xt(n)||Object.keys(n).length!==On.length||!On.every(r=>Object.hasOwn(n,r))||typeof n.status!="string"||!Jt.includes(n.status)||!Rn(n.everyMinutes)||!ae(n.lastStartedAt,Fe)||!ae(n.lastFinishedAt,Fe)||!ae(n.lastOutcome,Dt)||!ae(n.nextRunAt,Fe)||n.lastErrorCode!==null&&!Sn(n.lastErrorCode)||typeof n.periodic!="string"||!Nt.includes(n.periodic))return;let t=n.periodic;if(!(t==="available"?n.periodicReason!==null:!Pn(n.periodicReason))&&!(n.nextRunAt!==null&&(n.status!=="on"||t!=="available")))return Object.freeze({status:n.status,everyMinutes:n.everyMinutes,lastStartedAt:n.lastStartedAt,lastFinishedAt:n.lastFinishedAt,lastOutcome:n.lastOutcome,lastErrorCode:n.lastErrorCode,nextRunAt:n.nextRunAt,periodic:t,periodicReason:n.periodicReason})}function ae(n,e){return n===null||typeof n=="string"&&n.length>0&&n.length<=e}function xt(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var j=Object.freeze({min:6e4,max:18e5,default:6e5}),Ft=Object.freeze({min:1e3,max:12e4,default:3e4}),Lt=1,Tn="crewx/appJobs",Cn=1,je=["starting","running","stopping","finished"],Me=["succeeded","failed","timed_out","cancelled","shutdown","interrupted"],de=["cancelled","timed_out","shutdown"],Be=["manual","schedule"],vt=/^[a-z][a-z0-9_]{0,63}$/u,jt=/^[A-Z][A-Z0-9_]{0,63}$/u,ue=["start","status","cancel"],Ue=["APP_JOB_NOT_DECLARED","APP_JOB_NOT_AUTHORIZED","APP_JOB_SELF_START","APP_JOB_OWNER_INVALID","APP_JOB_DEFINITION_INVALID","APP_JOB_DEFINITION_CHANGED","APP_JOB_DEADLINE_INVALID","APP_JOB_SHUTTING_DOWN","APP_JOB_OWNER_MISMATCH","APP_JOB_STALE_HANDLE","APP_JOB_NOT_ACTIVE","APP_JOB_NOT_GRANTED"],He="APP_JOB_RUN_REQUIRED";function qe(n){return Number.isSafeInteger(n)&&n>=j.min&&n<=j.max}function M(n){return typeof n=="string"&&jt.test(n)}function B(n){return typeof n=="string"&&vt.test(n)}function z(n){return ue.includes(n)}function Mt(n){return n?.some(({name:e,version:t})=>e===Tn&&t===Cn)===true}var kn=Symbol;kn.metadata===void 0&&Object.defineProperty(Symbol,"metadata",{configurable:false,value:Symbol.for("Symbol.metadata")});var Bt=kn.metadata,$=Symbol.for("crewx.app.tool-metadata"),f=class extends Error{code;detail;outcome;constructor(e,t=null,r){super(e),this.name="AppError",this.code=e,this.detail=t,this.outcome=Xe(r?.outcome);}};function Xe(n){return n==="rejected"?"rejected":"failed"}var Ve=class{static devtools=process.env.CREWX_APP_DEV==="1"?Object.freeze({log:true}):void 0;currentState;stateWasSet=false;answerBody;answerRange;callContext;callSchedule;callJobs;callJobRun;scheduleDirective;workspaceRoot;constructor(e={workspaceRoot:process.cwd()}){this.currentState=e.state??{},this.workspaceRoot=e.workspaceRoot,this.callContext=e.context===void 0?void 0:Wt(e.context),this.callSchedule=e.schedule===void 0?void 0:Object.freeze({...e.schedule}),this.callJobs=e.jobs,this.callJobRun=e.jobRun;}get jobs(){return this.callJobs}get jobRun(){return this.callJobRun}get schedule(){return this.callSchedule}requestSchedule(e){if(typeof e!="boolean")throw new TypeError("requestSchedule needs true or false");if(this.callSchedule===void 0)throw new f("SCHEDULE_UNSUPPORTED","this App has no schedule on this Host");let t=this.callContext?.actor;if(t==="schedule")throw new f("SCHEDULE_UNSUPPORTED","a scheduled run cannot change its own schedule",{outcome:"rejected"});if(e&&t!=="user")throw new f("SCHEDULE_ENABLE_DENIED","only the person at the screen can turn a schedule on",{outcome:"rejected"});this.scheduleDirective=Object.freeze({enabled:e});}get didRequestSchedule(){return this.scheduleDirective}get context(){if(this.callContext===void 0)throw new TypeError("this.context is only set when the Host runs the action; pass options.context when you construct the App in a test");return this.callContext}get state(){return this.currentState}get didSetState(){return this.stateWasSet}setState(e){this.currentState=e,this.stateWasSet=true;}get didSetContent(){return this.answerBody!==void 0}get producedContent(){return this.answerBody===void 0?void 0:{body:this.answerBody,...this.answerRange===void 0?{}:{range:this.answerRange}}}setContent(e,t){if(typeof e!="string"&&!(e instanceof Uint8Array))throw new TypeError("setContent needs a string or a Uint8Array");if(t!==void 0&&!$t(t))throw new TypeError("setContent range must be { startLine, lineCount, totalLines }, three integers of at least 1");this.answerBody=typeof e=="string"?new TextEncoder().encode(e):new Uint8Array(e),this.answerRange=t===void 0?void 0:{startLine:t.startLine,lineCount:t.lineCount,totalLines:t.totalLines};}emptyState(){return {}}validate(e,t,r){}mapError(e){return {code:"EXECUTION_FAILED",detail:null}}errorState(e,t,r){return {...O(r.state)?r.state:{},error:{code:e,detail:t}}}};function Ut(n){return function(e,t){if(t.static||t.private||t.kind!=="method")throw new TypeError("@Tool can decorate public instance methods only");let r=t.metadata;if(!r)throw new TypeError("standard decorator metadata is unavailable");let o=Object.hasOwn(r,$)?r[$]:[];if(o.some(p=>p.methodName===String(t.name)))throw new TypeError(`@Tool is declared more than once for ${String(t.name)}`);let i=n.content===void 0?void 0:qt(n.name,n.content),s=n.schedule===void 0?void 0:Vt(n);if(s!==void 0&&o.some(p=>p.options.schedule!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one scheduled action`);let a=n.job===void 0?void 0:Xt(n);if(a!==void 0&&o.some(p=>p.options.job!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one job action`);let d=n.jobAccess===void 0?void 0:Gt(n);r[$]=[...o,{methodName:String(t.name),options:Object.freeze({...n,...i===void 0?{}:{content:i},...s===void 0?{}:{schedule:s},...a===void 0?{}:{job:a},...d===void 0?{}:{jobAccess:d}})}];}}function K(n){let e=n[Bt],t=e&&Object.hasOwn(e,$)?e[$]:[],r=new Map(t.map(i=>[i.methodName,i])),o=Object.getOwnPropertyNames(n.prototype).map(i=>r.get(i)).filter(i=>i!==void 0);if(o.length!==t.length)throw new TypeError("a @Tool method is missing from the App prototype");return o}function Jn(n){return K(n).some(({options:e})=>e.schedule!==void 0)}function Nn(n){let e=n.definition,t=K(n),r=new Set;return t.map(({options:o})=>{if(r.has(o.name))throw new TypeError(`duplicate @Tool name: ${o.name}`);return r.add(o.name),{actionId:o.name,...o.dataInputs===void 0?{}:{dataInputs:[...o.dataInputs]},confirmation:o.confirmation??"none",capability:o.capability??"app.read",mutation:o.mutation??true,inputSchema:o.inputSchema,...o.content===void 0?{}:{content:zt(o.content)},...o.schedule===void 0?{}:{schedule:{...o.schedule}},...o.job===void 0?{}:{job:{...o.job}},...o.jobAccess===void 0?{}:{jobAccess:[...o.jobAccess]},resultProjection:o.resultProjection??{allow:[...e.stateProjection.allow]},_meta:{description:o.description}}})}function Ht(n,e){if(e.length===0)throw new TypeError("backendCommand must name the skill command");let t=Nn(n).map(({_meta:r,...o})=>({...o,backend:{type:"skill",command:[...e]},_meta:r}));return {...n.definition,actions:t}}function qt(n,e){let t=i=>{throw new TypeError(`@Tool ${n}: content ${i}`)},r=(i,s,a)=>{if(!O(a))return t(`${i} must be an object`);for(let d of Object.keys(a))if(d==="mediaType"){if(!L.includes(a[d]))return t(`${i}.mediaType must be one of ${L.join(", ")}`)}else if(d===s){if(typeof a[d]!="boolean")return t(`${i}.${d} must be true or false`)}else return t(`${i} has the unknown key "${d}"`);return Object.hasOwn(a,"mediaType")?Object.freeze({...a}):t(`${i}.mediaType is required`)};if(!O(e))return t("must be an object");let o={};for(let i of Object.keys(e))if(i==="in")o[i]=r("in","required",e[i]);else if(i==="out")o[i]=r("out","range",e[i]);else return t(`has the unknown key "${i}"; use "in" and/or "out"`);return Object.keys(o).length===0?t('needs "in" and/or "out"'):Object.freeze(o)}function Vt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: schedule ${r}`)},t=n.schedule;if(!O(t))return e("must be an object");for(let r of Object.keys(t))if(r!=="everyMinutes"&&r!=="timeoutMs")return e(`has the unknown key "${r}"`);return W.includes(t.everyMinutes)?t.timeoutMs!==void 0&&!ve(t.timeoutMs)?e(`timeoutMs must be an integer from ${v.min} to ${v.max}`):n.content!==void 0?e("cannot be combined with content"):n.dataInputs!==void 0?e("cannot be combined with dataInputs"):n.confirmation!==void 0&&n.confirmation!=="none"?e("cannot require a native confirmation"):Object.freeze({everyMinutes:t.everyMinutes,...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}}):e(`everyMinutes must be one of ${W.join(", ")}`)}function Xt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: job ${r}`)},t=n.job;if(!O(t))return e("must be an object");for(let r of Object.keys(t))if(r!=="deadlineMs")return e(`has the unknown key "${r}"`);return t.deadlineMs!==void 0&&!qe(t.deadlineMs)?e(`deadlineMs must be an integer from ${j.min} to ${j.max}`):n.content!==void 0?e("cannot be combined with content"):n.dataInputs!==void 0?e("cannot be combined with dataInputs"):n.confirmation!==void 0&&n.confirmation!=="none"?e("cannot require a native confirmation"):n.schedule!==void 0?e("cannot be the scheduled action too"):n.jobAccess!==void 0?e("cannot also be a control action: a run does not control itself"):Object.freeze({...t.deadlineMs===void 0?{}:{deadlineMs:t.deadlineMs}})}function Gt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: jobAccess ${r}`)},t=n.jobAccess;return !Array.isArray(t)||t.length===0?e("must list at least one operation"):new Set(t).size!==t.length?e("must not repeat an operation"):t.every(z)?n.job!==void 0?e("cannot be set on the job action, which runs the job and cannot control it"):n.content!==void 0?e("cannot be combined with content"):Object.freeze([...t]):e("names an unknown operation")}function Wt(n){return Object.freeze({instanceId:n.instanceId,threadId:n.threadId,actor:n.actor,requestId:n.requestId,nowMs:n.nowMs})}function zt(n){let e={};for(let[t,r]of Object.entries(n))e[t]={...r};return e}function $t(n){return O(n)&&["startLine","lineCount","totalLines"].every(e=>Number.isSafeInteger(n[e])&&n[e]>=1)}function O(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var Kt=/^[A-Za-z0-9._:-]{1,128}$/u,Yt=/[\u0000-\u001f\u007f\u2028\u2029]/u,Zt=512;function Ge(n=process.env){let e=Dn(n.CREWX_APP_INSTANCE_ID),t=n.CREWX_APP_REQUEST_ID,r=n.CREWX_APP_ACTOR_KIND,o=n.CREWX_APP_NOW_MS;if(e===void 0||typeof t!="string"||!Kt.test(t)||r!=="user"&&r!=="agent"&&r!=="schedule"||typeof o!="string"||!/^\d{1,16}$/u.test(o))return;let i=Number(o);if(!Number.isSafeInteger(i))return;let s=n.CREWX_THREAD_ID===void 0?null:Dn(n.CREWX_THREAD_ID);if(s!==void 0&&!(r==="schedule"&&(s!==null||!e.startsWith(Le))))return Object.freeze({instanceId:e,threadId:s,actor:r,requestId:t,nowMs:i})}function Dn(n){if(!(typeof n!="string"||n.length===0||Yt.test(n)))return new TextEncoder().encode(n).byteLength<=Zt?n:void 0}var Qt="dist/tools.json",er=1,nr="dist/main.mjs";var xn=["CREWX_APP_INSTANCE_ID","CREWX_THREAD_ID"];function tr(n){if(!Array.isArray(n)||n.length===0)return false;let e=new Set;for(let t of n){if(!xn.some(r=>r===t)||e.has(t))return false;e.add(t);}return true}var Fn=["INVALID_REF","FILE_NOT_FOUND","DOCUMENT_CHANGED","TOO_LARGE","IO_ERROR","FILE_BUSY"],l=class extends Error{code;constructor(e){super(e),this.name="AppFilesError",this.code=e;}};var R={textBytes:256*1024,refCodePoints:200,refSegments:3,pageSize:200},U=/^[\p{L}\p{N}][\p{L}\p{N}\p{M}_-]{0,99}$/u,D=()=>{throw new l("INVALID_REF")};function Y(n){let e=n.normalize("NFC");if([...e].length>R.refCodePoints)return;let t=e.split("/");if(t.length>R.refSegments)return;let r=t[t.length-1];return r.endsWith(".md")&&[...t.slice(0,-1),r.slice(0,-3)].every(i=>U.test(i))?e:void 0}function le(n){return typeof n!="string"?D():Y(n)??D()}function Ln(n){if(n==null||n==="")return "";if(typeof n!="string")return D();let e=n.normalize("NFC");if([...e].length>R.refCodePoints)return D();let t=(e.endsWith("/")?e.slice(0,-1):e).split("/");return t.length>R.refSegments-1||!t.every(r=>U.test(r))?D():`${t.join("/")}/`}function vn(n){if(typeof n!="string")return D();if(Buffer.byteLength(n,"utf8")>R.textBytes)throw new l("TOO_LARGE");return n}function jn(n){return n===null?null:typeof n=="string"&&n.length<=R.refCodePoints?n:D()}var fe=path.join("locks","files"),ee=12e3,{link:ur,mkdir:lr,open:pr,readFile:$e,unlink:Q}=fs.promises,cr=5,fr=50,yr=1e3,Ar=2e3,mr="/bin/ps",br={LC_ALL:"C",TZ:"UTC"},gr=100,hr=19,_r=/^[A-Za-z]{3} ([A-Za-z]{3}) +(\d{1,2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/,Er=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],Or=util.promisify(child_process.execFile),Mn,pe;function Ke(n=process.env){if(n.CREWX_HOME){let e=path.resolve(n.CREWX_HOME);try{return fs.realpathSync(e)}catch(t){if(t.code==="ENOENT")return e;throw t}}return process.platform!=="win32"&&n.XDG_CONFIG_HOME?path.join(n.XDG_CONFIG_HOME,"crewx"):path.join(os.homedir(),".crewx")}async function ye(n){let{lockDir:e,key:t}=n,r=path.join(e,wr(t)),o=Date.now()+n.waitMs,i=await Hn(e,{token:crypto.randomUUID(),pid:process.pid,startedAtMs:await Vn()}),s=new We;try{let a=cr;for(;;){if(await qn(i.staged,r))return {path:r,token:i.record.token};let d=await ce(r);if(d!=="vanished"&&!(d!=="unreadable"&&await s.isDead(d)&&await Ir(e,r,d,s))){if(Date.now()>=o)throw new l("FILE_BUSY");await Nr(a),a=Math.min(a*2,fr);}}}finally{await Q(i.staged).catch(()=>{});}}async function Ae(n){await ze(n.path,n.token);}function wr(n){return crypto.createHash("sha256").update(n,"utf8").digest("hex")}async function Hn(n,e){let t=path.join(n,`.${e.token}.tmp`);try{await lr(n,{recursive:!0}),await Sr(t,JSON.stringify(e));}catch{throw await Q(t).catch(()=>{}),new l("IO_ERROR")}return {record:e,staged:t}}async function Sr(n,e){let t=await pr(n,"wx");try{await t.writeFile(e),await t.sync();}finally{await t.close();}}async function qn(n,e){try{return await ur(n,e),!0}catch(t){if(t.code==="EEXIST")return false;throw new l("IO_ERROR")}}async function ce(n){let e;try{e=await $e(n,"utf8");}catch(t){return t.code==="ENOENT"?"vanished":"unreadable"}try{let t=JSON.parse(e);return Rr(t)?t:"unreadable"}catch{return "unreadable"}}function Rr(n){if(typeof n!="object"||n===null||Array.isArray(n))return false;let e=n;return typeof e.token=="string"&&e.token.length>0&&typeof e.pid=="number"&&Number.isSafeInteger(e.pid)&&e.pid>0&&(e.startedAtMs===null||Number.isSafeInteger(e.startedAtMs))}async function Pr(n){try{process.kill(n.pid,0);}catch(t){return t.code==="ESRCH"}if(n.startedAtMs===null)return false;let e=await Xn(n.pid);return e!==null&&e!==n.startedAtMs}var We=class{constructor(e=Pr,t=Date.now){this.check=e;this.now=t;}check;now;answers=new Map;async isDead(e){let t=this.now(),r=this.answers.get(e.token);if(r!==void 0&&t-r.at<yr)return r.dead;let o=await this.check(e);return this.answers.set(e.token,{at:t,dead:o}),o}};async function Ir(n,e,t,r){let o=`${e}.reclaim`,i=await Hn(n,{token:crypto.randomUUID(),pid:process.pid,startedAtMs:await Vn()});try{if(!await qn(i.staged,o)){let s=await ce(o);return s!=="vanished"&&s!=="unreadable"&&await r.isDead(s)&&await ze(o,s.token),!1}try{let s=await ce(e);return typeof s!="object"||s.token!==t.token?!1:(await Q(e).catch(()=>{}),!0)}finally{await ze(o,i.record.token);}}finally{await Q(i.staged).catch(()=>{});}}async function ze(n,e){let t=await ce(n);typeof t=="object"&&t.token===e&&await Q(n).catch(()=>{});}function Vn(){return (pe===void 0||pe.pid!==process.pid)&&(pe={pid:process.pid,startedAtMs:Xn(process.pid)}),pe.startedAtMs}async function Xn(n){return process.platform==="linux"&&(Mn??=await fs.promises.access("/proc/self/stat").then(()=>true,()=>false),Mn)?Tr(n):kr(n)}async function Tr(n){try{let e=await $e(`/proc/${n}/stat`,"utf8"),t=e.slice(e.lastIndexOf(")")+2).split(" "),r=Number(t[hr]),o=await Cr();return !Number.isSafeInteger(r)||o===void 0?null:o*1e3+r*1e3/gr}catch{return null}}async function Cr(){let n=(await $e("/proc/stat","utf8")).split(`
2
+ `).find(t=>t.startsWith("btime ")),e=Number(n?.slice(6));return Number.isSafeInteger(e)?e:void 0}async function kr(n){try{let{stdout:e}=await Or(mr,["-o","lstart=","-p",String(n)],{env:br,encoding:"utf8",timeout:Ar});return Jr(e.trim())}catch{return null}}function Jr(n){let e=_r.exec(n);if(e===null)return null;let t=Er.indexOf(e[1]);return t<0?null:Date.UTC(Number(e[6]),t,Number(e[2]),Number(e[3]),Number(e[4]),Number(e[5]))}function Nr(n){return new Promise(e=>setTimeout(e,n))}var Fr=[".git",".crewx","node_modules","apps","skills"],{lstat:Lr,readFile:vr}=fs.promises,jr=4,Mr=200,Br=1024*1024,Gn=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function Ur(n){return ["docs","apps",n]}function Wn(n){let e={segments:Ur(n.appId),declared:false};if(n.origin!=="not_installed"||n.source!=="workspace"&&n.source!=="bundled"||n.declared===void 0||n.declared===null)return e;let t=Hr(n.declared);return t.ok?n.packageRelativePath!==void 0&&qr(t.segments,Vr(n.packageRelativePath))?{...e,warning:"FILES_ROOT_FORBIDDEN"}:{segments:t.segments,declared:true}:{...e,warning:t.warning}}async function zn(n){let e={appId:void 0,declared:void 0};try{let t=path.join(n,"manifest.json"),r=await Lr(t);if(!r.isFile()||r.size>Br)return e;let o=JSON.parse(await vr(t,"utf8"));if(!me(o))return e;let i=o.name,s=typeof i=="string"&&Gn.test(i)?i:void 0,a=o._meta,d=me(a)?a["dev.crewx"]:void 0,p=me(d)?d.files:void 0;return {appId:s,declared:p}}catch{return e}}function Hr(n){return !me(n)||Object.keys(n).some(e=>e!=="root")||typeof n.root!="string"?{ok:false,warning:"FILES_ROOT_INVALID"}:Kn(n.root.normalize("NFC"),$n)}function be(n){if(n.normalize("NFC")!==n)return;let e=Kn(n,t=>$n(t)||Gn.test(t));return e.ok?e.segments:void 0}function $n(n){return U.test(n)}function Kn(n,e){let t={ok:false,warning:"FILES_ROOT_INVALID"},r={ok:false,warning:"FILES_ROOT_FORBIDDEN"};if([...n].length>Mr)return t;let o=n.split("/");return o.length>jr||!o.every(e)?t:o.length===1||Fr.includes(o[0].toLowerCase())?r:{ok:true,segments:o}}function qr(n,e){let t=Math.min(n.length,e.length);for(let r=0;r<t;r+=1)if(n[r].toLowerCase()!==e[r].toLowerCase())return false;return t>0}function Vr(n){return n.normalize("NFC").split("/").filter(e=>e.length>0)}function me(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}var{lstat:Kr,mkdir:Yr,open:Zr,readdir:Qr,rename:eo,stat:no,unlink:nt}=fs.promises;function ge(n){return `sha256:${crypto.createHash("sha256").update(n).digest("hex")}`}function Qe(n,e){return e===n||e.startsWith(n.endsWith(path.sep)?n:n+path.sep)}var he=class{constructor(e={},t){this.hooks=e;this.lockDir=t.lockDir,this.lockWaitMs=t.lockWaitMs??ee;}hooks;lockDir;lockWaitMs;async list(e,t,r){let o=t===""?[]:t.slice(0,-1).split("/"),i=await Ye(e.workspaceReal,[...e.segments,...o]);if(i.status!=="complete")return {items:[],next:null};let s=await Zn(e),a=await uo(s,i.dir,t);a.sort((y,u)=>Qn(y.ref,u.ref));let d=r===void 0?a:a.filter(y=>Qn(y.ref,r)>0),p=d.slice(0,R.pageSize),c=[];for(let y of p){let u=await this.readVerified(s,y.abs);c.push({ref:y.ref,version:ge(u.bytes),bytes:u.bytes.length,modifiedAt:u.stat.mtime.toISOString()});}return {items:c,next:d.length>p.length?p[p.length-1].ref:null}}async read(e,t){let r=t.split("/"),o=await Ye(e.workspaceReal,[...e.segments,...r.slice(0,-1)]);if(o.status!=="complete")throw new l("FILE_NOT_FOUND");let i=await Ze(o.dir,r[r.length-1]);if(!i)throw new l("FILE_NOT_FOUND");if(!i.stat.isFile())throw new l("IO_ERROR");let{bytes:s}=await this.readVerified(await Zn(e),i.abs,R.textBytes);return {ref:t,text:yo(s),version:ge(s)}}async write(e,t,r,o){let i=t.split("/"),s=i[i.length-1],a=new Uint8Array(Buffer.from(r,"utf8"));return this.withFileLock(await oo(e,t),async()=>{let d=await Ye(e.workspaceReal,[...e.segments,...i.slice(0,-1)]);if(d.status==="blocked")throw new l("IO_ERROR");let p=await _e(d.dir),c=d.status==="complete"?await Ze(d.dir,s):void 0;if(c&&!c.stat.isFile())throw new l("IO_ERROR");if((c?ge((await this.readVerified(p.real,c.abs)).bytes):null)!==o)throw new l("DOCUMENT_CHANGED");let u=await this.createFolders(p,d.status==="missing"?d.missing:[]);await ro(u,s);let b=c?.abs??path.join(u.path,s);return await this.writeAtomically(u,b,s,a,c?.stat),{ref:t,version:ge(a)}})}async readVerified(e,t,r){return await this.hooks.beforeOpen?.(t),so(e,t,r)}async createFolders(e,t){let r=e;for(let o of t){let i=path.join(r.path,o);await this.hooks.beforeMkdir?.(i);try{await Yr(i);}catch(s){if(s.code!=="EEXIST")throw new l("IO_ERROR")}r=await ao(r,i);}return r}async writeAtomically(e,t,r,o,i){let s=path.join(e.path,to(r)),a;try{await this.hooks.beforeOpen?.(s),a=await tt(s,fs.constants.O_CREAT|fs.constants.O_EXCL|fs.constants.O_WRONLY),await a.writeFile(o),i!==void 0&&await a.chmod(i.mode&4095),await a.sync(),await a.close(),a=void 0,await nn(e),await eo(s,t);}catch(d){throw await a?.close().catch(()=>{}),await nt(s).catch(()=>{}),d instanceof l?d:new l("IO_ERROR")}}async withFileLock(e,t){let r=await ye({lockDir:this.lockDir,key:e,waitMs:this.lockWaitMs});try{return await t()}finally{await Ae(r);}}};function to(n){return `.${n}.crewx-${crypto.randomUUID()}.tmp`}async function ro(n,e){let t=`.${e}.crewx-`;for(let r of await rn(n.path))r.normalize("NFC").startsWith(t)&&r.endsWith(".tmp")&&await nt(path.join(n.path,r)).catch(()=>{});}async function en(n){return (await io(n)).normalize("NFC").toLowerCase()}async function oo(n,e){return en(path.join(n.workspaceReal,...n.segments,...e.split("/")))}async function io(n){let e=[],t=n;for(;;)try{return path.join(await rt(t),...e.reverse())}catch{let r=path.dirname(t);if(r===t)throw new l("IO_ERROR");e.push(path.basename(t)),t=r;}}async function so(n,e,t){let r=await tt(e,fs.constants.O_RDONLY);try{let o=await r.stat();if(!o.isFile())throw new l("IO_ERROR");if(t!==void 0&&o.size>t)throw new l("TOO_LARGE");let i=fo(await r.readFile());return await po(n,e,o),{bytes:i,stat:o}}finally{await r.close();}}async function Zn(n){let e=await tn(path.join(n.workspaceReal,...n.segments));if(!Qe(n.workspaceReal,e))throw new l("INVALID_REF");return e}async function Ze(n,e){let t=(await rn(n)).filter(i=>i.normalize("NFC")===e);if(t.length>1)throw new l("IO_ERROR");let r=path.join(n,t[0]??e),o=await on(r);if(o){if(o.isSymbolicLink())throw new l("INVALID_REF");return {abs:r,stat:o}}}async function Ye(n,e){let t=n;for(let r=0;r<e.length;r+=1){let o=await Ze(t,e[r]);if(!o)return {status:"missing",dir:t,missing:e.slice(r)};if(!o.stat.isDirectory())return {status:"blocked"};t=o.abs;}return {status:"complete",dir:t}}async function ao(n,e){await nn(n);let t=await _e(e);if(path.dirname(t.real)!==n.real)throw new l("INVALID_REF");return t}async function uo(n,e,t){let r=[],o=s=>s===""?0:s.split("/").length-1,i=async(s,a)=>{let d=await lo(n,s),p=await rn(s);await nn(d);let c=new Set;for(let y of p){let u=y.normalize("NFC");if(c.has(u))throw new l("IO_ERROR");c.add(u);let b=path.join(s,y),A=await on(b);if(!(!A||A.isSymbolicLink())){if(A.isDirectory())o(a)<R.refSegments-1&&U.test(u)&&await i(b,`${a}${u}/`);else if(A.isFile()){let m=Y(`${a}${u}`);m!==void 0&&r.push({ref:m,abs:b});}}}};return await i(e,t),r}function Qn(n,e){return n<e?-1:n>e?1:0}async function _e(n){let e=await on(n);if(e?.isSymbolicLink())throw new l("INVALID_REF");if(!e?.isDirectory())throw new l("IO_ERROR");return {path:n,real:await tn(n),dev:e.dev,ino:e.ino}}async function lo(n,e){let t=await _e(e);if(!Qe(n,t.real))throw new l("INVALID_REF");return t}async function nn(n){let e=await _e(n.path);if(e.real!==n.real||e.dev!==n.dev||e.ino!==n.ino)throw new l("INVALID_REF")}async function po(n,e,t){let r=await tn(e);if(!Qe(n,r))throw new l("INVALID_REF");let o=await co(r);if(o.dev!==t.dev||o.ino!==t.ino)throw new l("INVALID_REF")}async function tt(n,e){try{return await Zr(n,e|fs.constants.O_NOFOLLOW)}catch(t){throw t.code==="ELOOP"?new l("INVALID_REF"):new l("IO_ERROR")}}async function tn(n){try{return await rt(n)}catch{throw new l("IO_ERROR")}}function rt(n){return new Promise((e,t)=>{fs.realpath.native(n,(r,o)=>r?t(r):e(o));})}async function rn(n){try{return await Qr(n)}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return [];throw new l("IO_ERROR")}}async function on(n){try{return await Kr(n)}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return;throw new l("IO_ERROR")}}async function co(n){try{return await no(n)}catch{throw new l("IO_ERROR")}}function fo(n){return new Uint8Array(n.buffer,n.byteOffset,n.byteLength)}function yo(n){try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(n)}catch{throw new l("IO_ERROR")}}var it=util.promisify(fs.realpath.native),st="CREWX_APP_FILES_ROOT";function _o(n,e={}){return {async list(t={}){let r=Ln(t.prefix),o=t.after===void 0||t.after===null?void 0:le(t.after),i=await sn(n,e);return an(n,e).list(i,r,o)},async read(t){let r=le(t),o=await sn(n,e);return an(n,e).read(o,r)},async write(t,r,o){let i=le(t),s=vn(r),a=jn(o),d=await sn(n,e);return an(n,e).write(d,i,s,a)}}}async function sn(n,e){let t=await So(n.workspaceRoot),r=(e.env??process.env)[st]??e.filesRoot;if(r!==void 0)return {workspaceReal:t,segments:Eo(r)};let o=e.packageDir??process.cwd(),i=await zn(o);if(i.appId===void 0)throw new l("IO_ERROR");let s=Wn({appId:i.appId,origin:e.origin??"not_installed",source:e.source??"workspace",packageRelativePath:await wo(t,o),declared:i.declared});return {workspaceReal:t,segments:s.segments}}function Eo(n){let e=be(n);if(e===void 0)throw new l("IO_ERROR");return e}function an(n,e){let t=path.join(e.crewxHome??Ke(),fe);return new he({},{lockDir:t,lockWaitMs:Oo(n)})}function Oo(n){let e;try{e=n.context?.nowMs;}catch{e=void 0;}return typeof e!="number"||!Number.isSafeInteger(e)?ee:Math.max(0,e+ee-Date.now())}async function wo(n,e){let t;try{t=await it(e);}catch{return}let r=path.relative(n,t);if(!(r===""||r===".."||r.startsWith(`..${path.sep}`)||path.isAbsolute(r)))return r.split(path.sep).join("/")}async function So(n){try{return await it(n)}catch{throw new l("IO_ERROR")}}var Ee=2,Oe=2097152;var H=2*1024*1024,we=2e4;function dn(n){return crypto.createHash("sha256").update(n).digest("hex")}function Se(n){if(n.byteLength===0)return 0;let e=0;for(let t of n)t===10&&(e+=1);return n[n.byteLength-1]!==10&&(e+=1),e}var Io=Oe+1+H,To=64*1024,Co=10,Re={kind:"invalid"};function ko(n,e){try{let t=[],r=0;for(;;){let s=new Uint8Array(To),a=fs.readSync(n,s,0,s.length,null);if(a===0)break;if(r+=a,r>e)return;t.push(s.subarray(0,a));}let o=new Uint8Array(r),i=0;for(let s of t)o.set(s,i),i+=s.byteLength;return o}catch{return}}function Pe(n){return Jo(ko(n,Io))}function Jo(n){if(n===void 0)return Re;let e=n.indexOf(Co);if(n.byteLength<=Oe){let r=vo(Buffer.from(n.buffer,n.byteOffset,n.byteLength).toString("utf8"));if(r.ok&&!(e>=0&&x(r.value)&&r.value.schemaVersion===Ee))return {kind:"v1",value:r.value}}if(e<=0||e>Oe)return Re;let t;try{t=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(n.subarray(0,e)));}catch{return Re}return !x(t)||t.schemaVersion!==Ee?Re:{kind:"v2",header:t,body:n.subarray(e+1)}}var No="actionId,content,input,schemaVersion,state",Do="bytes,lines,mediaType,sha256",xo="mediaType,range",Fo=/^[a-f0-9]{64}$/u,Lo=new TextDecoder("utf-8",{fatal:true,ignoreBOM:true});function ut(n,e){let t=d=>({code:d,outcome:"rejected"});if(te(n)!==No||n.schemaVersion!==Ee||typeof n.actionId!="string"||!x(n.input)||!x(n.state)||!x(n.content)||te(n.content)!=="in,out")return {code:"INPUT_INVALID",outcome:"failed"};let r=n.content,o,i=r.in;if(i===null){if(e.byteLength!==0)return t(e.byteLength>H?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH")}else {if(!x(i)||te(i)!==Do||!at(i.mediaType)||!dt(i.bytes,H)||!dt(i.lines,we)||typeof i.sha256!="string"||!Fo.test(i.sha256)||e.byteLength!==i.bytes)return t(e.byteLength>H?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH");if(dn(e)!==i.sha256||Se(e)!==i.lines)return t("CONTENT_DIGEST_MISMATCH");let d;try{d=Lo.decode(e);}catch{return t("CONTENT_ENCODING_INVALID")}o={mediaType:i.mediaType,text:d};}let s,a=r.out;if(a!==null){if(!x(a)||te(a)!==xo||!at(a.mediaType))return t("CONTENT_SOURCE_UNSUPPORTED");let d=a.range;if(d!==null&&!jo(d))return t("CONTENT_SOURCE_UNSUPPORTED");s={mediaType:a.mediaType,...d===null?{}:{range:{startLine:d.startLine,lineCount:d.lineCount}}};}return {actionId:n.actionId,input:n.input,state:n.state,content:{...o===void 0?{}:{in:o},...s===void 0?{}:{out:s}}}}function lt(n){return Object.hasOwn(n,"code")}function pt(n,e){let t=r=>({code:r,outcome:"rejected"});if(n?.in===void 0){if(e.in!==void 0)return t("CONTENT_SOURCE_UNSUPPORTED")}else if(e.in===void 0){if(n.in.required===true)return t("CONTENT_REQUIRED")}else if(e.in.mediaType!==n.in.mediaType)return t("CONTENT_SOURCE_UNSUPPORTED");if(n?.out===void 0){if(e.out!==void 0)return t("CONTENT_SOURCE_UNSUPPORTED")}else {if(e.out===void 0)return t("CONTENT_REQUIRED");if(e.out.mediaType!==n.out.mediaType||e.out.range!==void 0&&n.out.range!==true)return t("CONTENT_SOURCE_UNSUPPORTED")}}function Ie(n,e){let{content:t,...r}=n,o=e===void 0?r:{...r,content:{bytes:e.body.byteLength,lines:Se(e.body),sha256:dn(e.body),...e.range===void 0?{}:{range:e.range}}},i=new TextEncoder().encode(`${JSON.stringify(o)}
3
+ `);if(e===void 0)return i;let s=new Uint8Array(i.byteLength+e.body.byteLength);return s.set(i,0),s.set(e.body,i.byteLength),s}function ct(n){if(n.body.byteLength>H||Se(n.body)>we)return {code:"CONTENT_TOO_LARGE",outcome:"failed"}}function vo(n){try{return {ok:!0,value:JSON.parse(n)}}catch{return {ok:false}}}function te(n){return Object.keys(n).sort().join(",")}function x(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function at(n){return typeof n=="string"&&L.includes(n)}function dt(n,e){return Number.isSafeInteger(n)&&n>=0&&n<=e}function jo(n){return x(n)&&te(n)==="lineCount,startLine"&&Number.isSafeInteger(n.startLine)&&n.startLine>=1&&Number.isSafeInteger(n.lineCount)&&n.lineCount>=1&&n.lineCount<=we}var yt="CREWX_APP_JOB_CHANNEL",S=1,re=4096,pn=1e4,cn=5e3,fn=512,un=Object.freeze({min:3,max:16}),Mo=["APP_JOB_BRIDGE_UNAVAILABLE","APP_JOB_BRIDGE_INVALID","APP_JOB_BRIDGE_TIMEOUT","APP_JOB_BRIDGE_CLOSED"],ie=/^[A-Za-z0-9._:-]{1,128}$/u,Bo=64,At=2147483647,oe=class{#e="";#n=false;push(e){let t=[],r=e;for(;;){let o=r.indexOf(`
4
+ `);if(o===-1)return this.#n||(this.#e+=r,q(this.#e)>re&&(t.push({kind:"oversized"}),this.#e="",this.#n=true)),t;let i=r.slice(0,o);if(r=r.slice(o+1),this.#n){this.#n=false;continue}let s=this.#e+i;this.#e="",t.push(q(s)>re?{kind:"oversized"}:{kind:"line",line:s});}}};function ke(n){let e=JSON.stringify(n);if(q(e)>re)throw new TypeError("App job bridge message is over the line bound");return e}function Uo(n){let e=Je(n);if(e===void 0||e.v!==S||!mt(e.requestId)||!bt(e.seq))return;let t={v:S,requestId:e.requestId,seq:e.seq};switch(e.op){case "start":return E(e,["v","op","requestId","seq"],[])?{...t,op:"start"}:void 0;case "status":{if(!E(e,["v","op","requestId","seq"],["handle"]))return;if(e.handle===void 0)return {...t,op:"status"};let r=ln(e.handle);return r===void 0?void 0:{...t,op:"status",handle:r}}case "cancel":{if(!E(e,["v","op","requestId","seq","handle"],[]))return;let r=ln(e.handle);return r===void 0?void 0:{...t,op:"cancel",handle:r}}default:return}}function yn(n){let e=Je(n);if(e===void 0||e.v!==S||!mt(e.requestId)||!bt(e.seq))return;let t={v:S,requestId:e.requestId,seq:e.seq};if(e.ok===false)return E(e,["v","requestId","seq","ok","code"],[])&&Ue.includes(e.code)?{...t,ok:false,code:e.code}:void 0;if(e.ok===true)switch(e.op){case "start":{if(!E(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let r=Te(e.job),o=e.outcome;return r===void 0||o!=="started"&&o!=="attached"?void 0:{...t,ok:true,op:"start",outcome:o,job:r}}case "status":{if(!E(e,["v","requestId","seq","ok","op","job"],[]))return;if(e.job===null)return {...t,ok:true,op:"status",job:null};let r=Te(e.job);return r===void 0?void 0:{...t,ok:true,op:"status",job:r}}case "cancel":{if(!E(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let r=Te(e.job);return r===void 0||e.outcome!=="stopping"?void 0:{...t,ok:true,op:"cancel",outcome:"stopping",job:r}}default:return}}function Ho(n){let e=Je(n);if(e===void 0||e.v!==S||typeof e.runId!="string"||!ie.test(e.runId)||!De(e.generation))return;let t={v:S,runId:e.runId,generation:e.generation};switch(e.kind){case "heartbeat":return E(e,["v","kind","runId","generation"],[])?{...t,kind:"heartbeat"}:void 0;case "completed":return E(e,["v","kind","runId","generation"],[])?{...t,kind:"completed"}:void 0;case "progress":{if(!E(e,["v","kind","runId","generation","phase"],["completed","total","resumable"]))return;let{completed:r,total:o,resumable:i}=e;return !B(e.phase)||r!==void 0&&!Ce(r)||o!==void 0&&!Ce(o)||r!==void 0&&o!==void 0&&r>o||i!==void 0&&typeof i!="boolean"?void 0:{...t,kind:"progress",phase:e.phase,...r===void 0?{}:{completed:r},...o===void 0?{}:{total:o},...i===void 0?{}:{resumable:i}}}case "failed":return E(e,["v","kind","runId","generation","code","recoverable"],[])&&M(e.code)&&typeof e.recoverable=="boolean"?{...t,kind:"failed",code:e.code,recoverable:e.recoverable}:void 0;default:return}}function An(n){let e=Je(n);if(!(e===void 0||!E(e,["v","kind","runId","generation","reason"],[])||e.v!==S||e.kind!=="stop"||typeof e.runId!="string"||!ie.test(e.runId)||!De(e.generation)||!de.includes(e.reason)))return {v:S,kind:"stop",runId:e.runId,generation:e.generation,reason:e.reason}}function mn(n){let e=Ne(n)?n:void 0;if(!(e===void 0||e.v!==S||!Go(e.fd))){if(e.role==="control"){let t=e.operations;return !E(e,["v","role","fd","operations"],[])||!Array.isArray(t)||t.length===0||new Set(t).size!==t.length||!t.every(z)?void 0:{v:1,role:"control",fd:e.fd,operations:[...t]}}if(e.role==="run")return !E(e,["v","role","fd","runId","generation"],[])||typeof e.runId!="string"||!ie.test(e.runId)||!De(e.generation)?void 0:{v:1,role:"run",fd:e.fd,runId:e.runId,generation:e.generation}}}function bn(n){let e=n[yt];if(typeof e!="string"||q(e)>fn)return;let t;try{t=JSON.parse(e);}catch{return}return mn(t)}function qo(n){let e=mn(JSON.parse(JSON.stringify(n)));if(e===void 0)throw new TypeError("App job channel descriptor is invalid");let t=JSON.stringify(e);if(q(t)>fn)throw new TypeError("App job channel descriptor is over its bound");return Object.freeze({CREWX_APP_JOB_CHANNEL:t})}function Vo(n){return n==="schedule"?"schedule":"manual"}function Xo(n){return Te(n)}function Te(n){let e=Ne(n)?n:void 0;if(e===void 0||!E(e,["handle","state","stopReason","trigger","outcome","phase","completed","total","resumable","lastHeartbeatAt","startedAt","finishedAt","errorCode","recoverable"],[]))return;let t=ln(e.handle),r=e.stopReason,o=e.outcome,i=e.phase,s=e.errorCode,a=e.recoverable;if(!(t===void 0||!je.includes(e.state)||!(r===null||de.includes(r))||r!==null&&e.state!=="stopping"||!Be.includes(e.trigger)||!(o===null||Me.includes(o))||!(i===null||B(i))||!(e.completed===null||Ce(e.completed))||!(e.total===null||Ce(e.total))||typeof e.resumable!="boolean"||!ft(e.lastHeartbeatAt)||!gt(e.startedAt)||!ft(e.finishedAt)||!(s===null||M(s))||!(a===null||typeof a=="boolean")))return {handle:t,state:e.state,stopReason:r,trigger:e.trigger,outcome:o,phase:i,completed:e.completed,total:e.total,resumable:e.resumable,lastHeartbeatAt:e.lastHeartbeatAt,startedAt:e.startedAt,finishedAt:e.finishedAt,errorCode:s,recoverable:a}}function ln(n){if(!(!Ne(n)||!E(n,["runId","generation"],[]))&&!(typeof n.runId!="string"||!ie.test(n.runId)||!De(n.generation)))return {runId:n.runId,generation:n.generation}}function Je(n){if(q(n)>re)return;let e;try{e=JSON.parse(n);}catch{return}return Ne(e)?e:void 0}function E(n,e,t){let r=new Set([...e,...t]);return Object.keys(n).every(o=>r.has(o))&&e.every(o=>Object.hasOwn(n,o))}function Ne(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function mt(n){return typeof n=="string"&&ie.test(n)}function bt(n){return Number.isSafeInteger(n)&&n>=1&&n<=At}function De(n){return Number.isSafeInteger(n)&&n>=1&&n<=At}function Go(n){return Number.isSafeInteger(n)&&n>=un.min&&n<=un.max}function Ce(n){return Number.isSafeInteger(n)&&n>=0}function gt(n){return typeof n=="string"&&n.length>0&&n.length<=Bo}function ft(n){return n===null||gt(n)}function q(n){return new TextEncoder().encode(n).byteLength}var $o=2147483647,V=class{#e;#n;#l;#y=crypto.randomUUID();#A=new oe;#o=new Map;#s=new Set;#t;#p=0;#r=false;#c=false;#a=false;#d=null;constructor(e){this.#e=e.channel,this.#n=e.open??_t,this.#l=e.replyTimeoutMs??pn;}jobsFor(e){let t=this.#e;if(t.role!=="control"||e===void 0)return;let r=t.operations,o=ue.filter(s=>e.includes(s)&&r.includes(s));if(o.length===0)return;let i=s=>{if(!o.includes(s))throw new f("APP_JOB_NOT_GRANTED",null,{outcome:"rejected"})};return Object.freeze({granted:Object.freeze(o),start:async()=>{i("start");let s=await this.#u("start",{});if(s.ok===false)return {kind:"refused",code:s.code};if(s.op!=="start")throw new f("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:s.outcome,job:s.job}},status:async s=>{i("status");let a=await this.#u("status",s===void 0?{}:{handle:s});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="status")throw new f("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"status",job:a.job}},cancel:async s=>{i("cancel");let a=await this.#u("cancel",{handle:s});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="cancel")throw new f("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"stopping",job:a.job}}})}runFor(e){let t=this.#e;if(t.role!=="run"||!e)return;try{this.#f();}catch{return}let r={v:S,runId:t.runId,generation:t.generation},o=()=>this.#d,i=s=>{this.#r||this.#c||this.#t===void 0||this.#t.write(ke({...r,...s}));};return Object.freeze({handle:Object.freeze({runId:t.runId,generation:t.generation}),get stopRequested(){return o()!==null},get stopReason(){return o()},progress:s=>{if(!B(s.phase))throw new TypeError("progress phase must be a lower snake case name");if(s.completed!==void 0&&!ht(s.completed))throw new TypeError("progress completed must be a count");if(s.total!==void 0&&!ht(s.total))throw new TypeError("progress total must be a count");if(s.completed!==void 0&&s.total!==void 0&&s.completed>s.total)throw new TypeError("progress completed cannot exceed total");if(s.resumable!==void 0&&typeof s.resumable!="boolean")throw new TypeError("progress resumable must be boolean");this.#a||i({kind:"progress",phase:s.phase,...s.completed===void 0?{}:{completed:s.completed},...s.total===void 0?{}:{total:s.total},...s.resumable===void 0?{}:{resumable:s.resumable}});},heartbeat:()=>{this.#a||i({kind:"heartbeat"});},complete:()=>{i({kind:"completed"}),this.#a=true;},fail:(s,a)=>{if(!M(s))throw new TypeError("fail code must be an upper snake case code");if(typeof a!="boolean")throw new TypeError("fail recoverable must be boolean");i({kind:"failed",code:s,recoverable:a}),this.#a=true;},onStop:s=>{let a=o();return a!==null?(s(a),()=>{}):(this.#s.add(s),()=>{this.#s.delete(s);})}})}close(){this.#i("APP_JOB_BRIDGE_CLOSED");}async drain(e=cn){if(this.#r)return;this.#c=true;let t=this.#t,r;try{if(t!==void 0){let o;try{o=t.drain();}catch{o=Promise.resolve();}await Promise.race([o.catch(()=>{}),new Promise(i=>{r=setTimeout(i,e);})]);}}finally{clearTimeout(r),this.close();}}#u(e,t){let r=this.#f(),o=this.#p+1;if(o>$o)throw new f("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});this.#p=o;let i=`${this.#y}.${o}`,s=ke({v:S,op:e,requestId:i,seq:o,...t});return new Promise((a,d)=>{let p=setTimeout(()=>this.#i("APP_JOB_BRIDGE_TIMEOUT"),this.#l);this.#o.set(o,{op:e,requestId:i,resolve:a,reject:d,timer:p}),r.write(s);})}#f(){if(this.#r)throw new f("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});if(this.#t!==void 0)return this.#t;let e;try{e=this.#n(this.#e.fd);}catch{throw new f("APP_JOB_BRIDGE_UNAVAILABLE",null,{outcome:"failed"})}return e.onData(t=>this.#m(t)),e.onEnd(()=>this.#i("APP_JOB_BRIDGE_CLOSED")),this.#t=e,e}#m(e){for(let t of this.#A.push(e)){if(this.#r)return;if(this.#e.role==="run")t.kind==="line"&&this.#g(t.line);else if(t.kind==="oversized"){this.#i("APP_JOB_BRIDGE_INVALID");return}else this.#b(t.line);}}#b(e){let t=yn(e),r=t===void 0?void 0:this.#o.get(t.seq);if(t===void 0||r===void 0||r.requestId!==t.requestId||t.ok&&t.op!==r.op){this.#i("APP_JOB_BRIDGE_INVALID");return}clearTimeout(r.timer),this.#o.delete(t.seq),r.resolve(t);}#g(e){let t=this.#e;if(t.role!=="run")return;let r=An(e);if(!(r===void 0||r.runId!==t.runId||r.generation!==t.generation)&&this.#d===null){this.#d=r.reason;for(let o of [...this.#s])try{o(r.reason);}catch{}}}#i(e){if(this.#r)return;this.#r=true;let t=[...this.#o.values()];this.#o.clear();for(let o of t)clearTimeout(o.timer),o.reject(new f(e,null,{outcome:"failed"}));this.#s.clear();let r=this.#t;this.#t=void 0,r?.close();}};function _t(n){let e=new net.Socket({fd:n,readable:true,writable:true});return e.setEncoding("utf8"),e.on("error",()=>{}),{write:t=>{e.write(`${t}
5
+ `);},drain:()=>new Promise(t=>{if(e.destroyed){t();return}e.write("",()=>t());}),onData:t=>{e.on("data",t);},onEnd:t=>{e.on("close",t);},close:()=>{e.destroy();}}}function ht(n){return Number.isSafeInteger(n)&&n>=0}var Yo=1;async function Zo(n,e,t=process.env.CREWX_WORKSPACE_ROOT??process.cwd(),r){return (await wt(n,e,t,void 0,true,void 0,r)).response}async function wt(n,e,t,r,o=true,i,s,a){let d=i!==void 0,p=O(e)?e:void 0,c=p?.input,y=p?.state,u=new n({state:O(y)?y:{},workspaceRoot:t,...s===void 0?{}:{context:s}}),b=O(c)?c:{},A=O(y)?y:u.emptyState(),m={},P=p!==void 0&&Object.hasOwn(p,"schedule"),I;try{let _;if(d){if(p===void 0||P)throw new f("INPUT_INVALID");let w=ut(p,i);if(lt(w))throw new f(w.code,null,{outcome:w.outcome});(({actionId:_,input:b,state:A}=w)),m=w.content;}else {let w=P&&p!==void 0?In(p.schedule):void 0;if(!p||Object.keys(p).length!==(P?5:4)||!["schemaVersion","actionId","input","state"].every(Rt=>Object.hasOwn(p,Rt))||p.schemaVersion!==Yo||typeof p.actionId!="string"||!O(c)||!O(y)||P&&w===void 0)throw new f("INPUT_INVALID");_=p.actionId,b=c,A=y,I=w;}let h=K(n).find(({options:w})=>w.name===_),N=h===void 0?void 0:a?.jobsFor(h.options.jobAccess),T=h===void 0?void 0:a?.runFor(h.options.job!==void 0);if(u=new n({state:A,workspaceRoot:t,...s===void 0?{}:{context:s},...I===void 0?{}:{schedule:I},...N===void 0?{}:{jobs:N},...T===void 0?{}:{jobRun:T}}),await u.validate(_,b,A),!h)throw new f("INPUT_INVALID");if(I!==void 0&&(h.options.content!==void 0||!Jn(n)))throw new f("INPUT_INVALID");let X=u[h.methodName];if(typeof X!="function")throw new f("EXECUTION_FAILED");let F=pt(h.options.content,m);if(F)throw new f(F.code,null,{outcome:F.outcome});if(h.options.job!==void 0&&T===void 0)throw new f(He,null,{outcome:"rejected"});let se=Object.freeze({...m.in===void 0?{}:{in:Object.freeze({text:m.in.text})},...m.out===void 0?{}:{out:Object.freeze(m.out.range===void 0?{}:{range:Object.freeze({...m.out.range})})}}),G=()=>X.call(u,b,se),C=o?await ti(G):await G();if(C!==void 0&&!O(C))throw new f("EXECUTION_FAILED");let k;if(m.out!==void 0){if(k=u.producedContent,k===void 0)throw new f("EXECUTION_FAILED","content.out was requested but setContent was never called");let w=ct(k);if(w)throw new f(w.code,null,{outcome:w.outcome})}else if(u.didSetContent)throw new f("EXECUTION_FAILED","setContent was called but the request asked for no content.out");let En=u.didRequestSchedule;return {response:{...u.didSetState?{state:u.state}:{},...C===void 0?{}:{result:C},...En===void 0?{}:{schedule:{enabled:En.enabled}}},...k===void 0?{}:{answer:k}}}catch(_){let h,N=_,T=_ instanceof f?_:void 0;if(T)h={code:T.code,detail:T.detail,outcome:T.outcome};else try{h=u.mapError(_);}catch(k){h={code:"EXECUTION_FAILED",detail:null},N=k;}let X=oi(h?.code),F=X?h.code:"EXECUTION_FAILED",se=typeof h?.detail=="string"?h.detail:null,G=X?Xe(h.outcome):"failed",C;try{C=u.errorState(F,se,{input:b,state:A});}catch(k){N=new AggregateError([N,k],"App error handling failed"),C=u.emptyState();}return r?.(F,N,{outcome:G,detail:se,expected:T!==void 0&&N===T}),{response:{outcome:G,errorCode:F,state:O(C)?C:u.emptyState()}}}}async function Qo(n,e={}){let t=ei(e.jobBridge);try{await ni(n,e,t);}finally{await t?.drain();}}function ei(n){if(n===null)return;if(n!==void 0)return new V(n);let e=bn(process.env);return e===void 0?void 0:new V({channel:e})}async function ni(n,e,t){let r=e.output??process.stdout,o,i;if(e.preloadedInput!==void 0)o=e.preloadedInput.value,i=e.preloadedInput.body;else {let u=Pe(e.inputFd??0);u.kind==="v1"?o=u.value:u.kind==="v2"&&(o=u.header,i=u.body);}let s=i!==void 0,a=e.context??Ge(),d=false,p=(u,b,A)=>{d=true,e.onFailure?.(u,b,A);},c;try{c=await wt(n,o,process.env.CREWX_WORKSPACE_ROOT??process.cwd(),p,e.consoleManaged!==!0,i,a,t);}catch(u){p("EXECUTION_FAILED",u),c={response:Et(e.emptyState)};}ri(c.response)&&!d&&p(c.response.errorCode,void 0,{outcome:c.response.outcome,detail:null,expected:false});let y;try{let u=(e.sanitize??Ot)(c.response);y=s?Ie(u,c.answer):`${JSON.stringify(u)}
6
+ `;}catch(u){p("EXECUTION_FAILED",u);let b=Et(e.emptyState);try{let A=(e.sanitize??Ot)(b);y=s?Ie(A):`${JSON.stringify(A)}
7
+ `;}catch(A){p("EXECUTION_FAILED",A),y=s?Ie(b):`${JSON.stringify(b)}
8
+ `;}}r.write(y);}async function ti(n){let e=["log","info","debug"],t=new Map;for(let r of e)t.set(r,console[r]),console[r]=(...o)=>process.stderr.write(`${util.format(...o)}
9
+ `);try{return await n()}finally{for(let r of e)console[r]=t.get(r);}}function Et(n={}){return {outcome:"failed",errorCode:"EXECUTION_FAILED",state:{...n,error:{code:"EXECUTION_FAILED",detail:null}}}}function ri(n){return (n.outcome==="failed"||n.outcome==="rejected")&&typeof n.errorCode=="string"}function oi(n){return typeof n=="string"&&/^[A-Z][A-Z0-9_]{0,127}$/u.test(n)}function Ot(n){return n}var gn={depth:null,maxArrayLength:null,maxStringLength:null},_n=class extends stream.Writable{#e="buffer";#n=[];_write(e,t,r){if(this.#e==="buffer"){this.#n.push(typeof e=="string"?e:Uint8Array.from(e)),r();return}if(this.#e==="discard"){r();return}process.stderr.write(e,r);}flushToStderr(){this.#e="stderr";for(let e of this.#n)process.stderr.write(e);this.#n=[];}discard(){this.#e="discard",this.#n=[];}};async function ai(n,e={}){let t=process.stdout,r=t.write.bind(t),o=new _n,i=new console$1.Console({stdout:o,stderr:o,inspectOptions:{...gn}});globalThis.console=i;let s=false,a="-",d="-",p,c=false,y,u;try{let m=ui(e.inputFd??0);a=li(m.value),d=xe(process.env.CREWX_APP_REQUEST_ID),p=new Date().toISOString();try{y=await n();}catch(_){c=!0,u=_;}let P=y?.default;if(!c&&P?.devtools?.log===!0?(Object.assign(util.inspect.defaultOptions,gn),b(p),o.flushToStderr()):o.discard(),c){A("EXECUTION_FAILED",u),hn(r,e,A);return}try{if(typeof y?.runSkillApp!="function")throw new TypeError("App module does not export runSkillApp");let _={sanitize:e.sanitize,emptyState:e.emptyState??di(P),preloadedInput:m.body===void 0?{value:m.value}:{value:m.value,body:m.body},onFailure:A,consoleManaged:!0,output:{write:r},jobBridge:e.jobBridge};await y.runSkillApp(P,_);}catch(_){A("EXECUTION_FAILED",_),hn(r,e,A);}}catch(m){A("EXECUTION_FAILED",m),hn(r,e,A);}finally{process.exitCode=0;}function b(m){s||(process.stderr.write(`[crewx-app] ${m??new Date().toISOString()} ${xe(a)} req=${d}
10
+ `),s=true);}function A(m,P,I){b();let _=I?.expected===true&&I.detail?` ${xe(I.detail)}`:"";process.stderr.write(`[crewx-app] ${I?.outcome??"failed"} ${xe(m)}${_}
11
+ `),P!==void 0&&I?.expected!==true&&process.stderr.write(`${util.inspect(P,gn)}
12
+ `);}}function di(n){if(typeof n=="function")try{let t=new n({workspaceRoot:process.cwd()}).emptyState();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}catch{return}}function ui(n){let e=Pe(n);return e.kind==="v1"?{value:e.value}:e.kind==="v2"?{value:e.header,body:e.body}:{value:void 0}}function li(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)&&typeof n.actionId=="string"?n.actionId:"-"}function xe(n){return typeof n!="string"||n.length===0?"-":n.replace(/[\u0000-\u001f\u007f\u2028\u2029]/gu,"_")}function hn(n,e,t){let r={code:"EXECUTION_FAILED",detail:null},i={outcome:"failed",errorCode:"EXECUTION_FAILED",state:e.emptyState!==null&&typeof e.emptyState=="object"&&!Array.isArray(e.emptyState)?{...e.emptyState,error:r}:{error:r}},s=i;try{s=(e.sanitize??pi)(i);}catch(a){t("EXECUTION_FAILED",a);}n(`${JSON.stringify(s)}
13
+ `);}function pi(n){return n}exports.APP_FILES_ERROR_CODES=Fn;exports.APP_FILES_LIMITS=R;exports.APP_FILES_LOCK_SUBPATH=fe;exports.APP_FILES_ROOT_ENV=st;exports.APP_JOB_BRIDGE_CHANNEL_MAX_BYTES=fn;exports.APP_JOB_BRIDGE_DRAIN_TIMEOUT_MS=cn;exports.APP_JOB_BRIDGE_ENV=yt;exports.APP_JOB_BRIDGE_ERROR_CODES=Mo;exports.APP_JOB_BRIDGE_FD=un;exports.APP_JOB_BRIDGE_MAX_LINE_BYTES=re;exports.APP_JOB_BRIDGE_REPLY_TIMEOUT_MS=pn;exports.APP_JOB_BRIDGE_VERSION=S;exports.APP_JOB_CAPABILITY=Tn;exports.APP_JOB_CAPABILITY_VERSION=Cn;exports.APP_JOB_DEADLINE_MS=j;exports.APP_JOB_MAX_PER_APP=Lt;exports.APP_JOB_OPERATIONS=ue;exports.APP_JOB_OUTCOMES=Me;exports.APP_JOB_REFUSAL_CODES=Ue;exports.APP_JOB_RUN_REQUIRED=He;exports.APP_JOB_STATES=je;exports.APP_JOB_STOP_GRACE_MS=Ft;exports.APP_JOB_STOP_REASONS=de;exports.APP_JOB_TRIGGERS=Be;exports.APP_SCHEDULE_ACTOR_KIND=It;exports.APP_SCHEDULE_INERT_COMMAND=Tt;exports.APP_SCHEDULE_INSTANCE_PREFIX=Le;exports.APP_SCHEDULE_INTERVALS_MINUTES=W;exports.APP_SCHEDULE_MAX_PER_APP=Pt;exports.APP_SCHEDULE_PERIODIC_REASONS=wn;exports.APP_SCHEDULE_TIMEOUT_MS=v;exports.APP_TOOLS_FILE=Qt;exports.APP_TOOLS_SCHEMA_VERSION=er;exports.APP_TOOL_ENTRY=nr;exports.AppError=f;exports.AppFilesError=l;exports.AppJobBridge=V;exports.AppJobLineReader=oe;exports.CrewXApp=Ve;exports.SCHEDULE_TRIGGERS=Ct;exports.SKILL_BACKEND_ENV_NAMES=xn;exports.Tool=Ut;exports.acquireFileLock=ye;exports.appFiles=_o;exports.appFilesLockKeyOf=en;exports.appFilesRootSegmentsOf=be;exports.appJobTriggerForActor=Vo;exports.buildAppJobChannelEnvironment=qo;exports.encodeAppJobLine=ke;exports.executeAppRequest=Zo;exports.generateManifest=Ht;exports.generateToolDeclarations=Nn;exports.getToolDeclarations=K;exports.hasAppJobCapability=Mt;exports.isAppJobCode=M;exports.isAppJobDeadlineMs=qe;exports.isAppJobOperation=z;exports.isAppJobPhase=B;exports.isAppScheduleCode=Sn;exports.isAppScheduleIntervalMinutes=Rn;exports.isAppSchedulePeriodicReason=Pn;exports.isAppScheduleTimeoutMs=ve;exports.isSkillBackendEnv=tr;exports.normalizeAppFilesRef=Y;exports.openInheritedAppJobTransport=_t;exports.parseAppJobChannel=mn;exports.parseAppJobControlReply=yn;exports.parseAppJobControlRequest=Uo;exports.parseAppJobRunPush=An;exports.parseAppJobRunReport=Ho;exports.parseAppJobView=Xo;exports.readAppContext=Ge;exports.readAppJobChannel=bn;exports.releaseFileLock=Ae;exports.runAppEntry=ai;exports.runSkillApp=Qo;
@@ -30,14 +30,15 @@ export interface AppUiShareResult {
30
30
  readonly status: 'active';
31
31
  readonly viewer: 'app' | 'markdown';
32
32
  }
33
- export interface AppUiFileEntry {
33
+ export interface AppUiFileItem {
34
34
  readonly ref: string;
35
35
  readonly version: string;
36
36
  readonly bytes: number;
37
+ readonly modifiedAt: string;
37
38
  }
38
39
  export interface AppUiFilesListResult {
39
- readonly files: readonly AppUiFileEntry[];
40
- readonly next?: string;
40
+ readonly items: readonly AppUiFileItem[];
41
+ readonly next: string | null;
41
42
  }
42
43
  export interface AppUiFileReadResult {
43
44
  readonly ref: string;
@@ -67,3 +68,16 @@ export declare function readFile(app: AppUiToolCaller, input: {
67
68
  readonly ref: string;
68
69
  }): Promise<AppUiFileReadResult>;
69
70
  export declare function writeFile(app: AppUiToolCaller, input: AppUiWriteFileInput): Promise<AppUiFileWriteResult>;
71
+ export declare const CREWX_DOCUMENT_CHANGED: "ui/notifications/crewx-document-changed";
72
+ export interface AppUiDocumentChanged {
73
+ readonly ref: string;
74
+ readonly version: string | null;
75
+ }
76
+ export interface AppUiNotification {
77
+ readonly method: string;
78
+ readonly params?: unknown;
79
+ }
80
+ export interface AppUiNotificationSource {
81
+ fallbackNotificationHandler?(notification: AppUiNotification): Promise<void>;
82
+ }
83
+ export declare function onDocumentChanged(app: AppUiNotificationSource, handler: (params: AppUiDocumentChanged) => void): () => void;
@@ -1 +1 @@
1
- 'use strict';var i=class extends Error{code;constructor(e,t=e){super(t),this.name="CrewxAppToolError",this.code=e;}},u=1200*1e3;function g(r,e){return s(r,{name:"crewx_docs_share",arguments:{ref:e.ref}},{timeout:u,resetTimeoutOnProgress:true,onprogress:e.onprogress??(()=>{})})}function y(r,e={}){return s(r,{name:"crewx_files_list",arguments:{...e}})}function f(r,e){return s(r,{name:"crewx_files_read",arguments:{ref:e.ref}})}function A(r,e){return s(r,{name:"crewx_files_write",arguments:{ref:e.ref,text:e.text,expectedVersion:e.expectedVersion}})}async function s(r,e,t){let n=t===void 0?await r.callServerTool(e):await r.callServerTool(e,t);if(n.isError===true){let l=n.structuredContent?.error,o=a(l)?l:void 0,p=typeof o?.code=="string"?o.code:"TOOL_ERROR",d=typeof o?.message=="string"?o.message:p;throw new i(p,d)}if(!a(n.structuredContent))throw new i("TOOL_RESULT_INVALID",`${e.name} returned no structured result`);return n.structuredContent}function a(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}exports.CrewxAppToolError=i;exports.listFiles=y;exports.readFile=f;exports.share=g;exports.writeFile=A;
1
+ 'use strict';var p=class extends Error{code;constructor(r,n=r){super(n),this.name="CrewxAppToolError",this.code=r;}},g=1200*1e3;function x(e,r){return d(e,{name:"crewx_docs_share",arguments:{ref:r.ref}},{timeout:g,resetTimeoutOnProgress:true,onprogress:r.onprogress??(()=>{})})}function C(e,r={}){return d(e,{name:"crewx_files_list",arguments:{...r}})}function R(e,r){return d(e,{name:"crewx_files_read",arguments:{ref:r.ref}})}function T(e,r){return d(e,{name:"crewx_files_write",arguments:{ref:r.ref,text:r.text,expectedVersion:r.expectedVersion}})}var m="ui/notifications/crewx-document-changed",A=/^sha256:[0-9a-f]{64}$/,l=new WeakMap;function w(e,r){let n=l.get(e)??y(e),t=i=>r(i);return n.listeners.add(t),()=>{n.listeners.delete(t),n.listeners.size===0&&l.get(e)===n&&(l.delete(e),e.fallbackNotificationHandler===n.dispatch&&(e.fallbackNotificationHandler=n.previous));}}function y(e){let r=e.fallbackNotificationHandler,n=new Set,t=async o=>{if(o.method!==m){await r?.call(e,o);return}let s=U(o.params);if(s===void 0)return;let a;for(let u of [...n])try{u(s);}catch(f){a??={error:f};}if(a!==void 0)throw a.error},i={listeners:n,previous:r,dispatch:t};return l.set(e,i),e.fallbackNotificationHandler=t,i}function U(e){if(!c(e))return;let r=e.ref,n=e.version;if(!(typeof r!="string"||r.length===0)&&!(n!==null&&(typeof n!="string"||!A.test(n))))return {ref:r,version:n}}async function d(e,r,n){let t=n===void 0?await e.callServerTool(r):await e.callServerTool(r,n);if(t.isError===true){let i=t.structuredContent?.error,o=c(i)?i:void 0,s=typeof o?.code=="string"?o.code:"TOOL_ERROR",a=typeof o?.message=="string"?o.message:s;throw new p(s,a)}if(!c(t.structuredContent))throw new p("TOOL_RESULT_INVALID",`${r.name} returned no structured result`);return t.structuredContent}function c(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}exports.CREWX_DOCUMENT_CHANGED=m;exports.CrewxAppToolError=p;exports.listFiles=C;exports.onDocumentChanged=w;exports.readFile=R;exports.share=x;exports.writeFile=T;