@quenty/nevermore-cli 4.43.3 → 4.44.0

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/CHANGELOG.md +10 -0
  2. package/build-scripts/{combine-test-places.luau → combine-test-places.lua} +3 -3
  3. package/build-scripts/{transform-inject-deploy-metadata.luau → transform-inject-deploy-metadata.lua} +3 -3
  4. package/dist/commands/batch-command/batch-deploy-command.js +4 -4
  5. package/dist/commands/batch-command/batch-deploy-command.js.map +1 -1
  6. package/dist/commands/batch-command/batch-test-command.d.ts.map +1 -1
  7. package/dist/commands/batch-command/batch-test-command.js +76 -19
  8. package/dist/commands/batch-command/batch-test-command.js.map +1 -1
  9. package/dist/commands/deploy-command/deploy-init-utils.d.ts.map +1 -1
  10. package/dist/commands/deploy-command/deploy-init-utils.js +7 -1
  11. package/dist/commands/deploy-command/deploy-init-utils.js.map +1 -1
  12. package/dist/commands/deploy-command/index.js +1 -1
  13. package/dist/commands/deploy-command/index.js.map +1 -1
  14. package/dist/commands/init-command/init-game-command.js +2 -2
  15. package/dist/commands/init-command/init-game-command.js.map +1 -1
  16. package/dist/commands/install-package-command.d.ts +14 -0
  17. package/dist/commands/install-package-command.d.ts.map +1 -1
  18. package/dist/commands/install-package-command.js +65 -12
  19. package/dist/commands/install-package-command.js.map +1 -1
  20. package/dist/utils/deploy/deploy-github-columns.d.ts +12 -2
  21. package/dist/utils/deploy/deploy-github-columns.d.ts.map +1 -1
  22. package/dist/utils/deploy/deploy-github-columns.js +11 -4
  23. package/dist/utils/deploy/deploy-github-columns.js.map +1 -1
  24. package/dist/utils/deploy/deploy-metadata.js +1 -1
  25. package/dist/utils/deploy/deploy-metadata.js.map +1 -1
  26. package/dist/utils/job-context/base-job-context.d.ts +2 -2
  27. package/dist/utils/job-context/base-job-context.d.ts.map +1 -1
  28. package/dist/utils/job-context/base-job-context.js +1 -1
  29. package/dist/utils/job-context/base-job-context.js.map +1 -1
  30. package/dist/utils/job-context/batch-script-job-context.d.ts +37 -2
  31. package/dist/utils/job-context/batch-script-job-context.d.ts.map +1 -1
  32. package/dist/utils/job-context/batch-script-job-context.js +59 -22
  33. package/dist/utils/job-context/batch-script-job-context.js.map +1 -1
  34. package/dist/utils/job-context/cloud-job-context.d.ts +2 -2
  35. package/dist/utils/job-context/cloud-job-context.d.ts.map +1 -1
  36. package/dist/utils/job-context/cloud-job-context.js +10 -5
  37. package/dist/utils/job-context/cloud-job-context.js.map +1 -1
  38. package/dist/utils/job-context/cloud-job-context.test.d.ts +7 -0
  39. package/dist/utils/job-context/cloud-job-context.test.d.ts.map +1 -0
  40. package/dist/utils/job-context/cloud-job-context.test.js +91 -0
  41. package/dist/utils/job-context/cloud-job-context.test.js.map +1 -0
  42. package/dist/utils/job-context/job-context.d.ts +70 -2
  43. package/dist/utils/job-context/job-context.d.ts.map +1 -1
  44. package/dist/utils/job-context/local-job-context.d.ts +2 -2
  45. package/dist/utils/job-context/local-job-context.d.ts.map +1 -1
  46. package/dist/utils/job-context/local-job-context.js +4 -2
  47. package/dist/utils/job-context/local-job-context.js.map +1 -1
  48. package/dist/utils/job-context/local-job-context.test.d.ts +7 -0
  49. package/dist/utils/job-context/local-job-context.test.d.ts.map +1 -0
  50. package/dist/utils/job-context/local-job-context.test.js +68 -0
  51. package/dist/utils/job-context/local-job-context.test.js.map +1 -0
  52. package/dist/utils/open-cloud/open-cloud-client.d.ts +50 -7
  53. package/dist/utils/open-cloud/open-cloud-client.d.ts.map +1 -1
  54. package/dist/utils/open-cloud/open-cloud-client.js +49 -13
  55. package/dist/utils/open-cloud/open-cloud-client.js.map +1 -1
  56. package/dist/utils/open-cloud/open-cloud-client.test.js +125 -1
  57. package/dist/utils/open-cloud/open-cloud-client.test.js.map +1 -1
  58. package/dist/utils/open-cloud/open-cloud-logs.characterization.test.d.ts +22 -0
  59. package/dist/utils/open-cloud/open-cloud-logs.characterization.test.d.ts.map +1 -0
  60. package/dist/utils/open-cloud/open-cloud-logs.characterization.test.js +202 -0
  61. package/dist/utils/open-cloud/open-cloud-logs.characterization.test.js.map +1 -0
  62. package/dist/utils/package-manager-utils.d.ts +29 -0
  63. package/dist/utils/package-manager-utils.d.ts.map +1 -0
  64. package/dist/utils/package-manager-utils.js +120 -0
  65. package/dist/utils/package-manager-utils.js.map +1 -0
  66. package/dist/utils/package-manager-utils.test.d.ts +2 -0
  67. package/dist/utils/package-manager-utils.test.d.ts.map +1 -0
  68. package/dist/utils/package-manager-utils.test.js +121 -0
  69. package/dist/utils/package-manager-utils.test.js.map +1 -0
  70. package/dist/utils/testing/batch-run.e2e.test.d.ts +17 -0
  71. package/dist/utils/testing/batch-run.e2e.test.d.ts.map +1 -0
  72. package/dist/utils/testing/batch-run.e2e.test.js +343 -0
  73. package/dist/utils/testing/batch-run.e2e.test.js.map +1 -0
  74. package/dist/utils/testing/batch-test-runner-template.test.d.ts +11 -0
  75. package/dist/utils/testing/batch-test-runner-template.test.d.ts.map +1 -0
  76. package/dist/utils/testing/batch-test-runner-template.test.js +38 -0
  77. package/dist/utils/testing/batch-test-runner-template.test.js.map +1 -0
  78. package/dist/utils/testing/log-fetch-stats.d.ts +40 -0
  79. package/dist/utils/testing/log-fetch-stats.d.ts.map +1 -0
  80. package/dist/utils/testing/log-fetch-stats.js +18 -0
  81. package/dist/utils/testing/log-fetch-stats.js.map +1 -0
  82. package/dist/utils/testing/log-fetch-stats.test.d.ts +2 -0
  83. package/dist/utils/testing/log-fetch-stats.test.d.ts.map +1 -0
  84. package/dist/utils/testing/log-fetch-stats.test.js +41 -0
  85. package/dist/utils/testing/log-fetch-stats.test.js.map +1 -0
  86. package/dist/utils/testing/parsers/batch-log-parser.d.ts +126 -1
  87. package/dist/utils/testing/parsers/batch-log-parser.d.ts.map +1 -1
  88. package/dist/utils/testing/parsers/batch-log-parser.js +440 -103
  89. package/dist/utils/testing/parsers/batch-log-parser.js.map +1 -1
  90. package/dist/utils/testing/parsers/batch-log-parser.test.js +494 -1
  91. package/dist/utils/testing/parsers/batch-log-parser.test.js.map +1 -1
  92. package/dist/utils/testing/parsers/batch-log-renderer.d.ts +79 -0
  93. package/dist/utils/testing/parsers/batch-log-renderer.d.ts.map +1 -0
  94. package/dist/utils/testing/parsers/batch-log-renderer.js +241 -0
  95. package/dist/utils/testing/parsers/batch-log-renderer.js.map +1 -0
  96. package/dist/utils/testing/parsers/batch-log-renderer.test.d.ts +2 -0
  97. package/dist/utils/testing/parsers/batch-log-renderer.test.d.ts.map +1 -0
  98. package/dist/utils/testing/parsers/batch-log-renderer.test.js +202 -0
  99. package/dist/utils/testing/parsers/batch-log-renderer.test.js.map +1 -0
  100. package/dist/utils/testing/runner/combined-project-generator.js +1 -1
  101. package/dist/utils/testing/runner/combined-project-generator.js.map +1 -1
  102. package/dist/utils/testing/runner/test-runner.d.ts +24 -0
  103. package/dist/utils/testing/runner/test-runner.d.ts.map +1 -1
  104. package/dist/utils/testing/runner/test-runner.js +166 -6
  105. package/dist/utils/testing/runner/test-runner.js.map +1 -1
  106. package/dist/utils/testing/runner/test-runner.test.js +228 -2
  107. package/dist/utils/testing/runner/test-runner.test.js.map +1 -1
  108. package/dist/utils/testing/structured-test-results.d.ts +77 -0
  109. package/dist/utils/testing/structured-test-results.d.ts.map +1 -0
  110. package/dist/utils/testing/structured-test-results.js +140 -0
  111. package/dist/utils/testing/structured-test-results.js.map +1 -0
  112. package/dist/utils/testing/structured-test-results.test.d.ts +7 -0
  113. package/dist/utils/testing/structured-test-results.test.d.ts.map +1 -0
  114. package/dist/utils/testing/structured-test-results.test.js +179 -0
  115. package/dist/utils/testing/structured-test-results.test.js.map +1 -0
  116. package/package.json +6 -6
  117. package/src/commands/batch-command/batch-deploy-command.ts +4 -4
  118. package/src/commands/batch-command/batch-test-command.ts +94 -19
  119. package/src/commands/deploy-command/deploy-init-utils.ts +7 -1
  120. package/src/commands/deploy-command/index.ts +1 -1
  121. package/src/commands/init-command/init-game-command.ts +2 -2
  122. package/src/commands/install-package-command.ts +107 -14
  123. package/src/utils/deploy/deploy-github-columns.ts +14 -4
  124. package/src/utils/deploy/deploy-metadata.ts +1 -1
  125. package/src/utils/job-context/base-job-context.ts +3 -2
  126. package/src/utils/job-context/batch-script-job-context.ts +98 -17
  127. package/src/utils/job-context/cloud-job-context.test.ts +112 -0
  128. package/src/utils/job-context/cloud-job-context.ts +12 -6
  129. package/src/utils/job-context/job-context.ts +71 -2
  130. package/src/utils/job-context/local-job-context.test.ts +89 -0
  131. package/src/utils/job-context/local-job-context.ts +7 -3
  132. package/src/utils/open-cloud/open-cloud-client.test.ts +155 -1
  133. package/src/utils/open-cloud/open-cloud-client.ts +94 -18
  134. package/src/utils/open-cloud/open-cloud-logs.characterization.test.ts +277 -0
  135. package/src/utils/package-manager-utils.test.ts +174 -0
  136. package/src/utils/package-manager-utils.ts +148 -0
  137. package/src/utils/testing/batch-run.e2e.test.ts +425 -0
  138. package/src/utils/testing/batch-test-runner-template.test.ts +62 -0
  139. package/src/utils/testing/log-fetch-stats.test.ts +48 -0
  140. package/src/utils/testing/log-fetch-stats.ts +55 -0
  141. package/src/utils/testing/parsers/batch-log-parser.test.ts +660 -1
  142. package/src/utils/testing/parsers/batch-log-parser.ts +721 -116
  143. package/src/utils/testing/parsers/batch-log-renderer.test.ts +330 -0
  144. package/src/utils/testing/parsers/batch-log-renderer.ts +329 -0
  145. package/src/utils/testing/runner/combined-project-generator.ts +1 -1
  146. package/src/utils/testing/runner/test-runner.test.ts +332 -2
  147. package/src/utils/testing/runner/test-runner.ts +231 -9
  148. package/src/utils/testing/structured-test-results.test.ts +267 -0
  149. package/src/utils/testing/structured-test-results.ts +199 -0
  150. package/templates/batch-test-runner.lua +242 -0
  151. package/tsconfig.tsbuildinfo +1 -1
  152. package/templates/batch-test-runner.luau +0 -137
  153. /package/build-scripts/{smoke-test-server.luau → smoke-test-server.lua} +0 -0
  154. /package/build-scripts/{transform-rojo-merge-place.luau → transform-rojo-merge-place.lua} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-job-context.js","sourceRoot":"","sources":["../../../src/utils/job-context/cloud-job-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cloud-job-context.js","sourceRoot":"","sources":["../../../src/utils/job-context/cloud-job-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for CloudJobContext.runScriptAsync — validates what a finished
3
+ * Open Cloud task reports back as a ScriptRunResult, in particular that a task
4
+ * which produced no output stays distinguishable from one that returned nothing.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=cloud-job-context.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-job-context.test.d.ts","sourceRoot":"","sources":["../../../src/utils/job-context/cloud-job-context.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Unit tests for CloudJobContext.runScriptAsync — validates what a finished
3
+ * Open Cloud task reports back as a ScriptRunResult, in particular that a task
4
+ * which produced no output stays distinguishable from one that returned nothing.
5
+ */
6
+ import { describe, it, expect, vi, afterEach } from 'vitest';
7
+ import { CloudJobContext } from './cloud-job-context.js';
8
+ function createReporter() {
9
+ return {
10
+ onPackagePhaseChange: vi.fn(),
11
+ onPackageProgressUpdate: vi.fn(),
12
+ onPackageStart: vi.fn(),
13
+ onPackageResult: vi.fn(),
14
+ };
15
+ }
16
+ /**
17
+ * A client whose task completes as `completedTask`. The real deployment handle
18
+ * is private to the context, so the test passes the three fields runScriptAsync
19
+ * reads off it.
20
+ */
21
+ function createContext(completedTask) {
22
+ const task = {
23
+ path: 'universes/1/places/2/versions/3/luau-execution-session-tasks/4',
24
+ createTime: '2026-01-01T00:00:00Z',
25
+ updateTime: '2026-01-01T00:01:00Z',
26
+ user: 'users/1',
27
+ state: 'COMPLETE',
28
+ script: 'return 1',
29
+ ...completedTask,
30
+ };
31
+ const client = {
32
+ createExecutionTaskAsync: vi.fn(async () => task),
33
+ pollTaskCompletionAsync: vi.fn(async () => task),
34
+ };
35
+ const context = new CloudJobContext(createReporter(), client);
36
+ const deployment = {
37
+ universeId: 1,
38
+ placeId: 2,
39
+ version: 3,
40
+ };
41
+ return { context, deployment };
42
+ }
43
+ describe('CloudJobContext.runScriptAsync', () => {
44
+ afterEach(() => {
45
+ vi.useRealTimers();
46
+ });
47
+ it('reports the values the script returned', async () => {
48
+ // Fake timers keep the client-side timeout race from leaving a live timer
49
+ // behind; nothing in the run itself waits on one.
50
+ vi.useFakeTimers();
51
+ const { context, deployment } = createContext({
52
+ state: 'COMPLETE',
53
+ output: { results: [{ slug: 'maid', counts: { passed: 1014 } }] },
54
+ });
55
+ const result = await context.runScriptAsync(deployment, {
56
+ scriptContent: 'return results',
57
+ packageName: 'maid',
58
+ });
59
+ expect(result.success).toBe(true);
60
+ expect(result.returnValues).toEqual([
61
+ { slug: 'maid', counts: { passed: 1014 } },
62
+ ]);
63
+ });
64
+ it('reports an empty result when the task returned nothing', async () => {
65
+ vi.useFakeTimers();
66
+ const { context, deployment } = createContext({
67
+ state: 'COMPLETE',
68
+ output: {},
69
+ });
70
+ const result = await context.runScriptAsync(deployment, {
71
+ scriptContent: 'print("hi")',
72
+ packageName: 'maid',
73
+ });
74
+ expect(result.returnValues).toEqual([]);
75
+ });
76
+ it('leaves returnValues absent when a failed task carried no output', async () => {
77
+ vi.useFakeTimers();
78
+ const { context, deployment } = createContext({
79
+ state: 'FAILED',
80
+ output: undefined,
81
+ });
82
+ const result = await context.runScriptAsync(deployment, {
83
+ scriptContent: 'return huge',
84
+ packageName: 'maid',
85
+ });
86
+ expect(result.success).toBe(false);
87
+ expect(result.taskState).toBe('FAILED');
88
+ expect(result.returnValues).toBeUndefined();
89
+ });
90
+ });
91
+ //# sourceMappingURL=cloud-job-context.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-job-context.test.js","sourceRoot":"","sources":["../../../src/utils/job-context/cloud-job-context.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,23 @@
1
1
  import { type BuildPlaceOptions, type BuiltPlace } from '../build/build.js';
2
+ import { type StructuredTestResults } from '../testing/structured-test-results.js';
3
+ import { type LogFetchStats } from '../testing/log-fetch-stats.js';
4
+ import { type TaskLogMessage } from '../open-cloud/open-cloud-client.js';
5
+ /** A run's output, with the severity and the fetch that produced it. */
6
+ export interface JobLogs {
7
+ text: string;
8
+ /**
9
+ * The same output split into typed messages, when the transport reports
10
+ * severity. Empty for one that does not — a local run reads its logs off the
11
+ * Studio bridge, which says only what was printed.
12
+ */
13
+ messages: TaskLogMessage[];
14
+ /**
15
+ * What collecting them took, when the transport can say. Absent rather than
16
+ * zeroed, so "no fetch to measure" cannot read as "a fetch that found
17
+ * nothing".
18
+ */
19
+ stats?: LogFetchStats;
20
+ }
2
21
  export type { BuiltPlace } from '../build/build.js';
3
22
  export interface DeployPlaceOptions {
4
23
  builtPlace: BuiltPlace;
@@ -24,6 +43,48 @@ export interface ScriptRunResult {
24
43
  taskState?: string;
25
44
  /** Error message from the execution backend, if any. */
26
45
  errorMessage?: string;
46
+ /**
47
+ * Everything the executed script returned, in order — the structured channel
48
+ * out of a run, as opposed to its printed output. Engine logs are truncated
49
+ * by Open Cloud on long runs, so anything a caller must read back exactly
50
+ * belongs here rather than in the log text.
51
+ *
52
+ * `undefined` means the transport never delivered a return channel: a cloud
53
+ * task that ended without an `output` (a FAILED task carries none, and an
54
+ * oversize return value fails the task rather than truncating the value), a
55
+ * bridge run that timed out or disconnected, or a context that does not
56
+ * carry return values at all. That is deliberately distinct from `[]`, which
57
+ * means the script ran and returned nothing — a caller that needs the value
58
+ * can fall back to parsing logs in the first case but not the second.
59
+ *
60
+ * Values are JSON-shaped, but the two transports spell exotic Luau types
61
+ * differently: Open Cloud auto-serializes them, while the Studio bridge
62
+ * marshals them into `{ type, value }` wrappers (`SerializedReturnValue`).
63
+ * Plain tables of strings, numbers and booleans come back identically on
64
+ * both, so structured results should stay inside that subset.
65
+ */
66
+ returnValues?: unknown[];
67
+ /**
68
+ * The run's structured test results, when the context resolved them itself
69
+ * rather than leaving them in `returnValues` for the caller to decode.
70
+ *
71
+ * Only aggregated batch mode sets this: one execution covers every package, so
72
+ * its return value belongs to no single one of them and the per-package
73
+ * results have to be recovered from the batch summary first. A context that
74
+ * sets this has also reported where the counts came from, so the caller does
75
+ * not report it a second time.
76
+ */
77
+ testResults?: StructuredTestResults;
78
+ /**
79
+ * True when this run's verdict rests on returned results alone, its log
80
+ * output having been dropped before it reached us.
81
+ *
82
+ * A narrower verdict than an ordinary one: the counts are exact, but with no
83
+ * text there is nothing to check for tracebacks and nothing to read when
84
+ * something did go wrong. Reported so it can be shown as such rather than as
85
+ * an ordinary pass.
86
+ */
87
+ logsLost?: boolean;
27
88
  }
28
89
  /**
29
90
  * Opaque handle representing a single deployed place.
@@ -38,8 +99,15 @@ export interface JobContext {
38
99
  deployBuiltPlaceAsync(options: DeployPlaceOptions): Promise<Deployment>;
39
100
  /** Execute a Luau script in a deployed place. */
40
101
  runScriptAsync(deployment: Deployment, options: RunScriptOptions): Promise<ScriptRunResult>;
41
- /** Retrieve raw logs from the most recent script execution on this deployment. */
42
- getLogsAsync(deployment: Deployment): Promise<string>;
102
+ /**
103
+ * Everything the most recent script execution printed.
104
+ *
105
+ * One value rather than a log plus two optional side-channels for its
106
+ * severity and its fetch: they all come from the same fetch, so returning
107
+ * them together removes both the chance of asking a context that does not
108
+ * implement one and the chance of handing an accessor the wrong handle.
109
+ */
110
+ getLogsAsync(deployment: Deployment): Promise<JobLogs>;
43
111
  /** Release a single deployment (stop bridge / clear task metadata). */
44
112
  releaseAsync(deployment: Deployment): Promise<void>;
45
113
  /** Eagerly release a built place's temporary resources. Idempotent. */
@@ -1 +1 @@
1
- {"version":3,"file":"job-context.d.ts","sourceRoot":"","sources":["../../../src/utils/job-context/job-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE5E,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AAEH,MAAM,WAAW,UAAU;CAAG;AAE9B,MAAM,WAAW,UAAU;IACzB,6FAA6F;IAC7F,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEjE,qGAAqG;IACrG,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAExE,iDAAiD;IACjD,cAAc,CACZ,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAAC;IAE5B,kFAAkF;IAClF,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtD,uEAAuE;IACvE,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD,uEAAuE;IACvE,sBAAsB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D,wGAAwG;IACxG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B"}
1
+ {"version":3,"file":"job-context.d.ts","sourceRoot":"","sources":["../../../src/utils/job-context/job-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,wEAAwE;AACxE,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B;;;;OAIG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC;IACzB;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AAEH,MAAM,WAAW,UAAU;CAAG;AAE9B,MAAM,WAAW,UAAU;IACzB,6FAA6F;IAC7F,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEjE,qGAAqG;IACrG,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAExE,iDAAiD;IACjD,cAAc,CACZ,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAAC;IAE5B;;;;;;;OAOG;IACH,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvD,uEAAuE;IACvE,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD,uEAAuE;IACvE,sBAAsB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D,wGAAwG;IACxG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B"}
@@ -1,5 +1,5 @@
1
1
  import { type Reporter } from '@quenty/cli-output-helpers/reporting';
2
- import { type Deployment, type DeployPlaceOptions, type RunScriptOptions, type ScriptRunResult } from './job-context.js';
2
+ import { type Deployment, type DeployPlaceOptions, type RunScriptOptions, type ScriptRunResult, type JobLogs } from './job-context.js';
3
3
  import { type BasePlaceResolver } from '@quenty/nevermore-deploy';
4
4
  import { BaseJobContext } from './base-job-context.js';
5
5
  import { type OpenCloudClient } from '../open-cloud/open-cloud-client.js';
@@ -8,7 +8,7 @@ export declare class LocalJobContext extends BaseJobContext {
8
8
  constructor(reporter: Reporter, openCloudClient?: OpenCloudClient, basePlaceResolver?: BasePlaceResolver);
9
9
  deployBuiltPlaceAsync(options: DeployPlaceOptions): Promise<Deployment>;
10
10
  runScriptAsync(deployment: Deployment, options: RunScriptOptions): Promise<ScriptRunResult>;
11
- getLogsAsync(deployment: Deployment): Promise<string>;
11
+ getLogsAsync(deployment: Deployment): Promise<JobLogs>;
12
12
  releaseAsync(deployment: Deployment): Promise<void>;
13
13
  disposeAsync(): Promise<void>;
14
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local-job-context.d.ts","sourceRoot":"","sources":["../../../src/utils/job-context/local-job-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAErE,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAa1E,qBAAa,eAAgB,SAAQ,cAAc;IACjD,OAAO,CAAC,YAAY,CAA8B;gBAGhD,QAAQ,EAAE,QAAQ,EAClB,eAAe,CAAC,EAAE,eAAe,EACjC,iBAAiB,CAAC,EAAE,iBAAiB;IAKjC,qBAAqB,CACzB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,UAAU,CAAC;IAmBhB,cAAc,CAClB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC;IAqBrB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAKrD,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAOpC"}
1
+ {"version":3,"file":"local-job-context.d.ts","sourceRoot":"","sources":["../../../src/utils/job-context/local-job-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAErE,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,OAAO,EACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAa1E,qBAAa,eAAgB,SAAQ,cAAc;IACjD,OAAO,CAAC,YAAY,CAA8B;gBAGhD,QAAQ,EAAE,QAAQ,EAClB,eAAe,CAAC,EAAE,eAAe,EACjC,iBAAiB,CAAC,EAAE,iBAAiB;IAKjC,qBAAqB,CACzB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,UAAU,CAAC;IAmBhB,cAAc,CAClB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC;IAqBrB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAQtD,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAOpC"}
@@ -39,7 +39,7 @@ export class LocalJobContext extends BaseJobContext {
39
39
  timeoutMs,
40
40
  });
41
41
  localDeployment.cachedLogs = result.logs;
42
- return { success: result.success };
42
+ return { success: result.success, returnValues: result.returnValues };
43
43
  }
44
44
  catch (error) {
45
45
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -49,7 +49,9 @@ export class LocalJobContext extends BaseJobContext {
49
49
  }
50
50
  async getLogsAsync(deployment) {
51
51
  const localDeployment = deployment;
52
- return localDeployment.cachedLogs;
52
+ // No severity and no fetch: the bridge hands over text it already has.
53
+ // Both stay absent rather than being invented.
54
+ return { text: localDeployment.cachedLogs, messages: [] };
53
55
  }
54
56
  async releaseAsync(deployment) {
55
57
  const localDeployment = deployment;
@@ -1 +1 @@
1
- {"version":3,"file":"local-job-context.js","sourceRoot":"","sources":["../../../src/utils/job-context/local-job-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AASrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,MAAM,eAAe;IACnB,MAAM,CAAe;IACrB,UAAU,CAAa;IACvB,UAAU,GAAG,EAAE,CAAC;IAEhB,YAAY,MAAoB,EAAE,UAAsB;QACtD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACzC,YAAY,GAAG,IAAI,GAAG,EAAmB,CAAC;IAElD,YACE,QAAkB,EAClB,eAAiC,EACjC,iBAAqC;QAErC,KAAK,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,OAA2B;QAE3B,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;QAE5C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;YAC9B,SAAS,EAAE,UAAU,CAAC,QAAQ;YAC9B,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjB,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;oBACpD,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAE1B,MAAM,UAAU,GAAG,IAAI,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,UAAsB,EACtB,OAAyB;QAEzB,MAAM,eAAe,GAAG,UAA6B,CAAC;QACtD,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAE1D,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAE9D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC;gBACvD,aAAa;gBACb,SAAS;aACV,CAAC,CAAC;YACH,eAAe,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;YACzC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,eAAe,CAAC,UAAU,GAAG,yBAAyB,YAAY,EAAE,CAAC;YACrE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAsB;QACvC,MAAM,eAAe,GAAG,UAA6B,CAAC;QACtD,OAAO,eAAe,CAAC,UAAU,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAsB;QACvC,MAAM,eAAe,GAAG,UAA6B,CAAC;QAEtD,MAAM,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAEzC,oEAAoE;QACpE,MAAM,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAE9D,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;CACF"}
1
+ {"version":3,"file":"local-job-context.js","sourceRoot":"","sources":["../../../src/utils/job-context/local-job-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for LocalJobContext.runScriptAsync — validates that a bridge run
3
+ * hands its script return values on as a ScriptRunResult, and that a run which
4
+ * never completed reports none rather than an empty result.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=local-job-context.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-job-context.test.d.ts","sourceRoot":"","sources":["../../../src/utils/job-context/local-job-context.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Unit tests for LocalJobContext.runScriptAsync — validates that a bridge run
3
+ * hands its script return values on as a ScriptRunResult, and that a run which
4
+ * never completed reports none rather than an empty result.
5
+ */
6
+ import { describe, it, expect, vi } from 'vitest';
7
+ import { LocalJobContext } from './local-job-context.js';
8
+ function createReporter() {
9
+ return {
10
+ onPackagePhaseChange: vi.fn(),
11
+ onPackageProgressUpdate: vi.fn(),
12
+ onPackageStart: vi.fn(),
13
+ onPackageResult: vi.fn(),
14
+ };
15
+ }
16
+ /**
17
+ * The deployment handle is private to the context, so the test stands in a
18
+ * bridge with the one method runScriptAsync calls on it.
19
+ */
20
+ function createDeployment(executeAsync) {
21
+ return {
22
+ bridge: { executeAsync },
23
+ cachedLogs: '',
24
+ };
25
+ }
26
+ describe('LocalJobContext.runScriptAsync', () => {
27
+ it('reports the values the script returned', async () => {
28
+ const context = new LocalJobContext(createReporter());
29
+ const deployment = createDeployment(async () => ({
30
+ success: true,
31
+ logs: 'ran',
32
+ returnValues: [{ counts: { passed: 7 } }],
33
+ }));
34
+ const result = await context.runScriptAsync(deployment, {
35
+ scriptContent: 'return results',
36
+ packageName: 'maid',
37
+ });
38
+ expect(result.success).toBe(true);
39
+ expect(result.returnValues).toEqual([{ counts: { passed: 7 } }]);
40
+ expect((await context.getLogsAsync(deployment)).text).toBe('ran');
41
+ });
42
+ it('leaves returnValues absent when the bridge reported none', async () => {
43
+ const context = new LocalJobContext(createReporter());
44
+ const deployment = createDeployment(async () => ({
45
+ success: false,
46
+ logs: '[StudioBridge] Timed out after 200ms',
47
+ }));
48
+ const result = await context.runScriptAsync(deployment, {
49
+ scriptContent: 'while true do end',
50
+ packageName: 'maid',
51
+ });
52
+ expect(result.returnValues).toBeUndefined();
53
+ });
54
+ it('leaves returnValues absent when the bridge throws', async () => {
55
+ const context = new LocalJobContext(createReporter());
56
+ const deployment = createDeployment(async () => {
57
+ throw new Error('no connected client');
58
+ });
59
+ const result = await context.runScriptAsync(deployment, {
60
+ scriptContent: 'return results',
61
+ packageName: 'maid',
62
+ });
63
+ expect(result.success).toBe(false);
64
+ expect(result.returnValues).toBeUndefined();
65
+ expect((await context.getLogsAsync(deployment)).text).toContain('no connected client');
66
+ });
67
+ });
68
+ //# sourceMappingURL=local-job-context.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-job-context.test.js","sourceRoot":"","sources":["../../../src/utils/job-context/local-job-context.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,27 @@
1
1
  import { RateLimiter } from './rate-limiter.js';
2
2
  import { type ParsedTestLogs } from '../testing/test-log-parser.js';
3
+ import { type LogFetchStats } from '../testing/log-fetch-stats.js';
4
+ /**
5
+ * One engine message, with the severity Open Cloud reported for it.
6
+ *
7
+ * A message is not a line: an error arrives with its whole traceback attached,
8
+ * so `message` can span several. `messageType` is OUTPUT, WARNING or ERROR.
9
+ */
10
+ export interface TaskLogMessage {
11
+ message: string;
12
+ messageType?: string;
13
+ }
14
+ /** A task's log text together with what the fetch had to do to collect it. */
15
+ export interface TaskLogFetch {
16
+ text: string;
17
+ stats: LogFetchStats;
18
+ /**
19
+ * The same output as `text`, still split into typed messages. Kept because
20
+ * severity is the API's to state and cannot be recovered from the joined
21
+ * text: a traceback's continuation lines look like ordinary output.
22
+ */
23
+ messages: TaskLogMessage[];
24
+ }
3
25
  export interface LuauTask {
4
26
  path: string;
5
27
  createTime: string;
@@ -8,11 +30,20 @@ export interface LuauTask {
8
30
  state: 'STATE_UNSPECIFIED' | 'QUEUED' | 'PROCESSING' | 'CANCELLED' | 'COMPLETE' | 'FAILED';
9
31
  script: string;
10
32
  timeout?: string;
11
- /** Script return value (populated on COMPLETE). */
33
+ /**
34
+ * What the script returned, populated on COMPLETE. `results` is a flat array
35
+ * of the returned values — `return t, "s", 42` arrives as three entries —
36
+ * natively typed: Roblox serializes them itself, so a returned Lua table is
37
+ * real nested JSON here, not a JSON string. (Which is also why a script must
38
+ * not JSONEncode its result: that lands as a double-encoded string.)
39
+ *
40
+ * Absent whenever the task produced no result. A FAILED task carries no
41
+ * `output` at all, with no error message explaining why — and an oversize
42
+ * return value (~4MB observed; ~2MB still arrives complete) fails the task
43
+ * exactly that way rather than truncating the value.
44
+ */
12
45
  output?: {
13
- results?: Array<{
14
- value?: string;
15
- }>;
46
+ results?: unknown[];
16
47
  };
17
48
  /** Error details (populated on FAILED). */
18
49
  error?: {
@@ -20,6 +51,15 @@ export interface LuauTask {
20
51
  message?: string;
21
52
  };
22
53
  }
54
+ /**
55
+ * The values a finished task's script returned, or `undefined` when the task
56
+ * reported no result at all.
57
+ *
58
+ * The distinction matters: `undefined` means nothing came back to read, so a
59
+ * caller can fall back to the task's logs, while `[]` means the task did report
60
+ * a result and the script returned nothing — no fallback will find more.
61
+ */
62
+ export declare function getTaskReturnValues(task: LuauTask): unknown[] | undefined;
23
63
  export interface OpenCloudClientOptions {
24
64
  apiKey: string | (() => Promise<string>);
25
65
  rateLimiter: RateLimiter;
@@ -41,11 +81,14 @@ export declare class OpenCloudClient {
41
81
  pollTaskCompletionAsync(taskPath: string, onProgress?: (state: LuauTask['state']) => void): Promise<LuauTask>;
42
82
  getTaskLogsAsync(taskPath: string): Promise<ParsedTestLogs>;
43
83
  /**
44
- * Fetch raw log text from a completed Luau execution task.
84
+ * Fetch raw log text from a completed Luau execution task, along with the
85
+ * shape of the fetch that produced it.
86
+ *
45
87
  * Retries a few times if the API returns empty logs, since the test runner
46
- * always produces at least some output.
88
+ * always produces at least some output. The reported `requests` count spans
89
+ * every attempt, so a fetch that only filled in on its third try says so.
47
90
  */
48
- getRawTaskLogsAsync(taskPath: string): Promise<string>;
91
+ getRawTaskLogsAsync(taskPath: string): Promise<TaskLogFetch>;
49
92
  private _fetchRawLogsAsync;
50
93
  /**
51
94
  * Download a place file via the Asset Delivery API.
@@ -1 +1 @@
1
- {"version":3,"file":"open-cloud-client.d.ts","sourceRoot":"","sources":["../../../src/utils/open-cloud/open-cloud-client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EACD,mBAAmB,GACnB,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,UAAU,GACV,QAAQ,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IACjD,2CAA2C;IAC3C,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,WAAW,CAAC;AAsDrD,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,YAAY,CAAc;gBAEtB,OAAO,EAAE,sBAAsB;YAQ7B,mBAAmB;IAW3B,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,OAAO,EACjB,UAAU,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GAClE,OAAO,CAAC,MAAM,CAAC;IA4FZ,wBAAwB,CAC5B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,QAAQ,CAAC;IAyDd,uBAAuB,CAC3B,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,GAC9C,OAAO,CAAC,QAAQ,CAAC;IAkCd,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAKjE;;;;OAIG;IACG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAgB9C,kBAAkB;IAmEhC;;;;;;;;OAQG;IACG,kBAAkB,CACtB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,EACnE,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;IAoElB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,8BAA8B,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,gBAAgB,GAC5B,OAAO,CAAC,MAAM,CAAC;CA0FnB"}
1
+ {"version":3,"file":"open-cloud-client.d.ts","sourceRoot":"","sources":["../../../src/utils/open-cloud/open-cloud-client.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,20 @@ import { Readable, Transform } from 'node:stream';
3
3
  import nodeFetch from 'node-fetch';
4
4
  import { OutputHelper } from '@quenty/cli-output-helpers';
5
5
  import { parseTestLogs, } from '../testing/test-log-parser.js';
6
+ /**
7
+ * The values a finished task's script returned, or `undefined` when the task
8
+ * reported no result at all.
9
+ *
10
+ * The distinction matters: `undefined` means nothing came back to read, so a
11
+ * caller can fall back to the task's logs, while `[]` means the task did report
12
+ * a result and the script returned nothing — no fallback will find more.
13
+ */
14
+ export function getTaskReturnValues(task) {
15
+ if (!task.output) {
16
+ return undefined;
17
+ }
18
+ return task.output.results ?? [];
19
+ }
6
20
  function formatAuthError(action, scope, universeId, placeId, status, statusText, body, method, url) {
7
21
  // Extract human-readable message from JSON body if possible
8
22
  let apiMessage = '';
@@ -179,20 +193,29 @@ export class OpenCloudClient {
179
193
  }
180
194
  async getTaskLogsAsync(taskPath) {
181
195
  const raw = await this.getRawTaskLogsAsync(taskPath);
182
- return parseTestLogs(raw);
196
+ return parseTestLogs(raw.text);
183
197
  }
184
198
  /**
185
- * Fetch raw log text from a completed Luau execution task.
199
+ * Fetch raw log text from a completed Luau execution task, along with the
200
+ * shape of the fetch that produced it.
201
+ *
186
202
  * Retries a few times if the API returns empty logs, since the test runner
187
- * always produces at least some output.
203
+ * always produces at least some output. The reported `requests` count spans
204
+ * every attempt, so a fetch that only filled in on its third try says so.
188
205
  */
189
206
  async getRawTaskLogsAsync(taskPath) {
190
207
  const maxAttempts = 3;
191
208
  const retryDelayMs = 1000;
209
+ let requests = 0;
192
210
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
193
- const logs = await this._fetchRawLogsAsync(taskPath);
194
- if (logs || attempt === maxAttempts) {
195
- return logs;
211
+ const fetched = await this._fetchRawLogsAsync(taskPath);
212
+ requests += fetched.stats.requests;
213
+ if (fetched.text || attempt === maxAttempts) {
214
+ return {
215
+ text: fetched.text,
216
+ stats: { ...fetched.stats, requests },
217
+ messages: fetched.messages,
218
+ };
196
219
  }
197
220
  await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
198
221
  }
@@ -227,23 +250,36 @@ export class OpenCloudClient {
227
250
  const data = (await response.json());
228
251
  for (const entry of data.luauExecutionSessionTaskLogs ?? []) {
229
252
  if (entry.structuredMessages?.length) {
230
- messages.push(...entry.structuredMessages.map((msg) => msg.message));
253
+ messages.push(...entry.structuredMessages.map((msg) => ({
254
+ message: msg.message,
255
+ messageType: msg.messageType,
256
+ })));
231
257
  }
232
258
  else if (entry.messages?.length) {
233
- messages.push(...entry.messages);
259
+ // The flat view carries no severity, which stays absent rather than
260
+ // being guessed at.
261
+ messages.push(...entry.messages.map((message) => ({ message })));
234
262
  }
235
263
  }
236
264
  entriesFetched += (data.luauExecutionSessionTaskLogs ?? []).length;
237
265
  pagesFetched++;
238
266
  pageToken = data.nextPageToken || undefined;
239
267
  } while (pageToken);
240
- const text = messages.join('\n');
268
+ const text = messages.map((entry) => entry.message).join('\n');
269
+ const stats = {
270
+ requests: pagesFetched,
271
+ pages: pagesFetched,
272
+ entries: entriesFetched,
273
+ messages: messages.length,
274
+ chars: text.length,
275
+ };
241
276
  // Log volume is the prime suspect when engine output goes missing between
242
277
  // the task and the parser, and the parser cannot tell a short run from a
243
- // truncated fetch. Record what arrived so a real run can settle it.
244
- OutputHelper.verbose(`[open-cloud] Task logs: ${pagesFetched} page(s), ${entriesFetched} entries, ` +
245
- `${messages.length} messages, ${text.length} chars`);
246
- return text;
278
+ // truncated fetch. Handed out with the text rather than only printed, so
279
+ // the diagnostic that finds the output missing can say what the fetch saw.
280
+ OutputHelper.verbose(`[open-cloud] Task logs: ${stats.pages} page(s), ${stats.entries} entries, ` +
281
+ `${stats.messages} messages, ${stats.chars} chars`);
282
+ return { text, stats, messages };
247
283
  }
248
284
  /**
249
285
  * Download a place file via the Asset Delivery API.