@crewx/sdk 0.9.0-rc.5 → 0.9.0-rc.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +1 -1
  2. package/dist/config/canonicalize-agent-options.d.ts +16 -0
  3. package/dist/config/global-settings.d.ts +19 -0
  4. package/dist/config/models.generated.d.ts +36 -0
  5. package/dist/config/models.remote.d.ts +4 -0
  6. package/dist/config/overdrive.d.ts +29 -0
  7. package/dist/config/pricing.d.ts +8 -8
  8. package/dist/config/pricing.generated.d.ts +2 -0
  9. package/dist/config/pricing.remote.d.ts +4 -0
  10. package/dist/config/pricing.types.d.ts +5 -0
  11. package/dist/config/timeout.config.d.ts +3 -0
  12. package/dist/config/wi-boards.d.ts +19 -0
  13. package/dist/desktop/command-runner.d.ts +4 -0
  14. package/dist/desktop/default-adapters.d.ts +4 -0
  15. package/dist/desktop/global-install.d.ts +19 -0
  16. package/dist/desktop/index.d.ts +2 -0
  17. package/dist/desktop/index.js +3 -0
  18. package/dist/desktop/install.d.ts +5 -0
  19. package/dist/desktop/lnk.d.ts +22 -0
  20. package/dist/desktop/manifest.d.ts +20 -0
  21. package/dist/desktop/types.d.ts +66 -0
  22. package/dist/desktop/version.d.ts +1 -0
  23. package/dist/desktop/windows-paths.d.ts +21 -0
  24. package/dist/desktop/wrapper.d.ts +18 -0
  25. package/dist/esm/desktop/index.js +3 -0
  26. package/dist/esm/index.js +149 -93
  27. package/dist/esm/plugins/index.js +118 -71
  28. package/dist/esm/publish/index.js +1 -0
  29. package/dist/esm/repository/index.js +122 -75
  30. package/dist/esm/testing/index.js +1 -1
  31. package/dist/events/types.d.ts +3 -0
  32. package/dist/facade/Crewx.d.ts +12 -0
  33. package/dist/index.browser.d.ts +4 -1
  34. package/dist/index.browser.js +6 -2
  35. package/dist/index.d.ts +26 -7
  36. package/dist/index.js +143 -87
  37. package/dist/internal/windows-spawn.d.ts +10 -0
  38. package/dist/migrations/0008_careful_black_bird.sql +17 -0
  39. package/dist/migrations/0009_hot_dark_phoenix.sql +1 -0
  40. package/dist/migrations/0010_analyze_stats.sql +6 -0
  41. package/dist/migrations/0011_far_black_tarantula.sql +1 -0
  42. package/dist/migrations/0012_blue_turbo.sql +23 -0
  43. package/dist/migrations/0013_hesitant_adam_destine.sql +15 -0
  44. package/dist/migrations/meta/0008_snapshot.json +1327 -0
  45. package/dist/migrations/meta/0009_snapshot.json +1335 -0
  46. package/dist/migrations/meta/0010_snapshot.json +1335 -0
  47. package/dist/migrations/meta/0011_snapshot.json +1342 -0
  48. package/dist/migrations/meta/0012_snapshot.json +1494 -0
  49. package/dist/migrations/meta/0013_snapshot.json +1592 -0
  50. package/dist/migrations/meta/_journal.json +42 -0
  51. package/dist/paths.d.ts +1 -0
  52. package/dist/plugin/types.d.ts +1 -0
  53. package/dist/plugins/index.js +118 -71
  54. package/dist/provider/acp/adapters/claude.d.ts +0 -4
  55. package/dist/provider/acp/connection.d.ts +4 -0
  56. package/dist/provider/acp/meta.d.ts +6 -0
  57. package/dist/provider/bridge.d.ts +13 -1
  58. package/dist/provider/classify-task-error.d.ts +2 -0
  59. package/dist/provider/cli/adapter.types.d.ts +1 -0
  60. package/dist/provider/cli/adapters/cli-knob.util.d.ts +2 -0
  61. package/dist/provider/cli/meta.d.ts +10 -2
  62. package/dist/provider/errors.d.ts +1 -0
  63. package/dist/provider/idle-watchdog.d.ts +19 -0
  64. package/dist/provider/models.d.ts +26 -0
  65. package/dist/provider/order.d.ts +1 -0
  66. package/dist/provider/parse-usage.d.ts +6 -0
  67. package/dist/provider/provider-selection.d.ts +8 -0
  68. package/dist/provider/redact-technical-message.d.ts +1 -0
  69. package/dist/provider/task-error.types.d.ts +16 -0
  70. package/dist/publish/auth-boundary.d.ts +22 -0
  71. package/dist/publish/auth-json.d.ts +11 -0
  72. package/dist/publish/constants.d.ts +6 -0
  73. package/dist/publish/index.d.ts +30 -0
  74. package/dist/publish/index.js +1 -0
  75. package/dist/publish/manifest.d.ts +17 -0
  76. package/dist/publish/marketplace-api.constants.d.ts +1 -0
  77. package/dist/publish/pack.d.ts +2 -0
  78. package/dist/publish/scan.d.ts +9 -0
  79. package/dist/publish/secrets.d.ts +6 -0
  80. package/dist/publish/upload.d.ts +18 -0
  81. package/dist/repository/agent-suggestion.repository.d.ts +34 -0
  82. package/dist/repository/index.d.ts +7 -1
  83. package/dist/repository/index.js +122 -75
  84. package/dist/repository/notification.repository.d.ts +58 -0
  85. package/dist/repository/task.repository.d.ts +79 -0
  86. package/dist/repository/thread.repository.d.ts +16 -2
  87. package/dist/repository/usage-report.repository.d.ts +27 -0
  88. package/dist/schema/agent-suggestions.d.ts +199 -0
  89. package/dist/schema/index.d.ts +3 -0
  90. package/dist/schema/notifications.d.ts +303 -0
  91. package/dist/schema/usage-reports.d.ts +252 -0
  92. package/dist/testing/index.d.ts +2 -0
  93. package/dist/testing/index.js +1 -1
  94. package/dist/types/index.d.ts +143 -3
  95. package/dist/utils/crewx-home.d.ts +1 -0
  96. package/dist/utils/id.d.ts +1 -1
  97. package/dist/wi/create.d.ts +48 -0
  98. package/dist/wi/select.d.ts +20 -0
  99. package/package.json +19 -3
  100. package/templates/agents/default.yaml +175 -117
  101. package/templates/documents/crewx-manual.md +138 -138
  102. package/templates/workflows/wi-default-flow.yaml +65 -0
  103. package/templates/workflows/wi-plan-flow.yaml +140 -0
@@ -1,3 +1,4 @@
1
+ import type { ProviderDefaultProfile } from '../models.js';
1
2
  import type { InitializeResponse, NewSessionResponse } from './types.js';
2
3
  export interface AcpProviderMetaResult {
3
4
  id: string;
@@ -12,6 +13,11 @@ export interface AcpProviderMetaResult {
12
13
  id: string;
13
14
  name?: string;
14
15
  }>;
16
+ modelOverrides?: Record<string, {
17
+ effort?: string[];
18
+ defaultEffort?: string;
19
+ }>;
20
+ defaults?: ProviderDefaultProfile;
15
21
  capabilities: Record<string, boolean>;
16
22
  }
17
23
  declare function extractProviderMeta(adapterId: string, displayName: string | undefined, initResponse: InitializeResponse, sessionResponse: NewSessionResponse): AcpProviderMetaResult;
@@ -3,8 +3,10 @@ export declare function parseStreamJsonOutput(raw: string): string;
3
3
  export declare function parseResultEventUsage(raw: string): ProviderUsage | null;
4
4
  export { ProviderError, IdleTimeoutError, TotalTimeoutError, type ProviderErrorCode, type ProviderErrorKind, type ProviderErrorOptions, } from './errors.js';
5
5
  export declare function shouldFallbackToGhCopilot(providerId: string, err: unknown, platform?: NodeJS.Platform): boolean;
6
+ export declare const KILL_GRACE_MS = 2000;
6
7
  export interface RunCliProcessOptions {
7
8
  timeoutMs?: number;
9
+ idleMs?: number;
8
10
  env?: Record<string, string>;
9
11
  cwd?: string;
10
12
  onOutput?: (line: string, level: 'stdout' | 'stderr') => void;
@@ -37,6 +39,11 @@ export declare class ClientToolCallRequiredError extends Error {
37
39
  constructor(toolCall: ClientToolCall, continuationState: ContinuationState);
38
40
  }
39
41
  export type ProviderFactory = (id: string, providerStr: string) => ProviderRuntime;
42
+ export type AdditionalArgsProvider = (ctx: {
43
+ providerStr: string;
44
+ providerId: string;
45
+ mode?: string;
46
+ }) => string[];
40
47
  export declare function registerProviderFactory(namespace: string, factory: ProviderFactory): void;
41
48
  export interface ProviderUsage {
42
49
  inputTokens: number;
@@ -62,6 +69,7 @@ export interface ProviderQueryOptions {
62
69
  env?: Record<string, string>;
63
70
  cwd?: string;
64
71
  timeoutMs?: number;
72
+ idleMs?: number;
65
73
  configOptions?: Record<string, string>;
66
74
  tools?: import('../facade/Crewx').ToolDefinition[];
67
75
  maxSteps?: number;
@@ -76,4 +84,8 @@ export interface ProviderRuntime {
76
84
  }>, options?: ProviderQueryOptions): Promise<string>;
77
85
  dispose?(): Promise<void>;
78
86
  }
79
- export declare function createProvider(providerStr: string): ProviderRuntime;
87
+ export declare function createProvider(providerStr: string, additionalArgsProvider?: AdditionalArgsProvider): ProviderRuntime;
88
+ export declare function mergeAdditionalArgs(options: ProviderQueryOptions | undefined, provider: AdditionalArgsProvider | undefined, ctx: {
89
+ providerStr: string;
90
+ providerId: string;
91
+ }): ProviderQueryOptions;
@@ -0,0 +1,2 @@
1
+ import type { TaskErrorProjection } from './task-error.types.js';
2
+ export declare function classifyTaskError(input: unknown): TaskErrorProjection;
@@ -13,6 +13,7 @@ export interface CliProviderAdapter {
13
13
  query?: number;
14
14
  execute?: number;
15
15
  };
16
+ defaultIdleMs?: number;
16
17
  capabilities?: {
17
18
  resume?: boolean;
18
19
  image?: boolean;
@@ -3,5 +3,7 @@ export declare function decodeModelEffort(model?: string): {
3
3
  effort?: string;
4
4
  };
5
5
  export declare function codexModeArgs(mode?: string): string[];
6
+ export declare function codexResumeModeArgs(mode?: string): string[];
6
7
  export declare function codexEffortArgs(effort?: string): string[];
7
8
  export declare function claudeModeArgs(mode?: string): string[];
9
+ export declare function claudeEffortArgs(effort?: string): string[];
@@ -1,4 +1,12 @@
1
1
  import type { AcpProviderMetaResult } from '../acp/meta.js';
2
2
  import type { CliProviderAdapter } from './adapter.types.js';
3
- export declare function cliAdapterMetaToProviderMeta(key: string, adapter: CliProviderAdapter): AcpProviderMetaResult | null;
4
- export declare function queryAllCliProviderMetas(): AcpProviderMetaResult[];
3
+ export declare function queryOpencodeModels(): Promise<Array<{
4
+ id: string;
5
+ }>>;
6
+ export declare function cliAdapterMetaToProviderMeta(key: string, adapter: CliProviderAdapter, overrideModels?: Array<{
7
+ id: string;
8
+ name?: string;
9
+ }>): AcpProviderMetaResult | null;
10
+ export declare function queryAllCliProviderMetas(options?: {
11
+ includeOpencodeRuntimeModels?: boolean;
12
+ }): Promise<AcpProviderMetaResult[]>;
@@ -10,6 +10,7 @@ export declare class ProviderError extends Error {
10
10
  readonly code: ProviderErrorCode;
11
11
  readonly kind?: ProviderErrorKind;
12
12
  readonly retryAfterMs?: number;
13
+ stdout?: string;
13
14
  constructor(message: string, providerStr: string, options?: ProviderErrorOptions);
14
15
  }
15
16
  export declare class IdleTimeoutError extends ProviderError {
@@ -0,0 +1,19 @@
1
+ export interface IdleWatchdogOptions {
2
+ timeoutMs: number;
3
+ onIdle: () => void;
4
+ now?: () => number;
5
+ }
6
+ export declare class IdleWatchdog {
7
+ private readonly timeoutMs;
8
+ private readonly onIdleCb;
9
+ private readonly now;
10
+ private timer;
11
+ private lastActivity;
12
+ private settled;
13
+ constructor(options: IdleWatchdogOptions);
14
+ start(): void;
15
+ refresh(): void;
16
+ stop(): void;
17
+ private scheduleCheck;
18
+ private fireIdle;
19
+ }
@@ -0,0 +1,26 @@
1
+ import { type ModelCatalogEntry, type ProviderCatalogEntry, type ProviderDefaultProfile, type ProviderModeEntry, type ProviderModelOverride } from '../config/models.generated.js';
2
+ export type { ModelCatalogEntry, ProviderCatalogEntry, ProviderDefaultProfile, ProviderDefaults, ProviderModeEntry, ProviderModelOverride, } from '../config/models.generated.js';
3
+ export declare function setModelsOverride(providers: Record<string, ProviderCatalogEntry | ModelCatalogEntry[]>): void;
4
+ export declare function clearModelsOverride(): void;
5
+ export declare function setModelsDefaultsOverride(providers: Record<string, ProviderDefaultProfile>): void;
6
+ export declare function clearModelsDefaultsOverride(): void;
7
+ export declare function getProviderModels(provider: string): ModelCatalogEntry[];
8
+ export declare function getProviderCatalog(provider: string): ProviderCatalogEntry;
9
+ export declare function getProviderDefaultProfile(provider: string): ProviderDefaultProfile | undefined;
10
+ export declare function getProviderModes(provider: string): ProviderModeEntry[];
11
+ export declare function getProviderEffort(provider: string, model?: string): string[];
12
+ export declare function getProviderModelOverrides(provider: string): Record<string, ProviderModelOverride>;
13
+ export declare function getClaudeModels(): ModelCatalogEntry[];
14
+ export declare function getCodexModels(): ModelCatalogEntry[];
15
+ export declare function getCopilotModels(): ModelCatalogEntry[];
16
+ export declare function getAntigravityModels(): ModelCatalogEntry[];
17
+ export declare function mergeModels(a: Array<{
18
+ id: string;
19
+ name?: string;
20
+ }>, b: Array<{
21
+ id: string;
22
+ name?: string;
23
+ }>): Array<{
24
+ id: string;
25
+ name?: string;
26
+ }>;
@@ -1,3 +1,4 @@
1
1
  export declare const PROVIDER_ORDER: readonly ["codex", "claude", "opencode", "antigravity", "copilot"];
2
2
  export declare function providerRank(id: string): number;
3
3
  export declare function compareProviders(a: string, b: string): number;
4
+ export declare function normalizeProviderId(provider?: string): string;
@@ -3,4 +3,10 @@ export interface ParsedUsage {
3
3
  outputTokens: number;
4
4
  cachedInputTokens: number;
5
5
  }
6
+ export interface ClaudePartialUsage {
7
+ inputTokens: number;
8
+ cachedInputTokens: number;
9
+ model?: string;
10
+ }
11
+ export declare function parseClaudePartialUsage(stdout: string): ClaudePartialUsage | undefined;
6
12
  export declare function parseUsage(stdout: string): ParsedUsage | undefined;
@@ -0,0 +1,8 @@
1
+ import type { CliProviderAdapter } from './cli/adapter.types.js';
2
+ export declare function lookupCliAdapter(providerStr: string): CliProviderAdapter | undefined;
3
+ export type ProviderAvailabilityDeps = {
4
+ lookupAdapter?: (providerStr: string) => CliProviderAdapter | undefined;
5
+ env?: NodeJS.ProcessEnv;
6
+ };
7
+ export declare function isProviderAvailable(providerStr: string, deps?: ProviderAvailabilityDeps): boolean;
8
+ export declare function selectAvailableProvider(providers: string | string[], deps?: ProviderAvailabilityDeps): string;
@@ -0,0 +1 @@
1
+ export declare function redactTechnicalMessage(value: unknown): string | undefined;
@@ -0,0 +1,16 @@
1
+ export type TaskErrorCode = 'USAGE_LIMITED' | 'CONTEXT_WINDOW_EXCEEDED' | 'INPUT_TOO_LARGE' | 'MODEL_NOT_SUPPORTED' | 'MODEL_AT_CAPACITY' | 'AUTH_REQUIRED' | 'CLI_NOT_AVAILABLE' | 'CLI_UPDATE_REQUIRED' | 'AGENT_NOT_FOUND' | 'PERMISSION_OR_TRUST' | 'TIMEOUT_OR_STUCK' | 'NETWORK_OR_PROVIDER_TRANSIENT' | 'PROVIDER_CONFIGURATION' | 'PROCESS_FAILED';
2
+ export interface TaskErrorMeta {
3
+ resetAt?: string | number;
4
+ model?: string;
5
+ cliName?: string;
6
+ envKey?: string;
7
+ upstreamType?: string;
8
+ upstreamCode?: string | number;
9
+ referenceId?: string;
10
+ technicalMessage?: string;
11
+ }
12
+ export interface TaskErrorProjection {
13
+ errorCode: TaskErrorCode | null;
14
+ errorProvider: string | null;
15
+ errorMeta?: TaskErrorMeta;
16
+ }
@@ -0,0 +1,22 @@
1
+ export type AccountAuthBoundaryErrorCode = 'ACCOUNT_USER_PAIR_MISSING' | 'ACCOUNT_USER_ISSUER_MISSING' | 'ACCOUNT_USER_ANON_KEY_MISSING' | 'ACCOUNT_ACCESS_TOKEN_INVALID' | 'ACCOUNT_TOKEN_ISSUER_MISMATCH' | 'ACCOUNT_TOKEN_SUB_MISMATCH' | 'ACCOUNT_AUTH_JSON_ISSUER_MISMATCH' | 'ACCOUNT_AUTH_JSON_SUB_MISMATCH';
2
+ export declare class AccountAuthBoundaryError extends Error {
3
+ readonly code: AccountAuthBoundaryErrorCode;
4
+ constructor(code: AccountAuthBoundaryErrorCode, message: string);
5
+ }
6
+ export interface UserAccountConfig {
7
+ issuer: string;
8
+ anonKey: string;
9
+ }
10
+ export declare function resolveUserAccountConfig(env?: Readonly<Record<string, string | undefined>>): UserAccountConfig;
11
+ export interface AccessTokenIdentity {
12
+ issuer: string;
13
+ sub: string;
14
+ }
15
+ export declare function decodeAccessTokenIdentity(accessToken: string): AccessTokenIdentity;
16
+ export declare function assertUserRealmAccessToken(accessToken: string, config: Pick<UserAccountConfig, 'issuer'>, expectedSub?: string): AccessTokenIdentity;
17
+ export interface AuthJsonIdentity {
18
+ issuer: string;
19
+ sub: string;
20
+ access_token: string;
21
+ }
22
+ export declare function assertAuthJsonUserRealm(auth: AuthJsonIdentity, config: Pick<UserAccountConfig, 'issuer'>): AccessTokenIdentity;
@@ -0,0 +1,11 @@
1
+ export interface AuthJson {
2
+ version: 1;
3
+ issuer: string;
4
+ sub: string;
5
+ email: string;
6
+ access_token: string;
7
+ refresh_token: string;
8
+ expires_at: number;
9
+ updated_at: string;
10
+ }
11
+ export declare function readAuthJson(): AuthJson;
@@ -0,0 +1,6 @@
1
+ export interface ExcludeRuleDef {
2
+ label: string;
3
+ test(basename: string, relPath: string, isDir: boolean): boolean;
4
+ }
5
+ export declare const EXCLUDE_RULES: ExcludeRuleDef[];
6
+ export declare function matchExclude(basename: string, relPath: string, isDir: boolean): string | null;
@@ -0,0 +1,30 @@
1
+ import type { ExcludedEntry } from './scan';
2
+ import type { SecretFinding } from './secrets';
3
+ import type { PublishManifest } from './manifest';
4
+ import { uploadToMarketplace } from './upload';
5
+ import type { PublishUploadOptions, PublishUploadResult } from './upload';
6
+ export interface PublishOptions {
7
+ version?: string;
8
+ }
9
+ export interface PublishPlan {
10
+ manifest: PublishManifest;
11
+ included: string[];
12
+ excluded: ExcludedEntry[];
13
+ secretFindings: SecretFinding[];
14
+ }
15
+ export declare function planPublish(dir: string, opts?: PublishOptions): Promise<PublishPlan>;
16
+ export declare function packTemplate(dir: string, opts?: PublishOptions): Promise<{
17
+ manifest: PublishManifest;
18
+ tgzPath: string;
19
+ }>;
20
+ export type { PublishManifest, ManifestFile, BuildManifestOptions } from './manifest';
21
+ export type { ExcludedEntry, ScanResult } from './scan';
22
+ export type { SecretFinding } from './secrets';
23
+ export { EXCLUDE_RULES } from './constants';
24
+ export { uploadToMarketplace };
25
+ export type { PublishUploadOptions, PublishUploadResult };
26
+ export { readAuthJson } from './auth-json';
27
+ export type { AuthJson } from './auth-json';
28
+ export { AccountAuthBoundaryError, assertAuthJsonUserRealm, assertUserRealmAccessToken, decodeAccessTokenIdentity, resolveUserAccountConfig, } from './auth-boundary';
29
+ export type { AccessTokenIdentity, AccountAuthBoundaryErrorCode, AuthJsonIdentity, UserAccountConfig, } from './auth-boundary';
30
+ export { MARKETPLACE_API_PREFIX } from './marketplace-api.constants';
@@ -0,0 +1 @@
1
+ 'use strict';var y=require('path'),d=require('fs'),G=require('crypto'),q=require('js-yaml'),O=require('os'),Y=require('tar'),zlib=require('zlib');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var y__namespace=/*#__PURE__*/_interopNamespace(y);var d__namespace=/*#__PURE__*/_interopNamespace(d);var G__namespace=/*#__PURE__*/_interopNamespace(G);var q__namespace=/*#__PURE__*/_interopNamespace(q);var O__namespace=/*#__PURE__*/_interopNamespace(O);var Y__namespace=/*#__PURE__*/_interopNamespace(Y);function ae(e){let t=n=>n.replace(/[.+^${}()|[\]\\]/g,"\\$&"),s=e.split("/").map(n=>n==="**"?".*":n.split("*").map(t).join("[^/]*"));return new RegExp(`^${s.join("\\/")}$`)}function E(e,t){try{return ae(t).test(e)}catch{return false}}function P(e,...t){let r=e.split("/");if(r.length<t.length)return false;let s=r.length-t.length;return t.every((n,i)=>E(r[s+i],n))}function ce(e,t){return e.split("/").some(r=>E(r,t))}var z=[{label:".env*",test:e=>E(e,".env*")},{label:".git/",test:(e,t,r)=>r&&e===".git"},{label:"memory/",test:(e,t,r)=>r&&e==="memory"},{label:"*.key",test:e=>E(e,"*.key")},{label:"*.pem",test:e=>E(e,"*.pem")},{label:"auth.json",test:e=>e==="auth.json"},{label:"node_modules/",test:(e,t,r)=>r&&e==="node_modules"},{label:"conversations/",test:(e,t,r)=>r&&e==="conversations"},{label:".crewx/threads/",test:(e,t,r)=>r&&P(t,".crewx","threads")},{label:".crewx/crewx.db",test:(e,t,r)=>!r&&P(t,".crewx","crewx.db")},{label:".crewx/*.log",test:(e,t,r)=>!r&&P(t,".crewx","*.log")},{label:".crewx/publish/",test:(e,t,r)=>r&&P(t,".crewx","publish")},{label:".crewx/",test:(e,t)=>ce(t,".crewx")}];function U(e,t,r){for(let s of z)if(s.test(e,t,r))return s.label;return null}function J(e){let t=[],r=[];function s(n,i,a){let m;try{m=d__namespace.readdirSync(n,{withFileTypes:!0});}catch{return}m.sort((c,u)=>c.name.localeCompare(u.name));for(let c of m){let u=i?`${i}/${c.name}`:c.name,l=y__namespace.join(n,c.name);if(c.isSymbolicLink()){let p;try{p=d__namespace.statSync(l);}catch{continue}if(p.isDirectory()){r.push({path:u,rule:a??"symlink-dir"});continue}let C=a??U(c.name,u,false);C?r.push({path:u,rule:C}):t.push(u);continue}if(c.isDirectory()){let p=a??U(c.name,u,true);s(l,u,p);continue}if(c.isFile()){let p=a??U(c.name,u,false);p?r.push({path:u,rule:p}):t.push(u);}}}return s(e,"",null),t.sort(),r.sort((n,i)=>n.path<i.path?-1:n.path>i.path?1:0),{included:t,excluded:r}}var ue=[{rule:"token-prefix",regex:/\b(?:sk-|ghp_|xoxb-)[A-Za-z0-9_-]{10,}/},{rule:"private-key",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----/},{rule:"aws-access-key",regex:/\bAKIA[0-9A-Z]{16}\b/}];function le(e){return e.includes(0)}function V(e,t){let r=[];for(let s of t){let n=y__namespace.join(e,s),i;try{i=d__namespace.readFileSync(n);}catch{continue}if(le(i))continue;i.toString("utf8").split(/\r\n|\r|\n/).forEach((m,c)=>{for(let{rule:u,regex:l}of ue)l.test(m)&&r.push({path:s,line:c+1,rule:u});});}return r}var X=/^[a-z0-9-]+$/,pe=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/,fe=/^[A-Za-z_][A-Za-z0-9_]*$/;function me(e){let t=y__namespace.join(e,"crewx.yaml");if(!d__namespace.existsSync(t))return {};let r;try{r=q__namespace.load(d__namespace.readFileSync(t,"utf8"));}catch{return {}}if(!r||typeof r!="object")return {};let s=r.metadata;if(!s||typeof s!="object")return {};let n=s;return {name:typeof n.name=="string"?n.name:void 0,version:typeof n.version=="string"?n.version:void 0,description:typeof n.description=="string"?n.description:void 0,requiredEnv:n.requiredEnv,crewxMinVersion:typeof n.crewxMinVersion=="string"?n.crewxMinVersion:void 0}}function he(e){return G__namespace.createHash("sha256").update(new Uint8Array(d__namespace.readFileSync(e))).digest("hex")}function W(e,t,r={}){let s=me(e),n=s.name??y__namespace.basename(e);if(!X.test(n))throw new Error(`publish: invalid name "${n}" \u2014 must match ${X} (lowercase letters, numbers, hyphen only)`);let i=r.version??s.version;if(!i)throw new Error("publish: version is required \u2014 set crewx.yaml metadata.version or pass opts.version");if(!pe.test(i))throw new Error(`publish: invalid version "${i}" \u2014 must be semver (e.g. 1.0.0)`);let a=Array.isArray(s.requiredEnv)?s.requiredEnv:[],m=[];for(let l of a){if(typeof l!="string"||!fe.test(l))throw new Error(`publish: requiredEnv must contain names only (no values), got "${String(l)}"`);m.push(l);}let c=t.map(l=>({path:l,sha256:he(y__namespace.join(e,l))})).sort((l,p)=>l.path<p.path?-1:l.path>p.path?1:0),u={name:n,version:i,type:"template",description:s.description??"",files:c,requiredEnv:m};return s.crewxMinVersion&&(u.crewxMinVersion=s.crewxMinVersion),u}async function Q(e,t){let r=y__namespace.join(e,".crewx","publish");d__namespace.mkdirSync(r,{recursive:true});let s=y__namespace.join(r,`${t.name}-${t.version}.tgz`),n=d__namespace.mkdtempSync(y__namespace.join(O__namespace.tmpdir(),"crewx-publish-"));try{d__namespace.writeFileSync(y__namespace.join(n,"manifest.json"),JSON.stringify(t,null,2));for(let i of t.files){let a=y__namespace.join(n,i.path);d__namespace.mkdirSync(y__namespace.dirname(a),{recursive:!0}),d__namespace.copyFileSync(y__namespace.join(e,i.path),a);}await Y__namespace.create({gzip:!0,file:s,cwd:n,portable:!0,noMtime:!0},["manifest.json",...t.files.map(i=>i.path)]);}finally{d__namespace.rmSync(n,{recursive:true,force:true});}return s}var A="/api/v1";var ye=201,be=409,I=401;function we(){return process.env.WI013_FAKE_UPLOAD==="1"}function Ee(e){let t=zlib.gunzipSync(new Uint8Array(e)),r=zlib.gzipSync(new Uint8Array(t),{level:1});if(Buffer.compare(new Uint8Array(r),new Uint8Array(e))===0)throw new Error("WI013_FAKE_UPLOAD: re-gzipped bytes are identical to the original \u2014 tamper is a no-op");return r}function Ae(e){return e.replace(/\/+$/,"")}async function v(e){try{return await e.json()}catch{return null}}function b(e){let t=e?.message;return typeof t=="string"?t:void 0}function ee(e,t,r){let s=e;if(!s||s.success!==true||s.data===void 0)throw new Error(`publish: ${t} response envelope malformed (expected { success: true, data }) \u2014 HTTP ${r}`);return s.data}async function Se(e){let t=Ae(e.baseUrl),r=e.accessPolicy??"private",s=e.manifest.name,n;try{n=await fetch(`${t}${A}/publisher/items`,{method:"POST",headers:{Authorization:`Bearer ${e.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({slug:s,displayName:s,description:e.manifest.description,type:"template",version:e.manifest.version,accessPolicy:r})});}catch(o){throw new Error(`publish: submit \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (\uB124\uD2B8\uC6CC\uD06C) \u2014 ${o instanceof Error?o.message:String(o)}`)}let i;if(n.status===ye)i="created";else if(n.status===be)i="existing";else {if(n.status===I)throw new Error("publish: \uC778\uC99D\uC774 \uB9CC\uB8CC\uB418\uC5C8\uAC70\uB098 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uB2E4\uC2DC \uB85C\uADF8\uC778\uD558\uC138\uC694");{let o=await v(n);throw new Error(`publish: submit \uC2E4\uD328 \u2014 HTTP ${n.status}${b(o)?` ${b(o)}`:""}`)}}let a="not-needed",m=null;if(i==="existing"){let o;try{o=await fetch(`${t}${A}/publisher/items`,{method:"GET",headers:{Authorization:`Bearer ${e.accessToken}`}});}catch(f){throw new Error(`publish: version \uC870\uD68C \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (\uB124\uD2B8\uC6CC\uD06C) \u2014 ${f instanceof Error?f.message:String(f)}`)}let M=await v(o);if(o.status!==200)throw new Error(`publish: publisher items \uC870\uD68C \uC2E4\uD328 \u2014 HTTP ${o.status}${b(M)?` ${b(M)}`:""}`);let H=ee(M,"publisher items",o.status)?.items;if(!Array.isArray(H))throw new Error(`publish: publisher items response malformed (expected data.items[]) \u2014 HTTP ${o.status}`);let $=H.find(f=>!f||typeof f!="object"?false:f.slug===s);if(!$||typeof $.version!="string")throw new Error(`publish: publisher items response does not contain slug "${s}" \u2014 HTTP ${o.status}`);if(m=$.version,m!==e.manifest.version){let f;try{f=await fetch(`${t}${A}/publisher/items/${encodeURIComponent(s)}`,{method:"PUT",headers:{Authorization:`Bearer ${e.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({version:e.manifest.version})});}catch(x){throw new Error(`publish: version update \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (\uB124\uD2B8\uC6CC\uD06C) \u2014 ${x instanceof Error?x.message:String(x)}`)}if(!f.ok){let x=await v(f),w=b(x);throw f.status===I?new Error(`publish: version update \uC778\uC99D\uC774 \uB9CC\uB8CC\uB418\uC5C8\uAC70\uB098 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uB2E4\uC2DC \uB85C\uADF8\uC778\uD558\uC138\uC694 (HTTP ${f.status})${w?` ${w}`:""}`):f.status===403?new Error(`publish: version update \uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uAE30\uC874 \uD56D\uBAA9\uC758 \uC18C\uC720\uC790\uB9CC \uBC84\uC804\uC744 \uAC31\uC2E0\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4 (HTTP ${f.status})${w?` ${w}`:""}`):new Error(`publish: version update \uC2E4\uD328 \u2014 HTTP ${f.status}${w?` ${w}`:""}`)}a="applied";}}let c=d__namespace.readFileSync(e.tgzPath),u=we()?Ee(c):c,l=new FormData;l.set("archive",new Blob([new Uint8Array(u)],{type:"application/gzip"}),`${s}-${e.manifest.version}.tgz`);let p;try{p=await fetch(`${t}${A}/publisher/items/${encodeURIComponent(s)}/upload`,{method:"POST",headers:{Authorization:`Bearer ${e.accessToken}`},body:l});}catch(o){throw new Error(`publish: upload \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (\uB124\uD2B8\uC6CC\uD06C) \u2014 ${o instanceof Error?o.message:String(o)}`)}if(p.status===I)throw new Error("publish: \uC778\uC99D\uC774 \uB9CC\uB8CC\uB418\uC5C8\uAC70\uB098 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uB2E4\uC2DC \uB85C\uADF8\uC778\uD558\uC138\uC694");if(!p.ok){let o=await v(p);throw new Error(`publish: upload \uC2E4\uD328 \u2014 HTTP ${p.status}${b(o)?` ${b(o)}`:""}`)}let C=await v(p),F=ee(C,"upload",p.status);return {slug:s,version:e.manifest.version,artifactChecksum:F.artifactChecksum,artifactSizeBytes:F.artifactSizeBytes,submitOutcome:i,versionUpdate:a,serverVersionBefore:m}}function ne(){if(process.env.CREWX_HOME)try{return d__namespace.realpathSync(process.env.CREWX_HOME)}catch{return y__namespace.join(O__namespace.homedir(),".crewx")}return process.platform!=="win32"&&process.env.XDG_CONFIG_HOME?y__namespace.join(process.env.XDG_CONFIG_HOME,"crewx"):y__namespace.join(O__namespace.homedir(),".crewx")}var g=class extends Error{code;constructor(t,r){super(r),this.name="AccountAuthBoundaryError",this.code=t;}};function N(e=process.env){let t=e.CREWX_ACCOUNT_ISSUER?.trim(),r=e.CREWX_ACCOUNT_ANON_KEY?.trim();if(!t&&!r)throw new g("ACCOUNT_USER_PAIR_MISSING","CrewX user-realm issuer and anon/publishable key pair are not configured");if(!t)throw new g("ACCOUNT_USER_ISSUER_MISSING","CrewX user-realm issuer is not configured");if(!r)throw new g("ACCOUNT_USER_ANON_KEY_MISSING","CrewX user-realm anon/publishable key is not configured");return {issuer:t,anonKey:r}}function S(){throw new g("ACCOUNT_ACCESS_TOKEN_INVALID","Account access token could not be verified")}function se(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf8"))}catch{return S()}}function ie(e){if(typeof e!="string")return S();let t=e.split(".");if(t.length!==3||t.some(i=>i.length===0))return S();let r=se(t[0]),s=se(t[1]);if(!r||typeof r!="object"||!s||typeof s!="object")return S();let n=s;return typeof n.iss!="string"||n.iss.length===0||typeof n.sub!="string"||n.sub.length===0?S():{issuer:n.iss,sub:n.sub}}function oe(e,t,r){let s=ie(e);if(s.issuer!==t.issuer)throw new g("ACCOUNT_TOKEN_ISSUER_MISMATCH","Account access token does not match the configured user realm");if(r!==void 0&&s.sub!==r)throw new g("ACCOUNT_TOKEN_SUB_MISMATCH","Account access token subject does not match the expected identity");return s}function j(e,t){if(e.issuer!==t.issuer)throw new g("ACCOUNT_AUTH_JSON_ISSUER_MISMATCH","auth.json does not match the configured user realm");let r=oe(e.access_token,t);if(r.sub!==e.sub)throw new g("ACCOUNT_AUTH_JSON_SUB_MISMATCH","auth.json subject does not match the access token identity");return r}function ve(e){if(!e||typeof e!="object")return false;let t=e;return t.version===1&&typeof t.sub=="string"&&typeof t.email=="string"&&typeof t.access_token=="string"&&typeof t.refresh_token=="string"&&typeof t.expires_at=="number"&&typeof t.issuer=="string"&&typeof t.updated_at=="string"}function Ce(){let e=y.join(ne(),"auth.json");if(!d.existsSync(e))throw new Error(`Login required \u2014 ${e} was not found (please log in first)`);let t;try{t=d.readFileSync(e,"utf8");}catch(n){throw new Error(`Could not read auth.json (${e}): ${n instanceof Error?n.message:String(n)}`)}let r;try{r=JSON.parse(t);}catch(n){throw new Error(`Failed to parse auth.json (${e}): ${n instanceof Error?n.message:String(n)}`)}if(!ve(r))throw new Error(`auth.json is malformed (${e}) \u2014 please log in again`);let s=N();return j(r,s),r}async function Pe(e,t={}){let r=y__namespace.resolve(e),{included:s,excluded:n}=J(r),i=W(r,s,{version:t.version}),a=V(r,s);return {manifest:i,included:s,excluded:n,secretFindings:a}}async function pt(e,t={}){let r=await Pe(e,t);if(r.secretFindings.length>0){let i=r.secretFindings.map(a=>`${a.path}:${a.line} (${a.rule})`).join(", ");throw new Error(`publish: aborted \u2014 secret findings must be resolved before packing: ${i}`)}let s=y__namespace.resolve(e),n=await Q(s,r.manifest);return {manifest:r.manifest,tgzPath:n}}exports.AccountAuthBoundaryError=g;exports.EXCLUDE_RULES=z;exports.MARKETPLACE_API_PREFIX=A;exports.assertAuthJsonUserRealm=j;exports.assertUserRealmAccessToken=oe;exports.decodeAccessTokenIdentity=ie;exports.packTemplate=pt;exports.planPublish=Pe;exports.readAuthJson=Ce;exports.resolveUserAccountConfig=N;exports.uploadToMarketplace=Se;
@@ -0,0 +1,17 @@
1
+ export interface ManifestFile {
2
+ path: string;
3
+ sha256: string;
4
+ }
5
+ export interface PublishManifest {
6
+ name: string;
7
+ version: string;
8
+ type: 'template';
9
+ description: string;
10
+ files: ManifestFile[];
11
+ requiredEnv: string[];
12
+ crewxMinVersion?: string;
13
+ }
14
+ export interface BuildManifestOptions {
15
+ version?: string;
16
+ }
17
+ export declare function buildManifest(rootDir: string, includedFiles: string[], opts?: BuildManifestOptions): PublishManifest;
@@ -0,0 +1 @@
1
+ export declare const MARKETPLACE_API_PREFIX = "/api/v1";
@@ -0,0 +1,2 @@
1
+ import type { PublishManifest } from './manifest';
2
+ export declare function createArchive(rootDir: string, manifest: PublishManifest): Promise<string>;
@@ -0,0 +1,9 @@
1
+ export interface ExcludedEntry {
2
+ path: string;
3
+ rule: string;
4
+ }
5
+ export interface ScanResult {
6
+ included: string[];
7
+ excluded: ExcludedEntry[];
8
+ }
9
+ export declare function scanWorkspace(rootDir: string): ScanResult;
@@ -0,0 +1,6 @@
1
+ export interface SecretFinding {
2
+ path: string;
3
+ line: number;
4
+ rule: string;
5
+ }
6
+ export declare function scanForSecrets(rootDir: string, includedFiles: string[]): SecretFinding[];
@@ -0,0 +1,18 @@
1
+ import type { PublishManifest } from './manifest';
2
+ export interface PublishUploadOptions {
3
+ tgzPath: string;
4
+ manifest: PublishManifest;
5
+ baseUrl: string;
6
+ accessToken: string;
7
+ accessPolicy?: 'private';
8
+ }
9
+ export interface PublishUploadResult {
10
+ slug: string;
11
+ version: string;
12
+ artifactChecksum: string;
13
+ artifactSizeBytes: number;
14
+ submitOutcome: 'created' | 'existing';
15
+ versionUpdate: 'not-needed' | 'applied';
16
+ serverVersionBefore: string | null;
17
+ }
18
+ export declare function uploadToMarketplace(opts: PublishUploadOptions): Promise<PublishUploadResult>;
@@ -0,0 +1,34 @@
1
+ import { BaseSqliteRepository } from './base-sqlite-repository.js';
2
+ import { agent_suggestions } from '../schema/index.js';
3
+ export type AgentSuggestionRow = typeof agent_suggestions.$inferSelect;
4
+ export type NewAgentSuggestion = typeof agent_suggestions.$inferInsert;
5
+ export type SuggestionType = 'H1' | 'H3';
6
+ export type SuggestionStatus = 'pending' | 'applied' | 'dismissed';
7
+ export interface CreateAgentSuggestionInput {
8
+ workspaceId: string;
9
+ agentId: string;
10
+ taskId?: string | null;
11
+ type: SuggestionType;
12
+ status?: SuggestionStatus;
13
+ payload: string;
14
+ appliedCommitSha?: string | null;
15
+ }
16
+ export declare const DEFAULT_LIST_LIMIT = 50;
17
+ export declare class AgentSuggestionRepository extends BaseSqliteRepository {
18
+ private readonly dbPath?;
19
+ constructor(opts?: {
20
+ dbPath?: string;
21
+ dbRoot?: string;
22
+ });
23
+ resolveDbPath(): string;
24
+ private openHandle;
25
+ create(rows: CreateAgentSuggestionInput[]): {
26
+ ids: string[];
27
+ };
28
+ findLatestSet(workspaceId: string, agentId: string): AgentSuggestionRow[];
29
+ findSetByTaskId(workspaceId: string, agentId: string, taskId: string): AgentSuggestionRow[];
30
+ findById(workspaceId: string, agentId: string, suggestionId: string): AgentSuggestionRow | null;
31
+ updateStatus(id: string, status: SuggestionStatus, appliedCommitSha?: string | null): boolean;
32
+ listByAgent(workspaceId: string, agentId: string, limit?: number): AgentSuggestionRow[];
33
+ findDismissed(workspaceId: string, agentId: string, limit?: number): AgentSuggestionRow[];
34
+ }
@@ -11,7 +11,7 @@ export type { PushResult } from './push.js';
11
11
  export type { Workspace, NewWorkspace } from '../schema/index.js';
12
12
  export { tasks } from '../schema/index.js';
13
13
  export { TaskRepository } from './task.repository.js';
14
- export type { TaskRow, NewTask, AgentUsageRow, TrendRow, ProviderUsageRow } from './task.repository.js';
14
+ export type { TaskRow, TaskListRow, NewTask, AgentUsageRow, TrendRow, ProviderUsageRow, ModelUsageRow, ReportTaskRow, WorkflowCardRow, } from './task.repository.js';
15
15
  export { ThreadRepository } from './thread.repository.js';
16
16
  export type { ThreadRow, NewThread } from './thread.repository.js';
17
17
  export { SpanRepository } from './span.repository.js';
@@ -24,3 +24,9 @@ export { RequestLogRepository } from './request-log.repository.js';
24
24
  export type { RequestLogRow, NewRequestLog, RequestLogEntry } from './request-log.repository.js';
25
25
  export { UsageLimitSnapshotRepository, calcBucketStart } from './usage-limit-snapshot.repository.js';
26
26
  export type { UsageLimitSnapshotRow, NewUsageLimitSnapshot, UpsertSnapshotInput, LimitTrendPoint, LimitTrendProvider, } from './usage-limit-snapshot.repository.js';
27
+ export { UsageReportRepository } from './usage-report.repository.js';
28
+ export type { UsageReportRow, NewUsageReport, PublishReportInput } from './usage-report.repository.js';
29
+ export { NotificationRepository, DEFAULT_NOTIFICATION_CAP, DEFAULT_LIST_LIMIT as DEFAULT_NOTIFICATION_LIST_LIMIT, } from './notification.repository.js';
30
+ export type { NotificationRow, NewNotification, NotificationReadRow, NotificationLevel, NotificationSource, CreateNotificationInput, NotificationListItem, ListNotificationsParams, UserScope as NotificationUserScope, MarkReadParams as NotificationMarkReadParams, } from './notification.repository.js';
31
+ export { AgentSuggestionRepository, DEFAULT_LIST_LIMIT as DEFAULT_AGENT_SUGGESTION_LIST_LIMIT, } from './agent-suggestion.repository.js';
32
+ export type { AgentSuggestionRow, NewAgentSuggestion, SuggestionType, SuggestionStatus, CreateAgentSuggestionInput, } from './agent-suggestion.repository.js';