fuli-context 0.7.9 → 0.7.10-beta.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 (150) hide show
  1. package/README.md +5 -2
  2. package/README.zh-CN.md +5 -3
  3. package/dist/web/assets/{AboutPage-Bp-Xz6yo.js → AboutPage-EtWPOSpz.js} +1 -1
  4. package/dist/web/assets/AboutPage-vYIBifKw.css +1 -0
  5. package/dist/web/assets/AgentHand-D5pOgVjJ.js +1 -0
  6. package/dist/web/assets/AgentHand-DvdNtJ3_.css +1 -0
  7. package/dist/web/assets/ConnectionsPage-DXkvMuyK.js +1 -0
  8. package/dist/web/assets/EmployeeRecruitDialog-B59X3rOi.css +1 -0
  9. package/dist/web/assets/EmployeeRecruitDialog-DONxXnd2.js +1 -0
  10. package/dist/web/assets/EmployeeWorkbenchPage-Cd4hd4bf.js +3 -0
  11. package/dist/web/assets/EmployeeWorkbenchPage-Cz7y-IFD.css +1 -0
  12. package/dist/web/assets/GrowthLoading-B_Hh0CRS.css +1 -0
  13. package/dist/web/assets/GrowthLoading-CCYPgE2f.js +1 -0
  14. package/dist/web/assets/KnowledgeEditDialog-BUqMfa0a.js +1 -0
  15. package/dist/web/assets/KnowledgeEditDialog-D9NuRHvp.css +1 -0
  16. package/dist/web/assets/KnowledgeInspector-DlVPDGP3.js +1 -0
  17. package/dist/web/assets/KnowledgeOrganizerPage-DhthZGKZ.js +1 -0
  18. package/dist/web/assets/KnowledgeOrganizerPage-h2iKvQpO.css +1 -0
  19. package/dist/web/assets/KnowledgePage-B6RDVxq-.js +1 -0
  20. package/dist/web/assets/KnowledgeWorkspace-mVFHQcxr.js +4 -0
  21. package/dist/web/assets/KnowledgeWorkspace-sb8OJ97I.css +1 -0
  22. package/dist/web/assets/NotFoundPage-CCeEdBy9.js +1 -0
  23. package/dist/web/assets/{OverviewPage-HwoSW-5z.js → OverviewPage-CnYWoZ3r.js} +1 -1
  24. package/dist/web/assets/PersonalProfilePage-Bz4zpTPC.js +1 -0
  25. package/dist/web/assets/PersonalProfilePage-yQRCBude.css +1 -0
  26. package/dist/web/assets/PersonalProjectsPage-2u1o6dvA.js +1 -0
  27. package/dist/web/assets/ProjectAgentsPage-8tci631q.js +11 -0
  28. package/dist/web/assets/ProjectAgentsPage-BN4k3ubu.css +1 -0
  29. package/dist/web/assets/ProjectScopePicker-BcPtIcv8.js +1 -0
  30. package/dist/web/assets/ProjectScopePicker-BvaGTMFx.css +1 -0
  31. package/dist/web/assets/PublicProjectsPage-BmBHfnud.js +1 -0
  32. package/dist/web/assets/ReviewPage-tvt2eqhw.js +1 -0
  33. package/dist/web/assets/{SearchableSelect-CFZNdtlY.js → SearchableSelect-BjBDBVuZ.js} +1 -1
  34. package/dist/web/assets/SettingsPage-Brl-SL33.css +1 -0
  35. package/dist/web/assets/SettingsPage-D9mNzBg-.js +1 -0
  36. package/dist/web/assets/SharedJefaReportPage-DXbj_JhO.css +1 -0
  37. package/dist/web/assets/SharedJefaReportPage-Dn_HBgaa.js +1 -0
  38. package/dist/web/assets/WritingTastePage-BCwimXC-.js +1 -0
  39. package/dist/web/assets/WritingTastePage-tb_pgude.css +1 -0
  40. package/dist/web/assets/bole-avatar-CVIr-bU_.webp +0 -0
  41. package/dist/web/assets/client-v8XKgQji.js +1 -0
  42. package/dist/web/assets/console-C9HS-zbd.js +1 -0
  43. package/dist/web/assets/conversation-launcher-settings-DMDCpf_N.js +1 -0
  44. package/dist/web/assets/employee-dialog-Bh5ccIbK.css +1 -0
  45. package/dist/web/assets/{i18n-DQH9D35M.js → i18n-BkJjUsz_.js} +3 -3
  46. package/dist/web/assets/{identity-JjZG6aS5.js → identity-74yGiMzO.js} +1 -1
  47. package/dist/web/assets/index-CwjxeHGk.css +1 -0
  48. package/dist/web/assets/index-Dioqmmvf.js +2 -0
  49. package/dist/web/assets/{model-zL97NJ-U.js → model-86tZgY0r.js} +1 -1
  50. package/dist/web/assets/shared-report-CLg82y4D.js +1 -0
  51. package/dist/web/assets/shared-report-ezeb8dW4.css +1 -0
  52. package/dist/web/assets/{useApi-CROJJdhE-CElDxEZI.js → useApi-CROJJdhE-BBUO_YEu.js} +1 -1
  53. package/dist/web/assets/useModalDialog-DrLhqtjR.js +1 -0
  54. package/dist/web/assets/{vue-router-F7MnkVlW.js → vue-router-Cw4QZxM1.js} +1 -1
  55. package/dist/web/index.html +14 -8
  56. package/docs/agent-interface-architecture.md +97 -0
  57. package/docs/employee-agents.md +58 -2
  58. package/graph-provider/fuli_graph/collaboration_context.py +2 -1
  59. package/graph-provider/fuli_graph/graph_models.py +5 -3
  60. package/graph-provider/fuli_graph/graph_query.py +4 -0
  61. package/graph-provider/fuli_graph/knowledge_search.py +2 -1
  62. package/graph-provider/fuli_graph/project_agent_access.py +2 -0
  63. package/graph-provider/fuli_graph/project_agent_attention_models.py +64 -0
  64. package/graph-provider/fuli_graph/project_agent_attention_routes.py +38 -0
  65. package/graph-provider/fuli_graph/project_agent_models.py +2 -0
  66. package/graph-provider/fuli_graph/project_agent_names.py +33 -0
  67. package/graph-provider/fuli_graph/project_agent_routes.py +12 -0
  68. package/graph-provider/fuli_graph/runtime.py +49 -20
  69. package/graph-provider/fuli_graph/store.py +2 -0
  70. package/graph-provider/fuli_graph/store_knowledge.py +4 -2
  71. package/graph-provider/fuli_graph/store_project_agent_attention.py +138 -0
  72. package/graph-provider/fuli_graph/store_project_agent_executor_learning.py +8 -0
  73. package/graph-provider/fuli_graph/store_project_agent_memory.py +40 -13
  74. package/graph-provider/fuli_graph/store_project_agent_task_recruitment.py +4 -1
  75. package/graph-provider/fuli_graph/store_project_agent_task_staffing.py +4 -1
  76. package/graph-provider/fuli_graph/store_project_agent_tasks.py +3 -0
  77. package/graph-provider/fuli_graph/store_project_agents.py +109 -0
  78. package/graph-provider/fuli_graph/store_task_contexts.py +1 -1
  79. package/graph-provider/fuli_graph/system_hr_identity.py +218 -0
  80. package/graph-provider/pyproject.toml +1 -1
  81. package/npm-shrinkwrap.json +52 -60
  82. package/package.json +2 -2
  83. package/skills/operating-fuli/SKILL.md +47 -0
  84. package/skills/operating-fuli/agents/openai.yaml +4 -0
  85. package/skills/operating-fuli/references/workflow-recipes.md +33 -0
  86. package/src/agent-tools/agent-attention-definitions.js +33 -0
  87. package/src/agent-tools/graph-definitions.js +8 -2
  88. package/src/agent-tools/graph-handlers.js +41 -0
  89. package/src/agent-tools/interface-catalog.js +101 -0
  90. package/src/agent-tools/interface-definitions.js +184 -0
  91. package/src/agent-tools/project-agent-definitions.js +1 -0
  92. package/src/cli/local-runtime-command.js +2 -1
  93. package/src/employees/catalog/bole.json +19 -0
  94. package/src/employees/install-package.js +3 -0
  95. package/src/employees/manifest.js +4 -0
  96. package/src/employees/package-registry.js +2 -0
  97. package/src/employees/recruitment.js +3 -0
  98. package/src/employees/service.js +10 -0
  99. package/src/external-knowledge/registry.js +24 -0
  100. package/src/external-knowledge/service.js +34 -1
  101. package/src/graphiti/agent-attention.js +26 -0
  102. package/src/graphiti/agent-knowledge-workflows.js +1 -0
  103. package/src/graphiti/project-agent-control-plane.js +21 -0
  104. package/src/graphiti/project-agent-mapping.js +6 -0
  105. package/src/graphiti/provider-client.js +13 -0
  106. package/src/graphiti/workspace-provider-client.js +9 -1
  107. package/src/http/agent-attention-api-router.js +28 -0
  108. package/src/http/error-mapping.js +3 -0
  109. package/src/http/graph-api-router.js +2 -0
  110. package/src/local-runtime/lifecycle.js +8 -2
  111. package/src/mcp/create-mcp-server.js +10 -1
  112. package/src/mcp/tool-annotations.js +31 -0
  113. package/src/mcp/tool-result.js +4 -4
  114. package/src/setup/agent-installation-status.js +2 -1
  115. package/src/setup/agents.js +4 -0
  116. package/src/setup/graph-runtime.js +4 -0
  117. package/src/setup/paths.js +2 -1
  118. package/src/setup/setup.js +4 -2
  119. package/src/setup/uninstall.js +4 -2
  120. package/src/system/resource-monitor.js +11 -1
  121. package/src/system/runtime-settings.js +7 -0
  122. package/dist/web/assets/AboutPage-DXh7Fwxt.css +0 -1
  123. package/dist/web/assets/ConnectionsPage-BMpkYeSE.js +0 -1
  124. package/dist/web/assets/EmployeeRecruitDialog-CnA7rOnB.css +0 -1
  125. package/dist/web/assets/EmployeeRecruitDialog-DbMVuLAI.js +0 -1
  126. package/dist/web/assets/EmployeeWorkbenchPage-BpkqpEs7.css +0 -1
  127. package/dist/web/assets/EmployeeWorkbenchPage-DtXSJOpq.js +0 -1
  128. package/dist/web/assets/KnowledgeEditDialog-DADXj_BT.js +0 -1
  129. package/dist/web/assets/KnowledgeEditDialog-iv-dgUeD.css +0 -1
  130. package/dist/web/assets/KnowledgeInspector-Xs4VCUg8.js +0 -1
  131. package/dist/web/assets/KnowledgeOrganizerPage-B_Ct4bB2.js +0 -1
  132. package/dist/web/assets/KnowledgeOrganizerPage-Cx1w1jb2.css +0 -1
  133. package/dist/web/assets/KnowledgePage-RG9Ttnrp.js +0 -1
  134. package/dist/web/assets/KnowledgeWorkspace-DI8YqTVI.js +0 -4
  135. package/dist/web/assets/PersonalProfilePage-B7T09bow.css +0 -1
  136. package/dist/web/assets/PersonalProfilePage-DCoG52SW.js +0 -1
  137. package/dist/web/assets/PersonalProjectsPage-CNb9mlbp.js +0 -1
  138. package/dist/web/assets/ProjectAgentsPage-C3vW6wmk.css +0 -1
  139. package/dist/web/assets/ProjectAgentsPage-zQ9BZW9v.js +0 -11
  140. package/dist/web/assets/PublicProjectsPage-BuLqkZ8g.js +0 -1
  141. package/dist/web/assets/ReviewPage-8A7N5pJs.js +0 -1
  142. package/dist/web/assets/SettingsPage-4ah1u906.js +0 -1
  143. package/dist/web/assets/SettingsPage-CwZp2ka4.css +0 -1
  144. package/dist/web/assets/WritingTastePage-DSgvTH6x.css +0 -1
  145. package/dist/web/assets/WritingTastePage-DztRj6MK.js +0 -1
  146. package/dist/web/assets/avatars-LvVKbDF7.js +0 -1
  147. package/dist/web/assets/console-B7dWYAoU.js +0 -1
  148. package/dist/web/assets/conversation-launcher-settings-D1xhW1S5.js +0 -1
  149. package/dist/web/assets/index-Ch1jmkyO.css +0 -1
  150. package/dist/web/assets/index-DRd-2Tii.js +0 -2
@@ -1,4 +1,5 @@
1
1
  import { agentProjectResolution } from './agent-knowledge-workflows.js';
2
+ import { listAgentAttention, changeAgentAttention } from './agent-attention.js';
2
3
  import {
3
4
  getProjectAgentMemory,
4
5
  checkpointProjectAgentMemory
@@ -52,6 +53,26 @@ export const projectAgentControlPlaneHooks = Object.freeze({
52
53
  });
53
54
 
54
55
  export class ProjectAgentControlPlaneApplication {
56
+ async listAgentAttention(input) {
57
+ this.#assertSpace(input.personalSpaceId);
58
+ return listAgentAttention(this, input);
59
+ }
60
+
61
+ async requestAgentAttention(input) {
62
+ this.#assertSpace(input.personalSpaceId);
63
+ return changeAgentAttention(this, 'create', input);
64
+ }
65
+
66
+ async cancelAgentAttention(input) {
67
+ this.#assertSpace(input.personalSpaceId);
68
+ return changeAgentAttention(this, 'cancel', input);
69
+ }
70
+
71
+ async respondToAgentAttention(input) {
72
+ this.#assertSpace(input.personalSpaceId);
73
+ return changeAgentAttention(this, 'respond', input);
74
+ }
75
+
55
76
  async getProjectAgentMemory(input) {
56
77
  this.#assertSpace(input.personalSpaceId);
57
78
  return getProjectAgentMemory(this, input);
@@ -12,6 +12,8 @@ export function providerProjectAgentProfile(profile) {
12
12
  copyOptional(result, 'occupation_emoji', profile.occupationEmoji !== undefined
13
13
  ? profile.occupationEmoji : profile.occupation_emoji,
14
14
  hasAny(profile, ['occupationEmoji', 'occupation_emoji']));
15
+ copyOptional(result, 'display_name', profile.displayName ?? profile.display_name,
16
+ hasAny(profile, ['displayName', 'display_name']));
15
17
  copyOptional(result, 'agent_type', profile.agentType ?? profile.agent_type,
16
18
  hasAny(profile, ['agentType', 'agent_type']));
17
19
  copyOptional(result, 'work_kinds', profile.workKinds ?? profile.work_kinds,
@@ -61,6 +63,10 @@ export function projectAgentRecord(value) {
61
63
  );
62
64
  copyOptional(result.profile, 'agentType', profile.agent_type,
63
65
  Object.hasOwn(profile, 'agent_type'));
66
+ copyOptional(result.profile, 'displayName', profile.display_name,
67
+ Object.hasOwn(profile, 'display_name'));
68
+ copyOptional(result, 'legacyAgentIds', value.legacy_agent_ids,
69
+ Object.hasOwn(value, 'legacy_agent_ids'));
64
70
  copyOptional(result.profile, 'workKinds', profile.work_kinds,
65
71
  Object.hasOwn(profile, 'work_kinds'));
66
72
  copyOptional(
@@ -83,6 +83,19 @@ export class GraphitiProviderClient {
83
83
  upsertProjectAgent(input) {
84
84
  return this.#request('/v1/project-agents', { method: 'PUT', body: input });
85
85
  }
86
+ listAgentAttention(input) {
87
+ const query = new URLSearchParams(Object.entries(input).filter(([, value]) => value != null));
88
+ return this.#request(`/v1/agent-attention?${query}`);
89
+ }
90
+ changeAgentAttention(operation, input) {
91
+ const paths = { create: '/v1/agent-attention', cancel: '/v1/agent-attention/cancel', respond: '/v1/agent-attention/respond' };
92
+ if (!Object.hasOwn(paths, operation)) throw new TypeError('Unknown attention operation');
93
+ return this.#request(paths[operation], { method: 'POST', body: input });
94
+ }
95
+ ensureSystemProjectHr(personalSpaceId) {
96
+ const query = new URLSearchParams({ personal_space_id: personalSpaceId });
97
+ return this.#request(`/v1/project-agents/system-hr?${query}`, { method: 'POST' });
98
+ }
86
99
  listProjectAgents(
87
100
  personalSpaceId,
88
101
  personalProjectId = null,
@@ -1,4 +1,5 @@
1
1
  import { createHash } from 'node:crypto';
2
+ import { activeAgentRequestSignal } from '../app/agent-request-context.js';
2
3
 
3
4
  import {
4
5
  GraphitiProviderClient,
@@ -215,6 +216,10 @@ export class FuliWorkspaceProviderClient {
215
216
  if (authenticated) headers.authorization = `Bearer ${this.#accessToken}`;
216
217
  if (body !== undefined) headers['content-type'] = 'application/json';
217
218
  const controller = new AbortController();
219
+ const callerSignal = activeAgentRequestSignal();
220
+ const signal = callerSignal
221
+ ? AbortSignal.any([controller.signal, callerSignal])
222
+ : controller.signal;
218
223
  let timedOut = false;
219
224
  const timeout = setTimeout(() => {
220
225
  timedOut = true;
@@ -226,7 +231,7 @@ export class FuliWorkspaceProviderClient {
226
231
  headers,
227
232
  body: body === undefined ? undefined : JSON.stringify(body),
228
233
  redirect: 'error',
229
- signal: controller.signal
234
+ signal
230
235
  });
231
236
  if (!response.ok) {
232
237
  throw new ProviderRequestError(
@@ -239,6 +244,9 @@ export class FuliWorkspaceProviderClient {
239
244
  }
240
245
  return await safeJson(response);
241
246
  } catch (error) {
247
+ if (!timedOut && callerSignal?.aborted) {
248
+ throw callerSignal.reason ?? new DOMException('Aborted', 'AbortError');
249
+ }
242
250
  if (error instanceof ProviderRequestError) throw error;
243
251
  throw new ProviderRequestError(
244
252
  timedOut
@@ -0,0 +1,28 @@
1
+ import { readJson, sendJson } from './response.js';
2
+
3
+ export async function handleAgentAttentionRequest({ request, response, url, app }) {
4
+ if (url.pathname === '/api/agent-attention' && request.method === 'GET') {
5
+ sendJson(response, 200, await app.listAgentAttention({
6
+ personalSpaceId: url.searchParams.get('personalSpaceId'),
7
+ personalProjectId: url.searchParams.get('personalProjectId'),
8
+ agentId: url.searchParams.get('agentId'),
9
+ status: url.searchParams.get('status') ?? 'open',
10
+ limit: Number(url.searchParams.get('limit') ?? 100),
11
+ offset: Number(url.searchParams.get('offset') ?? 0)
12
+ }));
13
+ return true;
14
+ }
15
+ if (url.pathname === '/api/agent-attention' && request.method === 'POST') {
16
+ sendJson(response, 200, await app.requestAgentAttention(await readJson(request)));
17
+ return true;
18
+ }
19
+ if (url.pathname === '/api/agent-attention/cancel' && request.method === 'POST') {
20
+ sendJson(response, 200, await app.cancelAgentAttention(await readJson(request)));
21
+ return true;
22
+ }
23
+ if (url.pathname === '/api/agent-attention/respond' && request.method === 'POST') {
24
+ sendJson(response, 200, await app.respondToAgentAttention(await readJson(request)));
25
+ return true;
26
+ }
27
+ return false;
28
+ }
@@ -12,6 +12,9 @@ const BAD_REQUEST_CODES = new Set([
12
12
  ]);
13
13
 
14
14
  export function mapHttpError(error) {
15
+ if (error instanceof ApplicationError && ['external_knowledge_busy', 'external_knowledge_conflict'].includes(error.code)) {
16
+ return { status: 409, body: { error: error.message, code: error.code } };
17
+ }
15
18
  if (error instanceof EmployeeError) {
16
19
  return { status: error.status, body: { error: error.message, code: error.code } };
17
20
  }
@@ -1,4 +1,5 @@
1
1
  import { readJson, sendJson } from './response.js';
2
+ import { handleAgentAttentionRequest } from './agent-attention-api-router.js';
2
3
 
3
4
  export async function handleGraphApiRequest({
4
5
  request,
@@ -6,6 +7,7 @@ export async function handleGraphApiRequest({
6
7
  url,
7
8
  app
8
9
  }) {
10
+ if (await handleAgentAttentionRequest({ request, response, url, app })) return true;
9
11
  if (url.pathname === '/api/state' && request.method === 'GET') {
10
12
  sendJson(response, 200, await app.state());
11
13
  return true;
@@ -9,6 +9,7 @@ import {
9
9
  import { readJsonFile } from '../storage/json-file.js';
10
10
  import { readAdaptiveRuntimeSettings } from '../adaptive-runtime/settings.js';
11
11
  import { readAdaptiveRuntimeState } from '../adaptive-runtime/state.js';
12
+ import { createWorkspaceProvider } from '../graphiti/workspace-provider-client.js';
12
13
  import {
13
14
  DEFAULT_RUNTIME_SETTINGS,
14
15
  managedProviderUrls
@@ -119,7 +120,7 @@ export async function inspectLocalRuntime(input, dependencies = {}) {
119
120
  return {
120
121
  ...(intentionallySleeping && managedDevelopment
121
122
  ? { url: workspace.providerUrl, status: 'sleeping' }
122
- : await deps.providerHealth(workspace.providerUrl)),
123
+ : await deps.providerHealth(workspace.providerUrl, workspace)),
123
124
  managedDevelopment
124
125
  };
125
126
  }));
@@ -217,8 +218,13 @@ function safeReadState(path) {
217
218
  }
218
219
  }
219
220
 
220
- async function providerHealth(url) {
221
+ async function providerHealth(url, workspace = null) {
221
222
  try {
223
+ if (workspace) {
224
+ const { client } = createWorkspaceProvider(workspace, { requestTimeoutMs: 2500 });
225
+ const body = await client.health();
226
+ return { url, status: body?.status === 'ready' ? 'ready' : 'unavailable' };
227
+ }
222
228
  const response = await fetch(`${String(url).replace(/\/$/, '')}/health`, {
223
229
  signal: AbortSignal.timeout(2500)
224
230
  });
@@ -28,6 +28,13 @@ import {
28
28
  } from './session-id.js';
29
29
 
30
30
  const TOOL_RESULT_LIMIT_BYTES = Object.freeze({
31
+ list_project_agent_tasks: 128 * 1024,
32
+ list_preference_conflicts: 128 * 1024,
33
+ list_agent_interfaces: 64 * 1024,
34
+ list_external_knowledge_connectors: 32 * 1024,
35
+ discover_external_knowledge_sources: 64 * 1024,
36
+ list_external_knowledge_bindings: 64 * 1024,
37
+ retrieve_external_knowledge_binding: 64 * 1024,
31
38
  list_employee_templates: 32 * 1024,
32
39
  recruit_employee: 64 * 1024,
33
40
  list_employee_tools: 64 * 1024,
@@ -216,7 +223,9 @@ async function invokeTool(tool, input, requestContext = null) {
216
223
  limitBytes
217
224
  });
218
225
  }
219
- return successToolResult(value, { limitBytes });
226
+ const itemLimit = ({ list_agent_interfaces: 200, list_project_agent_tasks: 200,
227
+ list_preference_conflicts: 1000, list_external_knowledge_bindings: 200 })[tool.definition.name];
228
+ return successToolResult(value, { limitBytes, itemLimit });
220
229
  } catch (error) {
221
230
  return errorToolResult(error);
222
231
  }
@@ -1,4 +1,14 @@
1
1
  const READ_TOOLS = new Set([
2
+ 'list_agent_attention',
3
+ 'list_project_agent_tasks',
4
+ 'list_preference_conflicts',
5
+ 'list_agent_interfaces',
6
+ 'get_capture_policy',
7
+ 'list_external_knowledge_connectors',
8
+ 'discover_external_knowledge_sources',
9
+ 'list_external_knowledge_bindings',
10
+ 'retrieve_external_knowledge_binding',
11
+ 'get_external_knowledge_conflict_policy',
2
12
  'list_employee_templates',
3
13
  'list_employee_tools',
4
14
  'verify_task_checkpoint',
@@ -36,6 +46,17 @@ const READ_TOOLS = new Set([
36
46
  ]);
37
47
 
38
48
  const WRITE_TOOLS = new Set([
49
+ 'request_agent_attention',
50
+ 'cancel_agent_attention',
51
+ 'update_capture_policy',
52
+ 'create_external_knowledge_binding',
53
+ 'check_external_knowledge_binding',
54
+ 'sync_external_knowledge_binding',
55
+ 'update_external_knowledge_binding_targets',
56
+ 'delete_external_knowledge_binding',
57
+ 'update_external_knowledge_conflict_policy',
58
+ 'defer_preference_conflict',
59
+ 'delete_public_project',
39
60
  'recruit_employee',
40
61
  'call_employee_tool',
41
62
  'begin_task_context',
@@ -99,6 +120,8 @@ const WRITE_TOOLS = new Set([
99
120
  ]);
100
121
 
101
122
  const DESTRUCTIVE_TOOLS = new Set([
123
+ 'delete_external_knowledge_binding',
124
+ 'delete_public_project',
102
125
  'recruit_employee',
103
126
  'resolve_deferred_preference_conflict',
104
127
  'apply_common_knowledge_promotion',
@@ -141,6 +164,14 @@ export function annotationsFor(name) {
141
164
  name === 'checkpoint_task_knowledge' ||
142
165
  name === 'checkpoint_project_agent_memory',
143
166
  openWorldHint: name === 'capture_session_knowledge' ||
167
+ name === 'discover_external_knowledge_sources' ||
168
+ name === 'create_external_knowledge_binding' ||
169
+ name === 'check_external_knowledge_binding' ||
170
+ name === 'sync_external_knowledge_binding' ||
171
+ name === 'retrieve_external_knowledge_binding' ||
172
+ name === 'update_external_knowledge_binding_targets' ||
173
+ name === 'delete_external_knowledge_binding' ||
174
+ name === 'delete_public_project' ||
144
175
  name === 'coordinate_project_agent_task' ||
145
176
  name === 'submit_project_agent_task' ||
146
177
  name === 'record_project_agent_task_activity' ||
@@ -17,8 +17,8 @@ const MESSAGE_LIMIT = 240;
17
17
  const TRUNCATION_MARKER = '...[truncated]';
18
18
  const VALIDATION_ERROR_LIMIT = 5;
19
19
 
20
- export function successToolResult(value, { limitBytes = RESULT_LIMIT_BYTES } = {}) {
21
- const state = { truncated: false };
20
+ export function successToolResult(value, { limitBytes = RESULT_LIMIT_BYTES, itemLimit = RESULT_ITEM_LIMIT } = {}) {
21
+ const state = { truncated: false, itemLimit: Number.isInteger(itemLimit) && itemLimit > 0 ? Math.min(itemLimit, 1000) : RESULT_ITEM_LIMIT };
22
22
  const sanitized = sanitize(value, state);
23
23
  const candidate = isObject(sanitized) && !Array.isArray(sanitized)
24
24
  ? sanitized
@@ -118,8 +118,8 @@ function sanitize(value, state, seen = new WeakSet(), depth = 0) {
118
118
  }
119
119
  seen.add(value);
120
120
  if (Array.isArray(value)) {
121
- if (value.length > RESULT_ITEM_LIMIT) state.truncated = true;
122
- const result = value.slice(0, RESULT_ITEM_LIMIT)
121
+ if (value.length > state.itemLimit) state.truncated = true;
122
+ const result = value.slice(0, state.itemLimit)
123
123
  .map((item) => sanitize(item, state, seen, depth + 1));
124
124
  seen.delete(value);
125
125
  return result;
@@ -25,7 +25,8 @@ export function inspectAgentInstallations(agents, context, {
25
25
  const skillPairs = [
26
26
  [context.sessionSkillPath, agent.skillPath],
27
27
  [context.projectSkillPath, agent.projectSkillPath],
28
- [context.reviewSkillPath, agent.reviewSkillPath]
28
+ [context.reviewSkillPath, agent.reviewSkillPath],
29
+ [context.operationSkillPath, agent.operationSkillPath]
29
30
  ];
30
31
  const skillsPresent = skillPairs.some(([, targetPath]) => fileExists(targetPath));
31
32
  const skillsCurrent = skillPairs.every(
@@ -24,6 +24,7 @@ export function discoverAgents({
24
24
  const cursorHome = pathApi.join(homeDir, '.cursor');
25
25
  const skillName = 'capturing-session-knowledge';
26
26
  const projectSkillName = 'grilling-project';
27
+ const operationSkillName = 'operating-fuli';
27
28
  return [
28
29
  {
29
30
  id: 'codex',
@@ -35,6 +36,7 @@ export function discoverAgents({
35
36
  globalInstructionsOverridePath: pathApi.join(codexHome, 'AGENTS.override.md'),
36
37
  skillPath: pathApi.join(homeDir, '.agents', 'skills', skillName),
37
38
  projectSkillPath: pathApi.join(homeDir, '.agents', 'skills', projectSkillName),
39
+ operationSkillPath: pathApi.join(homeDir, '.agents', 'skills', operationSkillName),
38
40
  available: Boolean(commandExists('codex') || fileExists(pathApi.join(codexHome, 'config.toml')))
39
41
  },
40
42
  {
@@ -45,6 +47,7 @@ export function discoverAgents({
45
47
  settingsPath: pathApi.join(claudeHome, 'settings.json'),
46
48
  skillPath: pathApi.join(claudeHome, 'skills', skillName),
47
49
  projectSkillPath: pathApi.join(claudeHome, 'skills', projectSkillName),
50
+ operationSkillPath: pathApi.join(claudeHome, 'skills', operationSkillName),
48
51
  available: Boolean(
49
52
  commandExists('claude') ||
50
53
  fileExists(pathApi.join(homeDir, '.claude.json')) ||
@@ -59,6 +62,7 @@ export function discoverAgents({
59
62
  hooksPath: pathApi.join(cursorHome, 'hooks.json'),
60
63
  skillPath: pathApi.join(cursorHome, 'skills', skillName),
61
64
  projectSkillPath: pathApi.join(cursorHome, 'skills', projectSkillName),
65
+ operationSkillPath: pathApi.join(cursorHome, 'skills', operationSkillName),
62
66
  available: Boolean(
63
67
  commandExists('cursor') ||
64
68
  fileExists(pathApi.join(cursorHome, 'mcp.json')) ||
@@ -161,6 +161,10 @@ export async function ensureGraphRuntime(input, dependencies = {}) {
161
161
  deps.secureFile(input.paths.graphRuntimeConfigPath);
162
162
  }
163
163
  }
164
+ // Run the idempotent identity upgrade on existing installs as well as first setup.
165
+ await providerRequest(config.personal.providerUrl, `/v1/project-agents/system-hr?${new URLSearchParams({
166
+ personal_space_id: config.personal.spaceId
167
+ })}`, { token: config.personal.accessToken, fetchImpl: deps.fetch });
164
168
  const activeProfilePath = configSelection.switched
165
169
  ? graphConfigProfilePath(input.paths, runtimeMode)
166
170
  : null;
@@ -57,7 +57,8 @@ export function resolveSetupPaths({
57
57
  graphComposePath: join(root, 'compose.graphiti.yml'),
58
58
  sessionSkillPath: join(root, 'skills', 'capturing-session-knowledge'),
59
59
  projectSkillPath: join(root, 'skills', 'grilling-project'),
60
- reviewSkillPath: join(root, 'skills', 'flreview')
60
+ reviewSkillPath: join(root, 'skills', 'flreview'),
61
+ operationSkillPath: join(root, 'skills', 'operating-fuli')
61
62
  };
62
63
  }
63
64
 
@@ -60,7 +60,8 @@ export function planLocalSetup(options, {
60
60
  runtimeConfigPath: paths.graphRuntimeConfigPath,
61
61
  sessionSkillPath: paths.sessionSkillPath,
62
62
  projectSkillPath: paths.projectSkillPath,
63
- reviewSkillPath: paths.reviewSkillPath
63
+ reviewSkillPath: paths.reviewSkillPath,
64
+ operationSkillPath: paths.operationSkillPath
64
65
  })
65
66
  };
66
67
  }
@@ -118,7 +119,8 @@ export async function applyLocalSetup(plan, options, dependencies = {}) {
118
119
  for (const [target, sourcePath] of [
119
120
  [agent, plan.paths.sessionSkillPath],
120
121
  [{ ...agent, skillPath: agent.projectSkillPath }, plan.paths.projectSkillPath],
121
- [{ ...agent, skillPath: agent.reviewSkillPath }, plan.paths.reviewSkillPath]
122
+ [{ ...agent, skillPath: agent.reviewSkillPath }, plan.paths.reviewSkillPath],
123
+ [{ ...agent, skillPath: agent.operationSkillPath }, plan.paths.operationSkillPath]
122
124
  ]) {
123
125
  skills.push(await installSkill(target, {
124
126
  sourcePath,
@@ -21,7 +21,8 @@ export function planLocalUninstall(options, {
21
21
  fileExists(agent.globalInstructionsOverridePath)) ||
22
22
  (agent.skillPath && fileExists(agent.skillPath)) ||
23
23
  (agent.projectSkillPath && fileExists(agent.projectSkillPath)) ||
24
- (agent.reviewSkillPath && fileExists(agent.reviewSkillPath))
24
+ (agent.reviewSkillPath && fileExists(agent.reviewSkillPath)) ||
25
+ (agent.operationSkillPath && fileExists(agent.operationSkillPath))
25
26
  ));
26
27
  return { paths, agents };
27
28
  }
@@ -62,7 +63,8 @@ export async function applyLocalUninstall(plan, dependencies = {}) {
62
63
  for (const [skillPath, sourcePath] of [
63
64
  [agent.skillPath, plan.paths.sessionSkillPath],
64
65
  [agent.projectSkillPath, plan.paths.projectSkillPath],
65
- [agent.reviewSkillPath, plan.paths.reviewSkillPath]
66
+ [agent.reviewSkillPath, plan.paths.reviewSkillPath],
67
+ [agent.operationSkillPath, plan.paths.operationSkillPath]
66
68
  ]) {
67
69
  try {
68
70
  skills.push(removeSkill({ ...agent, skillPath }, { sourcePath }));
@@ -38,8 +38,18 @@ export function createResourceMonitor({
38
38
  let resolvedRuntime = containerRuntime;
39
39
  let diskCache = null;
40
40
  let hostMemoryCache = null;
41
+ let pendingSample = null;
41
42
 
42
- async function sample() {
43
+ function sample() {
44
+ // Several console tabs can refresh together. Share the expensive process and
45
+ // directory scan until it settles, without retaining a stale memory sample.
46
+ pendingSample ??= Promise.resolve().then(collectSample).finally(() => {
47
+ pendingSample = null;
48
+ });
49
+ return pendingSample;
50
+ }
51
+
52
+ async function collectSample() {
43
53
  const sampledAt = now().toISOString();
44
54
  const runtime = runtimeMode === 'container'
45
55
  ? (resolvedRuntime ??= inspectRuntime())
@@ -8,6 +8,7 @@ export const RESOURCE_REFRESH_OPTIONS = Object.freeze([5, 10, 30, 60]);
8
8
  export const GRAPH_RUNTIME_MODES = Object.freeze(['container', 'native']);
9
9
  export const CONVERSATION_LAUNCHER_APPLICATIONS = Object.freeze([
10
10
  'codex',
11
+ 'claude',
11
12
  'claude_code',
12
13
  'cursor',
13
14
  'gemini_cli',
@@ -38,6 +39,12 @@ export const DEFAULT_CONVERSATION_LAUNCHERS = deepFreeze({
38
39
  appName: 'Claude Code',
39
40
  urlTemplate: ''
40
41
  },
42
+ claude: {
43
+ enabled: false,
44
+ idFormat: 'any',
45
+ appName: 'Claude',
46
+ urlTemplate: ''
47
+ },
41
48
  cursor: {
42
49
  enabled: false,
43
50
  idFormat: 'any',
@@ -1 +0,0 @@
1
- .label-dimension-strip[data-v-b79b7e68]{background:#fff;border:1px solid #d4dad5;border-radius:8px;grid-template-columns:repeat(3,minmax(0,1fr));display:grid;overflow:hidden}.label-dimension-strip article[data-v-b79b7e68]{grid-template-columns:28px minmax(0,1fr);gap:11px;min-width:0;padding:15px 17px;display:grid}.label-dimension-strip article+article[data-v-b79b7e68]{border-left:1px solid #e1e5e1}.label-dimension-strip i[data-v-b79b7e68]{background:#f2f6f3;border:1px solid #cdd7d0;border-radius:7px;width:27px;height:27px;position:relative}.label-dimension-strip i[data-v-b79b7e68]:before,.label-dimension-strip i[data-v-b79b7e68]:after{content:"";position:absolute}.label-dimension-strip [data-dimension=profile] i[data-v-b79b7e68]:before{border:1.5px solid #537461;border-radius:50%;inset:6px}.label-dimension-strip [data-dimension=profile] i[data-v-b79b7e68]:after{background:#8f6b59;border-radius:50%;width:5px;height:5px;top:4px;right:4px}.label-dimension-strip [data-dimension=origin] i[data-v-b79b7e68]:before{border-bottom:1px solid #597266;border-right:1px solid #597266;inset:5px}.label-dimension-strip [data-dimension=origin] i[data-v-b79b7e68]:after{background:#735f79;border-radius:50%;width:6px;height:6px;top:5px;right:5px}.label-dimension-strip [data-dimension=confirmation] i[data-v-b79b7e68]:before{border-bottom:2px solid #537461;border-left:2px solid #537461;width:13px;height:7px;top:6px;left:6px;transform:rotate(-45deg)}.label-dimension-strip strong[data-v-b79b7e68],.label-dimension-strip p[data-v-b79b7e68],.label-dimension-strip small[data-v-b79b7e68]{display:block}.label-dimension-strip strong[data-v-b79b7e68]{color:#33443a;font-size:12px}.label-dimension-strip p[data-v-b79b7e68]{color:#68736c;margin-top:2px;font-size:10px}.label-dimension-strip small[data-v-b79b7e68]{color:#929a94;margin-top:5px;font-size:8px;line-height:1.35}.label-guide-sheet[data-v-b79b7e68]{background:#fff;border:1px solid #d4dad5;border-radius:8px;margin-top:14px;overflow:hidden}.label-guide-section[data-v-b79b7e68]{grid-template-columns:160px minmax(0,1fr);gap:24px;padding:24px;display:grid}.label-guide-section+.label-guide-section[data-v-b79b7e68]{border-top:1px solid #e0e4e0}.label-guide-section>header[data-v-b79b7e68]{grid-template-columns:26px minmax(0,1fr);align-content:start;gap:9px;display:grid}.label-guide-section>header>span[data-v-b79b7e68]{color:#a0a7a2;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px}.label-guide-section h3[data-v-b79b7e68]{color:#2e3c34;font-size:15px}.label-guide-section header p[data-v-b79b7e68]{color:#879089;margin-top:4px;font-size:9px}.label-definition-list[data-v-b79b7e68],.status-definition-list[data-v-b79b7e68]{display:grid}.label-definition-row[data-v-b79b7e68]{grid-template-columns:116px minmax(0,1fr);align-items:start;gap:16px;padding:12px 0;display:grid}.label-definition-row+.label-definition-row[data-v-b79b7e68],.status-definition-row+.status-definition-row[data-v-b79b7e68]{border-top:1px solid #edf0ed}.label-token[data-v-b79b7e68]{white-space:nowrap;border-radius:999px;align-items:center;gap:6px;width:max-content;max-width:100%;padding:5px 9px;font-size:9px;font-weight:680;line-height:1;display:inline-flex}.label-token[data-v-b79b7e68]:before{content:"";opacity:.72;background:currentColor;border-radius:50%;flex:none;width:6px;height:6px}.profile-token[data-kind=taste][data-v-b79b7e68]{color:#7a574b;background:#f5eeeb}.profile-token[data-kind=personality][data-v-b79b7e68]{color:#4f6970;background:#edf3f4}.profile-token[data-kind=judgment][data-v-b79b7e68]{color:#665b7a;background:#f1eef6}.label-definition-row strong[data-v-b79b7e68]{color:#3f4b44;font-size:11px}.label-definition-row p[data-v-b79b7e68]{color:#6f7972;margin-top:4px;font-size:10px;line-height:1.55}.quadrant-explainer[data-v-b79b7e68]{grid-template-rows:auto 28px auto;grid-template-columns:36px minmax(0,1fr);display:grid}.quadrant-y-axis[data-v-b79b7e68]{color:#8a938d;flex-direction:column;grid-row:1;justify-content:space-between;align-items:center;padding:3px 0;font-size:8px;display:flex}.quadrant-y-axis strong[data-v-b79b7e68]{color:#68736c;letter-spacing:.08em;text-orientation:upright;writing-mode:vertical-rl;font-size:8px;font-weight:650}.quadrant-grid[data-v-b79b7e68]{border:1px solid #cfd7d1;border-radius:7px;grid-template-columns:repeat(2,minmax(0,1fr));display:grid;overflow:hidden}.quadrant-grid article[data-v-b79b7e68]{min-height:118px;padding:14px 16px}.quadrant-grid article[data-v-b79b7e68]:nth-child(2n){border-left:1px solid #dce2dd}.quadrant-grid article[data-v-b79b7e68]:nth-child(n+3){border-top:1px solid #dce2dd}.quadrant-grid article[data-quadrant=known-unknown][data-v-b79b7e68]{background:#f6f2e8}.quadrant-grid article[data-quadrant=known-known][data-v-b79b7e68]{background:#edf5f0}.quadrant-grid article[data-quadrant=unknown-unknown][data-v-b79b7e68]{background:#f4eff4}.quadrant-grid article[data-quadrant=unknown-known][data-v-b79b7e68]{background:#edf4f5}.quadrant-grid span[data-v-b79b7e68]{color:#838d86;font-size:8px}.quadrant-grid strong[data-v-b79b7e68]{color:#35443b;margin-top:7px;font-size:13px;display:block}.quadrant-grid p[data-v-b79b7e68]{color:#68736c;max-width:340px;margin-top:6px;font-size:10px;line-height:1.5}.quadrant-x-axis[data-v-b79b7e68]{color:#8a938d;grid-area:2/2;grid-template-columns:1fr auto 1fr;align-items:center;gap:10px;font-size:8px;display:grid}.quadrant-x-axis span[data-v-b79b7e68]:last-child{text-align:right}.quadrant-x-axis strong[data-v-b79b7e68]{color:#68736c;letter-spacing:.08em;font-size:8px}.quadrant-notes[data-v-b79b7e68]{flex-wrap:wrap;grid-area:3/2;gap:6px 20px;padding-top:8px;display:flex}.quadrant-notes p[data-v-b79b7e68],.status-boundaries p[data-v-b79b7e68]{color:#77817a;font-size:9px;line-height:1.45}.status-definition-row[data-v-b79b7e68]{grid-template-columns:120px minmax(0,1fr) minmax(180px,.72fr);align-items:start;gap:16px;padding:12px 0;display:grid}.status-token[data-status=pending][data-v-b79b7e68]{color:#77602f;background:#f7f2e5}.status-token[data-status=agent-confirmed][data-v-b79b7e68]{color:#4d5f78;background:#eef2f7}.status-token[data-status=confirmed][data-v-b79b7e68]{color:#356047;background:#edf6f0}.status-definition-row>p[data-v-b79b7e68]{color:#67726b;font-size:10px;line-height:1.55}.status-definition-row>div[data-v-b79b7e68]{gap:3px;display:grid}.status-definition-row>div span[data-v-b79b7e68]{color:#929a94;font-size:8px}.status-definition-row>div strong[data-v-b79b7e68]{color:#4b5750;font-size:9px;font-weight:620;line-height:1.45}.status-boundaries[data-v-b79b7e68]{border-top:1px solid #edf0ed;flex-wrap:wrap;gap:6px 20px;margin-top:8px;padding-top:10px;display:flex}.label-example[data-v-b79b7e68]{background:#f7f9f7;border-top:1px solid #dce2dd;grid-template-columns:minmax(220px,.8fr) auto minmax(260px,1fr);align-items:center;gap:22px;padding:18px 24px;display:grid}.label-example>div[data-v-b79b7e68]:first-child{gap:4px;display:grid}.label-example>div:first-child span[data-v-b79b7e68]{color:#89928c;letter-spacing:.08em;text-transform:uppercase;font-size:8px}.label-example>div:first-child strong[data-v-b79b7e68]{color:#34433a;font-size:11px}.label-example-tags[data-v-b79b7e68]{flex-wrap:wrap;justify-content:center;gap:6px;display:flex}.origin-token[data-v-b79b7e68]{color:#3f6b55;background:#eaf3ed}.label-example>p[data-v-b79b7e68]{color:#68736c;font-size:9px;line-height:1.5}.label-all-note[data-v-b79b7e68]{color:#7b847e;text-align:center;border-top:1px solid #e3e7e3;padding:12px 24px;font-size:9px}@media (width<=1180px){.label-guide-section[data-v-b79b7e68]{grid-template-columns:1fr;gap:16px}.label-example[data-v-b79b7e68]{grid-template-columns:minmax(210px,.8fr) minmax(0,1.2fr)}.label-example-tags[data-v-b79b7e68]{justify-content:flex-end}.label-example>p[data-v-b79b7e68]{grid-column:1/-1}}.open-source-credits[data-v-8676884b]{background:#fff;border:1px solid #d4dad5;border-radius:9px;overflow:hidden}.credits-roll[data-v-8676884b]{padding:38px 40px 34px}.credits-roll header h3[data-v-8676884b]{color:#2e3c34;font-size:19px}.credits-roll header p[data-v-8676884b]{color:#78817b;margin-top:7px;font-size:11px}.credit-grid[data-v-8676884b]{border-top:1px solid #e1e5e1;border-left:1px solid #e1e5e1;grid-template-columns:repeat(4,minmax(0,1fr));margin-top:28px;display:grid}.credit-grid a[data-v-8676884b]{min-width:0;min-height:118px;color:inherit;border-bottom:1px solid #e1e5e1;border-right:1px solid #e1e5e1;grid-template-columns:46px minmax(0,1fr);align-items:center;gap:14px;padding:20px;text-decoration:none;display:grid}.credit-grid a[data-v-8676884b]:hover{background:#f7f9f7}.credit-grid a[data-v-8676884b]:focus-visible{outline-offset:-2px;outline:2px solid #7e9487}.credit-mark[data-v-8676884b]{place-items:center;width:42px;height:42px;display:grid}.credit-mark img[data-v-8676884b]{object-fit:contain;width:34px;height:34px}.credit-copy[data-v-8676884b]{gap:4px;min-width:0;display:grid}.credit-copy strong[data-v-8676884b]{color:#3a463f;font-size:11px}.credit-copy small[data-v-8676884b]{color:#89918b;font-size:8px}.credit-source-note[data-v-8676884b]{color:#929a94;max-width:760px;margin-top:18px;font-size:9px;line-height:1.55}.fuli-finale[data-v-8676884b]{color:#f2f4f2;text-align:center;background:#222824;place-content:center;justify-items:center;min-height:360px;padding:64px 32px;display:grid}.finale-brand[data-v-8676884b]{align-items:center;gap:24px;display:flex}.finale-brand>img[data-v-8676884b]{object-fit:contain;filter:grayscale()brightness(0)invert();width:124px;height:124px}.finale-brand>div[data-v-8676884b]{text-align:left;gap:3px;display:grid}.finale-brand strong[data-v-8676884b]{letter-spacing:-.04em;font-size:34px}.finale-brand span[data-v-8676884b]{color:#aeb7b0;font-size:13px}.fuli-finale>p[data-v-8676884b]{color:#b8c0ba;max-width:560px;margin-top:34px;font-size:12px;line-height:1.6}@media (width<=1180px){.credits-roll[data-v-8676884b]{padding:32px 28px}.credit-grid[data-v-8676884b]{grid-template-columns:repeat(3,minmax(0,1fr))}.credit-grid a[data-v-8676884b]{padding:16px}}.product-principles[data-v-d823b02d]{background:#fff;border:1px solid #d4dad5;border-radius:9px;overflow:hidden}.principles-lede[data-v-d823b02d]{padding:44px 48px 38px}.principles-lede h3[data-v-d823b02d]{color:#26352d;letter-spacing:-.04em;max-width:720px;font-size:clamp(25px,3vw,38px);font-weight:650;line-height:1.12}.principles-lede p[data-v-d823b02d]{color:#66716a;max-width:820px;font-size:13px;line-height:1.75}.principles-lede h3+p[data-v-d823b02d]{margin-top:24px}.principles-lede p+p[data-v-d823b02d]{margin-top:10px}.principle-sequence[data-v-d823b02d]{border-top:1px solid #dde2de;grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.principle-sequence article[data-v-d823b02d]{grid-template-columns:34px minmax(0,1fr);align-content:start;gap:16px;min-height:174px;padding:28px 32px;display:grid}.principle-sequence article[data-v-d823b02d]:nth-child(2n){border-left:1px solid #e2e6e2}.principle-sequence article[data-v-d823b02d]:nth-child(n+3){border-top:1px solid #e2e6e2}.principle-sequence article>span[data-v-d823b02d]{color:#98a19a;padding-top:3px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px}.principle-sequence h4[data-v-d823b02d],.principle-boundaries h4[data-v-d823b02d]{color:#344239;margin:0;font-size:14px;font-weight:680}.principle-sequence p[data-v-d823b02d],.principle-boundaries p[data-v-d823b02d]{color:#6c766f;margin-top:9px;font-size:11px;line-height:1.7}.principle-boundaries[data-v-d823b02d]{background:#f5f7f5;border-top:1px solid #d9dfda;padding:27px 32px 30px}.principle-boundaries>strong[data-v-d823b02d]{color:#77817a;letter-spacing:.1em;font-size:9px}.principle-boundaries>div[data-v-d823b02d]{grid-template-columns:repeat(3,minmax(0,1fr));margin-top:18px;display:grid}.principle-boundaries article[data-v-d823b02d]{min-width:0;padding:0 24px 0 28px;position:relative}.principle-boundaries article[data-v-d823b02d]:first-child{padding-left:0}.principle-boundaries article+article[data-v-d823b02d]{border-left:1px solid #dce2dd}.principle-boundaries i[data-v-d823b02d]{border:1.5px solid #577463;border-radius:50%;width:8px;height:8px;margin-bottom:12px;display:inline-block}.principle-boundaries i[data-boundary=authority][data-v-d823b02d]{border-radius:2px}.principle-boundaries i[data-boundary=scope][data-v-d823b02d]{border-radius:1px;transform:rotate(45deg)}@media (width<=1180px){.principles-lede[data-v-d823b02d]{padding:36px 34px 32px}.principle-sequence article[data-v-d823b02d]{padding:24px}.principle-boundaries article[data-v-d823b02d]{padding-inline:18px}}.about-view[data-v-6bd30c79]{background:#f7f8f6;padding-top:24px}.about-content[data-v-6bd30c79]{gap:18px;width:min(1100px,100%);margin:0 auto;display:grid}.about-labels-section[data-v-6bd30c79]{gap:14px;padding-top:22px;display:grid}.about-labels-section>header h3[data-v-6bd30c79]{color:#2e3c34;font-size:19px}.about-labels-section>header p[data-v-6bd30c79]{color:#78817b;max-width:720px;margin-top:7px;font-size:11px;line-height:1.6}
@@ -1 +0,0 @@
1
- import{A as e,C as t,F as n,H as r,M as i,N as a,R as o,T as s,Y as c,Z as l,_ as u,a as d,at as f,b as p,d as m,h,j as g,k as _,m as v,n as ee,nt as y,rt as b,v as x,w as S,x as C,y as w,z as te}from"./i18n-DQH9D35M.js";import{a as T,i as E,n as D,r as O,t as k}from"./console-B7dWYAoU.js";import{t as A}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as j}from"./SearchableSelect-CFZNdtlY.js";import{r as M,t as N}from"./identity-JjZG6aS5.js";var P=[`data-select-id`],F=[`aria-expanded`,`aria-controls`,`aria-label`,`aria-required`,`disabled`],I={class:`searchable-select-current`},L={class:`searchable-select-current-label`},ne={key:0,class:`searchable-select-current-meta`},re=[`hidden`],ie={key:0,class:`searchable-select-search`},ae=[`placeholder`,`aria-label`],R=[`id`],z=[`aria-selected`,`disabled`,`onClick`],oe={class:`searchable-select-option-copy`},se={key:0},ce={key:1,class:`searchable-select-empty`},le=s({__name:`SearchableMultiSelect`,props:{modelValue:{},options:{},label:{},controlId:{default:void 0},placeholder:{default:void 0},searchPlaceholder:{default:void 0},searchable:{type:Boolean,default:void 0},disabled:{type:Boolean,default:!1},required:{type:Boolean,default:!1}},emits:[`update:modelValue`,`change`],setup(t,{emit:s}){let c=t,_=s,S=l(null),w=l(null),T=l(null),E=l(null),D=l(!1),O=l(!1),k=l(``),A=o().replace(/[^A-Za-z0-9_-]/g,``),j=u(()=>`${c.controlId||`searchable-multi-select-${A}`}-options`),M=u(()=>new Set(c.modelValue)),N=u(()=>c.options.filter(({value:e})=>M.value.has(e))),le=u(()=>N.value.length===0?c.placeholder??d(`common.searchableSelect.placeholder`):N.value.length===1?N.value[0].label:d(`common.searchableSelect.selectedCount`,{count:N.value.length})),B=u(()=>c.searchPlaceholder??d(`common.searchableSelect.searchPlaceholder`)),V=u(()=>c.searchable??c.options.length>5),H=u(()=>{let e=ee(),t=k.value.trim().toLocaleLowerCase(e);return t?c.options.filter(n=>[n.label,n.value,n.meta,n.search].filter(Boolean).join(` `).toLocaleLowerCase(e).includes(t)):c.options});te(()=>c.disabled,e=>{e&&W()}),i(()=>document.addEventListener(`pointerdown`,he)),g(()=>document.removeEventListener(`pointerdown`,he));async function U(){D.value?W():await ue()}async function ue(){c.disabled||(k.value=``,ve(),D.value=!0,await e(),V.value?T.value?.focus():_e()?.focus())}function W({restoreFocus:t=!1}={}){D.value=!1,O.value=!1,k.value=``,t&&e(()=>w.value?.focus())}function de(e){if(c.disabled||e.disabled)return;let t=M.value.has(e.value)?c.modelValue.filter(t=>t!==e.value):[...c.modelValue,e.value];_(`update:modelValue`,t),_(`change`,t)}function fe(e){[`ArrowDown`,`Enter`,` `].includes(e.key)&&(e.preventDefault(),D.value&&[`Enter`,` `].includes(e.key)?W():ue())}function pe(e){if(e.key===`Escape`){e.preventDefault(),W({restoreFocus:!0});return}if(e.key===`ArrowDown`){e.preventDefault(),K()?.focus();return}e.key===`Enter`&&(e.preventDefault(),K()?.click())}function me(e){if(e.key===`Escape`){e.preventDefault(),W({restoreFocus:!0});return}if(![`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key))return;e.preventDefault();let t=G(),n=t.indexOf(e.currentTarget);t[e.key===`Home`?0:e.key===`End`?t.length-1:e.key===`ArrowDown`?Math.min(t.length-1,n+1):Math.max(0,n-1)]?.focus()}function he(e){D.value&&!S.value?.contains(e.target)&&W()}function ge(e){let t=e.relatedTarget;t&&S.value?.contains(t)||queueMicrotask(()=>{D.value&&!S.value?.contains(document.activeElement)&&W()})}function G(){return[...E.value?.querySelectorAll(`.searchable-select-option:not(:disabled)`)??[]]}function K(){return G()[0]??null}function _e(){return G().find(e=>e.getAttribute(`aria-selected`)===`true`)??K()}function ve(){let e=w.value?.getBoundingClientRect();O.value=!!(e&&window.innerHeight-e.bottom<270&&e.top>270)}return(e,i)=>(a(),C(`div`,{ref_key:`root`,ref:S,class:b([`searchable-select searchable-multi-select`,{open:D.value,"open-up":O.value,disabled:t.disabled}]),"data-select-id":t.controlId,onFocusout:ge},[x(`button`,{ref_key:`trigger`,ref:w,type:`button`,class:`searchable-select-trigger`,role:`combobox`,"aria-haspopup":`listbox`,"aria-expanded":D.value,"aria-controls":j.value,"aria-label":t.label,"aria-required":t.required,disabled:t.disabled,onPointerdown:i[0]||=v(()=>{},[`stop`]),onClick:v(U,[`stop`]),onKeydown:fe},[x(`span`,I,[x(`span`,L,f(le.value),1),N.value.length>1?(a(),C(`small`,ne,f(N.value.map(({label:e})=>e).join(` · `)),1)):p(``,!0)]),i[3]||=x(`i`,{class:`searchable-select-arrow`,"aria-hidden":`true`},null,-1)],40,F),x(`div`,{class:`searchable-select-panel`,hidden:!D.value},[V.value?(a(),C(`div`,ie,[r(x(`input`,{ref_key:`searchInput`,ref:T,"onUpdate:modelValue":i[1]||=e=>k.value=e,type:`search`,autocomplete:`off`,placeholder:B.value,"aria-label":y(d)(`common.searchableSelect.searchAria`,{label:t.label}),onKeydown:pe},null,40,ae),[[m,k.value]])])):p(``,!0),x(`div`,{id:j.value,ref_key:`optionsList`,ref:E,class:`searchable-select-options`,role:`listbox`,"aria-multiselectable":`true`},[(a(!0),C(h,null,n(H.value,e=>(a(),C(`button`,{key:e.value,type:`button`,class:`searchable-select-option`,role:`option`,"aria-selected":M.value.has(e.value),disabled:e.disabled,onMousedown:i[2]||=v(()=>{},[`prevent`]),onClick:t=>de(e),onKeydown:me},[x(`span`,oe,[x(`strong`,null,f(e.label),1),e.meta?(a(),C(`small`,se,f(e.meta),1)):p(``,!0)]),i[4]||=x(`i`,{class:`searchable-select-check`,"aria-hidden":`true`},null,-1)],40,z))),128))],8,R),H.value.length===0?(a(),C(`p`,ce,f(y(d)(`common.searchableSelect.noMatches`)),1)):p(``,!0)],8,re)],42,P))}}),B={class:`text-field`},V=[`id`,`value`,`name`,`placeholder`,`disabled`,`required`,`rows`],H=[`id`,`value`,`name`,`type`,`placeholder`,`disabled`,`required`],U=A(s({inheritAttrs:!1,__name:`TextField`,props:{modelValue:{},label:{},controlId:{default:void 0},type:{default:`text`},placeholder:{default:void 0},disabled:{type:Boolean,default:!1},required:{type:Boolean,default:!1},multiline:{type:Boolean,default:!1},rows:{default:3},name:{default:void 0}},emits:[`update:modelValue`],setup(e,{emit:t}){let n=t;function r(e){n(`update:modelValue`,e.target.value)}return(t,n)=>(a(),C(`label`,B,[x(`span`,null,f(e.label),1),e.multiline?(a(),C(`textarea`,_({key:0},t.$attrs,{id:e.controlId,value:e.modelValue,name:e.name,placeholder:e.placeholder,disabled:e.disabled,required:e.required,rows:e.rows,onInput:r}),null,16,V)):(a(),C(`input`,_({key:1},t.$attrs,{id:e.controlId,value:e.modelValue,name:e.name,type:e.type,placeholder:e.placeholder,disabled:e.disabled,required:e.required,onInput:r}),null,16,H))]))}}),[[`__scopeId`,`data-v-6c32205a`]]),ue={class:`view connections-view`},W={class:`connection-intro`},de=[`aria-label`],fe=[`data-status`],pe={class:`service-state`},me=[`data-status`],he={class:`connection-title-row`},ge={class:`service-state`},G={class:`external-knowledge-section`},K={class:`section-title section-title-with-help`},_e=[`href`,`aria-label`,`title`],ve={class:`external-binding-count`},ye={class:`external-binding-list`},be=[`data-status`],xe={class:`external-binding-copy`},Se={class:`external-binding-targets`},Ce=[`data-status`],we={key:0},Te={key:1},Ee={class:`external-binding-actions`},De=[`disabled`,`onClick`],Oe=[`disabled`,`onClick`],ke=[`disabled`,`onClick`],Ae=[`disabled`,`onClick`],je={key:0,class:`external-binding-editor`},Me={class:`external-target-mode-list`},Ne={class:`external-binding-editor-actions`},Pe=[`disabled`],Fe=[`disabled`,`onClick`],Ie={key:0,class:`compact-empty`},Le={class:`wide-field`},Re={class:`trusted-code-badge`},ze=[`disabled`],Be={key:0,class:`conflict-policy-section`},Ve={class:`section-title section-title-with-help`},He=[`href`,`aria-label`,`title`],Ue={class:`conflict-policy-controls`},We={key:1,class:`connection-subscriptions`},Ge={class:`section-title`},Ke={class:`subscription-list`},qe=[`onClick`],Je={key:0,class:`empty-state`},Ye={type:`submit`},q=s({__name:`ConnectionsPage`,setup(e){let r=k(),o=l(``),s=l([]),m=l([]),g=l(!1),_=l(null),b=l([]),A=l({}),P=l(``),F=l(`ask_human`),I=l(!1),L=c({name:``,connectorType:`mcp`,mode:`hybrid`,personalProjectIds:[],mcpTransport:`http`,mcpUrl:``,mcpCommand:``,mcpArgs:``,mcpTokenEnv:``,mcpResourcePrefix:``,notionTokenEnv:``,notionPageIds:``,notionDataSourceIds:``,feishuTokenEnv:``,feishuRegion:`cn`,feishuSpaceId:``,feishuRootNodeToken:``,feishuNodeTokens:``,feishuWebBaseUrl:``,retrievalUrl:``,retrievalTokenEnv:``,retrievalKnowledgeIds:``,retrievalScoreThreshold:`0.5`,customModule:``,customEnvironmentNames:``,customSourceJson:`{}`}),ne=u(()=>r.state?.providers?.personal?.status===`ready`),re=u(()=>r.state?.providers?.workspaces??[]),ie=u(()=>re.value.filter(({status:e})=>e===`ready`).length),ae=u(()=>{let e=r.state?.capabilities,t=[e?.browsePublicProjects?d(`pages.connections.publicCapability.discovery`):null,e?.subscribeProject?d(`pages.connections.publicCapability.subscription`):null,e?.publishProject?d(`pages.connections.publicCapability.publishing`):null,e?.submitKnowledge?d(`pages.connections.publicCapability.contribution`):null,e?.reviewProposals?d(`pages.connections.publicCapability.review`):null].filter(e=>!!e);return t.length?new Intl.ListFormat(ee(),{style:`long`,type:`conjunction`}).format(t):d(`pages.connections.notAvailable`)}),R=u(()=>r.state?.subscriptions??[]),z=u(()=>r.state?.personalProjects??[]),oe=u(()=>wt(`connect-external-knowledge`)),se=u(()=>wt(`external-knowledge-conflict-policy`)),ce=u(()=>new Set(R.value.map(({provider_url:e,project_id:t})=>`${e}::${t}`))),B=u(()=>(r.state?.projects??[]).filter(e=>!ce.value.has(et(e)))),V=u(()=>B.value.map(e=>({value:et(e),label:e.name,meta:`#${N(e.id,26)}`,search:M(e.id)}))),H=u(()=>s.value.map(e=>({value:e.type,label:e.name,meta:e.description}))),q=u(()=>z.value.map(e=>({value:e.project_id,label:e.profile.name,meta:`#${N(e.project_id,26)}`,search:M(e.project_id)}))),Xe=u(()=>[{value:`hybrid`,label:d(`pages.connections.mode.hybrid`),disabled:!Y(L.connectorType,`hybrid`)},{value:`mirror`,label:d(`pages.connections.mode.mirror`),disabled:!Y(L.connectorType,`mirror`)},{value:`live`,label:d(`pages.connections.mode.live`),disabled:!Y(L.connectorType,`live`)}]),Ze=u(()=>[{value:`http`,label:`Streamable HTTP`},{value:`stdio`,label:`stdio`}]),Qe=u(()=>[{value:`cn`,label:`Feishu`},{value:`global`,label:`Lark`}]),$e=u(()=>[{value:`ask_human`,label:d(`pages.connections.askHuman`)},{value:`agent_decide`,label:d(`pages.connections.agentDecide`)}]);te(z,e=>{let t=new Set(e.map(({project_id:e})=>e)),n=e[0]?.project_id??``;L.personalProjectIds=L.personalProjectIds.filter(e=>t.has(e)),!L.personalProjectIds.length&&n&&(L.personalProjectIds=[n]),b.value=b.value.filter(e=>t.has(e)),t.has(P.value)||(P.value=n,n&&mt())},{immediate:!0}),te(()=>L.connectorType,e=>{Y(e,L.mode)||(L.mode=_t(e))}),i(async()=>{await J(),P.value&&await mt()});function et(e){return`${e.providerUrl}::${e.id}`}async function tt(){let e=B.value.find(e=>et(e)===o.value);if(e)try{await T(`/api/subscriptions`,{personalSpaceId:r.activePersonalSpace?.id,projectId:e.id,providerUrl:e.providerUrl,projectName:e.name}),o.value=``,r.notify(d(`pages.connections.subscribed`,{name:e.name})),await r.refresh()}catch(e){r.reportError(e)}}async function nt(e){try{let t=new URLSearchParams({personalSpaceId:r.activePersonalSpace?.id??``,providerUrl:e.provider_url});await D(`/api/subscriptions/${encodeURIComponent(e.project_id)}?${t}`),r.notify(d(`pages.connections.unsubscribed`,{name:e.project_name??e.project_id})),await r.refresh()}catch(e){r.reportError(e)}}async function J(){try{let[e,t]=await Promise.all([O(`/api/external-knowledge/connectors`),O(`/api/external-knowledge/bindings`)]);s.value=e,m.value=t}catch(e){r.reportError(e)}}async function rt(){let e=r.activePersonalSpace?.id;if(!(!e||!L.personalProjectIds.length)){g.value=!0;try{let{connectorConfig:t,source:n}=it();await T(`/api/external-knowledge/bindings`,{name:L.name.trim(),connectorType:L.connectorType,connectorConfig:t,source:n,targets:L.personalProjectIds.map(t=>({personalSpaceId:e,personalProjectId:t,mode:L.mode}))}),r.notify(d(`pages.connections.externalCreated`,{name:L.name.trim()})),L.name=``,await J()}catch(e){r.reportError(e)}finally{g.value=!1}}}function it(){if(L.connectorType===`notion`)return{connectorConfig:{tokenEnv:$(L.notionTokenEnv,`Notion token env`)},source:{pageIds:Z(L.notionPageIds),dataSourceIds:Z(L.notionDataSourceIds)}};if(L.connectorType===`feishu`)return{connectorConfig:{accessTokenEnv:$(L.feishuTokenEnv,`Feishu token env`),region:L.feishuRegion},source:Q({spaceId:L.feishuSpaceId.trim(),rootNodeToken:L.feishuRootNodeToken.trim(),nodeTokens:Z(L.feishuNodeTokens),webBaseUrl:L.feishuWebBaseUrl.trim()})};if(L.connectorType===`retrieval_api`){let e=Number(L.retrievalScoreThreshold);if(!Number.isFinite(e)||e<0||e>1)throw TypeError(d(`pages.connections.scoreThresholdInvalid`));return{connectorConfig:Q({url:$(L.retrievalUrl,`Retrieval API URL`),tokenEnv:L.retrievalTokenEnv.trim(),scoreThreshold:e}),source:{knowledgeIds:Ct(L.retrievalKnowledgeIds,`Knowledge IDs`)}}}if(L.connectorType===`custom`){let e=JSON.parse(L.customSourceJson);if(!e||typeof e!=`object`||Array.isArray(e))throw TypeError(d(`pages.connections.customSourceObject`));return{connectorConfig:{module:$(L.customModule,`Custom connector module`),environmentNames:Z(L.customEnvironmentNames)},source:e}}return{connectorConfig:L.mcpTransport===`stdio`?Q({transport:`stdio`,command:L.mcpCommand.trim(),args:Z(L.mcpArgs)}):Q({transport:`http`,url:$(L.mcpUrl,`MCP URL`),tokenEnv:L.mcpTokenEnv.trim()}),source:Q({resourceUriPrefix:L.mcpResourcePrefix.trim()})}}async function at(e){await st(e,`check`)}async function ot(e){await st(e,`sync`)}async function st(e,t){g.value=!0;try{let n=await T(`/api/external-knowledge/bindings/${encodeURIComponent(e.id)}/${t}`,{});r.notify(d(t===`sync`&&n.skippedCredentials?`pages.connections.externalSyncedWithSkipped`:t===`sync`?`pages.connections.externalSynced`:`pages.connections.externalChecked`,{name:e.name,count:n.skippedCredentials??0})),await J()}catch(e){r.reportError(e)}finally{g.value=!1}}async function ct(e){g.value=!0;try{await D(`/api/external-knowledge/bindings/${encodeURIComponent(e.id)}`),r.notify(d(`pages.connections.externalDeleted`,{name:e.name})),await J()}catch(e){r.reportError(e)}finally{g.value=!1}}function lt(e){let t=X(e);_.value=e.id,b.value=t.map(({personalProjectId:e})=>e),A.value=Object.fromEntries(t.map(({personalProjectId:e,mode:t})=>[e,t]))}function ut(){_.value=null,b.value=[],A.value={}}function dt(e){let t=m.value.find(({id:e})=>e===_.value);if(!t)return;let n=A.value,r=_t(t.connectorType);A.value=Object.fromEntries(e.map(e=>[e,n[e]??t.mode??r]))}function ft(e,t){A.value={...A.value,[e]:t}}async function pt(e){let t=r.activePersonalSpace?.id;if(!(!t||!b.value.length)){g.value=!0;try{await E(`/api/external-knowledge/bindings/${encodeURIComponent(e.id)}/targets`,{targets:b.value.map(n=>({personalSpaceId:t,personalProjectId:n,mode:A.value[n]??e.mode}))}),r.notify(d(`pages.connections.projectsUpdated`,{name:e.name})),ut(),await J()}catch(e){r.reportError(e)}finally{g.value=!1}}}async function mt(){if(P.value)try{let e=await O(`/api/external-knowledge/conflict-policy?${new URLSearchParams({personalProjectId:P.value})}`);F.value=e.mode}catch(e){r.reportError(e)}}async function ht(){let e=r.activePersonalSpace?.id;if(!(!e||!P.value)){I.value=!0;try{let t=await E(`/api/external-knowledge/conflict-policy?${new URLSearchParams({personalProjectId:P.value})}`,{personalSpaceId:e,personalProjectId:P.value,mode:F.value});F.value=t.mode,r.notify(d(`pages.connections.conflictSaved`))}catch(e){r.reportError(e)}finally{I.value=!1}}}function gt(e){return s.value.find(t=>t.type===e)?.name??e}function Y(e,t){let n=s.value.find(t=>t.type===e)?.capabilities;return!n?.length||(t===`live`||t===`hybrid`?n.includes(`retrieve`):!0)&&(t===`mirror`||t===`hybrid`?n.includes(`sync`):!0)}function _t(e){return[`hybrid`,`mirror`,`live`].find(t=>Y(e,t))??`live`}function vt(e){return[`hybrid`,`mirror`,`live`].map(t=>({value:t,label:d(`pages.connections.mode.${t}`),disabled:!Y(e,t)}))}function X(e){return e.targets?.length?e.targets:[{id:e.id,...e.target,mode:e.mode,status:e.status,sync:e.sync}]}function yt(e){return X(e).some(({mode:e})=>e!==`live`)}function bt(e){return z.value.find(({project_id:t})=>t===e)?.profile.name??e}function xt(e){return X(e).find(({sync:e})=>e?.error)?.sync?.error??e.sync?.error}function St(e){return X(e).reduce((e,t)=>e+(t.sync?.skippedCredentials??0),0)}function Z(e){return[...new Set(e.split(`,`).map(e=>e.trim()).filter(Boolean))]}function Ct(e,t){let n=Z(e);if(!n.length)throw TypeError(`${t} is required`);return n}function Q(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==``&&(!Array.isArray(e)||e.length>0)))}function $(e,t){if(!e.trim())throw TypeError(`${t} is required`);return e.trim()}function wt(e){return`https://github.com/JevonsCode/fuli/blob/main/${ee()===`zh-CN`?`README.zh-CN.md`:`README.md`}#${e}`}return(e,i)=>(a(),C(`section`,ue,[x(`div`,W,[x(`h3`,null,f(y(d)(`pages.connections.title`)),1)]),x(`div`,{class:`service-connection-grid`,"aria-label":y(d)(`pages.connections.statusAria`)},[x(`article`,{class:`service-connection-card`,"data-status":ne.value?`ready`:`error`},[x(`header`,null,[i[30]||=x(`span`,{class:`service-connection-icon local`,"aria-hidden":`true`},[x(`span`,{class:`nav-icon nav-icon-personal-project`})],-1),x(`div`,null,[x(`h3`,null,f(y(d)(`pages.connections.localGraphiti`)),1)]),x(`span`,pe,f(ne.value?y(d)(`common.status.connected`):y(d)(`common.status.connectionError`)),1)]),x(`dl`,null,[x(`div`,null,[x(`dt`,null,f(y(d)(`pages.connections.storage`)),1),i[31]||=x(`dd`,null,`Neo4j`,-1)]),x(`div`,null,[x(`dt`,null,f(y(d)(`pages.connections.purpose`)),1),x(`dd`,null,f(y(d)(`pages.connections.localPurpose`)),1)])])],8,fe),x(`article`,{class:`service-connection-card`,"data-status":y(r).publicRuntimeStatus},[x(`header`,null,[i[33]||=x(`span`,{class:`service-connection-icon public`,"aria-hidden":`true`},[x(`span`,{class:`nav-icon nav-icon-public-project`})],-1),x(`div`,he,[x(`h3`,null,f(y(d)(`pages.connections.publicService`)),1),i[32]||=x(`span`,{class:`feature-badge beta`},`BETA`,-1)]),x(`span`,ge,f(y(r).publicRuntimeStatus===`ready`?y(d)(`common.status.connected`):y(r).publicRuntimeStatus===`error`?y(d)(`common.status.connectionError`):y(d)(`common.status.notConnected`)),1)]),x(`dl`,null,[x(`div`,null,[x(`dt`,null,f(y(d)(`pages.connections.currentStatus`)),1),x(`dd`,null,f(y(r).publicRuntimeStatus===`ready`?y(d)(`pages.connections.sharedServicesReady`,{count:ie.value||re.value.length}):y(d)(`pages.connections.notAvailable`)),1)]),x(`div`,null,[x(`dt`,null,f(y(d)(`pages.connections.purpose`)),1),x(`dd`,null,f(ae.value),1)])])],8,me)],8,de),x(`section`,G,[x(`div`,K,[x(`h3`,null,f(y(d)(`pages.connections.externalTitle`)),1),x(`a`,{class:`section-help-link`,"data-testid":`external-knowledge-help`,href:oe.value,"aria-label":y(d)(`pages.connections.externalHelp`),title:y(d)(`pages.connections.externalHelp`),target:`_blank`,rel:`noreferrer`},`?`,8,_e),x(`span`,ve,f(y(d)(`pages.connections.bindingCount`,{count:m.value.length})),1)]),x(`div`,ye,[(a(!0),C(h,null,n(m.value,e=>(a(),C(`article`,{key:e.id,class:`external-binding-row`,"data-status":e.status},[i[34]||=x(`i`,{"aria-hidden":`true`},null,-1),x(`div`,xe,[x(`strong`,null,f(e.name),1),x(`span`,null,f(gt(e.connectorType)),1),x(`div`,Se,[x(`b`,null,f(y(d)(`pages.connections.boundTo`)),1),(a(!0),C(h,null,n(X(e),e=>(a(),C(`span`,{key:e.id,class:`external-binding-target-chip`,"data-status":e.status},f(bt(e.personalProjectId))+` · `+f(y(d)(`pages.connections.mode.${e.mode}`)),9,Ce))),128))]),xt(e)?(a(),C(`small`,we,f(xt(e)),1)):St(e)?(a(),C(`small`,Te,f(y(d)(`pages.connections.credentialsSkipped`,{count:St(e)})),1)):p(``,!0)]),x(`div`,Ee,[x(`button`,{class:`quiet-button`,type:`button`,disabled:g.value,onClick:t=>at(e)},f(y(d)(`pages.connections.check`)),9,De),x(`button`,{class:`quiet-button external-sync-action`,type:`button`,disabled:g.value||!yt(e),onClick:t=>ot(e)},f(y(d)(`pages.connections.sync`)),9,Oe),x(`button`,{class:`quiet-button`,type:`button`,disabled:g.value,onClick:t=>lt(e)},f(y(d)(`pages.connections.manageProjects`)),9,ke),x(`button`,{class:`quiet-button danger`,type:`button`,disabled:g.value,onClick:t=>ct(e)},f(y(d)(`pages.connections.disconnect`)),9,Ae)]),_.value===e.id?(a(),C(`div`,je,[x(`label`,null,[x(`span`,null,f(y(d)(`pages.connections.targetProjects`)),1),S(le,{modelValue:b.value,"onUpdate:modelValue":i[0]||=e=>b.value=e,"control-id":`external-projects-${e.id}`,label:y(d)(`pages.connections.targetProjects`),options:q.value,disabled:g.value,required:``,searchable:``,onChange:dt},null,8,[`modelValue`,`control-id`,`label`,`options`,`disabled`])]),x(`div`,Me,[(a(!0),C(h,null,n(b.value,t=>(a(),C(`div`,{key:t,class:`external-target-mode-row`},[x(`span`,null,f(bt(t)),1),S(j,{"model-value":A.value[t]??e.mode,"control-id":`external-target-mode-${e.id}-${t}`,label:y(d)(`pages.connections.bindingMode`),options:vt(e.connectorType),disabled:g.value,"onUpdate:modelValue":e=>ft(t,e)},null,8,[`model-value`,`control-id`,`label`,`options`,`disabled`,`onUpdate:modelValue`])]))),128))]),x(`div`,Ne,[x(`button`,{class:`quiet-button`,type:`button`,disabled:g.value,onClick:ut},f(y(d)(`common.actions.cancel`)),9,Pe),x(`button`,{class:`primary-action`,type:`button`,disabled:g.value||!b.value.length,onClick:t=>pt(e)},f(y(d)(`pages.connections.saveProjects`)),9,Fe)])])):p(``,!0)],8,be))),128)),m.value.length?p(``,!0):(a(),C(`div`,Ie,f(y(d)(`pages.connections.noExternalBindings`)),1))]),x(`form`,{class:`external-binding-form`,onSubmit:v(rt,[`prevent`])},[S(U,{modelValue:L.name,"onUpdate:modelValue":i[1]||=e=>L.name=e,label:y(d)(`pages.connections.bindingName`),"data-testid":`external-name`,required:``},null,8,[`modelValue`,`label`]),x(`label`,null,[x(`span`,null,f(y(d)(`pages.connections.connector`)),1),S(j,{modelValue:L.connectorType,"onUpdate:modelValue":i[2]||=e=>L.connectorType=e,"control-id":`external-connector`,label:y(d)(`pages.connections.connector`),options:H.value,disabled:g.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),x(`label`,null,[x(`span`,null,f(y(d)(`pages.connections.targetProjects`)),1),S(le,{modelValue:L.personalProjectIds,"onUpdate:modelValue":i[3]||=e=>L.personalProjectIds=e,"control-id":`external-projects`,label:y(d)(`pages.connections.targetProjects`),options:q.value,disabled:g.value,required:``,searchable:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),x(`label`,null,[x(`span`,null,f(y(d)(`pages.connections.bindingMode`)),1),S(j,{modelValue:L.mode,"onUpdate:modelValue":i[4]||=e=>L.mode=e,"control-id":`external-binding-mode`,label:y(d)(`pages.connections.bindingMode`),options:Xe.value,disabled:g.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),L.connectorType===`mcp`?(a(),C(h,{key:0},[x(`label`,null,[x(`span`,null,f(y(d)(`pages.connections.transport`)),1),S(j,{modelValue:L.mcpTransport,"onUpdate:modelValue":i[5]||=e=>L.mcpTransport=e,"control-id":`external-mcp-transport`,label:y(d)(`pages.connections.transport`),options:Ze.value,disabled:g.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),L.mcpTransport===`http`?(a(),w(U,{key:0,modelValue:L.mcpUrl,"onUpdate:modelValue":i[6]||=e=>L.mcpUrl=e,label:`MCP URL`,"data-testid":`mcp-url`,type:`url`,required:``},null,8,[`modelValue`])):(a(),w(U,{key:1,modelValue:L.mcpCommand,"onUpdate:modelValue":i[7]||=e=>L.mcpCommand=e,label:y(d)(`pages.connections.command`),required:``},null,8,[`modelValue`,`label`])),L.mcpTransport===`stdio`?(a(),w(U,{key:2,modelValue:L.mcpArgs,"onUpdate:modelValue":i[8]||=e=>L.mcpArgs=e,label:y(d)(`pages.connections.arguments`)},null,8,[`modelValue`,`label`])):(a(),w(U,{key:3,modelValue:L.mcpTokenEnv,"onUpdate:modelValue":i[9]||=e=>L.mcpTokenEnv=e,label:y(d)(`pages.connections.tokenEnv`),"data-testid":`mcp-token-env`},null,8,[`modelValue`,`label`])),S(U,{modelValue:L.mcpResourcePrefix,"onUpdate:modelValue":i[10]||=e=>L.mcpResourcePrefix=e,label:y(d)(`pages.connections.resourcePrefix`),"data-testid":`mcp-resource-prefix`},null,8,[`modelValue`,`label`])],64)):L.connectorType===`notion`?(a(),C(h,{key:1},[S(U,{modelValue:L.notionTokenEnv,"onUpdate:modelValue":i[11]||=e=>L.notionTokenEnv=e,label:y(d)(`pages.connections.tokenEnv`),required:``},null,8,[`modelValue`,`label`]),S(U,{modelValue:L.notionPageIds,"onUpdate:modelValue":i[12]||=e=>L.notionPageIds=e,label:`Page IDs`},null,8,[`modelValue`]),S(U,{modelValue:L.notionDataSourceIds,"onUpdate:modelValue":i[13]||=e=>L.notionDataSourceIds=e,label:`Data Source IDs`},null,8,[`modelValue`])],64)):L.connectorType===`feishu`?(a(),C(h,{key:2},[S(U,{modelValue:L.feishuTokenEnv,"onUpdate:modelValue":i[14]||=e=>L.feishuTokenEnv=e,label:y(d)(`pages.connections.tokenEnv`),required:``},null,8,[`modelValue`,`label`]),x(`label`,null,[x(`span`,null,f(y(d)(`pages.connections.region`)),1),S(j,{modelValue:L.feishuRegion,"onUpdate:modelValue":i[15]||=e=>L.feishuRegion=e,"control-id":`external-feishu-region`,label:y(d)(`pages.connections.region`),options:Qe.value,disabled:g.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),S(U,{modelValue:L.feishuSpaceId,"onUpdate:modelValue":i[16]||=e=>L.feishuSpaceId=e,label:`Space ID`},null,8,[`modelValue`]),S(U,{modelValue:L.feishuRootNodeToken,"onUpdate:modelValue":i[17]||=e=>L.feishuRootNodeToken=e,label:`Root Node Token`},null,8,[`modelValue`]),S(U,{modelValue:L.feishuNodeTokens,"onUpdate:modelValue":i[18]||=e=>L.feishuNodeTokens=e,label:`Node Tokens`},null,8,[`modelValue`]),S(U,{modelValue:L.feishuWebBaseUrl,"onUpdate:modelValue":i[19]||=e=>L.feishuWebBaseUrl=e,label:`Web URL`,type:`url`},null,8,[`modelValue`])],64)):L.connectorType===`retrieval_api`?(a(),C(h,{key:3},[S(U,{modelValue:L.retrievalUrl,"onUpdate:modelValue":i[20]||=e=>L.retrievalUrl=e,label:y(d)(`pages.connections.retrievalUrl`),type:`url`,required:``},null,8,[`modelValue`,`label`]),S(U,{modelValue:L.retrievalTokenEnv,"onUpdate:modelValue":i[21]||=e=>L.retrievalTokenEnv=e,label:y(d)(`pages.connections.tokenEnv`)},null,8,[`modelValue`,`label`]),S(U,{modelValue:L.retrievalKnowledgeIds,"onUpdate:modelValue":i[22]||=e=>L.retrievalKnowledgeIds=e,label:y(d)(`pages.connections.knowledgeIds`),required:``},null,8,[`modelValue`,`label`]),S(U,{modelValue:L.retrievalScoreThreshold,"onUpdate:modelValue":i[23]||=e=>L.retrievalScoreThreshold=e,label:y(d)(`pages.connections.scoreThreshold`),inputmode:`decimal`,required:``},null,8,[`modelValue`,`label`])],64)):(a(),C(h,{key:4},[S(U,{modelValue:L.customModule,"onUpdate:modelValue":i[24]||=e=>L.customModule=e,label:y(d)(`pages.connections.module`),required:``},null,8,[`modelValue`,`label`]),S(U,{modelValue:L.customEnvironmentNames,"onUpdate:modelValue":i[25]||=e=>L.customEnvironmentNames=e,label:y(d)(`pages.connections.environmentNames`)},null,8,[`modelValue`,`label`]),x(`div`,Le,[S(U,{modelValue:L.customSourceJson,"onUpdate:modelValue":i[26]||=e=>L.customSourceJson=e,label:y(d)(`pages.connections.sourceJson`),multiline:``,required:``},null,8,[`modelValue`,`label`])]),x(`span`,Re,f(y(d)(`pages.connections.trustedCode`)),1)],64)),x(`button`,{class:`primary-action external-create-action`,type:`submit`,disabled:g.value||!z.value.length||!L.personalProjectIds.length},[i[35]||=x(`span`,{class:`external-create-action-icon`,"aria-hidden":`true`},null,-1),x(`span`,null,f(y(d)(`pages.connections.connect`)),1)],8,ze)],32)]),z.value.length?(a(),C(`section`,Be,[x(`div`,Ve,[x(`h3`,null,f(y(d)(`pages.connections.conflictTitle`)),1),x(`a`,{class:`section-help-link`,"data-testid":`conflict-policy-help`,href:se.value,"aria-label":y(d)(`pages.connections.conflictHelp`),title:y(d)(`pages.connections.conflictHelp`),target:`_blank`,rel:`noreferrer`},`?`,8,He)]),x(`div`,Ue,[x(`label`,null,[x(`span`,null,f(y(d)(`pages.connections.targetProject`)),1),S(j,{modelValue:P.value,"onUpdate:modelValue":i[27]||=e=>P.value=e,"control-id":`external-conflict-project`,label:y(d)(`pages.connections.targetProject`),options:q.value,disabled:I.value,required:``,onChange:mt},null,8,[`modelValue`,`label`,`options`,`disabled`])]),x(`label`,null,[x(`span`,null,f(y(d)(`pages.connections.conflictAction`)),1),S(j,{modelValue:F.value,"onUpdate:modelValue":i[28]||=e=>F.value=e,"control-id":`external-conflict-mode`,label:y(d)(`pages.connections.conflictAction`),options:$e.value,disabled:I.value,required:``,onChange:ht},null,8,[`modelValue`,`label`,`options`,`disabled`])])])])):p(``,!0),y(r).state?.capabilities?.subscribeProject?(a(),C(`section`,We,[x(`div`,Ge,[x(`h3`,null,[t(f(y(d)(`pages.connections.subscriptionsTitle`))+` `,1),i[36]||=x(`span`,{class:`feature-badge beta`},`BETA`,-1)])]),x(`div`,Ke,[(a(!0),C(h,null,n(R.value,e=>(a(),C(`div`,{key:`${e.provider_url}:${e.project_id}`,class:`subscription-row`},[i[37]||=x(`span`,null,`↗`,-1),x(`div`,null,[x(`strong`,null,f(e.project_name??e.project_id),1),x(`span`,null,f(y(d)(`pages.connections.sharedProject`)),1)]),x(`button`,{class:`secondary-action subscription-action`,type:`button`,onClick:t=>nt(e)},f(y(d)(`pages.connections.unsubscribe`)),9,qe)]))),128)),R.value.length?p(``,!0):(a(),C(`div`,Je,f(y(d)(`pages.connections.noSubscriptions`)),1))]),x(`form`,{class:`subscription-form`,onSubmit:v(tt,[`prevent`])},[S(j,{modelValue:o.value,"onUpdate:modelValue":i[29]||=e=>o.value=e,options:V.value,label:y(d)(`pages.connections.sharedProjectLabel`),placeholder:y(d)(`pages.connections.choosePublicProject`),searchable:``,required:``},null,8,[`modelValue`,`options`,`label`,`placeholder`]),x(`button`,Ye,f(y(d)(`pages.connections.subscribe`)),1)],32)])):p(``,!0)]))}});export{q as default};
@@ -1 +0,0 @@
1
- .project-scope-picker[data-v-f8d66833]{min-width:0;margin-bottom:18px;position:relative}.project-scope-heading[data-v-f8d66833]{justify-content:space-between;align-items:center;gap:12px;margin-bottom:9px;display:flex}.project-scope-label[data-v-f8d66833]{color:#33483c;font-size:13px;font-weight:600}.project-scope-count[data-v-f8d66833]{color:#58675d;font-size:12px}.project-scope-trigger[data-v-f8d66833]{color:#25392e;width:100%;min-height:44px;font:inherit;text-align:left;cursor:pointer;background:#fff;border:1px solid #bdcbbf;border-radius:8px;justify-content:space-between;align-items:center;gap:12px;padding:10px 12px;display:flex}.project-scope-trigger svg[data-v-f8d66833]{flex-shrink:0}.project-scope-value[data-v-f8d66833]{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.project-scope-multiple[data-v-f8d66833]{color:#58675d;white-space:nowrap;font-size:11px}.project-scope-trigger[data-v-f8d66833]:hover:not(:disabled),.project-scope-trigger[aria-expanded=true][data-v-f8d66833]{border-color:#315c43}.project-scope-trigger[data-v-f8d66833]:disabled{color:#65746a;cursor:default;background:#f2f5f2}.project-scope-panel[data-v-f8d66833]{z-index:5;background:#fff;border:0;border-radius:12px;margin-top:6px;padding:8px;position:absolute;inset:auto 0;box-shadow:0 8px 30px #12291c2e}.project-scope-search[data-v-f8d66833]{box-sizing:border-box;color:#25392e;width:100%;min-height:40px;font:inherit;background:#f1f5f2;border:0;border-radius:6px;padding:8px 10px;display:block}.project-scope-search[data-v-f8d66833]::placeholder{color:#59695f}.project-scope-bulk[data-v-f8d66833],.project-scope-footer[data-v-f8d66833]{justify-content:space-between;align-items:center;gap:12px;display:flex}.project-scope-bulk[data-v-f8d66833]{margin-top:4px}.project-scope-bulk button[data-v-f8d66833],.project-scope-footer button[data-v-f8d66833]{color:#315c43;min-height:40px;font:inherit;cursor:pointer;white-space:nowrap;background:0 0;border:0;border-radius:6px;padding:8px 10px;font-size:13px}.project-scope-bulk button[data-v-f8d66833]:hover:not(:disabled),.project-scope-footer button[data-v-f8d66833]:hover{background:#edf3ee}.project-scope-bulk button[data-v-f8d66833]:disabled{color:#65746a;cursor:default}.project-scope-list[data-v-f8d66833]{overscroll-behavior:contain;scrollbar-gutter:stable;max-height:min(240px,32dvh);overflow-y:auto}.project-scope-option[data-v-f8d66833]{color:#344a3c;cursor:pointer;box-sizing:border-box;border-radius:6px;align-items:center;gap:10px;min-height:42px;padding:8px 10px;display:flex}.project-scope-option[data-v-f8d66833]:hover{background:#f1f5f2}.project-scope-option>span[data-v-f8d66833]{overflow-wrap:anywhere;min-width:0}.project-scope-project-id[data-v-f8d66833]{color:#58675d;margin-top:2px;font-size:12px;line-height:1.4;display:block}.project-scope-option.is-selected[data-v-f8d66833]{color:#244b34;background:#f1f6f2}.project-scope-option.is-selected[data-v-f8d66833]:hover{background:#e7f0e9}.project-scope-option input[data-v-f8d66833]{appearance:none;cursor:pointer;background:#fff;border:1px solid #8da292;border-radius:4px;flex:0 0 17px;place-content:center;width:17px;height:17px;margin:0;display:grid}.project-scope-option input[data-v-f8d66833]:checked,.project-scope-option input[data-v-f8d66833]:indeterminate{background:#315c43;border-color:#315c43}.project-scope-option input[data-v-f8d66833]:checked:after{content:"";border-bottom:1.6px solid #fff;border-left:1.6px solid #fff;width:7px;height:4px;transform:translateY(-1px)rotate(-45deg)}.project-scope-option input[data-v-f8d66833]:indeterminate:after{content:"";background:#fff;width:7px;height:1.5px}.project-scope-option input[data-v-f8d66833]:disabled{opacity:.55;cursor:default}.project-scope-all[data-v-f8d66833]{flex:1;font-weight:600}.project-scope-all small[data-v-f8d66833]{color:#59695f;margin-left:4px;font-size:12px;font-weight:400}.project-scope-footer[data-v-f8d66833]{color:#59695f;padding-top:4px;font-size:12px}.project-scope-footer>span[data-v-f8d66833]{padding-left:10px}.project-scope-empty[data-v-f8d66833]{color:#59695f;margin:16px 10px;font-size:13px}.project-scope-hint[data-v-f8d66833]{color:#58675d;margin:7px 0 0;font-size:12px}.is-inline .project-scope-panel[data-v-f8d66833]{box-shadow:none;border-radius:0;margin:0;padding:0;position:static}.is-inline .project-scope-search[data-v-f8d66833]{background:#f3f5f3;min-height:42px}.is-inline .project-scope-list[data-v-f8d66833]{gap:3px;display:grid}.is-inline .project-scope-hint[data-v-f8d66833]{margin-top:12px}.is-compact[data-v-f8d66833]{margin-bottom:0;font-size:13px}.is-compact .project-scope-heading[data-v-f8d66833]{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.is-compact .project-scope-panel[data-v-f8d66833]{z-index:10;min-width:min(320px,100vw - 40px)}.is-compact .project-scope-hint[data-v-f8d66833]{padding:0 10px 6px;line-height:1.5}.project-scope-picker[data-v-f8d66833] :is(button,input):focus-visible{outline-offset:2px;outline:2px solid #356448}.employee-recruit-dialog[data-v-cf95f112]{color:#25392e;background:#fff;border:0;border-radius:16px;width:min(560px,100vw - 32px);max-height:calc(100dvh - 48px);margin:auto;padding:0;font-size:14px;line-height:1.6;overflow:hidden;box-shadow:0 20px 70px #12291c30}.employee-recruit-dialog[open][data-v-cf95f112]{flex-direction:column;display:flex}.employee-recruit-dialog>form[data-v-cf95f112]{flex-direction:column;min-height:0;display:flex}.employee-recruit-body[data-v-cf95f112]{overscroll-behavior:contain;min-height:0;padding:0 28px 20px;overflow-y:auto}.employee-recruit-dialog[data-v-cf95f112]>:is(p,.employee-message){margin:0 28px 28px}.employee-recruit-dialog[data-v-cf95f112]::backdrop{background:#14291f52}.employee-recruit-heading[data-v-cf95f112]{flex:none;justify-content:space-between;align-items:center;gap:16px;padding:22px 28px;display:flex}.employee-recruit-heading h2[data-v-cf95f112]{margin:0;font-size:20px;line-height:1.4}.employee-profile[data-v-cf95f112]{align-items:center;gap:16px;margin-bottom:12px;display:flex}.employee-profile h3[data-v-cf95f112]{margin:0 0 4px;font-size:21px;line-height:1.35}.employee-profile h3 span[data-v-cf95f112]{color:#5a6960;margin-left:8px;font-size:13px;font-weight:500;display:inline-block}.employee-profile p[data-v-cf95f112],.employee-success p[data-v-cf95f112]{color:#536259;margin:0}.employee-avatar[data-v-cf95f112]{color:#315c43;background:#e7eee9;border-radius:14px;flex:0 0 52px;place-items:center;height:52px;font-size:27px;font-weight:650;display:grid;overflow:hidden}.employee-avatar img[data-v-cf95f112]{object-fit:cover;width:100%;height:100%}.employee-specialties[data-v-cf95f112]{color:#59695f;margin:0 0 24px;font-size:12px}.employee-scope-mode[data-v-cf95f112]{background:#f0f3f1;border-radius:10px;gap:4px;margin:0 0 10px;padding:4px;display:flex}.employee-scope-mode button[data-v-cf95f112]{color:#52645a;min-height:40px;font:inherit;cursor:pointer;background:0 0;border:0;border-radius:7px;flex:1;padding:8px 10px;font-size:13px}.employee-scope-mode button[aria-checked=true][data-v-cf95f112]{color:#294f39;background:#fff;font-weight:600;box-shadow:0 1px 3px #142b1e17}.employee-scope-mode button[data-v-cf95f112]:hover:not(:disabled){color:#234c34;background:#e6eee8}.employee-scope-mode button[data-v-cf95f112]:focus-visible{outline-offset:2px;outline:2px solid #356448}.employee-scope-mode button[data-v-cf95f112]:disabled{opacity:.55;cursor:default}.employee-scope-rule[data-v-cf95f112]{color:#526259;margin:0 0 16px;font-size:13px}.employee-title-settings[data-v-cf95f112]{margin-top:24px}.employee-title-settings h3[data-v-cf95f112]{margin:0 0 12px;font-size:14px;font-weight:600}.employee-title-controls[data-v-cf95f112]{grid-template-columns:1.2fr 1fr;gap:12px;display:grid}.employee-title-controls .employee-picker-field[data-v-cf95f112]{min-width:0;margin-bottom:8px}.employee-title-preview[data-v-cf95f112]{color:#5a685f;overflow-wrap:anywhere;margin:4px 0 0;font-size:12px}.employee-title-preview span[data-v-cf95f112]{color:#304c3b}.employee-picker-field[data-v-cf95f112]{color:#33483c;gap:7px;margin-bottom:18px;font-size:13px;display:grid}.employee-picker-field[data-v-cf95f112] .searchable-select{width:100%}.employee-picker-field[data-v-cf95f112] .searchable-select-trigger{width:100%;min-height:42px}.employee-title-controls[data-v-cf95f112] .searchable-select-panel{box-sizing:border-box;width:100%;min-width:0}.employee-title-controls[data-v-cf95f112] .searchable-select-option-copy strong{white-space:normal;overflow-wrap:anywhere}.employee-permissions[data-v-cf95f112]{margin-top:20px;font-size:12px}.employee-permissions strong[data-v-cf95f112]{color:#33483c;font-weight:600}.employee-permissions ul[data-v-cf95f112]{flex-wrap:wrap;gap:4px 18px;margin:6px 0;padding-left:16px;display:flex}.employee-permissions p[data-v-cf95f112],.employee-muted[data-v-cf95f112]{color:#58675d;margin-top:8px;font-size:12px}.employee-runtime[data-v-cf95f112]{color:#356448;margin:20px 0 0;font-size:12px}.employee-runtime.is-warning[data-v-cf95f112]{color:#80501e}.employee-error[data-v-cf95f112]{color:#a13e37;margin-top:16px}.employee-success[data-v-cf95f112]{color:#306344;margin-top:18px}.employee-recruit-actions[data-v-cf95f112]{background:#f7f9f7;flex:none;justify-content:flex-end;align-items:center;gap:12px;padding:16px 28px;display:flex}.employee-recruit-dialog .quiet-button[data-v-cf95f112]{color:#536259;min-height:40px;font:inherit;cursor:pointer;background:0 0;border:0;border-radius:8px;padding:8px 12px;font-size:13px}.employee-recruit-dialog .quiet-button[data-v-cf95f112]:hover:not(:disabled){background:#edf2ee}.employee-recruit-dialog .quiet-button[data-v-cf95f112]:focus-visible{outline-offset:2px;outline:2px solid #356448}.employee-primary[data-v-cf95f112]{color:#fff;min-height:42px;font:inherit;cursor:pointer;background:#315c43;border:0;border-radius:9px;justify-content:center;align-items:center;padding:9px 20px;font-weight:600;text-decoration:none;display:inline-flex}.employee-primary[data-v-cf95f112]:hover:not(:disabled){background:#244b34}.employee-primary[data-v-cf95f112]:disabled{color:#59675e;cursor:default;background:#e1e7e3}.employee-primary[data-v-cf95f112]:focus-visible,.employee-recruit-dialog a[data-v-cf95f112]:focus-visible{outline-offset:3px;outline:2px solid #356448}.employee-message[data-v-cf95f112]{justify-items:start;gap:12px;display:grid}@media (width<=540px){.employee-recruit-heading[data-v-cf95f112]{padding:18px 20px}.employee-recruit-body[data-v-cf95f112]{padding:0 20px 18px}.employee-recruit-actions[data-v-cf95f112]{padding:14px 20px}.employee-recruit-actions .employee-primary[data-v-cf95f112]{flex:1}.employee-profile[data-v-cf95f112]{align-items:flex-start}.employee-profile h3 span[data-v-cf95f112]{margin:2px 0 0;display:block}.employee-title-controls[data-v-cf95f112]{grid-template-columns:minmax(0,1fr);gap:4px}}
@@ -1 +0,0 @@
1
- import{A as e,C as t,F as n,H as r,M as i,N as a,R as o,T as s,V as c,Z as l,_ as u,a as d,at as f,b as p,d as m,h,j as g,m as ee,nt as _,p as v,rt as te,v as y,w as b,x,y as ne,z as S}from"./i18n-DQH9D35M.js";import{a as C}from"./console-B7dWYAoU.js";import{t as w}from"./vue-router-F7MnkVlW.js";import{t as T}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{i as E,n as D,o as O,r as k,s as A,t as j}from"./avatars-LvVKbDF7.js";import{n as re}from"./paths-CDREouhi.js";import{t as M}from"./SearchableSelect-CFZNdtlY.js";var N={class:`project-scope-heading`},P=[`id`],F={key:0,class:`project-scope-count`,role:`status`},I=[`disabled`,`aria-expanded`,`aria-controls`,`aria-labelledby`],L={key:0,viewBox:`0 0 20 20`,width:`18`,height:`18`,"aria-hidden":`true`},R=[`id`],z={key:1,class:`project-scope-multiple`},B=[`id`,`aria-labelledby`],V=[`placeholder`,`aria-label`,`disabled`],ie={class:`project-scope-bulk`},ae={class:`project-scope-option project-scope-all`},oe=[`checked`,`indeterminate`,`disabled`],se=[`disabled`],H={class:`project-scope-list`},ce=[`value`,`checked`,`disabled`,`onChange`],U={key:0,class:`project-scope-project-id`},W={key:0,class:`project-scope-empty`},G={key:0,class:`project-scope-footer`},K={role:`status`},le={key:1,class:`project-scope-hint`},ue={key:2,class:`project-scope-hint`},de=T(s({__name:`ProjectScopePicker`,props:{modelValue:{},projects:{},disabled:{type:Boolean},inline:{type:Boolean},label:{},hint:{},emptyLabel:{},compact:{type:Boolean}},emits:[`update:modelValue`],setup(s,{emit:c}){let b=s,ne=c,C=l(null),w=l(null),T=l(null),E=l(!1),D=l(``),O=`employee-projects-${o().replace(/[^a-zA-Z0-9_-]/g,``)}`,k=u(()=>new Set(b.modelValue)),A=u(()=>b.projects.filter(e=>k.value.has(e.id)).length),j=u(()=>b.projects.length>0&&A.value===b.projects.length),re=u(()=>b.label??d(`employees.scope.label`)),M=u(()=>{let e=new Map;for(let t of b.projects)e.set(t.name,(e.get(t.name)??0)+1);return new Set([...e].filter(([,e])=>e>1).map(([e])=>e))}),de=u(()=>{let e=b.projects.find(e=>k.value.has(e.id));return e?`${e.name}${M.value.has(e.name)?` · ${e.id}`:``}`:``}),q=u(()=>j.value?d(`employees.scope.allSummary`,{count:A.value}):A.value===1?de.value:A.value?d(`employees.scope.selected`,{count:A.value}):b.emptyLabel??d(`employees.unassigned`)),J=u(()=>{let e=D.value.trim().toLocaleLowerCase();return b.projects.filter(t=>`${t.name} ${t.id}`.toLocaleLowerCase().includes(e))});S(()=>b.disabled,e=>{e&&X()}),i(()=>document.addEventListener(`pointerdown`,fe)),g(()=>document.removeEventListener(`pointerdown`,fe));async function Y(){if(!b.disabled){if(E.value){X();return}D.value=``,E.value=!0,await e(),T.value?.focus()}}function X(t=!1){E.value=!1,t&&e(()=>w.value?.focus())}function fe(e){E.value&&!C.value?.contains(e.target)&&X()}function pe(e){e.relatedTarget&&!C.value?.contains(e.relatedTarget)&&X()}function me(e){E.value&&e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),X(!0))}function Z(e){b.disabled||ne(`update:modelValue`,e)}function he(){Z(j.value?[]:b.projects.map(e=>e.id))}function ge(){Z(b.projects.filter(e=>!k.value.has(e.id)).map(e=>e.id))}function _e(e){let t=new Set(b.modelValue);t.has(e)?t.delete(e):t.add(e),Z(b.projects.filter(e=>t.has(e.id)).map(e=>e.id))}return(e,i)=>(a(),x(`div`,{ref_key:`root`,ref:C,class:te([`project-scope-picker`,{"is-inline":s.inline,"is-compact":s.compact}]),onFocusout:pe,onKeydown:me},[y(`div`,N,[y(`span`,{id:`${O}-label`,class:`project-scope-label`},f(re.value),9,P),s.inline?(a(),x(`span`,F,f(_(d)(`employees.scope.count`,{selected:A.value,total:s.projects.length})),1)):p(``,!0)]),s.inline?p(``,!0):(a(),x(`button`,{key:0,ref_key:`trigger`,ref:w,type:`button`,class:`project-scope-trigger`,disabled:s.disabled,"aria-expanded":E.value,"aria-controls":`${O}-panel`,"aria-labelledby":`${O}-label ${O}-value`,onClick:Y},[s.compact?(a(),x(`svg`,L,[...i[3]||=[y(`path`,{d:`M3 5h14M5.5 10h9M8 15h4`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.6`,"stroke-linecap":`round`},null,-1)]])):p(``,!0),y(`span`,{id:`${O}-value`,class:`project-scope-value`},f(q.value),9,R),s.compact?(a(),x(`small`,z,f(_(d)(`employees.scope.multiple`)),1)):p(``,!0),i[4]||=y(`svg`,{viewBox:`0 0 20 20`,width:`18`,height:`18`,"aria-hidden":`true`},[y(`path`,{d:`m5 7.5 5 5 5-5`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.6`,"stroke-linecap":`round`,"stroke-linejoin":`round`})],-1)],8,I)),s.inline||E.value?(a(),x(`div`,{key:1,id:`${O}-panel`,class:`project-scope-panel`,role:`group`,"aria-labelledby":`${O}-label`},[r(y(`input`,{ref_key:`search`,ref:T,"onUpdate:modelValue":i[0]||=e=>D.value=e,type:`search`,class:`project-scope-search`,placeholder:_(d)(`employees.scope.search`),"aria-label":_(d)(`employees.scope.search`),disabled:s.disabled,onKeydown:i[1]||=v(ee(()=>{},[`prevent`]),[`enter`])},null,40,V),[[m,D.value]]),y(`div`,ie,[y(`label`,ae,[y(`input`,{type:`checkbox`,checked:j.value,indeterminate:A.value>0&&!j.value,disabled:s.disabled||!s.projects.length,onChange:he},null,40,oe),y(`span`,null,[t(f(_(d)(`employees.scope.all`))+` `,1),y(`small`,null,f(s.projects.length),1)])]),y(`button`,{type:`button`,disabled:s.disabled||!s.projects.length,onClick:ge},f(_(d)(`employees.scope.invert`)),9,se)]),y(`div`,H,[(a(!0),x(h,null,n(J.value,e=>(a(),x(`label`,{key:e.id,class:te([`project-scope-option`,{"is-selected":k.value.has(e.id)}])},[y(`input`,{type:`checkbox`,value:e.id,checked:k.value.has(e.id),disabled:s.disabled,onChange:t=>_e(e.id)},null,40,ce),y(`span`,null,[t(f(e.name),1),M.value.has(e.name)?(a(),x(`small`,U,f(e.id),1)):p(``,!0)])],2))),128)),J.value.length?p(``,!0):(a(),x(`p`,W,f(_(d)(s.projects.length?`employees.scope.noMatch`:`employees.scope.empty`)),1))]),s.inline?p(``,!0):(a(),x(`div`,G,[y(`span`,K,f(_(d)(`employees.scope.count`,{selected:A.value,total:s.projects.length})),1),y(`button`,{type:`button`,onClick:i[2]||=e=>X(!0)},f(_(d)(`employees.scope.done`)),1)])),s.compact&&s.hint?(a(),x(`p`,le,f(s.hint),1)):p(``,!0)],8,B)):p(``,!0),!s.compact&&s.hint!==``?(a(),x(`p`,ue,f(s.hint??_(d)(`employees.scope.snapshotHint`)),1)):p(``,!0)],34))}}),[[`__scopeId`,`data-v-f8d66833`]]),q=[`button:not([disabled])`,`input:not([disabled]):not([type="hidden"])`,`select:not([disabled])`,`textarea:not([disabled])`,`a[href]`,`[contenteditable="true"]`,`[tabindex]:not([tabindex="-1"])`].join(`,`);function J(t,n){let r=l(null),i=l(null),a=null,o=0;S(t,n=>{let c=++o;if(n){a=document.activeElement instanceof HTMLElement?document.activeElement:null,e().then(()=>{if(c!==o||!t())return;let e=r.value;e&&(e.open||e.showModal(),(i.value??Y(e)[0])?.focus({preventScroll:!0}))});return}let l=r.value;l?.open&&l.close(),s(c)},{immediate:!0}),g(()=>{o+=1;let e=r.value;e?.open&&e.close();let t=a;a=null,t?.isConnected&&t.focus({preventScroll:!0})});function s(t){let n=a;a=null,e().then(()=>{t!==o||!n?.isConnected||n.focus({preventScroll:!0})})}function c(e){e.preventDefault(),n()}function u(e){if(e.key!==`Tab`)return;let t=r.value;if(!t)return;let n=Y(t);if(!n.length){e.preventDefault(),t.focus({preventScroll:!0});return}let i=n[0],a=n.at(-1)??i,o=document.activeElement;e.shiftKey&&(o===i||!t.contains(o))?(e.preventDefault(),a.focus({preventScroll:!0})):!e.shiftKey&&(o===a||!t.contains(o))&&(e.preventDefault(),i.focus({preventScroll:!0}))}return{dialogRef:r,initialFocusRef:i,onCancel:c,onKeydown:u}}function Y(e){return[...e.querySelectorAll(q)].filter(e=>!e.hidden&&e.getAttribute(`aria-hidden`)!==`true`)}var X={class:`employee-recruit-heading`},fe={id:`employee-recruit-title`},pe=[`disabled`],me={key:0,role:`status`},Z={key:1,role:`alert`,class:`employee-message`},he={key:2},ge={class:`employee-recruit-body`},_e={key:0,class:`employee-picker-field`},ve={class:`employee-profile`},ye={class:`employee-avatar`,"aria-hidden":`true`},be=[`src`],xe={class:`employee-specialties`},Se={key:1,class:`employee-muted`,role:`status`},Ce=[`aria-label`],we=[`data-scope`,`aria-checked`,`tabindex`,`disabled`,`onClick`],Te={key:3,class:`employee-scope-rule`,role:`status`},Ee={key:4,class:`employee-muted`},De={key:5,class:`employee-muted`},Oe={key:6,class:`employee-muted`},ke=[`aria-label`],Ae={class:`employee-title-controls`},je={class:`employee-picker-field`},Me={class:`employee-picker-field`},Ne={class:`employee-title-preview`},Pe={class:`employee-muted`},Fe=[`aria-label`],Ie={key:9,class:`employee-error`,role:`alert`},Le=[`disabled`],Re={key:11,class:`employee-success`,role:`status`},ze={class:`employee-recruit-actions`},Be=[`disabled`],Ve=[`disabled`],He=T(s({__name:`EmployeeRecruitDialog`,props:{open:{type:Boolean},personalSpaceId:{},projects:{},defaultProjectId:{},defaultProjectIds:{},templateId:{}},emits:[`close`,`recruited`],setup(e,{emit:r}){let i=e,o=r,s=l([]),m=l([]),g=l(`selected`),v=l([]),T=l(`auto`),N=l(`emoji`),P=l(``),F=l(``),I=l(!1),L=l(!1),R=l(``),z=l(!1),B=l(``),V=l(null),{dialogRef:ie,initialFocusRef:ae,onCancel:oe,onKeydown:se}=J(()=>i.open,$),H=u(()=>i.templateId?O.value.find(e=>e.id===i.templateId):O.value.find(e=>e.id===R.value)??O.value[0]),ce=u(()=>H.value?.agentId?d(`employees.manageProjectsTitle`,{name:H.value.name}):d(`employees.recruit`)),U=u(()=>i.projects.filter(e=>e.profile.lifecycle!==`archived`).map(e=>({id:e.project_id,name:e.profile.name}))),W=u(()=>H.value?.management!==void 0),G=u({get:()=>g.value===`all`?U.value.filter(e=>!v.value.includes(e.id)).map(e=>e.id):s.value,set:e=>{if(g.value===`all`){let t=new Set(U.value.map(e=>e.id));v.value=[...v.value.filter(e=>!t.has(e)),...U.value.filter(t=>!e.includes(t.id)).map(e=>e.id)]}else s.value=e}}),K=u(()=>({mode:g.value,projectIds:g.value===`selected`?[...s.value].sort():[],excludedProjectIds:g.value===`all`?[...v.value].sort():[],titleMode:T.value,titleStyle:N.value})),le=u(()=>[`auto`,`suggest`,`off`].map(e=>({value:e,label:d(`employees.titles.${e}`)}))),ue=u(()=>[`emoji`,`text`].map(e=>({value:e,label:d(`employees.titles.${e}`)}))),q=u(()=>new Set(m.value)),Y=u(()=>[...q.value].filter(e=>!G.value.includes(e))),He=u(()=>!!(H.value?.agentStatus&&H.value.agentStatus!==`active`)),Q=u(()=>H.value?.agentStatus===`active`&&(W.value?JSON.stringify(K.value)===P.value&&(g.value===`all`||s.value.length===q.value.size&&s.value.every(e=>q.value.has(e))):s.value.length===q.value.size&&s.value.every(e=>q.value.has(e)))),Ue=u(()=>z.value?d(`employees.recruiting`):He.value?d(`employees.rehire`,{name:H.value?.name??``}):Q.value||H.value?.agentId?d(`employees.assign`):d(`employees.recruitName`,{name:H.value?.name??``})),We=u(()=>H.value&&G.value.length?`/employees/${encodeURIComponent(H.value.id)}?project=${encodeURIComponent(G.value[0])}`:``),Ge=0;S([()=>i.open,()=>i.personalSpaceId,()=>i.templateId],([e])=>{Ge+=1,e&&qe(!0)},{immediate:!0}),S(R,()=>{i.open&&!I.value&&Ke(!0)}),S(K,()=>{B.value=L.value?B.value:``,V.value=null},{flush:`sync`});function Ke(e=!1){let t=new Set(U.value.map(e=>e.id));m.value=[...new Set((H.value?.assignments??[]).filter(e=>e.status===`active`&&t.has(e.personalProjectId)).map(e=>e.personalProjectId))];let n=e&&!H.value?.agentId?i.defaultProjectIds??(i.defaultProjectId?[i.defaultProjectId]:[]):[];s.value=[...new Set([...m.value,...n.filter(e=>t.has(e))])];let r=H.value?.management;g.value=r?.mode??`selected`,v.value=[...r?.excludedProjectIds??[]],T.value=r?.titleMode??`auto`,N.value=r?.titleStyle??`emoji`,r?.mode===`selected`&&H.value?.agentId&&(s.value=r.projectIds.filter(e=>t.has(e))),r?.mode===`all`&&H.value?.agentId&&(m.value=[...G.value]),P.value=JSON.stringify(K.value),F.value=H.value?.assignmentsVersion??``,L.value=!1,B.value=``,V.value=null}async function qe(e=!1){let t=++Ge;I.value=!0,await A(i.personalSpaceId),!(t!==Ge||!i.open)&&(D.value||Ke(e),I.value=!1)}function $(){z.value||o(`close`)}async function Je(){if(!H.value||H.value.identityConflict||!i.personalSpaceId||z.value||I.value||L.value||!F.value||Q.value)return;z.value=!0,B.value=``;let e=H.value.id;try{let t=await C(`/api/employee-templates/${encodeURIComponent(e)}/recruit`,{personalSpaceId:i.personalSpaceId,...W.value?{management:K.value}:{personalProjectIds:[...s.value]},replaceAssignments:!0,expectedAssignmentsVersion:F.value,...He.value?{reactivate:!0}:{}});await A(i.personalSpaceId),Ke(),V.value=t,o(`recruited`,t)}catch(e){B.value=E(e);try{let t=JSON.parse(e instanceof Error?e.message:``);L.value=t.code===`assignment_scope_conflict`||t.code===`assignment_update_incomplete`}catch{}}finally{z.value=!1}}function Ye(e){e===`selected`&&(s.value=[...G.value]),g.value=e}function Xe(e){if(!(z.value||I.value||L.value)&&[`ArrowLeft`,`ArrowRight`,`Home`,`End`].includes(e.key)){e.preventDefault();let t=e.key===`Home`?`all`:e.key===`End`||g.value===`all`?`selected`:`all`;Ye(t),e.currentTarget.querySelector(`[data-scope="${t}"]`)?.focus()}}return(r,o)=>e.open?(a(),x(`dialog`,{key:0,ref_key:`dialogRef`,ref:ie,class:`employee-recruit-dialog`,"aria-modal":`true`,"aria-labelledby":`employee-recruit-title`,onCancel:o[6]||=(...e)=>_(oe)&&_(oe)(...e),onKeydown:o[7]||=(...e)=>_(se)&&_(se)(...e)},[y(`header`,X,[y(`h2`,fe,f(ce.value),1),y(`button`,{ref_key:`initialFocusRef`,ref:ae,type:`button`,class:`quiet-button`,disabled:z.value,onClick:$},f(_(d)(`employees.close`)),9,pe)]),_(k)&&!_(O).length?(a(),x(`p`,me,f(_(d)(`employees.loading`)),1)):_(D)?(a(),x(`div`,Z,[y(`p`,null,f(_(D)),1),y(`button`,{class:`quiet-button`,type:`button`,onClick:o[0]||=e=>qe(!0)},f(_(d)(`employees.retry`)),1)])):H.value?(a(),x(`form`,{key:3,onSubmit:ee(Je,[`prevent`])},[y(`div`,ge,[_(O).length>1&&!i.templateId?(a(),x(`div`,_e,[y(`span`,null,f(_(d)(`employees.choose`)),1),b(M,{modelValue:R.value,"onUpdate:modelValue":o[1]||=e=>R.value=e,"control-id":`employee-template`,label:_(d)(`employees.choose`),options:_(O).map(e=>({value:e.id,label:e.name,meta:e.role})),disabled:z.value||I.value},null,8,[`modelValue`,`label`,`options`,`disabled`])])):p(``,!0),y(`div`,ve,[y(`span`,ye,[_(j)(H.value.id)?(a(),x(`img`,{key:0,src:_(j)(H.value.id),alt:``},null,8,be)):(a(),x(h,{key:1},[t(f(H.value.name.slice(0,1)),1)],64))]),y(`div`,null,[y(`h3`,null,[t(f(H.value.name)+` `,1),y(`span`,null,f(H.value.role),1)]),y(`p`,null,f(H.value.description),1)])]),y(`p`,xe,f(H.value.capabilities.join(` · `)),1),I.value?(a(),x(`p`,Se,f(_(d)(`employees.loadingScope`)),1)):p(``,!0),W.value?(a(),x(`div`,{key:2,class:`employee-scope-mode`,role:`radiogroup`,"aria-label":_(d)(`employees.scope.rule`),onKeydown:Xe},[(a(),x(h,null,n([`all`,`selected`],e=>y(`button`,{key:e,type:`button`,role:`radio`,"data-scope":e,"aria-checked":g.value===e,tabindex:g.value===e?0:-1,disabled:z.value||I.value||L.value,onClick:t=>Ye(e)},f(_(d)(`employees.scope.${e===`all`?`continuousAll`:`onlySelected`}`)),9,we)),64))],40,Ce)):p(``,!0),W.value?(a(),x(`p`,Te,f(g.value===`all`?_(d)(`employees.scope.allHint`,{name:H.value.name}):_(d)(`employees.scope.selectedHint`)),1)):p(``,!0),b(de,{modelValue:G.value,"onUpdate:modelValue":o[2]||=e=>G.value=e,projects:U.value,inline:``,hint:g.value===`all`?_(d)(`employees.scope.excludeHint`):void 0,disabled:z.value||I.value||L.value},null,8,[`modelValue`,`projects`,`hint`,`disabled`]),g.value===`all`&&v.value.length?(a(),x(`p`,Ee,f(_(d)(`employees.scope.excludedCount`,{count:v.value.length})),1)):p(``,!0),U.value.length?p(``,!0):(a(),x(`p`,De,[t(f(_(d)(`employees.noProjects`))+` `,1),b(_(w),{to:_(re)(e.personalSpaceId,`directory`),onClick:$},{default:c(()=>[t(f(_(d)(`employees.createProject`)),1)]),_:1},8,[`to`])])),Y.value.length&&!V.value?(a(),x(`p`,Oe,f(_(d)(`employees.scopeRemoved`,{count:Y.value.length})),1)):p(``,!0),W.value&&H.value.permissions.includes(`session.title`)?(a(),x(`section`,{key:7,class:`employee-title-settings`,"aria-label":_(d)(`employees.titles.heading`)},[y(`h3`,null,f(_(d)(`employees.titles.heading`)),1),y(`div`,Ae,[y(`div`,je,[y(`span`,null,f(_(d)(`employees.titles.mode`)),1),b(M,{modelValue:T.value,"onUpdate:modelValue":o[3]||=e=>T.value=e,"control-id":`employee-title-mode`,label:_(d)(`employees.titles.mode`),options:le.value,disabled:z.value||I.value||L.value},null,8,[`modelValue`,`label`,`options`,`disabled`])]),y(`div`,Me,[y(`span`,null,f(_(d)(`employees.titles.style`)),1),b(M,{modelValue:N.value,"onUpdate:modelValue":o[4]||=e=>N.value=e,"control-id":`employee-title-style`,label:_(d)(`employees.titles.style`),options:ue.value,disabled:z.value||I.value||L.value||T.value===`off`},null,8,[`modelValue`,`label`,`options`,`disabled`])])]),y(`p`,Ne,[t(f(_(d)(`employees.titles.example`))+` `,1),y(`span`,null,`【P1|`+f(N.value===`emoji`?`🔧 `:``)+`FIX|`+f(_(d)(`employees.titles.exampleTask`))+`】`,1)]),y(`p`,Pe,f(_(d)(`employees.titles.boundary`)),1)],8,ke)):p(``,!0),y(`section`,{class:`employee-permissions`,"aria-label":_(d)(`employees.permissions`)},[y(`strong`,null,f(_(d)(`employees.permissions`)),1),y(`ul`,null,[(a(!0),x(h,null,n(H.value.permissions,e=>(a(),x(`li`,{key:e},f(e===`board.read`?_(d)(`employees.boardRead`):e===`board.write`?_(d)(`employees.boardWrite`):e===`session.title`?_(d)(`employees.titles.heading`):e),1))),128))]),y(`p`,null,f(_(d)(`employees.noExecutor`)),1)],8,Fe),H.value.runtime?(a(),x(`p`,{key:8,class:te([`employee-runtime`,{"is-warning":H.value.runtimeStatus!==`ready`}])},f(H.value.runtimeStatus===`ready`?_(d)(`employees.hostReady`):_(d)(`employees.installRequired`)),3)):p(``,!0),B.value||H.value.identityConflict?(a(),x(`p`,Ie,f(B.value||_(d)(`employees.errors.identity_conflict`)),1)):p(``,!0),L.value?(a(),x(`button`,{key:10,type:`button`,class:`quiet-button`,disabled:I.value,onClick:o[5]||=e=>qe()},f(_(d)(`employees.reloadScope`)),9,Le)):p(``,!0),V.value?(a(),x(`div`,Re,[y(`strong`,null,f(_(d)(`employees.scopeSaved`)),1),y(`p`,null,f(g.value===`all`?_(d)(`employees.scope.successAll`,{count:G.value.length}):G.value.length?_(d)(`employees.successMultiple`,{count:G.value.length}):_(d)(`employees.successUnassigned`)),1)])):p(``,!0)]),y(`footer`,ze,[y(`button`,{class:`quiet-button`,type:`button`,disabled:z.value,onClick:$},f(_(d)(`employees.cancel`)),9,Be),Q.value&&We.value&&!z.value&&!I.value&&!L.value&&H.value.runtimeStatus===`ready`?(a(),ne(_(w),{key:0,class:`employee-primary`,to:We.value,onClick:$},{default:c(()=>[t(f(_(d)(`employees.open`)),1)]),_:1},8,[`to`])):(a(),x(`button`,{key:1,class:`employee-primary`,type:`submit`,disabled:z.value||I.value||L.value||!F.value||Q.value||H.value.identityConflict||!e.personalSpaceId},f(Ue.value),9,Ve))])],32)):(a(),x(`p`,he,f(_(d)(`employees.noTemplates`)),1))],544)):p(``,!0)}}),[[`__scopeId`,`data-v-cf95f112`]]);export{J as n,de as r,He as t};