@xenosystem/agent-interface-ui 0.1.15 → 0.1.17
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.
- package/dist/components/agent/AgentInterface.d.ts +3 -1
- package/dist/components/agent/AgentInterface.d.ts.map +1 -1
- package/dist/components/agent/AgentInterface.js +119 -74
- package/dist/components/agent/AgentInterface.js.map +1 -1
- package/dist/components/product/XenoAgentProductHeader.d.ts.map +1 -1
- package/dist/components/product/XenoAgentProductHeader.js +1 -1
- package/dist/components/product/XenoAgentProductHeader.js.map +1 -1
- package/package.json +11 -9
- package/LICENSE +0 -67
|
@@ -12,11 +12,13 @@ export type Workspace = WorkspaceStoreWorkspace;
|
|
|
12
12
|
export interface AgentInterfaceProps {
|
|
13
13
|
surface?: 'embedded' | 'standalone-desktop';
|
|
14
14
|
initialSdkSessionId?: string;
|
|
15
|
+
initialLaunchMode?: 'chat' | 'agent';
|
|
16
|
+
initialWorkspaceRoot?: string;
|
|
15
17
|
windowControls?: {
|
|
16
18
|
onMinimize?: XenoAgentWindowAction;
|
|
17
19
|
onMaximize?: XenoAgentWindowAction;
|
|
18
20
|
onClose?: XenoAgentWindowAction;
|
|
19
21
|
};
|
|
20
22
|
}
|
|
21
|
-
export default function AgentInterface({ surface, initialSdkSessionId, windowControls, }?: AgentInterfaceProps): React.JSX.Element;
|
|
23
|
+
export default function AgentInterface({ surface, initialSdkSessionId, initialLaunchMode, initialWorkspaceRoot, windowControls, }?: AgentInterfaceProps): React.JSX.Element;
|
|
22
24
|
//# sourceMappingURL=AgentInterface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentInterface.d.ts","sourceRoot":"","sources":["../../../src/components/agent/AgentInterface.tsx"],"names":[],"mappings":"AAYA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAqFhF,OAAO,EAEL,KAAK,KAAK,IAAI,mBAAmB,EACjC,KAAK,iBAAiB,IAAI,+BAA+B,EACzD,KAAK,iBAAiB,IAAI,+BAA+B,EACzD,KAAK,0BAA0B,IAAI,wCAAwC,EAC3E,KAAK,mBAAmB,IAAI,0BAA0B,EACtD,KAAK,IAAI,IAAI,kBAAkB,EAC/B,KAAK,SAAS,IAAI,uBAAuB,EACzC,KAAK,YAAY,IAAI,iBAAiB,EACvC,MAAM,gCAAgC,CAAA;AAmBvC,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,sCAAsC,CAAA;AAgnF7C,MAAM,MAAM,YAAY,GAAG,0BAA0B,CAAA;AACrD,MAAM,MAAM,iBAAiB,GAAG,+BAA+B,CAAA;AAC/D,MAAM,MAAM,iBAAiB,GAAG,+BAA+B,CAAA;AAC/D,MAAM,MAAM,0BAA0B,GAAG,wCAAwC,CAAA;AACjF,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAA;AAC5C,MAAM,MAAM,KAAK,GAAG,mBAAmB,CAAA;AACvC,MAAM,MAAM,IAAI,GAAG,kBAAkB,CAAA;AACrC,MAAM,MAAM,SAAS,GAAG,uBAAuB,CAAA;AAwxE/C,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,UAAU,GAAG,oBAAoB,CAAA;IAC3C,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,cAAc,CAAC,EAAE;QACf,UAAU,CAAC,EAAE,qBAAqB,CAAA;QAClC,UAAU,CAAC,EAAE,qBAAqB,CAAA;QAClC,OAAO,CAAC,EAAE,qBAAqB,CAAA;KAChC,CAAA;CACF;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,OAAoB,EACpB,mBAAmB,EACnB,cAAc,GACf,GAAE,mBAAwB,
|
|
1
|
+
{"version":3,"file":"AgentInterface.d.ts","sourceRoot":"","sources":["../../../src/components/agent/AgentInterface.tsx"],"names":[],"mappings":"AAYA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAqFhF,OAAO,EAEL,KAAK,KAAK,IAAI,mBAAmB,EACjC,KAAK,iBAAiB,IAAI,+BAA+B,EACzD,KAAK,iBAAiB,IAAI,+BAA+B,EACzD,KAAK,0BAA0B,IAAI,wCAAwC,EAC3E,KAAK,mBAAmB,IAAI,0BAA0B,EACtD,KAAK,IAAI,IAAI,kBAAkB,EAC/B,KAAK,SAAS,IAAI,uBAAuB,EACzC,KAAK,YAAY,IAAI,iBAAiB,EACvC,MAAM,gCAAgC,CAAA;AAmBvC,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,sCAAsC,CAAA;AAgnF7C,MAAM,MAAM,YAAY,GAAG,0BAA0B,CAAA;AACrD,MAAM,MAAM,iBAAiB,GAAG,+BAA+B,CAAA;AAC/D,MAAM,MAAM,iBAAiB,GAAG,+BAA+B,CAAA;AAC/D,MAAM,MAAM,0BAA0B,GAAG,wCAAwC,CAAA;AACjF,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAA;AAC5C,MAAM,MAAM,KAAK,GAAG,mBAAmB,CAAA;AACvC,MAAM,MAAM,IAAI,GAAG,kBAAkB,CAAA;AACrC,MAAM,MAAM,SAAS,GAAG,uBAAuB,CAAA;AAwxE/C,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,UAAU,GAAG,oBAAoB,CAAA;IAC3C,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACpC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,cAAc,CAAC,EAAE;QACf,UAAU,CAAC,EAAE,qBAAqB,CAAA;QAClC,UAAU,CAAC,EAAE,qBAAqB,CAAA;QAClC,OAAO,CAAC,EAAE,qBAAqB,CAAA;KAChC,CAAA;CACF;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,OAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,GACf,GAAE,mBAAwB,qBAuuL1B"}
|
|
@@ -3137,7 +3137,7 @@ function waitForSubagentConversationResult(conversationId, timeoutMs) {
|
|
|
3137
3137
|
});
|
|
3138
3138
|
});
|
|
3139
3139
|
}
|
|
3140
|
-
export default function AgentInterface({ surface = 'embedded', initialSdkSessionId, windowControls, } = {}) {
|
|
3140
|
+
export default function AgentInterface({ surface = 'embedded', initialSdkSessionId, initialLaunchMode, initialWorkspaceRoot, windowControls, } = {}) {
|
|
3141
3141
|
const [settingsPanel, setSettingsPanel] = useState(null);
|
|
3142
3142
|
const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
|
|
3143
3143
|
const [folderPanelOpen, setFolderPanelOpen] = useState(false);
|
|
@@ -3242,6 +3242,7 @@ export default function AgentInterface({ surface = 'embedded', initialSdkSession
|
|
|
3242
3242
|
const sessionTabsRestoreAttemptedRef = useRef(false);
|
|
3243
3243
|
const editorStatusTimerRef = useRef(null);
|
|
3244
3244
|
const initialSdkSessionHandledRef = useRef(false);
|
|
3245
|
+
const initialLaunchModeHandledRef = useRef(false);
|
|
3245
3246
|
const terminalDraftSyncTimerRef = useRef(null);
|
|
3246
3247
|
const lastPersistedEditorStateRef = useRef('');
|
|
3247
3248
|
const codeAutoIndexKeyRef = useRef('');
|
|
@@ -3261,78 +3262,6 @@ export default function AgentInterface({ surface = 'embedded', initialSdkSession
|
|
|
3261
3262
|
const setCenterPaneMode = useAgentIdeStore(s => s.setMode);
|
|
3262
3263
|
const setAgentIdeHasOpenFiles = useAgentIdeStore(s => s.setHasOpenFiles);
|
|
3263
3264
|
const authDisplayName = useAuthStore(s => s.user?.display_name);
|
|
3264
|
-
useEffect(() => {
|
|
3265
|
-
const sessionId = initialSdkSessionId?.trim();
|
|
3266
|
-
if (!sessionId || initialSdkSessionHandledRef.current)
|
|
3267
|
-
return;
|
|
3268
|
-
initialSdkSessionHandledRef.current = true;
|
|
3269
|
-
let cancelled = false;
|
|
3270
|
-
const openSdkSession = async () => {
|
|
3271
|
-
const state = useAgentChatStore.getState();
|
|
3272
|
-
const existing = Object.values(state.conversations).find((conversation) => (conversation.sessionUi?.sdkSessionId === sessionId));
|
|
3273
|
-
const conversationId = existing?.id || createConversation(MAIN_ASSISTANT_ID);
|
|
3274
|
-
setViewMode('inbox');
|
|
3275
|
-
setSelectedInboxConversationId(conversationId);
|
|
3276
|
-
updateConversation(conversationId, {
|
|
3277
|
-
model: MAIN_ASSISTANT_MODEL,
|
|
3278
|
-
runtime: createConversationRuntimeBinding({
|
|
3279
|
-
selection: runtimeSelectionForSdk('user'),
|
|
3280
|
-
model: MAIN_ASSISTANT_MODEL,
|
|
3281
|
-
reasoningModel: MAIN_ASSISTANT_MODEL,
|
|
3282
|
-
inferenceMode: 'cloud',
|
|
3283
|
-
}),
|
|
3284
|
-
});
|
|
3285
|
-
const attach = getAgentPlatformBridge()?.agent?.attachSdkSession;
|
|
3286
|
-
if (!attach) {
|
|
3287
|
-
appendMessage(conversationId, {
|
|
3288
|
-
role: 'assistant',
|
|
3289
|
-
content: `Unable to resume SDK session ${sessionId}: the Agent host session bridge is unavailable.`,
|
|
3290
|
-
error: 'Agent host session bridge unavailable',
|
|
3291
|
-
hideToolbar: true,
|
|
3292
|
-
});
|
|
3293
|
-
return;
|
|
3294
|
-
}
|
|
3295
|
-
try {
|
|
3296
|
-
const result = await attach({ conversationId, sessionId });
|
|
3297
|
-
if (cancelled)
|
|
3298
|
-
return;
|
|
3299
|
-
if (!result.success) {
|
|
3300
|
-
const message = result.error || 'unknown host error';
|
|
3301
|
-
console.error(`[agent-interface] Unable to attach SDK session ${sessionId}: ${message}`);
|
|
3302
|
-
appendMessage(conversationId, {
|
|
3303
|
-
role: 'assistant',
|
|
3304
|
-
content: `Unable to resume SDK session ${sessionId}: ${message}`,
|
|
3305
|
-
error: message,
|
|
3306
|
-
hideToolbar: true,
|
|
3307
|
-
});
|
|
3308
|
-
return;
|
|
3309
|
-
}
|
|
3310
|
-
const current = useAgentChatStore.getState().getConversation(conversationId);
|
|
3311
|
-
updateConversation(conversationId, {
|
|
3312
|
-
sessionUi: {
|
|
3313
|
-
...(current?.sessionUi || {}),
|
|
3314
|
-
sdkSessionId: sessionId,
|
|
3315
|
-
sdkSessionDir: result.sessionDir,
|
|
3316
|
-
sdkSessionHistoryPath: result.sessionHistoryPath,
|
|
3317
|
-
},
|
|
3318
|
-
});
|
|
3319
|
-
}
|
|
3320
|
-
catch (error) {
|
|
3321
|
-
if (cancelled)
|
|
3322
|
-
return;
|
|
3323
|
-
const message = error instanceof Error ? error.message : 'unknown host error';
|
|
3324
|
-
console.error(`[agent-interface] Unable to attach SDK session ${sessionId}: ${message}`);
|
|
3325
|
-
appendMessage(conversationId, {
|
|
3326
|
-
role: 'assistant',
|
|
3327
|
-
content: `Unable to resume SDK session ${sessionId}: ${message}`,
|
|
3328
|
-
error: message,
|
|
3329
|
-
hideToolbar: true,
|
|
3330
|
-
});
|
|
3331
|
-
}
|
|
3332
|
-
};
|
|
3333
|
-
void openSdkSession();
|
|
3334
|
-
return () => { cancelled = true; };
|
|
3335
|
-
}, [appendMessage, createConversation, initialSdkSessionId, updateConversation]);
|
|
3336
3265
|
// Dynamic context for system prompt enrichment (fetched from main process)
|
|
3337
3266
|
const [runtimeContext, setRuntimeContext] = useState(null);
|
|
3338
3267
|
// Fetch runtime context on mount and every 60 seconds
|
|
@@ -4367,6 +4296,118 @@ export default function AgentInterface({ surface = 'embedded', initialSdkSession
|
|
|
4367
4296
|
setSelectedConversationId(conversationId);
|
|
4368
4297
|
setSelectedInboxConversationId(null);
|
|
4369
4298
|
}, [setCenterPaneMode, updateConversation]);
|
|
4299
|
+
// Explicit desktop/CLI launch profiles must win over persisted session-tab
|
|
4300
|
+
// restoration. Wait until persisted conversations are loaded, then create and
|
|
4301
|
+
// activate the requested profile so an existing Chat tab cannot make an Agent
|
|
4302
|
+
// launch cosmetic (or vice versa).
|
|
4303
|
+
useEffect(() => {
|
|
4304
|
+
if (!sessionTabsHydrated
|
|
4305
|
+
|| !initialLaunchMode
|
|
4306
|
+
|| initialSdkSessionId
|
|
4307
|
+
|| initialLaunchModeHandledRef.current)
|
|
4308
|
+
return;
|
|
4309
|
+
initialLaunchModeHandledRef.current = true;
|
|
4310
|
+
const conversationId = createConversation(MAIN_ASSISTANT_ID);
|
|
4311
|
+
const workspaceMode = initialLaunchMode === 'agent' && initialWorkspaceRoot ? 'workspace' : 'chat-only';
|
|
4312
|
+
updateConversation(conversationId, {
|
|
4313
|
+
schemaVersion: 3,
|
|
4314
|
+
workspaceMode,
|
|
4315
|
+
rootDirectory: workspaceMode === 'workspace' ? initialWorkspaceRoot : undefined,
|
|
4316
|
+
grantedDirectories: workspaceMode === 'workspace' && initialWorkspaceRoot ? [initialWorkspaceRoot] : [],
|
|
4317
|
+
});
|
|
4318
|
+
activateSessionConversation(conversationId);
|
|
4319
|
+
}, [
|
|
4320
|
+
activateSessionConversation,
|
|
4321
|
+
createConversation,
|
|
4322
|
+
initialLaunchMode,
|
|
4323
|
+
initialSdkSessionId,
|
|
4324
|
+
initialWorkspaceRoot,
|
|
4325
|
+
sessionTabsHydrated,
|
|
4326
|
+
updateConversation,
|
|
4327
|
+
]);
|
|
4328
|
+
useEffect(() => {
|
|
4329
|
+
const sessionId = initialSdkSessionId?.trim();
|
|
4330
|
+
if (!sessionTabsHydrated || !sessionId || initialSdkSessionHandledRef.current)
|
|
4331
|
+
return;
|
|
4332
|
+
initialSdkSessionHandledRef.current = true;
|
|
4333
|
+
let cancelled = false;
|
|
4334
|
+
const openSdkSession = async () => {
|
|
4335
|
+
const state = useAgentChatStore.getState();
|
|
4336
|
+
const existing = Object.values(state.conversations).find((conversation) => (conversation.sessionUi?.sdkSessionId === sessionId));
|
|
4337
|
+
const conversationId = existing?.id || createConversation(MAIN_ASSISTANT_ID);
|
|
4338
|
+
updateConversation(conversationId, {
|
|
4339
|
+
workspaceMode: initialLaunchMode === 'agent' && initialWorkspaceRoot ? 'workspace' : 'chat-only',
|
|
4340
|
+
rootDirectory: initialLaunchMode === 'agent' ? initialWorkspaceRoot : undefined,
|
|
4341
|
+
grantedDirectories: initialLaunchMode === 'agent' && initialWorkspaceRoot ? [initialWorkspaceRoot] : [],
|
|
4342
|
+
model: MAIN_ASSISTANT_MODEL,
|
|
4343
|
+
runtime: createConversationRuntimeBinding({
|
|
4344
|
+
selection: runtimeSelectionForSdk('user'),
|
|
4345
|
+
model: MAIN_ASSISTANT_MODEL,
|
|
4346
|
+
reasoningModel: MAIN_ASSISTANT_MODEL,
|
|
4347
|
+
inferenceMode: 'cloud',
|
|
4348
|
+
}),
|
|
4349
|
+
});
|
|
4350
|
+
activateSessionConversation(conversationId);
|
|
4351
|
+
const attach = getAgentPlatformBridge()?.agent?.attachSdkSession;
|
|
4352
|
+
if (!attach) {
|
|
4353
|
+
appendMessage(conversationId, {
|
|
4354
|
+
role: 'assistant',
|
|
4355
|
+
content: `Unable to resume SDK session ${sessionId}: the Agent host session bridge is unavailable.`,
|
|
4356
|
+
error: 'Agent host session bridge unavailable',
|
|
4357
|
+
hideToolbar: true,
|
|
4358
|
+
});
|
|
4359
|
+
return;
|
|
4360
|
+
}
|
|
4361
|
+
try {
|
|
4362
|
+
const result = await attach({ conversationId, sessionId });
|
|
4363
|
+
if (cancelled)
|
|
4364
|
+
return;
|
|
4365
|
+
if (!result.success) {
|
|
4366
|
+
const message = result.error || 'unknown host error';
|
|
4367
|
+
console.error(`[agent-interface] Unable to attach SDK session ${sessionId}: ${message}`);
|
|
4368
|
+
appendMessage(conversationId, {
|
|
4369
|
+
role: 'assistant',
|
|
4370
|
+
content: `Unable to resume SDK session ${sessionId}: ${message}`,
|
|
4371
|
+
error: message,
|
|
4372
|
+
hideToolbar: true,
|
|
4373
|
+
});
|
|
4374
|
+
return;
|
|
4375
|
+
}
|
|
4376
|
+
const current = useAgentChatStore.getState().getConversation(conversationId);
|
|
4377
|
+
updateConversation(conversationId, {
|
|
4378
|
+
sessionUi: {
|
|
4379
|
+
...(current?.sessionUi || {}),
|
|
4380
|
+
sdkSessionId: sessionId,
|
|
4381
|
+
sdkSessionDir: result.sessionDir,
|
|
4382
|
+
sdkSessionHistoryPath: result.sessionHistoryPath,
|
|
4383
|
+
},
|
|
4384
|
+
});
|
|
4385
|
+
}
|
|
4386
|
+
catch (error) {
|
|
4387
|
+
if (cancelled)
|
|
4388
|
+
return;
|
|
4389
|
+
const message = error instanceof Error ? error.message : 'unknown host error';
|
|
4390
|
+
console.error(`[agent-interface] Unable to attach SDK session ${sessionId}: ${message}`);
|
|
4391
|
+
appendMessage(conversationId, {
|
|
4392
|
+
role: 'assistant',
|
|
4393
|
+
content: `Unable to resume SDK session ${sessionId}: ${message}`,
|
|
4394
|
+
error: message,
|
|
4395
|
+
hideToolbar: true,
|
|
4396
|
+
});
|
|
4397
|
+
}
|
|
4398
|
+
};
|
|
4399
|
+
void openSdkSession();
|
|
4400
|
+
return () => { cancelled = true; };
|
|
4401
|
+
}, [
|
|
4402
|
+
activateSessionConversation,
|
|
4403
|
+
appendMessage,
|
|
4404
|
+
createConversation,
|
|
4405
|
+
initialLaunchMode,
|
|
4406
|
+
initialSdkSessionId,
|
|
4407
|
+
initialWorkspaceRoot,
|
|
4408
|
+
sessionTabsHydrated,
|
|
4409
|
+
updateConversation,
|
|
4410
|
+
]);
|
|
4370
4411
|
const createSessionConversation = useCallback(() => {
|
|
4371
4412
|
const conversationId = createConversation(MAIN_ASSISTANT_ID);
|
|
4372
4413
|
activateSessionConversation(conversationId);
|
|
@@ -4499,6 +4540,8 @@ export default function AgentInterface({ surface = 'embedded', initialSdkSession
|
|
|
4499
4540
|
if (!sessionTabsHydrated || sessionTabsRestoreAttemptedRef.current)
|
|
4500
4541
|
return;
|
|
4501
4542
|
sessionTabsRestoreAttemptedRef.current = true;
|
|
4543
|
+
if (initialLaunchMode || initialSdkSessionId?.trim())
|
|
4544
|
+
return;
|
|
4502
4545
|
if (activeSessionTabId || orderedSessionConversations.length === 0)
|
|
4503
4546
|
return;
|
|
4504
4547
|
const mostRecent = [...orderedSessionConversations].sort((left, right) => ((right.sessionTab?.lastActiveAt || 0) - (left.sessionTab?.lastActiveAt || 0)))[0];
|
|
@@ -4507,6 +4550,8 @@ export default function AgentInterface({ surface = 'embedded', initialSdkSession
|
|
|
4507
4550
|
}, [
|
|
4508
4551
|
activateSessionConversation,
|
|
4509
4552
|
activeSessionTabId,
|
|
4553
|
+
initialLaunchMode,
|
|
4554
|
+
initialSdkSessionId,
|
|
4510
4555
|
orderedSessionConversations,
|
|
4511
4556
|
sessionTabsHydrated,
|
|
4512
4557
|
]);
|
|
@@ -8037,6 +8082,6 @@ export default function AgentInterface({ surface = 'embedded', initialSdkSession
|
|
|
8037
8082
|
if (surface !== 'standalone-desktop') {
|
|
8038
8083
|
return (_jsxs("div", { className: "flex h-full w-full flex-col overflow-hidden", "data-xeno-agent-embedded-shell": "true", children: [_jsx("header", { className: "xeno-chrome-shell xeno-border-subtle h-10 flex-shrink-0 border-b", "data-xeno-agent-session-header": "embedded", "data-xeno-hub-header-style": "true", children: sessionTabsNode }), _jsx("div", { className: "min-h-0 min-w-0 flex-1", children: agentWorkspace })] }));
|
|
8039
8084
|
}
|
|
8040
|
-
return (_jsxs("div", { className: "flex h-full w-full flex-col overflow-hidden", "data-xeno-agent-standalone-shell": "true", children: [_jsx(XenoAgentProductHeader, { centerContent: sessionTabsNode, onMinimize: windowControls?.onMinimize, onMaximize: windowControls?.onMaximize, onClose: windowControls?.onClose }), _jsx("div", { className: "min-h-0 min-w-0 flex-1", children: agentWorkspace })] }));
|
|
8085
|
+
return (_jsxs("div", { className: "flex h-full w-full flex-col overflow-hidden", "data-xeno-agent-standalone-shell": "true", "data-xeno-agent-launch-mode": initialLaunchMode || 'default', children: [_jsx(XenoAgentProductHeader, { title: initialLaunchMode === 'chat' ? 'XENO Chat' : 'XENO Agent', centerContent: sessionTabsNode, onMinimize: windowControls?.onMinimize, onMaximize: windowControls?.onMaximize, onClose: windowControls?.onClose }), _jsx("div", { className: "min-h-0 min-w-0 flex-1", children: agentWorkspace })] }));
|
|
8041
8086
|
}
|
|
8042
8087
|
//# sourceMappingURL=AgentInterface.js.map
|