@crewx/sdk 0.9.0-rc.18 → 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.
- package/README.md +1 -1
- package/dist/account/auth-client.d.ts +61 -0
- package/dist/account/auth-json-v2.d.ts +1 -0
- package/dist/account/auth-json.d.ts +30 -0
- package/dist/account/config.d.ts +37 -0
- package/dist/account/env-bootstrap.d.ts +11 -0
- package/dist/account/errors.d.ts +24 -0
- package/dist/account/index.d.ts +12 -0
- package/dist/account/index.js +2 -0
- package/dist/account/session-manager.d.ts +47 -0
- package/dist/activity-log/builder.d.ts +59 -6
- package/dist/agent/agent-list-view.d.ts +19 -0
- package/dist/agent-interceptor/chain.d.ts +25 -0
- package/dist/agent-interceptor/index.d.ts +6 -0
- package/dist/agent-interceptor/model-runner.d.ts +19 -0
- package/dist/agent-interceptor/program-runner.d.ts +13 -0
- package/dist/agent-interceptor/protocol.d.ts +68 -0
- package/dist/agent-interceptor/run-stop.d.ts +3 -0
- package/dist/agent-interceptor/schema.d.ts +267 -0
- package/dist/agent-interceptor/types.d.ts +88 -0
- package/dist/app/app-files/args.d.ts +12 -0
- package/dist/app/app-files/errors.d.ts +6 -0
- package/dist/app/app-files/index.d.ts +34 -0
- package/dist/app/app-files/lock.d.ts +26 -0
- package/dist/app/app-files/root.d.ts +22 -0
- package/dist/app/app-files/store.d.ts +47 -0
- package/dist/app/app-files/write.child.d.ts +1 -0
- package/dist/app/app.d.ts +167 -0
- package/dist/app/backend-env.d.ts +3 -0
- package/dist/app/content-media-types.d.ts +2 -0
- package/dist/app/context.d.ts +2 -0
- package/dist/app/entry.d.ts +9 -0
- package/dist/app/frame.d.ts +55 -0
- package/dist/app/index.d.ts +20 -0
- package/dist/app/index.js +13 -0
- package/dist/app/job-bridge.child.d.ts +1 -0
- package/dist/app/job-bridge.d.ts +67 -0
- package/dist/app/job-bridge.drain.child.d.ts +1 -0
- package/dist/app/job-bridge.example.d.ts +11 -0
- package/dist/app/job-contract.d.ts +40 -0
- package/dist/app/job-wire.d.ts +149 -0
- package/dist/app/protocol.d.ts +9 -0
- package/dist/app/runtime.d.ts +23 -0
- package/dist/app/schedule-contract.d.ts +59 -0
- package/dist/app/tool-mode.d.ts +3 -0
- package/dist/app-artifact-policy/check.d.ts +2 -0
- package/dist/app-artifact-policy/contract.d.ts +54 -0
- package/dist/app-artifact-policy/helper.d.ts +15 -0
- package/dist/app-artifact-policy/index.d.ts +3 -0
- package/dist/app-artifact-policy/index.js +18 -0
- package/dist/app-artifact-policy/paths.d.ts +24 -0
- package/dist/app-artifact-policy/scan.d.ts +47 -0
- package/dist/app-ui/index.d.ts +83 -0
- package/dist/app-ui/index.js +1 -0
- package/dist/boxing/box.types.d.ts +4 -0
- package/dist/config/canonicalize-agent-options.d.ts +18 -0
- package/dist/config/default-agent-models.d.ts +11 -0
- package/dist/config/global-settings.d.ts +33 -0
- package/dist/config/migrate-grok-mode.d.ts +6 -0
- package/dist/config/model-compat.d.ts +31 -0
- package/dist/config/models.generated.d.ts +37 -0
- package/dist/config/models.remote.d.ts +1 -0
- package/dist/config/overdrive.d.ts +7 -0
- package/dist/config/pricing.d.ts +6 -3
- package/dist/config/pricing.generated.d.ts +4 -0
- package/dist/config/pricing.types.d.ts +4 -0
- package/dist/config/timeout.config.d.ts +4 -0
- package/dist/config/wi-boards.d.ts +19 -0
- package/dist/context-budget/continuity.d.ts +63 -0
- package/dist/context-budget/index.d.ts +142 -0
- package/dist/conversation/index.d.ts +1 -1
- package/dist/conversation/sqlite-provider.d.ts +6 -3
- package/dist/conversation/to-template-messages.d.ts +9 -0
- package/dist/conversation/types.d.ts +58 -1
- package/dist/desktop/command-runner.d.ts +4 -0
- package/dist/desktop/default-adapters.d.ts +4 -0
- package/dist/desktop/global-install.d.ts +19 -0
- package/dist/desktop/index.d.ts +3 -0
- package/dist/desktop/index.js +3 -0
- package/dist/desktop/install.d.ts +5 -0
- package/dist/desktop/lnk.d.ts +22 -0
- package/dist/desktop/manifest.d.ts +21 -0
- package/dist/desktop/types.d.ts +67 -0
- package/dist/desktop/version.d.ts +1 -0
- package/dist/desktop/windows-paths.d.ts +21 -0
- package/dist/desktop/wrapper.d.ts +18 -0
- package/dist/esm/account/index.js +2 -0
- package/dist/esm/app/index.js +13 -0
- package/dist/esm/app-artifact-policy/index.js +18 -0
- package/dist/esm/desktop/index.js +3 -0
- package/dist/esm/index.js +1304 -224
- package/dist/esm/node/index.js +2 -0
- package/dist/esm/plugins/index.js +531 -214
- package/dist/esm/process/index.js +1 -0
- package/dist/esm/publish/index.js +2 -0
- package/dist/esm/repository/index.js +777 -207
- package/dist/esm/skills/index.js +2 -0
- package/dist/esm/testing/index.js +1 -1
- package/dist/events/types.d.ts +28 -0
- package/dist/facade/Crewx.d.ts +70 -5
- package/dist/facade/task-ticket.d.ts +14 -0
- package/dist/highlight/thread-highlight-prompt.d.ts +2 -0
- package/dist/highlight/thread-highlighter.d.ts +326 -0
- package/dist/index.browser.d.ts +25 -1
- package/dist/index.browser.js +6 -2
- package/dist/index.d.ts +164 -17
- package/dist/index.js +1304 -224
- package/dist/internal/console-decoder.d.ts +38 -0
- package/dist/internal/windows-spawn.d.ts +10 -0
- package/dist/layout/types.d.ts +18 -1
- package/dist/lifecycle/process-lease.d.ts +80 -0
- package/dist/lifecycle/process-owner.d.ts +20 -0
- package/dist/lifecycle/task-heartbeat.d.ts +41 -0
- package/dist/lifecycle/task-stop.d.ts +108 -0
- package/dist/lifecycle/update-admission.d.ts +45 -0
- package/dist/local-server/base-url.d.ts +18 -0
- package/dist/local-server/index.d.ts +8 -0
- package/dist/local-server/opencode.d.ts +8 -0
- package/dist/local-server/probe.d.ts +3 -0
- package/dist/local-server/runtime.d.ts +26 -0
- package/dist/local-server/types.d.ts +43 -0
- package/dist/mcp-app/agent-access.d.ts +26 -0
- package/dist/mcp-app/app-handoff.d.ts +109 -0
- package/dist/mcp-app/app-icon-read.d.ts +7 -0
- package/dist/mcp-app/app-job-bridge.d.ts +30 -0
- package/dist/mcp-app/app-job-bridge.example.d.ts +36 -0
- package/dist/mcp-app/app-job.d.ts +168 -0
- package/dist/mcp-app/app-schedule.d.ts +85 -0
- package/dist/mcp-app/apps-context.d.ts +32 -0
- package/dist/mcp-app/bundle-provenance.d.ts +3 -0
- package/dist/mcp-app/candidate-registration.d.ts +4 -0
- package/dist/mcp-app/card-handler.d.ts +7 -0
- package/dist/mcp-app/catalog.d.ts +7 -0
- package/dist/mcp-app/content-channel.d.ts +86 -0
- package/dist/mcp-app/content-declarations.d.ts +31 -0
- package/dist/mcp-app/dev-checks.d.ts +31 -0
- package/dist/mcp-app/diagnostic-reason.d.ts +3 -0
- package/dist/mcp-app/discovery.d.ts +164 -0
- package/dist/mcp-app/errors.d.ts +7 -0
- package/dist/mcp-app/index.d.ts +45 -0
- package/dist/mcp-app/installed-app-ref.d.ts +25 -0
- package/dist/mcp-app/model-context.d.ts +29 -0
- package/dist/mcp-app/node-app-discovery-fs.d.ts +23 -0
- package/dist/mcp-app/product-bundle-assets.d.ts +27 -0
- package/dist/mcp-app/product-bundle-loader.d.ts +53 -0
- package/dist/mcp-app/projection.d.ts +14 -0
- package/dist/mcp-app/prompt-cards.d.ts +28 -0
- package/dist/mcp-app/registry.d.ts +28 -0
- package/dist/mcp-app/skill-backend.d.ts +141 -0
- package/dist/mcp-app/state-set.d.ts +9 -0
- package/dist/mcp-app/types.d.ts +501 -0
- package/dist/mcp-app/workspace-app-assets.d.ts +42 -0
- package/dist/mcp-app/workspace-app-scan-cache.d.ts +27 -0
- package/dist/mcp-app/workspace-snapshot.d.ts +80 -0
- package/dist/migrations/0011_far_black_tarantula.sql +1 -0
- package/dist/migrations/0012_blue_turbo.sql +23 -0
- package/dist/migrations/0013_hesitant_adam_destine.sql +15 -0
- package/dist/migrations/0014_organic_mongu.sql +73 -0
- package/dist/migrations/0015_panoramic_gorilla_man.sql +71 -0
- package/dist/migrations/0016_fuzzy_hemingway.sql +14 -0
- package/dist/migrations/0017_project_stage_sdk_migration.sql +29 -0
- package/dist/migrations/0018_bored_jackal.sql +33 -0
- package/dist/migrations/0019_backfill_task_thread_ids.sql +74 -0
- package/dist/migrations/0020_useful_iron_lad.sql +55 -0
- package/dist/migrations/0021_dashing_peter_quill.sql +51 -0
- package/dist/migrations/0022_wandering_bucky.sql +1 -0
- package/dist/migrations/0023_red_payback.sql +1 -0
- package/dist/migrations/0024_storage_metadata.sql +262 -0
- package/dist/migrations/0025_task_heartbeat.sql +8 -0
- package/dist/migrations/0025_thread_app_instance_ledger.sql +2 -0
- package/dist/migrations/0026_mcp_action_source.sql +47 -0
- package/dist/migrations/0027_task_stop_scope_cleanup.sql +5 -0
- package/dist/migrations/0027_ui_instance_active_unique.sql +2 -0
- package/dist/migrations/0029_nice_rhino.sql +1 -0
- package/dist/migrations/0031_petite_arclight.sql +6 -0
- package/dist/migrations/0032_ui_instance_opened_by.sql +1 -0
- package/dist/migrations/0033_thread_creator_boundary_guard.sql +38 -0
- package/dist/migrations/0034_keen_fallen_one.sql +36 -0
- package/dist/migrations/0035_request_log_daily.sql +11 -0
- package/dist/migrations/0036_ui_definition_archive.sql +8 -0
- package/dist/migrations/0037_ui_instance_agent_open_request.sql +1 -0
- package/dist/migrations/0038_task_rating.sql +3 -0
- package/dist/migrations/0039_aspiring_purifiers.sql +9 -0
- package/dist/migrations/0040_task_provider_inputs.sql +53 -0
- package/dist/migrations/0041_tranquil_vivisector.sql +54 -0
- package/dist/migrations/0042_breezy_blue_shield.sql +31 -0
- package/dist/migrations/0043_nervous_darkstar.sql +1 -0
- package/dist/migrations/0044_military_galactus.sql +8 -0
- package/dist/migrations/0045_task_pid_started_at.sql +1 -0
- package/dist/migrations/0046_acoustic_karnak.sql +49 -0
- package/dist/migrations/0047_doc_sync_connect_requests.sql +18 -0
- package/dist/migrations/meta/0011_snapshot.json +1342 -0
- package/dist/migrations/meta/0012_snapshot.json +1494 -0
- package/dist/migrations/meta/0013_snapshot.json +1592 -0
- package/dist/migrations/meta/0014_snapshot.json +1975 -0
- package/dist/migrations/meta/0015_snapshot.json +2315 -0
- package/dist/migrations/meta/0016_snapshot.json +2419 -0
- package/dist/migrations/meta/0017_snapshot.json +2419 -0
- package/dist/migrations/meta/0018_snapshot.json +2570 -0
- package/dist/migrations/meta/0020_snapshot.json +2895 -0
- package/dist/migrations/meta/0021_snapshot.json +3031 -0
- package/dist/migrations/meta/0022_snapshot.json +3039 -0
- package/dist/migrations/meta/0023_snapshot.json +3047 -0
- package/dist/migrations/meta/0029_snapshot.json +3206 -0
- package/dist/migrations/meta/0031_snapshot.json +3251 -0
- package/dist/migrations/meta/0034_snapshot.json +3473 -0
- package/dist/migrations/meta/0035_snapshot.json +3547 -0
- package/dist/migrations/meta/0036_snapshot.json +3591 -0
- package/dist/migrations/meta/0037_snapshot.json +3598 -0
- package/dist/migrations/meta/0038_snapshot.json +3626 -0
- package/dist/migrations/meta/0039_snapshot.json +3684 -0
- package/dist/migrations/meta/0040_snapshot.json +3759 -0
- package/dist/migrations/meta/0041_snapshot.json +4156 -0
- package/dist/migrations/meta/0042_snapshot.json +4383 -0
- package/dist/migrations/meta/0043_snapshot.json +4390 -0
- package/dist/migrations/meta/0044_snapshot.json +4435 -0
- package/dist/migrations/meta/0045_snapshot.json +4442 -0
- package/dist/migrations/meta/0046_snapshot.json +4733 -0
- package/dist/migrations/meta/0047_snapshot.json +4832 -0
- package/dist/migrations/meta/_journal.json +259 -0
- package/dist/node/index.d.ts +1 -0
- package/dist/node/index.js +2 -0
- package/dist/paths.d.ts +1 -0
- package/dist/plugin/types.d.ts +1 -0
- package/dist/plugins/index.d.ts +1 -1
- package/dist/plugins/index.js +531 -214
- package/dist/plugins/sqlite-tracing.d.ts +46 -0
- package/dist/process/index.d.ts +2 -0
- package/dist/process/index.js +1 -0
- package/dist/process/process-control.d.ts +74 -0
- package/dist/prompt/tag-names.d.ts +22 -0
- package/dist/provider/acp/connection.d.ts +6 -0
- package/dist/provider/acp/meta.d.ts +11 -0
- package/dist/provider/bridge.d.ts +12 -2
- package/dist/provider/classify-task-error.d.ts +2 -0
- package/dist/provider/claude-agent-env.d.ts +1 -0
- package/dist/provider/cli/adapter.types.d.ts +23 -2
- package/dist/provider/cli/adapters/agent-call.util.d.ts +1 -1
- package/dist/provider/cli/adapters/cli-knob.util.d.ts +7 -0
- package/dist/provider/cli/adapters/codex-item.d.ts +1 -0
- package/dist/provider/cli/adapters/event-timestamp.util.d.ts +1 -0
- package/dist/provider/cli/adapters/grok.d.ts +2 -0
- package/dist/provider/cli/adapters/index.d.ts +5 -0
- package/dist/provider/cli/index.d.ts +3 -2
- package/dist/provider/cli/meta.d.ts +5 -0
- package/dist/provider/cli/protocol-envelope.d.ts +3 -0
- package/dist/provider/errors.d.ts +5 -1
- package/dist/provider/idle-watchdog.d.ts +19 -0
- package/dist/provider/models.d.ts +17 -12
- package/dist/provider/order.d.ts +1 -1
- package/dist/provider/parse-usage.d.ts +6 -0
- package/dist/provider/provider-selection.d.ts +8 -0
- package/dist/provider/redact-technical-message.d.ts +1 -0
- package/dist/provider/task-error.types.d.ts +17 -0
- package/dist/provider-account/accounts.d.ts +15 -0
- package/dist/provider-account/index.d.ts +5 -0
- package/dist/provider-account/registry.d.ts +30 -0
- package/dist/provider-account/types.d.ts +40 -0
- package/dist/publish/constants.d.ts +6 -0
- package/dist/publish/errors.d.ts +7 -0
- package/dist/publish/index.d.ts +55 -0
- package/dist/publish/index.js +2 -0
- package/dist/publish/manifest.d.ts +47 -0
- package/dist/publish/marketplace-api.constants.d.ts +1 -0
- package/dist/publish/pack.d.ts +6 -0
- package/dist/publish/scan.d.ts +10 -0
- package/dist/publish/secrets.d.ts +6 -0
- package/dist/publish/upload.d.ts +19 -0
- package/dist/remote/execution-profile.d.ts +9 -0
- package/dist/remote/index.d.ts +1 -0
- package/dist/remote/types.d.ts +28 -0
- package/dist/repository/agent-send-history.repository.d.ts +23 -0
- package/dist/repository/agent-suggestion.repository.d.ts +34 -0
- package/dist/repository/base-sqlite-repository.d.ts +1 -0
- package/dist/repository/common-code.repository.d.ts +45 -0
- package/dist/repository/db.d.ts +13 -1
- package/dist/repository/index.d.ts +62 -6
- package/dist/repository/index.js +777 -207
- package/dist/repository/logs-db.d.ts +12 -0
- package/dist/repository/notification.repository.d.ts +58 -0
- package/dist/repository/project.repository.d.ts +90 -0
- package/dist/repository/public-task-answer.d.ts +24 -0
- package/dist/repository/request-log-mover.d.ts +70 -0
- package/dist/repository/request-log.repository.d.ts +7 -3
- package/dist/repository/run-columns.d.ts +10 -0
- package/dist/repository/run-history.repository.d.ts +112 -0
- package/dist/repository/schedule-run.repository.d.ts +103 -0
- package/dist/repository/sidebar-tab.repository.d.ts +86 -0
- package/dist/repository/storage-metadata.repository.d.ts +64 -0
- package/dist/repository/task-log-migration.d.ts +74 -0
- package/dist/repository/task-log.repository.d.ts +47 -0
- package/dist/repository/task-status.d.ts +21 -0
- package/dist/repository/task.repository.d.ts +318 -8
- package/dist/repository/thread-history.repository.d.ts +193 -0
- package/dist/repository/thread-origin-verdict.d.ts +27 -0
- package/dist/repository/thread-title.types.d.ts +29 -0
- package/dist/repository/thread.repository.d.ts +134 -5
- package/dist/repository/usage-backfill.d.ts +62 -0
- package/dist/repository/usage-from-logs.d.ts +21 -0
- package/dist/repository/workflow-anchor-kinds.d.ts +4 -0
- package/dist/repository/workspace.repository.d.ts +3 -0
- package/dist/schema/agent-send-history.d.ts +85 -0
- package/dist/schema/agent-suggestions.d.ts +199 -0
- package/dist/schema/common-codes.d.ts +216 -0
- package/dist/schema/doc-sync-connect-requests.d.ts +140 -0
- package/dist/schema/doc-sync-links.d.ts +481 -0
- package/dist/schema/index.d.ts +20 -0
- package/dist/schema/notifications.d.ts +303 -0
- package/dist/schema/projects.d.ts +610 -0
- package/dist/schema/request-log-daily.d.ts +151 -0
- package/dist/schema/run-column-backfill.d.ts +81 -0
- package/dist/schema/schedule-runs.d.ts +451 -0
- package/dist/schema/sidebar-tabs.d.ts +466 -0
- package/dist/schema/storage-metadata.d.ts +181 -0
- package/dist/schema/task-log-events.d.ts +119 -0
- package/dist/schema/task-provider-inputs.d.ts +100 -0
- package/dist/schema/tasks.d.ts +1172 -1
- package/dist/schema/thread-creator-unverified.d.ts +45 -0
- package/dist/schema/thread-history.d.ts +734 -0
- package/dist/schema/threads.d.ts +59 -0
- package/dist/schema/ui-action-receipts.d.ts +358 -0
- package/dist/schema/ui-definition-archive.d.ts +63 -0
- package/dist/schema/ui-instance-repins.d.ts +222 -0
- package/dist/schema/ui-instances.d.ts +324 -0
- package/dist/schema/workspaces.d.ts +17 -0
- package/dist/skills/index.d.ts +15 -0
- package/dist/skills/index.js +2 -0
- package/dist/skills/types.d.ts +18 -0
- package/dist/task-log/anchor-child-tasks.d.ts +7 -0
- package/dist/task-log/delegation-trailer.d.ts +34 -0
- package/dist/template/engine.d.ts +2 -2
- package/dist/template/helpers/exec.browser.d.ts +4 -3
- package/dist/template/helpers/exec.d.ts +4 -3
- package/dist/template/helpers/format-conversation.d.ts +1 -0
- package/dist/template/types.d.ts +20 -0
- package/dist/testing/index.js +1 -1
- package/dist/types/index.d.ts +1611 -3
- package/dist/types/task-log.types.d.ts +6 -1
- package/dist/ui-card/index.d.ts +2 -0
- package/dist/ui-card/legacy-card-parser.d.ts +11 -0
- package/dist/ui-instance/definition.d.ts +6 -0
- package/dist/ui-instance/errors.d.ts +18 -0
- package/dist/ui-instance/index.d.ts +11 -0
- package/dist/ui-instance/json.d.ts +19 -0
- package/dist/ui-instance/lineage.d.ts +24 -0
- package/dist/ui-instance/runtime.d.ts +19 -0
- package/dist/ui-instance/store.d.ts +213 -0
- package/dist/ui-instance/types.d.ts +344 -0
- package/dist/ui-plugin/app-icon.d.ts +50 -0
- package/dist/ui-plugin/app-manifest.d.ts +64 -0
- package/dist/ui-plugin/csp.d.ts +28 -0
- package/dist/ui-plugin/index.d.ts +8 -0
- package/dist/ui-plugin/limits.d.ts +27 -0
- package/dist/ui-plugin/manifest.d.ts +3 -0
- package/dist/ui-plugin/types.d.ts +220 -0
- package/dist/ui-plugin/validator.d.ts +18 -0
- package/dist/utils/crewx-executable.d.ts +76 -0
- package/dist/utils/crewx-home.d.ts +1 -0
- package/dist/utils/env-defaults.d.ts +3 -0
- package/dist/utils/id.d.ts +1 -1
- package/dist/utils/local-identity.d.ts +2 -0
- package/dist/utils/runner-env.d.ts +3 -0
- package/dist/utils/timestamp.d.ts +1 -0
- package/dist/utils/workspace.d.ts +1 -0
- package/dist/wi/create.d.ts +48 -0
- package/dist/wi/select.d.ts +20 -0
- package/package.json +68 -3
- package/templates/agents/default.yaml +303 -128
- package/templates/documents/crewx-manual.md +138 -138
- package/templates/documents/crewx-quick-guide.md +8 -7
- package/templates/workflows/wi-default-flow.yaml +65 -0
- package/templates/workflows/wi-plan-flow.yaml +140 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { JsonObject } from './app.js';
|
|
2
|
+
import type { RunSkillAppOptions } from './runtime.js';
|
|
3
|
+
export interface AppEntryOptions {
|
|
4
|
+
readonly sanitize?: (value: unknown) => unknown;
|
|
5
|
+
readonly emptyState?: JsonObject;
|
|
6
|
+
readonly inputFd?: number;
|
|
7
|
+
readonly jobBridge?: RunSkillAppOptions['jobBridge'];
|
|
8
|
+
}
|
|
9
|
+
export declare function runAppEntry(importApp: () => Promise<unknown>, options?: AppEntryOptions): Promise<void>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { ContentRange, ContentRangeRequest, JsonObject } from './app.js';
|
|
2
|
+
import type { UiContentMediaType } from './protocol.js';
|
|
3
|
+
export declare const MAX_REQUEST_BYTES: number;
|
|
4
|
+
export type RequestFrame = {
|
|
5
|
+
readonly kind: 'v1';
|
|
6
|
+
readonly value: unknown;
|
|
7
|
+
} | {
|
|
8
|
+
readonly kind: 'v2';
|
|
9
|
+
readonly header: JsonObject;
|
|
10
|
+
readonly body: Uint8Array;
|
|
11
|
+
} | {
|
|
12
|
+
readonly kind: 'invalid';
|
|
13
|
+
};
|
|
14
|
+
export declare function readStdinBytes(fd: number, maxBytes: number): Uint8Array | undefined;
|
|
15
|
+
export declare function readRequestFrame(fd: number): RequestFrame;
|
|
16
|
+
export declare function parseRequestFrame(bytes: Uint8Array | undefined): RequestFrame;
|
|
17
|
+
export interface ContentRequest {
|
|
18
|
+
readonly in?: {
|
|
19
|
+
readonly mediaType: UiContentMediaType;
|
|
20
|
+
readonly text: string;
|
|
21
|
+
};
|
|
22
|
+
readonly out?: {
|
|
23
|
+
readonly mediaType: UiContentMediaType;
|
|
24
|
+
readonly range?: ContentRangeRequest;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export interface VerifiedFrame {
|
|
28
|
+
readonly actionId: string;
|
|
29
|
+
readonly input: JsonObject;
|
|
30
|
+
readonly state: JsonObject;
|
|
31
|
+
readonly content: ContentRequest;
|
|
32
|
+
}
|
|
33
|
+
export interface FrameFailure {
|
|
34
|
+
readonly code: string;
|
|
35
|
+
readonly outcome: 'failed' | 'rejected';
|
|
36
|
+
}
|
|
37
|
+
export declare function verifyRequestFrame(header: JsonObject, body: Uint8Array): VerifiedFrame | FrameFailure;
|
|
38
|
+
export declare function isFrameFailure(value: VerifiedFrame | FrameFailure): value is FrameFailure;
|
|
39
|
+
export interface DeclaredContent {
|
|
40
|
+
readonly in?: {
|
|
41
|
+
readonly mediaType: UiContentMediaType;
|
|
42
|
+
readonly required?: boolean;
|
|
43
|
+
};
|
|
44
|
+
readonly out?: {
|
|
45
|
+
readonly mediaType: UiContentMediaType;
|
|
46
|
+
readonly range?: boolean;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export declare function checkAgainstDeclaration(declared: DeclaredContent | undefined, request: ContentRequest): FrameFailure | undefined;
|
|
50
|
+
export interface AnswerContent {
|
|
51
|
+
readonly body: Uint8Array;
|
|
52
|
+
readonly range?: ContentRange;
|
|
53
|
+
}
|
|
54
|
+
export declare function encodeResponseFrame(header: JsonObject, answer?: AnswerContent): Uint8Array;
|
|
55
|
+
export declare function answerLimitFailure(answer: AnswerContent): FrameFailure | undefined;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { AppError, CrewXApp, Tool, generateManifest, generateToolDeclarations, getToolDeclarations, } from './app.js';
|
|
2
|
+
export type { AppContext, AppDefinition, AppErrorContext, AppErrorMapping, AppErrorOptions, AppFailureOutcome, AppRuntimeOptions, ContentRange, ContentRangeRequest, CrewXAppConstructor, DeepReadonly, JsonObject, JsonSchema, ToolContent, ToolContentDeclaration, ToolContentInput, ToolContentOutput, ToolDeclaration, ToolOptions, ToolResult, } from './app.js';
|
|
3
|
+
export { readAppContext } from './context.js';
|
|
4
|
+
export { APP_SCHEDULE_ACTOR_KIND, APP_SCHEDULE_INERT_COMMAND, APP_SCHEDULE_INSTANCE_PREFIX, APP_SCHEDULE_INTERVALS_MINUTES, APP_SCHEDULE_MAX_PER_APP, APP_SCHEDULE_PERIODIC_REASONS, APP_SCHEDULE_TIMEOUT_MS, SCHEDULE_TRIGGERS, isAppSchedulePeriodicReason, isAppScheduleCode, isAppScheduleIntervalMinutes, isAppScheduleTimeoutMs, } from './schedule-contract.js';
|
|
5
|
+
export type { AppScheduleDirective, AppScheduleIntervalMinutes, AppSchedulePeriodic, AppSchedulePeriodicReason, AppScheduleRunVerdict, AppScheduleSnapshot, AppScheduleStatus, ScheduleTrigger, ToolScheduleDeclaration, } from './schedule-contract.js';
|
|
6
|
+
export { APP_TOOLS_FILE, APP_TOOLS_SCHEMA_VERSION, APP_TOOL_ENTRY } from './tool-mode.js';
|
|
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';
|
|
10
|
+
export type { SkillBackendEnvName } from './backend-env.js';
|
|
11
|
+
export { executeAppRequest, runSkillApp } from './runtime.js';
|
|
12
|
+
export type { AppFailureInfo, RunSkillAppOptions } from './runtime.js';
|
|
13
|
+
export { runAppEntry } from './entry.js';
|
|
14
|
+
export type { AppEntryOptions } from './entry.js';
|
|
15
|
+
export { APP_JOB_CAPABILITY, APP_JOB_CAPABILITY_VERSION, APP_JOB_DEADLINE_MS, APP_JOB_MAX_PER_APP, APP_JOB_OPERATIONS, APP_JOB_OUTCOMES, APP_JOB_RUN_REQUIRED, APP_JOB_REFUSAL_CODES, APP_JOB_STATES, APP_JOB_STOP_GRACE_MS, APP_JOB_STOP_REASONS, APP_JOB_TRIGGERS, hasAppJobCapability, isAppJobCode, isAppJobDeadlineMs, isAppJobOperation, isAppJobPhase, } from './job-contract.js';
|
|
16
|
+
export type { AppJobCapabilityDeclaration, AppJobOperation, AppJobOutcome, AppJobRefusalCode, AppJobState, AppJobStopReason, AppJobTrigger, ToolJobDeclaration, } from './job-contract.js';
|
|
17
|
+
export { APP_JOB_BRIDGE_CHANNEL_MAX_BYTES, APP_JOB_BRIDGE_DRAIN_TIMEOUT_MS, APP_JOB_BRIDGE_ENV, APP_JOB_BRIDGE_ERROR_CODES, APP_JOB_BRIDGE_FD, APP_JOB_BRIDGE_MAX_LINE_BYTES, APP_JOB_BRIDGE_REPLY_TIMEOUT_MS, APP_JOB_BRIDGE_VERSION, AppJobLineReader, appJobTriggerForActor, buildAppJobChannelEnvironment, encodeAppJobLine, parseAppJobChannel, parseAppJobControlReply, parseAppJobControlRequest, parseAppJobRunPush, parseAppJobRunReport, parseAppJobView, readAppJobChannel, } from './job-wire.js';
|
|
18
|
+
export type { AppJobBridgeErrorCode, AppJobChannel, AppJobControlReply, AppJobControlRequest, AppJobLineEvent, AppJobRunPush, AppJobRunReport, AppJobView, AppJobWireHandle, } from './job-wire.js';
|
|
19
|
+
export { AppJobBridge, openInheritedAppJobTransport } from './job-bridge.js';
|
|
20
|
+
export type { AppJobBridgeOptions, AppJobLineTransport, AppJobProgress, AppJobRun, AppJobStartOutcome, AppJobStatusOutcome, AppJobStopOutcome, AppJobs, AppJobTransportOpener, } from './job-bridge.js';
|
|
@@ -0,0 +1,13 @@
|
|
|
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;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { type AppJobOperation, type AppJobRefusalCode, type AppJobStopReason } from './job-contract.js';
|
|
2
|
+
import { type AppJobChannel, type AppJobView, type AppJobWireHandle } from './job-wire.js';
|
|
3
|
+
export interface AppJobLineTransport {
|
|
4
|
+
write(line: string): void;
|
|
5
|
+
drain(): Promise<void>;
|
|
6
|
+
onData(listener: (chunk: string) => void): void;
|
|
7
|
+
onEnd(listener: () => void): void;
|
|
8
|
+
close(): void;
|
|
9
|
+
}
|
|
10
|
+
export type AppJobTransportOpener = (fd: number) => AppJobLineTransport;
|
|
11
|
+
export interface AppJobBridgeOptions {
|
|
12
|
+
readonly channel: AppJobChannel;
|
|
13
|
+
readonly open?: AppJobTransportOpener;
|
|
14
|
+
readonly replyTimeoutMs?: number;
|
|
15
|
+
}
|
|
16
|
+
export type AppJobStartOutcome = {
|
|
17
|
+
readonly kind: 'started' | 'attached';
|
|
18
|
+
readonly job: AppJobView;
|
|
19
|
+
} | {
|
|
20
|
+
readonly kind: 'refused';
|
|
21
|
+
readonly code: AppJobRefusalCode;
|
|
22
|
+
};
|
|
23
|
+
export type AppJobStatusOutcome = {
|
|
24
|
+
readonly kind: 'status';
|
|
25
|
+
readonly job: AppJobView | null;
|
|
26
|
+
} | {
|
|
27
|
+
readonly kind: 'refused';
|
|
28
|
+
readonly code: AppJobRefusalCode;
|
|
29
|
+
};
|
|
30
|
+
export type AppJobStopOutcome = {
|
|
31
|
+
readonly kind: 'stopping';
|
|
32
|
+
readonly job: AppJobView;
|
|
33
|
+
} | {
|
|
34
|
+
readonly kind: 'refused';
|
|
35
|
+
readonly code: AppJobRefusalCode;
|
|
36
|
+
};
|
|
37
|
+
export interface AppJobs {
|
|
38
|
+
readonly granted: readonly AppJobOperation[];
|
|
39
|
+
start(): Promise<AppJobStartOutcome>;
|
|
40
|
+
status(handle?: AppJobWireHandle): Promise<AppJobStatusOutcome>;
|
|
41
|
+
cancel(handle: AppJobWireHandle): Promise<AppJobStopOutcome>;
|
|
42
|
+
}
|
|
43
|
+
export interface AppJobProgress {
|
|
44
|
+
readonly phase: string;
|
|
45
|
+
readonly completed?: number;
|
|
46
|
+
readonly total?: number;
|
|
47
|
+
readonly resumable?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface AppJobRun {
|
|
50
|
+
readonly handle: AppJobWireHandle;
|
|
51
|
+
readonly stopRequested: boolean;
|
|
52
|
+
readonly stopReason: AppJobStopReason | null;
|
|
53
|
+
progress(report: AppJobProgress): void;
|
|
54
|
+
heartbeat(): void;
|
|
55
|
+
complete(): void;
|
|
56
|
+
fail(code: string, recoverable: boolean): void;
|
|
57
|
+
onStop(listener: (reason: AppJobStopReason) => void): () => void;
|
|
58
|
+
}
|
|
59
|
+
export declare class AppJobBridge {
|
|
60
|
+
#private;
|
|
61
|
+
constructor(options: AppJobBridgeOptions);
|
|
62
|
+
jobsFor(declared: readonly AppJobOperation[] | undefined): AppJobs | undefined;
|
|
63
|
+
runFor(isDeclaredJob: boolean): AppJobRun | undefined;
|
|
64
|
+
close(): void;
|
|
65
|
+
drain(timeoutMs?: number): Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
export declare function openInheritedAppJobTransport(fd: number): AppJobLineTransport;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CrewXApp, type AppDefinition, type JsonObject } from './index.js';
|
|
2
|
+
export declare const CODE_MAP_EXAMPLE_DEFINITION: AppDefinition;
|
|
3
|
+
export declare class CodeMapJobExample extends CrewXApp {
|
|
4
|
+
static definition: AppDefinition;
|
|
5
|
+
emptyState(): JsonObject;
|
|
6
|
+
analyze(): Promise<JsonObject>;
|
|
7
|
+
status(): Promise<JsonObject>;
|
|
8
|
+
cancel(): Promise<JsonObject>;
|
|
9
|
+
autoAnalyze(): Promise<JsonObject>;
|
|
10
|
+
analyzeRun(): Promise<JsonObject>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export declare const APP_JOB_DEADLINE_MS: Readonly<{
|
|
2
|
+
min: 60000;
|
|
3
|
+
max: 1800000;
|
|
4
|
+
default: 600000;
|
|
5
|
+
}>;
|
|
6
|
+
export declare const APP_JOB_STOP_GRACE_MS: Readonly<{
|
|
7
|
+
min: 1000;
|
|
8
|
+
max: 120000;
|
|
9
|
+
default: 30000;
|
|
10
|
+
}>;
|
|
11
|
+
export declare const APP_JOB_MAX_PER_APP = 1;
|
|
12
|
+
export declare const APP_JOB_CAPABILITY = "crewx/appJobs";
|
|
13
|
+
export declare const APP_JOB_CAPABILITY_VERSION = 1;
|
|
14
|
+
export declare const APP_JOB_STATES: readonly ["starting", "running", "stopping", "finished"];
|
|
15
|
+
export type AppJobState = (typeof APP_JOB_STATES)[number];
|
|
16
|
+
export declare const APP_JOB_OUTCOMES: readonly ["succeeded", "failed", "timed_out", "cancelled", "shutdown", "interrupted"];
|
|
17
|
+
export type AppJobOutcome = (typeof APP_JOB_OUTCOMES)[number];
|
|
18
|
+
export declare const APP_JOB_STOP_REASONS: readonly ["cancelled", "timed_out", "shutdown"];
|
|
19
|
+
export type AppJobStopReason = (typeof APP_JOB_STOP_REASONS)[number];
|
|
20
|
+
export declare const APP_JOB_TRIGGERS: readonly ["manual", "schedule"];
|
|
21
|
+
export type AppJobTrigger = (typeof APP_JOB_TRIGGERS)[number];
|
|
22
|
+
export declare const APP_JOB_PHASE_PATTERN: RegExp;
|
|
23
|
+
export declare const APP_JOB_CODE_PATTERN: RegExp;
|
|
24
|
+
export declare const APP_JOB_OPERATIONS: readonly ["start", "status", "cancel"];
|
|
25
|
+
export type AppJobOperation = (typeof APP_JOB_OPERATIONS)[number];
|
|
26
|
+
export declare const APP_JOB_REFUSAL_CODES: readonly ["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"];
|
|
27
|
+
export type AppJobRefusalCode = (typeof APP_JOB_REFUSAL_CODES)[number];
|
|
28
|
+
export declare const APP_JOB_RUN_REQUIRED: "APP_JOB_RUN_REQUIRED";
|
|
29
|
+
export interface ToolJobDeclaration {
|
|
30
|
+
readonly deadlineMs?: number;
|
|
31
|
+
}
|
|
32
|
+
export declare function isAppJobDeadlineMs(value: unknown): value is number;
|
|
33
|
+
export declare function isAppJobCode(value: unknown): value is string;
|
|
34
|
+
export declare function isAppJobPhase(value: unknown): value is string;
|
|
35
|
+
export declare function isAppJobOperation(value: unknown): value is AppJobOperation;
|
|
36
|
+
export interface AppJobCapabilityDeclaration {
|
|
37
|
+
readonly name: string;
|
|
38
|
+
readonly version: number;
|
|
39
|
+
}
|
|
40
|
+
export declare function hasAppJobCapability(advertised: readonly AppJobCapabilityDeclaration[] | undefined): boolean;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { type AppJobOperation, type AppJobOutcome, type AppJobRefusalCode, type AppJobState, type AppJobStopReason, type AppJobTrigger } from './job-contract.js';
|
|
2
|
+
export declare const APP_JOB_BRIDGE_ENV = "CREWX_APP_JOB_CHANNEL";
|
|
3
|
+
export declare const APP_JOB_BRIDGE_VERSION = 1;
|
|
4
|
+
export declare const APP_JOB_BRIDGE_MAX_LINE_BYTES = 4096;
|
|
5
|
+
export declare const APP_JOB_BRIDGE_REPLY_TIMEOUT_MS = 10000;
|
|
6
|
+
export declare const APP_JOB_BRIDGE_DRAIN_TIMEOUT_MS = 5000;
|
|
7
|
+
export declare const APP_JOB_BRIDGE_CHANNEL_MAX_BYTES = 512;
|
|
8
|
+
export declare const APP_JOB_BRIDGE_FD: Readonly<{
|
|
9
|
+
min: 3;
|
|
10
|
+
max: 16;
|
|
11
|
+
}>;
|
|
12
|
+
export declare const APP_JOB_BRIDGE_ERROR_CODES: readonly ["APP_JOB_BRIDGE_UNAVAILABLE", "APP_JOB_BRIDGE_INVALID", "APP_JOB_BRIDGE_TIMEOUT", "APP_JOB_BRIDGE_CLOSED"];
|
|
13
|
+
export type AppJobBridgeErrorCode = (typeof APP_JOB_BRIDGE_ERROR_CODES)[number];
|
|
14
|
+
export interface AppJobWireHandle {
|
|
15
|
+
readonly runId: string;
|
|
16
|
+
readonly generation: number;
|
|
17
|
+
}
|
|
18
|
+
export interface AppJobView {
|
|
19
|
+
readonly handle: AppJobWireHandle;
|
|
20
|
+
readonly state: AppJobState;
|
|
21
|
+
readonly stopReason: AppJobStopReason | null;
|
|
22
|
+
readonly trigger: AppJobTrigger;
|
|
23
|
+
readonly outcome: AppJobOutcome | null;
|
|
24
|
+
readonly phase: string | null;
|
|
25
|
+
readonly completed: number | null;
|
|
26
|
+
readonly total: number | null;
|
|
27
|
+
readonly resumable: boolean;
|
|
28
|
+
readonly lastHeartbeatAt: string | null;
|
|
29
|
+
readonly startedAt: string;
|
|
30
|
+
readonly finishedAt: string | null;
|
|
31
|
+
readonly errorCode: string | null;
|
|
32
|
+
readonly recoverable: boolean | null;
|
|
33
|
+
}
|
|
34
|
+
export type AppJobChannel = {
|
|
35
|
+
readonly v: 1;
|
|
36
|
+
readonly role: 'control';
|
|
37
|
+
readonly fd: number;
|
|
38
|
+
readonly operations: readonly AppJobOperation[];
|
|
39
|
+
} | {
|
|
40
|
+
readonly v: 1;
|
|
41
|
+
readonly role: 'run';
|
|
42
|
+
readonly fd: number;
|
|
43
|
+
readonly runId: string;
|
|
44
|
+
readonly generation: number;
|
|
45
|
+
};
|
|
46
|
+
export type AppJobControlRequest = {
|
|
47
|
+
readonly v: 1;
|
|
48
|
+
readonly op: 'start';
|
|
49
|
+
readonly requestId: string;
|
|
50
|
+
readonly seq: number;
|
|
51
|
+
} | {
|
|
52
|
+
readonly v: 1;
|
|
53
|
+
readonly op: 'status';
|
|
54
|
+
readonly requestId: string;
|
|
55
|
+
readonly seq: number;
|
|
56
|
+
readonly handle?: AppJobWireHandle;
|
|
57
|
+
} | {
|
|
58
|
+
readonly v: 1;
|
|
59
|
+
readonly op: 'cancel';
|
|
60
|
+
readonly requestId: string;
|
|
61
|
+
readonly seq: number;
|
|
62
|
+
readonly handle: AppJobWireHandle;
|
|
63
|
+
};
|
|
64
|
+
export type AppJobControlReply = {
|
|
65
|
+
readonly v: 1;
|
|
66
|
+
readonly requestId: string;
|
|
67
|
+
readonly seq: number;
|
|
68
|
+
readonly ok: true;
|
|
69
|
+
readonly op: 'start';
|
|
70
|
+
readonly outcome: 'started' | 'attached';
|
|
71
|
+
readonly job: AppJobView;
|
|
72
|
+
} | {
|
|
73
|
+
readonly v: 1;
|
|
74
|
+
readonly requestId: string;
|
|
75
|
+
readonly seq: number;
|
|
76
|
+
readonly ok: true;
|
|
77
|
+
readonly op: 'status';
|
|
78
|
+
readonly job: AppJobView | null;
|
|
79
|
+
} | {
|
|
80
|
+
readonly v: 1;
|
|
81
|
+
readonly requestId: string;
|
|
82
|
+
readonly seq: number;
|
|
83
|
+
readonly ok: true;
|
|
84
|
+
readonly op: 'cancel';
|
|
85
|
+
readonly outcome: 'stopping';
|
|
86
|
+
readonly job: AppJobView;
|
|
87
|
+
} | {
|
|
88
|
+
readonly v: 1;
|
|
89
|
+
readonly requestId: string;
|
|
90
|
+
readonly seq: number;
|
|
91
|
+
readonly ok: false;
|
|
92
|
+
readonly code: AppJobRefusalCode;
|
|
93
|
+
};
|
|
94
|
+
export type AppJobRunReport = {
|
|
95
|
+
readonly v: 1;
|
|
96
|
+
readonly kind: 'heartbeat';
|
|
97
|
+
readonly runId: string;
|
|
98
|
+
readonly generation: number;
|
|
99
|
+
} | {
|
|
100
|
+
readonly v: 1;
|
|
101
|
+
readonly kind: 'progress';
|
|
102
|
+
readonly runId: string;
|
|
103
|
+
readonly generation: number;
|
|
104
|
+
readonly phase: string;
|
|
105
|
+
readonly completed?: number;
|
|
106
|
+
readonly total?: number;
|
|
107
|
+
readonly resumable?: boolean;
|
|
108
|
+
} | {
|
|
109
|
+
readonly v: 1;
|
|
110
|
+
readonly kind: 'completed';
|
|
111
|
+
readonly runId: string;
|
|
112
|
+
readonly generation: number;
|
|
113
|
+
} | {
|
|
114
|
+
readonly v: 1;
|
|
115
|
+
readonly kind: 'failed';
|
|
116
|
+
readonly runId: string;
|
|
117
|
+
readonly generation: number;
|
|
118
|
+
readonly code: string;
|
|
119
|
+
readonly recoverable: boolean;
|
|
120
|
+
};
|
|
121
|
+
export interface AppJobRunPush {
|
|
122
|
+
readonly v: 1;
|
|
123
|
+
readonly kind: 'stop';
|
|
124
|
+
readonly runId: string;
|
|
125
|
+
readonly generation: number;
|
|
126
|
+
readonly reason: AppJobStopReason;
|
|
127
|
+
}
|
|
128
|
+
export type AppJobLineEvent = {
|
|
129
|
+
readonly kind: 'line';
|
|
130
|
+
readonly line: string;
|
|
131
|
+
} | {
|
|
132
|
+
readonly kind: 'oversized';
|
|
133
|
+
};
|
|
134
|
+
export declare class AppJobLineReader {
|
|
135
|
+
#private;
|
|
136
|
+
push(chunk: string): AppJobLineEvent[];
|
|
137
|
+
}
|
|
138
|
+
export declare function encodeAppJobLine(message: object): string;
|
|
139
|
+
export declare function parseAppJobControlRequest(line: string): AppJobControlRequest | undefined;
|
|
140
|
+
export declare function parseAppJobControlReply(line: string): AppJobControlReply | undefined;
|
|
141
|
+
export declare function parseAppJobRunReport(line: string): AppJobRunReport | undefined;
|
|
142
|
+
export declare function parseAppJobRunPush(line: string): AppJobRunPush | undefined;
|
|
143
|
+
export declare function parseAppJobChannel(value: unknown): AppJobChannel | undefined;
|
|
144
|
+
export declare function readAppJobChannel(env: Readonly<Record<string, string | undefined>>): AppJobChannel | undefined;
|
|
145
|
+
export declare function buildAppJobChannelEnvironment(channel: AppJobChannel): {
|
|
146
|
+
readonly CREWX_APP_JOB_CHANNEL: string;
|
|
147
|
+
};
|
|
148
|
+
export declare function appJobTriggerForActor(actorKind: 'user' | 'agent' | 'schedule'): AppJobTrigger;
|
|
149
|
+
export declare function parseAppJobView(value: unknown): AppJobView | undefined;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { UI_CONTENT_MEDIA_TYPES } from './content-media-types.js';
|
|
2
|
+
export type { UiContentMediaType } from './content-media-types.js';
|
|
3
|
+
export declare const SKILL_BACKEND_CONTENT_SCHEMA_VERSION: 2;
|
|
4
|
+
export declare const SKILL_BACKEND_MAX_INPUT_BYTES = 2097152;
|
|
5
|
+
export declare const SKILL_BACKEND_MAX_OUTPUT_BYTES = 2097152;
|
|
6
|
+
export declare const UI_CONTENT_MAX_BYTES: number;
|
|
7
|
+
export declare const UI_CONTENT_MAX_LINES = 20000;
|
|
8
|
+
export declare function sha256Content(bytes: Uint8Array): string;
|
|
9
|
+
export declare function countContentLines(bytes: Uint8Array): number;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type AppContext, type AppFailureOutcome, type CrewXAppConstructor, type JsonObject } from './app.js';
|
|
2
|
+
import { type AppJobBridgeOptions } from './job-bridge.js';
|
|
3
|
+
export interface AppFailureInfo {
|
|
4
|
+
readonly outcome: AppFailureOutcome;
|
|
5
|
+
readonly detail: string | null;
|
|
6
|
+
readonly expected: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface RunSkillAppOptions {
|
|
9
|
+
readonly sanitize?: (value: unknown) => unknown;
|
|
10
|
+
readonly inputFd?: number;
|
|
11
|
+
readonly output?: Pick<NodeJS.WriteStream, 'write'>;
|
|
12
|
+
readonly emptyState?: JsonObject;
|
|
13
|
+
readonly preloadedInput?: {
|
|
14
|
+
readonly value: unknown;
|
|
15
|
+
readonly body?: Uint8Array;
|
|
16
|
+
};
|
|
17
|
+
readonly onFailure?: (errorCode: string, error?: unknown, info?: AppFailureInfo) => void;
|
|
18
|
+
readonly consoleManaged?: boolean;
|
|
19
|
+
readonly context?: AppContext;
|
|
20
|
+
readonly jobBridge?: AppJobBridgeOptions | null;
|
|
21
|
+
}
|
|
22
|
+
export declare function executeAppRequest(appClass: CrewXAppConstructor, rawRequest: unknown, workspaceRoot?: string, context?: AppContext): Promise<JsonObject>;
|
|
23
|
+
export declare function runSkillApp(appClass: CrewXAppConstructor, options?: RunSkillAppOptions): Promise<void>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export declare const APP_SCHEDULE_INTERVALS_MINUTES: readonly [5, 15, 30, 60];
|
|
2
|
+
export type AppScheduleIntervalMinutes = (typeof APP_SCHEDULE_INTERVALS_MINUTES)[number];
|
|
3
|
+
export declare const APP_SCHEDULE_TIMEOUT_MS: Readonly<{
|
|
4
|
+
min: 15000;
|
|
5
|
+
max: 600000;
|
|
6
|
+
default: 300000;
|
|
7
|
+
}>;
|
|
8
|
+
export declare const APP_SCHEDULE_MAX_PER_APP = 1;
|
|
9
|
+
export declare const APP_SCHEDULE_INSTANCE_PREFIX = "schedule:";
|
|
10
|
+
export declare const APP_SCHEDULE_ACTOR_KIND = "schedule";
|
|
11
|
+
export declare const APP_SCHEDULE_INERT_COMMAND = "exit 78";
|
|
12
|
+
export declare const APP_SCHEDULE_PERIODIC_REASONS: readonly ["standby", "disabled", "draining", "degraded"];
|
|
13
|
+
export type AppSchedulePeriodicReason = (typeof APP_SCHEDULE_PERIODIC_REASONS)[number];
|
|
14
|
+
export declare const SCHEDULE_TRIGGERS: readonly ["cron", "cron_manual", "app_enable"];
|
|
15
|
+
export type ScheduleTrigger = (typeof SCHEDULE_TRIGGERS)[number];
|
|
16
|
+
export interface ToolScheduleDeclaration {
|
|
17
|
+
readonly everyMinutes: AppScheduleIntervalMinutes;
|
|
18
|
+
readonly timeoutMs?: number;
|
|
19
|
+
}
|
|
20
|
+
export type AppScheduleStatus = 'unset' | 'on' | 'off';
|
|
21
|
+
export type AppSchedulePeriodic = 'available' | 'unavailable';
|
|
22
|
+
export type AppScheduleRunVerdict = {
|
|
23
|
+
readonly outcome: 'success';
|
|
24
|
+
} | {
|
|
25
|
+
readonly outcome: 'failure';
|
|
26
|
+
readonly code: string;
|
|
27
|
+
};
|
|
28
|
+
export declare const APP_SCHEDULE_CODE_PATTERN: RegExp;
|
|
29
|
+
export declare function isAppScheduleCode(value: unknown): value is string;
|
|
30
|
+
export interface AppScheduleSnapshot {
|
|
31
|
+
readonly status: AppScheduleStatus;
|
|
32
|
+
readonly everyMinutes: AppScheduleIntervalMinutes;
|
|
33
|
+
readonly lastStartedAt: string | null;
|
|
34
|
+
readonly lastFinishedAt: string | null;
|
|
35
|
+
readonly lastOutcome: string | null;
|
|
36
|
+
readonly lastErrorCode: string | null;
|
|
37
|
+
readonly nextRunAt: string | null;
|
|
38
|
+
readonly periodic: AppSchedulePeriodic;
|
|
39
|
+
readonly periodicReason: AppSchedulePeriodicReason | null;
|
|
40
|
+
}
|
|
41
|
+
export interface AppScheduleDirective {
|
|
42
|
+
readonly enabled: boolean;
|
|
43
|
+
}
|
|
44
|
+
export type AppScheduleActorKind = 'user' | 'agent' | 'schedule';
|
|
45
|
+
export type ScheduleDirectiveDecision = {
|
|
46
|
+
readonly allow: true;
|
|
47
|
+
} | {
|
|
48
|
+
readonly allow: false;
|
|
49
|
+
readonly code: 'SCHEDULE_ENABLE_DENIED' | 'SCHEDULE_DIRECTIVE_UNSUPPORTED';
|
|
50
|
+
};
|
|
51
|
+
export declare function decideScheduleDirective(input: {
|
|
52
|
+
readonly actorKind: AppScheduleActorKind;
|
|
53
|
+
readonly directive: AppScheduleDirective;
|
|
54
|
+
}): ScheduleDirectiveDecision;
|
|
55
|
+
export declare function isAppScheduleIntervalMinutes(value: unknown): value is AppScheduleIntervalMinutes;
|
|
56
|
+
export declare function isAppScheduleTimeoutMs(value: unknown): value is number;
|
|
57
|
+
export declare function isAppSchedulePeriodicReason(value: unknown): value is AppSchedulePeriodicReason;
|
|
58
|
+
export declare function parseAppScheduleSnapshot(value: unknown): AppScheduleSnapshot | undefined;
|
|
59
|
+
export declare function parseAppScheduleDirective(value: unknown): AppScheduleDirective | undefined;
|