fuli-context 0.7.6 → 0.7.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -13
- package/README.zh-CN.md +60 -14
- package/dist/web/assets/{AboutPage-sLV9WChi.js → AboutPage-9CVX91tr.js} +1 -1
- package/dist/web/assets/{ConnectionsPage-BWn4ywGJ.js → ConnectionsPage-CWbCVFdv.js} +1 -1
- package/dist/web/assets/EmployeeRecruitDialog-CQgNpGJ_.js +1 -0
- package/dist/web/assets/EmployeeRecruitDialog-CfFlyKSh.css +1 -0
- package/dist/web/assets/EmployeeWorkbenchPage-CWg4WJhr.css +1 -0
- package/dist/web/assets/EmployeeWorkbenchPage-CwU4qBgD.js +1 -0
- package/dist/web/assets/KnowledgeEditDialog-B6TGAcFH.js +1 -0
- package/dist/web/assets/{KnowledgeEditDialog-DWUV_NPp.css → KnowledgeEditDialog-iv-dgUeD.css} +1 -1
- package/dist/web/assets/{KnowledgeInspector-CRQWOaos.js → KnowledgeInspector-M2pLY0bR.js} +1 -1
- package/dist/web/assets/{KnowledgeOrganizerPage-Dfj3vIpU.js → KnowledgeOrganizerPage-DzeAlk9b.js} +1 -1
- package/dist/web/assets/KnowledgePage-BJu9w0fF.js +1 -0
- package/dist/web/assets/{KnowledgeWorkspace-ChEB5Bwk.js → KnowledgeWorkspace-CCt8rnBb.js} +1 -1
- package/dist/web/assets/{OverviewPage-Cd66M0RT.js → OverviewPage-CZswVqui.js} +1 -1
- package/dist/web/assets/{PersonalProfilePage-RCFHL0Wz.js → PersonalProfilePage-f1nSF6kx.js} +1 -1
- package/dist/web/assets/PersonalProjectsPage-D__eJf0t.js +1 -0
- package/dist/web/assets/ProjectAgentsPage-C3vW6wmk.css +1 -0
- package/dist/web/assets/ProjectAgentsPage-LrwagMGj.js +11 -0
- package/dist/web/assets/{PublicProjectsPage-mstPEjHe.js → PublicProjectsPage-BdC2Qk4n.js} +1 -1
- package/dist/web/assets/{ReviewPage-6Y1SmfZy.js → ReviewPage-Cbgl8_Si.js} +1 -1
- package/dist/web/assets/SearchableSelect-ERm-k4KI.js +1 -0
- package/dist/web/assets/{SettingsPage--LdTMUm7.js → SettingsPage-DWso4x29.js} +1 -1
- package/dist/web/assets/{WritingTastePage-CIpKswvs.js → WritingTastePage-CFpCjmIY.js} +1 -1
- package/dist/web/assets/catalog-WGLn7ERJ.js +1 -0
- package/dist/web/assets/{console-BT1P2Db4.js → console-DQgu0JIA.js} +1 -1
- package/dist/web/assets/conversation-launcher-settings-0KtlG_LV.js +1 -0
- package/dist/web/assets/{i18n-js6gfc7j.js → i18n-ByRiA3pJ.js} +3 -3
- package/dist/web/assets/{identity-CfDfanpa.js → identity-CxdPRMwH.js} +1 -1
- package/dist/web/assets/index-JAZe6lfX.js +2 -0
- package/dist/web/assets/index-wcXzzggp.css +1 -0
- package/dist/web/assets/{model-DJkLAJsg.js → model-Db4-KefQ.js} +1 -1
- package/dist/web/assets/{useApi-CROJJdhE-BdSti7Y2.js → useApi-CROJJdhE-CePMjc08.js} +1 -1
- package/dist/web/assets/{vue-router-Kk67EaCP.js → vue-router-CzX-hn3P.js} +1 -1
- package/dist/web/index.html +7 -6
- package/docs/employee-agents.md +99 -0
- package/docs/project-agent-memory.md +479 -0
- package/graph-provider/fuli_graph/knowledge_audit_models.py +171 -0
- package/graph-provider/fuli_graph/model_base.py +5 -0
- package/graph-provider/fuli_graph/model_validation.py +32 -0
- package/graph-provider/fuli_graph/models.py +26 -170
- package/graph-provider/fuli_graph/project_agent_context_models.py +29 -0
- package/graph-provider/fuli_graph/project_agent_executor_models.py +35 -7
- package/graph-provider/fuli_graph/project_agent_memory_models.py +79 -0
- package/graph-provider/fuli_graph/project_agent_memory_routes.py +46 -0
- package/graph-provider/fuli_graph/project_agent_models.py +9 -0
- package/graph-provider/fuli_graph/project_agent_recruitment_values.py +48 -0
- package/graph-provider/fuli_graph/project_agent_routes.py +21 -1
- package/graph-provider/fuli_graph/project_agent_task_models.py +217 -29
- package/graph-provider/fuli_graph/runtime.py +37 -1
- package/graph-provider/fuli_graph/store.py +6 -0
- package/graph-provider/fuli_graph/store_project_agent_context.py +65 -0
- package/graph-provider/fuli_graph/store_project_agent_executor_learning.py +175 -11
- package/graph-provider/fuli_graph/store_project_agent_executor_routing.py +33 -10
- package/graph-provider/fuli_graph/store_project_agent_executors.py +181 -14
- package/graph-provider/fuli_graph/store_project_agent_memory.py +174 -0
- package/graph-provider/fuli_graph/store_project_agent_task_activity.py +423 -0
- package/graph-provider/fuli_graph/store_project_agent_task_persistence.py +152 -0
- package/graph-provider/fuli_graph/store_project_agent_task_reads.py +187 -21
- package/graph-provider/fuli_graph/store_project_agent_task_recruitment.py +748 -162
- package/graph-provider/fuli_graph/store_project_agent_task_staffing.py +230 -18
- package/graph-provider/fuli_graph/store_project_agent_tasks.py +261 -468
- package/graph-provider/fuli_graph/store_project_agents.py +214 -46
- package/graph-provider/fuli_graph/store_task_contexts.py +217 -0
- package/graph-provider/fuli_graph/store_transactions.py +40 -0
- package/graph-provider/fuli_graph/task_context_models.py +50 -0
- package/graph-provider/fuli_graph/task_context_routes.py +31 -0
- package/graph-provider/fuli_graph/workflow_observation_models.py +1 -1
- package/graph-provider/pyproject.toml +1 -1
- package/npm-shrinkwrap.json +8 -8
- package/package.json +5 -2
- package/skills/capturing-session-knowledge/SKILL.md +18 -6
- package/src/adaptive-runtime/executor-pool.js +46 -5
- package/src/adaptive-runtime/graph-services.js +10 -3
- package/src/adaptive-runtime/lease-client.js +66 -14
- package/src/adaptive-runtime/runtime-broker.js +24 -9
- package/src/agent-tools/employee-definitions.js +43 -0
- package/src/agent-tools/graph-definitions.js +25 -6
- package/src/agent-tools/graph-handlers.js +11 -0
- package/src/agent-tools/project-agent-definitions.js +35 -4
- package/src/agent-tools/project-agent-memory-definitions.js +36 -0
- package/src/agent-tools.js +6 -2
- package/src/agents/codex/lifecycle-hook.js +107 -0
- package/src/agents/codex/lifecycle-hooks.js +231 -0
- package/src/agents/cursor/lifecycle-hook.js +133 -0
- package/src/agents/cursor/lifecycle-hooks.js +50 -0
- package/src/agents/lifecycle-message.js +19 -0
- package/src/app/agent-request-context.js +23 -0
- package/src/cli/command-registry.js +2 -0
- package/src/cli/employee-command.js +17 -0
- package/src/cli/remote-mcp-command.js +282 -0
- package/src/cli/setup-command.js +5 -0
- package/src/cli/update-command.js +6 -43
- package/src/cli.js +10 -0
- package/src/employees/catalog/jefa.json +21 -0
- package/src/employees/install-package.js +77 -0
- package/src/employees/management-policy.js +88 -0
- package/src/employees/manifest.js +53 -0
- package/src/employees/package-registry.js +107 -0
- package/src/employees/project-selection.js +50 -0
- package/src/employees/recruitment.js +199 -0
- package/src/employees/service.js +83 -0
- package/src/employees/task-entry.js +39 -0
- package/src/graphiti/agent-knowledge-workflows.js +135 -25
- package/src/graphiti/federated-application.js +78 -35
- package/src/graphiti/project-agent-control-plane.js +20 -3
- package/src/graphiti/project-agent-mapping.js +155 -5
- package/src/graphiti/project-agent-memory.js +115 -0
- package/src/graphiti/project-agent-task-entry.js +126 -0
- package/src/graphiti/project-agent-workflows.js +30 -14
- package/src/graphiti/provider-client.js +66 -4
- package/src/http/api-router.js +30 -5
- package/src/http/employee-api-router.js +64 -0
- package/src/http/error-mapping.js +4 -0
- package/src/http/graph-api-router.js +2 -0
- package/src/http/request-policy.js +6 -3
- package/src/http/static-handler.js +4 -3
- package/src/mcp/create-mcp-server.js +98 -37
- package/src/mcp/direct-call.js +38 -0
- package/src/mcp/instructions.js +8 -7
- package/src/mcp/provider-task-context-registry.js +74 -0
- package/src/mcp/remote-http-server.js +761 -0
- package/src/mcp/session-id.js +29 -3
- package/src/mcp/task-context-registry.js +88 -29
- package/src/mcp/tool-annotations.js +10 -2
- package/src/mcp/tool-result.js +8 -3
- package/src/mcp-server.js +20 -8
- package/src/native-runtime/runtime.js +58 -8
- package/src/semantic-version.js +42 -0
- package/src/server.js +76 -28
- package/src/setup/agent-installation-status.js +38 -6
- package/src/setup/agents.js +20 -8
- package/src/setup/claude-code-config.js +55 -13
- package/src/setup/codex-bootstrap.js +11 -10
- package/src/setup/codex-config.js +74 -7
- package/src/setup/config-backup.js +18 -2
- package/src/setup/cursor-config.js +22 -5
- package/src/setup/setup.js +30 -22
- package/src/storage/json-file.js +11 -3
- package/src/system/package-version-checker.js +72 -0
- package/src/system/system-service.js +3 -0
- package/dist/web/assets/KnowledgeEditDialog-CZ5ziPrD.js +0 -1
- package/dist/web/assets/KnowledgePage-BRYC9S5Y.js +0 -1
- package/dist/web/assets/PersonalProjectsPage-DEh8XWby.js +0 -1
- package/dist/web/assets/ProjectAgentsPage-Crh7PrXa.css +0 -1
- package/dist/web/assets/ProjectAgentsPage-DPnaH-TR.js +0 -11
- package/dist/web/assets/SearchableSelect-D3HM8YF8.js +0 -1
- package/dist/web/assets/conversation-launcher-settings-DrJEotdf.js +0 -1
- package/dist/web/assets/index-BnH5mcZx.css +0 -1
- package/dist/web/assets/index-GqJf1xqg.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
|
-
|
|
194
|
-
|
|
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
|
|
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
|
|
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
|
|
300
|
-
Note over A,F: Same contract
|
|
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
|
|
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
|
-
-
|
|
411
|
-
|
|
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
|
|
617
|
-
`
|
|
618
|
-
|
|
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 提任务即可。
|
|
167
|
-
|
|
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
|
|
238
|
+
alt Claude Code / Codex(已提供 Hook 上下文)
|
|
237
239
|
L->>F: begin_task_context(projectPath, taskPrompt)
|
|
238
240
|
F-->>A: 生效偏好、精确项目、有界召回和任务令牌
|
|
239
|
-
else
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
558
|
-
|
|
559
|
-
|
|
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-js6gfc7j.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-ByRiA3pJ.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-js6gfc7j.js";import{a as T,i as E,n as D,r as O,t as k}from"./console-BT1P2Db4.js";import{t as A}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as j}from"./SearchableSelect-D3HM8YF8.js";import{r as M,t as N}from"./identity-CfDfanpa.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-ByRiA3pJ.js";import{a as T,i as E,n as D,r as O,t as k}from"./console-DQgu0JIA.js";import{t as A}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as j}from"./SearchableSelect-ERm-k4KI.js";import{r as M,t as N}from"./identity-CxdPRMwH.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-ByRiA3pJ.js";import{a as C}from"./console-DQgu0JIA.js";import{t as w}from"./vue-router-CzX-hn3P.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-WGLn7ERJ.js";import{n as j}from"./paths-CDREouhi.js";import{t as M}from"./SearchableSelect-ERm-k4KI.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-all-projects[data-v-7983e444]{color:#253c2f;background:#f7f8f7;flex-direction:column;flex:1;gap:14px;min-width:0;min-height:0;padding:14px 24px 24px;display:flex;overflow:hidden}.employee-all-projects-header[data-v-7983e444]{flex:none;justify-content:space-between;align-items:end;gap:24px;display:flex}.employee-all-projects-heading[data-v-7983e444]{min-width:0}.employee-all-projects-heading h2[data-v-7983e444]{letter-spacing:-.02em;margin:0 0 4px;font-size:20px;font-weight:650}.employee-all-projects-heading p[data-v-7983e444]{color:#5b6b61;margin:0;font-size:13px;line-height:1.5}.employee-all-projects-search[data-v-7983e444]{color:#516158;flex:0 300px;gap:5px;font-size:12px;display:grid}.employee-all-projects-search input[data-v-7983e444]{color:#253c2f;width:100%;min-height:40px;font:inherit;background:#fff;border:1px solid #cbd5ce;border-radius:9px;padding:8px 11px;font-size:14px}.employee-all-projects-search input[data-v-7983e444]:focus-visible{outline-offset:2px;outline:2px solid #356448}.employee-all-projects-notice[data-v-7983e444]{color:#654d21;background:#f2ead8;border-radius:10px;flex:none;justify-content:space-between;align-items:center;gap:12px;min-height:38px;padding:8px 12px;font-size:13px;display:flex}.employee-all-projects-notice button[data-v-7983e444]{color:inherit;font:inherit;text-underline-offset:3px;cursor:pointer;background:0 0;border:0;font-weight:650;text-decoration:underline}.employee-all-projects-notice button[data-v-7983e444]:focus-visible{outline-offset:2px;outline:2px solid}.employee-all-projects-board[data-v-7983e444]{flex:1;grid-template-columns:repeat(5,minmax(230px,1fr));gap:12px;min-height:0;padding-bottom:4px;display:grid;overflow-x:auto}.employee-all-projects-column[data-v-7983e444]{background:#ecefed;border-radius:14px;flex-direction:column;min-width:230px;min-height:0;display:flex;overflow:hidden}.employee-all-projects-column>header[data-v-7983e444]{flex:none;justify-content:space-between;align-items:center;gap:10px;padding:13px 14px 10px;display:flex}.employee-all-projects-column h3[data-v-7983e444]{margin:0;font-size:14px;font-weight:650}.employee-all-projects-column>header span[data-v-7983e444]{color:#425349;font-variant-numeric:tabular-nums;background:#dce3de;border-radius:12px;place-items:center;min-width:24px;height:24px;font-size:12px;display:grid}.employee-all-projects-list[data-v-7983e444]{flex-direction:column;flex:1;gap:8px;min-height:0;padding:0 8px 10px;display:flex;overflow-y:auto}.employee-all-projects-task[data-v-7983e444]{color:#253c2f;width:100%;font:inherit;text-align:left;cursor:pointer;background:#fff;border:0;border-radius:12px;flex-direction:column;flex:none;align-items:stretch;gap:7px;padding:11px 12px;display:flex;box-shadow:0 2px 8px #253c2f12}.employee-all-projects-task[data-v-7983e444]:hover{background:#fbfdfb;box-shadow:0 4px 13px #253c2f1c}.employee-all-projects-task[data-v-7983e444]:focus-visible{outline-offset:2px;outline:2px solid #356448}.employee-all-projects-task strong[data-v-7983e444]{overflow-wrap:anywhere;-webkit-line-clamp:3;-webkit-box-orient:vertical;font-size:13px;font-weight:600;line-height:1.5;display:-webkit-box;overflow:hidden}.employee-all-projects-project[data-v-7983e444]{color:#4a6755;text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:650;overflow:hidden}.employee-all-projects-summary[data-v-7983e444]{color:#65736a;overflow-wrap:anywhere;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12px;line-height:1.45;display:-webkit-box;overflow:hidden}.employee-all-projects-tags[data-v-7983e444]{flex-wrap:wrap;gap:5px;display:flex}.employee-all-projects-tags span[data-v-7983e444]{color:#52665a;text-overflow:ellipsis;white-space:nowrap;background:#edf3ef;border-radius:5px;max-width:100%;padding:2px 6px;font-size:10px;line-height:1.5;overflow:hidden}.employee-all-projects-column-empty[data-v-7983e444]{color:#728078;text-align:center;margin:24px 8px;font-size:12px}.employee-all-projects-empty[data-v-7983e444]{text-align:center;flex:1;place-content:center;justify-items:center;padding:30px;display:grid}.employee-all-projects-empty h3[data-v-7983e444]{margin:0 0 8px;font-size:18px;font-weight:600}.employee-all-projects-empty p[data-v-7983e444]{color:#64736a;max-width:46ch;margin:0;font-size:13px;line-height:1.6}@media (width<=760px){.employee-all-projects[data-v-7983e444]{padding:10px 16px 18px}.employee-all-projects-header[data-v-7983e444]{flex-direction:column;align-items:stretch;gap:10px}.employee-all-projects-search[data-v-7983e444]{flex-basis:auto}.employee-all-projects-board[data-v-7983e444]{grid-template-columns:repeat(5,minmax(82vw,1fr))}}.employee-workbench-view[data-v-e9cf167b]{background:#fff;flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden}.employee-workbench-toolbar[data-v-e9cf167b]{flex:none;justify-content:space-between;align-items:center;gap:20px;padding:16px 24px 10px;display:flex}.employee-workbench-identity[data-v-e9cf167b]{align-items:center;gap:10px;min-width:0;display:flex}.employee-workbench-mark[data-v-e9cf167b]{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-e9cf167b]{color:#253c2f;overflow-wrap:anywhere;margin:0;font-size:18px;font-weight:650;line-height:1.4}.employee-workbench-toolbar h1 span[data-v-e9cf167b]{color:#59685f;margin-left:8px;font-size:12px;font-weight:400}.employee-workbench-toolbar[data-v-e9cf167b] .searchable-select{width:min(240px,30vw)}.employee-workbench-actions[data-v-e9cf167b]{align-items:center;gap:12px;min-width:0;display:flex}.employee-workbench-project-view[data-v-e9cf167b]{min-width:0}.employee-manage-projects[data-v-e9cf167b]{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-e9cf167b]:hover:not(:disabled){background:#e2ece5}.employee-manage-projects[data-v-e9cf167b]:disabled{color:#647568;cursor:default}.employee-manage-projects[data-v-e9cf167b]:focus-visible{outline-offset:3px;outline:2px solid #356448}.employee-workbench-frame[data-v-e9cf167b]{border:0;flex:1;width:100%;height:100%;min-height:0}.employee-workbench-state[data-v-e9cf167b]{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-e9cf167b]{color:#315c43}.employee-workbench-state h2[data-v-e9cf167b]{color:#253c2f;font-size:20px;font-weight:600}.employee-workbench-state p[data-v-e9cf167b]{max-width:48ch;margin:0;line-height:1.7}@media (width<=640px){.employee-workbench-toolbar[data-v-e9cf167b]{flex-wrap:wrap;gap:10px;padding:8px 16px 10px}.employee-workbench-actions[data-v-e9cf167b]{gap:8px;width:100%}.employee-workbench-project-view[data-v-e9cf167b]{flex:1}.employee-workbench-project-view[data-v-e9cf167b] .searchable-select{width:100%}.employee-workbench-toolbar h1 span[data-v-e9cf167b]{margin-left:6px}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{B as e,C as t,L as n,N as r,S as i,Y as a,_ as o,a as s,et as c,g as l,h as u,j as d,m as f,rt as p,u as m,v as h,x as g,y as _,z as v}from"./i18n-ByRiA3pJ.js";import{a as y,r as b,t as x}from"./console-DQgu0JIA.js";import{h as S,m as C}from"./useApi-CROJJdhE-CePMjc08.js";import{t as w}from"./vue-router-CzX-hn3P.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-WGLn7ERJ.js";import{t as j}from"./SearchableSelect-ERm-k4KI.js";import{t as M}from"./EmployeeRecruitDialog-CQgNpGJ_.js";var N={class:`employee-all-projects`,"aria-labelledby":`employee-all-projects-title`},P={class:`employee-all-projects-header`},F={class:`employee-all-projects-heading`},I={id:`employee-all-projects-title`},L={class:`employee-all-projects-search`},R=[`placeholder`],z={key:0,class:`employee-all-projects-notice`,role:`status`},B={key:1,class:`employee-all-projects-notice`,role:`status`},V={key:2,class:`employee-all-projects-empty`},H={key:3,class:`employee-all-projects-empty`},U=[`aria-label`],W=[`aria-label`],G={class:`employee-all-projects-list`},K=[`aria-label`,`onClick`],q={class:`employee-all-projects-project`},J={key:0,class:`employee-all-projects-summary`},Y={key:1,class:`employee-all-projects-tags`,"aria-hidden":`true`},X={key:0,class:`employee-all-projects-column-empty`},Z=T(t({__name:`EmployeeAllProjectsBoard`,props:{boards:{},totalProjects:{},failedProjects:{}},emits:[`select-project`,`retry`],setup(t,{emit:n}){let i=t,o=n,g=a(``),v=[{value:`planned`,labelKey:`employees.allProjects.status.planned`},{value:`active`,labelKey:`employees.allProjects.status.active`},{value:`blocked`,labelKey:`employees.allProjects.status.blocked`},{value:`review`,labelKey:`employees.allProjects.status.review`},{value:`done`,labelKey:`employees.allProjects.status.done`}],y=u(()=>new Map(i.boards.map(({project:e})=>[e.id,e.name]))),b=u(()=>i.boards.flatMap(({items:e})=>e)),x=u(()=>{let e=g.value.trim().toLocaleLowerCase();return e?b.value.filter(t=>[t.title,t.summary,y.value.get(t.projectId),...t.tags??[]].filter(Boolean).join(` `).toLocaleLowerCase().includes(e)):b.value}),S=u(()=>v.map(e=>({...e,items:x.value.filter(({status:t})=>t===e.value)}))),C=u(()=>i.boards.filter(({truncated:e})=>e).length),w=u(()=>b.value.length>0),T=u(()=>x.value.length>0);function E(e){return y.value.get(e)??e}return(n,i)=>(d(),_(`section`,N,[l(`header`,P,[l(`div`,F,[l(`h2`,I,p(c(s)(`employees.allProjects.title`)),1),l(`p`,null,p(c(s)(`employees.allProjects.hint`,{count:t.boards.length})),1)]),l(`label`,L,[l(`span`,null,p(c(s)(`employees.allProjects.search`)),1),e(l(`input`,{"onUpdate:modelValue":i[0]||=e=>g.value=e,type:`search`,placeholder:c(s)(`employees.allProjects.searchPlaceholder`)},null,8,R),[[m,g.value]])])]),t.failedProjects?(d(),_(`div`,z,[l(`span`,null,p(c(s)(`employees.allProjects.partial`,{loaded:t.boards.length,total:t.totalProjects,failed:t.failedProjects})),1),l(`button`,{type:`button`,onClick:i[1]||=e=>o(`retry`)},p(c(s)(`employees.retry`)),1)])):h(``,!0),C.value?(d(),_(`div`,B,p(c(s)(`employees.allProjects.truncated`,{count:C.value})),1)):h(``,!0),w.value?T.value?(d(),_(`div`,{key:4,class:`employee-all-projects-board`,"aria-label":c(s)(`employees.allProjects.boardLabel`)},[(d(!0),_(f,null,r(S.value,e=>(d(),_(`section`,{key:e.value,class:`employee-all-projects-column`},[l(`header`,null,[l(`h3`,null,p(c(s)(e.labelKey)),1),l(`span`,{"aria-label":c(s)(`employees.allProjects.taskCount`,{count:e.items.length})},p(e.items.length),9,W)]),l(`div`,G,[(d(!0),_(f,null,r(e.items,e=>(d(),_(`button`,{key:`${e.projectId}:${e.id}`,type:`button`,class:`employee-all-projects-task`,"aria-label":c(s)(`employees.allProjects.openTask`,{project:E(e.projectId),task:e.title}),onClick:t=>o(`select-project`,e.projectId)},[l(`span`,q,p(E(e.projectId)),1),l(`strong`,null,p(e.title),1),e.summary&&e.summary!==e.title?(d(),_(`span`,J,p(e.summary),1)):h(``,!0),e.tags?.length?(d(),_(`span`,Y,[(d(!0),_(f,null,r(e.tags.slice(0,3),e=>(d(),_(`span`,{key:e},p(e),1))),128))])):h(``,!0)],8,K))),128)),e.items.length?h(``,!0):(d(),_(`p`,X,p(c(s)(`employees.allProjects.columnEmpty`)),1))])]))),128))],8,U)):(d(),_(`div`,H,[l(`h3`,null,p(c(s)(`employees.allProjects.noMatch`)),1),l(`p`,null,p(c(s)(`employees.allProjects.noMatchHint`)),1)])):(d(),_(`div`,V,[l(`h3`,null,p(c(s)(`employees.allProjects.empty`)),1),l(`p`,null,p(c(s)(`employees.allProjects.emptyHint`)),1)]))]))}}),[[`__scopeId`,`data-v-7983e444`]]),Q=[`aria-label`],ee={class:`employee-workbench-toolbar`},te={class:`employee-workbench-identity`},ne={class:`employee-workbench-mark`,"aria-hidden":`true`},re={class:`employee-workbench-actions`},ie=[`title`],ae=[`disabled`],oe={key:0,class:`employee-workbench-state`,role:`status`},se={key:1,class:`employee-workbench-state`,role:`alert`},ce={key:2,class:`employee-workbench-state`},le={key:3,class:`employee-workbench-state`},ue={key:5,class:`employee-workbench-state`},de=[`src`,`title`],$=`__all__`,fe=T(t({__name:`EmployeeWorkbenchPage`,setup(e){let t=C(),r=S(),f=x(),m=a(``),T=a(null),N=a([]),P=a(0),F=a(``),I=a(!1),L=a(!1),R=u(()=>f.activePersonalSpace?.id??``),z=u(()=>String(t.params.templateId??``)),B=u(()=>E.value.find(e=>e.id===z.value)),V=u(()=>A.value||F.value),H=u(()=>B.value?.managedProjects===void 0?(B.value?.assignments??[]).filter(e=>e.status===`active`).map(e=>({value:e.personalProjectId,label:f.state?.personalProjects?.find(t=>t.project_id===e.personalProjectId)?.profile.name??e.personalProjectId})):B.value.managedProjects.map(e=>({value:e.id,label:e.name}))),U=u(()=>B.value?.runtimeStatus===`ready`&&B.value.permissions.includes(`board.read`)&&H.value.length>1),W=u(()=>U.value?[{value:$,label:s(`employees.allProjects.option`),meta:s(`employees.allProjects.optionMeta`,{count:H.value.length})},...H.value]:H.value),G=0;n(R,e=>{O(e)},{immediate:!0}),n([W,()=>t.query.project,z],()=>{let e=typeof t.query.project==`string`?t.query.project:``,n=W.value;m.value=e||(n.some(e=>e.value===m.value)?m.value:n[0]?.value??``),!e&&m.value&&r.replace({query:{...t.query,project:m.value}})},{immediate:!0}),n([z,m,R,U],()=>{K()},{immediate:!0}),n(D,e=>{!e&&m.value===$&&K()});async function K(){let e=++G;if(T.value=null,N.value=[],P.value=0,F.value=``,!m.value||!R.value){I.value=!1;return}let t=z.value,n=m.value;if(n===$&&(D.value||!B.value)){I.value=D.value;return}I.value=!0;try{if(n===$&&U.value){let n=await Promise.all(H.value.map(async e=>{try{let n=await y(`/api/employee-templates/${encodeURIComponent(t)}/call`,{personalSpaceId:R.value,personalProjectId:e.value,tool:`read_board`,arguments:{limit:100}}),r=Array.isArray(n.items)?n.items.filter(J):[];return{ok:!0,board:{...n,project:{id:e.value,name:e.label},items:r}}}catch(e){return{ok:!1,cause:e}}}));if(e!==G)return;N.value=n.filter(e=>e.ok).map(e=>e.board),P.value=n.filter(e=>!e.ok).length,!N.value.length&&P.value&&(F.value=k(n.find(e=>!e.ok)?.cause));return}let r=await b(`/api/employee-templates/${encodeURIComponent(t)}/workspace?${new URLSearchParams({personalSpaceId:R.value,personalProjectId:n})}`),i=`/employee-workspaces/${encodeURIComponent(t)}/${encodeURIComponent(n)}/`;if(r.workbenchUrl!==i)throw Error(s(`employees.loadError`));e===G&&(T.value=r)}catch(t){e===G&&(F.value=k(t))}finally{e===G&&(I.value=!1)}}function q(e){r.replace({query:{...t.query,project:e}})}function J(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.id==`string`&&typeof t.projectId==`string`&&typeof t.title==`string`&&[`planned`,`active`,`blocked`,`review`,`done`].includes(t.status??``)}async function Y(){await O(R.value),A.value||await K()}async function X(){let e=m.value===$&&U.value?$:H.value.find(e=>e.value===m.value)?.value??W.value[0]?.value;await r.replace({query:e?{project:e}:{}}),await K()}return(e,t)=>(d(),_(`section`,{class:`employee-workbench-view`,"aria-label":B.value?.name??c(s)(`employees.workbench`)},[l(`header`,ee,[l(`div`,te,[l(`span`,ne,p(B.value?.name.slice(0,1)??`A`),1),l(`h1`,null,[g(p(B.value?.name??c(s)(`employees.workbench`))+` `,1),l(`span`,null,p(B.value?.role),1)])]),l(`div`,re,[W.value.length?(d(),_(`div`,{key:0,class:`employee-workbench-project-view`,title:c(s)(`employees.viewingHint`)},[i(j,{"model-value":m.value,"control-id":`workbench-project`,label:c(s)(`employees.viewingProject`),options:W.value,"onUpdate:modelValue":q},null,8,[`model-value`,`label`,`options`])],8,ie)):h(``,!0),B.value?(d(),_(`button`,{key:1,class:`employee-manage-projects`,type:`button`,disabled:!R.value,onClick:t[0]||=e=>L.value=!0},[t[3]||=l(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.6`,"stroke-linecap":`round`,"aria-hidden":`true`},[l(`path`,{d:`M4 7h9m4 0h3M4 17h3m4 0h9`}),l(`circle`,{cx:`15`,cy:`7`,r:`2`}),l(`circle`,{cx:`9`,cy:`17`,r:`2`})],-1),g(` `+p(c(s)(`employees.manageProjects`)),1)],8,ae)):h(``,!0)])]),i(M,{open:L.value,"personal-space-id":R.value,projects:c(f).state?.personalProjects??[],"template-id":z.value,onClose:t[1]||=e=>L.value=!1,onRecruited:X},null,8,[`open`,`personal-space-id`,`projects`,`template-id`]),I.value||!B.value&&c(D)?(d(),_(`div`,oe,p(c(s)(`employees.loadingWorkbench`)),1)):V.value?(d(),_(`div`,se,[l(`p`,null,p(V.value),1),l(`button`,{class:`quiet-button`,type:`button`,onClick:Y},p(c(s)(`employees.retry`)),1)])):B.value?m.value?m.value===$&&U.value?(d(),o(Z,{key:4,boards:N.value,"total-projects":H.value.length,"failed-projects":P.value,onSelectProject:q,onRetry:K},null,8,[`boards`,`total-projects`,`failed-projects`])):T.value&&T.value.runtimeStatus!==`ready`?(d(),_(`div`,ue,[l(`p`,null,p(c(s)(`employees.installRequired`)),1),l(`small`,null,p(c(s)(`employees.installHelp`)),1)])):T.value?(d(),_(`iframe`,{key:T.value.workbenchUrl,src:T.value.workbenchUrl,title:`${T.value.name} · ${T.value.project.name}`,class:`employee-workbench-frame`},null,8,de)):h(``,!0):(d(),_(`div`,le,[l(`h2`,null,p(c(s)(`employees.emptyWorkbench`)),1),l(`p`,null,p(c(s)(`employees.manageHint`)),1),l(`button`,{class:`quiet-button`,type:`button`,onClick:t[2]||=e=>L.value=!0},p(c(s)(`employees.manageProjects`)),1)])):(d(),_(`div`,ce,[l(`p`,null,p(c(s)(`employees.unavailable`)),1),i(c(w),{to:`/project-agents`},{default:v(()=>[g(p(c(s)(`employees.backToAgents`)),1)]),_:1})]))],8,Q))}}),[[`__scopeId`,`data-v-e9cf167b`]]);export{fe as default};
|