@getpaseo/server 0.9.2 → 0.10.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/dist/scripts/supervisor.js +51 -21
  2. package/dist/server/server/agent/agent-manager.js +22 -2
  3. package/dist/server/server/agent/agent-prompt.js +12 -0
  4. package/dist/server/server/agent/agent-sdk-types.d.ts +3 -0
  5. package/dist/server/server/agent/mcp-shared.d.ts +5 -1
  6. package/dist/server/server/agent/mcp-shared.js +2 -1
  7. package/dist/server/server/agent/provider-registry.js +2 -2
  8. package/dist/server/server/agent/providers/acp-agent.js +20 -11
  9. package/dist/server/server/agent/providers/claude/agent.d.ts +1 -2
  10. package/dist/server/server/agent/providers/claude/agent.js +10 -9
  11. package/dist/server/server/agent/providers/claude/models.d.ts +1 -1
  12. package/dist/server/server/agent/providers/claude/models.js +1 -5
  13. package/dist/server/server/agent/providers/claude/project-dir.d.ts +1 -0
  14. package/dist/server/server/agent/providers/claude/project-dir.js +5 -1
  15. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +6 -1
  16. package/dist/server/server/agent/providers/codex-app-server-agent.js +10 -1
  17. package/dist/server/server/agent/providers/generic-acp-agent.js +3 -1
  18. package/dist/server/server/agent/providers/omp/agent.js +23 -6
  19. package/dist/server/server/agent/providers/omp/rpc-types.d.ts +1 -0
  20. package/dist/server/server/agent/providers/omp/rpc-types.js +1 -0
  21. package/dist/server/server/agent/providers/opencode/bridge.d.ts +5 -1
  22. package/dist/server/server/agent/providers/opencode/bridge.js +56 -5
  23. package/dist/server/server/agent/providers/opencode/http-error.d.ts +8 -0
  24. package/dist/server/server/agent/providers/opencode/http-error.js +13 -0
  25. package/dist/server/server/agent/providers/opencode/runtime-client.d.ts +38 -0
  26. package/dist/server/server/agent/providers/opencode/runtime-client.js +131 -0
  27. package/dist/server/server/agent/providers/opencode/runtime-notice.d.ts +3 -0
  28. package/dist/server/server/agent/providers/opencode/runtime-notice.js +47 -0
  29. package/dist/server/server/agent/providers/opencode/server-manager.js +19 -8
  30. package/dist/server/server/agent/providers/opencode/v2/agent.d.ts +36 -0
  31. package/dist/server/server/agent/providers/opencode/v2/agent.js +208 -0
  32. package/dist/server/server/agent/providers/opencode/v2/api.d.ts +18 -0
  33. package/dist/server/server/agent/providers/opencode/v2/api.js +2 -0
  34. package/dist/server/server/agent/providers/opencode/v2/bridge-plugin.bundle.mjs +6693 -0
  35. package/dist/server/server/agent/providers/opencode/v2/capabilities.d.ts +3 -0
  36. package/dist/server/server/agent/providers/opencode/v2/capabilities.js +13 -0
  37. package/dist/server/server/agent/providers/opencode/v2/children.d.ts +20 -0
  38. package/dist/server/server/agent/providers/opencode/v2/children.js +75 -0
  39. package/dist/server/server/agent/providers/opencode/v2/commands.d.ts +4 -0
  40. package/dist/server/server/agent/providers/opencode/v2/commands.js +36 -0
  41. package/dist/server/server/agent/providers/opencode/v2/configuration.d.ts +8 -0
  42. package/dist/server/server/agent/providers/opencode/v2/configuration.js +64 -0
  43. package/dist/server/server/agent/providers/opencode/v2/history.d.ts +4 -0
  44. package/dist/server/server/agent/providers/opencode/v2/history.js +15 -0
  45. package/dist/server/server/agent/providers/opencode/v2/mapping.d.ts +7 -0
  46. package/dist/server/server/agent/providers/opencode/v2/mapping.js +42 -0
  47. package/dist/server/server/agent/providers/opencode/v2/permissions.d.ts +18 -0
  48. package/dist/server/server/agent/providers/opencode/v2/permissions.js +157 -0
  49. package/dist/server/server/agent/providers/opencode/v2/readiness.d.ts +18 -0
  50. package/dist/server/server/agent/providers/opencode/v2/readiness.js +51 -0
  51. package/dist/server/server/agent/providers/opencode/v2/runtime.d.ts +36 -0
  52. package/dist/server/server/agent/providers/opencode/v2/runtime.js +230 -0
  53. package/dist/server/server/agent/providers/opencode/v2/session.d.ts +84 -0
  54. package/dist/server/server/agent/providers/opencode/v2/session.js +465 -0
  55. package/dist/server/server/agent/providers/opencode/v2/structured-output.d.ts +8 -0
  56. package/dist/server/server/agent/providers/opencode/v2/structured-output.js +32 -0
  57. package/dist/server/server/agent/providers/opencode/v2/timeline.d.ts +28 -0
  58. package/dist/server/server/agent/providers/opencode/v2/timeline.js +154 -0
  59. package/dist/server/server/agent/providers/opencode/v2/turns.d.ts +40 -0
  60. package/dist/server/server/agent/providers/opencode/v2/turns.js +226 -0
  61. package/dist/server/server/agent/providers/opencode-agent.d.ts +26 -7
  62. package/dist/server/server/agent/providers/opencode-agent.js +100 -40
  63. package/dist/server/server/agent/providers/pi/agent.d.ts +6 -6
  64. package/dist/server/server/agent/providers/pi/agent.js +114 -165
  65. package/dist/server/server/agent/providers/pi/extensions/child-session.d.ts +4 -0
  66. package/dist/server/server/agent/providers/pi/extensions/child-session.js +59 -0
  67. package/dist/server/server/agent/providers/pi/extensions/contract.d.ts +68 -0
  68. package/dist/server/server/agent/providers/pi/extensions/contract.js +2 -0
  69. package/dist/server/server/agent/providers/pi/extensions/gotgenes-pi-subagents/index.d.ts +3 -0
  70. package/dist/server/server/agent/providers/pi/extensions/gotgenes-pi-subagents/index.js +159 -0
  71. package/dist/server/server/agent/providers/pi/extensions/host.d.ts +28 -0
  72. package/dist/server/server/agent/providers/pi/extensions/host.js +94 -0
  73. package/dist/server/server/agent/providers/pi/extensions/index.d.ts +7 -0
  74. package/dist/server/server/agent/providers/pi/extensions/index.js +6 -0
  75. package/dist/server/server/agent/providers/pi/extensions/pi-ask-user/index.d.ts +3 -0
  76. package/dist/server/server/agent/providers/pi/extensions/pi-ask-user/index.js +138 -0
  77. package/dist/server/server/agent/providers/pi/extensions/pi-example-todo/index.d.ts +3 -0
  78. package/dist/server/server/agent/providers/pi/extensions/pi-example-todo/index.js +38 -0
  79. package/dist/server/server/agent/providers/pi/extensions/pi-goal-x/index.d.ts +3 -0
  80. package/dist/server/server/agent/providers/pi/extensions/pi-goal-x/index.js +63 -0
  81. package/dist/server/server/agent/providers/pi/extensions/pi-mcp-adapter/index.d.ts +3 -0
  82. package/dist/server/server/agent/providers/pi/extensions/pi-mcp-adapter/index.js +48 -0
  83. package/dist/server/server/agent/providers/pi/extensions/pi-subagents/index.d.ts +3 -0
  84. package/dist/server/server/agent/providers/pi/extensions/pi-subagents/index.js +131 -0
  85. package/dist/server/server/agent/providers/pi/extensions/registry.d.ts +2 -0
  86. package/dist/server/server/agent/providers/pi/extensions/registry.js +21 -0
  87. package/dist/server/server/agent/providers/pi/extensions/rpiv-ask-user-question/index.d.ts +3 -0
  88. package/dist/server/server/agent/providers/pi/extensions/rpiv-ask-user-question/index.js +180 -0
  89. package/dist/server/server/agent/providers/pi/extensions/rpiv-todo/index.d.ts +3 -0
  90. package/dist/server/server/agent/providers/pi/extensions/rpiv-todo/index.js +51 -0
  91. package/dist/server/server/agent/providers/pi/extensions/subagent-fixture-test.d.ts +22 -0
  92. package/dist/server/server/agent/providers/pi/extensions/subagent-fixture-test.js +66 -0
  93. package/dist/server/server/agent/providers/pi/extensions/task-fixture-test.d.ts +4 -0
  94. package/dist/server/server/agent/providers/pi/extensions/task-fixture-test.js +79 -0
  95. package/dist/server/server/agent/providers/pi/extensions/tintinweb-pi-subagents/index.d.ts +3 -0
  96. package/dist/server/server/agent/providers/pi/extensions/tintinweb-pi-subagents/index.js +149 -0
  97. package/dist/server/server/agent/providers/pi/history-mapper.d.ts +7 -2
  98. package/dist/server/server/agent/providers/pi/history-mapper.js +78 -35
  99. package/dist/server/server/agent/providers/pi/rpc-types.d.ts +3 -0
  100. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +170 -0
  101. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +355 -0
  102. package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts +1 -6
  103. package/dist/server/server/agent/providers/pi/tool-call-mapper.js +1 -97
  104. package/dist/server/server/agent/tools/paseo-tools.js +22 -15
  105. package/dist/server/server/auth.d.ts +1 -2
  106. package/dist/server/server/auth.js +8 -14
  107. package/dist/server/server/bootstrap.js +10 -2
  108. package/dist/server/server/daemon-instance.d.ts +1 -0
  109. package/dist/server/server/daemon-instance.js +1 -0
  110. package/dist/server/server/exports.d.ts +1 -1
  111. package/dist/server/server/exports.js +1 -1
  112. package/dist/server/server/local-credential.d.ts +6 -0
  113. package/dist/server/server/local-credential.js +82 -0
  114. package/dist/server/server/session-admission-auth.d.ts +16 -0
  115. package/dist/server/server/session-admission-auth.js +26 -0
  116. package/dist/server/server/websocket-server.d.ts +6 -1
  117. package/dist/server/server/websocket-server.js +132 -55
  118. package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-bridge-f41bce08c3c4ac2de0652d20234d19e9.js → desktop-attachment-bridge-9da07adb97f5e0eb726f7762afee43f5.js} +1 -1
  119. package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-bridge-f41bce08c3c4ac2de0652d20234d19e9.js.br → desktop-attachment-bridge-9da07adb97f5e0eb726f7762afee43f5.js.br} +0 -0
  120. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-9da07adb97f5e0eb726f7762afee43f5.js.gz +0 -0
  121. package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-9e271e161480b0d1dd35e58616a37341.js → desktop-attachment-store-d5d3402a752965d3037191484127123b.js} +1 -1
  122. package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-9e271e161480b0d1dd35e58616a37341.js.br → desktop-attachment-store-d5d3402a752965d3037191484127123b.js.br} +0 -0
  123. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-d5d3402a752965d3037191484127123b.js.gz +0 -0
  124. package/dist/server/web-ui/_expo/static/js/web/{index-8868523fc6d311c5da524c067d1cd426.js → index-69ce3c243032c3bedfc6f2ad379a4cdd.js} +1579 -1575
  125. package/dist/server/web-ui/_expo/static/js/web/index-69ce3c243032c3bedfc6f2ad379a4cdd.js.br +0 -0
  126. package/dist/server/web-ui/_expo/static/js/web/index-69ce3c243032c3bedfc6f2ad379a4cdd.js.gz +0 -0
  127. package/dist/server/web-ui/_expo/static/js/web/{indexeddb-attachment-store-369cdb67f5856fd2c72d640df0b7b79e.js → indexeddb-attachment-store-3afc19e43c8152bd3c6d71b3ea8776dc.js} +1 -1
  128. package/dist/server/web-ui/_expo/static/js/web/{indexeddb-attachment-store-369cdb67f5856fd2c72d640df0b7b79e.js.br → indexeddb-attachment-store-3afc19e43c8152bd3c6d71b3ea8776dc.js.br} +0 -0
  129. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-3afc19e43c8152bd3c6d71b3ea8776dc.js.gz +0 -0
  130. package/dist/server/web-ui/_expo/static/js/web/{native-file-attachment-store-bcd89f6ce714279a8f4fa0e024f3a610.js → native-file-attachment-store-187a9d5c32188f357dbbf037a0f89073.js} +3 -3
  131. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-187a9d5c32188f357dbbf037a0f89073.js.br +0 -0
  132. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-187a9d5c32188f357dbbf037a0f89073.js.gz +0 -0
  133. package/dist/server/web-ui/index.html +1 -1
  134. package/dist/server/web-ui/index.html.br +0 -0
  135. package/dist/server/web-ui/index.html.gz +0 -0
  136. package/dist/src/server/daemon-instance.js +1 -0
  137. package/dist/src/server/local-credential.js +82 -0
  138. package/package.json +8 -7
  139. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-f41bce08c3c4ac2de0652d20234d19e9.js.gz +0 -0
  140. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-9e271e161480b0d1dd35e58616a37341.js.gz +0 -0
  141. package/dist/server/web-ui/_expo/static/js/web/index-8868523fc6d311c5da524c067d1cd426.js.br +0 -0
  142. package/dist/server/web-ui/_expo/static/js/web/index-8868523fc6d311c5da524c067d1cd426.js.gz +0 -0
  143. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-369cdb67f5856fd2c72d640df0b7b79e.js.gz +0 -0
  144. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-bcd89f6ce714279a8f4fa0e024f3a610.js.br +0 -0
  145. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-bcd89f6ce714279a8f4fa0e024f3a610.js.gz +0 -0
@@ -0,0 +1,208 @@
1
+ import { OpenCodeV2Session } from "./session.js";
2
+ import { V2_CAPABILITIES } from "./capabilities.js";
3
+ import { features, permissionRules, applyResumeOverrides, requiresDedicatedV2Server, } from "./configuration.js";
4
+ import { commands } from "./commands.js";
5
+ import { waitForLocationReady, awaitPaseoPlugin } from "./readiness.js";
6
+ import { importSessionFromPersistence } from "../../../provider-session-import.js";
7
+ import { resolveOpenCodeHomeDir } from "../paths.js";
8
+ import { V2Runtime } from "./runtime.js";
9
+ import { modelRef, modesFromV2, modelsFromV2 } from "./mapping.js";
10
+ export class OpenCodeV2AgentClient {
11
+ constructor(options) {
12
+ this.options = options;
13
+ this.provider = "opencode";
14
+ this.connections = new Map();
15
+ this.capabilities = { ...V2_CAPABILITIES, supportsNativePaseoTools: Boolean(options.bridge) };
16
+ this.runtime =
17
+ options.runtime ??
18
+ new V2Runtime({
19
+ ...options,
20
+ decorateEnv: options.bridge ? (env) => options.bridge.decorateV2ServerEnv(env) : undefined,
21
+ });
22
+ }
23
+ async isAvailable() {
24
+ return true;
25
+ }
26
+ async shutdown() {
27
+ await this.runtime.shutdown();
28
+ }
29
+ async fetchCatalog(options, context) {
30
+ const connection = await this.runtime.acquire({
31
+ fresh: options.force,
32
+ signal: context?.signal,
33
+ });
34
+ const location = {
35
+ directory: options.scope === "workspace" ? options.cwd : resolveOpenCodeHomeDir(),
36
+ };
37
+ const request = { signal: context?.signal };
38
+ const activity = (name, operation) => context ? context.runActivity(name, operation) : operation();
39
+ try {
40
+ await activity("plugin.list", () => waitForLocationReady({ client: connection.client, location, signal: request.signal }));
41
+ const [models, agents, providers] = await Promise.all([
42
+ activity("model.list", () => connection.client.model.list({ location }, request)),
43
+ activity("agent.list", () => connection.client.agent.list({ location }, request)),
44
+ activity("provider.list", () => connection.client.provider.list({ location }, request)),
45
+ ]);
46
+ if (!providers.data.length)
47
+ throw new Error("OpenCode has no connected providers. Authenticate using opencode auth login.");
48
+ return { models: modelsFromV2(models.data), modes: modesFromV2(agents.data) };
49
+ }
50
+ finally {
51
+ await connection.release();
52
+ }
53
+ }
54
+ async createSession(config, launch, options) {
55
+ const connection = await this.runtime.acquire(requiresDedicatedV2Server(config, launch) ? { env: launch?.env, dedicated: true } : {});
56
+ try {
57
+ const info = await connection.client.session.create({
58
+ location: { directory: config.cwd },
59
+ title: config.title,
60
+ agent: config.modeId ?? "build",
61
+ model: config.model ? modelRef(config.model, config.thinkingOptionId) : undefined,
62
+ permissions: permissionRules(config),
63
+ });
64
+ return await this.attach(connection, info, config, launch, options?.persistSession !== false);
65
+ }
66
+ catch (error) {
67
+ await connection.release();
68
+ throw error;
69
+ }
70
+ }
71
+ async resumeSession(handle, overrides, launch) {
72
+ const cwd = overrides?.cwd ?? handle.metadata?.cwd;
73
+ if (typeof cwd !== "string")
74
+ throw new Error("OpenCode resume requires the original working directory");
75
+ const config = {
76
+ ...handle.metadata,
77
+ ...overrides,
78
+ provider: "opencode",
79
+ cwd,
80
+ };
81
+ const connection = this.connections.get(handle.nativeHandle ?? handle.sessionId)?.retain() ??
82
+ (await this.runtime.acquire(requiresDedicatedV2Server(config, launch) ? { env: launch?.env, dedicated: true } : {}));
83
+ try {
84
+ const info = await connection.client.session.get({
85
+ sessionID: handle.nativeHandle ?? handle.sessionId,
86
+ });
87
+ await applyResumeOverrides(connection.client, info, overrides);
88
+ return await this.attach(connection, info, config, launch, true);
89
+ }
90
+ catch (error) {
91
+ await connection.release();
92
+ throw error;
93
+ }
94
+ }
95
+ async attach(connection, info, config, launch, persist) {
96
+ const acquire = () => this.runtime.acquire(requiresDedicatedV2Server(config, launch) ? { env: launch?.env, dedicated: true } : {});
97
+ let ownedConnection = connection;
98
+ const unbind = this.options.bridge?.bindSession({
99
+ sessionId: info.id,
100
+ env: launch?.env ?? {},
101
+ tools: launch?.paseoTools,
102
+ });
103
+ const bound = new Map();
104
+ const bindChild = (childId) => {
105
+ this.connections.set(childId, ownedConnection);
106
+ if (bound.has(childId))
107
+ return;
108
+ const childUnbind = this.options.bridge?.bindSession({
109
+ sessionId: childId,
110
+ env: launch?.env ?? {},
111
+ tools: launch?.paseoTools,
112
+ });
113
+ if (childUnbind)
114
+ bound.set(childId, childUnbind);
115
+ };
116
+ this.connections.set(info.id, connection);
117
+ const releaseBindings = () => {
118
+ unbind?.();
119
+ for (const cleanup of bound.values())
120
+ cleanup();
121
+ for (const [id, owner] of this.connections)
122
+ if (owner === ownedConnection)
123
+ this.connections.delete(id);
124
+ };
125
+ const moved = (next) => {
126
+ for (const [id, owner] of this.connections)
127
+ if (owner === ownedConnection)
128
+ this.connections.set(id, next);
129
+ ownedConnection = next;
130
+ };
131
+ const session = new OpenCodeV2Session(connection, info, config, this.options.logger, persist, Boolean(this.options.bridge), releaseBindings, bindChild, acquire, moved);
132
+ try {
133
+ if (this.options.bridge) {
134
+ const location = { directory: config.cwd };
135
+ await awaitPaseoPlugin({ client: connection.client, location });
136
+ }
137
+ await session.initialize(launch);
138
+ return session;
139
+ }
140
+ catch (error) {
141
+ await session.close();
142
+ throw error;
143
+ }
144
+ }
145
+ async listFeatures(config) {
146
+ return features(config);
147
+ }
148
+ async listCommands(config) {
149
+ const connection = await this.runtime.acquire();
150
+ try {
151
+ return await commands(connection.client, config.cwd);
152
+ }
153
+ finally {
154
+ await connection.release();
155
+ }
156
+ }
157
+ async listImportableSessions(options = {}) {
158
+ const connection = await this.runtime.acquire();
159
+ try {
160
+ const sessions = [];
161
+ let cursor;
162
+ const scanLimit = Math.min(options.scanLimit ?? 100, 500);
163
+ do {
164
+ const page = await connection.client.session.list({
165
+ ...(cursor ? { cursor } : { directory: options.cwd, search: options.query }),
166
+ limit: Math.min(50, scanLimit - sessions.length),
167
+ });
168
+ sessions.push(...page.data);
169
+ cursor = page.cursor.next ?? undefined;
170
+ } while (cursor && sessions.length < scanLimit);
171
+ return sessions
172
+ .filter((info) => !info.parentID && !info.time.archived)
173
+ .slice(0, options.limit ?? 50)
174
+ .map((info) => ({
175
+ providerHandleId: info.id,
176
+ cwd: info.location.directory,
177
+ title: info.title ?? null,
178
+ firstPromptPreview: null,
179
+ lastPromptPreview: null,
180
+ lastActivityAt: new Date(info.time.updated),
181
+ }));
182
+ }
183
+ finally {
184
+ await connection.release();
185
+ }
186
+ }
187
+ async importSession(input, context) {
188
+ const connection = await this.runtime.acquire();
189
+ try {
190
+ const info = await connection.client.session.get({ sessionID: input.providerHandleId });
191
+ return await importSessionFromPersistence({
192
+ provider: "opencode",
193
+ request: input,
194
+ context,
195
+ resumeSession: this.resumeSession.bind(this),
196
+ config: {
197
+ title: info.title,
198
+ modeId: info.agent,
199
+ model: info.model ? `${info.model.providerID}/${info.model.id}` : undefined,
200
+ },
201
+ });
202
+ }
203
+ finally {
204
+ await connection.release();
205
+ }
206
+ }
207
+ }
208
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1,18 @@
1
+ import type { OpenCodeClient } from "@opencode/client";
2
+ export interface V2Api {
3
+ server: OpenCodeClient["server"];
4
+ session: Pick<OpenCodeClient["session"], "create" | "get" | "list" | "active" | "remove" | "switchAgent" | "switchModel" | "environment" | "instructions" | "prompt" | "command" | "compact" | "wait" | "interrupt" | "revert" | "log"> & {
5
+ form: Pick<OpenCodeClient["session"]["form"], "list" | "reply" | "cancel">;
6
+ };
7
+ plugin: Pick<OpenCodeClient["plugin"], "list">;
8
+ model: OpenCodeClient["model"];
9
+ provider: Pick<OpenCodeClient["provider"], "list">;
10
+ agent: Pick<OpenCodeClient["agent"], "list">;
11
+ command: OpenCodeClient["command"];
12
+ skill: OpenCodeClient["skill"];
13
+ message: OpenCodeClient["message"];
14
+ mcp: Pick<OpenCodeClient["mcp"], "add" | "list">;
15
+ permission: Pick<OpenCodeClient["permission"], "list" | "reply">;
16
+ event: OpenCodeClient["event"];
17
+ }
18
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=api.js.map