@straiffi/archon 1.3.5 → 1.3.7

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 (88) hide show
  1. package/dist/client/assets/TestsDialog-pFtXuGjB.js +5 -0
  2. package/dist/client/assets/{architectureDiagram-3BPJPVTR-CHnXshuZ.js → architectureDiagram-3BPJPVTR-BXnDUGyb.js} +1 -1
  3. package/dist/client/assets/{blockDiagram-GPEHLZMM-C4ZedL1G.js → blockDiagram-GPEHLZMM-5LLbCKHc.js} +1 -1
  4. package/dist/client/assets/{c4Diagram-AAUBKEIU-BuD-jPC_.js → c4Diagram-AAUBKEIU-eOPp4IOA.js} +1 -1
  5. package/dist/client/assets/channel-WEAinq2i.js +1 -0
  6. package/dist/client/assets/{chunk-2J33WTMH-BKDkaoQT.js → chunk-2J33WTMH-70mAeHqS.js} +1 -1
  7. package/dist/client/assets/{chunk-3OPIFGDE-CS0HFD9a.js → chunk-3OPIFGDE-FN2jGhe_.js} +1 -1
  8. package/dist/client/assets/{chunk-5ZQYHXKU-DYo_TwPP.js → chunk-5ZQYHXKU-zk3e2Q2-.js} +1 -1
  9. package/dist/client/assets/{chunk-727SXJPM-BajKdB6e.js → chunk-727SXJPM-M_2iMiWX.js} +1 -1
  10. package/dist/client/assets/{chunk-AQP2D5EJ-j2FtLU1G.js → chunk-AQP2D5EJ-7qrH-rwu.js} +1 -1
  11. package/dist/client/assets/{chunk-CSCIHK7Q-CTy5Vnsi.js → chunk-CSCIHK7Q-BXoDPrBx.js} +1 -1
  12. package/dist/client/assets/{chunk-KSCS5N6A-DFdh0Cya.js → chunk-KSCS5N6A-BP2vZxBw.js} +1 -1
  13. package/dist/client/assets/{chunk-L5ZTLDWV-BFBha-m9.js → chunk-L5ZTLDWV-C84tHfaF.js} +1 -1
  14. package/dist/client/assets/{chunk-LZXEDZCA-DpeaPMtX.js → chunk-LZXEDZCA-C3vH4LVq.js} +2 -2
  15. package/dist/client/assets/{chunk-ND2GUHAM-CazKz40j.js → chunk-ND2GUHAM-CFFpgrqC.js} +1 -1
  16. package/dist/client/assets/{chunk-NZK2D7GU-B2IFwDK1.js → chunk-NZK2D7GU-CMmCrH3A.js} +1 -1
  17. package/dist/client/assets/{chunk-O5CBEL6O-Dr6DQwZn.js → chunk-O5CBEL6O-DgTG8ELm.js} +1 -1
  18. package/dist/client/assets/{chunk-WU5MYG2G-BTQnr7be.js → chunk-WU5MYG2G-BJcuRxWz.js} +1 -1
  19. package/dist/client/assets/classDiagram-4FO5ZUOK-Cj3w6BRn.js +1 -0
  20. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-tm-_BZHG.js +1 -0
  21. package/dist/client/assets/{dagre-BM42HDAG-BhO_9BZa.js → dagre-BM42HDAG-B4J6Kmpr.js} +1 -1
  22. package/dist/client/assets/{diagram-2AECGRRQ-2Qn456ux.js → diagram-2AECGRRQ-CkCGn-uT.js} +1 -1
  23. package/dist/client/assets/{diagram-5GNKFQAL-svJkmW34.js → diagram-5GNKFQAL-r6j1z6Vu.js} +1 -1
  24. package/dist/client/assets/{diagram-KO2AKTUF-BkTHZ5mW.js → diagram-KO2AKTUF-CoCdTQxL.js} +1 -1
  25. package/dist/client/assets/{diagram-LMA3HP47-uhDh1chZ.js → diagram-LMA3HP47-BQ4-MIHw.js} +1 -1
  26. package/dist/client/assets/{diagram-OG6HWLK6-TRif4ORE.js → diagram-OG6HWLK6-COArrwVi.js} +1 -1
  27. package/dist/client/assets/{erDiagram-TEJ5UH35-CVt_E331.js → erDiagram-TEJ5UH35-DJ97Ms_M.js} +1 -1
  28. package/dist/client/assets/{flowDiagram-I6XJVG4X-B4s33tHN.js → flowDiagram-I6XJVG4X-LuN4eMjN.js} +1 -1
  29. package/dist/client/assets/{ganttDiagram-6RSMTGT7-Dn2Tw0UP.js → ganttDiagram-6RSMTGT7-CW9iCWmj.js} +1 -1
  30. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DL--5nPh.js → gitGraphDiagram-PVQCEYII-CzbPGVzo.js} +1 -1
  31. package/dist/client/assets/index-C7cl3g7B.js +260 -0
  32. package/dist/client/assets/index-DdUNR-i1.css +2 -0
  33. package/dist/client/assets/{infoDiagram-5YYISTIA-CaBMZo3i.js → infoDiagram-5YYISTIA-Bb-OXYAc.js} +1 -1
  34. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-BK8J4ndX.js → ishikawaDiagram-YF4QCWOH-BwA6L5Oa.js} +1 -1
  35. package/dist/client/assets/{journeyDiagram-JHISSGLW-BS7hFGG3.js → journeyDiagram-JHISSGLW-DAXniNDx.js} +1 -1
  36. package/dist/client/assets/{kanban-definition-UN3LZRKU-Bp3uL0wq.js → kanban-definition-UN3LZRKU-BNTh3arC.js} +1 -1
  37. package/dist/client/assets/{line-BCYzOKh3.js → line-WpsOL_z2.js} +1 -1
  38. package/dist/client/assets/{mermaid-parser.core-8idx1Ea6.js → mermaid-parser.core-BfbYyPLJ.js} +1 -1
  39. package/dist/client/assets/{mermaid.core-CxR4-p_S.js → mermaid.core-pBoV7OEi.js} +3 -3
  40. package/dist/client/assets/{mindmap-definition-RKZ34NQL--qrRjfiZ.js → mindmap-definition-RKZ34NQL-Bs_KSIW5.js} +1 -1
  41. package/dist/client/assets/{pieDiagram-4H26LBE5-PeY79WfN.js → pieDiagram-4H26LBE5-BcmJRsYh.js} +1 -1
  42. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-UbrmuIOq.js → quadrantDiagram-W4KKPZXB-CpE4xYKJ.js} +1 -1
  43. package/dist/client/assets/{requirementDiagram-4Y6WPE33-f9Mg2g9n.js → requirementDiagram-4Y6WPE33-BLLgSUj2.js} +1 -1
  44. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Cc5IOQG3.js → sankeyDiagram-5OEKKPKP-B4YthG4l.js} +1 -1
  45. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BA_ghDe5.js → sequenceDiagram-3UESZ5HK-xT-IzjEu.js} +1 -1
  46. package/dist/client/assets/{stateDiagram-AJRCARHV-Cp7ykzNi.js → stateDiagram-AJRCARHV-TUrenFUB.js} +1 -1
  47. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-NwrtxmmO.js +1 -0
  48. package/dist/client/assets/{timeline-definition-PNZ67QCA-DGtYslSV.js → timeline-definition-PNZ67QCA-CnTMXpEM.js} +1 -1
  49. package/dist/client/assets/{vennDiagram-CIIHVFJN-DUTouIKP.js → vennDiagram-CIIHVFJN-DdGwGknh.js} +1 -1
  50. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DKrISe1w.js → wardleyDiagram-YWT4CUSO-BI16R1lX.js} +1 -1
  51. package/dist/client/assets/{xychartDiagram-2RQKCTM6-B66iktR0.js → xychartDiagram-2RQKCTM6-BSf2il9a.js} +1 -1
  52. package/dist/client/index.html +2 -2
  53. package/dist/server/db.js +45 -0
  54. package/dist/server/db.js.map +1 -1
  55. package/dist/server/index.js +65 -0
  56. package/dist/server/index.js.map +1 -1
  57. package/dist/server/lib/agent.js +244 -0
  58. package/dist/server/lib/agent.js.map +1 -1
  59. package/dist/server/lib/mobileAccess.js +124 -0
  60. package/dist/server/lib/mobileAccess.js.map +1 -1
  61. package/dist/server/lib/planModeQuestions.js +1 -0
  62. package/dist/server/lib/planModeQuestions.js.map +1 -1
  63. package/dist/server/lib/specArtifact.js +22 -5
  64. package/dist/server/lib/specArtifact.js.map +1 -1
  65. package/dist/server/lib/specReviewContext.js +128 -0
  66. package/dist/server/lib/specReviewContext.js.map +1 -0
  67. package/dist/server/lib/specReviewDraft.js +58 -0
  68. package/dist/server/lib/specReviewDraft.js.map +1 -0
  69. package/dist/server/lib/specReviewOperations.js +132 -0
  70. package/dist/server/lib/specReviewOperations.js.map +1 -0
  71. package/dist/server/lib/specReviews.js +329 -0
  72. package/dist/server/lib/specReviews.js.map +1 -0
  73. package/dist/server/lib/specs.js +6 -5
  74. package/dist/server/lib/specs.js.map +1 -1
  75. package/dist/server/lib/toolUpgrade.js +107 -0
  76. package/dist/server/lib/toolUpgrade.js.map +1 -0
  77. package/dist/server/workers/specReview.js +85 -0
  78. package/dist/server/workers/specReview.js.map +1 -0
  79. package/dist/server/workers/specSession.js +41 -11
  80. package/dist/server/workers/specSession.js.map +1 -1
  81. package/package.json +1 -1
  82. package/dist/client/assets/TestsDialog-B0WvkzrX.js +0 -5
  83. package/dist/client/assets/channel-Bp1nxPf1.js +0 -1
  84. package/dist/client/assets/classDiagram-4FO5ZUOK-BFSejQGj.js +0 -1
  85. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-GUv-gbmg.js +0 -1
  86. package/dist/client/assets/index-BEgA3Rtd.css +0 -2
  87. package/dist/client/assets/index-CiOFEE0Z.js +0 -260
  88. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-D9N_a8JM.js +0 -1
@@ -7,6 +7,7 @@ import { getChatSession, updateChatSessionUsageSnapshot } from './chats.js';
7
7
  import { normalizeModelId } from './models.js';
8
8
  import { PLAN_MODE_QUESTION_TOOL_NAME } from './planModeQuestions.js';
9
9
  import { getSpecSession, updateSpecSessionResumeId, updateSpecSessionStatus, updateSpecSessionTitle, updateSpecSessionUsageSnapshot } from './specs.js';
10
+ import { updateSpecReviewRunStatus, updateSpecReviewRunStreaming, updateSpecReviewRunUsage } from './specReviews.js';
10
11
  import { resolveOpencodeDbPath } from './runtimePaths.js';
11
12
  import { markTicketDescriptionVisibleInBundle } from './ticketMessages.js';
12
13
  import { getTicket } from './tickets.js';
@@ -177,6 +178,7 @@ const hasMatchingUsageSnapshot = (current, next) => {
177
178
  const activeBuildProcesses = new Map();
178
179
  const activeChatProcesses = new Map();
179
180
  const activeSpecProcesses = new Map();
181
+ const activeSpecReviewProcesses = new Map();
180
182
  const getErrorMessage = (error) => {
181
183
  return error instanceof Error ? error.message : String(error);
182
184
  };
@@ -1060,6 +1062,13 @@ const untrackSpecProcess = (specSessionId, state) => {
1060
1062
  state.metadataRefresher?.stop();
1061
1063
  state.metadataRefresher = null;
1062
1064
  };
1065
+ const untrackSpecReviewProcess = (specReviewRunId, state) => {
1066
+ if (activeSpecReviewProcesses.get(specReviewRunId) === state) {
1067
+ activeSpecReviewProcesses.delete(specReviewRunId);
1068
+ }
1069
+ state.metadataRefresher?.stop();
1070
+ state.metadataRefresher = null;
1071
+ };
1063
1072
  export const isBuildAgentRunning = (ticketId) => activeBuildProcesses.has(ticketId);
1064
1073
  export const stopAllBuildAgents = async () => {
1065
1074
  const ticketIds = [...activeBuildProcesses.keys()];
@@ -1109,6 +1118,21 @@ export const stopSpecAgent = async (specSessionId) => {
1109
1118
  }
1110
1119
  return true;
1111
1120
  };
1121
+ export const stopSpecReviewAgent = async (specReviewRunId) => {
1122
+ const state = activeSpecReviewProcesses.get(specReviewRunId);
1123
+ if (!state?.child) {
1124
+ return false;
1125
+ }
1126
+ state.stopRequested = true;
1127
+ state.metadataRefresher?.stop();
1128
+ killProcess(state.child, 'SIGTERM');
1129
+ await waitForProcessExit(state.child, 5000);
1130
+ if (isProcessAlive(state.child)) {
1131
+ killProcess(state.child, 'SIGKILL');
1132
+ await waitForProcessExit(state.child, 1000);
1133
+ }
1134
+ return true;
1135
+ };
1112
1136
  export const runAgent = ({ ticketId, tool, prompt, cwd, io, model, variant = null, resumeSessionId = null, sessionField = 'session_id', trackBuildProcess = false, emitSuccessUpdate = true, opencodeAgentMode, }) => {
1113
1137
  const resolvedModel = normalizeModelId(model);
1114
1138
  return new Promise((resolve, reject) => {
@@ -2009,4 +2033,224 @@ export const runSpecAgent = ({ specSessionId, tool, prompt, files = [], cwd, io,
2009
2033
  });
2010
2034
  });
2011
2035
  };
2036
+ /**
2037
+ * Focused, decoupled runner for a one-shot Spec Review.
2038
+ *
2039
+ * Spawns identically to runSpecAgent (plan permission mode for claude,
2040
+ * `--agent plan` for opencode, cwd = the project repo working dir) so a
2041
+ * code-aware reviewer needs no new permission plumbing. The critical difference
2042
+ * is that all status/streaming writes go to the spec_review_runs row via
2043
+ * updateSpecReviewRunStatus / updateSpecReviewRunStreaming / updateSpecReviewRunUsage —
2044
+ * the spec_sessions row is never touched by this path.
2045
+ */
2046
+ export const runSpecReviewAgent = ({ specReviewRunId, tool, prompt, files = [], cwd, io, model, variant = null, }) => {
2047
+ const resolvedModel = normalizeModelId(model);
2048
+ return new Promise((resolve, reject) => {
2049
+ let settled = false;
2050
+ let startTime = null;
2051
+ let firstFinalAnswerTime = null;
2052
+ let usageSnapshot = EMPTY_CHAT_USAGE_SNAPSHOT;
2053
+ const reviewState = {
2054
+ child: null,
2055
+ stopRequested: false,
2056
+ metadataRefresher: null,
2057
+ };
2058
+ const settle = (handler) => (value) => {
2059
+ if (settled) {
2060
+ return;
2061
+ }
2062
+ settled = true;
2063
+ untrackSpecReviewProcess(specReviewRunId, reviewState);
2064
+ handler(value);
2065
+ };
2066
+ const resolveOnce = settle(resolve);
2067
+ const rejectOnce = settle(reject);
2068
+ const emitReviewUpdated = () => {
2069
+ io.emit('spec-review:updated', { spec_review_run_id: specReviewRunId });
2070
+ };
2071
+ const [cmd, args] = tool === 'claude'
2072
+ ? [
2073
+ 'claude',
2074
+ [
2075
+ '--permission-mode',
2076
+ 'plan',
2077
+ '--disallowedTools',
2078
+ PLAN_MODE_QUESTION_TOOL_NAME,
2079
+ '--print',
2080
+ '--verbose',
2081
+ '--output-format',
2082
+ 'stream-json',
2083
+ '--session-id',
2084
+ randomUUID(),
2085
+ prompt,
2086
+ ],
2087
+ ]
2088
+ : ['opencode', ['run', '--agent', 'plan', '--format', 'json', '--thinking', ...(resolvedModel ? ['--model', resolvedModel] : []), ...(variant ? ['--variant', variant] : []), ...files.flatMap(filePath => ['--file', filePath]), ...(files.length > 0 ? ['--'] : []), prompt]];
2089
+ updateSpecReviewRunStreaming(specReviewRunId, null);
2090
+ emitReviewUpdated();
2091
+ const child = spawn(cmd, args, {
2092
+ cwd,
2093
+ stdio: ['ignore', 'pipe', 'pipe'],
2094
+ env: { ...process.env, PWD: cwd },
2095
+ detached: process.platform !== 'win32',
2096
+ });
2097
+ reviewState.child = child;
2098
+ activeSpecReviewProcesses.set(specReviewRunId, reviewState);
2099
+ startTime = Date.now();
2100
+ if (tool === 'claude') {
2101
+ const logLines = [];
2102
+ const responseLines = [];
2103
+ let remainder = '';
2104
+ const stderrChunks = [];
2105
+ const progressUpdater = createThrottledProgressUpdater(() => {
2106
+ updateSpecReviewRunStreaming(specReviewRunId, responseLines.join('\n\n') || null);
2107
+ });
2108
+ child.stdout?.on('data', (chunk) => {
2109
+ const text = remainder + chunk.toString();
2110
+ const lines = text.split('\n');
2111
+ remainder = lines.pop() ?? '';
2112
+ for (const line of lines) {
2113
+ usageSnapshot = mergeUsageFromJsonLine(usageSnapshot, line);
2114
+ const { logFragment, responseFragment } = parseClaudeStreamJsonLine(line);
2115
+ if (logFragment !== null) {
2116
+ logLines.push(logFragment);
2117
+ }
2118
+ if (responseFragment !== null) {
2119
+ responseLines.push(responseFragment);
2120
+ }
2121
+ if (logFragment !== null || responseFragment !== null) {
2122
+ progressUpdater.schedule();
2123
+ }
2124
+ }
2125
+ });
2126
+ child.stderr?.on('data', (chunk) => stderrChunks.push(chunk));
2127
+ child.on('close', code => {
2128
+ progressUpdater.cancel();
2129
+ if (remainder.trim()) {
2130
+ usageSnapshot = mergeUsageFromJsonLine(usageSnapshot, remainder);
2131
+ const { logFragment, responseFragment } = parseClaudeStreamJsonLine(remainder);
2132
+ if (logFragment !== null) {
2133
+ logLines.push(logFragment);
2134
+ }
2135
+ if (responseFragment !== null) {
2136
+ responseLines.push(responseFragment);
2137
+ }
2138
+ }
2139
+ const errOutput = Buffer.concat(stderrChunks).toString();
2140
+ const finalLog = logLines.join('\n\n') || errOutput;
2141
+ const finalResponse = responseLines.join('\n\n') || errOutput;
2142
+ if (reviewState.stopRequested) {
2143
+ updateSpecReviewRunStreaming(specReviewRunId, finalResponse || null);
2144
+ resolveOnce({
2145
+ completionStatus: 'stopped',
2146
+ finalResponse,
2147
+ usageSnapshot,
2148
+ responseTiming: buildResponseTiming({ startTime, firstFinalAnswerTime, isStopped: true }),
2149
+ });
2150
+ return;
2151
+ }
2152
+ const modelError = isModelResolutionError(finalLog);
2153
+ if (code === 0 && !modelError) {
2154
+ updateSpecReviewRunStreaming(specReviewRunId, finalResponse || null);
2155
+ resolveOnce({
2156
+ completionStatus: 'done',
2157
+ finalResponse,
2158
+ usageSnapshot,
2159
+ responseTiming: buildResponseTiming({ startTime, firstFinalAnswerTime, isStopped: false }),
2160
+ });
2161
+ return;
2162
+ }
2163
+ rejectOnce(new Error(`Agent exited with code ${code ?? 'null'}\n${finalLog}${errOutput !== finalLog && errOutput ? '\n\n' + errOutput : ''}`));
2164
+ });
2165
+ child.on('error', err => {
2166
+ progressUpdater.cancel();
2167
+ rejectOnce(err instanceof Error ? err : new Error(getErrorMessage(err)));
2168
+ });
2169
+ return;
2170
+ }
2171
+ const logLines = [];
2172
+ const responseLines = [];
2173
+ let remainder = '';
2174
+ const stderrChunks = [];
2175
+ const progressUpdater = createThrottledProgressUpdater(() => {
2176
+ updateSpecReviewRunStreaming(specReviewRunId, responseLines.join('\n\n') || null);
2177
+ });
2178
+ child.stdout?.on('data', (chunk) => {
2179
+ const text = remainder + chunk.toString();
2180
+ const lines = text.split('\n');
2181
+ remainder = lines.pop() ?? '';
2182
+ for (const line of lines) {
2183
+ usageSnapshot = mergeUsageFromJsonLine(usageSnapshot, line);
2184
+ if (firstFinalAnswerTime === null && startTime !== null) {
2185
+ const trimmedLine = line.trim();
2186
+ if (trimmedLine.startsWith('{')) {
2187
+ try {
2188
+ const event = JSON.parse(trimmedLine);
2189
+ if (event.type === 'text' && event.part?.type === 'text' && event.part.text) {
2190
+ const phase = event.part.metadata?.openai?.phase;
2191
+ if (!phase || phase === 'final_answer') {
2192
+ firstFinalAnswerTime = Date.now();
2193
+ }
2194
+ }
2195
+ }
2196
+ catch { /* best-effort timing */ }
2197
+ }
2198
+ }
2199
+ const { logFragment, responseFragment } = parseOpencodeJsonLine(line, cwd);
2200
+ if (logFragment !== null) {
2201
+ logLines.push(logFragment);
2202
+ }
2203
+ if (responseFragment !== null) {
2204
+ responseLines.push(responseFragment);
2205
+ }
2206
+ if (logFragment !== null || responseFragment !== null) {
2207
+ progressUpdater.schedule();
2208
+ }
2209
+ }
2210
+ });
2211
+ child.stderr?.on('data', (chunk) => stderrChunks.push(chunk));
2212
+ child.on('close', code => {
2213
+ progressUpdater.cancel();
2214
+ if (remainder.trim()) {
2215
+ usageSnapshot = mergeUsageFromJsonLine(usageSnapshot, remainder);
2216
+ const { logFragment, responseFragment } = parseOpencodeJsonLine(remainder, cwd);
2217
+ if (logFragment !== null) {
2218
+ logLines.push(logFragment);
2219
+ }
2220
+ if (responseFragment !== null) {
2221
+ responseLines.push(responseFragment);
2222
+ }
2223
+ }
2224
+ const stderrOutput = Buffer.concat(stderrChunks).toString();
2225
+ const log = logLines.join('\n\n') || stderrOutput;
2226
+ const finalResponse = responseLines.join('\n\n') || stderrOutput;
2227
+ if (reviewState.stopRequested) {
2228
+ updateSpecReviewRunStreaming(specReviewRunId, finalResponse || null);
2229
+ resolveOnce({
2230
+ completionStatus: 'stopped',
2231
+ finalResponse,
2232
+ usageSnapshot,
2233
+ responseTiming: buildResponseTiming({ startTime, firstFinalAnswerTime, isStopped: true }),
2234
+ });
2235
+ return;
2236
+ }
2237
+ const modelError = isModelResolutionError(log);
2238
+ if (code === 0 && !modelError) {
2239
+ updateSpecReviewRunStreaming(specReviewRunId, finalResponse || null);
2240
+ resolveOnce({
2241
+ completionStatus: 'done',
2242
+ finalResponse,
2243
+ usageSnapshot,
2244
+ responseTiming: buildResponseTiming({ startTime, firstFinalAnswerTime, isStopped: false }),
2245
+ });
2246
+ return;
2247
+ }
2248
+ rejectOnce(new Error(`Agent exited with code ${code ?? 'null'}\n${log}${stderrOutput !== log && stderrOutput ? '\n\n' + stderrOutput : ''}`));
2249
+ });
2250
+ child.on('error', err => {
2251
+ progressUpdater.cancel();
2252
+ rejectOnce(err instanceof Error ? err : new Error(getErrorMessage(err)));
2253
+ });
2254
+ });
2255
+ };
2012
2256
  //# sourceMappingURL=agent.js.map