@aiscene/shared 8.0.2 → 8.0.4

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 (177) hide show
  1. package/dist/es/agent-tools/agent-behavior-init-args.mjs +44 -0
  2. package/dist/es/agent-tools/base-tools.mjs +163 -0
  3. package/dist/es/agent-tools/chrome-path.mjs +50 -0
  4. package/dist/es/agent-tools/cli-report-session.mjs +78 -0
  5. package/dist/es/agent-tools/error-formatter.mjs +106 -0
  6. package/dist/es/agent-tools/index.mjs +9 -0
  7. package/dist/es/agent-tools/init-arg-utils.mjs +38 -0
  8. package/dist/es/agent-tools/observation-artifact.mjs +5 -0
  9. package/dist/es/agent-tools/observation-record.mjs +248 -0
  10. package/dist/es/agent-tools/tool-defaults.mjs +54 -0
  11. package/dist/es/agent-tools/tool-generator.mjs +529 -0
  12. package/dist/es/agent-tools/types.mjs +3 -0
  13. package/dist/es/agent-tools/user-prompt.mjs +66 -0
  14. package/dist/es/cli/cli-args.mjs +95 -0
  15. package/dist/es/cli/cli-error.mjs +24 -0
  16. package/dist/es/cli/cli-runner.mjs +10 -40
  17. package/dist/es/cli/index.mjs +4 -2
  18. package/dist/es/cli/interrupt.mjs +116 -0
  19. package/dist/es/cli/record-command.mjs +130 -0
  20. package/dist/es/cli/screenshot-file.mjs +24 -0
  21. package/dist/es/cli/verbose-ai-act.mjs +230 -0
  22. package/dist/es/cli/verbose-screenshot.mjs +134 -0
  23. package/dist/es/cli/verbose.mjs +404 -0
  24. package/dist/es/constants/example-code.mjs +2 -2
  25. package/dist/es/constants/index.mjs +6 -1
  26. package/dist/es/env/model-config-manager.mjs +3 -0
  27. package/dist/es/env/parse-model-config.mjs +6 -1
  28. package/dist/es/env/types.mjs +4 -1
  29. package/dist/es/env/utils.mjs +1 -9
  30. package/dist/es/extractor/index.mjs +2 -2
  31. package/dist/es/img/index.mjs +2 -2
  32. package/dist/es/img/info.mjs +58 -17
  33. package/dist/es/img/photon-loader.mjs +4 -0
  34. package/dist/es/key-alias-utils.mjs +19 -0
  35. package/dist/es/mcp/base-server.mjs +10 -9
  36. package/dist/es/mcp/base-tools.mjs +72 -4
  37. package/dist/es/mcp/cli-report-session.mjs +78 -0
  38. package/dist/es/mcp/error-formatter.mjs +19 -0
  39. package/dist/es/mcp/index.mjs +2 -0
  40. package/dist/es/mcp/init-arg-utils.mjs +38 -0
  41. package/dist/es/mcp/inject-report-html-plugin.mjs +1 -1
  42. package/dist/es/mcp/tool-generator.mjs +65 -17
  43. package/dist/es/node/fs.mjs +1 -1
  44. package/dist/es/recorder.mjs +249 -0
  45. package/dist/lib/agent-tools/agent-behavior-init-args.js +87 -0
  46. package/dist/lib/agent-tools/base-tools.js +197 -0
  47. package/dist/lib/agent-tools/chrome-path.js +87 -0
  48. package/dist/lib/agent-tools/cli-report-session.js +121 -0
  49. package/dist/lib/agent-tools/error-formatter.js +149 -0
  50. package/dist/lib/agent-tools/index.js +114 -0
  51. package/dist/lib/agent-tools/init-arg-utils.js +78 -0
  52. package/dist/lib/agent-tools/observation-artifact.js +42 -0
  53. package/dist/lib/agent-tools/observation-record.js +297 -0
  54. package/dist/lib/agent-tools/tool-defaults.js +97 -0
  55. package/dist/lib/agent-tools/tool-generator.js +569 -0
  56. package/dist/lib/agent-tools/types.js +40 -0
  57. package/dist/lib/agent-tools/user-prompt.js +103 -0
  58. package/dist/lib/cli/cli-args.js +138 -0
  59. package/dist/lib/cli/cli-error.js +61 -0
  60. package/dist/lib/cli/cli-runner.js +19 -46
  61. package/dist/lib/cli/index.js +8 -3
  62. package/dist/lib/cli/interrupt.js +156 -0
  63. package/dist/lib/cli/record-command.js +164 -0
  64. package/dist/lib/cli/screenshot-file.js +58 -0
  65. package/dist/lib/cli/verbose-ai-act.js +273 -0
  66. package/dist/lib/cli/verbose-screenshot.js +177 -0
  67. package/dist/lib/cli/verbose.js +465 -0
  68. package/dist/lib/constants/example-code.js +2 -2
  69. package/dist/lib/constants/index.js +23 -3
  70. package/dist/lib/env/model-config-manager.js +3 -0
  71. package/dist/lib/env/parse-model-config.js +6 -1
  72. package/dist/lib/env/types.js +9 -0
  73. package/dist/lib/env/utils.js +0 -11
  74. package/dist/lib/extractor/index.js +3 -0
  75. package/dist/lib/img/index.js +3 -0
  76. package/dist/lib/img/info.js +65 -18
  77. package/dist/lib/img/photon-loader.js +38 -0
  78. package/dist/lib/key-alias-utils.js +62 -0
  79. package/dist/lib/mcp/base-server.js +11 -10
  80. package/dist/lib/mcp/base-tools.js +74 -6
  81. package/dist/lib/mcp/cli-report-session.js +121 -0
  82. package/dist/lib/mcp/error-formatter.js +53 -0
  83. package/dist/lib/mcp/index.js +24 -10
  84. package/dist/lib/mcp/init-arg-utils.js +78 -0
  85. package/dist/lib/mcp/inject-report-html-plugin.js +1 -1
  86. package/dist/lib/mcp/tool-generator.js +74 -26
  87. package/dist/lib/node/fs.js +1 -1
  88. package/dist/lib/recorder.js +307 -0
  89. package/dist/types/agent-tools/agent-behavior-init-args.d.ts +17 -0
  90. package/dist/types/agent-tools/base-tools.d.ts +158 -0
  91. package/dist/types/agent-tools/chrome-path.d.ts +2 -0
  92. package/dist/types/agent-tools/cli-report-session.d.ts +12 -0
  93. package/dist/types/agent-tools/error-formatter.d.ts +30 -0
  94. package/dist/types/agent-tools/index.d.ts +9 -0
  95. package/dist/types/agent-tools/init-arg-utils.d.ts +13 -0
  96. package/dist/types/agent-tools/observation-artifact.d.ts +10 -0
  97. package/dist/types/agent-tools/observation-record.d.ts +38 -0
  98. package/dist/types/agent-tools/tool-defaults.d.ts +63 -0
  99. package/dist/types/agent-tools/tool-generator.d.ts +13 -0
  100. package/dist/types/agent-tools/types.d.ts +213 -0
  101. package/dist/types/agent-tools/user-prompt.d.ts +13 -0
  102. package/dist/types/cli/cli-args.d.ts +8 -0
  103. package/dist/types/cli/cli-error.d.ts +5 -0
  104. package/dist/types/cli/cli-runner.d.ts +4 -7
  105. package/dist/types/cli/index.d.ts +3 -1
  106. package/dist/types/cli/interrupt.d.ts +49 -0
  107. package/dist/types/cli/record-command.d.ts +3 -0
  108. package/dist/types/cli/screenshot-file.d.ts +10 -0
  109. package/dist/types/cli/verbose-ai-act.d.ts +44 -0
  110. package/dist/types/cli/verbose-screenshot.d.ts +10 -0
  111. package/dist/types/cli/verbose.d.ts +40 -0
  112. package/dist/types/constants/example-code.d.ts +1 -1
  113. package/dist/types/constants/index.d.ts +5 -0
  114. package/dist/types/env/types.d.ts +14 -5
  115. package/dist/types/env/utils.d.ts +0 -31
  116. package/dist/types/extractor/index.d.ts +1 -1
  117. package/dist/types/img/index.d.ts +1 -1
  118. package/dist/types/img/info.d.ts +7 -0
  119. package/dist/types/img/photon-loader.d.ts +2 -0
  120. package/dist/types/key-alias-utils.d.ts +9 -0
  121. package/dist/types/mcp/base-tools.d.ts +74 -5
  122. package/dist/types/mcp/cli-report-session.d.ts +12 -0
  123. package/dist/types/mcp/error-formatter.d.ts +12 -0
  124. package/dist/types/mcp/index.d.ts +2 -0
  125. package/dist/types/mcp/init-arg-utils.d.ts +13 -0
  126. package/dist/types/mcp/inject-report-html-plugin.d.ts +2 -2
  127. package/dist/types/mcp/launcher-helper.d.ts +3 -3
  128. package/dist/types/mcp/tool-generator.d.ts +3 -3
  129. package/dist/types/mcp/types.d.ts +10 -0
  130. package/dist/types/recorder.d.ts +113 -0
  131. package/package.json +1 -1
  132. package/src/agent-tools/agent-behavior-init-args.ts +109 -0
  133. package/src/agent-tools/base-tools.ts +399 -0
  134. package/src/agent-tools/chrome-path.ts +74 -0
  135. package/src/agent-tools/cli-report-session.ts +130 -0
  136. package/src/agent-tools/error-formatter.ts +177 -0
  137. package/src/agent-tools/index.ts +9 -0
  138. package/src/agent-tools/init-arg-utils.ts +105 -0
  139. package/src/agent-tools/observation-artifact.ts +29 -0
  140. package/src/agent-tools/observation-record.ts +331 -0
  141. package/src/agent-tools/tool-defaults.ts +119 -0
  142. package/src/agent-tools/tool-generator.ts +866 -0
  143. package/src/agent-tools/types.ts +250 -0
  144. package/src/agent-tools/user-prompt.ts +102 -0
  145. package/src/cli/cli-args.ts +173 -0
  146. package/src/cli/cli-error.ts +24 -0
  147. package/src/cli/cli-runner.ts +37 -56
  148. package/src/cli/index.ts +3 -7
  149. package/src/cli/interrupt.ts +207 -0
  150. package/src/cli/record-command.ts +177 -0
  151. package/src/cli/screenshot-file.ts +61 -0
  152. package/src/cli/verbose-ai-act.ts +387 -0
  153. package/src/cli/verbose-screenshot.ts +269 -0
  154. package/src/cli/verbose.ts +753 -0
  155. package/src/constants/example-code.ts +2 -2
  156. package/src/constants/index.ts +10 -0
  157. package/src/env/model-config-manager.ts +3 -0
  158. package/src/env/parse-model-config.ts +19 -1
  159. package/src/env/types.ts +13 -2
  160. package/src/env/utils.ts +0 -50
  161. package/src/extractor/index.ts +1 -1
  162. package/src/img/index.ts +14 -0
  163. package/src/img/info.ts +97 -45
  164. package/src/img/photon-loader.ts +5 -0
  165. package/src/img/transform.ts +261 -2
  166. package/src/key-alias-utils.ts +23 -0
  167. package/src/mcp/base-server.ts +10 -12
  168. package/src/mcp/base-tools.ts +218 -11
  169. package/src/mcp/cli-report-session.ts +130 -0
  170. package/src/mcp/error-formatter.ts +52 -0
  171. package/src/mcp/index.ts +2 -0
  172. package/src/mcp/init-arg-utils.ts +105 -0
  173. package/src/mcp/inject-report-html-plugin.ts +3 -3
  174. package/src/mcp/launcher-helper.ts +3 -3
  175. package/src/mcp/tool-generator.ts +98 -20
  176. package/src/mcp/types.ts +18 -1
  177. package/src/recorder.ts +625 -0
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ createRecordCliCommand: ()=>createRecordCliCommand
28
+ });
29
+ const external_zod_namespaceObject = require("zod");
30
+ const error_formatter_js_namespaceObject = require("../agent-tools/error-formatter.js");
31
+ const observation_artifact_js_namespaceObject = require("../agent-tools/observation-artifact.js");
32
+ const observation_record_js_namespaceObject = require("../agent-tools/observation-record.js");
33
+ const external_interrupt_js_namespaceObject = require("./interrupt.js");
34
+ const external_verbose_js_namespaceObject = require("./verbose.js");
35
+ const recordCliMetadata = {
36
+ positionals: [
37
+ 'action'
38
+ ],
39
+ options: {
40
+ intervalMs: {
41
+ preferredName: 'interval-ms',
42
+ aliases: [
43
+ 'intervalMs'
44
+ ]
45
+ },
46
+ maxFrames: {
47
+ preferredName: 'max-frames',
48
+ aliases: [
49
+ 'maxFrames'
50
+ ]
51
+ },
52
+ watchdogMs: {
53
+ preferredName: 'watchdog-ms',
54
+ aliases: [
55
+ 'watchdogMs'
56
+ ]
57
+ },
58
+ action: {
59
+ hidden: true
60
+ }
61
+ }
62
+ };
63
+ function mergeCliMetadata(base, extra) {
64
+ return {
65
+ positionals: base.positionals,
66
+ options: {
67
+ ...base.options ?? {},
68
+ ...extra?.options ?? {}
69
+ }
70
+ };
71
+ }
72
+ function createErrorResult(message) {
73
+ return {
74
+ content: [
75
+ {
76
+ type: 'text',
77
+ text: message
78
+ }
79
+ ],
80
+ isError: true
81
+ };
82
+ }
83
+ function createRecordCliCommand(getAgent, initArgSchema = {}, initArgCliMetadata) {
84
+ return {
85
+ name: 'record',
86
+ description: 'Record the page/screen in the foreground until Ctrl+C or a termination signal, then save the ordered frame window for a later assert command.',
87
+ schema: {
88
+ action: external_zod_namespaceObject.z.literal('start').describe('Start a foreground recording. Press Ctrl+C to finish.'),
89
+ output: external_zod_namespaceObject.z.string().optional().describe('Path for the JSON observation manifest. Frames are stored in an adjacent <name>.frames directory. Defaults to a generated path under midscene_run/output.'),
90
+ intervalMs: external_zod_namespaceObject.z.number().min(200).optional().describe('Sampling interval in milliseconds. Defaults to 1000; minimum 200 (5fps).'),
91
+ maxFrames: external_zod_namespaceObject.z.number().int().min(2).optional().describe('Maximum buffered frames. Defaults to 30; minimum 2.'),
92
+ watchdogMs: external_zod_namespaceObject.z.number().min(0).optional().describe('Safety timeout in milliseconds. Defaults to 300000 (5 minutes); 0 disables it.'),
93
+ ...initArgSchema
94
+ },
95
+ cli: mergeCliMetadata(recordCliMetadata, initArgCliMetadata),
96
+ handler: async (args = {})=>{
97
+ if ('start' !== args.action) return createErrorResult('record requires the start operation (for example: record start --output ./observation.json)');
98
+ try {
99
+ const agent = await getAgent(args);
100
+ (0, external_verbose_js_namespaceObject.emitCliVerboseEvent)({
101
+ event: 'agent_ready',
102
+ tool: 'record'
103
+ });
104
+ if (!agent.startObserving) throw new Error('record is not supported because this agent does not provide startObserving');
105
+ const observationArtifacts = (0, observation_artifact_js_namespaceObject.resolveObservationArtifactAdapter)(agent);
106
+ if (!observationArtifacts) throw new Error('record is not supported because this agent does not provide observation artifact persistence');
107
+ const unsubscribeVerbose = (0, external_verbose_js_namespaceObject.attachCliVerboseDumpListener)(agent, {
108
+ toolName: 'record'
109
+ });
110
+ let observer;
111
+ let interruptWaiter;
112
+ try {
113
+ const watchdogMs = args.watchdogMs ?? 300000;
114
+ observer = await agent.startObserving({
115
+ intervalMs: args.intervalMs,
116
+ maxFrames: args.maxFrames,
117
+ watchdogMs
118
+ });
119
+ interruptWaiter = (0, external_interrupt_js_namespaceObject.createCliInterruptWaiter)(watchdogMs);
120
+ (0, external_verbose_js_namespaceObject.emitCliVerboseEvent)({
121
+ event: 'recording_ready',
122
+ tool: 'record',
123
+ watchdogMs
124
+ });
125
+ const stopReason = await interruptWaiter.result;
126
+ (0, external_verbose_js_namespaceObject.emitCliVerboseEvent)({
127
+ event: 'recording_stopping',
128
+ tool: 'record',
129
+ reason: stopReason
130
+ });
131
+ const observation = await observer.stop();
132
+ const record = await observationArtifacts.exportRecord(observation);
133
+ const outputPath = (0, observation_record_js_namespaceObject.writeUIObservationRecord)(record, args.output);
134
+ return {
135
+ content: [
136
+ {
137
+ type: 'text',
138
+ text: `Observation record saved: ${outputPath}`
139
+ }
140
+ ]
141
+ };
142
+ } finally{
143
+ try {
144
+ await observer?.dispose?.();
145
+ } finally{
146
+ interruptWaiter?.dispose();
147
+ unsubscribeVerbose();
148
+ }
149
+ }
150
+ } catch (error) {
151
+ const errorMessage = (0, error_formatter_js_namespaceObject.getErrorMessage)(error);
152
+ console.error('Error executing record:', errorMessage);
153
+ return createErrorResult(`Failed to execute record: ${errorMessage}`);
154
+ }
155
+ }
156
+ };
157
+ }
158
+ exports.createRecordCliCommand = __webpack_exports__.createRecordCliCommand;
159
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
160
+ "createRecordCliCommand"
161
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
162
+ Object.defineProperty(exports, '__esModule', {
163
+ value: true
164
+ });
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ writeCliScreenshotFile: ()=>writeCliScreenshotFile
28
+ });
29
+ const external_node_fs_namespaceObject = require("node:fs");
30
+ const external_node_os_namespaceObject = require("node:os");
31
+ const external_node_path_namespaceObject = require("node:path");
32
+ function safeScreenshotFilenamePart(value) {
33
+ const text = 'string' == typeof value && value.length > 0 ? value : 'shot';
34
+ return text.replace(/[^a-zA-Z0-9._-]/g, '_') || 'shot';
35
+ }
36
+ function extensionFromImageMetadata(mimeType, extension) {
37
+ if ('jpeg' === extension || 'jpg' === extension) return 'jpeg';
38
+ if ('png' === extension) return 'png';
39
+ return 'image/jpeg' === mimeType ? 'jpeg' : 'png';
40
+ }
41
+ function writeCliScreenshotFile(rawBase64, options = {}) {
42
+ const extension = extensionFromImageMetadata(options.mimeType, options.extension);
43
+ const directory = options.directoryPath ? options.directoryPath : options.directoryName ? (0, external_node_path_namespaceObject.join)((0, external_node_os_namespaceObject.tmpdir)(), options.directoryName) : (0, external_node_os_namespaceObject.tmpdir)();
44
+ if (!(0, external_node_fs_namespaceObject.existsSync)(directory)) (0, external_node_fs_namespaceObject.mkdirSync)(directory, {
45
+ recursive: true
46
+ });
47
+ const filename = void 0 !== options.id ? `${safeScreenshotFilenamePart(options.id)}.${extension}` : `${options.filenamePrefix ?? 'screenshot'}-${Date.now()}.${extension}`;
48
+ const filePath = (0, external_node_path_namespaceObject.join)(directory, filename);
49
+ if (false !== options.overwrite || !(0, external_node_fs_namespaceObject.existsSync)(filePath)) (0, external_node_fs_namespaceObject.writeFileSync)(filePath, Buffer.from(rawBase64, 'base64'));
50
+ return filePath;
51
+ }
52
+ exports.writeCliScreenshotFile = __webpack_exports__.writeCliScreenshotFile;
53
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
54
+ "writeCliScreenshotFile"
55
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
56
+ Object.defineProperty(exports, '__esModule', {
57
+ value: true
58
+ });
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ buildAiActProgressEventLines: ()=>buildAiActProgressEventLines,
28
+ aiActCliProgressRenderer: ()=>aiActCliProgressRenderer,
29
+ cliAiActProgressScope: ()=>cliAiActProgressScope,
30
+ normalizeAiActProgressEventForCli: ()=>normalizeAiActProgressEventForCli
31
+ });
32
+ const external_verbose_screenshot_js_namespaceObject = require("./verbose-screenshot.js");
33
+ const cliAiActProgressScope = 'aiAct';
34
+ function isRecord(value) {
35
+ return 'object' == typeof value && null !== value && !Array.isArray(value);
36
+ }
37
+ function compactText(value) {
38
+ if (null == value || '' === value) return '';
39
+ if ('string' == typeof value) return value.length > 180 ? `${value.slice(0, 177)}...` : value;
40
+ if ('number' == typeof value || 'boolean' == typeof value) return String(value);
41
+ try {
42
+ const json = JSON.stringify(value);
43
+ return json.length > 180 ? `${json.slice(0, 177)}...` : json;
44
+ } catch {
45
+ return String(value);
46
+ }
47
+ }
48
+ function numericValue(value) {
49
+ return 'number' == typeof value && Number.isFinite(value) ? value : void 0;
50
+ }
51
+ function firstText(values) {
52
+ for (const value of values){
53
+ const text = compactText(value);
54
+ if (text) return text;
55
+ }
56
+ return '';
57
+ }
58
+ function planPrefix(event) {
59
+ const planIndex = numericValue(event.planIndex);
60
+ if (!planIndex) return '[Midscene][aiAct]';
61
+ const planLimit = numericValue(event.planLimit);
62
+ return `[Midscene][aiAct][Plan ${Math.round(planIndex)}${planLimit ? `/${Math.round(planLimit)}` : ''}]`;
63
+ }
64
+ function eventKey(event, suffix) {
65
+ const sequence = numericValue(event.sequence);
66
+ if (sequence) return `aiAct:${sequence}:${suffix}`;
67
+ return [
68
+ 'aiAct',
69
+ compactText(event.phase),
70
+ compactText(event.planIndex),
71
+ suffix
72
+ ].filter(Boolean).join(':');
73
+ }
74
+ function integerText(value) {
75
+ return String(Math.round(value));
76
+ }
77
+ function numberTuple2(value) {
78
+ if (Array.isArray(value) && value.length >= 2 && 'number' == typeof value[0] && 'number' == typeof value[1]) return [
79
+ value[0],
80
+ value[1]
81
+ ];
82
+ }
83
+ function numberTuple4(value) {
84
+ if (Array.isArray(value) && value.length >= 4 && value.slice(0, 4).every((item)=>'number' == typeof item)) return [
85
+ value[0],
86
+ value[1],
87
+ value[2],
88
+ value[3]
89
+ ];
90
+ }
91
+ function parseAction(value) {
92
+ if (!isRecord(value) || 'string' != typeof value.name) return;
93
+ return {
94
+ name: value.name,
95
+ target: 'string' == typeof value.target ? value.target : void 0,
96
+ point: numberTuple2(value.point),
97
+ bbox: numberTuple4(value.bbox),
98
+ param: value.param
99
+ };
100
+ }
101
+ function formatPoint(point) {
102
+ return `(${integerText(point[0])}, ${integerText(point[1])})`;
103
+ }
104
+ function formatBbox(bbox) {
105
+ return `(${bbox.map(integerText).join(',')})`;
106
+ }
107
+ function sleepActionText(action) {
108
+ if ('Sleep' !== action.name || !isRecord(action.param)) return;
109
+ const timeMs = numericValue(action.param.timeMs) ?? numericValue(action.param.duration) ?? numericValue(action.param.timeoutMs);
110
+ return void 0 !== timeMs ? `Sleep ${integerText(timeMs)}ms` : void 0;
111
+ }
112
+ function plannedActionText(action) {
113
+ if (action.point) {
114
+ const targetSegment = action.target ? ` "${action.target}"` : '';
115
+ const bboxSegment = action.bbox ? `, bbox=${formatBbox(action.bbox)}` : '';
116
+ return `${action.name}${targetSegment} at ${formatPoint(action.point)}${bboxSegment}`;
117
+ }
118
+ const sleep = sleepActionText(action);
119
+ if (sleep) return sleep;
120
+ const paramText = compactText(action.param);
121
+ return paramText ? `${action.name}: ${paramText}` : action.name;
122
+ }
123
+ function runningActionText(action) {
124
+ if (action.point) return `${action.name} at ${formatPoint(action.point)}`;
125
+ return plannedActionText(action);
126
+ }
127
+ function normalizeAiActProgressEventForCli(event, screenshotOptions = {}) {
128
+ if (!isRecord(event) || event.scope !== cliAiActProgressScope) return;
129
+ const data = isRecord(event.data) ? event.data : {};
130
+ const screenshots = (0, external_verbose_screenshot_js_namespaceObject.collectScreenshotRefs)(data.screenshot, screenshotOptions);
131
+ const latestPath = screenshots.slice().reverse().find((item)=>'string' == typeof item.path && item.path.length > 0)?.path;
132
+ const screenshotPath = 'string' == typeof latestPath ? (0, external_verbose_screenshot_js_namespaceObject.pathForReportScreenshot)(latestPath, screenshotOptions.reportFile) : void 0;
133
+ const { prompt, planIndex, planLimit, action, thought, log, output, durationMs, error } = data;
134
+ return {
135
+ phase: event.phase,
136
+ sequence: event.sequence,
137
+ prompt,
138
+ planIndex,
139
+ planLimit,
140
+ action,
141
+ thought,
142
+ log,
143
+ output,
144
+ durationMs,
145
+ error,
146
+ ...screenshots.length > 0 ? {
147
+ screenshots
148
+ } : {},
149
+ ...screenshotPath ? {
150
+ screenshotPath
151
+ } : {}
152
+ };
153
+ }
154
+ function buildAiActProgressEventLines(event) {
155
+ const phase = 'string' == typeof event.phase ? event.phase : '';
156
+ const prefix = planPrefix(event);
157
+ const error = compactText(event.error);
158
+ const duration = 'number' == typeof event.durationMs ? ` cost=${Math.round(event.durationMs)}ms` : '';
159
+ const action = parseAction(event.action);
160
+ switch(phase){
161
+ case 'start':
162
+ {
163
+ const prompt = compactText(event.prompt);
164
+ return [
165
+ {
166
+ key: `aiAct:start:${prompt}`,
167
+ text: prompt ? `[Midscene][aiAct] Start: ${prompt}` : '[Midscene][aiAct] Start'
168
+ }
169
+ ];
170
+ }
171
+ case 'plan_thinking':
172
+ return event.screenshotPath ? [
173
+ {
174
+ key: eventKey(event, 'thinking'),
175
+ text: `${prefix} Thinking with the latest screenshot: ${event.screenshotPath}`
176
+ }
177
+ ] : [
178
+ {
179
+ key: eventKey(event, 'thinking'),
180
+ text: `${prefix} Thinking with the latest screenshot`
181
+ }
182
+ ];
183
+ case 'plan_planned':
184
+ {
185
+ const text = firstText([
186
+ event.log,
187
+ event.thought,
188
+ event.output
189
+ ]);
190
+ return text ? [
191
+ {
192
+ key: eventKey(event, 'planned'),
193
+ text: `${prefix} Planned: ${text}`
194
+ }
195
+ ] : [];
196
+ }
197
+ case 'plan_action':
198
+ return action ? [
199
+ {
200
+ key: eventKey(event, 'action'),
201
+ text: `${prefix} Action: ${plannedActionText(action)}`
202
+ }
203
+ ] : [];
204
+ case 'plan_failed':
205
+ return [
206
+ {
207
+ key: eventKey(event, 'plan_failed'),
208
+ text: `${prefix} Failed${error ? `: ${error}` : ''}`
209
+ }
210
+ ];
211
+ case 'action_running':
212
+ return action ? [
213
+ {
214
+ key: eventKey(event, 'action_running'),
215
+ text: `[Midscene][aiAct][Action] Running: ${runningActionText(action)}`
216
+ }
217
+ ] : [];
218
+ case 'action_done':
219
+ return action ? [
220
+ {
221
+ key: eventKey(event, 'action_done'),
222
+ text: `[Midscene][aiAct][Action] Done: ${action.name}${duration}`
223
+ }
224
+ ] : [];
225
+ case 'action_failed':
226
+ return [
227
+ {
228
+ key: eventKey(event, 'action_failed'),
229
+ text: `[Midscene][aiAct][Action] Failed${action ? `: ${action.name}` : ''}${duration}${error ? ` error=${error}` : ''}`
230
+ }
231
+ ];
232
+ case 'complete':
233
+ {
234
+ const text = firstText([
235
+ event.output,
236
+ event.log,
237
+ event.thought
238
+ ]);
239
+ return [
240
+ {
241
+ key: eventKey(event, 'complete'),
242
+ text: `[Midscene][aiAct] Complete${text ? `: ${text}` : ''}`
243
+ }
244
+ ];
245
+ }
246
+ case 'failed':
247
+ return [
248
+ {
249
+ key: eventKey(event, 'failed'),
250
+ text: `[Midscene][aiAct] Failed${error ? `: ${error}` : ''}`
251
+ }
252
+ ];
253
+ default:
254
+ return [];
255
+ }
256
+ }
257
+ const aiActCliProgressRenderer = {
258
+ normalize: normalizeAiActProgressEventForCli,
259
+ buildLines: buildAiActProgressEventLines
260
+ };
261
+ exports.aiActCliProgressRenderer = __webpack_exports__.aiActCliProgressRenderer;
262
+ exports.buildAiActProgressEventLines = __webpack_exports__.buildAiActProgressEventLines;
263
+ exports.cliAiActProgressScope = __webpack_exports__.cliAiActProgressScope;
264
+ exports.normalizeAiActProgressEventForCli = __webpack_exports__.normalizeAiActProgressEventForCli;
265
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
266
+ "aiActCliProgressRenderer",
267
+ "buildAiActProgressEventLines",
268
+ "cliAiActProgressScope",
269
+ "normalizeAiActProgressEventForCli"
270
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
271
+ Object.defineProperty(exports, '__esModule', {
272
+ value: true
273
+ });
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ collectScreenshotRefs: ()=>collectScreenshotRefs,
28
+ pathForReportScreenshot: ()=>pathForReportScreenshot,
29
+ latestScreenshotPathForAiAct: ()=>latestScreenshotPathForAiAct,
30
+ renderScreenshotList: ()=>renderScreenshotList
31
+ });
32
+ const external_node_path_namespaceObject = require("node:path");
33
+ const external_screenshot_file_js_namespaceObject = require("./screenshot-file.js");
34
+ function isRecord(value) {
35
+ return 'object' == typeof value && null !== value && !Array.isArray(value);
36
+ }
37
+ function isCliVerboseScreenshotRefLike(value) {
38
+ return isRecord(value) && 'midscene_screenshot_ref' === value.type;
39
+ }
40
+ function toSerializableScreenshot(value) {
41
+ if (!value || 'object' != typeof value) return null;
42
+ const maybeSerializable = value;
43
+ if ('function' == typeof maybeSerializable.toSerializable) try {
44
+ const serialized = maybeSerializable.toSerializable();
45
+ return isCliVerboseScreenshotRefLike(serialized) ? serialized : null;
46
+ } catch {
47
+ return null;
48
+ }
49
+ return isCliVerboseScreenshotRefLike(value) ? value : null;
50
+ }
51
+ function getStringProperty(value, key) {
52
+ if (!isRecord(value)) return;
53
+ try {
54
+ const property = value[key];
55
+ return 'string' == typeof property && property.length > 0 ? property : void 0;
56
+ } catch {
57
+ return;
58
+ }
59
+ }
60
+ function screenshotRawBase64(value) {
61
+ const rawBase64 = getStringProperty(value, 'rawBase64');
62
+ if (rawBase64) return rawBase64;
63
+ const base64 = getStringProperty(value, 'base64');
64
+ const match = base64?.match(/^data:image\/(?:png|jpeg|jpg);base64,(.+)$/);
65
+ return match?.[1];
66
+ }
67
+ function inlineScreenshotCacheKey(rawBase64, serialized, directoryPath, directoryName, extension) {
68
+ return JSON.stringify([
69
+ serialized.id,
70
+ serialized.mimeType,
71
+ directoryPath,
72
+ directoryName,
73
+ extension,
74
+ rawBase64
75
+ ]);
76
+ }
77
+ function exportInlineScreenshotForVerbose(value, serialized, options) {
78
+ if ('string' == typeof serialized.path) return serialized.path;
79
+ const exportMode = options.exportMode ?? 'tmp';
80
+ if ('none' === exportMode) return;
81
+ const rawBase64 = screenshotRawBase64(value);
82
+ if (!rawBase64) return;
83
+ const directoryPath = 'report' === exportMode && 'string' == typeof options.reportFile && options.reportFile.length > 0 ? (0, external_node_path_namespaceObject.join)((0, external_node_path_namespaceObject.dirname)(options.reportFile), 'screenshots') : void 0;
84
+ const directoryName = directoryPath ? void 0 : 'midscene-cli-screenshots';
85
+ const extension = getStringProperty(value, 'extension');
86
+ const cacheKey = inlineScreenshotCacheKey(rawBase64, serialized, directoryPath, directoryName, extension);
87
+ const cachedPath = options.cache?.get(cacheKey);
88
+ if (cachedPath) return cachedPath;
89
+ try {
90
+ const path = (0, external_screenshot_file_js_namespaceObject.writeCliScreenshotFile)(rawBase64, {
91
+ id: serialized.id,
92
+ mimeType: serialized.mimeType,
93
+ extension,
94
+ ...directoryPath ? {
95
+ directoryPath
96
+ } : {
97
+ directoryName
98
+ },
99
+ overwrite: false
100
+ });
101
+ options.cache?.set(cacheKey, path);
102
+ return path;
103
+ } catch {
104
+ return;
105
+ }
106
+ }
107
+ function collectScreenshotRefs(value, options = {}) {
108
+ const screenshots = [];
109
+ const visit = (candidate, timing)=>{
110
+ if (Array.isArray(candidate)) {
111
+ for (const item of candidate)visit(item, timing);
112
+ return;
113
+ }
114
+ const serialized = toSerializableScreenshot(candidate);
115
+ if (serialized?.type === 'midscene_screenshot_ref') {
116
+ const screenshot = {
117
+ id: serialized.id,
118
+ storage: serialized.storage
119
+ };
120
+ const exportedPath = exportInlineScreenshotForVerbose(candidate, serialized, options);
121
+ if (exportedPath) {
122
+ screenshot.path = exportedPath;
123
+ screenshot.file = (0, external_node_path_namespaceObject.basename)(exportedPath);
124
+ }
125
+ if ('string' == typeof timing) screenshot.timing = timing;
126
+ screenshots.push(screenshot);
127
+ return;
128
+ }
129
+ if (!isRecord(candidate)) return;
130
+ const screenshotRecord = candidate.screenshot;
131
+ if (screenshotRecord) visit(screenshotRecord, candidate.timing);
132
+ if (candidate.recorder) visit(candidate.recorder);
133
+ if (isRecord(candidate.uiContext)) visit(candidate.uiContext.screenshot);
134
+ };
135
+ visit(value);
136
+ return screenshots;
137
+ }
138
+ function pathForReportScreenshot(path, reportFile) {
139
+ const resolvedPath = 'string' == typeof reportFile && reportFile.length > 0 && (path.startsWith('./') || path.startsWith('../')) ? (0, external_node_path_namespaceObject.join)((0, external_node_path_namespaceObject.dirname)(reportFile), path) : path;
140
+ if (!(0, external_node_path_namespaceObject.isAbsolute)(resolvedPath)) return resolvedPath;
141
+ const relativePath = (0, external_node_path_namespaceObject.relative)(process.cwd(), resolvedPath);
142
+ if (relativePath && !relativePath.startsWith('..') && !(0, external_node_path_namespaceObject.isAbsolute)(relativePath)) return relativePath;
143
+ return resolvedPath;
144
+ }
145
+ function latestScreenshotPathForAiAct(value, options = {}) {
146
+ const screenshot = collectScreenshotRefs(value, {
147
+ ...options,
148
+ exportMode: options.exportMode ?? 'report'
149
+ }).slice().reverse().find((item)=>'string' == typeof item.path && item.path.length > 0);
150
+ const path = 'string' == typeof screenshot?.path ? screenshot.path : '';
151
+ return path ? pathForReportScreenshot(path, options.reportFile) : '';
152
+ }
153
+ function renderScreenshotList(screenshots) {
154
+ if (!Array.isArray(screenshots) || 0 === screenshots.length) return '';
155
+ return screenshots.map((item)=>{
156
+ if (!isRecord(item)) return '';
157
+ const path = 'string' == typeof item.path ? item.path : 'string' == typeof item.file ? item.file : 'string' == typeof item.id ? item.id : '';
158
+ const timing = 'string' == typeof item.timing ? item.timing : '';
159
+ return [
160
+ timing,
161
+ path
162
+ ].filter(Boolean).join(' ');
163
+ }).filter(Boolean).join(', ');
164
+ }
165
+ exports.collectScreenshotRefs = __webpack_exports__.collectScreenshotRefs;
166
+ exports.latestScreenshotPathForAiAct = __webpack_exports__.latestScreenshotPathForAiAct;
167
+ exports.pathForReportScreenshot = __webpack_exports__.pathForReportScreenshot;
168
+ exports.renderScreenshotList = __webpack_exports__.renderScreenshotList;
169
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
170
+ "collectScreenshotRefs",
171
+ "latestScreenshotPathForAiAct",
172
+ "pathForReportScreenshot",
173
+ "renderScreenshotList"
174
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
175
+ Object.defineProperty(exports, '__esModule', {
176
+ value: true
177
+ });