overleaf-codex 0.1.0-rc.1

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.

Potentially problematic release.


This version of overleaf-codex might be problematic. Click here for more details.

Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +25 -0
  3. package/README.md +217 -0
  4. package/assets/olcx-mark.svg +22 -0
  5. package/dist/auth/projectAuth.d.ts +19 -0
  6. package/dist/auth/projectAuth.js +163 -0
  7. package/dist/auth/projectAuth.js.map +1 -0
  8. package/dist/auth/redact.d.ts +3 -0
  9. package/dist/auth/redact.js +7 -0
  10. package/dist/auth/redact.js.map +1 -0
  11. package/dist/auth/types.d.ts +10 -0
  12. package/dist/auth/types.js +4 -0
  13. package/dist/auth/types.js.map +1 -0
  14. package/dist/backend/index.d.ts +6 -0
  15. package/dist/backend/index.js +2 -0
  16. package/dist/backend/index.js.map +1 -0
  17. package/dist/backend/olcli/client.d.ts +329 -0
  18. package/dist/backend/olcli/client.js +1757 -0
  19. package/dist/backend/olcli/client.js.map +1 -0
  20. package/dist/backend/olcli/index.d.ts +2 -0
  21. package/dist/backend/olcli/index.js +2 -0
  22. package/dist/backend/olcli/index.js.map +1 -0
  23. package/dist/backend/overleafBackend.d.ts +41 -0
  24. package/dist/backend/overleafBackend.js +200 -0
  25. package/dist/backend/overleafBackend.js.map +1 -0
  26. package/dist/backend/types.d.ts +73 -0
  27. package/dist/backend/types.js +2 -0
  28. package/dist/backend/types.js.map +1 -0
  29. package/dist/cli-behavior.d.ts +14 -0
  30. package/dist/cli-behavior.js +59 -0
  31. package/dist/cli-behavior.js.map +1 -0
  32. package/dist/cli.d.ts +30 -0
  33. package/dist/cli.js +441 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/commands/auth.d.ts +21 -0
  36. package/dist/commands/auth.js +104 -0
  37. package/dist/commands/auth.js.map +1 -0
  38. package/dist/commands/compile.d.ts +7 -0
  39. package/dist/commands/compile.js +73 -0
  40. package/dist/commands/compile.js.map +1 -0
  41. package/dist/commands/doctor.d.ts +11 -0
  42. package/dist/commands/doctor.js +9 -0
  43. package/dist/commands/doctor.js.map +1 -0
  44. package/dist/commands/endpoint.d.ts +23 -0
  45. package/dist/commands/endpoint.js +69 -0
  46. package/dist/commands/endpoint.js.map +1 -0
  47. package/dist/commands/init.d.ts +14 -0
  48. package/dist/commands/init.js +48 -0
  49. package/dist/commands/init.js.map +1 -0
  50. package/dist/commands/status.d.ts +4 -0
  51. package/dist/commands/status.js +5 -0
  52. package/dist/commands/status.js.map +1 -0
  53. package/dist/commands/sync.d.ts +26 -0
  54. package/dist/commands/sync.js +139 -0
  55. package/dist/commands/sync.js.map +1 -0
  56. package/dist/commands/watch.d.ts +28 -0
  57. package/dist/commands/watch.js +124 -0
  58. package/dist/commands/watch.js.map +1 -0
  59. package/dist/compile/compileFlow.d.ts +32 -0
  60. package/dist/compile/compileFlow.js +290 -0
  61. package/dist/compile/compileFlow.js.map +1 -0
  62. package/dist/compile/pdfOutput.d.ts +12 -0
  63. package/dist/compile/pdfOutput.js +64 -0
  64. package/dist/compile/pdfOutput.js.map +1 -0
  65. package/dist/config/ignoreRules.d.ts +5 -0
  66. package/dist/config/ignoreRules.js +53 -0
  67. package/dist/config/ignoreRules.js.map +1 -0
  68. package/dist/config/overleafProject.d.ts +9 -0
  69. package/dist/config/overleafProject.js +61 -0
  70. package/dist/config/overleafProject.js.map +1 -0
  71. package/dist/config/projectConfig.d.ts +6 -0
  72. package/dist/config/projectConfig.js +180 -0
  73. package/dist/config/projectConfig.js.map +1 -0
  74. package/dist/config/projectRoot.d.ts +1 -0
  75. package/dist/config/projectRoot.js +36 -0
  76. package/dist/config/projectRoot.js.map +1 -0
  77. package/dist/config/types.d.ts +50 -0
  78. package/dist/config/types.js +34 -0
  79. package/dist/config/types.js.map +1 -0
  80. package/dist/config/vscode.d.ts +10 -0
  81. package/dist/config/vscode.js +134 -0
  82. package/dist/config/vscode.js.map +1 -0
  83. package/dist/diagnostics/doctor.d.ts +8 -0
  84. package/dist/diagnostics/doctor.js +209 -0
  85. package/dist/diagnostics/doctor.js.map +1 -0
  86. package/dist/diagnostics/status.d.ts +6 -0
  87. package/dist/diagnostics/status.js +110 -0
  88. package/dist/diagnostics/status.js.map +1 -0
  89. package/dist/diagnostics/types.d.ts +33 -0
  90. package/dist/diagnostics/types.js +2 -0
  91. package/dist/diagnostics/types.js.map +1 -0
  92. package/dist/endpoint/overleafEndpoint.d.ts +36 -0
  93. package/dist/endpoint/overleafEndpoint.js +105 -0
  94. package/dist/endpoint/overleafEndpoint.js.map +1 -0
  95. package/dist/errors.d.ts +32 -0
  96. package/dist/errors.js +53 -0
  97. package/dist/errors.js.map +1 -0
  98. package/dist/sync/apply.d.ts +14 -0
  99. package/dist/sync/apply.js +92 -0
  100. package/dist/sync/apply.js.map +1 -0
  101. package/dist/sync/conflicts.d.ts +7 -0
  102. package/dist/sync/conflicts.js +59 -0
  103. package/dist/sync/conflicts.js.map +1 -0
  104. package/dist/sync/ignore.d.ts +5 -0
  105. package/dist/sync/ignore.js +74 -0
  106. package/dist/sync/ignore.js.map +1 -0
  107. package/dist/sync/plan.d.ts +3 -0
  108. package/dist/sync/plan.js +197 -0
  109. package/dist/sync/plan.js.map +1 -0
  110. package/dist/sync/snapshot.d.ts +13 -0
  111. package/dist/sync/snapshot.js +82 -0
  112. package/dist/sync/snapshot.js.map +1 -0
  113. package/dist/sync/state.d.ts +16 -0
  114. package/dist/sync/state.js +214 -0
  115. package/dist/sync/state.js.map +1 -0
  116. package/dist/sync/types.d.ts +113 -0
  117. package/dist/sync/types.js +4 -0
  118. package/dist/sync/types.js.map +1 -0
  119. package/dist/testing/fakeBackend.d.ts +27 -0
  120. package/dist/testing/fakeBackend.js +213 -0
  121. package/dist/testing/fakeBackend.js.map +1 -0
  122. package/dist/watch/queue.d.ts +2 -0
  123. package/dist/watch/queue.js +91 -0
  124. package/dist/watch/queue.js.map +1 -0
  125. package/dist/watch/types.d.ts +52 -0
  126. package/dist/watch/types.js +2 -0
  127. package/dist/watch/types.js.map +1 -0
  128. package/dist/watch/watcher.d.ts +6 -0
  129. package/dist/watch/watcher.js +58 -0
  130. package/dist/watch/watcher.js.map +1 -0
  131. package/dist/watch/workflow.d.ts +30 -0
  132. package/dist/watch/workflow.js +62 -0
  133. package/dist/watch/workflow.js.map +1 -0
  134. package/docs/architecture.md +603 -0
  135. package/docs/auth.md +65 -0
  136. package/docs/cli-behavior.md +95 -0
  137. package/docs/compile.md +51 -0
  138. package/docs/design.md +82 -0
  139. package/docs/endpoint.md +84 -0
  140. package/docs/npm-packaging.md +148 -0
  141. package/docs/quickdev-queue-audit.md +193 -0
  142. package/docs/release-gates.md +119 -0
  143. package/docs/release-notes-v1.md +97 -0
  144. package/docs/security.md +61 -0
  145. package/docs/sync-state.md +305 -0
  146. package/docs/sync.md +50 -0
  147. package/docs/troubleshooting.md +124 -0
  148. package/docs/usage.md +184 -0
  149. package/examples/minimal-paper/.olcx/auth.local.example.json +7 -0
  150. package/examples/minimal-paper/.olcx/config.json +23 -0
  151. package/examples/minimal-paper/README.md +88 -0
  152. package/examples/minimal-paper/main.tex +23 -0
  153. package/package.json +66 -0
  154. package/src/backend/olcli/LICENSE +21 -0
  155. package/src/backend/olcli/README.md +26 -0
@@ -0,0 +1,91 @@
1
+ export function createWatchQueue(input) {
2
+ const timers = input.timers ?? { setTimeout, clearTimeout };
3
+ let timer;
4
+ let bufferedEvents = [];
5
+ let running = false;
6
+ let pending = false;
7
+ let paused = false;
8
+ let stopped = false;
9
+ let lastError;
10
+ let currentRun;
11
+ function clearTimer() {
12
+ if (timer !== undefined) {
13
+ timers.clearTimeout(timer);
14
+ timer = undefined;
15
+ }
16
+ }
17
+ function schedule() {
18
+ clearTimer();
19
+ if (paused || stopped || bufferedEvents.length === 0)
20
+ return;
21
+ timer = timers.setTimeout(() => {
22
+ timer = undefined;
23
+ void drain();
24
+ }, input.debounceMs);
25
+ }
26
+ async function drain() {
27
+ if (paused || stopped || running) {
28
+ pending = running && !paused && !stopped && bufferedEvents.length > 0;
29
+ return;
30
+ }
31
+ const events = bufferedEvents;
32
+ bufferedEvents = [];
33
+ pending = false;
34
+ running = true;
35
+ currentRun = (async () => {
36
+ try {
37
+ await input.onStart?.(events);
38
+ await input.run(events);
39
+ await input.onSuccess?.(events);
40
+ }
41
+ catch (error) {
42
+ lastError = error;
43
+ paused = true;
44
+ bufferedEvents = [];
45
+ pending = false;
46
+ clearTimer();
47
+ await input.onFailure?.(error, events);
48
+ }
49
+ finally {
50
+ running = false;
51
+ currentRun = undefined;
52
+ if (!paused && !stopped && bufferedEvents.length > 0) {
53
+ pending = true;
54
+ schedule();
55
+ }
56
+ }
57
+ })();
58
+ await currentRun;
59
+ }
60
+ return {
61
+ trigger(event) {
62
+ if (paused || stopped)
63
+ return false;
64
+ bufferedEvents.push(event);
65
+ if (running) {
66
+ pending = true;
67
+ return true;
68
+ }
69
+ schedule();
70
+ return true;
71
+ },
72
+ pause(error) {
73
+ lastError = error;
74
+ paused = true;
75
+ pending = false;
76
+ bufferedEvents = [];
77
+ clearTimer();
78
+ },
79
+ status() {
80
+ return { paused, running, pending, stopped, lastError };
81
+ },
82
+ async shutdown() {
83
+ stopped = true;
84
+ pending = false;
85
+ bufferedEvents = [];
86
+ clearTimer();
87
+ await currentRun;
88
+ },
89
+ };
90
+ }
91
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/watch/queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { ExitCode } from "../errors.js";
2
+ export type WatchEventName = "add" | "change" | "unlink";
3
+ export interface WatchChangeEvent {
4
+ event: WatchEventName;
5
+ path: string;
6
+ }
7
+ export interface WatchQueueStatus {
8
+ paused: boolean;
9
+ running: boolean;
10
+ pending: boolean;
11
+ stopped: boolean;
12
+ lastError?: unknown;
13
+ }
14
+ export interface WatchTimers {
15
+ setTimeout: typeof setTimeout;
16
+ clearTimeout: typeof clearTimeout;
17
+ }
18
+ export interface WatchQueueInput {
19
+ debounceMs: number;
20
+ run: (events: WatchChangeEvent[]) => Promise<void>;
21
+ onStart?: (events: WatchChangeEvent[]) => void | Promise<void>;
22
+ onSuccess?: (events: WatchChangeEvent[]) => void | Promise<void>;
23
+ onFailure?: (error: unknown, events: WatchChangeEvent[]) => void | Promise<void>;
24
+ timers?: WatchTimers;
25
+ }
26
+ export interface WatchQueue {
27
+ trigger(event: WatchChangeEvent): boolean;
28
+ pause(error?: unknown): void;
29
+ status(): WatchQueueStatus;
30
+ shutdown(): Promise<void>;
31
+ }
32
+ export interface WatchHandle {
33
+ close(): Promise<void> | void;
34
+ }
35
+ export interface WatchAdapterInput {
36
+ projectRoot: string;
37
+ ignored: (path: string) => boolean;
38
+ onChange: (event: WatchChangeEvent) => void;
39
+ onError: (error: unknown) => void;
40
+ }
41
+ export interface WatchAdapter {
42
+ watch(input: WatchAdapterInput): Promise<WatchHandle> | WatchHandle;
43
+ }
44
+ export type WatchSignalName = "SIGINT" | "SIGTERM";
45
+ export interface WatchSignalRuntime {
46
+ on(signal: WatchSignalName, listener: () => void | Promise<void>): () => void;
47
+ }
48
+ export interface WatchCommandResult {
49
+ exitCode: ExitCode;
50
+ paused: boolean;
51
+ lastError?: unknown;
52
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/watch/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { WatchAdapter } from "./types.js";
2
+ export declare function createWatchIgnoredPredicate(input: {
3
+ projectRoot: string;
4
+ userIgnorePatterns?: readonly string[];
5
+ }): (path: string) => boolean;
6
+ export declare function createChokidarWatchAdapter(): WatchAdapter;
@@ -0,0 +1,58 @@
1
+ import chokidar from "chokidar";
2
+ import { isAbsolute, relative, win32 } from "node:path";
3
+ import { createIgnoreMatcher, normalizeSyncPath } from "../sync/ignore.js";
4
+ const WATCH_EVENTS = new Set(["add", "change", "unlink"]);
5
+ export function createWatchIgnoredPredicate(input) {
6
+ const matcher = createIgnoreMatcher(input.userIgnorePatterns);
7
+ return (path) => {
8
+ const relativePath = toProjectRelativePath(input.projectRoot, path);
9
+ return matcher.isIgnored(relativePath);
10
+ };
11
+ }
12
+ export function createChokidarWatchAdapter() {
13
+ return {
14
+ watch(input) {
15
+ const watcher = chokidar.watch(input.projectRoot, {
16
+ cwd: input.projectRoot,
17
+ ignoreInitial: true,
18
+ persistent: true,
19
+ awaitWriteFinish: {
20
+ stabilityThreshold: 200,
21
+ pollInterval: 100,
22
+ },
23
+ ignored: (path) => input.ignored(String(path)),
24
+ });
25
+ watcher.on("all", (eventName, path) => {
26
+ if (!WATCH_EVENTS.has(eventName))
27
+ return;
28
+ const event = {
29
+ event: eventName,
30
+ path: normalizeSyncPath(String(path)),
31
+ };
32
+ if (!input.ignored(event.path)) {
33
+ input.onChange(event);
34
+ }
35
+ });
36
+ watcher.on("error", input.onError);
37
+ return {
38
+ close: () => watcher.close(),
39
+ };
40
+ },
41
+ };
42
+ }
43
+ function toProjectRelativePath(projectRoot, path) {
44
+ const normalizedInput = normalizeSyncPath(path);
45
+ const inputIsAbsolute = isAbsolute(path);
46
+ const inputIsWindowsAbsolute = win32.isAbsolute(path);
47
+ if (!inputIsAbsolute && !inputIsWindowsAbsolute) {
48
+ return normalizedInput;
49
+ }
50
+ const relativePath = inputIsWindowsAbsolute || win32.isAbsolute(projectRoot)
51
+ ? win32.relative(projectRoot, path)
52
+ : relative(projectRoot, path);
53
+ if (relativePath === "") {
54
+ return "";
55
+ }
56
+ return normalizeSyncPath(relativePath);
57
+ }
58
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/watch/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE1D,MAAM,UAAU,2BAA2B,CAAC,KAG3C;IACC,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAE9D,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,MAAM,YAAY,GAAG,qBAAqB,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACpE,OAAO,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO;QACL,KAAK,CAAC,KAAK;YACT,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE;gBAChD,GAAG,EAAE,KAAK,CAAC,WAAW;gBACtB,aAAa,EAAE,IAAI;gBACnB,UAAU,EAAE,IAAI;gBAChB,gBAAgB,EAAE;oBAChB,kBAAkB,EAAE,GAAG;oBACvB,YAAY,EAAE,GAAG;iBAClB;gBACD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;aAC/C,CAAC,CAAC;YAEH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE;gBACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;oBAAE,OAAO;gBACzC,MAAM,KAAK,GAAqB;oBAC9B,KAAK,EAAE,SAAsC;oBAC7C,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;iBACtC,CAAC;gBACF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC/B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAEnC,OAAO;gBACL,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;aAC7B,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,WAAmB,EAAE,IAAY;IAC9D,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,sBAAsB,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAEtD,IAAI,CAAC,eAAe,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAChD,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,YAAY,GAChB,sBAAsB,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;QACrD,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;QACnC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAClC,IAAI,YAAY,KAAK,EAAE,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,iBAAiB,CAAC,YAAY,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { OverleafBackend, OverleafBackendFactory } from "../backend/index.js";
2
+ import { runCompileCommand, type RunCompileCommandInput } from "../commands/compile.js";
3
+ import { type SyncProjectOptions, type SyncProjectResult } from "../commands/sync.js";
4
+ import type { ProjectConfig } from "../config/types.js";
5
+ import { type OlcxError } from "../errors.js";
6
+ export type WatchPhase = "sync" | "compile";
7
+ export interface PreparedWatchProject {
8
+ projectRoot: string;
9
+ config: ProjectConfig;
10
+ }
11
+ export interface WatchCycleInput {
12
+ cwd: string;
13
+ backend?: OverleafBackend;
14
+ createBackend?: OverleafBackendFactory;
15
+ env?: Record<string, string | undefined>;
16
+ now?: () => Date;
17
+ syncProject?: (options: SyncProjectOptions) => Promise<SyncProjectResult>;
18
+ runCompileCommand?: (input: RunCompileCommandInput) => Promise<Awaited<ReturnType<typeof runCompileCommand>>>;
19
+ }
20
+ export interface WatchCycleResult {
21
+ sync: SyncProjectResult;
22
+ compile: Awaited<ReturnType<typeof runCompileCommand>>;
23
+ }
24
+ export declare function prepareWatchProject(input: {
25
+ cwd: string;
26
+ env?: Record<string, string | undefined>;
27
+ now?: () => Date;
28
+ }): Promise<PreparedWatchProject>;
29
+ export declare function runWatchCycle(input: WatchCycleInput): Promise<WatchCycleResult>;
30
+ export declare function tagWatchFailure(error: unknown, phase: WatchPhase): OlcxError;
@@ -0,0 +1,62 @@
1
+ import { resolveProjectAuth } from "../auth/projectAuth.js";
2
+ import { runCompileCommand } from "../commands/compile.js";
3
+ import { syncProject } from "../commands/sync.js";
4
+ import { readProjectConfig } from "../config/projectConfig.js";
5
+ import { findProjectRoot } from "../config/projectRoot.js";
6
+ import { createOlcxError, isOlcxError } from "../errors.js";
7
+ export async function prepareWatchProject(input) {
8
+ const projectRoot = await findProjectRoot(input.cwd);
9
+ const config = await readProjectConfig(projectRoot);
10
+ await resolveProjectAuth(projectRoot, { env: input.env, now: input.now });
11
+ return { projectRoot, config };
12
+ }
13
+ export async function runWatchCycle(input) {
14
+ const runSync = input.syncProject ?? syncProject;
15
+ const runCompile = input.runCompileCommand ?? runCompileCommand;
16
+ let sync;
17
+ try {
18
+ sync = await runSync({
19
+ cwd: input.cwd,
20
+ dryRun: false,
21
+ backend: input.backend,
22
+ createBackend: input.createBackend,
23
+ env: input.env,
24
+ now: input.now,
25
+ });
26
+ }
27
+ catch (error) {
28
+ throw tagWatchFailure(error, "sync");
29
+ }
30
+ try {
31
+ const compile = await runCompile({
32
+ cwd: input.cwd,
33
+ backend: input.backend,
34
+ createBackend: input.createBackend,
35
+ env: input.env,
36
+ now: input.now,
37
+ });
38
+ return { sync, compile };
39
+ }
40
+ catch (error) {
41
+ throw tagWatchFailure(error, "compile");
42
+ }
43
+ }
44
+ export function tagWatchFailure(error, phase) {
45
+ if (isOlcxError(error)) {
46
+ return createOlcxError({
47
+ code: error.code,
48
+ message: error.message,
49
+ hint: error.hint,
50
+ details: { ...(error.details ?? {}), watchPhase: phase },
51
+ cause: error,
52
+ });
53
+ }
54
+ return createOlcxError({
55
+ code: "INTERNAL_ERROR",
56
+ message: error instanceof Error ? error.message : "Unexpected watch workflow failure.",
57
+ hint: "Stop olcx watch, inspect the error, and retry after fixing the issue.",
58
+ details: { watchPhase: phase },
59
+ cause: error,
60
+ });
61
+ }
62
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/watch/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,iBAAiB,EAA+B,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAmD,MAAM,qBAAqB,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAkB,MAAM,cAAc,CAAC;AAwB5E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAIzC;IACC,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,kBAAkB,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAsB;IACxD,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,IAAI,WAAW,CAAC;IACjD,MAAM,UAAU,GAAG,KAAK,CAAC,iBAAiB,IAAI,iBAAiB,CAAC;IAEhE,IAAI,IAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,OAAO,CAAC;YACnB,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC;YAC/B,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc,EAAE,KAAiB;IAC/D,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,eAAe,CAAC;YACrB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE;YACxD,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;IAED,OAAO,eAAe,CAAC;QACrB,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC;QACtF,IAAI,EAAE,uEAAuE;QAC7E,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;QAC9B,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;AACL,CAAC"}