fuli-context 0.7.5 → 0.7.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 (148) hide show
  1. package/README.md +69 -13
  2. package/README.zh-CN.md +60 -14
  3. package/dist/web/assets/{AboutPage-ByCUor-j.js → AboutPage-BcZeFcHe.js} +1 -1
  4. package/dist/web/assets/{ConnectionsPage-DkdkZ40Q.js → ConnectionsPage-xAQYl1SQ.js} +1 -1
  5. package/dist/web/assets/EmployeeRecruitDialog-CbPAmhy7.js +1 -0
  6. package/dist/web/assets/EmployeeRecruitDialog-CfFlyKSh.css +1 -0
  7. package/dist/web/assets/EmployeeWorkbenchPage-BQvTLoc8.css +1 -0
  8. package/dist/web/assets/EmployeeWorkbenchPage-DF3EL0Ui.js +1 -0
  9. package/dist/web/assets/KnowledgeEditDialog-UnnBDt0I.js +1 -0
  10. package/dist/web/assets/{KnowledgeEditDialog-DWUV_NPp.css → KnowledgeEditDialog-iv-dgUeD.css} +1 -1
  11. package/dist/web/assets/{KnowledgeInspector-CYAjAb9J.js → KnowledgeInspector-BqPJH5Rr.js} +1 -1
  12. package/dist/web/assets/{KnowledgeOrganizerPage-CV4F54R_.js → KnowledgeOrganizerPage-CyvRflXM.js} +1 -1
  13. package/dist/web/assets/KnowledgePage-59eczTqe.js +1 -0
  14. package/dist/web/assets/{KnowledgeWorkspace-z4u5mXOG.js → KnowledgeWorkspace-CfIjhOog.js} +1 -1
  15. package/dist/web/assets/{OverviewPage-BWOfeS6k.js → OverviewPage-Xyfm5xkZ.js} +1 -1
  16. package/dist/web/assets/{PersonalProfilePage-c3w4-h7a.js → PersonalProfilePage-DB9mByB3.js} +1 -1
  17. package/dist/web/assets/PersonalProjectsPage-_-YXVi5O.js +1 -0
  18. package/dist/web/assets/ProjectAgentsPage-C3vW6wmk.css +1 -0
  19. package/dist/web/assets/ProjectAgentsPage-DeeQByPX.js +11 -0
  20. package/dist/web/assets/{PublicProjectsPage-DdH0oGB3.js → PublicProjectsPage-BEZ1YPs3.js} +1 -1
  21. package/dist/web/assets/{ReviewPage-BYIpcIHG.js → ReviewPage-CQYGwFBH.js} +1 -1
  22. package/dist/web/assets/SearchableSelect-D27H0MoP.js +1 -0
  23. package/dist/web/assets/{SettingsPage-2VkbXgZi.js → SettingsPage-BlEZ03Yi.js} +1 -1
  24. package/dist/web/assets/{WritingTastePage-BOPQZuva.js → WritingTastePage-DvRt_nmP.js} +1 -1
  25. package/dist/web/assets/catalog-DFvIaHVS.js +1 -0
  26. package/dist/web/assets/{console-BlAhujsH.js → console-tOxOl8Vq.js} +1 -1
  27. package/dist/web/assets/conversation-launcher-settings-DuFSpPAo.js +1 -0
  28. package/dist/web/assets/{i18n-Ci3heuiL.js → i18n-CgBHZthI.js} +3 -3
  29. package/dist/web/assets/{identity-4_-v6cB7.js → identity-CFo_Uw1H.js} +1 -1
  30. package/dist/web/assets/index-CJc5ppXH.css +1 -0
  31. package/dist/web/assets/index-yCi3cz2l.js +2 -0
  32. package/dist/web/assets/{model-yG0YqUyZ.js → model-BtnVr7fX.js} +1 -1
  33. package/dist/web/assets/{useApi-CROJJdhE-twhdZArA.js → useApi-CROJJdhE-B6MHm_Av.js} +1 -1
  34. package/dist/web/assets/{vue-router-C-wot_Di.js → vue-router-CzHm-y-x.js} +1 -1
  35. package/dist/web/index.html +7 -6
  36. package/docs/employee-agents.md +99 -0
  37. package/docs/project-agent-memory.md +479 -0
  38. package/graph-provider/fuli_graph/knowledge_audit_models.py +171 -0
  39. package/graph-provider/fuli_graph/model_base.py +5 -0
  40. package/graph-provider/fuli_graph/model_validation.py +32 -0
  41. package/graph-provider/fuli_graph/models.py +26 -170
  42. package/graph-provider/fuli_graph/project_agent_context_models.py +29 -0
  43. package/graph-provider/fuli_graph/project_agent_coordination_models.py +22 -0
  44. package/graph-provider/fuli_graph/project_agent_executor_models.py +35 -7
  45. package/graph-provider/fuli_graph/project_agent_memory_models.py +79 -0
  46. package/graph-provider/fuli_graph/project_agent_memory_routes.py +46 -0
  47. package/graph-provider/fuli_graph/project_agent_models.py +9 -0
  48. package/graph-provider/fuli_graph/project_agent_recruitment_values.py +48 -0
  49. package/graph-provider/fuli_graph/project_agent_routes.py +50 -1
  50. package/graph-provider/fuli_graph/project_agent_task_models.py +220 -29
  51. package/graph-provider/fuli_graph/runtime.py +37 -1
  52. package/graph-provider/fuli_graph/store.py +6 -0
  53. package/graph-provider/fuli_graph/store_project_agent_context.py +65 -0
  54. package/graph-provider/fuli_graph/store_project_agent_coordination_policy.py +122 -0
  55. package/graph-provider/fuli_graph/store_project_agent_executor_learning.py +175 -11
  56. package/graph-provider/fuli_graph/store_project_agent_executor_routing.py +33 -10
  57. package/graph-provider/fuli_graph/store_project_agent_executors.py +181 -14
  58. package/graph-provider/fuli_graph/store_project_agent_memory.py +174 -0
  59. package/graph-provider/fuli_graph/store_project_agent_task_activity.py +423 -0
  60. package/graph-provider/fuli_graph/store_project_agent_task_persistence.py +152 -0
  61. package/graph-provider/fuli_graph/store_project_agent_task_reads.py +187 -21
  62. package/graph-provider/fuli_graph/store_project_agent_task_recruitment.py +756 -164
  63. package/graph-provider/fuli_graph/store_project_agent_task_staffing.py +396 -7
  64. package/graph-provider/fuli_graph/store_project_agent_tasks.py +265 -465
  65. package/graph-provider/fuli_graph/store_project_agents.py +214 -46
  66. package/graph-provider/fuli_graph/store_task_contexts.py +217 -0
  67. package/graph-provider/fuli_graph/store_transactions.py +40 -0
  68. package/graph-provider/fuli_graph/task_context_models.py +50 -0
  69. package/graph-provider/fuli_graph/task_context_routes.py +31 -0
  70. package/graph-provider/fuli_graph/workflow_observation_models.py +1 -1
  71. package/graph-provider/pyproject.toml +1 -1
  72. package/npm-shrinkwrap.json +8 -8
  73. package/package.json +5 -2
  74. package/skills/capturing-session-knowledge/SKILL.md +18 -6
  75. package/src/adaptive-runtime/executor-pool.js +46 -5
  76. package/src/adaptive-runtime/graph-services.js +10 -3
  77. package/src/adaptive-runtime/lease-client.js +66 -14
  78. package/src/adaptive-runtime/runtime-broker.js +24 -9
  79. package/src/agent-tools/employee-definitions.js +43 -0
  80. package/src/agent-tools/graph-definitions.js +48 -6
  81. package/src/agent-tools/graph-handlers.js +15 -0
  82. package/src/agent-tools/project-agent-definitions.js +35 -4
  83. package/src/agent-tools/project-agent-memory-definitions.js +36 -0
  84. package/src/agent-tools.js +6 -2
  85. package/src/agents/codex/lifecycle-hook.js +107 -0
  86. package/src/agents/codex/lifecycle-hooks.js +231 -0
  87. package/src/agents/cursor/lifecycle-hook.js +133 -0
  88. package/src/agents/cursor/lifecycle-hooks.js +50 -0
  89. package/src/agents/lifecycle-message.js +19 -0
  90. package/src/app/agent-request-context.js +23 -0
  91. package/src/cli/command-registry.js +2 -0
  92. package/src/cli/employee-command.js +17 -0
  93. package/src/cli/remote-mcp-command.js +282 -0
  94. package/src/cli/setup-command.js +5 -0
  95. package/src/cli.js +10 -0
  96. package/src/employees/catalog/jefa.json +21 -0
  97. package/src/employees/install-package.js +77 -0
  98. package/src/employees/management-policy.js +88 -0
  99. package/src/employees/manifest.js +53 -0
  100. package/src/employees/package-registry.js +107 -0
  101. package/src/employees/project-selection.js +50 -0
  102. package/src/employees/recruitment.js +199 -0
  103. package/src/employees/service.js +83 -0
  104. package/src/employees/task-entry.js +39 -0
  105. package/src/graphiti/agent-knowledge-workflows.js +135 -25
  106. package/src/graphiti/federated-application.js +78 -35
  107. package/src/graphiti/project-agent-control-plane.js +32 -3
  108. package/src/graphiti/project-agent-mapping.js +175 -4
  109. package/src/graphiti/project-agent-memory.js +115 -0
  110. package/src/graphiti/project-agent-task-entry.js +126 -0
  111. package/src/graphiti/project-agent-workflows.js +49 -14
  112. package/src/graphiti/provider-client.js +78 -4
  113. package/src/http/api-router.js +25 -5
  114. package/src/http/employee-api-router.js +64 -0
  115. package/src/http/error-mapping.js +4 -0
  116. package/src/http/graph-api-router.js +14 -0
  117. package/src/http/request-policy.js +6 -3
  118. package/src/http/static-handler.js +4 -3
  119. package/src/mcp/create-mcp-server.js +98 -37
  120. package/src/mcp/direct-call.js +38 -0
  121. package/src/mcp/instructions.js +8 -7
  122. package/src/mcp/provider-task-context-registry.js +74 -0
  123. package/src/mcp/remote-http-server.js +761 -0
  124. package/src/mcp/session-id.js +29 -3
  125. package/src/mcp/task-context-registry.js +88 -29
  126. package/src/mcp/tool-annotations.js +12 -2
  127. package/src/mcp/tool-result.js +8 -3
  128. package/src/mcp-server.js +20 -8
  129. package/src/native-runtime/runtime.js +58 -8
  130. package/src/server.js +76 -28
  131. package/src/setup/agent-installation-status.js +38 -6
  132. package/src/setup/agents.js +20 -8
  133. package/src/setup/claude-code-config.js +55 -13
  134. package/src/setup/codex-bootstrap.js +11 -10
  135. package/src/setup/codex-config.js +74 -7
  136. package/src/setup/config-backup.js +18 -2
  137. package/src/setup/cursor-config.js +22 -5
  138. package/src/setup/setup.js +30 -22
  139. package/src/storage/json-file.js +11 -3
  140. package/dist/web/assets/KnowledgeEditDialog-DSe3Gwep.js +0 -1
  141. package/dist/web/assets/KnowledgePage-vYYXipOi.js +0 -1
  142. package/dist/web/assets/PersonalProjectsPage-B7AlLEwf.js +0 -1
  143. package/dist/web/assets/ProjectAgentsPage-CgftpIPB.css +0 -1
  144. package/dist/web/assets/ProjectAgentsPage-DTHcL_ox.js +0 -11
  145. package/dist/web/assets/SearchableSelect-Dz13ClQb.js +0 -1
  146. package/dist/web/assets/conversation-launcher-settings-DTYxiLJt.js +0 -1
  147. package/dist/web/assets/index-BnH5mcZx.css +0 -1
  148. package/dist/web/assets/index-C67Q0JY2.js +0 -2
package/README.md CHANGED
@@ -190,8 +190,10 @@ select the project first.
190
190
  ### Which tool the Agent calls and when
191
191
 
192
192
  Normal use does not require manual MCP calls: submit a task to the Agent from the project directory.
193
- The Claude Code hook calls `begin_task_context`; Codex and Cursor prompt fallback call the following
194
- once at the start of each task:
193
+ Fuli includes lifecycle adapters for Claude Code, Codex, and Cursor. When a loaded, trusted entry
194
+ hook supplies `begin_task_context` context, use it without repeating the fallback. Cursor's adapter
195
+ starts the durable task through a hook but relies on the Agent to retrieve preferences and role
196
+ context. When no hook context was supplied, call the following once at task entry:
195
197
 
196
198
  ```json
197
199
  {
@@ -264,10 +266,10 @@ sequenceDiagram
264
266
  participant G as Local graph
265
267
 
266
268
  U->>A: Submit a task in the current project
267
- alt Claude Code (hook-enforced)
269
+ alt Claude Code / Codex (hook context supplied)
268
270
  L->>F: begin_task_context(projectPath, taskPrompt)
269
271
  F-->>A: Preferences, exact project, bounded recall, and task token
270
- else Codex / Cursor (prompt fallback)
272
+ else No hook context (prompt fallback, including Cursor)
271
273
  A->>F: get_collaboration_preferences(projectPath, taskPrompt)
272
274
  F-->>A: Preferences, exact project, and bounded recall
273
275
  end
@@ -293,11 +295,11 @@ sequenceDiagram
293
295
  F-->>A: retain_nothing
294
296
  end
295
297
 
296
- alt Claude Code Stop hook
298
+ alt Loaded and trusted Claude Code / Codex Stop hook
297
299
  L->>F: verify_task_checkpoint
298
300
  F-->>L: Allow stop only after review
299
- else Prompt-fallback agent
300
- Note over A,F: Same contract, but the host cannot deterministically block a missed review
301
+ else Cursor reminder or prompt-fallback agent
302
+ Note over A,F: Same contract; a bounded reminder is not an unconditional Stop gate
301
303
  end
302
304
  A-->>U: Return the result and any Fuli sources actually used
303
305
  ```
@@ -392,7 +394,7 @@ Core mechanisms covered by implementation and automated tests include:
392
394
  - a local personal space, exact project scope, and selective parent inheritance;
393
395
  - preference confirmation, deferred conflict resolution, revision history, and source markers;
394
396
  - bounded task-prompt recall, focused on-demand retrieval, and material-usage auditing;
395
- - task entry and completion checkpoints, plus Claude Code entry and Stop hooks;
397
+ - task entry and completion checkpoints, plus local Claude Code, Codex, and Cursor lifecycle adapters;
396
398
  - decision options, rationale, and validation results supplied during initial capture;
397
399
  - knowledge-usage events, negative feedback, and content-generation isolation;
398
400
  - persistent scoped knowledge reviews with pause/resume watermarks;
@@ -407,8 +409,10 @@ The following must not be presented as already proven:
407
409
  production data;
408
410
  - the decision tool can include validation during initial capture, but it does not yet expose a
409
411
  dedicated operation for appending immutable validation results to an existing `Decision`;
410
- - Claude Code has deterministic lifecycle hooks; Codex and Cursor currently use prompt fallback and
411
- must not be described as equally enforced;
412
+ - Installed files do not prove host loading, trust, or execution. Claude Code and Codex adapters
413
+ generate entry/Stop hook configuration; Codex trust review remains a user action. Cursor uses
414
+ task-entry hooks and bounded Stop reminders, not an equivalent unconditional Stop gate. Ordinary
415
+ input in each real client still requires live acceptance;
412
416
  - selected public projects in connected retrieval are Beta; external-to-public promotion and
413
417
  background delta synchronization are not implemented.
414
418
 
@@ -550,7 +554,15 @@ containers; it does not shut down Rancher Desktop, Docker Desktop, Kubernetes, o
550
554
  itself. Native mode directly stops the corresponding Provider and Neo4j processes, so no shared VM
551
555
  overhead remains while idle.
552
556
 
557
+ **Project Agents → Recruit employee** provides reusable employee templates, starting with Jefa, a project manager.
558
+ Recruitment reuses a durable identity with separate project assignments. An installed employee workbench,
559
+ API and A2A share the FULI port; existing FULI MCP clients discover and call its tools. Recruitment does not
560
+ start a model or rewrite client settings. See the [employee package and extension contract](docs/employee-agents.md).
561
+
553
562
  Project Agent identities remain control-plane records rather than one resident process per identity.
563
+ Roles now keep versioned, project-private working memory in the same Neo4j Provider. Task entry
564
+ restores one owner across Codex, Claude Code and Cursor; lifecycle checkpoints survive separate
565
+ MCP processes. See [role memory, host hooks and acceptance boundaries](docs/project-agent-memory.md).
554
566
  Physical executors share leases by executor ID. Fuli starts and stops only executors with an explicitly
555
567
  injected managed lifecycle adapter; host-owned external executors such as Codex are never started or
556
568
  killed implicitly. The current minimum-memory combination is:
@@ -613,14 +625,58 @@ Fuli installs the `capturing-session-knowledge`, `grilling-project`, and `flrevi
613
625
  supported agents. `/flreview` asks FULI for ranked candidates, then the invoking Agent generates a
614
626
  fresh interactive review artifact. FULI remains the durable source of truth and write surface; no
615
627
  permanent review tab or one-question-at-a-time chat flow is required.
616
- Claude Code uses `UserPromptSubmit` and `Stop` hooks for the task lifecycle. Codex's user-level
617
- `AGENTS.md` and Cursor instructions use prompt fallback. Preference content remains in local Fuli as
618
- the single source of truth and is not copied into agent configuration.
628
+ Fuli setup generates Claude Code `UserPromptSubmit`/`Stop` MCP hooks, a Codex
629
+ `UserPromptSubmit` MCP hook plus a local `Stop` command, and Cursor
630
+ `sessionStart`/`beforeSubmitPrompt`/`stop` hooks. The Codex Stop command first blocks an unfinished
631
+ checkpoint; if the same token is still unfinished after one continuation, it records only
632
+ `retain_nothing` to prevent an infinite loop and never invents knowledge or Agent memory. Codex
633
+ bootstrap and Cursor instructions retain the fallback for tasks without supplied lifecycle context;
634
+ they must not duplicate supplied preferences. Installing configuration never approves host trust.
635
+ Preference content remains in local Fuli as the single source of truth and is not copied into agent
636
+ configuration.
619
637
 
620
638
  FULI also exposes read-only `fuli://` resources for each local personal project and for global taste.
621
639
  Agents with MCP mention support can select them from the `@` picker; a project resource selects one
622
640
  exact project and never expands the search to other projects or `RELATED_TO` projects.
623
641
 
642
+ ### Remote Claude / Cowork connector upstream
643
+
644
+ `fuli remote-mcp` serves a least-privilege Streamable HTTP MCP endpoint bound to one exact personal
645
+ project. It uses the distinct `claude` client attribution, requires an owner-only bearer-token file,
646
+ rejects cross-origin requests, and listens on loopback only:
647
+
648
+ ```bash
649
+ umask 077
650
+ openssl rand -hex 32 > ./fuli-remote.token
651
+ fuli remote-mcp --personal-project-id YOUR_PROJECT_ID \
652
+ --bearer-token-file ./fuli-remote.token --port 2728
653
+ ```
654
+
655
+ On POSIX systems the CLI opens the token nonblocking with no-follow semantics and requires mode
656
+ `0600`. Windows does not provide the same `O_NOFOLLOW` or POSIX mode guarantees through Node.js, so
657
+ the token must be a regular file in a directory protected by Windows ACLs and must not be a link.
658
+
659
+ Startup fails closed unless the project exists in the configured personal space. The upstream
660
+ allows at most eight concurrent sessions and evicts sessions idle for 15 minutes; tune those bounds
661
+ with `--max-sessions` and `--session-idle-ttl-seconds` when needed. Idle means no completed MCP
662
+ application request: a silent standalone SSE notification stream does not pin a slot forever and
663
+ may be closed at the TTL, after which the client must reconnect and initialize a new session.
664
+ Shutdown gives bounded requests and session cleanup one shared grace deadline before forcing the
665
+ remaining HTTP connections closed. When a reverse proxy supplies a
666
+ browser Origin or preserves its public Host, add the exact values with
667
+ `--allowed-origin https://connector.example --allowed-host connector.example`. Otherwise configure
668
+ the proxy to rewrite Host to the loopback upstream authority. Arbitrary Origin and Host values are
669
+ rejected. Each MCP session may read private context and memory only for the Agent selected by its
670
+ task entry. A checkpoint token is also bound to both the upstream's configured project and the MCP
671
+ session that created it, so neither another project process nor a peer session can reuse it.
672
+
673
+ This is an internal upstream, not a public deployment. Claude custom connectors originate from
674
+ Anthropic's cloud and therefore require a public HTTPS endpoint with OAuth 2.1 in front of this
675
+ listener. The proxy must validate user identity, token audience and scopes, then replace the external
676
+ token with the internal bearer; never expose the Fuli Provider or Neo4j ports. Local lifecycle hooks
677
+ do not run in claude.ai, so the MCP initialization instructions request task entry and checkpointing,
678
+ but only a real connected Claude conversation can prove that behavior.
679
+
624
680
  When a task needs a taste or judgment recommendation, `get_user_taste_skill` generates a bounded,
625
681
  read-only `user-taste` Skill projection from the effective personal profile and prior task data.
626
682
  The projection labels evidence status and scope, returns task-matched recommendations, and is
package/README.zh-CN.md CHANGED
@@ -163,8 +163,10 @@ Fuli 只匹配已经登记在“个人项目”中的稳定 `project_id`,不
163
163
 
164
164
  ### Agent 什么时候调用什么
165
165
 
166
- 正常使用时,不需要手工调用 MCP 工具:在项目目录中向 Agent 提任务即可。Claude Code Hook
167
- 调用 `begin_task_context`;Codex 和 Cursor 的 Prompt fallback 在每个任务开始调用一次:
166
+ 正常使用时,不需要手工调用 MCP 工具:在项目目录中向 Agent 提任务即可。Fuli 已有 Claude
167
+ Code、Codex 和 Cursor 生命周期适配器。已加载、获信任的入口 Hook 提供 `begin_task_context`
168
+ 上下文时,直接使用,不重复 fallback。Cursor 的 Hook 建立持久任务,但偏好与角色上下文
169
+ 仍由 Agent 取回。没有收到 Hook 上下文时,在每个任务开始调用一次:
168
170
 
169
171
  ```json
170
172
  {
@@ -233,10 +235,10 @@ sequenceDiagram
233
235
  participant G as 本地图谱
234
236
 
235
237
  U->>A: 在当前项目提交任务
236
- alt Claude Code(Hook 强制)
238
+ alt Claude Code / Codex(已提供 Hook 上下文)
237
239
  L->>F: begin_task_context(projectPath, taskPrompt)
238
240
  F-->>A: 生效偏好、精确项目、有界召回和任务令牌
239
- else Codex / Cursor(Prompt fallback)
241
+ else 未提供上下文(Prompt fallback,含 Cursor)
240
242
  A->>F: get_collaboration_preferences(projectPath, taskPrompt)
241
243
  F-->>A: 生效偏好、精确项目和有界召回
242
244
  end
@@ -262,11 +264,11 @@ sequenceDiagram
262
264
  F-->>A: retain_nothing
263
265
  end
264
266
 
265
- alt Claude Code Stop Hook
267
+ alt 已加载并获信任的 Claude Code / Codex Stop Hook
266
268
  L->>F: verify_task_checkpoint
267
269
  F-->>L: 已检查才允许结束
268
- else Prompt fallback Agent
269
- Note over A,F: 遵循同一契约,但宿主不能确定性阻止漏检
270
+ else Cursor 提醒或 Prompt fallback Agent
271
+ Note over A,F: 遵循同一契约;有限提醒不是无条件 Stop Gate
270
272
  end
271
273
  A-->>U: 返回结果与实际使用的 Fuli 来源
272
274
  ```
@@ -361,8 +363,9 @@ Agent 上下文。
361
363
  - Benchmark 的测试项目和对话是明确标注的 **MOCK / 合成数据**,不是用户或生产数据;
362
364
  - 当前决策工具可在首次记录时附带验证,但还没有面向既有 `Decision` 单独追加不可变验证结果
363
365
  的专用入口;
364
- - Claude Code 具备确定性的生命周期 Hook;Codex 和 Cursor 当前是 Prompt fallback,不能把两者
365
- 表述为同等强制能力;
366
+ - 安装文件不等于宿主已加载、信任或执行。Claude Code 和 Codex 适配器会生成入口/Stop Hook
367
+ 配置,Codex 信任审阅仍由用户完成;Cursor 使用任务入口 Hook 和有限 Stop 提醒,不能表述为
368
+ 同等的无条件 Stop Gate。三个真实客户端的普通输入触发仍需实际验收;
366
369
  - 聚合检索中的选定公共项目仍是 Beta;外部知识提升到公共空间和后台增量同步尚未实现。
367
370
 
368
371
  ## 安装
@@ -498,7 +501,13 @@ start 和 restart 会继续沿用。
498
501
  Kubernetes 或整台容器虚拟机;原生模式会直接停止对应 Provider 和 Neo4j 进程,因此空闲时
499
502
  不再保留共享虚拟机开销。
500
503
 
501
- Project Agent 身份仍是控制面记录,不会每个身份常驻一个进程。实际执行器按 ID 共用租约:
504
+ “项目 Agent → 招募员工”支持可复用的默认员工模板,首位员工是项目经理 Jefa。招募复用持久身份,
505
+ 按项目单独任职;安装员工包后,侧栏工作台与 API/A2A 共用 FULI 端口,已有 FULI MCP 可发现和调用员工工具。
506
+ 招募不等于启动模型,也不改写已有客户端配置。详见[员工包安装与扩展协议](docs/employee-agents.md)。
507
+
508
+ Project Agent 身份仍是控制面记录,不会每个身份常驻一个进程。角色工作记忆按项目私有、
509
+ 版本化地保存在同一个 Neo4j Provider 中;任务入口恢复唯一负责人,结束检查跨 MCP 进程持久化。
510
+ 详见[角色记忆、宿主 hooks 与验收边界](docs/project-agent-memory.md)。实际执行器按 ID 共用租约:
502
511
  只有显式注入受管生命周期适配器的执行器才由 Fuli 启停;Codex 等宿主自己拥有的外部执行器
503
512
  不会被 Fuli 擅自启动或终止。当前可用的最小内存组合是:
504
513
 
@@ -553,15 +562,52 @@ npm uninstall --global fuli-context
553
562
 
554
563
  Fuli 为支持的 Agent 安装 `capturing-session-knowledge`、`grilling-project` 和 `flreview`
555
564
  Skills。输入 `/flreview` 后可选择全部、个人偏好或个人项目;若用户表示完全没耐心,流程会
556
- 跳过心情、时间和 token 询问,只处理少量最高优先级问题。Claude
557
- Code 使用 `UserPromptSubmit` 和 `Stop` Hook 接入任务生命周期;Codex 的用户级
558
- `AGENTS.md` 与 Cursor 指令使用 Prompt fallback。偏好正文始终以本机 Fuli 为唯一来源,
559
- 不会复制到 Agent 配置中。
565
+ 跳过心情、时间和 token 询问,只处理少量最高优先级问题。Fuli setup 为 Claude Code 生成
566
+ `UserPromptSubmit`/`Stop` MCP Hook,为 Codex 生成 `UserPromptSubmit` MCP Hook 和本地 `Stop`
567
+ 命令,为 Cursor 生成 `sessionStart`/`beforeSubmitPrompt`/`stop` Hook。Codex bootstrap 和 Cursor
568
+ 指令只在未收到生命周期上下文时使用 fallback,不重复已提供的偏好。Codex 的 Stop 命令首次
569
+ 阻止未完成检查;若一次继续后仍未完成,只对同一 token 写入 `retain_nothing` 防止无限循环,
570
+ 不生成知识或角色记忆。安装配置不会代替用户批准宿主信任。偏好正文始终以本机 Fuli 为唯一
571
+ 来源,不复制到 Agent 配置中。
560
572
 
561
573
  FULI MCP 还提供只读的 `fuli://` resources:每个本地个人项目和“全局品味”各有一个可选条目。
562
574
  支持 MCP mention 的 Agent 可以在 `@` 选择器里选中它们;项目条目只代表一个精确项目,
563
575
  不会因为选择而自动扩大到其他项目或 `RELATED_TO` 项目。
564
576
 
577
+ ### Claude 网页版 / Cowork 的远程上游
578
+
579
+ `fuli remote-mcp` 提供绑定单一个人项目、最小权限的 Streamable HTTP MCP 上游。它把来源
580
+ 独立记录为 `claude`,要求仅 owner 可读的 bearer token 文件,拒绝跨站 Origin,并且只监听
581
+ loopback:
582
+
583
+ ```bash
584
+ umask 077
585
+ openssl rand -hex 32 > ./fuli-remote.token
586
+ fuli remote-mcp --personal-project-id YOUR_PROJECT_ID \
587
+ --bearer-token-file ./fuli-remote.token --port 2728
588
+ ```
589
+
590
+ 在 POSIX 系统上,CLI 会以 nonblocking + no-follow 方式打开 token,并要求权限为 `0600`。
591
+ Windows 无法通过 Node.js 获得同等的 `O_NOFOLLOW` 与 POSIX 权限保证,因此 token 必须放在
592
+ 受 Windows ACL 保护的目录中,必须是普通文件且不能使用链接。
593
+
594
+ 启动前会校验该项目确实属于当前个人空间;默认最多同时保留 8 个会话,并清理空闲超过
595
+ 15 分钟的会话;需要时可用 `--max-sessions` 和 `--session-idle-ttl-seconds` 调整。“空闲”按
596
+ 已完成的 MCP 应用请求计算,静默的独立 SSE 通知流不会永久占用会话槽;到达 TTL 后连接
597
+ 可能被关闭,客户端须重新连接并初始化新会话。关闭服务时,正在处理的有界请求与会话清理
598
+ 共享同一个宽限截止时间,超时后才强制关闭剩余 HTTP 连接。若反向代理
599
+ 会转发浏览器 `Origin` 或保留公网 Host,用
600
+ `--allowed-origin https://connector.example --allowed-host connector.example` 显式配置;否则让
601
+ 代理把 Host 重写为 loopback 上游地址。任意未允许的 Origin 和 Host 都会被拒绝。每个 MCP
602
+ 会话只能读取任务入口为它选中的 Agent 私有上下文与记忆。checkpoint token 还同时绑定上游
603
+ 配置的项目和创建它的 MCP 会话,其他项目进程或同项目的其他会话都不能复用。
604
+
605
+ 这只是内部上游,不是公网部署。Claude 自定义连接器从 Anthropic 云端发起请求,因此仍须在
606
+ 监听器前配置公开 HTTPS 与 OAuth 2.1 代理;代理必须校验用户身份、token audience 和最小
607
+ scope,再把外部 token 换成内部 bearer,绝不能开放 Fuli Provider 或 Neo4j 端口。
608
+ claude.ai 不运行本机生命周期 hooks;MCP 初始化指令会要求每项任务先恢复角色、结束前
609
+ checkpoint,但只有真实连接后的 Claude 会话才能证明该行为。
610
+
565
611
  当任务需要品味或判断建议时,`get_user_taste_skill` 会根据当前生效的个人档案和历史任务
566
612
  数据生成一份有界、只读的 `user-taste` Skill 结论。它会标注证据状态与作用域,返回与当前
567
613
  任务匹配的推荐,并在偏好新增或修订后重新生成;不会覆盖用户自己编写的 taste Skill,持久
@@ -1 +1 @@
1
- import{C as e,N as t,S as n,a as r,et as i,g as a,h as o,j as s,m as c,rt as l,y as u}from"./i18n-Ci3heuiL.js";import{t as d}from"./fuli-logo-Bu9WBuQe.js";import{t as f}from"./_plugin-vue_export-helper-BDNMzG2s.js";var p=[`aria-label`],m={class:`label-dimension-strip`},h=[`data-dimension`],g={class:`label-guide-sheet`},_={class:`label-guide-section profile-guide`},v={class:`label-definition-list`},y=[`data-kind`],b={class:`label-guide-section quadrant-guide`},x={class:`quadrant-explainer`},S={class:`quadrant-y-axis`,"aria-hidden":`true`},C={class:`quadrant-grid`},w=[`data-quadrant`],T={class:`quadrant-x-axis`,"aria-hidden":`true`},E={class:`quadrant-notes`},D={class:`label-guide-section confirmation-guide`},O={class:`status-definition-list`},k=[`data-status`],A={class:`status-boundaries`},j={class:`label-example`},M={class:`label-example-tags`,"aria-hidden":`true`},N={class:`label-token profile-token`,"data-kind":`taste`},P={class:`label-token origin-token`},ee={class:`label-token status-token`,"data-status":`confirmed`},F={class:`label-all-note`},I=f(e({__name:`LabelGuide`,setup(e){let n=o(()=>[{key:`profile`,title:r(`about.dimensions.profile.title`),question:r(`about.dimensions.profile.question`),timing:r(`about.dimensions.profile.timing`)},{key:`origin`,title:r(`about.dimensions.origin.title`),question:r(`about.dimensions.origin.question`),timing:r(`about.dimensions.origin.timing`)},{key:`confirmation`,title:r(`about.dimensions.confirmation.title`),question:r(`about.dimensions.confirmation.question`),timing:r(`about.dimensions.confirmation.timing`)}]),d=o(()=>[{key:`taste`,label:r(`about.profiles.taste.label`),short:r(`about.profiles.taste.short`),description:r(`about.profiles.taste.description`)},{key:`personality`,label:r(`about.profiles.personality.label`),short:r(`about.profiles.personality.short`),description:r(`about.profiles.personality.description`)},{key:`judgment`,label:r(`about.profiles.judgment.label`),short:r(`about.profiles.judgment.short`),description:r(`about.profiles.judgment.description`)}]),f=o(()=>[{key:`known-unknown`,label:r(`about.quadrants.knownUnknown.label`),coordinate:r(`about.quadrants.knownUnknown.coordinate`),description:r(`about.quadrants.knownUnknown.description`)},{key:`known-known`,label:r(`about.quadrants.knownKnown.label`),coordinate:r(`about.quadrants.knownKnown.coordinate`),description:r(`about.quadrants.knownKnown.description`)},{key:`unknown-unknown`,label:r(`about.quadrants.unknownUnknown.label`),coordinate:r(`about.quadrants.unknownUnknown.coordinate`),description:r(`about.quadrants.unknownUnknown.description`)},{key:`unknown-known`,label:r(`about.quadrants.unknownKnown.label`),coordinate:r(`about.quadrants.unknownKnown.coordinate`),description:r(`about.quadrants.unknownKnown.description`)}]),I=o(()=>[{key:`pending`,label:r(`about.statuses.pending.label`),description:r(`about.statuses.pending.description`),rule:r(`about.statuses.pending.rule`)},{key:`agent-confirmed`,label:r(`about.statuses.agentConfirmed.label`),description:r(`about.statuses.agentConfirmed.description`),rule:r(`about.statuses.agentConfirmed.rule`)},{key:`confirmed`,label:r(`about.statuses.confirmed.label`),description:r(`about.statuses.confirmed.description`),rule:r(`about.statuses.confirmed.rule`)}]);return(e,o)=>(s(),u(`section`,{class:`label-guide`,"aria-label":i(r)(`about.labelsAria`)},[a(`div`,m,[(s(!0),u(c,null,t(n.value,e=>(s(),u(`article`,{key:e.key,"data-dimension":e.key},[o[0]||=a(`i`,{"aria-hidden":`true`},null,-1),a(`div`,null,[a(`strong`,null,l(e.title),1),a(`p`,null,l(e.question),1),a(`small`,null,l(e.timing),1)])],8,h))),128))]),a(`div`,g,[a(`section`,_,[a(`header`,null,[a(`span`,null,l(i(r)(`about.sections.profile.index`)),1),a(`div`,null,[a(`h3`,null,l(i(r)(`about.sections.profile.title`)),1),a(`p`,null,l(i(r)(`about.sections.profile.meta`)),1)])]),a(`div`,v,[(s(!0),u(c,null,t(d.value,e=>(s(),u(`article`,{key:e.key,class:`label-definition-row`},[a(`span`,{class:`label-token profile-token`,"data-kind":e.key},l(e.label),9,y),a(`div`,null,[a(`strong`,null,l(e.short),1),a(`p`,null,l(e.description),1)])]))),128))])]),a(`section`,b,[a(`header`,null,[a(`span`,null,l(i(r)(`about.sections.origin.index`)),1),a(`div`,null,[a(`h3`,null,l(i(r)(`about.sections.origin.title`)),1),a(`p`,null,l(i(r)(`about.sections.origin.meta`)),1)])]),a(`div`,x,[a(`div`,S,[a(`span`,null,l(i(r)(`about.quadrants.aware`)),1),a(`strong`,null,l(i(r)(`about.quadrants.awareness`)),1),a(`span`,null,l(i(r)(`about.quadrants.unaware`)),1)]),a(`div`,C,[(s(!0),u(c,null,t(f.value,e=>(s(),u(`article`,{key:e.key,"data-quadrant":e.key},[a(`span`,null,l(e.coordinate),1),a(`strong`,null,l(e.label),1),a(`p`,null,l(e.description),1)],8,w))),128))]),a(`div`,T,[a(`span`,null,l(i(r)(`about.quadrants.unmastered`)),1),a(`strong`,null,l(i(r)(`about.quadrants.mastery`)),1),a(`span`,null,l(i(r)(`about.quadrants.mastered`)),1)]),a(`div`,E,[a(`p`,null,l(i(r)(`about.quadrants.immutable`)),1),a(`p`,null,l(i(r)(`about.quadrants.unclassified`)),1)])])]),a(`section`,D,[a(`header`,null,[a(`span`,null,l(i(r)(`about.sections.confirmation.index`)),1),a(`div`,null,[a(`h3`,null,l(i(r)(`about.sections.confirmation.title`)),1),a(`p`,null,l(i(r)(`about.sections.confirmation.meta`)),1)])]),a(`div`,null,[a(`div`,O,[(s(!0),u(c,null,t(I.value,e=>(s(),u(`article`,{key:e.key,class:`status-definition-row`},[a(`span`,{class:`label-token status-token`,"data-status":e.key},l(e.label),9,k),a(`p`,null,l(e.description),1),a(`div`,null,[a(`span`,null,l(i(r)(`about.statuses.entryCondition`)),1),a(`strong`,null,l(e.rule),1)])]))),128))]),a(`div`,A,[a(`p`,null,l(i(r)(`about.statuses.usageBoundary`)),1),a(`p`,null,l(i(r)(`about.statuses.resetBoundary`)),1)])])]),a(`section`,j,[a(`div`,null,[a(`span`,null,l(i(r)(`about.example.title`)),1),a(`strong`,null,l(i(r)(`about.example.item`)),1)]),a(`div`,M,[a(`span`,N,l(i(r)(`about.example.profile`)),1),a(`span`,P,l(i(r)(`about.example.origin`)),1),a(`span`,ee,l(i(r)(`about.example.status`)),1)]),a(`p`,null,l(i(r)(`about.example.description`)),1)]),a(`p`,F,l(i(r)(`about.allFilter`)),1)])],8,p))}}),[[`__scopeId`,`data-v-b79b7e68`]]),L={class:`open-source-credits`},R={class:`credits-roll`},z={class:`credit-grid`},B=[`href`],V={class:`credit-mark`},H=[`src`,`alt`],U={class:`credit-copy`},W={class:`credit-source-note`},G={class:`fuli-finale`},K={class:`finale-brand`},q=[`src`],J=f(e({__name:`OpenSourceCredits`,setup(e){let n=o(()=>[{name:`Vue.js`,role:r(`about.credits.roles.vue`),logo:`https://raw.githubusercontent.com/vuejs/docs/main/src/public/logo.svg`,url:`https://vuejs.org/`},{name:`Vite`,role:r(`about.credits.roles.vite`),logo:`https://raw.githubusercontent.com/vitejs/vite/main/docs/public/logo-without-border.svg`,url:`https://vite.dev/`},{name:`Pinia`,role:r(`about.credits.roles.pinia`),logo:`https://raw.githubusercontent.com/vuejs/pinia/v4/packages/docs/public/logo.svg`,url:`https://pinia.vuejs.org/`},{name:`D3.js`,role:r(`about.credits.roles.d3`),logo:`https://raw.githubusercontent.com/d3/d3-logo/master/d3.svg`,url:`https://d3js.org/`},{name:`Vitest`,role:r(`about.credits.roles.vitest`),logo:`https://raw.githubusercontent.com/vitest-dev/vitest/main/docs/public/logo-without-border.svg`,url:`https://vitest.dev/`},{name:`Hono`,role:r(`about.credits.roles.hono`),logo:`https://raw.githubusercontent.com/honojs/website/main/public/images/logo.svg`,url:`https://hono.dev/`},{name:`Neo4j`,role:r(`about.credits.roles.neo4j`),logo:`https://avatars.githubusercontent.com/u/201120?v=4`,url:`https://neo4j.com/`},{name:`Zod`,role:r(`about.credits.roles.zod`),logo:`https://raw.githubusercontent.com/colinhacks/zod/main/packages/docs/public/logo/logo_square.png`,url:`https://zod.dev/`},{name:`FastAPI`,role:r(`about.credits.roles.fastapi`),logo:`https://raw.githubusercontent.com/fastapi/fastapi/master/docs/en/docs/img/favicon.png`,url:`https://fastapi.tiangolo.com/`},{name:`Graphiti`,role:r(`about.credits.roles.graphiti`),logo:`https://avatars.githubusercontent.com/u/132832125?s=128&v=4`,url:`https://github.com/getzep/graphiti`},{name:`Model Context Protocol`,role:r(`about.credits.roles.mcp`),logo:`https://raw.githubusercontent.com/modelcontextprotocol/docs/main/favicon.svg`,url:`https://modelcontextprotocol.io/`}]);return(e,o)=>(s(),u(`section`,L,[a(`div`,R,[a(`header`,null,[a(`h3`,null,l(i(r)(`about.credits.title`)),1),a(`p`,null,l(i(r)(`about.credits.description`)),1)]),a(`div`,z,[(s(!0),u(c,null,t(n.value,e=>(s(),u(`a`,{key:e.name,href:e.url,target:`_blank`,rel:`noreferrer`},[a(`span`,V,[a(`img`,{src:e.logo,alt:e.name},null,8,H)]),a(`span`,U,[a(`strong`,null,l(e.name),1),a(`small`,null,l(e.role),1)])],8,B))),128))]),a(`p`,W,l(i(r)(`about.credits.sourceNote`)),1)]),a(`footer`,G,[a(`div`,K,[a(`img`,{src:i(d),alt:``,"aria-hidden":`true`},null,8,q),a(`div`,null,[a(`strong`,null,l(i(r)(`common.brand`)),1),o[0]||=a(`span`,null,`Context Graph`,-1)])]),a(`p`,null,l(i(r)(`about.credits.finale`)),1)])]))}}),[[`__scopeId`,`data-v-8676884b`]]),Y={class:`product-principles`},X={class:`principles-lede`},Z={class:`principle-sequence`},Q={class:`principle-boundaries`},$=[`data-boundary`],te=f(e({__name:`ProductPrinciples`,setup(e){let n=o(()=>[{key:`capture`,index:r(`about.philosophy.capture.index`),title:r(`about.philosophy.capture.title`),description:r(`about.philosophy.capture.description`)},{key:`project`,index:r(`about.philosophy.project.index`),title:r(`about.philosophy.project.title`),description:r(`about.philosophy.project.description`)},{key:`review`,index:r(`about.philosophy.review.index`),title:r(`about.philosophy.review.title`),description:r(`about.philosophy.review.description`)},{key:`reuse`,index:r(`about.philosophy.reuse.index`),title:r(`about.philosophy.reuse.title`),description:r(`about.philosophy.reuse.description`)}]),d=o(()=>[{key:`local`,title:r(`about.philosophy.local.title`),description:r(`about.philosophy.local.description`)},{key:`authority`,title:r(`about.philosophy.authority.title`),description:r(`about.philosophy.authority.description`)},{key:`scope`,title:r(`about.philosophy.scope.title`),description:r(`about.philosophy.scope.description`)}]);return(e,o)=>(s(),u(`section`,Y,[a(`header`,X,[a(`h3`,null,l(i(r)(`about.philosophy.title`)),1),a(`p`,null,l(i(r)(`about.philosophy.intro`)),1),a(`p`,null,l(i(r)(`about.philosophy.support`)),1)]),a(`div`,Z,[(s(!0),u(c,null,t(n.value,e=>(s(),u(`article`,{key:e.key},[a(`span`,null,l(e.index),1),a(`div`,null,[a(`h4`,null,l(e.title),1),a(`p`,null,l(e.description),1)])]))),128))]),a(`div`,Q,[a(`strong`,null,l(i(r)(`about.philosophy.boundariesTitle`)),1),a(`div`,null,[(s(!0),u(c,null,t(d.value,e=>(s(),u(`article`,{key:e.key},[a(`i`,{"data-boundary":e.key,"aria-hidden":`true`},null,8,$),a(`h4`,null,l(e.title),1),a(`p`,null,l(e.description),1)]))),128))])])]))}}),[[`__scopeId`,`data-v-d823b02d`]]),ne=[`aria-label`],re={class:`about-content`},ie={class:`about-labels-section`},ae=f(e({__name:`AboutPage`,setup(e){return(e,t)=>(s(),u(`section`,{class:`view about-view`,"aria-label":i(r)(`about.aria`)},[a(`div`,re,[n(te),a(`section`,ie,[a(`header`,null,[a(`h3`,null,l(i(r)(`about.labelsIntro.title`)),1),a(`p`,null,l(i(r)(`about.labelsIntro.description`)),1)]),n(I)]),n(J)])],8,ne))}}),[[`__scopeId`,`data-v-6bd30c79`]]);export{ae as default};
1
+ import{C as e,N as t,S as n,a as r,et as i,g as a,h as o,j as s,m as c,rt as l,y as u}from"./i18n-CgBHZthI.js";import{t as d}from"./fuli-logo-Bu9WBuQe.js";import{t as f}from"./_plugin-vue_export-helper-BDNMzG2s.js";var p=[`aria-label`],m={class:`label-dimension-strip`},h=[`data-dimension`],g={class:`label-guide-sheet`},_={class:`label-guide-section profile-guide`},v={class:`label-definition-list`},y=[`data-kind`],b={class:`label-guide-section quadrant-guide`},x={class:`quadrant-explainer`},S={class:`quadrant-y-axis`,"aria-hidden":`true`},C={class:`quadrant-grid`},w=[`data-quadrant`],T={class:`quadrant-x-axis`,"aria-hidden":`true`},E={class:`quadrant-notes`},D={class:`label-guide-section confirmation-guide`},O={class:`status-definition-list`},k=[`data-status`],A={class:`status-boundaries`},j={class:`label-example`},M={class:`label-example-tags`,"aria-hidden":`true`},N={class:`label-token profile-token`,"data-kind":`taste`},P={class:`label-token origin-token`},ee={class:`label-token status-token`,"data-status":`confirmed`},F={class:`label-all-note`},I=f(e({__name:`LabelGuide`,setup(e){let n=o(()=>[{key:`profile`,title:r(`about.dimensions.profile.title`),question:r(`about.dimensions.profile.question`),timing:r(`about.dimensions.profile.timing`)},{key:`origin`,title:r(`about.dimensions.origin.title`),question:r(`about.dimensions.origin.question`),timing:r(`about.dimensions.origin.timing`)},{key:`confirmation`,title:r(`about.dimensions.confirmation.title`),question:r(`about.dimensions.confirmation.question`),timing:r(`about.dimensions.confirmation.timing`)}]),d=o(()=>[{key:`taste`,label:r(`about.profiles.taste.label`),short:r(`about.profiles.taste.short`),description:r(`about.profiles.taste.description`)},{key:`personality`,label:r(`about.profiles.personality.label`),short:r(`about.profiles.personality.short`),description:r(`about.profiles.personality.description`)},{key:`judgment`,label:r(`about.profiles.judgment.label`),short:r(`about.profiles.judgment.short`),description:r(`about.profiles.judgment.description`)}]),f=o(()=>[{key:`known-unknown`,label:r(`about.quadrants.knownUnknown.label`),coordinate:r(`about.quadrants.knownUnknown.coordinate`),description:r(`about.quadrants.knownUnknown.description`)},{key:`known-known`,label:r(`about.quadrants.knownKnown.label`),coordinate:r(`about.quadrants.knownKnown.coordinate`),description:r(`about.quadrants.knownKnown.description`)},{key:`unknown-unknown`,label:r(`about.quadrants.unknownUnknown.label`),coordinate:r(`about.quadrants.unknownUnknown.coordinate`),description:r(`about.quadrants.unknownUnknown.description`)},{key:`unknown-known`,label:r(`about.quadrants.unknownKnown.label`),coordinate:r(`about.quadrants.unknownKnown.coordinate`),description:r(`about.quadrants.unknownKnown.description`)}]),I=o(()=>[{key:`pending`,label:r(`about.statuses.pending.label`),description:r(`about.statuses.pending.description`),rule:r(`about.statuses.pending.rule`)},{key:`agent-confirmed`,label:r(`about.statuses.agentConfirmed.label`),description:r(`about.statuses.agentConfirmed.description`),rule:r(`about.statuses.agentConfirmed.rule`)},{key:`confirmed`,label:r(`about.statuses.confirmed.label`),description:r(`about.statuses.confirmed.description`),rule:r(`about.statuses.confirmed.rule`)}]);return(e,o)=>(s(),u(`section`,{class:`label-guide`,"aria-label":i(r)(`about.labelsAria`)},[a(`div`,m,[(s(!0),u(c,null,t(n.value,e=>(s(),u(`article`,{key:e.key,"data-dimension":e.key},[o[0]||=a(`i`,{"aria-hidden":`true`},null,-1),a(`div`,null,[a(`strong`,null,l(e.title),1),a(`p`,null,l(e.question),1),a(`small`,null,l(e.timing),1)])],8,h))),128))]),a(`div`,g,[a(`section`,_,[a(`header`,null,[a(`span`,null,l(i(r)(`about.sections.profile.index`)),1),a(`div`,null,[a(`h3`,null,l(i(r)(`about.sections.profile.title`)),1),a(`p`,null,l(i(r)(`about.sections.profile.meta`)),1)])]),a(`div`,v,[(s(!0),u(c,null,t(d.value,e=>(s(),u(`article`,{key:e.key,class:`label-definition-row`},[a(`span`,{class:`label-token profile-token`,"data-kind":e.key},l(e.label),9,y),a(`div`,null,[a(`strong`,null,l(e.short),1),a(`p`,null,l(e.description),1)])]))),128))])]),a(`section`,b,[a(`header`,null,[a(`span`,null,l(i(r)(`about.sections.origin.index`)),1),a(`div`,null,[a(`h3`,null,l(i(r)(`about.sections.origin.title`)),1),a(`p`,null,l(i(r)(`about.sections.origin.meta`)),1)])]),a(`div`,x,[a(`div`,S,[a(`span`,null,l(i(r)(`about.quadrants.aware`)),1),a(`strong`,null,l(i(r)(`about.quadrants.awareness`)),1),a(`span`,null,l(i(r)(`about.quadrants.unaware`)),1)]),a(`div`,C,[(s(!0),u(c,null,t(f.value,e=>(s(),u(`article`,{key:e.key,"data-quadrant":e.key},[a(`span`,null,l(e.coordinate),1),a(`strong`,null,l(e.label),1),a(`p`,null,l(e.description),1)],8,w))),128))]),a(`div`,T,[a(`span`,null,l(i(r)(`about.quadrants.unmastered`)),1),a(`strong`,null,l(i(r)(`about.quadrants.mastery`)),1),a(`span`,null,l(i(r)(`about.quadrants.mastered`)),1)]),a(`div`,E,[a(`p`,null,l(i(r)(`about.quadrants.immutable`)),1),a(`p`,null,l(i(r)(`about.quadrants.unclassified`)),1)])])]),a(`section`,D,[a(`header`,null,[a(`span`,null,l(i(r)(`about.sections.confirmation.index`)),1),a(`div`,null,[a(`h3`,null,l(i(r)(`about.sections.confirmation.title`)),1),a(`p`,null,l(i(r)(`about.sections.confirmation.meta`)),1)])]),a(`div`,null,[a(`div`,O,[(s(!0),u(c,null,t(I.value,e=>(s(),u(`article`,{key:e.key,class:`status-definition-row`},[a(`span`,{class:`label-token status-token`,"data-status":e.key},l(e.label),9,k),a(`p`,null,l(e.description),1),a(`div`,null,[a(`span`,null,l(i(r)(`about.statuses.entryCondition`)),1),a(`strong`,null,l(e.rule),1)])]))),128))]),a(`div`,A,[a(`p`,null,l(i(r)(`about.statuses.usageBoundary`)),1),a(`p`,null,l(i(r)(`about.statuses.resetBoundary`)),1)])])]),a(`section`,j,[a(`div`,null,[a(`span`,null,l(i(r)(`about.example.title`)),1),a(`strong`,null,l(i(r)(`about.example.item`)),1)]),a(`div`,M,[a(`span`,N,l(i(r)(`about.example.profile`)),1),a(`span`,P,l(i(r)(`about.example.origin`)),1),a(`span`,ee,l(i(r)(`about.example.status`)),1)]),a(`p`,null,l(i(r)(`about.example.description`)),1)]),a(`p`,F,l(i(r)(`about.allFilter`)),1)])],8,p))}}),[[`__scopeId`,`data-v-b79b7e68`]]),L={class:`open-source-credits`},R={class:`credits-roll`},z={class:`credit-grid`},B=[`href`],V={class:`credit-mark`},H=[`src`,`alt`],U={class:`credit-copy`},W={class:`credit-source-note`},G={class:`fuli-finale`},K={class:`finale-brand`},q=[`src`],J=f(e({__name:`OpenSourceCredits`,setup(e){let n=o(()=>[{name:`Vue.js`,role:r(`about.credits.roles.vue`),logo:`https://raw.githubusercontent.com/vuejs/docs/main/src/public/logo.svg`,url:`https://vuejs.org/`},{name:`Vite`,role:r(`about.credits.roles.vite`),logo:`https://raw.githubusercontent.com/vitejs/vite/main/docs/public/logo-without-border.svg`,url:`https://vite.dev/`},{name:`Pinia`,role:r(`about.credits.roles.pinia`),logo:`https://raw.githubusercontent.com/vuejs/pinia/v4/packages/docs/public/logo.svg`,url:`https://pinia.vuejs.org/`},{name:`D3.js`,role:r(`about.credits.roles.d3`),logo:`https://raw.githubusercontent.com/d3/d3-logo/master/d3.svg`,url:`https://d3js.org/`},{name:`Vitest`,role:r(`about.credits.roles.vitest`),logo:`https://raw.githubusercontent.com/vitest-dev/vitest/main/docs/public/logo-without-border.svg`,url:`https://vitest.dev/`},{name:`Hono`,role:r(`about.credits.roles.hono`),logo:`https://raw.githubusercontent.com/honojs/website/main/public/images/logo.svg`,url:`https://hono.dev/`},{name:`Neo4j`,role:r(`about.credits.roles.neo4j`),logo:`https://avatars.githubusercontent.com/u/201120?v=4`,url:`https://neo4j.com/`},{name:`Zod`,role:r(`about.credits.roles.zod`),logo:`https://raw.githubusercontent.com/colinhacks/zod/main/packages/docs/public/logo/logo_square.png`,url:`https://zod.dev/`},{name:`FastAPI`,role:r(`about.credits.roles.fastapi`),logo:`https://raw.githubusercontent.com/fastapi/fastapi/master/docs/en/docs/img/favicon.png`,url:`https://fastapi.tiangolo.com/`},{name:`Graphiti`,role:r(`about.credits.roles.graphiti`),logo:`https://avatars.githubusercontent.com/u/132832125?s=128&v=4`,url:`https://github.com/getzep/graphiti`},{name:`Model Context Protocol`,role:r(`about.credits.roles.mcp`),logo:`https://raw.githubusercontent.com/modelcontextprotocol/docs/main/favicon.svg`,url:`https://modelcontextprotocol.io/`}]);return(e,o)=>(s(),u(`section`,L,[a(`div`,R,[a(`header`,null,[a(`h3`,null,l(i(r)(`about.credits.title`)),1),a(`p`,null,l(i(r)(`about.credits.description`)),1)]),a(`div`,z,[(s(!0),u(c,null,t(n.value,e=>(s(),u(`a`,{key:e.name,href:e.url,target:`_blank`,rel:`noreferrer`},[a(`span`,V,[a(`img`,{src:e.logo,alt:e.name},null,8,H)]),a(`span`,U,[a(`strong`,null,l(e.name),1),a(`small`,null,l(e.role),1)])],8,B))),128))]),a(`p`,W,l(i(r)(`about.credits.sourceNote`)),1)]),a(`footer`,G,[a(`div`,K,[a(`img`,{src:i(d),alt:``,"aria-hidden":`true`},null,8,q),a(`div`,null,[a(`strong`,null,l(i(r)(`common.brand`)),1),o[0]||=a(`span`,null,`Context Graph`,-1)])]),a(`p`,null,l(i(r)(`about.credits.finale`)),1)])]))}}),[[`__scopeId`,`data-v-8676884b`]]),Y={class:`product-principles`},X={class:`principles-lede`},Z={class:`principle-sequence`},Q={class:`principle-boundaries`},$=[`data-boundary`],te=f(e({__name:`ProductPrinciples`,setup(e){let n=o(()=>[{key:`capture`,index:r(`about.philosophy.capture.index`),title:r(`about.philosophy.capture.title`),description:r(`about.philosophy.capture.description`)},{key:`project`,index:r(`about.philosophy.project.index`),title:r(`about.philosophy.project.title`),description:r(`about.philosophy.project.description`)},{key:`review`,index:r(`about.philosophy.review.index`),title:r(`about.philosophy.review.title`),description:r(`about.philosophy.review.description`)},{key:`reuse`,index:r(`about.philosophy.reuse.index`),title:r(`about.philosophy.reuse.title`),description:r(`about.philosophy.reuse.description`)}]),d=o(()=>[{key:`local`,title:r(`about.philosophy.local.title`),description:r(`about.philosophy.local.description`)},{key:`authority`,title:r(`about.philosophy.authority.title`),description:r(`about.philosophy.authority.description`)},{key:`scope`,title:r(`about.philosophy.scope.title`),description:r(`about.philosophy.scope.description`)}]);return(e,o)=>(s(),u(`section`,Y,[a(`header`,X,[a(`h3`,null,l(i(r)(`about.philosophy.title`)),1),a(`p`,null,l(i(r)(`about.philosophy.intro`)),1),a(`p`,null,l(i(r)(`about.philosophy.support`)),1)]),a(`div`,Z,[(s(!0),u(c,null,t(n.value,e=>(s(),u(`article`,{key:e.key},[a(`span`,null,l(e.index),1),a(`div`,null,[a(`h4`,null,l(e.title),1),a(`p`,null,l(e.description),1)])]))),128))]),a(`div`,Q,[a(`strong`,null,l(i(r)(`about.philosophy.boundariesTitle`)),1),a(`div`,null,[(s(!0),u(c,null,t(d.value,e=>(s(),u(`article`,{key:e.key},[a(`i`,{"data-boundary":e.key,"aria-hidden":`true`},null,8,$),a(`h4`,null,l(e.title),1),a(`p`,null,l(e.description),1)]))),128))])])]))}}),[[`__scopeId`,`data-v-d823b02d`]]),ne=[`aria-label`],re={class:`about-content`},ie={class:`about-labels-section`},ae=f(e({__name:`AboutPage`,setup(e){return(e,t)=>(s(),u(`section`,{class:`view about-view`,"aria-label":i(r)(`about.aria`)},[a(`div`,re,[n(te),a(`section`,ie,[a(`header`,null,[a(`h3`,null,l(i(r)(`about.labelsIntro.title`)),1),a(`p`,null,l(i(r)(`about.labelsIntro.description`)),1)]),n(I)]),n(J)])],8,ne))}}),[[`__scopeId`,`data-v-6bd30c79`]]);export{ae as default};
@@ -1 +1 @@
1
- import{A as e,B as t,C as n,D as r,I as i,L as ee,N as a,O as o,S as s,Y as c,_ as l,a as u,et as d,g as f,h as p,j as m,k as h,m as g,n as te,p as _,q as v,rt as y,tt as b,u as x,v as S,x as C,y as w}from"./i18n-Ci3heuiL.js";import{a as T,i as E,n as D,r as O,t as k}from"./console-BlAhujsH.js";import{t as A}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as j}from"./SearchableSelect-Dz13ClQb.js";import{r as M,t as N}from"./identity-4_-v6cB7.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=n({__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(n,{emit:r}){let s=n,l=r,v=c(null),C=c(null),T=c(null),E=c(null),D=c(!1),O=c(!1),k=c(``),A=i().replace(/[^A-Za-z0-9_-]/g,``),j=p(()=>`${s.controlId||`searchable-multi-select-${A}`}-options`),M=p(()=>new Set(s.modelValue)),N=p(()=>s.options.filter(({value:e})=>M.value.has(e))),le=p(()=>N.value.length===0?s.placeholder??u(`common.searchableSelect.placeholder`):N.value.length===1?N.value[0].label:u(`common.searchableSelect.selectedCount`,{count:N.value.length})),B=p(()=>s.searchPlaceholder??u(`common.searchableSelect.searchPlaceholder`)),V=p(()=>s.searchable??s.options.length>5),H=p(()=>{let e=te(),t=k.value.trim().toLocaleLowerCase(e);return t?s.options.filter(n=>[n.label,n.value,n.meta,n.search].filter(Boolean).join(` `).toLocaleLowerCase(e).includes(t)):s.options});ee(()=>s.disabled,e=>{e&&W()}),e(()=>document.addEventListener(`pointerdown`,he)),h(()=>document.removeEventListener(`pointerdown`,he));async function U(){D.value?W():await ue()}async function ue(){s.disabled||(k.value=``,ve(),D.value=!0,await o(),V.value?T.value?.focus():_e()?.focus())}function W({restoreFocus:e=!1}={}){D.value=!1,O.value=!1,k.value=``,e&&o(()=>C.value?.focus())}function de(e){if(s.disabled||e.disabled)return;let t=M.value.has(e.value)?s.modelValue.filter(t=>t!==e.value):[...s.modelValue,e.value];l(`update:modelValue`,t),l(`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&&!v.value?.contains(e.target)&&W()}function ge(e){let t=e.relatedTarget;t&&v.value?.contains(t)||queueMicrotask(()=>{D.value&&!v.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=C.value?.getBoundingClientRect();O.value=!!(e&&window.innerHeight-e.bottom<270&&e.top>270)}return(e,r)=>(m(),w(`div`,{ref_key:`root`,ref:v,class:b([`searchable-select searchable-multi-select`,{open:D.value,"open-up":O.value,disabled:n.disabled}]),"data-select-id":n.controlId,onFocusout:ge},[f(`button`,{ref_key:`trigger`,ref:C,type:`button`,class:`searchable-select-trigger`,role:`combobox`,"aria-haspopup":`listbox`,"aria-expanded":D.value,"aria-controls":j.value,"aria-label":n.label,"aria-required":n.required,disabled:n.disabled,onPointerdown:r[0]||=_(()=>{},[`stop`]),onClick:_(U,[`stop`]),onKeydown:fe},[f(`span`,I,[f(`span`,L,y(le.value),1),N.value.length>1?(m(),w(`small`,ne,y(N.value.map(({label:e})=>e).join(` · `)),1)):S(``,!0)]),r[3]||=f(`i`,{class:`searchable-select-arrow`,"aria-hidden":`true`},null,-1)],40,F),f(`div`,{class:`searchable-select-panel`,hidden:!D.value},[V.value?(m(),w(`div`,ie,[t(f(`input`,{ref_key:`searchInput`,ref:T,"onUpdate:modelValue":r[1]||=e=>k.value=e,type:`search`,autocomplete:`off`,placeholder:B.value,"aria-label":d(u)(`common.searchableSelect.searchAria`,{label:n.label}),onKeydown:pe},null,40,ae),[[x,k.value]])])):S(``,!0),f(`div`,{id:j.value,ref_key:`optionsList`,ref:E,class:`searchable-select-options`,role:`listbox`,"aria-multiselectable":`true`},[(m(!0),w(g,null,a(H.value,e=>(m(),w(`button`,{key:e.value,type:`button`,class:`searchable-select-option`,role:`option`,"aria-selected":M.value.has(e.value),disabled:e.disabled,onMousedown:r[2]||=_(()=>{},[`prevent`]),onClick:t=>de(e),onKeydown:me},[f(`span`,oe,[f(`strong`,null,y(e.label),1),e.meta?(m(),w(`small`,se,y(e.meta),1)):S(``,!0)]),r[4]||=f(`i`,{class:`searchable-select-check`,"aria-hidden":`true`},null,-1)],40,z))),128))],8,R),H.value.length===0?(m(),w(`p`,ce,y(d(u)(`common.searchableSelect.noMatches`)),1)):S(``,!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(n({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 i(e){n(`update:modelValue`,e.target.value)}return(t,n)=>(m(),w(`label`,B,[f(`span`,null,y(e.label),1),e.multiline?(m(),w(`textarea`,r({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:i}),null,16,V)):(m(),w(`input`,r({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:i}),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=n({__name:`ConnectionsPage`,setup(t){let n=k(),r=c(``),i=c([]),o=c([]),h=c(!1),b=c(null),x=c([]),A=c({}),P=c(``),F=c(`ask_human`),I=c(!1),L=v({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=p(()=>n.state?.providers?.personal?.status===`ready`),re=p(()=>n.state?.providers?.workspaces??[]),ie=p(()=>re.value.filter(({status:e})=>e===`ready`).length),ae=p(()=>{let e=n.state?.capabilities,t=[e?.browsePublicProjects?u(`pages.connections.publicCapability.discovery`):null,e?.subscribeProject?u(`pages.connections.publicCapability.subscription`):null,e?.publishProject?u(`pages.connections.publicCapability.publishing`):null,e?.submitKnowledge?u(`pages.connections.publicCapability.contribution`):null,e?.reviewProposals?u(`pages.connections.publicCapability.review`):null].filter(e=>!!e);return t.length?new Intl.ListFormat(te(),{style:`long`,type:`conjunction`}).format(t):u(`pages.connections.notAvailable`)}),R=p(()=>n.state?.subscriptions??[]),z=p(()=>n.state?.personalProjects??[]),oe=p(()=>wt(`connect-external-knowledge`)),se=p(()=>wt(`external-knowledge-conflict-policy`)),ce=p(()=>new Set(R.value.map(({provider_url:e,project_id:t})=>`${e}::${t}`))),B=p(()=>(n.state?.projects??[]).filter(e=>!ce.value.has(et(e)))),V=p(()=>B.value.map(e=>({value:et(e),label:e.name,meta:`#${N(e.id,26)}`,search:M(e.id)}))),H=p(()=>i.value.map(e=>({value:e.type,label:e.name,meta:e.description}))),q=p(()=>z.value.map(e=>({value:e.project_id,label:e.profile.name,meta:`#${N(e.project_id,26)}`,search:M(e.project_id)}))),Xe=p(()=>[{value:`hybrid`,label:u(`pages.connections.mode.hybrid`),disabled:!Y(L.connectorType,`hybrid`)},{value:`mirror`,label:u(`pages.connections.mode.mirror`),disabled:!Y(L.connectorType,`mirror`)},{value:`live`,label:u(`pages.connections.mode.live`),disabled:!Y(L.connectorType,`live`)}]),Ze=p(()=>[{value:`http`,label:`Streamable HTTP`},{value:`stdio`,label:`stdio`}]),Qe=p(()=>[{value:`cn`,label:`Feishu`},{value:`global`,label:`Lark`}]),$e=p(()=>[{value:`ask_human`,label:u(`pages.connections.askHuman`)},{value:`agent_decide`,label:u(`pages.connections.agentDecide`)}]);ee(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]),x.value=x.value.filter(e=>t.has(e)),t.has(P.value)||(P.value=n,n&&mt())},{immediate:!0}),ee(()=>L.connectorType,e=>{Y(e,L.mode)||(L.mode=_t(e))}),e(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)===r.value);if(e)try{await T(`/api/subscriptions`,{personalSpaceId:n.activePersonalSpace?.id,projectId:e.id,providerUrl:e.providerUrl,projectName:e.name}),r.value=``,n.notify(u(`pages.connections.subscribed`,{name:e.name})),await n.refresh()}catch(e){n.reportError(e)}}async function nt(e){try{let t=new URLSearchParams({personalSpaceId:n.activePersonalSpace?.id??``,providerUrl:e.provider_url});await D(`/api/subscriptions/${encodeURIComponent(e.project_id)}?${t}`),n.notify(u(`pages.connections.unsubscribed`,{name:e.project_name??e.project_id})),await n.refresh()}catch(e){n.reportError(e)}}async function J(){try{let[e,t]=await Promise.all([O(`/api/external-knowledge/connectors`),O(`/api/external-knowledge/bindings`)]);i.value=e,o.value=t}catch(e){n.reportError(e)}}async function rt(){let e=n.activePersonalSpace?.id;if(!(!e||!L.personalProjectIds.length)){h.value=!0;try{let{connectorConfig:t,source:r}=it();await T(`/api/external-knowledge/bindings`,{name:L.name.trim(),connectorType:L.connectorType,connectorConfig:t,source:r,targets:L.personalProjectIds.map(t=>({personalSpaceId:e,personalProjectId:t,mode:L.mode}))}),n.notify(u(`pages.connections.externalCreated`,{name:L.name.trim()})),L.name=``,await J()}catch(e){n.reportError(e)}finally{h.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(u(`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(u(`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){h.value=!0;try{let r=await T(`/api/external-knowledge/bindings/${encodeURIComponent(e.id)}/${t}`,{});n.notify(u(t===`sync`&&r.skippedCredentials?`pages.connections.externalSyncedWithSkipped`:t===`sync`?`pages.connections.externalSynced`:`pages.connections.externalChecked`,{name:e.name,count:r.skippedCredentials??0})),await J()}catch(e){n.reportError(e)}finally{h.value=!1}}async function ct(e){h.value=!0;try{await D(`/api/external-knowledge/bindings/${encodeURIComponent(e.id)}`),n.notify(u(`pages.connections.externalDeleted`,{name:e.name})),await J()}catch(e){n.reportError(e)}finally{h.value=!1}}function lt(e){let t=X(e);b.value=e.id,x.value=t.map(({personalProjectId:e})=>e),A.value=Object.fromEntries(t.map(({personalProjectId:e,mode:t})=>[e,t]))}function ut(){b.value=null,x.value=[],A.value={}}function dt(e){let t=o.value.find(({id:e})=>e===b.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=n.activePersonalSpace?.id;if(!(!t||!x.value.length)){h.value=!0;try{await E(`/api/external-knowledge/bindings/${encodeURIComponent(e.id)}/targets`,{targets:x.value.map(n=>({personalSpaceId:t,personalProjectId:n,mode:A.value[n]??e.mode}))}),n.notify(u(`pages.connections.projectsUpdated`,{name:e.name})),ut(),await J()}catch(e){n.reportError(e)}finally{h.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){n.reportError(e)}}async function ht(){let e=n.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,n.notify(u(`pages.connections.conflictSaved`))}catch(e){n.reportError(e)}finally{I.value=!1}}}function gt(e){return i.value.find(t=>t.type===e)?.name??e}function Y(e,t){let n=i.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:u(`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/${te()===`zh-CN`?`README.zh-CN.md`:`README.md`}#${e}`}return(e,t)=>(m(),w(`section`,ue,[f(`div`,W,[f(`h3`,null,y(d(u)(`pages.connections.title`)),1)]),f(`div`,{class:`service-connection-grid`,"aria-label":d(u)(`pages.connections.statusAria`)},[f(`article`,{class:`service-connection-card`,"data-status":ne.value?`ready`:`error`},[f(`header`,null,[t[30]||=f(`span`,{class:`service-connection-icon local`,"aria-hidden":`true`},[f(`span`,{class:`nav-icon nav-icon-personal-project`})],-1),f(`div`,null,[f(`h3`,null,y(d(u)(`pages.connections.localGraphiti`)),1)]),f(`span`,pe,y(ne.value?d(u)(`common.status.connected`):d(u)(`common.status.connectionError`)),1)]),f(`dl`,null,[f(`div`,null,[f(`dt`,null,y(d(u)(`pages.connections.storage`)),1),t[31]||=f(`dd`,null,`Neo4j`,-1)]),f(`div`,null,[f(`dt`,null,y(d(u)(`pages.connections.purpose`)),1),f(`dd`,null,y(d(u)(`pages.connections.localPurpose`)),1)])])],8,fe),f(`article`,{class:`service-connection-card`,"data-status":d(n).publicRuntimeStatus},[f(`header`,null,[t[33]||=f(`span`,{class:`service-connection-icon public`,"aria-hidden":`true`},[f(`span`,{class:`nav-icon nav-icon-public-project`})],-1),f(`div`,he,[f(`h3`,null,y(d(u)(`pages.connections.publicService`)),1),t[32]||=f(`span`,{class:`feature-badge beta`},`BETA`,-1)]),f(`span`,ge,y(d(n).publicRuntimeStatus===`ready`?d(u)(`common.status.connected`):d(n).publicRuntimeStatus===`error`?d(u)(`common.status.connectionError`):d(u)(`common.status.notConnected`)),1)]),f(`dl`,null,[f(`div`,null,[f(`dt`,null,y(d(u)(`pages.connections.currentStatus`)),1),f(`dd`,null,y(d(n).publicRuntimeStatus===`ready`?d(u)(`pages.connections.sharedServicesReady`,{count:ie.value||re.value.length}):d(u)(`pages.connections.notAvailable`)),1)]),f(`div`,null,[f(`dt`,null,y(d(u)(`pages.connections.purpose`)),1),f(`dd`,null,y(ae.value),1)])])],8,me)],8,de),f(`section`,G,[f(`div`,K,[f(`h3`,null,y(d(u)(`pages.connections.externalTitle`)),1),f(`a`,{class:`section-help-link`,"data-testid":`external-knowledge-help`,href:oe.value,"aria-label":d(u)(`pages.connections.externalHelp`),title:d(u)(`pages.connections.externalHelp`),target:`_blank`,rel:`noreferrer`},`?`,8,_e),f(`span`,ve,y(d(u)(`pages.connections.bindingCount`,{count:o.value.length})),1)]),f(`div`,ye,[(m(!0),w(g,null,a(o.value,e=>(m(),w(`article`,{key:e.id,class:`external-binding-row`,"data-status":e.status},[t[34]||=f(`i`,{"aria-hidden":`true`},null,-1),f(`div`,xe,[f(`strong`,null,y(e.name),1),f(`span`,null,y(gt(e.connectorType)),1),f(`div`,Se,[f(`b`,null,y(d(u)(`pages.connections.boundTo`)),1),(m(!0),w(g,null,a(X(e),e=>(m(),w(`span`,{key:e.id,class:`external-binding-target-chip`,"data-status":e.status},y(bt(e.personalProjectId))+` · `+y(d(u)(`pages.connections.mode.${e.mode}`)),9,Ce))),128))]),xt(e)?(m(),w(`small`,we,y(xt(e)),1)):St(e)?(m(),w(`small`,Te,y(d(u)(`pages.connections.credentialsSkipped`,{count:St(e)})),1)):S(``,!0)]),f(`div`,Ee,[f(`button`,{class:`quiet-button`,type:`button`,disabled:h.value,onClick:t=>at(e)},y(d(u)(`pages.connections.check`)),9,De),f(`button`,{class:`quiet-button external-sync-action`,type:`button`,disabled:h.value||!yt(e),onClick:t=>ot(e)},y(d(u)(`pages.connections.sync`)),9,Oe),f(`button`,{class:`quiet-button`,type:`button`,disabled:h.value,onClick:t=>lt(e)},y(d(u)(`pages.connections.manageProjects`)),9,ke),f(`button`,{class:`quiet-button danger`,type:`button`,disabled:h.value,onClick:t=>ct(e)},y(d(u)(`pages.connections.disconnect`)),9,Ae)]),b.value===e.id?(m(),w(`div`,je,[f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.targetProjects`)),1),s(le,{modelValue:x.value,"onUpdate:modelValue":t[0]||=e=>x.value=e,"control-id":`external-projects-${e.id}`,label:d(u)(`pages.connections.targetProjects`),options:q.value,disabled:h.value,required:``,searchable:``,onChange:dt},null,8,[`modelValue`,`control-id`,`label`,`options`,`disabled`])]),f(`div`,Me,[(m(!0),w(g,null,a(x.value,t=>(m(),w(`div`,{key:t,class:`external-target-mode-row`},[f(`span`,null,y(bt(t)),1),s(j,{"model-value":A.value[t]??e.mode,"control-id":`external-target-mode-${e.id}-${t}`,label:d(u)(`pages.connections.bindingMode`),options:vt(e.connectorType),disabled:h.value,"onUpdate:modelValue":e=>ft(t,e)},null,8,[`model-value`,`control-id`,`label`,`options`,`disabled`,`onUpdate:modelValue`])]))),128))]),f(`div`,Ne,[f(`button`,{class:`quiet-button`,type:`button`,disabled:h.value,onClick:ut},y(d(u)(`common.actions.cancel`)),9,Pe),f(`button`,{class:`primary-action`,type:`button`,disabled:h.value||!x.value.length,onClick:t=>pt(e)},y(d(u)(`pages.connections.saveProjects`)),9,Fe)])])):S(``,!0)],8,be))),128)),o.value.length?S(``,!0):(m(),w(`div`,Ie,y(d(u)(`pages.connections.noExternalBindings`)),1))]),f(`form`,{class:`external-binding-form`,onSubmit:_(rt,[`prevent`])},[s(U,{modelValue:L.name,"onUpdate:modelValue":t[1]||=e=>L.name=e,label:d(u)(`pages.connections.bindingName`),"data-testid":`external-name`,required:``},null,8,[`modelValue`,`label`]),f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.connector`)),1),s(j,{modelValue:L.connectorType,"onUpdate:modelValue":t[2]||=e=>L.connectorType=e,"control-id":`external-connector`,label:d(u)(`pages.connections.connector`),options:H.value,disabled:h.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.targetProjects`)),1),s(le,{modelValue:L.personalProjectIds,"onUpdate:modelValue":t[3]||=e=>L.personalProjectIds=e,"control-id":`external-projects`,label:d(u)(`pages.connections.targetProjects`),options:q.value,disabled:h.value,required:``,searchable:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.bindingMode`)),1),s(j,{modelValue:L.mode,"onUpdate:modelValue":t[4]||=e=>L.mode=e,"control-id":`external-binding-mode`,label:d(u)(`pages.connections.bindingMode`),options:Xe.value,disabled:h.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),L.connectorType===`mcp`?(m(),w(g,{key:0},[f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.transport`)),1),s(j,{modelValue:L.mcpTransport,"onUpdate:modelValue":t[5]||=e=>L.mcpTransport=e,"control-id":`external-mcp-transport`,label:d(u)(`pages.connections.transport`),options:Ze.value,disabled:h.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),L.mcpTransport===`http`?(m(),l(U,{key:0,modelValue:L.mcpUrl,"onUpdate:modelValue":t[6]||=e=>L.mcpUrl=e,label:`MCP URL`,"data-testid":`mcp-url`,type:`url`,required:``},null,8,[`modelValue`])):(m(),l(U,{key:1,modelValue:L.mcpCommand,"onUpdate:modelValue":t[7]||=e=>L.mcpCommand=e,label:d(u)(`pages.connections.command`),required:``},null,8,[`modelValue`,`label`])),L.mcpTransport===`stdio`?(m(),l(U,{key:2,modelValue:L.mcpArgs,"onUpdate:modelValue":t[8]||=e=>L.mcpArgs=e,label:d(u)(`pages.connections.arguments`)},null,8,[`modelValue`,`label`])):(m(),l(U,{key:3,modelValue:L.mcpTokenEnv,"onUpdate:modelValue":t[9]||=e=>L.mcpTokenEnv=e,label:d(u)(`pages.connections.tokenEnv`),"data-testid":`mcp-token-env`},null,8,[`modelValue`,`label`])),s(U,{modelValue:L.mcpResourcePrefix,"onUpdate:modelValue":t[10]||=e=>L.mcpResourcePrefix=e,label:d(u)(`pages.connections.resourcePrefix`),"data-testid":`mcp-resource-prefix`},null,8,[`modelValue`,`label`])],64)):L.connectorType===`notion`?(m(),w(g,{key:1},[s(U,{modelValue:L.notionTokenEnv,"onUpdate:modelValue":t[11]||=e=>L.notionTokenEnv=e,label:d(u)(`pages.connections.tokenEnv`),required:``},null,8,[`modelValue`,`label`]),s(U,{modelValue:L.notionPageIds,"onUpdate:modelValue":t[12]||=e=>L.notionPageIds=e,label:`Page IDs`},null,8,[`modelValue`]),s(U,{modelValue:L.notionDataSourceIds,"onUpdate:modelValue":t[13]||=e=>L.notionDataSourceIds=e,label:`Data Source IDs`},null,8,[`modelValue`])],64)):L.connectorType===`feishu`?(m(),w(g,{key:2},[s(U,{modelValue:L.feishuTokenEnv,"onUpdate:modelValue":t[14]||=e=>L.feishuTokenEnv=e,label:d(u)(`pages.connections.tokenEnv`),required:``},null,8,[`modelValue`,`label`]),f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.region`)),1),s(j,{modelValue:L.feishuRegion,"onUpdate:modelValue":t[15]||=e=>L.feishuRegion=e,"control-id":`external-feishu-region`,label:d(u)(`pages.connections.region`),options:Qe.value,disabled:h.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),s(U,{modelValue:L.feishuSpaceId,"onUpdate:modelValue":t[16]||=e=>L.feishuSpaceId=e,label:`Space ID`},null,8,[`modelValue`]),s(U,{modelValue:L.feishuRootNodeToken,"onUpdate:modelValue":t[17]||=e=>L.feishuRootNodeToken=e,label:`Root Node Token`},null,8,[`modelValue`]),s(U,{modelValue:L.feishuNodeTokens,"onUpdate:modelValue":t[18]||=e=>L.feishuNodeTokens=e,label:`Node Tokens`},null,8,[`modelValue`]),s(U,{modelValue:L.feishuWebBaseUrl,"onUpdate:modelValue":t[19]||=e=>L.feishuWebBaseUrl=e,label:`Web URL`,type:`url`},null,8,[`modelValue`])],64)):L.connectorType===`retrieval_api`?(m(),w(g,{key:3},[s(U,{modelValue:L.retrievalUrl,"onUpdate:modelValue":t[20]||=e=>L.retrievalUrl=e,label:d(u)(`pages.connections.retrievalUrl`),type:`url`,required:``},null,8,[`modelValue`,`label`]),s(U,{modelValue:L.retrievalTokenEnv,"onUpdate:modelValue":t[21]||=e=>L.retrievalTokenEnv=e,label:d(u)(`pages.connections.tokenEnv`)},null,8,[`modelValue`,`label`]),s(U,{modelValue:L.retrievalKnowledgeIds,"onUpdate:modelValue":t[22]||=e=>L.retrievalKnowledgeIds=e,label:d(u)(`pages.connections.knowledgeIds`),required:``},null,8,[`modelValue`,`label`]),s(U,{modelValue:L.retrievalScoreThreshold,"onUpdate:modelValue":t[23]||=e=>L.retrievalScoreThreshold=e,label:d(u)(`pages.connections.scoreThreshold`),inputmode:`decimal`,required:``},null,8,[`modelValue`,`label`])],64)):(m(),w(g,{key:4},[s(U,{modelValue:L.customModule,"onUpdate:modelValue":t[24]||=e=>L.customModule=e,label:d(u)(`pages.connections.module`),required:``},null,8,[`modelValue`,`label`]),s(U,{modelValue:L.customEnvironmentNames,"onUpdate:modelValue":t[25]||=e=>L.customEnvironmentNames=e,label:d(u)(`pages.connections.environmentNames`)},null,8,[`modelValue`,`label`]),f(`div`,Le,[s(U,{modelValue:L.customSourceJson,"onUpdate:modelValue":t[26]||=e=>L.customSourceJson=e,label:d(u)(`pages.connections.sourceJson`),multiline:``,required:``},null,8,[`modelValue`,`label`])]),f(`span`,Re,y(d(u)(`pages.connections.trustedCode`)),1)],64)),f(`button`,{class:`primary-action external-create-action`,type:`submit`,disabled:h.value||!z.value.length||!L.personalProjectIds.length},[t[35]||=f(`span`,{class:`external-create-action-icon`,"aria-hidden":`true`},null,-1),f(`span`,null,y(d(u)(`pages.connections.connect`)),1)],8,ze)],32)]),z.value.length?(m(),w(`section`,Be,[f(`div`,Ve,[f(`h3`,null,y(d(u)(`pages.connections.conflictTitle`)),1),f(`a`,{class:`section-help-link`,"data-testid":`conflict-policy-help`,href:se.value,"aria-label":d(u)(`pages.connections.conflictHelp`),title:d(u)(`pages.connections.conflictHelp`),target:`_blank`,rel:`noreferrer`},`?`,8,He)]),f(`div`,Ue,[f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.targetProject`)),1),s(j,{modelValue:P.value,"onUpdate:modelValue":t[27]||=e=>P.value=e,"control-id":`external-conflict-project`,label:d(u)(`pages.connections.targetProject`),options:q.value,disabled:I.value,required:``,onChange:mt},null,8,[`modelValue`,`label`,`options`,`disabled`])]),f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.conflictAction`)),1),s(j,{modelValue:F.value,"onUpdate:modelValue":t[28]||=e=>F.value=e,"control-id":`external-conflict-mode`,label:d(u)(`pages.connections.conflictAction`),options:$e.value,disabled:I.value,required:``,onChange:ht},null,8,[`modelValue`,`label`,`options`,`disabled`])])])])):S(``,!0),d(n).state?.capabilities?.subscribeProject?(m(),w(`section`,We,[f(`div`,Ge,[f(`h3`,null,[C(y(d(u)(`pages.connections.subscriptionsTitle`))+` `,1),t[36]||=f(`span`,{class:`feature-badge beta`},`BETA`,-1)])]),f(`div`,Ke,[(m(!0),w(g,null,a(R.value,e=>(m(),w(`div`,{key:`${e.provider_url}:${e.project_id}`,class:`subscription-row`},[t[37]||=f(`span`,null,`↗`,-1),f(`div`,null,[f(`strong`,null,y(e.project_name??e.project_id),1),f(`span`,null,y(d(u)(`pages.connections.sharedProject`)),1)]),f(`button`,{class:`secondary-action subscription-action`,type:`button`,onClick:t=>nt(e)},y(d(u)(`pages.connections.unsubscribe`)),9,qe)]))),128)),R.value.length?S(``,!0):(m(),w(`div`,Je,y(d(u)(`pages.connections.noSubscriptions`)),1))]),f(`form`,{class:`subscription-form`,onSubmit:_(tt,[`prevent`])},[s(j,{modelValue:r.value,"onUpdate:modelValue":t[29]||=e=>r.value=e,options:V.value,label:d(u)(`pages.connections.sharedProjectLabel`),placeholder:d(u)(`pages.connections.choosePublicProject`),searchable:``,required:``},null,8,[`modelValue`,`options`,`label`,`placeholder`]),f(`button`,Ye,y(d(u)(`pages.connections.subscribe`)),1)],32)])):S(``,!0)]))}});export{q as default};
1
+ import{A as e,B as t,C as n,D as r,I as i,L as ee,N as a,O as o,S as s,Y as c,_ as l,a as u,et as d,g as f,h as p,j as m,k as h,m as g,n as te,p as _,q as v,rt as y,tt as b,u as x,v as S,x as C,y as w}from"./i18n-CgBHZthI.js";import{a as T,i as E,n as D,r as O,t as k}from"./console-tOxOl8Vq.js";import{t as A}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as j}from"./SearchableSelect-D27H0MoP.js";import{r as M,t as N}from"./identity-CFo_Uw1H.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=n({__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(n,{emit:r}){let s=n,l=r,v=c(null),C=c(null),T=c(null),E=c(null),D=c(!1),O=c(!1),k=c(``),A=i().replace(/[^A-Za-z0-9_-]/g,``),j=p(()=>`${s.controlId||`searchable-multi-select-${A}`}-options`),M=p(()=>new Set(s.modelValue)),N=p(()=>s.options.filter(({value:e})=>M.value.has(e))),le=p(()=>N.value.length===0?s.placeholder??u(`common.searchableSelect.placeholder`):N.value.length===1?N.value[0].label:u(`common.searchableSelect.selectedCount`,{count:N.value.length})),B=p(()=>s.searchPlaceholder??u(`common.searchableSelect.searchPlaceholder`)),V=p(()=>s.searchable??s.options.length>5),H=p(()=>{let e=te(),t=k.value.trim().toLocaleLowerCase(e);return t?s.options.filter(n=>[n.label,n.value,n.meta,n.search].filter(Boolean).join(` `).toLocaleLowerCase(e).includes(t)):s.options});ee(()=>s.disabled,e=>{e&&W()}),e(()=>document.addEventListener(`pointerdown`,he)),h(()=>document.removeEventListener(`pointerdown`,he));async function U(){D.value?W():await ue()}async function ue(){s.disabled||(k.value=``,ve(),D.value=!0,await o(),V.value?T.value?.focus():_e()?.focus())}function W({restoreFocus:e=!1}={}){D.value=!1,O.value=!1,k.value=``,e&&o(()=>C.value?.focus())}function de(e){if(s.disabled||e.disabled)return;let t=M.value.has(e.value)?s.modelValue.filter(t=>t!==e.value):[...s.modelValue,e.value];l(`update:modelValue`,t),l(`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&&!v.value?.contains(e.target)&&W()}function ge(e){let t=e.relatedTarget;t&&v.value?.contains(t)||queueMicrotask(()=>{D.value&&!v.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=C.value?.getBoundingClientRect();O.value=!!(e&&window.innerHeight-e.bottom<270&&e.top>270)}return(e,r)=>(m(),w(`div`,{ref_key:`root`,ref:v,class:b([`searchable-select searchable-multi-select`,{open:D.value,"open-up":O.value,disabled:n.disabled}]),"data-select-id":n.controlId,onFocusout:ge},[f(`button`,{ref_key:`trigger`,ref:C,type:`button`,class:`searchable-select-trigger`,role:`combobox`,"aria-haspopup":`listbox`,"aria-expanded":D.value,"aria-controls":j.value,"aria-label":n.label,"aria-required":n.required,disabled:n.disabled,onPointerdown:r[0]||=_(()=>{},[`stop`]),onClick:_(U,[`stop`]),onKeydown:fe},[f(`span`,I,[f(`span`,L,y(le.value),1),N.value.length>1?(m(),w(`small`,ne,y(N.value.map(({label:e})=>e).join(` · `)),1)):S(``,!0)]),r[3]||=f(`i`,{class:`searchable-select-arrow`,"aria-hidden":`true`},null,-1)],40,F),f(`div`,{class:`searchable-select-panel`,hidden:!D.value},[V.value?(m(),w(`div`,ie,[t(f(`input`,{ref_key:`searchInput`,ref:T,"onUpdate:modelValue":r[1]||=e=>k.value=e,type:`search`,autocomplete:`off`,placeholder:B.value,"aria-label":d(u)(`common.searchableSelect.searchAria`,{label:n.label}),onKeydown:pe},null,40,ae),[[x,k.value]])])):S(``,!0),f(`div`,{id:j.value,ref_key:`optionsList`,ref:E,class:`searchable-select-options`,role:`listbox`,"aria-multiselectable":`true`},[(m(!0),w(g,null,a(H.value,e=>(m(),w(`button`,{key:e.value,type:`button`,class:`searchable-select-option`,role:`option`,"aria-selected":M.value.has(e.value),disabled:e.disabled,onMousedown:r[2]||=_(()=>{},[`prevent`]),onClick:t=>de(e),onKeydown:me},[f(`span`,oe,[f(`strong`,null,y(e.label),1),e.meta?(m(),w(`small`,se,y(e.meta),1)):S(``,!0)]),r[4]||=f(`i`,{class:`searchable-select-check`,"aria-hidden":`true`},null,-1)],40,z))),128))],8,R),H.value.length===0?(m(),w(`p`,ce,y(d(u)(`common.searchableSelect.noMatches`)),1)):S(``,!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(n({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 i(e){n(`update:modelValue`,e.target.value)}return(t,n)=>(m(),w(`label`,B,[f(`span`,null,y(e.label),1),e.multiline?(m(),w(`textarea`,r({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:i}),null,16,V)):(m(),w(`input`,r({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:i}),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=n({__name:`ConnectionsPage`,setup(t){let n=k(),r=c(``),i=c([]),o=c([]),h=c(!1),b=c(null),x=c([]),A=c({}),P=c(``),F=c(`ask_human`),I=c(!1),L=v({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=p(()=>n.state?.providers?.personal?.status===`ready`),re=p(()=>n.state?.providers?.workspaces??[]),ie=p(()=>re.value.filter(({status:e})=>e===`ready`).length),ae=p(()=>{let e=n.state?.capabilities,t=[e?.browsePublicProjects?u(`pages.connections.publicCapability.discovery`):null,e?.subscribeProject?u(`pages.connections.publicCapability.subscription`):null,e?.publishProject?u(`pages.connections.publicCapability.publishing`):null,e?.submitKnowledge?u(`pages.connections.publicCapability.contribution`):null,e?.reviewProposals?u(`pages.connections.publicCapability.review`):null].filter(e=>!!e);return t.length?new Intl.ListFormat(te(),{style:`long`,type:`conjunction`}).format(t):u(`pages.connections.notAvailable`)}),R=p(()=>n.state?.subscriptions??[]),z=p(()=>n.state?.personalProjects??[]),oe=p(()=>wt(`connect-external-knowledge`)),se=p(()=>wt(`external-knowledge-conflict-policy`)),ce=p(()=>new Set(R.value.map(({provider_url:e,project_id:t})=>`${e}::${t}`))),B=p(()=>(n.state?.projects??[]).filter(e=>!ce.value.has(et(e)))),V=p(()=>B.value.map(e=>({value:et(e),label:e.name,meta:`#${N(e.id,26)}`,search:M(e.id)}))),H=p(()=>i.value.map(e=>({value:e.type,label:e.name,meta:e.description}))),q=p(()=>z.value.map(e=>({value:e.project_id,label:e.profile.name,meta:`#${N(e.project_id,26)}`,search:M(e.project_id)}))),Xe=p(()=>[{value:`hybrid`,label:u(`pages.connections.mode.hybrid`),disabled:!Y(L.connectorType,`hybrid`)},{value:`mirror`,label:u(`pages.connections.mode.mirror`),disabled:!Y(L.connectorType,`mirror`)},{value:`live`,label:u(`pages.connections.mode.live`),disabled:!Y(L.connectorType,`live`)}]),Ze=p(()=>[{value:`http`,label:`Streamable HTTP`},{value:`stdio`,label:`stdio`}]),Qe=p(()=>[{value:`cn`,label:`Feishu`},{value:`global`,label:`Lark`}]),$e=p(()=>[{value:`ask_human`,label:u(`pages.connections.askHuman`)},{value:`agent_decide`,label:u(`pages.connections.agentDecide`)}]);ee(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]),x.value=x.value.filter(e=>t.has(e)),t.has(P.value)||(P.value=n,n&&mt())},{immediate:!0}),ee(()=>L.connectorType,e=>{Y(e,L.mode)||(L.mode=_t(e))}),e(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)===r.value);if(e)try{await T(`/api/subscriptions`,{personalSpaceId:n.activePersonalSpace?.id,projectId:e.id,providerUrl:e.providerUrl,projectName:e.name}),r.value=``,n.notify(u(`pages.connections.subscribed`,{name:e.name})),await n.refresh()}catch(e){n.reportError(e)}}async function nt(e){try{let t=new URLSearchParams({personalSpaceId:n.activePersonalSpace?.id??``,providerUrl:e.provider_url});await D(`/api/subscriptions/${encodeURIComponent(e.project_id)}?${t}`),n.notify(u(`pages.connections.unsubscribed`,{name:e.project_name??e.project_id})),await n.refresh()}catch(e){n.reportError(e)}}async function J(){try{let[e,t]=await Promise.all([O(`/api/external-knowledge/connectors`),O(`/api/external-knowledge/bindings`)]);i.value=e,o.value=t}catch(e){n.reportError(e)}}async function rt(){let e=n.activePersonalSpace?.id;if(!(!e||!L.personalProjectIds.length)){h.value=!0;try{let{connectorConfig:t,source:r}=it();await T(`/api/external-knowledge/bindings`,{name:L.name.trim(),connectorType:L.connectorType,connectorConfig:t,source:r,targets:L.personalProjectIds.map(t=>({personalSpaceId:e,personalProjectId:t,mode:L.mode}))}),n.notify(u(`pages.connections.externalCreated`,{name:L.name.trim()})),L.name=``,await J()}catch(e){n.reportError(e)}finally{h.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(u(`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(u(`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){h.value=!0;try{let r=await T(`/api/external-knowledge/bindings/${encodeURIComponent(e.id)}/${t}`,{});n.notify(u(t===`sync`&&r.skippedCredentials?`pages.connections.externalSyncedWithSkipped`:t===`sync`?`pages.connections.externalSynced`:`pages.connections.externalChecked`,{name:e.name,count:r.skippedCredentials??0})),await J()}catch(e){n.reportError(e)}finally{h.value=!1}}async function ct(e){h.value=!0;try{await D(`/api/external-knowledge/bindings/${encodeURIComponent(e.id)}`),n.notify(u(`pages.connections.externalDeleted`,{name:e.name})),await J()}catch(e){n.reportError(e)}finally{h.value=!1}}function lt(e){let t=X(e);b.value=e.id,x.value=t.map(({personalProjectId:e})=>e),A.value=Object.fromEntries(t.map(({personalProjectId:e,mode:t})=>[e,t]))}function ut(){b.value=null,x.value=[],A.value={}}function dt(e){let t=o.value.find(({id:e})=>e===b.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=n.activePersonalSpace?.id;if(!(!t||!x.value.length)){h.value=!0;try{await E(`/api/external-knowledge/bindings/${encodeURIComponent(e.id)}/targets`,{targets:x.value.map(n=>({personalSpaceId:t,personalProjectId:n,mode:A.value[n]??e.mode}))}),n.notify(u(`pages.connections.projectsUpdated`,{name:e.name})),ut(),await J()}catch(e){n.reportError(e)}finally{h.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){n.reportError(e)}}async function ht(){let e=n.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,n.notify(u(`pages.connections.conflictSaved`))}catch(e){n.reportError(e)}finally{I.value=!1}}}function gt(e){return i.value.find(t=>t.type===e)?.name??e}function Y(e,t){let n=i.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:u(`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/${te()===`zh-CN`?`README.zh-CN.md`:`README.md`}#${e}`}return(e,t)=>(m(),w(`section`,ue,[f(`div`,W,[f(`h3`,null,y(d(u)(`pages.connections.title`)),1)]),f(`div`,{class:`service-connection-grid`,"aria-label":d(u)(`pages.connections.statusAria`)},[f(`article`,{class:`service-connection-card`,"data-status":ne.value?`ready`:`error`},[f(`header`,null,[t[30]||=f(`span`,{class:`service-connection-icon local`,"aria-hidden":`true`},[f(`span`,{class:`nav-icon nav-icon-personal-project`})],-1),f(`div`,null,[f(`h3`,null,y(d(u)(`pages.connections.localGraphiti`)),1)]),f(`span`,pe,y(ne.value?d(u)(`common.status.connected`):d(u)(`common.status.connectionError`)),1)]),f(`dl`,null,[f(`div`,null,[f(`dt`,null,y(d(u)(`pages.connections.storage`)),1),t[31]||=f(`dd`,null,`Neo4j`,-1)]),f(`div`,null,[f(`dt`,null,y(d(u)(`pages.connections.purpose`)),1),f(`dd`,null,y(d(u)(`pages.connections.localPurpose`)),1)])])],8,fe),f(`article`,{class:`service-connection-card`,"data-status":d(n).publicRuntimeStatus},[f(`header`,null,[t[33]||=f(`span`,{class:`service-connection-icon public`,"aria-hidden":`true`},[f(`span`,{class:`nav-icon nav-icon-public-project`})],-1),f(`div`,he,[f(`h3`,null,y(d(u)(`pages.connections.publicService`)),1),t[32]||=f(`span`,{class:`feature-badge beta`},`BETA`,-1)]),f(`span`,ge,y(d(n).publicRuntimeStatus===`ready`?d(u)(`common.status.connected`):d(n).publicRuntimeStatus===`error`?d(u)(`common.status.connectionError`):d(u)(`common.status.notConnected`)),1)]),f(`dl`,null,[f(`div`,null,[f(`dt`,null,y(d(u)(`pages.connections.currentStatus`)),1),f(`dd`,null,y(d(n).publicRuntimeStatus===`ready`?d(u)(`pages.connections.sharedServicesReady`,{count:ie.value||re.value.length}):d(u)(`pages.connections.notAvailable`)),1)]),f(`div`,null,[f(`dt`,null,y(d(u)(`pages.connections.purpose`)),1),f(`dd`,null,y(ae.value),1)])])],8,me)],8,de),f(`section`,G,[f(`div`,K,[f(`h3`,null,y(d(u)(`pages.connections.externalTitle`)),1),f(`a`,{class:`section-help-link`,"data-testid":`external-knowledge-help`,href:oe.value,"aria-label":d(u)(`pages.connections.externalHelp`),title:d(u)(`pages.connections.externalHelp`),target:`_blank`,rel:`noreferrer`},`?`,8,_e),f(`span`,ve,y(d(u)(`pages.connections.bindingCount`,{count:o.value.length})),1)]),f(`div`,ye,[(m(!0),w(g,null,a(o.value,e=>(m(),w(`article`,{key:e.id,class:`external-binding-row`,"data-status":e.status},[t[34]||=f(`i`,{"aria-hidden":`true`},null,-1),f(`div`,xe,[f(`strong`,null,y(e.name),1),f(`span`,null,y(gt(e.connectorType)),1),f(`div`,Se,[f(`b`,null,y(d(u)(`pages.connections.boundTo`)),1),(m(!0),w(g,null,a(X(e),e=>(m(),w(`span`,{key:e.id,class:`external-binding-target-chip`,"data-status":e.status},y(bt(e.personalProjectId))+` · `+y(d(u)(`pages.connections.mode.${e.mode}`)),9,Ce))),128))]),xt(e)?(m(),w(`small`,we,y(xt(e)),1)):St(e)?(m(),w(`small`,Te,y(d(u)(`pages.connections.credentialsSkipped`,{count:St(e)})),1)):S(``,!0)]),f(`div`,Ee,[f(`button`,{class:`quiet-button`,type:`button`,disabled:h.value,onClick:t=>at(e)},y(d(u)(`pages.connections.check`)),9,De),f(`button`,{class:`quiet-button external-sync-action`,type:`button`,disabled:h.value||!yt(e),onClick:t=>ot(e)},y(d(u)(`pages.connections.sync`)),9,Oe),f(`button`,{class:`quiet-button`,type:`button`,disabled:h.value,onClick:t=>lt(e)},y(d(u)(`pages.connections.manageProjects`)),9,ke),f(`button`,{class:`quiet-button danger`,type:`button`,disabled:h.value,onClick:t=>ct(e)},y(d(u)(`pages.connections.disconnect`)),9,Ae)]),b.value===e.id?(m(),w(`div`,je,[f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.targetProjects`)),1),s(le,{modelValue:x.value,"onUpdate:modelValue":t[0]||=e=>x.value=e,"control-id":`external-projects-${e.id}`,label:d(u)(`pages.connections.targetProjects`),options:q.value,disabled:h.value,required:``,searchable:``,onChange:dt},null,8,[`modelValue`,`control-id`,`label`,`options`,`disabled`])]),f(`div`,Me,[(m(!0),w(g,null,a(x.value,t=>(m(),w(`div`,{key:t,class:`external-target-mode-row`},[f(`span`,null,y(bt(t)),1),s(j,{"model-value":A.value[t]??e.mode,"control-id":`external-target-mode-${e.id}-${t}`,label:d(u)(`pages.connections.bindingMode`),options:vt(e.connectorType),disabled:h.value,"onUpdate:modelValue":e=>ft(t,e)},null,8,[`model-value`,`control-id`,`label`,`options`,`disabled`,`onUpdate:modelValue`])]))),128))]),f(`div`,Ne,[f(`button`,{class:`quiet-button`,type:`button`,disabled:h.value,onClick:ut},y(d(u)(`common.actions.cancel`)),9,Pe),f(`button`,{class:`primary-action`,type:`button`,disabled:h.value||!x.value.length,onClick:t=>pt(e)},y(d(u)(`pages.connections.saveProjects`)),9,Fe)])])):S(``,!0)],8,be))),128)),o.value.length?S(``,!0):(m(),w(`div`,Ie,y(d(u)(`pages.connections.noExternalBindings`)),1))]),f(`form`,{class:`external-binding-form`,onSubmit:_(rt,[`prevent`])},[s(U,{modelValue:L.name,"onUpdate:modelValue":t[1]||=e=>L.name=e,label:d(u)(`pages.connections.bindingName`),"data-testid":`external-name`,required:``},null,8,[`modelValue`,`label`]),f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.connector`)),1),s(j,{modelValue:L.connectorType,"onUpdate:modelValue":t[2]||=e=>L.connectorType=e,"control-id":`external-connector`,label:d(u)(`pages.connections.connector`),options:H.value,disabled:h.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.targetProjects`)),1),s(le,{modelValue:L.personalProjectIds,"onUpdate:modelValue":t[3]||=e=>L.personalProjectIds=e,"control-id":`external-projects`,label:d(u)(`pages.connections.targetProjects`),options:q.value,disabled:h.value,required:``,searchable:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.bindingMode`)),1),s(j,{modelValue:L.mode,"onUpdate:modelValue":t[4]||=e=>L.mode=e,"control-id":`external-binding-mode`,label:d(u)(`pages.connections.bindingMode`),options:Xe.value,disabled:h.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),L.connectorType===`mcp`?(m(),w(g,{key:0},[f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.transport`)),1),s(j,{modelValue:L.mcpTransport,"onUpdate:modelValue":t[5]||=e=>L.mcpTransport=e,"control-id":`external-mcp-transport`,label:d(u)(`pages.connections.transport`),options:Ze.value,disabled:h.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),L.mcpTransport===`http`?(m(),l(U,{key:0,modelValue:L.mcpUrl,"onUpdate:modelValue":t[6]||=e=>L.mcpUrl=e,label:`MCP URL`,"data-testid":`mcp-url`,type:`url`,required:``},null,8,[`modelValue`])):(m(),l(U,{key:1,modelValue:L.mcpCommand,"onUpdate:modelValue":t[7]||=e=>L.mcpCommand=e,label:d(u)(`pages.connections.command`),required:``},null,8,[`modelValue`,`label`])),L.mcpTransport===`stdio`?(m(),l(U,{key:2,modelValue:L.mcpArgs,"onUpdate:modelValue":t[8]||=e=>L.mcpArgs=e,label:d(u)(`pages.connections.arguments`)},null,8,[`modelValue`,`label`])):(m(),l(U,{key:3,modelValue:L.mcpTokenEnv,"onUpdate:modelValue":t[9]||=e=>L.mcpTokenEnv=e,label:d(u)(`pages.connections.tokenEnv`),"data-testid":`mcp-token-env`},null,8,[`modelValue`,`label`])),s(U,{modelValue:L.mcpResourcePrefix,"onUpdate:modelValue":t[10]||=e=>L.mcpResourcePrefix=e,label:d(u)(`pages.connections.resourcePrefix`),"data-testid":`mcp-resource-prefix`},null,8,[`modelValue`,`label`])],64)):L.connectorType===`notion`?(m(),w(g,{key:1},[s(U,{modelValue:L.notionTokenEnv,"onUpdate:modelValue":t[11]||=e=>L.notionTokenEnv=e,label:d(u)(`pages.connections.tokenEnv`),required:``},null,8,[`modelValue`,`label`]),s(U,{modelValue:L.notionPageIds,"onUpdate:modelValue":t[12]||=e=>L.notionPageIds=e,label:`Page IDs`},null,8,[`modelValue`]),s(U,{modelValue:L.notionDataSourceIds,"onUpdate:modelValue":t[13]||=e=>L.notionDataSourceIds=e,label:`Data Source IDs`},null,8,[`modelValue`])],64)):L.connectorType===`feishu`?(m(),w(g,{key:2},[s(U,{modelValue:L.feishuTokenEnv,"onUpdate:modelValue":t[14]||=e=>L.feishuTokenEnv=e,label:d(u)(`pages.connections.tokenEnv`),required:``},null,8,[`modelValue`,`label`]),f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.region`)),1),s(j,{modelValue:L.feishuRegion,"onUpdate:modelValue":t[15]||=e=>L.feishuRegion=e,"control-id":`external-feishu-region`,label:d(u)(`pages.connections.region`),options:Qe.value,disabled:h.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),s(U,{modelValue:L.feishuSpaceId,"onUpdate:modelValue":t[16]||=e=>L.feishuSpaceId=e,label:`Space ID`},null,8,[`modelValue`]),s(U,{modelValue:L.feishuRootNodeToken,"onUpdate:modelValue":t[17]||=e=>L.feishuRootNodeToken=e,label:`Root Node Token`},null,8,[`modelValue`]),s(U,{modelValue:L.feishuNodeTokens,"onUpdate:modelValue":t[18]||=e=>L.feishuNodeTokens=e,label:`Node Tokens`},null,8,[`modelValue`]),s(U,{modelValue:L.feishuWebBaseUrl,"onUpdate:modelValue":t[19]||=e=>L.feishuWebBaseUrl=e,label:`Web URL`,type:`url`},null,8,[`modelValue`])],64)):L.connectorType===`retrieval_api`?(m(),w(g,{key:3},[s(U,{modelValue:L.retrievalUrl,"onUpdate:modelValue":t[20]||=e=>L.retrievalUrl=e,label:d(u)(`pages.connections.retrievalUrl`),type:`url`,required:``},null,8,[`modelValue`,`label`]),s(U,{modelValue:L.retrievalTokenEnv,"onUpdate:modelValue":t[21]||=e=>L.retrievalTokenEnv=e,label:d(u)(`pages.connections.tokenEnv`)},null,8,[`modelValue`,`label`]),s(U,{modelValue:L.retrievalKnowledgeIds,"onUpdate:modelValue":t[22]||=e=>L.retrievalKnowledgeIds=e,label:d(u)(`pages.connections.knowledgeIds`),required:``},null,8,[`modelValue`,`label`]),s(U,{modelValue:L.retrievalScoreThreshold,"onUpdate:modelValue":t[23]||=e=>L.retrievalScoreThreshold=e,label:d(u)(`pages.connections.scoreThreshold`),inputmode:`decimal`,required:``},null,8,[`modelValue`,`label`])],64)):(m(),w(g,{key:4},[s(U,{modelValue:L.customModule,"onUpdate:modelValue":t[24]||=e=>L.customModule=e,label:d(u)(`pages.connections.module`),required:``},null,8,[`modelValue`,`label`]),s(U,{modelValue:L.customEnvironmentNames,"onUpdate:modelValue":t[25]||=e=>L.customEnvironmentNames=e,label:d(u)(`pages.connections.environmentNames`)},null,8,[`modelValue`,`label`]),f(`div`,Le,[s(U,{modelValue:L.customSourceJson,"onUpdate:modelValue":t[26]||=e=>L.customSourceJson=e,label:d(u)(`pages.connections.sourceJson`),multiline:``,required:``},null,8,[`modelValue`,`label`])]),f(`span`,Re,y(d(u)(`pages.connections.trustedCode`)),1)],64)),f(`button`,{class:`primary-action external-create-action`,type:`submit`,disabled:h.value||!z.value.length||!L.personalProjectIds.length},[t[35]||=f(`span`,{class:`external-create-action-icon`,"aria-hidden":`true`},null,-1),f(`span`,null,y(d(u)(`pages.connections.connect`)),1)],8,ze)],32)]),z.value.length?(m(),w(`section`,Be,[f(`div`,Ve,[f(`h3`,null,y(d(u)(`pages.connections.conflictTitle`)),1),f(`a`,{class:`section-help-link`,"data-testid":`conflict-policy-help`,href:se.value,"aria-label":d(u)(`pages.connections.conflictHelp`),title:d(u)(`pages.connections.conflictHelp`),target:`_blank`,rel:`noreferrer`},`?`,8,He)]),f(`div`,Ue,[f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.targetProject`)),1),s(j,{modelValue:P.value,"onUpdate:modelValue":t[27]||=e=>P.value=e,"control-id":`external-conflict-project`,label:d(u)(`pages.connections.targetProject`),options:q.value,disabled:I.value,required:``,onChange:mt},null,8,[`modelValue`,`label`,`options`,`disabled`])]),f(`label`,null,[f(`span`,null,y(d(u)(`pages.connections.conflictAction`)),1),s(j,{modelValue:F.value,"onUpdate:modelValue":t[28]||=e=>F.value=e,"control-id":`external-conflict-mode`,label:d(u)(`pages.connections.conflictAction`),options:$e.value,disabled:I.value,required:``,onChange:ht},null,8,[`modelValue`,`label`,`options`,`disabled`])])])])):S(``,!0),d(n).state?.capabilities?.subscribeProject?(m(),w(`section`,We,[f(`div`,Ge,[f(`h3`,null,[C(y(d(u)(`pages.connections.subscriptionsTitle`))+` `,1),t[36]||=f(`span`,{class:`feature-badge beta`},`BETA`,-1)])]),f(`div`,Ke,[(m(!0),w(g,null,a(R.value,e=>(m(),w(`div`,{key:`${e.provider_url}:${e.project_id}`,class:`subscription-row`},[t[37]||=f(`span`,null,`↗`,-1),f(`div`,null,[f(`strong`,null,y(e.project_name??e.project_id),1),f(`span`,null,y(d(u)(`pages.connections.sharedProject`)),1)]),f(`button`,{class:`secondary-action subscription-action`,type:`button`,onClick:t=>nt(e)},y(d(u)(`pages.connections.unsubscribe`)),9,qe)]))),128)),R.value.length?S(``,!0):(m(),w(`div`,Je,y(d(u)(`pages.connections.noSubscriptions`)),1))]),f(`form`,{class:`subscription-form`,onSubmit:_(tt,[`prevent`])},[s(j,{modelValue:r.value,"onUpdate:modelValue":t[29]||=e=>r.value=e,options:V.value,label:d(u)(`pages.connections.sharedProjectLabel`),placeholder:d(u)(`pages.connections.choosePublicProject`),searchable:``,required:``},null,8,[`modelValue`,`options`,`label`,`placeholder`]),f(`button`,Ye,y(d(u)(`pages.connections.subscribe`)),1)],32)])):S(``,!0)]))}});export{q as default};
@@ -0,0 +1 @@
1
+ import{A as e,B as t,C as n,I as r,L as i,N as a,O as o,S as s,Y as c,_ as l,a as u,et as d,f,g as p,h as m,j as h,k as g,m as ee,p as te,rt as _,tt as ne,u as v,v as y,x as b,y as x,z as S}from"./i18n-CgBHZthI.js";import{a as C}from"./console-tOxOl8Vq.js";import{t as w}from"./vue-router-CzHm-y-x.js";import{t as T}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{a as E,n as D,o as O,r as k,t as A}from"./catalog-DFvIaHVS.js";import{n as j}from"./paths-CDREouhi.js";import{t as M}from"./SearchableSelect-D27H0MoP.js";var N={class:`project-scope-heading`},re=[`id`],P={key:0,class:`project-scope-count`,role:`status`},F=[`disabled`,`aria-expanded`,`aria-controls`,`aria-labelledby`],I={key:0,viewBox:`0 0 20 20`,width:`18`,height:`18`,"aria-hidden":`true`},L=[`id`],R={key:1,class:`project-scope-multiple`},z=[`id`,`aria-labelledby`],B=[`placeholder`,`aria-label`,`disabled`],ie={class:`project-scope-bulk`},ae={class:`project-scope-option project-scope-all`},oe=[`checked`,`indeterminate`,`disabled`],V=[`disabled`],H={class:`project-scope-list`},se=[`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`},ce={key:1,class:`project-scope-hint`},le={key:2,class:`project-scope-hint`},q=T(n({__name:`ProjectScopePicker`,props:{modelValue:{},projects:{},disabled:{type:Boolean},inline:{type:Boolean},label:{},hint:{},emptyLabel:{},compact:{type:Boolean}},emits:[`update:modelValue`],setup(n,{emit:s}){let l=n,S=s,C=c(null),w=c(null),T=c(null),E=c(!1),D=c(``),O=`employee-projects-${r().replace(/[^a-zA-Z0-9_-]/g,``)}`,k=m(()=>new Set(l.modelValue)),A=m(()=>l.projects.filter(e=>k.value.has(e.id)).length),j=m(()=>l.projects.length>0&&A.value===l.projects.length),M=m(()=>l.label??u(`employees.scope.label`)),q=m(()=>{let e=new Map;for(let t of l.projects)e.set(t.name,(e.get(t.name)??0)+1);return new Set([...e].filter(([,e])=>e>1).map(([e])=>e))}),J=m(()=>{let e=l.projects.find(e=>k.value.has(e.id));return e?`${e.name}${q.value.has(e.name)?` · ${e.id}`:``}`:``}),ue=m(()=>j.value?u(`employees.scope.allSummary`,{count:A.value}):A.value===1?J.value:A.value?u(`employees.scope.selected`,{count:A.value}):l.emptyLabel??u(`employees.unassigned`)),Y=m(()=>{let e=D.value.trim().toLocaleLowerCase();return l.projects.filter(t=>`${t.name} ${t.id}`.toLocaleLowerCase().includes(e))});i(()=>l.disabled,e=>{e&&X()}),e(()=>document.addEventListener(`pointerdown`,fe)),g(()=>document.removeEventListener(`pointerdown`,fe));async function de(){if(!l.disabled){if(E.value){X();return}D.value=``,E.value=!0,await o(),T.value?.focus()}}function X(e=!1){E.value=!1,e&&o(()=>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){l.disabled||S(`update:modelValue`,e)}function he(){Z(j.value?[]:l.projects.map(e=>e.id))}function ge(){Z(l.projects.filter(e=>!k.value.has(e.id)).map(e=>e.id))}function _e(e){let t=new Set(l.modelValue);t.has(e)?t.delete(e):t.add(e),Z(l.projects.filter(e=>t.has(e.id)).map(e=>e.id))}return(e,r)=>(h(),x(`div`,{ref_key:`root`,ref:C,class:ne([`project-scope-picker`,{"is-inline":n.inline,"is-compact":n.compact}]),onFocusout:pe,onKeydown:me},[p(`div`,N,[p(`span`,{id:`${O}-label`,class:`project-scope-label`},_(M.value),9,re),n.inline?(h(),x(`span`,P,_(d(u)(`employees.scope.count`,{selected:A.value,total:n.projects.length})),1)):y(``,!0)]),n.inline?y(``,!0):(h(),x(`button`,{key:0,ref_key:`trigger`,ref:w,type:`button`,class:`project-scope-trigger`,disabled:n.disabled,"aria-expanded":E.value,"aria-controls":`${O}-panel`,"aria-labelledby":`${O}-label ${O}-value`,onClick:de},[n.compact?(h(),x(`svg`,I,[...r[3]||=[p(`path`,{d:`M3 5h14M5.5 10h9M8 15h4`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.6`,"stroke-linecap":`round`},null,-1)]])):y(``,!0),p(`span`,{id:`${O}-value`,class:`project-scope-value`},_(ue.value),9,L),n.compact?(h(),x(`small`,R,_(d(u)(`employees.scope.multiple`)),1)):y(``,!0),r[4]||=p(`svg`,{viewBox:`0 0 20 20`,width:`18`,height:`18`,"aria-hidden":`true`},[p(`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,F)),n.inline||E.value?(h(),x(`div`,{key:1,id:`${O}-panel`,class:`project-scope-panel`,role:`group`,"aria-labelledby":`${O}-label`},[t(p(`input`,{ref_key:`search`,ref:T,"onUpdate:modelValue":r[0]||=e=>D.value=e,type:`search`,class:`project-scope-search`,placeholder:d(u)(`employees.scope.search`),"aria-label":d(u)(`employees.scope.search`),disabled:n.disabled,onKeydown:r[1]||=f(te(()=>{},[`prevent`]),[`enter`])},null,40,B),[[v,D.value]]),p(`div`,ie,[p(`label`,ae,[p(`input`,{type:`checkbox`,checked:j.value,indeterminate:A.value>0&&!j.value,disabled:n.disabled||!n.projects.length,onChange:he},null,40,oe),p(`span`,null,[b(_(d(u)(`employees.scope.all`))+` `,1),p(`small`,null,_(n.projects.length),1)])]),p(`button`,{type:`button`,disabled:n.disabled||!n.projects.length,onClick:ge},_(d(u)(`employees.scope.invert`)),9,V)]),p(`div`,H,[(h(!0),x(ee,null,a(Y.value,e=>(h(),x(`label`,{key:e.id,class:ne([`project-scope-option`,{"is-selected":k.value.has(e.id)}])},[p(`input`,{type:`checkbox`,value:e.id,checked:k.value.has(e.id),disabled:n.disabled,onChange:t=>_e(e.id)},null,40,se),p(`span`,null,[b(_(e.name),1),q.value.has(e.name)?(h(),x(`small`,U,_(e.id),1)):y(``,!0)])],2))),128)),Y.value.length?y(``,!0):(h(),x(`p`,W,_(d(u)(n.projects.length?`employees.scope.noMatch`:`employees.scope.empty`)),1))]),n.inline?y(``,!0):(h(),x(`div`,G,[p(`span`,K,_(d(u)(`employees.scope.count`,{selected:A.value,total:n.projects.length})),1),p(`button`,{type:`button`,onClick:r[2]||=e=>X(!0)},_(d(u)(`employees.scope.done`)),1)])),n.compact&&n.hint?(h(),x(`p`,ce,_(n.hint),1)):y(``,!0)],8,z)):y(``,!0),!n.compact&&n.hint!==``?(h(),x(`p`,le,_(n.hint??d(u)(`employees.scope.snapshotHint`)),1)):y(``,!0)],34))}}),[[`__scopeId`,`data-v-f8d66833`]]),J=[`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 ue(e,t){let n=c(null),r=c(null),a=null,s=0;i(e,t=>{let i=++s;if(t){a=document.activeElement instanceof HTMLElement?document.activeElement:null,o().then(()=>{if(i!==s||!e())return;let t=n.value;t&&(t.open||t.showModal(),(r.value??Y(t)[0])?.focus({preventScroll:!0}))});return}let c=n.value;c?.open&&c.close(),l(i)},{immediate:!0}),g(()=>{s+=1;let e=n.value;e?.open&&e.close();let t=a;a=null,t?.isConnected&&t.focus({preventScroll:!0})});function l(e){let t=a;a=null,o().then(()=>{e!==s||!t?.isConnected||t.focus({preventScroll:!0})})}function u(e){e.preventDefault(),t()}function d(e){if(e.key!==`Tab`)return;let t=n.value;if(!t)return;let r=Y(t);if(!r.length){e.preventDefault(),t.focus({preventScroll:!0});return}let i=r[0],a=r.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:n,initialFocusRef:r,onCancel:u,onKeydown:d}}function Y(e){return[...e.querySelectorAll(J)].filter(e=>!e.hidden&&e.getAttribute(`aria-hidden`)!==`true`)}var de={class:`employee-recruit-heading`},X={id:`employee-recruit-title`},fe=[`disabled`],pe={key:0,role:`status`},me={key:1,role:`alert`,class:`employee-message`},Z={key:2},he={class:`employee-recruit-body`},ge={key:0,class:`employee-picker-field`},_e={class:`employee-profile`},ve={class:`employee-avatar`,"aria-hidden":`true`},ye={class:`employee-specialties`},be={key:1,class:`employee-muted`,role:`status`},xe=[`aria-label`],Se=[`data-scope`,`aria-checked`,`tabindex`,`disabled`,`onClick`],Ce={key:3,class:`employee-scope-rule`,role:`status`},we={key:4,class:`employee-muted`},Te={key:5,class:`employee-muted`},Ee={key:6,class:`employee-muted`},De=[`aria-label`],Oe={class:`employee-title-controls`},ke={class:`employee-picker-field`},Ae={class:`employee-picker-field`},je={class:`employee-title-preview`},Me={class:`employee-muted`},Ne=[`aria-label`],Pe={key:9,class:`employee-error`,role:`alert`},Fe=[`disabled`],Ie={key:11,class:`employee-success`,role:`status`},Le={class:`employee-recruit-actions`},Re=[`disabled`],ze=[`disabled`],Be=T(n({__name:`EmployeeRecruitDialog`,props:{open:{type:Boolean},personalSpaceId:{},projects:{},defaultProjectId:{},defaultProjectIds:{},templateId:{}},emits:[`close`,`recruited`],setup(e,{emit:t}){let n=e,r=t,o=c([]),f=c([]),g=c(`selected`),v=c([]),T=c(`auto`),N=c(`emoji`),re=c(``),P=c(``),F=c(!1),I=c(!1),L=c(``),R=c(!1),z=c(``),B=c(null),{dialogRef:ie,initialFocusRef:ae,onCancel:oe,onKeydown:V}=ue(()=>n.open,$),H=m(()=>n.templateId?E.value.find(e=>e.id===n.templateId):E.value.find(e=>e.id===L.value)??E.value[0]),se=m(()=>H.value?.agentId?u(`employees.manageProjectsTitle`,{name:H.value.name}):u(`employees.recruit`)),U=m(()=>n.projects.filter(e=>e.profile.lifecycle!==`archived`).map(e=>({id:e.project_id,name:e.profile.name}))),W=m(()=>H.value?.management!==void 0),G=m({get:()=>g.value===`all`?U.value.filter(e=>!v.value.includes(e.id)).map(e=>e.id):o.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 o.value=e}}),K=m(()=>({mode:g.value,projectIds:g.value===`selected`?[...o.value].sort():[],excludedProjectIds:g.value===`all`?[...v.value].sort():[],titleMode:T.value,titleStyle:N.value})),ce=m(()=>[`auto`,`suggest`,`off`].map(e=>({value:e,label:u(`employees.titles.${e}`)}))),le=m(()=>[`emoji`,`text`].map(e=>({value:e,label:u(`employees.titles.${e}`)}))),J=m(()=>new Set(f.value)),Y=m(()=>[...J.value].filter(e=>!G.value.includes(e))),Be=m(()=>!!(H.value?.agentStatus&&H.value.agentStatus!==`active`)),Q=m(()=>H.value?.agentStatus===`active`&&(W.value?JSON.stringify(K.value)===re.value&&(g.value===`all`||o.value.length===J.value.size&&o.value.every(e=>J.value.has(e))):o.value.length===J.value.size&&o.value.every(e=>J.value.has(e)))),Ve=m(()=>R.value?u(`employees.recruiting`):Be.value?u(`employees.rehire`,{name:H.value?.name??``}):Q.value||H.value?.agentId?u(`employees.assign`):u(`employees.recruitName`,{name:H.value?.name??``})),He=m(()=>H.value&&G.value.length?`/employees/${encodeURIComponent(H.value.id)}?project=${encodeURIComponent(G.value[0])}`:``),Ue=0;i([()=>n.open,()=>n.personalSpaceId,()=>n.templateId],([e])=>{Ue+=1,e&&Ge(!0)},{immediate:!0}),i(L,()=>{n.open&&!F.value&&We(!0)}),i(K,()=>{z.value=I.value?z.value:``,B.value=null},{flush:`sync`});function We(e=!1){let t=new Set(U.value.map(e=>e.id));f.value=[...new Set((H.value?.assignments??[]).filter(e=>e.status===`active`&&t.has(e.personalProjectId)).map(e=>e.personalProjectId))];let r=e&&!H.value?.agentId?n.defaultProjectIds??(n.defaultProjectId?[n.defaultProjectId]:[]):[];o.value=[...new Set([...f.value,...r.filter(e=>t.has(e))])];let i=H.value?.management;g.value=i?.mode??`selected`,v.value=[...i?.excludedProjectIds??[]],T.value=i?.titleMode??`auto`,N.value=i?.titleStyle??`emoji`,i?.mode===`selected`&&H.value?.agentId&&(o.value=i.projectIds.filter(e=>t.has(e))),i?.mode===`all`&&H.value?.agentId&&(f.value=[...G.value]),re.value=JSON.stringify(K.value),P.value=H.value?.assignmentsVersion??``,I.value=!1,z.value=``,B.value=null}async function Ge(e=!1){let t=++Ue;F.value=!0,await O(n.personalSpaceId),!(t!==Ue||!n.open)&&(A.value||We(e),F.value=!1)}function $(){R.value||r(`close`)}async function Ke(){if(!H.value||H.value.identityConflict||!n.personalSpaceId||R.value||F.value||I.value||!P.value||Q.value)return;R.value=!0,z.value=``;let e=H.value.id;try{let t=await C(`/api/employee-templates/${encodeURIComponent(e)}/recruit`,{personalSpaceId:n.personalSpaceId,...W.value?{management:K.value}:{personalProjectIds:[...o.value]},replaceAssignments:!0,expectedAssignmentsVersion:P.value,...Be.value?{reactivate:!0}:{}});await O(n.personalSpaceId),We(),B.value=t,r(`recruited`,t)}catch(e){z.value=k(e);try{let t=JSON.parse(e instanceof Error?e.message:``);I.value=t.code===`assignment_scope_conflict`||t.code===`assignment_update_incomplete`}catch{}}finally{R.value=!1}}function qe(e){e===`selected`&&(o.value=[...G.value]),g.value=e}function Je(e){if(!(R.value||F.value||I.value)&&[`ArrowLeft`,`ArrowRight`,`Home`,`End`].includes(e.key)){e.preventDefault();let t=e.key===`Home`?`all`:e.key===`End`||g.value===`all`?`selected`:`all`;qe(t),e.currentTarget.querySelector(`[data-scope="${t}"]`)?.focus()}}return(t,r)=>e.open?(h(),x(`dialog`,{key:0,ref_key:`dialogRef`,ref:ie,class:`employee-recruit-dialog`,"aria-modal":`true`,"aria-labelledby":`employee-recruit-title`,onCancel:r[6]||=(...e)=>d(oe)&&d(oe)(...e),onKeydown:r[7]||=(...e)=>d(V)&&d(V)(...e)},[p(`header`,de,[p(`h2`,X,_(se.value),1),p(`button`,{ref_key:`initialFocusRef`,ref:ae,type:`button`,class:`quiet-button`,disabled:R.value,onClick:$},_(d(u)(`employees.close`)),9,fe)]),d(D)&&!d(E).length?(h(),x(`p`,pe,_(d(u)(`employees.loading`)),1)):d(A)?(h(),x(`div`,me,[p(`p`,null,_(d(A)),1),p(`button`,{class:`quiet-button`,type:`button`,onClick:r[0]||=e=>Ge(!0)},_(d(u)(`employees.retry`)),1)])):H.value?(h(),x(`form`,{key:3,onSubmit:te(Ke,[`prevent`])},[p(`div`,he,[d(E).length>1&&!n.templateId?(h(),x(`div`,ge,[p(`span`,null,_(d(u)(`employees.choose`)),1),s(M,{modelValue:L.value,"onUpdate:modelValue":r[1]||=e=>L.value=e,"control-id":`employee-template`,label:d(u)(`employees.choose`),options:d(E).map(e=>({value:e.id,label:e.name,meta:e.role})),disabled:R.value||F.value},null,8,[`modelValue`,`label`,`options`,`disabled`])])):y(``,!0),p(`div`,_e,[p(`span`,ve,_(H.value.name.slice(0,1)),1),p(`div`,null,[p(`h3`,null,[b(_(H.value.name)+` `,1),p(`span`,null,_(H.value.role),1)]),p(`p`,null,_(H.value.description),1)])]),p(`p`,ye,_(H.value.capabilities.join(` · `)),1),F.value?(h(),x(`p`,be,_(d(u)(`employees.loadingScope`)),1)):y(``,!0),W.value?(h(),x(`div`,{key:2,class:`employee-scope-mode`,role:`radiogroup`,"aria-label":d(u)(`employees.scope.rule`),onKeydown:Je},[(h(),x(ee,null,a([`all`,`selected`],e=>p(`button`,{key:e,type:`button`,role:`radio`,"data-scope":e,"aria-checked":g.value===e,tabindex:g.value===e?0:-1,disabled:R.value||F.value||I.value,onClick:t=>qe(e)},_(d(u)(`employees.scope.${e===`all`?`continuousAll`:`onlySelected`}`)),9,Se)),64))],40,xe)):y(``,!0),W.value?(h(),x(`p`,Ce,_(g.value===`all`?d(u)(`employees.scope.allHint`,{name:H.value.name}):d(u)(`employees.scope.selectedHint`)),1)):y(``,!0),s(q,{modelValue:G.value,"onUpdate:modelValue":r[2]||=e=>G.value=e,projects:U.value,inline:``,hint:g.value===`all`?d(u)(`employees.scope.excludeHint`):void 0,disabled:R.value||F.value||I.value},null,8,[`modelValue`,`projects`,`hint`,`disabled`]),g.value===`all`&&v.value.length?(h(),x(`p`,we,_(d(u)(`employees.scope.excludedCount`,{count:v.value.length})),1)):y(``,!0),U.value.length?y(``,!0):(h(),x(`p`,Te,[b(_(d(u)(`employees.noProjects`))+` `,1),s(d(w),{to:d(j)(e.personalSpaceId,`directory`),onClick:$},{default:S(()=>[b(_(d(u)(`employees.createProject`)),1)]),_:1},8,[`to`])])),Y.value.length&&!B.value?(h(),x(`p`,Ee,_(d(u)(`employees.scopeRemoved`,{count:Y.value.length})),1)):y(``,!0),W.value&&H.value.permissions.includes(`session.title`)?(h(),x(`section`,{key:7,class:`employee-title-settings`,"aria-label":d(u)(`employees.titles.heading`)},[p(`h3`,null,_(d(u)(`employees.titles.heading`)),1),p(`div`,Oe,[p(`div`,ke,[p(`span`,null,_(d(u)(`employees.titles.mode`)),1),s(M,{modelValue:T.value,"onUpdate:modelValue":r[3]||=e=>T.value=e,"control-id":`employee-title-mode`,label:d(u)(`employees.titles.mode`),options:ce.value,disabled:R.value||F.value||I.value},null,8,[`modelValue`,`label`,`options`,`disabled`])]),p(`div`,Ae,[p(`span`,null,_(d(u)(`employees.titles.style`)),1),s(M,{modelValue:N.value,"onUpdate:modelValue":r[4]||=e=>N.value=e,"control-id":`employee-title-style`,label:d(u)(`employees.titles.style`),options:le.value,disabled:R.value||F.value||I.value||T.value===`off`},null,8,[`modelValue`,`label`,`options`,`disabled`])])]),p(`p`,je,[b(_(d(u)(`employees.titles.example`))+` `,1),p(`span`,null,`【P1|`+_(N.value===`emoji`?`🔧 `:``)+`FIX|`+_(d(u)(`employees.titles.exampleTask`))+`】`,1)]),p(`p`,Me,_(d(u)(`employees.titles.boundary`)),1)],8,De)):y(``,!0),p(`section`,{class:`employee-permissions`,"aria-label":d(u)(`employees.permissions`)},[p(`strong`,null,_(d(u)(`employees.permissions`)),1),p(`ul`,null,[(h(!0),x(ee,null,a(H.value.permissions,e=>(h(),x(`li`,{key:e},_(e===`board.read`?d(u)(`employees.boardRead`):e===`board.write`?d(u)(`employees.boardWrite`):e===`session.title`?d(u)(`employees.titles.heading`):e),1))),128))]),p(`p`,null,_(d(u)(`employees.noExecutor`)),1)],8,Ne),H.value.runtime?(h(),x(`p`,{key:8,class:ne([`employee-runtime`,{"is-warning":H.value.runtimeStatus!==`ready`}])},_(H.value.runtimeStatus===`ready`?d(u)(`employees.hostReady`):d(u)(`employees.installRequired`)),3)):y(``,!0),z.value||H.value.identityConflict?(h(),x(`p`,Pe,_(z.value||d(u)(`employees.errors.identity_conflict`)),1)):y(``,!0),I.value?(h(),x(`button`,{key:10,type:`button`,class:`quiet-button`,disabled:F.value,onClick:r[5]||=e=>Ge()},_(d(u)(`employees.reloadScope`)),9,Fe)):y(``,!0),B.value?(h(),x(`div`,Ie,[p(`strong`,null,_(d(u)(`employees.scopeSaved`)),1),p(`p`,null,_(g.value===`all`?d(u)(`employees.scope.successAll`,{count:G.value.length}):G.value.length?d(u)(`employees.successMultiple`,{count:G.value.length}):d(u)(`employees.successUnassigned`)),1)])):y(``,!0)]),p(`footer`,Le,[p(`button`,{class:`quiet-button`,type:`button`,disabled:R.value,onClick:$},_(d(u)(`employees.cancel`)),9,Re),Q.value&&He.value&&!R.value&&!F.value&&!I.value&&H.value.runtimeStatus===`ready`?(h(),l(d(w),{key:0,class:`employee-primary`,to:He.value,onClick:$},{default:S(()=>[b(_(d(u)(`employees.open`)),1)]),_:1},8,[`to`])):(h(),x(`button`,{key:1,class:`employee-primary`,type:`submit`,disabled:R.value||F.value||I.value||!P.value||Q.value||H.value.identityConflict||!e.personalSpaceId},_(Ve.value),9,ze))])],32)):(h(),x(`p`,Z,_(d(u)(`employees.noTemplates`)),1))],544)):y(``,!0)}}),[[`__scopeId`,`data-v-fbb19f26`]]);export{ue as n,q as r,Be as t};
@@ -0,0 +1 @@
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-fbb19f26]{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-fbb19f26]{flex-direction:column;display:flex}.employee-recruit-dialog>form[data-v-fbb19f26]{flex-direction:column;min-height:0;display:flex}.employee-recruit-body[data-v-fbb19f26]{overscroll-behavior:contain;min-height:0;padding:0 28px 20px;overflow-y:auto}.employee-recruit-dialog[data-v-fbb19f26]>:is(p,.employee-message){margin:0 28px 28px}.employee-recruit-dialog[data-v-fbb19f26]::backdrop{background:#14291f52}.employee-recruit-heading[data-v-fbb19f26]{flex:none;justify-content:space-between;align-items:center;gap:16px;padding:22px 28px;display:flex}.employee-recruit-heading h2[data-v-fbb19f26]{margin:0;font-size:20px;line-height:1.4}.employee-profile[data-v-fbb19f26]{align-items:center;gap:16px;margin-bottom:12px;display:flex}.employee-profile h3[data-v-fbb19f26]{margin:0 0 4px;font-size:21px;line-height:1.35}.employee-profile h3 span[data-v-fbb19f26]{color:#5a6960;margin-left:8px;font-size:13px;font-weight:500;display:inline-block}.employee-profile p[data-v-fbb19f26],.employee-success p[data-v-fbb19f26]{color:#536259;margin:0}.employee-avatar[data-v-fbb19f26]{color:#315c43;background:#e7eee9;border-radius:14px;flex:0 0 52px;place-items:center;height:52px;font-size:27px;font-weight:650;display:grid}.employee-specialties[data-v-fbb19f26]{color:#59695f;margin:0 0 24px;font-size:12px}.employee-scope-mode[data-v-fbb19f26]{background:#f0f3f1;border-radius:10px;gap:4px;margin:0 0 10px;padding:4px;display:flex}.employee-scope-mode button[data-v-fbb19f26]{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-fbb19f26]{color:#294f39;background:#fff;font-weight:600;box-shadow:0 1px 3px #142b1e17}.employee-scope-mode button[data-v-fbb19f26]:hover:not(:disabled){color:#234c34;background:#e6eee8}.employee-scope-mode button[data-v-fbb19f26]:focus-visible{outline-offset:2px;outline:2px solid #356448}.employee-scope-mode button[data-v-fbb19f26]:disabled{opacity:.55;cursor:default}.employee-scope-rule[data-v-fbb19f26]{color:#526259;margin:0 0 16px;font-size:13px}.employee-title-settings[data-v-fbb19f26]{margin-top:24px}.employee-title-settings h3[data-v-fbb19f26]{margin:0 0 12px;font-size:14px;font-weight:600}.employee-title-controls[data-v-fbb19f26]{grid-template-columns:1.2fr 1fr;gap:12px;display:grid}.employee-title-controls .employee-picker-field[data-v-fbb19f26]{min-width:0;margin-bottom:8px}.employee-title-preview[data-v-fbb19f26]{color:#5a685f;overflow-wrap:anywhere;margin:4px 0 0;font-size:12px}.employee-title-preview span[data-v-fbb19f26]{color:#304c3b}.employee-picker-field[data-v-fbb19f26]{color:#33483c;gap:7px;margin-bottom:18px;font-size:13px;display:grid}.employee-picker-field[data-v-fbb19f26] .searchable-select{width:100%}.employee-picker-field[data-v-fbb19f26] .searchable-select-trigger{width:100%;min-height:42px}.employee-title-controls[data-v-fbb19f26] .searchable-select-panel{box-sizing:border-box;width:100%;min-width:0}.employee-title-controls[data-v-fbb19f26] .searchable-select-option-copy strong{white-space:normal;overflow-wrap:anywhere}.employee-permissions[data-v-fbb19f26]{margin-top:20px;font-size:12px}.employee-permissions strong[data-v-fbb19f26]{color:#33483c;font-weight:600}.employee-permissions ul[data-v-fbb19f26]{flex-wrap:wrap;gap:4px 18px;margin:6px 0;padding-left:16px;display:flex}.employee-permissions p[data-v-fbb19f26],.employee-muted[data-v-fbb19f26]{color:#58675d;margin-top:8px;font-size:12px}.employee-runtime[data-v-fbb19f26]{color:#356448;margin:20px 0 0;font-size:12px}.employee-runtime.is-warning[data-v-fbb19f26]{color:#80501e}.employee-error[data-v-fbb19f26]{color:#a13e37;margin-top:16px}.employee-success[data-v-fbb19f26]{color:#306344;margin-top:18px}.employee-recruit-actions[data-v-fbb19f26]{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-fbb19f26]{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-fbb19f26]:hover:not(:disabled){background:#edf2ee}.employee-recruit-dialog .quiet-button[data-v-fbb19f26]:focus-visible{outline-offset:2px;outline:2px solid #356448}.employee-primary[data-v-fbb19f26]{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-fbb19f26]:hover:not(:disabled){background:#244b34}.employee-primary[data-v-fbb19f26]:disabled{color:#59675e;cursor:default;background:#e1e7e3}.employee-primary[data-v-fbb19f26]:focus-visible,.employee-recruit-dialog a[data-v-fbb19f26]:focus-visible{outline-offset:3px;outline:2px solid #356448}.employee-message[data-v-fbb19f26]{justify-items:start;gap:12px;display:grid}@media (width<=540px){.employee-recruit-heading[data-v-fbb19f26]{padding:18px 20px}.employee-recruit-body[data-v-fbb19f26]{padding:0 20px 18px}.employee-recruit-actions[data-v-fbb19f26]{padding:14px 20px}.employee-recruit-actions .employee-primary[data-v-fbb19f26]{flex:1}.employee-profile[data-v-fbb19f26]{align-items:flex-start}.employee-profile h3 span[data-v-fbb19f26]{margin:2px 0 0;display:block}.employee-title-controls[data-v-fbb19f26]{grid-template-columns:minmax(0,1fr);gap:4px}}
@@ -0,0 +1 @@
1
+ .employee-workbench-view[data-v-6eb3ead3]{background:#fff;flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden}.employee-workbench-toolbar[data-v-6eb3ead3]{flex:none;justify-content:space-between;align-items:center;gap:20px;padding:16px 24px 10px;display:flex}.employee-workbench-identity[data-v-6eb3ead3]{align-items:center;gap:10px;min-width:0;display:flex}.employee-workbench-mark[data-v-6eb3ead3]{color:#315c43;background:#eaf0ec;border-radius:9px;flex:0 0 32px;place-items:center;height:32px;font-size:17px;font-weight:650;display:grid}.employee-workbench-toolbar h1[data-v-6eb3ead3]{color:#253c2f;overflow-wrap:anywhere;margin:0;font-size:18px;font-weight:650;line-height:1.4}.employee-workbench-toolbar h1 span[data-v-6eb3ead3]{color:#59685f;margin-left:8px;font-size:12px;font-weight:400}.employee-workbench-toolbar[data-v-6eb3ead3] .searchable-select{width:min(240px,30vw)}.employee-workbench-actions[data-v-6eb3ead3]{align-items:center;gap:12px;min-width:0;display:flex}.employee-workbench-project-view[data-v-6eb3ead3]{min-width:0}.employee-manage-projects[data-v-6eb3ead3]{color:#465b4d;min-height:40px;font:inherit;cursor:pointer;white-space:nowrap;background:0 0;border:0;border-radius:8px;justify-content:center;align-items:center;gap:7px;padding:8px 10px;font-size:13px;display:inline-flex}.employee-manage-projects[data-v-6eb3ead3]:hover:not(:disabled){background:#e2ece5}.employee-manage-projects[data-v-6eb3ead3]:disabled{color:#647568;cursor:default}.employee-manage-projects[data-v-6eb3ead3]:focus-visible{outline-offset:3px;outline:2px solid #356448}.employee-workbench-frame[data-v-6eb3ead3]{border:0;flex:1;width:100%;height:100%;min-height:0}.employee-workbench-state[data-v-6eb3ead3]{color:#58695e;text-align:center;flex:1;place-content:center;justify-items:center;gap:14px;padding:30px;font-size:14px;display:grid}.employee-workbench-state a[data-v-6eb3ead3]{color:#315c43}.employee-workbench-state h2[data-v-6eb3ead3]{color:#253c2f;font-size:20px;font-weight:600}.employee-workbench-state p[data-v-6eb3ead3]{max-width:48ch;margin:0;line-height:1.7}@media (width<=640px){.employee-workbench-toolbar[data-v-6eb3ead3]{flex-wrap:wrap;gap:10px;padding:8px 16px 10px}.employee-workbench-actions[data-v-6eb3ead3]{gap:8px;width:100%}.employee-workbench-project-view[data-v-6eb3ead3]{flex:1}.employee-workbench-project-view[data-v-6eb3ead3] .searchable-select{width:100%}.employee-workbench-toolbar h1 span[data-v-6eb3ead3]{margin-left:6px}}
@@ -0,0 +1 @@
1
+ import{C as e,L as t,S as n,Y as r,a as i,et as a,g as o,h as s,j as c,rt as l,v as u,x as d,y as f,z as p}from"./i18n-CgBHZthI.js";import{r as m,t as h}from"./console-tOxOl8Vq.js";import{h as g,m as _}from"./useApi-CROJJdhE-B6MHm_Av.js";import{t as v}from"./vue-router-CzHm-y-x.js";import{t as y}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{a as b,n as x,o as S,r as C,t as w}from"./catalog-DFvIaHVS.js";import{t as T}from"./SearchableSelect-D27H0MoP.js";import{t as E}from"./EmployeeRecruitDialog-CbPAmhy7.js";var D=[`aria-label`],O={class:`employee-workbench-toolbar`},k={class:`employee-workbench-identity`},A={class:`employee-workbench-mark`,"aria-hidden":`true`},j={class:`employee-workbench-actions`},M=[`title`],N=[`disabled`],P={key:0,class:`employee-workbench-state`,role:`status`},F={key:1,class:`employee-workbench-state`,role:`alert`},I={key:2,class:`employee-workbench-state`},L={key:3,class:`employee-workbench-state`},R={key:4,class:`employee-workbench-state`},z=[`src`,`title`],B=y(e({__name:`EmployeeWorkbenchPage`,setup(e){let y=_(),B=g(),V=h(),H=r(``),U=r(null),W=r(``),G=r(!1),K=r(!1),q=s(()=>V.activePersonalSpace?.id??``),J=s(()=>String(y.params.templateId??``)),Y=s(()=>b.value.find(e=>e.id===J.value)),X=s(()=>w.value||W.value),Z=s(()=>Y.value?.managedProjects===void 0?(Y.value?.assignments??[]).filter(e=>e.status===`active`).map(e=>({value:e.personalProjectId,label:V.state?.personalProjects?.find(t=>t.project_id===e.personalProjectId)?.profile.name??e.personalProjectId})):Y.value.managedProjects.map(e=>({value:e.id,label:e.name}))),Q=0;t(q,e=>{S(e)},{immediate:!0}),t([Z,()=>y.query.project,J],()=>{let e=typeof y.query.project==`string`?y.query.project:``,t=Z.value;H.value=e||(t.some(e=>e.value===H.value)?H.value:t[0]?.value??``),!e&&H.value&&B.replace({query:{...y.query,project:H.value}})},{immediate:!0}),t([J,H,q],()=>{$()},{immediate:!0});async function $(){let e=++Q;if(U.value=null,W.value=``,!H.value||!q.value){G.value=!1;return}G.value=!0;let t=J.value,n=H.value;try{let r=await m(`/api/employee-templates/${encodeURIComponent(t)}/workspace?${new URLSearchParams({personalSpaceId:q.value,personalProjectId:n})}`),a=`/employee-workspaces/${encodeURIComponent(t)}/${encodeURIComponent(n)}/`;if(r.workbenchUrl!==a)throw Error(i(`employees.loadError`));e===Q&&(U.value=r)}catch(t){e===Q&&(W.value=C(t))}finally{e===Q&&(G.value=!1)}}function ee(e){B.replace({query:{...y.query,project:e}})}async function te(){await S(q.value),w.value||await $()}async function ne(){let e=Z.value.find(e=>e.value===H.value)?.value??Z.value[0]?.value;await B.replace({query:e?{project:e}:{}}),await $()}return(e,t)=>(c(),f(`section`,{class:`employee-workbench-view`,"aria-label":Y.value?.name??a(i)(`employees.workbench`)},[o(`header`,O,[o(`div`,k,[o(`span`,A,l(Y.value?.name.slice(0,1)??`A`),1),o(`h1`,null,[d(l(Y.value?.name??a(i)(`employees.workbench`))+` `,1),o(`span`,null,l(Y.value?.role),1)])]),o(`div`,j,[Z.value.length?(c(),f(`div`,{key:0,class:`employee-workbench-project-view`,title:a(i)(`employees.viewingHint`)},[n(T,{"model-value":H.value,"control-id":`workbench-project`,label:a(i)(`employees.viewingProject`),options:Z.value,"onUpdate:modelValue":ee},null,8,[`model-value`,`label`,`options`])],8,M)):u(``,!0),Y.value?(c(),f(`button`,{key:1,class:`employee-manage-projects`,type:`button`,disabled:!q.value,onClick:t[0]||=e=>K.value=!0},[t[3]||=o(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.6`,"stroke-linecap":`round`,"aria-hidden":`true`},[o(`path`,{d:`M4 7h9m4 0h3M4 17h3m4 0h9`}),o(`circle`,{cx:`15`,cy:`7`,r:`2`}),o(`circle`,{cx:`9`,cy:`17`,r:`2`})],-1),d(` `+l(a(i)(`employees.manageProjects`)),1)],8,N)):u(``,!0)])]),n(E,{open:K.value,"personal-space-id":q.value,projects:a(V).state?.personalProjects??[],"template-id":J.value,onClose:t[1]||=e=>K.value=!1,onRecruited:ne},null,8,[`open`,`personal-space-id`,`projects`,`template-id`]),G.value||!Y.value&&a(x)?(c(),f(`div`,P,l(a(i)(`employees.loadingWorkbench`)),1)):X.value?(c(),f(`div`,F,[o(`p`,null,l(X.value),1),o(`button`,{class:`quiet-button`,type:`button`,onClick:te},l(a(i)(`employees.retry`)),1)])):Y.value?H.value?U.value?.runtimeStatus===`ready`?U.value?(c(),f(`iframe`,{key:U.value.workbenchUrl,src:U.value.workbenchUrl,title:`${U.value.name} · ${U.value.project.name}`,class:`employee-workbench-frame`},null,8,z)):u(``,!0):(c(),f(`div`,R,[o(`p`,null,l(a(i)(`employees.installRequired`)),1),o(`small`,null,l(a(i)(`employees.installHelp`)),1)])):(c(),f(`div`,L,[o(`h2`,null,l(a(i)(`employees.emptyWorkbench`)),1),o(`p`,null,l(a(i)(`employees.manageHint`)),1),o(`button`,{class:`quiet-button`,type:`button`,onClick:t[2]||=e=>K.value=!0},l(a(i)(`employees.manageProjects`)),1)])):(c(),f(`div`,I,[o(`p`,null,l(a(i)(`employees.unavailable`)),1),n(a(v),{to:`/project-agents`},{default:p(()=>[d(l(a(i)(`employees.backToAgents`)),1)]),_:1})]))],8,D))}}),[[`__scopeId`,`data-v-6eb3ead3`]]);export{B as default};