@tiangong-lca/cli 0.1.1 → 0.1.2

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 (154) hide show
  1. package/README.md +26 -6
  2. package/dist/src/batch.d.ts +6 -0
  3. package/dist/src/batch.js +6 -0
  4. package/dist/src/batch.js.map +1 -0
  5. package/dist/src/cli.d.ts +161 -0
  6. package/dist/src/command-spec.d.ts +90 -0
  7. package/dist/src/command-spec.js +400 -0
  8. package/dist/src/command-spec.js.map +1 -0
  9. package/dist/src/lib/artifacts.d.ts +9 -0
  10. package/dist/src/lib/auth-identity-receipt.d.ts +160 -0
  11. package/dist/src/lib/batch/attempt-recovery.d.ts +12 -0
  12. package/dist/src/lib/batch/attempt-recovery.js +183 -0
  13. package/dist/src/lib/batch/attempt-recovery.js.map +1 -0
  14. package/dist/src/lib/batch/canonical-contracts.d.ts +21 -0
  15. package/dist/src/lib/batch/canonical-contracts.js +180 -0
  16. package/dist/src/lib/batch/canonical-contracts.js.map +1 -0
  17. package/dist/src/lib/batch/engine.d.ts +2 -0
  18. package/dist/src/lib/batch/engine.js +294 -0
  19. package/dist/src/lib/batch/engine.js.map +1 -0
  20. package/dist/src/lib/batch/errors.d.ts +51 -0
  21. package/dist/src/lib/batch/errors.js +81 -0
  22. package/dist/src/lib/batch/errors.js.map +1 -0
  23. package/dist/src/lib/batch/item-projection.d.ts +10 -0
  24. package/dist/src/lib/batch/item-projection.js +118 -0
  25. package/dist/src/lib/batch/item-projection.js.map +1 -0
  26. package/dist/src/lib/batch/run-lock.d.ts +4 -0
  27. package/dist/src/lib/batch/run-lock.js +155 -0
  28. package/dist/src/lib/batch/run-lock.js.map +1 -0
  29. package/dist/src/lib/batch/scheduler-runtime.d.ts +29 -0
  30. package/dist/src/lib/batch/scheduler-runtime.js +114 -0
  31. package/dist/src/lib/batch/scheduler-runtime.js.map +1 -0
  32. package/dist/src/lib/batch/types.d.ts +183 -0
  33. package/dist/src/lib/batch/types.js +2 -0
  34. package/dist/src/lib/batch/types.js.map +1 -0
  35. package/dist/src/lib/dataset-author.d.ts +39 -0
  36. package/dist/src/lib/dataset-bilingual.d.ts +165 -0
  37. package/dist/src/lib/dataset-classification.d.ts +279 -0
  38. package/dist/src/lib/dataset-command.d.ts +53 -0
  39. package/dist/src/lib/dataset-contract.d.ts +82 -0
  40. package/dist/src/lib/dataset-curation-queue.d.ts +219 -0
  41. package/dist/src/lib/dataset-evidence-search.d.ts +134 -0
  42. package/dist/src/lib/dataset-import-lca.d.ts +136 -0
  43. package/dist/src/lib/dataset-local.d.ts +23 -0
  44. package/dist/src/lib/dataset-maintenance-alias-request.d.ts +12 -0
  45. package/dist/src/lib/dataset-maintenance-alias-rewrite.d.ts +111 -0
  46. package/dist/src/lib/dataset-maintenance-apply.d.ts +458 -0
  47. package/dist/src/lib/dataset-maintenance-clear-account.d.ts +161 -0
  48. package/dist/src/lib/dataset-maintenance-contract.d.ts +317 -0
  49. package/dist/src/lib/dataset-maintenance-derivatives.d.ts +48 -0
  50. package/dist/src/lib/dataset-maintenance-flow-identity-approval-claim.d.ts +50 -0
  51. package/dist/src/lib/dataset-maintenance-flow-identity-capture.d.ts +110 -0
  52. package/dist/src/lib/dataset-maintenance-flow-identity-command.d.ts +15 -0
  53. package/dist/src/lib/dataset-maintenance-flow-identity-contract.d.ts +387 -0
  54. package/dist/src/lib/dataset-maintenance-flow-identity-execution-contract.d.ts +456 -0
  55. package/dist/src/lib/dataset-maintenance-flow-identity-freeze.d.ts +99 -0
  56. package/dist/src/lib/dataset-maintenance-flow-identity-plan.d.ts +85 -0
  57. package/dist/src/lib/dataset-maintenance-flow-identity-recovery.d.ts +268 -0
  58. package/dist/src/lib/dataset-maintenance-flow-identity-run.d.ts +123 -0
  59. package/dist/src/lib/dataset-maintenance-flow-identity-seal.d.ts +50 -0
  60. package/dist/src/lib/dataset-maintenance-flow-identity-verify.d.ts +85 -0
  61. package/dist/src/lib/dataset-maintenance-flow-identity-wire.d.ts +32 -0
  62. package/dist/src/lib/dataset-maintenance-pagination.d.ts +58 -0
  63. package/dist/src/lib/dataset-maintenance-plan.d.ts +40 -0
  64. package/dist/src/lib/dataset-maintenance-protected-artifacts.d.ts +16 -0
  65. package/dist/src/lib/dataset-maintenance-protected-before.d.ts +71 -0
  66. package/dist/src/lib/dataset-maintenance-protected-contract.d.ts +385 -0
  67. package/dist/src/lib/dataset-maintenance-protected-freeze.d.ts +148 -0
  68. package/dist/src/lib/dataset-maintenance-protected-preparation.d.ts +76 -0
  69. package/dist/src/lib/dataset-maintenance-protected-run.d.ts +252 -0
  70. package/dist/src/lib/dataset-maintenance-protected-seal.d.ts +93 -0
  71. package/dist/src/lib/dataset-maintenance-protected-toolchain.d.ts +31 -0
  72. package/dist/src/lib/dataset-maintenance-protected-verify.d.ts +99 -0
  73. package/dist/src/lib/dataset-maintenance-remote.d.ts +212 -0
  74. package/dist/src/lib/dataset-maintenance-support-validation.d.ts +18 -0
  75. package/dist/src/lib/dataset-maintenance-verify.d.ts +102 -0
  76. package/dist/src/lib/dataset-patch.d.ts +193 -0
  77. package/dist/src/lib/dataset-references-rewrite.d.ts +77 -0
  78. package/dist/src/lib/dataset-remote-refresh.d.ts +64 -0
  79. package/dist/src/lib/dataset-remote-verify.d.ts +168 -0
  80. package/dist/src/lib/dataset-save-draft-run.d.ts +283 -0
  81. package/dist/src/lib/dataset-save-draft-run.js +54 -21
  82. package/dist/src/lib/dataset-save-draft-run.js.map +1 -1
  83. package/dist/src/lib/dataset-source-upload-attachments.d.ts +109 -0
  84. package/dist/src/lib/dataset-validate.d.ts +62 -0
  85. package/dist/src/lib/dotenv.d.ts +6 -0
  86. package/dist/src/lib/env.d.ts +59 -0
  87. package/dist/src/lib/errors.d.ts +18 -0
  88. package/dist/src/lib/flow-build-alias-map.d.ts +80 -0
  89. package/dist/src/lib/flow-fetch-rows.d.ts +70 -0
  90. package/dist/src/lib/flow-get.d.ts +35 -0
  91. package/dist/src/lib/flow-governance.d.ts +22 -0
  92. package/dist/src/lib/flow-list.d.ts +57 -0
  93. package/dist/src/lib/flow-materialize-decisions.d.ts +67 -0
  94. package/dist/src/lib/flow-payload-validation.d.ts +32 -0
  95. package/dist/src/lib/flow-publish-reviewed-data.d.ts +262 -0
  96. package/dist/src/lib/flow-publish-version.d.ts +193 -0
  97. package/dist/src/lib/flow-qa.d.ts +289 -0
  98. package/dist/src/lib/flow-read.d.ts +70 -0
  99. package/dist/src/lib/flow-regen-product.d.ts +431 -0
  100. package/dist/src/lib/flow-remediate.d.ts +133 -0
  101. package/dist/src/lib/http.d.ts +25 -0
  102. package/dist/src/lib/identity-preflight.d.ts +235 -0
  103. package/dist/src/lib/io.d.ts +2 -0
  104. package/dist/src/lib/kb-search.d.ts +23 -0
  105. package/dist/src/lib/lca-release.d.ts +105 -0
  106. package/dist/src/lib/lifecyclemodel-auto-build.d.ts +223 -0
  107. package/dist/src/lib/lifecyclemodel-bundle-save.d.ts +71 -0
  108. package/dist/src/lib/lifecyclemodel-graph.d.ts +91 -0
  109. package/dist/src/lib/lifecyclemodel-orchestrate.d.ts +349 -0
  110. package/dist/src/lib/lifecyclemodel-publish-build.d.ts +77 -0
  111. package/dist/src/lib/lifecyclemodel-publish-resulting-process.d.ts +27 -0
  112. package/dist/src/lib/lifecyclemodel-qa.d.ts +206 -0
  113. package/dist/src/lib/lifecyclemodel-resulting-process.d.ts +204 -0
  114. package/dist/src/lib/lifecyclemodel-save-draft-run.d.ts +96 -0
  115. package/dist/src/lib/lifecyclemodel-validate-build.d.ts +78 -0
  116. package/dist/src/lib/llm.d.ts +51 -0
  117. package/dist/src/lib/package-version.d.ts +3 -0
  118. package/dist/src/lib/process-auto-build.d.ts +168 -0
  119. package/dist/src/lib/process-batch-build.d.ts +97 -0
  120. package/dist/src/lib/process-dedup-review.d.ts +253 -0
  121. package/dist/src/lib/process-flow-build-plan.d.ts +108 -0
  122. package/dist/src/lib/process-get.d.ts +26 -0
  123. package/dist/src/lib/process-list.d.ts +87 -0
  124. package/dist/src/lib/process-payload-validation.d.ts +27 -0
  125. package/dist/src/lib/process-publish-build.d.ts +148 -0
  126. package/dist/src/lib/process-qa.d.ts +243 -0
  127. package/dist/src/lib/process-refresh-references.d.ts +179 -0
  128. package/dist/src/lib/process-required-fields.d.ts +142 -0
  129. package/dist/src/lib/process-resume-build.d.ts +77 -0
  130. package/dist/src/lib/process-save-draft-run.d.ts +72 -0
  131. package/dist/src/lib/process-save-draft.d.ts +53 -0
  132. package/dist/src/lib/process-scope-statistics.d.ts +210 -0
  133. package/dist/src/lib/process-verify-rows.d.ts +71 -0
  134. package/dist/src/lib/publish.d.ts +219 -0
  135. package/dist/src/lib/remote.d.ts +19 -0
  136. package/dist/src/lib/run.d.ts +60 -0
  137. package/dist/src/lib/runtime-rulesets.d.ts +29 -0
  138. package/dist/src/lib/state-lock.d.ts +25 -0
  139. package/dist/src/lib/state-lock.js +23 -1
  140. package/dist/src/lib/state-lock.js.map +1 -1
  141. package/dist/src/lib/supabase-client.d.ts +47 -0
  142. package/dist/src/lib/supabase-data-api-contract.d.ts +304 -0
  143. package/dist/src/lib/supabase-data-api-replay.d.ts +74 -0
  144. package/dist/src/lib/supabase-json-ordered-write.d.ts +65 -0
  145. package/dist/src/lib/supabase-rest.d.ts +26 -0
  146. package/dist/src/lib/supabase-session.d.ts +115 -0
  147. package/dist/src/lib/tidas-languages.d.ts +3 -0
  148. package/dist/src/lib/tidas-sdk-package-validator.d.ts +111 -0
  149. package/dist/src/lib/tidas-sdk-validation.d.ts +42 -0
  150. package/dist/src/lib/unstructured.d.ts +32 -0
  151. package/dist/src/lib/user-api-key.d.ts +16 -0
  152. package/dist/src/lib/validation.d.ts +82 -0
  153. package/dist/src/main.d.ts +4 -0
  154. package/package.json +13 -2
@@ -0,0 +1,219 @@
1
+ import type { FetchLike } from './http.js';
2
+ import { type LifecyclemodelPublishMetadata } from './lifecyclemodel-bundle-save.js';
3
+ import { type ProcessPayloadValidationResult } from './process-payload-validation.js';
4
+ type JsonObject = Record<string, unknown>;
5
+ export type PublishDatasetEntry = string | {
6
+ file?: string;
7
+ path?: string;
8
+ json_ordered?: JsonObject;
9
+ jsonOrdered?: JsonObject;
10
+ payload?: JsonObject;
11
+ [key: string]: unknown;
12
+ };
13
+ export type PublishProcessBuildRunEntry = string | {
14
+ run_id?: string;
15
+ run_root?: string;
16
+ exports_dir?: string;
17
+ [key: string]: unknown;
18
+ };
19
+ export type PublishCollectedOrigin = {
20
+ source: 'bundle' | 'input';
21
+ base_dir: string;
22
+ bundle_path: string | null;
23
+ };
24
+ export type PublishCollectedDatasetEntry = {
25
+ entry: PublishDatasetEntry;
26
+ origin: PublishCollectedOrigin;
27
+ };
28
+ export type PublishCollectedProcessBuildRunEntry = {
29
+ entry: PublishProcessBuildRunEntry;
30
+ origin: PublishCollectedOrigin;
31
+ };
32
+ export type PublishCollectedRelationEntry = {
33
+ entry: unknown;
34
+ origin: PublishCollectedOrigin;
35
+ };
36
+ export type PublishRequest = {
37
+ inputs: {
38
+ bundle_paths: string[];
39
+ lifecyclemodels: PublishDatasetEntry[];
40
+ processes: PublishDatasetEntry[];
41
+ sources: PublishDatasetEntry[];
42
+ relations: unknown[];
43
+ process_build_runs: PublishProcessBuildRunEntry[];
44
+ };
45
+ publish: {
46
+ commit: boolean;
47
+ publish_lifecyclemodels: boolean;
48
+ publish_processes: boolean;
49
+ publish_sources: boolean;
50
+ publish_relations: boolean;
51
+ publish_process_build_runs: boolean;
52
+ relation_mode: 'local_manifest_only';
53
+ max_attempts: number;
54
+ retry_delay_seconds: number;
55
+ process_build_forward_args: string[];
56
+ };
57
+ out_dir: string;
58
+ };
59
+ export type PublishCollectedInputs = {
60
+ bundle_paths: string[];
61
+ lifecyclemodels: PublishCollectedDatasetEntry[];
62
+ processes: PublishCollectedDatasetEntry[];
63
+ sources: PublishCollectedDatasetEntry[];
64
+ relations: PublishCollectedRelationEntry[];
65
+ process_build_runs: PublishCollectedProcessBuildRunEntry[];
66
+ };
67
+ export type DatasetPublishExecutorArgs = {
68
+ table: 'lifecyclemodels' | 'processes' | 'sources';
69
+ id: string;
70
+ version: string;
71
+ payload: JsonObject;
72
+ metadata?: LifecyclemodelPublishMetadata | null;
73
+ source: 'bundle' | 'input';
74
+ bundle_path: string | null;
75
+ publish: PublishRequest['publish'];
76
+ };
77
+ export type ProcessBuildRunPublishExecutorArgs = {
78
+ run_id: string;
79
+ entry: PublishProcessBuildRunEntry;
80
+ source: 'bundle' | 'input';
81
+ bundle_path: string | null;
82
+ forward_args: string[];
83
+ publish: PublishRequest['publish'];
84
+ };
85
+ export type PublishExecutors = {
86
+ lifecyclemodels?: (args: DatasetPublishExecutorArgs) => Promise<unknown> | unknown;
87
+ processes?: (args: DatasetPublishExecutorArgs) => Promise<unknown> | unknown;
88
+ sources?: (args: DatasetPublishExecutorArgs) => Promise<unknown> | unknown;
89
+ process_build_runs?: (args: ProcessBuildRunPublishExecutorArgs) => Promise<unknown> | unknown;
90
+ };
91
+ export type PublishDatasetReport = {
92
+ table: 'lifecyclemodels' | 'processes' | 'sources';
93
+ id: string | null;
94
+ version: string | null;
95
+ status: 'prepared' | 'executed' | 'deferred_no_executor' | 'deferred_projection_payload' | 'failed';
96
+ source: 'bundle' | 'input';
97
+ bundle_path: string | null;
98
+ reason?: string;
99
+ validation?: ProcessPayloadValidationResult;
100
+ execution?: unknown;
101
+ error?: {
102
+ message: string;
103
+ };
104
+ };
105
+ export type PublishProcessBuildRunReport = {
106
+ run_id: string;
107
+ status: 'prepared' | 'executed' | 'deferred_no_executor' | 'failed';
108
+ source: 'bundle' | 'input';
109
+ bundle_path: string | null;
110
+ forward_args: string[];
111
+ execution?: unknown;
112
+ error?: {
113
+ message: string;
114
+ };
115
+ };
116
+ export type PublishRelationManifest = {
117
+ generated_at_utc: string;
118
+ relation_mode: 'local_manifest_only';
119
+ status: 'prepared_local_relation_manifest';
120
+ relations: unknown[];
121
+ };
122
+ export type PublishVerificationFinding = {
123
+ code: string;
124
+ severity: 'warning' | 'blocker';
125
+ message: string;
126
+ table: 'lifecyclemodels' | 'processes' | 'sources' | 'process_build_runs';
127
+ id: string | null;
128
+ version: string | null;
129
+ path?: string;
130
+ bundle_path?: string | null;
131
+ };
132
+ export type PublishVerificationReport = {
133
+ schema_version: 1;
134
+ generated_at_utc: string;
135
+ command: 'publish run';
136
+ status: 'passed' | 'blocked';
137
+ ruleset_id: string;
138
+ ruleset_version: string;
139
+ ruleset_source_version: string;
140
+ ruleset_rule_ids: string[];
141
+ commit: boolean;
142
+ findings: PublishVerificationFinding[];
143
+ blockers: PublishVerificationFinding[];
144
+ next_action: 'ready_for_commit_or_publish' | 'fix_blockers';
145
+ counts: {
146
+ findings: number;
147
+ blockers: number;
148
+ failed: number;
149
+ deferred: number;
150
+ executed: number;
151
+ };
152
+ };
153
+ export type PublishReport = {
154
+ generated_at_utc: string;
155
+ request_path: string;
156
+ out_dir: string;
157
+ commit: boolean;
158
+ status: 'completed' | 'completed_with_failures';
159
+ counts: {
160
+ bundle_paths: number;
161
+ lifecyclemodels: number;
162
+ processes: number;
163
+ sources: number;
164
+ relations: number;
165
+ process_build_runs: number;
166
+ executed: number;
167
+ deferred: number;
168
+ failed: number;
169
+ };
170
+ files: {
171
+ normalized_request: string;
172
+ collected_inputs: string;
173
+ relation_manifest: string;
174
+ verification_report: string;
175
+ publish_report: string;
176
+ };
177
+ verification: PublishVerificationReport;
178
+ lifecyclemodels: PublishDatasetReport[];
179
+ processes: PublishDatasetReport[];
180
+ sources: PublishDatasetReport[];
181
+ process_build_runs: PublishProcessBuildRunReport[];
182
+ relations: PublishRelationManifest;
183
+ };
184
+ export type RunPublishOptions = {
185
+ inputPath: string;
186
+ rawRequest?: unknown;
187
+ outDir?: string | null;
188
+ commit?: boolean | null;
189
+ executors?: PublishExecutors;
190
+ env?: NodeJS.ProcessEnv;
191
+ fetchImpl?: FetchLike;
192
+ timeoutMs?: number;
193
+ now?: Date;
194
+ validateProcessPayloadImpl?: (payload: JsonObject) => ProcessPayloadValidationResult;
195
+ };
196
+ type NormalizePublishRequestOptions = {
197
+ requestPath: string;
198
+ outDirOverride?: string;
199
+ commitOverride?: boolean;
200
+ now?: Date;
201
+ };
202
+ export declare function normalizePublishRequest(raw: unknown, options: NormalizePublishRequestOptions): PublishRequest;
203
+ export declare function collectPublishInputs(normalized: PublishRequest, requestBaseDir: string): PublishCollectedInputs;
204
+ declare function build_publish_verification_report(options: {
205
+ now: Date;
206
+ commit: boolean;
207
+ failed: number;
208
+ deferred: number;
209
+ executed: number;
210
+ lifecyclemodels: PublishDatasetReport[];
211
+ processes: PublishDatasetReport[];
212
+ sources: PublishDatasetReport[];
213
+ processBuildRuns: PublishProcessBuildRunReport[];
214
+ }): PublishVerificationReport;
215
+ export declare function runPublish(options: RunPublishOptions): Promise<PublishReport>;
216
+ export declare const __testInternals: {
217
+ build_publish_verification_report: typeof build_publish_verification_report;
218
+ };
219
+ export {};
@@ -0,0 +1,19 @@
1
+ import type { FetchLike } from './http.js';
2
+ type RemoteCommandSpec = {
3
+ endpoint: string;
4
+ includeRegion: boolean;
5
+ help: string;
6
+ };
7
+ declare const REMOTE_COMMANDS: Record<string, RemoteCommandSpec>;
8
+ export type RemoteCommandOptions = {
9
+ commandKey: keyof typeof REMOTE_COMMANDS;
10
+ inputPath: string;
11
+ env: NodeJS.ProcessEnv;
12
+ timeoutMs: number;
13
+ dryRun: boolean;
14
+ compactJson: boolean;
15
+ fetchImpl: FetchLike;
16
+ };
17
+ export declare function executeRemoteCommand(options: RemoteCommandOptions): Promise<string>;
18
+ export declare function getRemoteCommandHelp(commandKey: keyof typeof REMOTE_COMMANDS): string;
19
+ export {};
@@ -0,0 +1,60 @@
1
+ export type RunLayout = {
2
+ namespace: string;
3
+ runId: string;
4
+ artifactsRoot: string;
5
+ collectionDir: string;
6
+ runRoot: string;
7
+ cacheDir: string;
8
+ inputsDir: string;
9
+ outputsDir: string;
10
+ reportsDir: string;
11
+ logsDir: string;
12
+ manifestsDir: string;
13
+ latestRunIdPath: string;
14
+ };
15
+ export type RunManifest = {
16
+ schemaVersion: 1;
17
+ namespace: string;
18
+ runId: string;
19
+ command: string[];
20
+ cwd: string;
21
+ createdAt: string;
22
+ layout: Omit<RunLayout, 'namespace' | 'runId'>;
23
+ };
24
+ export type ResumeMetadata = {
25
+ runId: string;
26
+ resumedFrom: string;
27
+ checkpoint: string | null;
28
+ attempt: number;
29
+ resumedAt: string;
30
+ };
31
+ type BuildRunIdOptions = {
32
+ namespace: string;
33
+ subject?: string;
34
+ operation?: string;
35
+ now?: Date;
36
+ suffix?: string;
37
+ };
38
+ type BuildRunManifestOptions = {
39
+ layout: RunLayout;
40
+ command: string[];
41
+ cwd?: string;
42
+ createdAt?: Date;
43
+ };
44
+ type BuildResumeMetadataOptions = {
45
+ runId: string;
46
+ resumedFrom: string;
47
+ checkpoint?: string | null;
48
+ attempt?: number;
49
+ resumedAt?: Date;
50
+ };
51
+ export declare function sanitizeRunToken(value: string, fallback?: string): string;
52
+ export declare function buildUtcTimestamp(now?: Date): string;
53
+ export declare function buildRunId(options: BuildRunIdOptions): string;
54
+ export declare function resolveRunLayout(artifactsRoot: string, namespace: string, runId: string): RunLayout;
55
+ export declare function ensureRunLayout(layout: RunLayout): RunLayout;
56
+ export declare function writeLatestRunId(layout: RunLayout, runId?: string): string;
57
+ export declare function readLatestRunId(collectionDir: string): string | null;
58
+ export declare function buildRunManifest(options: BuildRunManifestOptions): RunManifest;
59
+ export declare function buildResumeMetadata(options: BuildResumeMetadataOptions): ResumeMetadata;
60
+ export {};
@@ -0,0 +1,29 @@
1
+ export type RuntimeDatasetType = 'process' | 'flow' | 'publish';
2
+ export type RuntimeRuleSeverity = 'info' | 'warning' | 'blocker';
3
+ export type RuntimeRulesetPhase = 'authoring' | 'repair' | 'publish' | 'identity' | 'verification';
4
+ export type RuntimeRulesetId = 'process-authoring/strict' | 'process-authoring/repair' | 'process-publish/default' | 'process-dedup/default' | 'flow-authoring/strict' | 'flow-publish/default' | 'flow-dedup/default' | 'publish-run/default';
5
+ export type RuntimeRule = {
6
+ id: string;
7
+ dataset_type: RuntimeDatasetType;
8
+ severity: RuntimeRuleSeverity;
9
+ default_blocker: boolean;
10
+ phases: string[];
11
+ };
12
+ export type RuntimeRuleset = {
13
+ id: RuntimeRulesetId;
14
+ version: '1';
15
+ source_version: typeof RUNTIME_RULESET_SOURCE_VERSION;
16
+ dataset_type: RuntimeDatasetType;
17
+ phase: RuntimeRulesetPhase;
18
+ rule_ids: string[];
19
+ };
20
+ export declare const RUNTIME_RULESET_SOURCE_VERSION = "2026.05.23";
21
+ export declare const RUNTIME_RULESET_VERSION = "1";
22
+ export declare function listRuntimeRulesets(): RuntimeRuleset[];
23
+ export declare function getRuntimeRuleset<T extends RuntimeRulesetId>(id: T): RuntimeRuleset & {
24
+ id: T;
25
+ };
26
+ export declare function getRuntimeRule(id: string): RuntimeRule | null;
27
+ export declare function runtimeRuleIds(id: RuntimeRulesetId): string[];
28
+ export declare function resolveRuntimeRuleId(rulesetId: RuntimeRulesetId, localRuleId: string | null | undefined): string | null;
29
+ export declare function isRuntimeRuleBlocker(ruleId: string | null | undefined): boolean;
@@ -0,0 +1,25 @@
1
+ import { CliError } from './errors.js';
2
+ export type StateLockMetadata = {
3
+ ownerPid: number;
4
+ ownerHost: string;
5
+ reason: string;
6
+ updatedAt: string;
7
+ };
8
+ export type StateLockOptions = {
9
+ reason: string;
10
+ metadata?: Record<string, string | number | boolean | null>;
11
+ stalePolicy?: 'local-pid' | 'same-host-pid' | 'never';
12
+ timeoutMs?: number;
13
+ pollMs?: number;
14
+ sleep?: (ms: number) => Promise<void>;
15
+ pid?: number;
16
+ host?: string;
17
+ now?: Date;
18
+ };
19
+ export declare class StateLockTimeoutError extends CliError {
20
+ constructor(lockPath: string, reason: string, waitedMs: number, owner: Record<string, unknown> | null);
21
+ }
22
+ export declare function lockPathForState(statePath: string): string;
23
+ export declare function readStateLockMetadata(lockPath: string): Record<string, unknown> | null;
24
+ export declare function isProcessAlive(pid: number): boolean;
25
+ export declare function withStateFileLock<T>(statePath: string, options: StateLockOptions, task: () => Promise<T> | T): Promise<T>;
@@ -5,6 +5,7 @@ import { CliError } from './errors.js';
5
5
  const LOCAL_LOCK_OWNERS = new Map();
6
6
  const DEFAULT_TIMEOUT_MS = 300_000;
7
7
  const DEFAULT_POLL_MS = 200;
8
+ const MAX_NODE_TIMER_DELAY_MS = 2_147_483_647;
8
9
  function sleepMs(ms) {
9
10
  return new Promise((resolve) => {
10
11
  setTimeout(resolve, ms);
@@ -17,6 +18,19 @@ function isErrnoException(error, code) {
17
18
  error.code === code);
18
19
  }
19
20
  function normalizeLockTimings(options) {
21
+ for (const [label, value] of [
22
+ ['timeoutMs', options.timeoutMs],
23
+ ['pollMs', options.pollMs],
24
+ ]) {
25
+ if (value === undefined)
26
+ continue;
27
+ if (!Number.isSafeInteger(value)) {
28
+ throw new RangeError(`State lock ${label} must be a finite safe integer.`);
29
+ }
30
+ if (value > MAX_NODE_TIMER_DELAY_MS) {
31
+ throw new RangeError(`State lock ${label} exceeds the maximum supported timer delay (${MAX_NODE_TIMER_DELAY_MS} ms).`);
32
+ }
33
+ }
20
34
  return {
21
35
  timeoutMs: Math.max(options.timeoutMs ?? DEFAULT_TIMEOUT_MS, 0),
22
36
  pollMs: Math.max(options.pollMs ?? DEFAULT_POLL_MS, 10),
@@ -96,6 +110,7 @@ export async function withStateFileLock(statePath, options, task) {
96
110
  try {
97
111
  const fileDescriptor = openSync(lockPath, 'wx');
98
112
  const metadata = {
113
+ ...options.metadata,
99
114
  ownerPid: options.pid ?? process.pid,
100
115
  ownerHost: options.host ?? os.hostname(),
101
116
  reason: options.reason,
@@ -128,7 +143,14 @@ export async function withStateFileLock(statePath, options, task) {
128
143
  }
129
144
  const metadata = readStateLockMetadata(lockPath);
130
145
  const ownerPid = metadata?.ownerPid;
131
- if (typeof ownerPid === 'number' && !isProcessAlive(ownerPid)) {
146
+ const stalePolicy = options.stalePolicy ?? 'local-pid';
147
+ const ownerHost = metadata?.ownerHost;
148
+ const currentHost = options.host ?? os.hostname();
149
+ const staleOwner = stalePolicy !== 'never' &&
150
+ typeof ownerPid === 'number' &&
151
+ !isProcessAlive(ownerPid) &&
152
+ (stalePolicy === 'local-pid' || ownerHost === currentHost);
153
+ if (staleOwner) {
132
154
  try {
133
155
  unlinkSync(lockPath);
134
156
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"state-lock.js","sourceRoot":"","sources":["../../../src/lib/state-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAwBvC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA0B,CAAC;AAC5D,MAAM,kBAAkB,GAAG,OAAO,CAAC;AACnC,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,SAAS,OAAO,CAAC,EAAU;IACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc,EAAE,IAAY;IACpD,OAAO,OAAO,CACZ,KAAK;QACL,OAAO,KAAK,KAAK,QAAQ;QACzB,MAAM,IAAI,KAAK;QACd,KAA+B,CAAC,IAAI,KAAK,IAAI,CAC/C,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAyB;IACrD,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,kBAAkB,EAAE,CAAC,CAAC;QAC/D,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,eAAe,EAAE,EAAE,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,cAAsB,EAAE,QAA2B;IAC5E,aAAa,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe;IAC5C,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QACjB,OAAO;IACT,CAAC;IAED,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,OAAO,qBAAsB,SAAQ,QAAQ;IACjD,YACE,QAAgB,EAChB,MAAc,EACd,QAAgB,EAChB,KAAqC;QAErC,KAAK,CAAC,mBAAmB,QAAQ,4BAA4B,QAAQ,EAAE,EAAE;YACvE,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE;gBACP,QAAQ;gBACR,MAAM;gBACN,QAAQ;gBACR,KAAK;aACN;SACF,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,GAAG,SAAS,OAAO,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAkC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAiB,EACjB,OAAyB,EACzB,IAA0B;IAE1B,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAElD,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC;IAEvC,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAsB;gBAClC,QAAQ,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;gBACpC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE;gBACxC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,SAAS,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;aACrD,CAAC;YACF,iBAAiB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;YAC5C,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE;gBAC7B,KAAK,EAAE,CAAC;gBACR,EAAE,EAAE,cAAc;aACnB,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,EAAE,CAAC;YACtB,CAAC;oBAAS,CAAC;gBACT,qBAAqB,CAAC,OAAO,CAAC,CAAC;gBAC/B,SAAS,CAAC,cAAc,CAAC,CAAC;gBAC1B,IAAI,CAAC;oBACH,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;wBACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,QAAQ,IAAI,CAAC,CAAC;oBAC1E,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;gBACvC,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,CAAC;YACpC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9D,IAAI,CAAC;oBACH,UAAU,CAAC,QAAQ,CAAC,CAAC;oBACrB,SAAS;gBACX,CAAC;gBAAC,OAAO,WAAW,EAAE,CAAC;oBACrB,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;wBAC7C,MAAM,WAAW,CAAC;oBACpB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,SAAS,KAAK,CAAC,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;gBAC7C,MAAM,IAAI,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAChF,CAAC;YAED,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import {\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { CliError } from './errors.js';\n\nexport type StateLockMetadata = {\n ownerPid: number;\n ownerHost: string;\n reason: string;\n updatedAt: string;\n};\n\nexport type StateLockOptions = {\n reason: string;\n timeoutMs?: number;\n pollMs?: number;\n sleep?: (ms: number) => Promise<void>;\n pid?: number;\n host?: string;\n now?: Date;\n};\n\ntype LocalLockOwner = {\n depth: number;\n fd: number;\n};\n\nconst LOCAL_LOCK_OWNERS = new Map<string, LocalLockOwner>();\nconst DEFAULT_TIMEOUT_MS = 300_000;\nconst DEFAULT_POLL_MS = 200;\n\nfunction sleepMs(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction isErrnoException(error: unknown, code: string): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as NodeJS.ErrnoException).code === code,\n );\n}\n\nfunction normalizeLockTimings(options: StateLockOptions): { timeoutMs: number; pollMs: number } {\n return {\n timeoutMs: Math.max(options.timeoutMs ?? DEFAULT_TIMEOUT_MS, 0),\n pollMs: Math.max(options.pollMs ?? DEFAULT_POLL_MS, 10),\n };\n}\n\nfunction writeLockMetadata(fileDescriptor: number, metadata: StateLockMetadata): void {\n writeFileSync(fileDescriptor, `${JSON.stringify(metadata, null, 2)}\\n`, 'utf8');\n}\n\nfunction releaseLocalLockOwner(lockKey: string): void {\n const owner = LOCAL_LOCK_OWNERS.get(lockKey);\n if (owner && owner.depth > 1) {\n owner.depth -= 1;\n return;\n }\n\n LOCAL_LOCK_OWNERS.delete(lockKey);\n}\n\nexport class StateLockTimeoutError extends CliError {\n constructor(\n lockPath: string,\n reason: string,\n waitedMs: number,\n owner: Record<string, unknown> | null,\n ) {\n super(`Timed out after ${waitedMs}ms acquiring state lock: ${lockPath}`, {\n code: 'STATE_LOCK_TIMEOUT',\n exitCode: 1,\n details: {\n lockPath,\n reason,\n waitedMs,\n owner,\n },\n });\n }\n}\n\nexport function lockPathForState(statePath: string): string {\n return `${statePath}.lock`;\n}\n\nexport function readStateLockMetadata(lockPath: string): Record<string, unknown> | null {\n if (!existsSync(lockPath)) {\n return null;\n }\n\n const text = readFileSync(lockPath, 'utf8').trim();\n if (!text) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(text);\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : null;\n } catch {\n return { raw: text };\n }\n}\n\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return !isErrnoException(error, 'ESRCH');\n }\n}\n\nexport async function withStateFileLock<T>(\n statePath: string,\n options: StateLockOptions,\n task: () => Promise<T> | T,\n): Promise<T> {\n const { timeoutMs, pollMs } = normalizeLockTimings(options);\n const lockPath = lockPathForState(statePath);\n const lockKey = path.resolve(lockPath);\n const localOwner = LOCAL_LOCK_OWNERS.get(lockKey);\n\n if (localOwner) {\n localOwner.depth += 1;\n try {\n return await task();\n } finally {\n releaseLocalLockOwner(lockKey);\n }\n }\n\n mkdirSync(path.dirname(lockPath), { recursive: true });\n const startedAt = Date.now();\n const sleep = options.sleep ?? sleepMs;\n\n while (true) {\n try {\n const fileDescriptor = openSync(lockPath, 'wx');\n const metadata: StateLockMetadata = {\n ownerPid: options.pid ?? process.pid,\n ownerHost: options.host ?? os.hostname(),\n reason: options.reason,\n updatedAt: (options.now ?? new Date()).toISOString(),\n };\n writeLockMetadata(fileDescriptor, metadata);\n LOCAL_LOCK_OWNERS.set(lockKey, {\n depth: 1,\n fd: fileDescriptor,\n });\n\n try {\n return await task();\n } finally {\n releaseLocalLockOwner(lockKey);\n closeSync(fileDescriptor);\n try {\n unlinkSync(lockPath);\n } catch (error) {\n if (!isErrnoException(error, 'ENOENT')) {\n process.stderr.write(`Failed to remove state lock file: ${lockPath}\\n`);\n }\n }\n }\n } catch (error) {\n if (!isErrnoException(error, 'EEXIST')) {\n throw error;\n }\n\n const metadata = readStateLockMetadata(lockPath);\n const ownerPid = metadata?.ownerPid;\n if (typeof ownerPid === 'number' && !isProcessAlive(ownerPid)) {\n try {\n unlinkSync(lockPath);\n continue;\n } catch (unlinkError) {\n if (!isErrnoException(unlinkError, 'ENOENT')) {\n throw unlinkError;\n }\n }\n }\n\n const waitedMs = Date.now() - startedAt;\n if (timeoutMs === 0 || waitedMs >= timeoutMs) {\n throw new StateLockTimeoutError(lockPath, options.reason, waitedMs, metadata);\n }\n\n await sleep(pollMs);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"state-lock.js","sourceRoot":"","sources":["../../../src/lib/state-lock.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { CliError } from './errors.js';\n\nexport type StateLockMetadata = {\n ownerPid: number;\n ownerHost: string;\n reason: string;\n updatedAt: string;\n};\n\nexport type StateLockOptions = {\n reason: string;\n metadata?: Record<string, string | number | boolean | null>;\n stalePolicy?: 'local-pid' | 'same-host-pid' | 'never';\n timeoutMs?: number;\n pollMs?: number;\n sleep?: (ms: number) => Promise<void>;\n pid?: number;\n host?: string;\n now?: Date;\n};\n\ntype LocalLockOwner = {\n depth: number;\n fd: number;\n};\n\nconst LOCAL_LOCK_OWNERS = new Map<string, LocalLockOwner>();\nconst DEFAULT_TIMEOUT_MS = 300_000;\nconst DEFAULT_POLL_MS = 200;\nconst MAX_NODE_TIMER_DELAY_MS = 2_147_483_647;\n\nfunction sleepMs(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction isErrnoException(error: unknown, code: string): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as NodeJS.ErrnoException).code === code,\n );\n}\n\nfunction normalizeLockTimings(options: StateLockOptions): { timeoutMs: number; pollMs: number } {\n for (const [label, value] of [\n ['timeoutMs', options.timeoutMs],\n ['pollMs', options.pollMs],\n ] as const) {\n if (value === undefined) continue;\n if (!Number.isSafeInteger(value)) {\n throw new RangeError(`State lock ${label} must be a finite safe integer.`);\n }\n if (value > MAX_NODE_TIMER_DELAY_MS) {\n throw new RangeError(\n `State lock ${label} exceeds the maximum supported timer delay (${MAX_NODE_TIMER_DELAY_MS} ms).`,\n );\n }\n }\n return {\n timeoutMs: Math.max(options.timeoutMs ?? DEFAULT_TIMEOUT_MS, 0),\n pollMs: Math.max(options.pollMs ?? DEFAULT_POLL_MS, 10),\n };\n}\n\nfunction writeLockMetadata(fileDescriptor: number, metadata: StateLockMetadata): void {\n writeFileSync(fileDescriptor, `${JSON.stringify(metadata, null, 2)}\\n`, 'utf8');\n}\n\nfunction releaseLocalLockOwner(lockKey: string): void {\n const owner = LOCAL_LOCK_OWNERS.get(lockKey);\n if (owner && owner.depth > 1) {\n owner.depth -= 1;\n return;\n }\n\n LOCAL_LOCK_OWNERS.delete(lockKey);\n}\n\nexport class StateLockTimeoutError extends CliError {\n constructor(\n lockPath: string,\n reason: string,\n waitedMs: number,\n owner: Record<string, unknown> | null,\n ) {\n super(`Timed out after ${waitedMs}ms acquiring state lock: ${lockPath}`, {\n code: 'STATE_LOCK_TIMEOUT',\n exitCode: 1,\n details: {\n lockPath,\n reason,\n waitedMs,\n owner,\n },\n });\n }\n}\n\nexport function lockPathForState(statePath: string): string {\n return `${statePath}.lock`;\n}\n\nexport function readStateLockMetadata(lockPath: string): Record<string, unknown> | null {\n if (!existsSync(lockPath)) {\n return null;\n }\n\n const text = readFileSync(lockPath, 'utf8').trim();\n if (!text) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(text);\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : null;\n } catch {\n return { raw: text };\n }\n}\n\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return !isErrnoException(error, 'ESRCH');\n }\n}\n\nexport async function withStateFileLock<T>(\n statePath: string,\n options: StateLockOptions,\n task: () => Promise<T> | T,\n): Promise<T> {\n const { timeoutMs, pollMs } = normalizeLockTimings(options);\n const lockPath = lockPathForState(statePath);\n const lockKey = path.resolve(lockPath);\n const localOwner = LOCAL_LOCK_OWNERS.get(lockKey);\n\n if (localOwner) {\n localOwner.depth += 1;\n try {\n return await task();\n } finally {\n releaseLocalLockOwner(lockKey);\n }\n }\n\n mkdirSync(path.dirname(lockPath), { recursive: true });\n const startedAt = Date.now();\n const sleep = options.sleep ?? sleepMs;\n\n while (true) {\n try {\n const fileDescriptor = openSync(lockPath, 'wx');\n const metadata: StateLockMetadata = {\n ...options.metadata,\n ownerPid: options.pid ?? process.pid,\n ownerHost: options.host ?? os.hostname(),\n reason: options.reason,\n updatedAt: (options.now ?? new Date()).toISOString(),\n };\n writeLockMetadata(fileDescriptor, metadata);\n LOCAL_LOCK_OWNERS.set(lockKey, {\n depth: 1,\n fd: fileDescriptor,\n });\n\n try {\n return await task();\n } finally {\n releaseLocalLockOwner(lockKey);\n closeSync(fileDescriptor);\n try {\n unlinkSync(lockPath);\n } catch (error) {\n if (!isErrnoException(error, 'ENOENT')) {\n process.stderr.write(`Failed to remove state lock file: ${lockPath}\\n`);\n }\n }\n }\n } catch (error) {\n if (!isErrnoException(error, 'EEXIST')) {\n throw error;\n }\n\n const metadata = readStateLockMetadata(lockPath);\n const ownerPid = metadata?.ownerPid;\n const stalePolicy = options.stalePolicy ?? 'local-pid';\n const ownerHost = metadata?.ownerHost;\n const currentHost = options.host ?? os.hostname();\n const staleOwner =\n stalePolicy !== 'never' &&\n typeof ownerPid === 'number' &&\n !isProcessAlive(ownerPid) &&\n (stalePolicy === 'local-pid' || ownerHost === currentHost);\n if (staleOwner) {\n try {\n unlinkSync(lockPath);\n continue;\n } catch (unlinkError) {\n if (!isErrnoException(unlinkError, 'ENOENT')) {\n throw unlinkError;\n }\n }\n }\n\n const waitedMs = Date.now() - startedAt;\n if (timeoutMs === 0 || waitedMs >= timeoutMs) {\n throw new StateLockTimeoutError(lockPath, options.reason, waitedMs, metadata);\n }\n\n await sleep(pollMs);\n }\n }\n}\n"]}
@@ -0,0 +1,47 @@
1
+ import { type PostgrestError } from '@supabase/supabase-js';
2
+ import type { FetchLike } from './http.js';
3
+ export type SupabaseRestRuntime = {
4
+ apiBaseUrl: string;
5
+ userApiKey: string;
6
+ publishableKey: string;
7
+ sessionFile: string | null;
8
+ disableSessionCache: boolean;
9
+ forceReauth: boolean;
10
+ };
11
+ export type SupabaseDataRuntime = {
12
+ apiBaseUrl: string;
13
+ publishableKey: string;
14
+ getAccessToken: () => Promise<string>;
15
+ refreshAccessToken?: () => Promise<string>;
16
+ };
17
+ declare function trimToken(value: unknown): string;
18
+ declare function parseBooleanEnv(value: unknown): boolean;
19
+ export declare function requireSupabaseRestRuntime(env: NodeJS.ProcessEnv): SupabaseRestRuntime;
20
+ export declare function deriveSupabaseProjectBaseUrl(apiBaseUrl: string): string;
21
+ export declare function deriveSupabaseRestBaseUrl(apiBaseUrl: string): string;
22
+ export declare const deriveSupabaseFunctionsBaseUrl: (apiBaseUrl: string) => string;
23
+ export declare function buildSupabaseAuthHeaders(publishableKey: string, accessToken: string): Record<string, string>;
24
+ export declare function createSupabaseFetch(fetchImpl: FetchLike, timeoutMs: number, runtime?: SupabaseDataRuntime): typeof fetch;
25
+ type SupabaseQueryResult<T> = {
26
+ data: T | null;
27
+ error: PostgrestError | null;
28
+ status: number;
29
+ };
30
+ declare function postgrestInvalidJsonDetails(error: PostgrestError): string;
31
+ export declare function runSupabaseArrayQuery<T>(queryPromise: PromiseLike<SupabaseQueryResult<T[]>>, sourceUrl: string): Promise<T[]>;
32
+ export declare function runSupabaseQuery<T>(queryPromise: PromiseLike<SupabaseQueryResult<T>>, sourceUrl: string): Promise<T | null>;
33
+ export declare function runSupabaseMutation(queryPromise: PromiseLike<{
34
+ error: PostgrestError | null;
35
+ status: number;
36
+ }>, sourceUrl: string): Promise<void>;
37
+ export declare function createSupabaseDataClient(runtime: SupabaseDataRuntime, fetchImpl: FetchLike, timeoutMs: number): {
38
+ client: import("@supabase/supabase-js").SupabaseClient<any, "public", "public", any, any>;
39
+ restBaseUrl: string;
40
+ functionsBaseUrl: string;
41
+ };
42
+ export declare const __testInternals: {
43
+ postgrestInvalidJsonDetails: typeof postgrestInvalidJsonDetails;
44
+ parseBooleanEnv: typeof parseBooleanEnv;
45
+ trimToken: typeof trimToken;
46
+ };
47
+ export {};