@piagent/platform 1.37.0 → 1.38.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +70 -0
- package/README.md +5 -3
- package/README.vi.md +2 -2
- package/catalog/capabilities.json +2 -2
- package/docs/command-reference-vietnamese.md +4 -3
- package/docs/distribution-standard.md +6 -6
- package/docs/en/maintainer-guide.md +8 -0
- package/docs/en/workspace-editor.md +222 -0
- package/docs/languages.json +13 -4
- package/docs/operator-manual-vietnamese.md +7 -7
- package/docs/publishing-for-teams.md +3 -0
- package/docs/release-install-policy.md +2 -2
- package/docs/research/ide-m0-spike.md +101 -0
- package/docs/team-onboarding.md +2 -2
- package/docs/vi/maintainer-guide.md +8 -0
- package/docs/vi/workspace-editor.md +217 -0
- package/docs-site/architecture.html +1 -1
- package/docs-site/benchmark.html +1 -1
- package/docs-site/commands.html +1 -1
- package/docs-site/content/en/index.html +4 -4
- package/docs-site/content/en/whats-new.html +23 -0
- package/docs-site/content/index.html +4 -4
- package/docs-site/content/whats-new.html +23 -0
- package/docs-site/context-engine.html +1 -1
- package/docs-site/ecosystem.html +1 -1
- package/docs-site/en/architecture.html +1 -1
- package/docs-site/en/benchmark.html +1 -1
- package/docs-site/en/commands.html +1 -1
- package/docs-site/en/context-engine.html +1 -1
- package/docs-site/en/ecosystem.html +1 -1
- package/docs-site/en/index.html +5 -5
- package/docs-site/en/mcp-approval.html +1 -1
- package/docs-site/en/mcp-auth.html +1 -1
- package/docs-site/en/mcp-servers.html +1 -1
- package/docs-site/en/mcp.html +1 -1
- package/docs-site/en/permissions.html +1 -1
- package/docs-site/en/profiles.html +1 -1
- package/docs-site/en/quickstart.html +1 -1
- package/docs-site/en/runtime.html +1 -1
- package/docs-site/en/scope.html +1 -1
- package/docs-site/en/security.html +1 -1
- package/docs-site/en/team.html +1 -1
- package/docs-site/en/whats-new.html +24 -1
- package/docs-site/en/windows.html +1 -1
- package/docs-site/en/workflows.html +1 -1
- package/docs-site/index.html +5 -5
- package/docs-site/mcp-approval.html +1 -1
- package/docs-site/mcp-auth.html +1 -1
- package/docs-site/mcp-servers.html +1 -1
- package/docs-site/mcp.html +1 -1
- package/docs-site/permissions.html +1 -1
- package/docs-site/profiles.html +1 -1
- package/docs-site/quickstart.html +1 -1
- package/docs-site/runtime.html +1 -1
- package/docs-site/scope.html +1 -1
- package/docs-site/security.html +1 -1
- package/docs-site/team.html +1 -1
- package/docs-site/whats-new.html +24 -1
- package/docs-site/windows.html +1 -1
- package/docs-site/workflows.html +1 -1
- package/evals/fixtures/piagent-webui/checkpoint-v1.invalid.json +21 -0
- package/evals/fixtures/piagent-webui/checkpoint-v1.valid.json +20 -0
- package/evals/fixtures/piagent-webui/terminal-v1.invalid.json +17 -0
- package/evals/fixtures/piagent-webui/terminal-v1.valid.json +16 -0
- package/evals/fixtures/piagent-webui/workspace-file-v1.invalid.json +24 -0
- package/evals/fixtures/piagent-webui/workspace-file-v1.valid.json +23 -0
- package/evals/fixtures/piagent-webui/workspace-paths-v1.invalid.json +24 -0
- package/evals/fixtures/piagent-webui/workspace-paths-v1.valid.json +24 -0
- package/evals/fixtures/piagent-webui/workspace-search-v1.invalid.json +26 -0
- package/evals/fixtures/piagent-webui/workspace-search-v1.valid.json +26 -0
- package/evals/fixtures/piagent-webui/workspace-tree-v1.invalid.json +28 -0
- package/evals/fixtures/piagent-webui/workspace-tree-v1.valid.json +27 -0
- package/evals/fixtures/piagent-webui/workspace-write-v1.invalid.json +19 -0
- package/evals/fixtures/piagent-webui/workspace-write-v1.valid.json +19 -0
- package/evals/long-task-soak-v1/README.md +17 -0
- package/evals/long-task-soak-v1/lib/session-loop.mjs +19 -3
- package/evals/long-task-soak-v1/scenarios/ide-editor-terminal.json +19 -0
- package/evals/long-task-soak-v1/surfaces/webui-gateway.mjs +17 -2
- package/evals/long-task-soak-v1/surfaces/workspace-actions.mjs +95 -0
- package/evals/private-holdout-v1/public-exposure.v2.json +2 -2
- package/package.json +7 -3
- package/packages/piagent-core/extensions/fallback-base-policy.ts +1 -1
- package/packages/piagent-core/extensions/guard-types.ts +3 -1
- package/packages/piagent-core/extensions/path-suggestions.ts +137 -0
- package/packages/piagent-core/extensions/piagent-guard.ts +85 -7
- package/packages/piagent-core/extensions/workspace-inspection.ts +145 -0
- package/packages/piagent-core/extensions/workspace-policy.d.ts +7 -0
- package/packages/piagent-core/extensions/workspace-policy.js +3 -0
- package/packages/piagent-core/extensions/workspace-search-index.mjs +8 -0
- package/packages/piagent-core/extensions/workspace-search.ts +74 -0
- package/packages/piagent-core/extensions/workspace-write.ts +116 -0
- package/packages/piagent-core/managed/background-process.mjs +9 -4
- package/packages/piagent-core/managed/boundary-package-proxy.mjs +21 -0
- package/packages/piagent-core/managed/boundary-queue.mjs +24 -0
- package/packages/piagent-core/managed/checkpoint-git.mjs +16 -0
- package/packages/piagent-core/managed/checkpoints.mjs +17 -64
- package/packages/piagent-core/managed/command-tools.mjs +6 -6
- package/packages/piagent-core/managed/continuation.mjs +3 -0
- package/packages/piagent-core/managed/dist/workspace/assets/adapters/backend-api/profile.json +88 -0
- package/packages/piagent-core/managed/dist/workspace/assets/adapters/be-readonly-fe/profile.json +130 -0
- package/packages/piagent-core/managed/dist/workspace/assets/adapters/data/profile.json +88 -0
- package/packages/piagent-core/managed/dist/workspace/assets/adapters/devops/profile.json +90 -0
- package/packages/piagent-core/managed/dist/workspace/assets/adapters/docs/profile.json +74 -0
- package/packages/piagent-core/managed/dist/workspace/assets/adapters/fullstack/profile.json +92 -0
- package/packages/piagent-core/managed/dist/workspace/assets/adapters/generic/profile.json +95 -0
- package/packages/piagent-core/managed/dist/workspace/assets/adapters/mobile/profile.json +86 -0
- package/packages/piagent-core/managed/dist/workspace/assets/adapters/node-typescript/profile.json +74 -0
- package/packages/piagent-core/managed/dist/workspace/assets/adapters/python/profile.json +75 -0
- package/packages/piagent-core/managed/dist/workspace/assets/adapters/web-frontend/profile.json +99 -0
- package/packages/piagent-core/managed/dist/workspace/assets/local-state-path-BrmghxEZ.js +284 -0
- package/packages/piagent-core/managed/dist/workspace/assets/packages/piagent-core/policies/base-policy.json +351 -0
- package/packages/piagent-core/managed/dist/workspace/manifest.json +65 -0
- package/packages/piagent-core/managed/dist/workspace/worker.mjs +7374 -0
- package/packages/piagent-core/managed/dist/workspace/workspace-search-index.mjs +1007 -0
- package/packages/piagent-core/managed/helper-run.mjs +11 -1
- package/packages/piagent-core/managed/helper-settlement.mjs +17 -6
- package/packages/piagent-core/managed/ip-policy.mjs +50 -0
- package/packages/piagent-core/managed/memory-lessons.mjs +4 -1
- package/packages/piagent-core/managed/memory.mjs +1 -1
- package/packages/piagent-core/managed/package-proxy.mjs +12 -14
- package/packages/piagent-core/managed/patch-snapshot.mjs +6 -8
- package/packages/piagent-core/managed/permission.mjs +29 -6
- package/packages/piagent-core/managed/repository-operation.mjs +2 -1
- package/packages/piagent-core/managed/review-snapshot-request.mjs +21 -0
- package/packages/piagent-core/managed/sandbox-diagnostic.mjs +2 -0
- package/packages/piagent-core/managed/session-mutation-observations.mjs +37 -0
- package/packages/piagent-core/managed/session.mjs +6 -7
- package/packages/piagent-core/managed/skill-feedback.mjs +9 -1
- package/packages/piagent-core/managed/source-revert-requests.mjs +21 -0
- package/packages/piagent-core/managed/studio-link.mjs +16 -0
- package/packages/piagent-core/managed/terminal-boundary.mjs +88 -0
- package/packages/piagent-core/managed/terminal-channel.mjs +66 -0
- package/packages/piagent-core/managed/terminal-runtime.mjs +64 -0
- package/packages/piagent-core/managed/terminal-seatbelt.mjs +48 -0
- package/packages/piagent-core/managed/terminal-worker.mjs +70 -0
- package/packages/piagent-core/managed/tool-boundary.mjs +45 -35
- package/packages/piagent-core/managed/tool-freshness.mjs +47 -0
- package/packages/piagent-core/managed/tool-worker.mjs +18 -3
- package/packages/piagent-core/managed/web-fetch.mjs +3 -14
- package/packages/piagent-core/managed/workspace-worker-pins.mjs +26 -0
- package/packages/piagent-core/package.json +1 -1
- package/packages/piagent-core/policies/base-policy.json +2 -1
- package/packages/piagent-core/runtime/checkpoints/checkpoint-authority.ts +43 -0
- package/packages/piagent-core/runtime/checkpoints/checkpoint-refs.mjs +51 -0
- package/packages/piagent-core/runtime/checkpoints/checkpoint-store.mjs +179 -0
- package/packages/piagent-core/runtime/checkpoints/checkpoint-worker.ts +28 -0
- package/packages/piagent-core/runtime/checkpoints/git-adapter.mjs +36 -0
- package/packages/piagent-core/runtime/checkpoints/persistent-history.mjs +96 -0
- package/packages/piagent-core/runtime/checkpoints/personal-git.ts +272 -0
- package/packages/piagent-core/runtime/checkpoints/personal-runtime.ts +158 -0
- package/packages/piagent-core/runtime/checkpoints/prune.mjs +29 -0
- package/packages/piagent-core/runtime/checkpoints/restore-preview.mjs +46 -0
- package/packages/piagent-core/runtime/checkpoints/turn-checkpoints.mjs +167 -0
- package/packages/piagent-core/runtime/hooks/session-hooks.ts +19 -16
- package/packages/piagent-core/runtime/hooks/session-start-hook.ts +3 -0
- package/packages/piagent-core/runtime/hooks/tool-call-hook.ts +2 -2
- package/packages/piagent-core/runtime/inspection/diff-projection.ts +2 -1
- package/packages/piagent-core/runtime/inspection/managed-source-revert.ts +90 -0
- package/packages/piagent-core/runtime/inspection/review-state-projection.ts +19 -8
- package/packages/piagent-core/runtime/inspection/session-diff-projection.ts +47 -0
- package/packages/piagent-core/runtime/inspection/session-hunk-provenance.ts +56 -0
- package/packages/piagent-core/runtime/inspection/session-mutation-observer.ts +125 -0
- package/packages/piagent-core/runtime/inspection/source-action-contract.ts +123 -0
- package/packages/piagent-core/runtime/inspection/source-change-projection.ts +3 -9
- package/packages/piagent-core/runtime/inspection/source-mutation-projection.ts +3 -41
- package/packages/piagent-core/runtime/inspection/source-mutation-store.ts +6 -36
- package/packages/piagent-core/runtime/inspection/source-revert-projection.ts +36 -30
- package/packages/piagent-core/runtime/inspection/text-diff.ts +5 -4
- package/packages/piagent-core/runtime/inspection/workspace-worker.ts +79 -0
- package/packages/piagent-core/runtime/policy/source-index-transaction.ts +3 -10
- package/packages/piagent-core/runtime/policy/source-mutation-guard-binding.ts +27 -2
- package/packages/piagent-core/runtime/policy/source-mutation-guard.ts +42 -12
- package/packages/piagent-core/runtime/policy/source-worktree-transaction.ts +10 -5
- package/packages/piagent-core/runtime/policy/workspace-write-authority.ts +51 -0
- package/packages/piagent-core/runtime/process-owner.mjs +20 -0
- package/packages/piagent-core/runtime/process-tree-watch.mjs +46 -0
- package/packages/piagent-core/runtime/quality/model-mutation-proof.ts +8 -5
- package/packages/piagent-core/runtime/registration/permission-commands.ts +10 -2
- package/packages/piagent-core/runtime/registration/task-evidence-tools.ts +1 -1
- package/packages/piagent-core/runtime/session/workspace-member-edits.d.mts +7 -0
- package/packages/piagent-core/runtime/session/workspace-member-edits.mjs +41 -0
- package/packages/piagent-core/security/workspace-file-reader.ts +2 -1
- package/packages/piagent-webui/dist/client/assets/Alert-DXF8-XqE.js +1 -0
- package/packages/piagent-webui/dist/client/assets/Button-DZJosXQi.js +1 -0
- package/packages/piagent-webui/dist/client/assets/DialogTitle-CL-fzCnT.js +3 -0
- package/packages/piagent-webui/dist/client/assets/MarkdownMessage-k4tq1y8s.js +29 -0
- package/packages/piagent-webui/dist/client/assets/TerminalPanel-DvOPgrGI.js +2 -0
- package/packages/piagent-webui/dist/client/assets/TerminalView-B_a16moC.js +9 -0
- package/packages/piagent-webui/dist/client/assets/TerminalView-kHJ-D0s7.css +1 -0
- package/packages/piagent-webui/dist/client/assets/Typography-DMZL1kLS.js +1 -0
- package/packages/piagent-webui/dist/client/assets/WorkspaceCodeEditor-BCiYM9NA.js +2 -0
- package/packages/piagent-webui/dist/client/assets/WorkspaceExplorer-DttpQtpf.js +5 -0
- package/packages/piagent-webui/dist/client/assets/WorkspaceQuickOpen-fgXwQ46B.js +1 -0
- package/packages/piagent-webui/dist/client/assets/bootstrap-CedkNtRG.js +1 -0
- package/packages/piagent-webui/dist/client/assets/dist-B1M7IjfA.js +10 -0
- package/packages/piagent-webui/dist/client/assets/dist-BUYtGaUP.js +1 -0
- package/packages/piagent-webui/dist/client/assets/dist-C82AtDDT.js +6 -0
- package/packages/piagent-webui/dist/client/assets/dist-D9b8j6pJ.js +1 -0
- package/packages/piagent-webui/dist/client/assets/dist-DLfpWwLs.js +23 -0
- package/packages/piagent-webui/dist/client/assets/dist-DcEu_WYV.js +1 -0
- package/packages/piagent-webui/dist/client/assets/dist-_JsfplOG.js +9 -0
- package/packages/piagent-webui/dist/client/assets/dist-idN8f9Fc.js +1 -0
- package/packages/piagent-webui/dist/client/assets/dist-nvgpa2Us.js +1 -0
- package/packages/piagent-webui/dist/client/assets/index-BW8-BUMx.js +102 -0
- package/packages/piagent-webui/dist/client/assets/index-Brs_HjIo.css +1 -0
- package/packages/piagent-webui/dist/client/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/packages/piagent-webui/dist/client/assets/tab-close-HE0XxoJf.js +1 -0
- package/packages/piagent-webui/dist/client/assets/ui-preferences-DiddStu0.js +124 -0
- package/packages/piagent-webui/dist/client/assets/useTheme-_ESOj7MI.js +10 -0
- package/packages/piagent-webui/dist/client/assets/workspace-api-O7auv_td.js +1 -0
- package/packages/piagent-webui/dist/client/index.html +10 -2
- package/packages/piagent-webui/extension/same-session-bridge.ts +2 -3
- package/packages/piagent-webui/extension/source-revert-controller.ts +14 -208
- package/packages/piagent-webui/gateway/checkpoint-sessions.ts +99 -0
- package/packages/piagent-webui/gateway/checkpoint-store.ts +6 -0
- package/packages/piagent-webui/gateway/company-relay.ts +5 -0
- package/packages/piagent-webui/gateway/company-terminal-cache.ts +54 -0
- package/packages/piagent-webui/gateway/company-terminal-channel.ts +117 -0
- package/packages/piagent-webui/gateway/company-terminal-relay.ts +75 -0
- package/packages/piagent-webui/gateway/gateway-protocol-service.ts +12 -0
- package/packages/piagent-webui/gateway/gateway-service.ts +48 -4
- package/packages/piagent-webui/gateway/managed-gateway.mjs +30 -3
- package/packages/piagent-webui/gateway/managed-projection.ts +5 -3
- package/packages/piagent-webui/gateway/managed-source-revert-controller.ts +45 -0
- package/packages/piagent-webui/gateway/managed-source-revert-sessions.ts +74 -0
- package/packages/piagent-webui/gateway/managed-terminal-binding.ts +30 -0
- package/packages/piagent-webui/gateway/managed-terminal-processes.ts +74 -0
- package/packages/piagent-webui/gateway/managed-terminal-sessions.ts +9 -0
- package/packages/piagent-webui/gateway/path-suggestions.ts +1 -124
- package/packages/piagent-webui/gateway/personal-terminal-binding.ts +36 -0
- package/packages/piagent-webui/gateway/personal-terminal-diagnostic.mjs +16 -0
- package/packages/piagent-webui/gateway/personal-terminal-processes.ts +119 -0
- package/packages/piagent-webui/gateway/personal-terminal-sessions.ts +22 -0
- package/packages/piagent-webui/gateway/runtime-session-controls.ts +2 -1
- package/packages/piagent-webui/gateway/session-catalog.ts +3 -2
- package/packages/piagent-webui/gateway/session-command-controller.ts +4 -4
- package/packages/piagent-webui/gateway/session-inspection-registry.ts +29 -5
- package/packages/piagent-webui/gateway/session-runtime-supervisor.ts +8 -8
- package/packages/piagent-webui/gateway/signed-session-journal.ts +77 -0
- package/packages/piagent-webui/gateway/source-revert-sessions.ts +74 -0
- package/packages/piagent-webui/gateway/source-revert-store.ts +47 -0
- package/packages/piagent-webui/gateway/terminal-command-ledger.ts +33 -0
- package/packages/piagent-webui/gateway/terminal-mentions.ts +29 -0
- package/packages/piagent-webui/gateway/terminal-output-buffer.ts +58 -0
- package/packages/piagent-webui/gateway/terminal-router.ts +12 -0
- package/packages/piagent-webui/gateway/terminal-sessions.ts +247 -0
- package/packages/piagent-webui/gateway/workspace-write-sessions.ts +69 -0
- package/packages/piagent-webui/gateway/workspace-write-store.ts +6 -0
- package/packages/piagent-webui/package.json +14 -2
- package/packages/piagent-webui/server/checkpoint-command.ts +30 -0
- package/packages/piagent-webui/server/checkpoint-controller.ts +87 -0
- package/packages/piagent-webui/server/checkpoint-routes.ts +38 -0
- package/packages/piagent-webui/server/control-command-digest.ts +5 -0
- package/packages/piagent-webui/server/core-inspection-provider.ts +16 -22
- package/packages/piagent-webui/server/gateway-websocket.ts +36 -8
- package/packages/piagent-webui/server/loopback-server.ts +9 -0
- package/packages/piagent-webui/server/read-model-provider.ts +3 -0
- package/packages/piagent-webui/server/read-only-router.ts +3 -0
- package/packages/piagent-webui/server/session-auth.ts +4 -1
- package/packages/piagent-webui/server/session-source-revert-routes.ts +54 -0
- package/packages/piagent-webui/server/source-projection-binding.ts +18 -0
- package/packages/piagent-webui/server/source-revert-controller.ts +225 -0
- package/packages/piagent-webui/server/terminal-command.ts +35 -0
- package/packages/piagent-webui/server/terminal-websocket-stream.ts +56 -0
- package/packages/piagent-webui/server/transcript-projection.ts +2 -1
- package/packages/piagent-webui/server/workspace-read-routes.ts +32 -0
- package/packages/piagent-webui/server/workspace-reader.ts +23 -0
- package/packages/piagent-webui/server/workspace-write-controller.ts +118 -0
- package/packages/piagent-webui/server/workspace-write-routes.ts +38 -0
- package/packages/piagent-webui/shared/terminal-message.ts +23 -0
- package/schemas/piagent-webui/catalog-v1.json +63 -0
- package/schemas/piagent-webui/checkpoint-v1.schema.json +466 -0
- package/schemas/piagent-webui/control-command-v1.schema.json +68 -3
- package/schemas/piagent-webui/diff-v1.schema.json +4 -0
- package/schemas/piagent-webui/gateway-protocol-v1.schema.json +123 -3
- package/schemas/piagent-webui/session-catalog-v1.schema.json +1 -1
- package/schemas/piagent-webui/session-command-v1.schema.json +1 -1
- package/schemas/piagent-webui/snapshot-v1.schema.json +2 -1
- package/schemas/piagent-webui/source-revert-v1.schema.json +22 -3
- package/schemas/piagent-webui/terminal-v1.schema.json +495 -0
- package/schemas/piagent-webui/workspace-file-v1.schema.json +79 -0
- package/schemas/piagent-webui/workspace-paths-v1.schema.json +71 -0
- package/schemas/piagent-webui/workspace-search-v1.schema.json +80 -0
- package/schemas/piagent-webui/workspace-tree-v1.schema.json +87 -0
- package/schemas/piagent-webui/workspace-write-v1.schema.json +276 -0
- package/schemas/project-profile.schema.json +8 -3
- package/scripts/company-terminal.mjs +16 -11
- package/scripts/pi-auto.sh +5 -1
- package/scripts/team-doctor.sh +8 -0
- package/packages/piagent-webui/dist/client/assets/MarkdownMessage-CfgyQQbW.js +0 -29
- package/packages/piagent-webui/dist/client/assets/index-HyzWKvDu.js +0 -234
- package/packages/piagent-webui/dist/client/assets/index-_0nGP2n3.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;inset:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;inset:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{U as t,a as n,b as r,c as i,d as a,f as o,t as s,u as c}from"./useTheme-_ESOj7MI.js";import{A as l,C as u,D as d,E as f,S as p,_ as m,p as h}from"./ui-preferences-DiddStu0.js";var g=e(t(),1);function _(e){return a(`MuiPaper`,e)}c(`MuiPaper`,`root.rounded.outlined.elevation.elevation0.elevation1.elevation2.elevation3.elevation4.elevation5.elevation6.elevation7.elevation8.elevation9.elevation10.elevation11.elevation12.elevation13.elevation14.elevation15.elevation16.elevation17.elevation18.elevation19.elevation20.elevation21.elevation22.elevation23.elevation24`.split(`.`));var v=r(),y=e=>{let{square:t,elevation:n,variant:r,classes:i}=e,a={root:[`root`,r,!t&&`rounded`,r===`elevation`&&`elevation${n}`]};return l(a,_,i)},b=d(`div`,{name:`MuiPaper`,slot:`Root`,overridesResolver:(e,t)=>{let{ownerState:n}=e;return[t.root,t[n.variant],!n.square&&t.rounded,n.variant===`elevation`&&t[`elevation${n.elevation}`]]}})(u(({theme:e})=>({backgroundColor:(e.vars||e).palette.background.paper,color:(e.vars||e).palette.text.primary,...m(e,`box-shadow`),variants:[{props:({ownerState:e})=>!e.square,style:{borderRadius:e.shape.borderRadius}},{props:{variant:`outlined`},style:{border:`1px solid ${(e.vars||e).palette.divider}`}},{props:{variant:`elevation`},style:{boxShadow:`var(--Paper-shadow)`,backgroundImage:`var(--Paper-overlay)`}}]}))),x=g.forwardRef(function(e,t){let r=f({props:e,name:`MuiPaper`}),a=s(),{className:c,component:l=`div`,elevation:u=1,square:d=!1,variant:p=`elevation`,...m}=r,h={...r,component:l,elevation:u,square:d,variant:p},g=y(h);return(0,v.jsx)(b,{as:l,ownerState:h,className:o(g.root,c),ref:t,...m,style:{...p===`elevation`&&{"--Paper-shadow":(a.vars||a).shadows[u],...a.vars&&{"--Paper-overlay":a.vars.overlays?.[u]},...!a.vars&&a.palette.mode===`dark`&&{"--Paper-overlay":`linear-gradient(${i(`#fff`,n(u))}, ${i(`#fff`,n(u))})`}},...m.style}})});function S(e){return a(`MuiTypography`,e)}var C=c(`MuiTypography`,[`root`,`h1`,`h2`,`h3`,`h4`,`h5`,`h6`,`subtitle1`,`subtitle2`,`body1`,`body2`,`inherit`,`button`,`caption`,`overline`,`alignLeft`,`alignRight`,`alignCenter`,`alignJustify`,`noWrap`,`gutterBottom`]),w=e=>{let{align:t,gutterBottom:n,noWrap:r,variant:i,classes:a}=e,o={root:[`root`,i,e.align!==`inherit`&&`align${p(t)}`,n&&`gutterBottom`,r&&`noWrap`]};return l(o,S,a)},T=d(`span`,{name:`MuiTypography`,slot:`Root`,overridesResolver:(e,t)=>{let{ownerState:n}=e;return[t.root,n.variant&&t[n.variant],n.align!==`inherit`&&t[`align${p(n.align)}`],n.noWrap&&t.noWrap,n.gutterBottom&&t.gutterBottom]}})(u(({theme:e})=>({margin:0,variants:[{props:{variant:`inherit`},style:{font:`inherit`,lineHeight:`inherit`,letterSpacing:`inherit`}},...Object.entries(e.typography).filter(([e,t])=>e!==`inherit`&&t&&typeof t==`object`).map(([e,t])=>({props:{variant:e},style:t})),...Object.entries(e.palette).filter(h()).map(([t])=>({props:{color:t},style:{color:(e.vars||e).palette[t].main}})),...Object.entries(e.palette?.text||{}).filter(([,e])=>typeof e==`string`).map(([t])=>({props:{color:`text${p(t)}`},style:{color:(e.vars||e).palette.text[t]}})),{props:({ownerState:e})=>e.align!==`inherit`,style:{textAlign:`var(--Typography-textAlign)`}},{props:({ownerState:e})=>e.noWrap,style:{overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`}},{props:({ownerState:e})=>e.gutterBottom,style:{marginBottom:`0.35em`}}]}))),E={h1:`h1`,h2:`h2`,h3:`h3`,h4:`h4`,h5:`h5`,h6:`h6`,subtitle1:`h6`,subtitle2:`h6`,body1:`p`,body2:`p`,inherit:`p`},D=g.forwardRef(function(e,t){let n=f({props:e,name:`MuiTypography`}),{color:r,align:i=`inherit`,className:a,component:s,gutterBottom:c=!1,noWrap:l=!1,variant:u=`body1`,variantMapping:d=E,...p}=n,m={...n,align:i,color:r,className:a,component:s,gutterBottom:c,noWrap:l,variant:u,variantMapping:d},h=s||d[u]||E[u]||`span`,g=w(m);return(0,v.jsx)(T,{as:h,ref:t,className:o(g.root,a),...p,ownerState:m,style:{...i!==`inherit`&&{"--Typography-textAlign":i},...p.style}})});export{C as n,x as r,D as t};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/dist-DLfpWwLs.js","assets/rolldown-runtime-hePW80VL.js","assets/dist-B1M7IjfA.js","assets/dist-idN8f9Fc.js","assets/dist-DcEu_WYV.js","assets/dist-BUYtGaUP.js","assets/dist-C82AtDDT.js","assets/dist-D9b8j6pJ.js","assets/dist-nvgpa2Us.js","assets/dist-_JsfplOG.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{U as t,b as n,t as r}from"./useTheme-_ESOj7MI.js";import{n as i,r as a}from"./ui-preferences-DiddStu0.js";import{t as o}from"./Button-DZJosXQi.js";import{i as s,w as c}from"./index-BW8-BUMx.js";import{A as l,C as u,D as d,E as f,M as p,O as m,R as h,S as g,T as _,c as v,w as y,x as b,y as x}from"./dist-B1M7IjfA.js";var S=class extends y{lines;label;comment;constructor(e,t,n){super(),this.lines=e,this.label=t,this.comment=n}toDOM(){let e=document.createElement(`div`);e.className=`cm-agent-deleted`;for(let t of this.lines){let n=document.createElement(`div`),r=document.createElement(`span`);if(r.textContent=`− ${t.text}`,n.append(r),this.comment){let e=document.createElement(`button`);e.type=`button`,e.textContent=this.label,e.setAttribute(`aria-label`,`${this.label} ${t.line}`),e.addEventListener(`click`,()=>this.comment?.(t.line,t.text,`old`)),n.append(e)}e.append(n)}return e}},C=class extends y{ref;label;keep;revertLabel;revert;constructor(e,t,n,r,i){super(),this.ref=e,this.label=t,this.keep=n,this.revertLabel=r,this.revert=i}toDOM(){let e=document.createElement(`div`);e.className=`cm-agent-actions`;let t=document.createElement(`button`);if(t.type=`button`,t.textContent=this.label,t.addEventListener(`click`,()=>this.keep(this.ref)),e.append(t),this.revert){let t=document.createElement(`button`);t.type=`button`,t.textContent=this.revertLabel,t.addEventListener(`click`,()=>this.revert?.(this.ref)),e.append(t)}return e}},w=new class extends u{toDOM(){let e=document.createElement(`span`);return e.textContent=`▎`,e.className=`cm-agent-marker`,e}};function T(e,t,n,r,i,a,o=``,s){let c=e.state.doc.toString(),l=[],u=[],f=t=>e.state.doc.line(Math.max(1,Math.min(e.state.doc.lines,t))).from;for(let e of t){let t=f(e.newStart+ +(e.newLineCount===0));u.push(t),l.push(b.widget({widget:new C(e.hunkRef,n,r,i,a),block:!0,side:-1}).range(t));let c=e.newStart+ +(e.newLineCount===0),d=[],p=()=>{d.length&&(l.push(b.widget({widget:new S(d,o,s),block:!0,side:-1}).range(f(c))),d=[])};for(let t of e.lines){if(t.kind===`deleted`){t.oldLineNumber!==null&&d.push({line:t.oldLineNumber,text:t.text});continue}p(),t.newLineNumber!==null&&(c=t.newLineNumber+1,t.kind===`added`&&l.push(b.line({class:`cm-agent-added`}).range(f(t.newLineNumber))))}p()}let p=h.define({create:()=>b.set(l,!0),update:(e,t)=>t.docChanged?b.none:e,provide:e=>g.decorations.from(e)}),m=e=>t=>{if(!u.length||t.state.doc.toString()!==c)return!1;let n=t.state.selection.main.head,r=e>0?u.find(e=>e>n)??u[0]:[...u].reverse().find(e=>e<n)??u.at(-1);return t.dispatch({selection:{anchor:r},effects:g.scrollIntoView(r,{y:`center`})}),!0};return[p,t.length?_({class:`cm-agent-gutter`,lineMarker:(e,t)=>e.state.field(p).size&&u.includes(t.from)?w:null}):[],d.of([{key:`Alt-ArrowDown`,run:m(1)},{key:`Alt-ArrowUp`,run:m(-1)}]),g.theme({".cm-agent-added":{backgroundColor:`color-mix(in srgb, #2e9d55 15%, transparent)`},".cm-agent-deleted":{margin:`0`,padding:`2px 8px`,whiteSpace:`pre-wrap`,backgroundColor:`color-mix(in srgb, #df4545 15%, transparent)`,fontFamily:`monospace`},".cm-agent-marker":{color:`#2e9d55`},".cm-agent-actions":{padding:`2px 8px`},".cm-agent-actions button":{color:`inherit`,background:`transparent`,border:`1px solid currentColor`,borderRadius:`4px`,cursor:`pointer`}})]}var E=e(t(),1),D=n();async function O(e){let t=e.split(`.`).at(-1)?.toLowerCase();switch(t){case`js`:case`mjs`:case`cjs`:case`jsx`:case`ts`:case`tsx`:return(await s(async()=>{let{javascript:e}=await import(`./dist-DLfpWwLs.js`).then(e=>e.t);return{javascript:e}},__vite__mapDeps([0,1,2,3,4]))).javascript({typescript:t===`ts`||t===`tsx`,jsx:t===`jsx`||t===`tsx`});case`json`:return(await s(async()=>{let{json:e}=await import(`./dist-BUYtGaUP.js`);return{json:e}},__vite__mapDeps([5,2,3]))).json();case`md`:return(await s(async()=>{let{markdown:e}=await import(`./dist-C82AtDDT.js`);return{markdown:e}},__vite__mapDeps([6,2,4,7,3,8,1,0]))).markdown();case`py`:return(await s(async()=>{let{python:e}=await import(`./dist-_JsfplOG.js`);return{python:e}},__vite__mapDeps([9,2,3,4]))).python();case`html`:return(await s(async()=>{let{html:e}=await import(`./dist-D9b8j6pJ.js`);return{html:e}},__vite__mapDeps([7,2,3,8,1,0,4]))).html();case`css`:return(await s(async()=>{let{css:e}=await import(`./dist-nvgpa2Us.js`).then(e=>e.r);return{css:e}},__vite__mapDeps([8,1,2,3]))).css();default:return[]}}var k=[],A=e=>{};function j({content:e,path:t,line:n=1,readOnly:s=!0,onChange:u,onSave:h,hunks:_=k,onKeep:y=A,onRevert:b,onComment:S}){let C=(0,E.useRef)(null),w=(0,E.useRef)(null),j=r(),M=(0,E.useRef)({onChange:u,onSave:h,onComment:S});M.current={onChange:u,onSave:h,onComment:S};let N=(0,E.useRef)(e);N.current=e;let P=(0,E.useRef)(new l),F=(0,E.useRef)(new l),{locale:I}=a();return(0,E.useEffect)(()=>{if(!C.current)return;let e=document.querySelector(`meta[name="csp-nonce"]`)?.content,n=new l,r=!1,i=new g({parent:C.current,state:p.create({doc:N.current,extensions:[F.current.of([]),g.cspNonce.of(e??``),P.current.of([p.readOnly.of(s),g.editable.of(!s)]),d.of([{key:`Mod-Shift-m`,run:e=>{let t=e.state.doc.lineAt(e.state.selection.main.head);return M.current.onComment?.(t.number,t.text),!!M.current.onComment}}]),d.of([`Ctrl-s`,`Meta-s`].map(e=>({key:e,run:()=>(M.current.onSave?.(),!0)}))),g.updateListener.of(e=>{e.docChanged&&M.current.onChange?.(e.state.doc.toString())}),m(),f(),x(v),n.of([]),g.contentAttributes.of({"aria-label":t,tabindex:`0`}),g.theme({"&":{height:`100%`,color:j.palette.text.primary,backgroundColor:j.palette.background.paper},".cm-scroller":{overflow:`auto`,fontFamily:`monospace`},".cm-gutters":{backgroundColor:j.palette.background.default,color:j.palette.text.secondary}},{dark:j.palette.mode===`dark`})]})});return w.current=i,O(t).then(e=>{r||i.dispatch({effects:n.reconfigure(e)})}).catch(()=>{}),()=>{r=!0,w.current=null,i.destroy()}},[t,j]),(0,E.useEffect)(()=>{let t=w.current;t&&t.state.doc.toString()!==e&&t.dispatch({changes:{from:0,to:t.state.doc.length,insert:e}})},[e,t,j]),(0,E.useEffect)(()=>{let e=w.current;e&&e.dispatch({effects:F.current.reconfigure(T(e,_,i(I,`Giữ`,`Keep`),y,i(I,`Hoàn tác`,`Revert`),b,i(I,`Comment dòng đã xóa`,`Comment on removed line`),S))})},[_,y,b,S,e,t,j,I]),(0,E.useEffect)(()=>{w.current?.dispatch({effects:P.current.reconfigure([p.readOnly.of(s),g.editable.of(!s)])})},[s,t,j]),(0,E.useEffect)(()=>{let e=w.current;if(!e)return;let t=e.state.doc.line(Math.max(1,Math.min(e.state.doc.lines,n))).from;e.dispatch({selection:{anchor:t},effects:g.scrollIntoView(t,{y:`center`})})},[n,t,j]),(0,D.jsxs)(c,{sx:{height:`100%`,display:`flex`,flexDirection:`column`},children:[S&&(0,D.jsx)(o,{size:`small`,onClick:()=>{let e=w.current;if(!e)return;let t=e.state.doc.lineAt(e.state.selection.main.head);S(t.number,t.text)},children:i(I,`Comment dòng hiện tại`,`Comment on current line`)}),(0,D.jsx)(c,{ref:C,sx:{flex:1,minHeight:240,overflow:`hidden`}})]})}export{j as default};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/WorkspaceCodeEditor-BCiYM9NA.js","assets/rolldown-runtime-hePW80VL.js","assets/useTheme-_ESOj7MI.js","assets/ui-preferences-DiddStu0.js","assets/Button-DZJosXQi.js","assets/index-BW8-BUMx.js","assets/DialogTitle-CL-fzCnT.js","assets/Alert-DXF8-XqE.js","assets/Typography-DMZL1kLS.js","assets/bootstrap-CedkNtRG.js","assets/index-Brs_HjIo.css","assets/dist-B1M7IjfA.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{U as t,b as n}from"./useTheme-_ESOj7MI.js";import{i as r,k as i,n as a,r as o,t as s}from"./DialogTitle-CL-fzCnT.js";import{a as c,n as l,r as u}from"./ui-preferences-DiddStu0.js";import{c as d,t as f}from"./Alert-DXF8-XqE.js";import{t as p}from"./Typography-DMZL1kLS.js";import{t as m}from"./Button-DZJosXQi.js";import{i as h,n as g,o as _}from"./bootstrap-CedkNtRG.js";import{_ as v,a as y,b,c as x,d as S,f as C,g as w,h as ee,i as T,l as E,m as D,n as O,o as k,p as A,r as te,s as j,u as M,v as N,w as P,x as F}from"./index-BW8-BUMx.js";import{n as ne,t as re}from"./tab-close-HE0XxoJf.js";import{i as I,r as ie,t as L}from"./workspace-api-O7auv_td.js";var R=e(t(),1),z=n();function ae(e,t,n,r=[]){let{locale:i}=u(),[c,d]=(0,R.useState)(()=>M(e)),[f,p]=(0,R.useState)();(0,R.useEffect)(()=>{d(M(e)),p(void 0);let t=t=>{t.detail===e&&d(M(e))};return window.addEventListener(x,t),()=>window.removeEventListener(x,t)},[e]),(0,R.useEffect)(()=>p(void 0),[t]);let m=t=>{d(t),A(e,t)},h={locale:i,comments:c,editing:f?E(f.path,f.side,f.line):null,open:(e,t,n,r)=>p({path:e,line:n,code:r,side:t}),cancel:()=>p(void 0),save:t=>{f&&m(C(M(e),{...f,text:t})),p(void 0)},remove:t=>m(M(e).filter(e=>E(e.path,e.side,e.line)!==t))},g=new Map(n.split(`
|
|
3
|
+
`).map((e,n)=>[E(t??``,`new`,n+1),e.slice(0,400)]));for(let e of r)for(let n of e.lines)n.oldLineNumber!==null&&g.set(E(t??``,`old`,n.oldLineNumber),n.text.slice(0,400));return{open:(e,n,r=`new`)=>{t&&p({path:t,line:e,code:n,side:r})},dialog:(0,z.jsxs)(o,{open:!!f,onClose:()=>p(void 0),fullWidth:!0,children:[(0,z.jsxs)(s,{children:[l(i,`Comment theo dòng`,`Line comment`),` · `,f?.path,`:`,f?.line]}),(0,z.jsx)(a,{children:(0,z.jsx)(j.Provider,{value:h,children:f&&(0,z.jsx)(k,{path:f.path,side:f.side,line:f.line})})})]}),bar:(0,z.jsx)(y,{comments:c,lines:g,linesPath:t,locale:i,onClear:()=>m([]),onSend:()=>{let t=M(e);t.length&&O(e,S(t,i===`en`)),m([])}})}}var B=new Map;function oe(e,t,n,r,i){let{locale:c}=u(),d=`${e}\0${t??``}`,h=`${d}\0${n}\0${r}`,g=(0,R.useRef)(h);g.current=h;let _=(0,R.useRef)(d);_.current=d;let v=(0,R.useRef)(!1),[y,b]=(0,R.useState)(!1),[x,S]=(0,R.useState)(!1),[C,T]=(0,R.useState)(),[E,O]=(0,R.useState)(),[k,A]=(0,R.useState)(!1);(0,R.useEffect)(()=>{S(!1),T(void 0),O(void 0),A(B.has(d))},[d]);let j=async a=>{if(!(v.current||!r||!i||i.file.path!==t||i.file.currentDigest!==`sha256:${n}`)&&(S(!0),O(void 0),T(void 0),A(B.has(d)),!B.has(d))){v.current=!0,b(!0);try{let n=await ee(e,i.file.fileRef,a);if(g.current!==h)return;if(n.state!==`ready`||!n.target||n.target.path!==t||n.target.fileRef!==i.file.fileRef||n.target.fileRevision!==i.file.fileRevision||!n.target.hunkRefs.some(e=>e===a))throw Error(`preview-unavailable`);T({value:n,scope:h})}catch{g.current===h&&O(l(c,`Chưa thể hoàn tác an toàn. Tải lại diff và thử lại.`,`Safe revert is unavailable. Refresh the diff and try again.`))}finally{v.current=!1,b(!1)}}},M=async()=>{if(!(v.current||!r||!B.has(d)&&(!C||C.scope!==h))){v.current=!0,b(!0),O(void 0);try{let t=B.get(d)??await D(C.value);if(g.current!==h)return;if(!B.has(d)&&B.size>=128){O(l(c,`Có quá nhiều lệnh chưa rõ kết quả. Kiểm tra lại các lệnh trước trước khi hoàn tác thêm.`,`Too many commands still need their results checked. Check earlier commands before reverting more.`));return}B.set(d,t),A(!0);let n=await w(t,void 0,e);if(n.phase!==`uncertain`&&B.delete(d),_.current===d&&A(B.has(d)),window.dispatchEvent(new CustomEvent(`piagent-workspace-changed`,{detail:{sessionRef:e}})),g.current!==h)return;A(B.has(d)),n.phase===`settled`?(S(!1),T(void 0)):(n.phase===`rejected`&&T(void 0),O(n.phase===`uncertain`?l(c,`Chưa xác định được kết quả. Kiểm tra tệp; kiểm tra lại sẽ dùng đúng lệnh cũ.`,`The result is uncertain. Inspect the file; checking again uses the same command.`):l(c,`Tệp hoặc quyền đã thay đổi. Hãy đóng và xem preview mới.`,`The file or permission changed. Close this dialog and request a new preview.`)))}catch{g.current===h&&O(l(c,`Chưa nhận được kết quả. Kiểm tra lại dùng cùng lệnh, không tạo lần hoàn tác mới.`,`No result received. Checking again reuses the same command.`))}finally{v.current=!1,b(!1)}}},N=C&&C.scope!==h;return{request:j,dialog:(0,z.jsxs)(o,{open:x,onClose:()=>{y||S(!1)},fullWidth:!0,maxWidth:`md`,children:[(0,z.jsx)(s,{children:l(c,`Hoàn tác thay đổi của agent`,`Revert agent changes`)}),(0,z.jsxs)(a,{children:[(0,z.jsx)(p,{children:t}),(0,z.jsx)(p,{children:l(c,`Các dòng dưới đây sẽ được hoàn tác. Git index được giữ nguyên.`,`The changes below will be reverted. The Git index is preserved.`)}),E&&(0,z.jsx)(f,{severity:`warning`,children:E}),N&&(0,z.jsx)(f,{severity:`warning`,children:l(c,`Nội dung editor đã đổi. Mở lại preview trước khi hoàn tác.`,`Editor contents changed. Open a new preview before reverting.`)}),k&&!C&&(0,z.jsx)(f,{severity:`info`,children:l(c,`Có lệnh chưa xác nhận kết quả cho tệp này.`,`A command for this file still needs its result confirmed.`)}),C?.value.preview?.hunks.map(e=>(0,z.jsxs)(P,{component:`pre`,sx:{whiteSpace:`pre-wrap`,overflowWrap:`anywhere`},children:[e.header,`
|
|
4
|
+
`,e.lines.map(e=>`${e.marker}${e.text}`).join(`
|
|
5
|
+
`)]},e.hunkRef))]}),(0,z.jsxs)(te,{children:[(0,z.jsx)(m,{disabled:y,onClick:()=>S(!1),children:l(c,`Đóng`,`Close`)}),(0,z.jsx)(m,{color:`error`,disabled:y||!r||!k&&(!C||!!N),onClick:()=>void M(),children:k?l(c,`Kiểm tra lại`,`Check again`):l(c,`Xác nhận hoàn tác`,`Confirm revert`)})]})]}),hasPending:k,checkPending:()=>{A(B.has(d)),S(!0)}}}async function se(e,t,n){let r=await fetch(`/api/v1/sessions/${encodeURIComponent(e)}/source-review${t?`/${encodeURIComponent(t)}`:``}`,{credentials:`same-origin`,headers:{Accept:`application/json`},signal:n});if(r.status===401&&_(),!r.ok)throw Error(`source-review-unavailable`);return r.json()}var ce=(e,t)=>se(e,void 0,t),le=(e,t,n)=>se(e,t,n);function ue(e,t,n,r,i){if(!e||!r||!n||e.file.path!==t||e.file.currentDigest!==`sha256:${n}`||e.availability.state!==`current`||e.truncation.truncated||e.redaction.applied)return[];let a=new Set(e.agentHunkRefs??[]);return e.hunks.filter(e=>a.has(e.hunkRef)&&!i.has(`${t}:${n}:${e.hunkRef}`))}var V=new Set,H=new Map,U=new Set,W=`piagent.kept-hunks.`,de=`piagent.kept-hunks`;function fe(e){try{let t=JSON.parse(localStorage.getItem(W+e)??`[]`);return Array.isArray(t)?new Set(t.filter(e=>typeof e==`string`).slice(-4096)):V}catch{return V}}function pe(e,t){try{let n=[...JSON.parse(localStorage.getItem(de)??`[]`).filter(t=>t!==e),e];for(let e of n.splice(0,Math.max(0,n.length-64)))localStorage.removeItem(W+e);localStorage.setItem(W+e,JSON.stringify([...t])),localStorage.setItem(de,JSON.stringify(n))}catch{}}var G=e=>(H.has(e)||H.set(e,fe(e)),H.get(e)??V);function K(e,t,n,r){let i=new Set([...G(e),`${t}:${n}:${r}`].slice(-4096));for(H.delete(e),H.set(e,i);H.size>64;)H.delete(H.keys().next().value);pe(e,i);for(let e of U)e()}function q(e){return(0,R.useSyncExternalStore)(e=>(U.add(e),()=>{U.delete(e)}),()=>G(e))}function me(e,t,n){let[r,i]=(0,R.useState)(),a=q(e),o=JSON.stringify(t.map(e=>e.file.path).sort());(0,R.useEffect)(()=>{let t=JSON.parse(o);if(!t.length){i(void 0);return}let n=new AbortController,r=!1,a=!1,s=async()=>{if(!n.signal.aborted){if(r){a=!0;return}r=!0;try{let r=await ce(e,n.signal),a=new Map;for(let i of t){if(n.signal.aborted)return;let t=r.files.find(e=>e.path===i&&e.pathDisplay===`exact-safe`);if(t)try{a.set(i,await le(e,t.fileRef,n.signal))}catch{}}n.signal.aborted||i({session:e,diffs:a})}catch{n.signal.aborted||i(void 0)}finally{r=!1,a&&!n.signal.aborted&&(a=!1,s())}}};s();let c=window.setInterval(()=>void s(),3e3),l=t=>{t.detail?.sessionRef===e&&s()};return window.addEventListener(`piagent-workspace-saved`,l),window.addEventListener(`piagent-workspace-changed`,l),()=>{n.abort(),clearInterval(c),window.removeEventListener(`piagent-workspace-saved`,l),window.removeEventListener(`piagent-workspace-changed`,l)}},[e,o]);let s=r?.session===e?r.diffs:void 0,c=e=>ue(s?.get(e.file.path),e.file.path,e.file.digest,!e.fresh&&!e.pending&&e.draft===(e.file.content??``),a),l=t.find(e=>e.file.path===n),u=l?c(l):[];return{diff:n?s?.get(n):void 0,hunks:u,counts:new Map(t.map(e=>[e.file.path,c(e).length])),keep:t=>{l?.file.digest&&u.some(e=>e.hunkRef===t)&&K(e,l.file.path,l.file.digest,t)}}}var J=new Map,Y=new Set,X={tabs:[]},Z=e=>e.fresh||e.draft!==(e.file.content??``);window.addEventListener(`beforeunload`,e=>{[...J.values()].some(e=>e.tabs.some(Z))&&(e.preventDefault(),e.returnValue=``)});var Q=e=>J.get(e)??X;function he(e){let t=(0,R.useSyncExternalStore)(e=>(Y.add(e),()=>{Y.delete(e)}),()=>J.get(e)??X),n=t=>{J.set(e,t(J.get(e)??X));for(let e of Y)e()};return{...t,update:n}}function ge(e,t,n){return e.file!==t||e.file.path!==n.path||e.pending||e.fresh||e.file.digest===n.digest&&e.file.protected===n.protected&&e.file.readOnly===n.readOnly?{tab:e}:e.draft===(e.file.content??``)?{tab:{...e,file:n,draft:n.content??``}}:{tab:e,conflict:n}}function _e(e,t,n){let{update:r}=he(e),i=(0,R.useRef)({update:r,conflict:n});i.current={update:r,conflict:n},(0,R.useEffect)(()=>{let n=new AbortController,r=new Map,a=!1,o=!1,s,c=async()=>{if(!(n.signal.aborted||t.current)){if(a){o=!0;return}a=!0;try{for(let a of Q(e).tabs)if(!(a.fresh||a.pending||t.current))try{let o=await L(e,a.file.path,n.signal);if(n.signal.aborted||t.current)return;let s;if(i.current.update(e=>({...e,tabs:e.tabs.map(t=>{if(t.file.path!==a.file.path)return t;let n=ge(t,a.file,o);return n.conflict&&e.active===t.file.path&&(s=n.conflict),n.tab})})),s){let e=`${s.digest}:${s.protected}:${s.readOnly}`;r.get(s.path)!==e&&(r.set(s.path,e),i.current.conflict(s))}}catch{}}finally{a=!1,o&&!n.signal.aborted&&(o=!1,l())}}},l=()=>{s||=setTimeout(()=>{s=void 0,c()},100)},u=t=>{t.detail?.sessionRef===e&&l()};window.addEventListener(`piagent-workspace-changed`,u),window.addEventListener(`piagent-workspace-saved`,u);let d=setInterval(l,5e3);return l(),()=>{n.abort(),clearTimeout(s),clearInterval(d),window.removeEventListener(`piagent-workspace-changed`,u),window.removeEventListener(`piagent-workspace-saved`,u)}},[e,t])}var ve=e=>`/api/v1/sessions/${encodeURIComponent(e)}/workspace/write`;function $(e){return Array.isArray(e)?`[${e.map($).join(`,`)}]`:e&&typeof e==`object`?`{${Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${JSON.stringify(e)}:${$(t)}`).join(`,`)}}`:JSON.stringify(e)}async function ye(e,t){let n=await fetch(ve(e),{credentials:`same-origin`,signal:t,headers:{Accept:`application/json`}});if(n.status===401&&_(),!n.ok)throw Error(`workspace-write-unavailable`);return await n.json()}async function be(e,t){let n=Date.now(),r=`workspace.write`,i=e.identity,a=e.revisions,o=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode($({action:r,identity:i,expectedRevisions:a,payload:t})));return{schemaVersion:1,version:`piagent-webui-workspace-write-v1`,messageType:`command`,action:r,identity:i,expectedRevisions:a,payload:t,commandId:crypto.randomUUID(),idempotencyKey:crypto.randomUUID(),requestedAt:new Date(n).toISOString(),expiresAt:new Date(n+6e4).toISOString(),actionDigest:`sha256:${[...new Uint8Array(o)].map(e=>e.toString(16).padStart(2,`0`)).join(``)}`}}async function xe(e,t){let n=g();if(!n)throw Error(`workspace-write-unavailable`);let r=await h(ve(e),{method:`POST`,credentials:`same-origin`,headers:{Accept:`application/json`,"Content-Type":`application/json`,"X-Piagent-CSRF":n},body:JSON.stringify(t)});if(r.status===401&&_(),!r.ok)throw Error(`workspace-write-unavailable`);let i=await r.json(),a=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(t.idempotencyKey)),o=`sha256:${[...new Uint8Array(a)].map(e=>e.toString(16).padStart(2,`0`)).join(``)}`;if(i.schemaVersion!==1||i.version!==t.version||i.messageType!==`receipt`||i.path!==t.payload.path||i.commandId!==t.commandId||i.action!==t.action||i.actionDigest!==t.actionDigest||i.idempotencyKeyDigest!==o||$(i.identity)!==$(t.identity)||![`settled`,`rejected`,`uncertain`].includes(i.phase)||i.phase===`settled`&&(i.resultCode!==`saved`||!/^[a-f0-9]{64}$/.test(i.digest??``)))throw Error(`workspace-write-receipt-invalid`);return i}function Se(e){let{locale:t}=u(),n=he(e),[r,i]=(0,R.useState)(),[a,o]=(0,R.useState)(!1),s=(0,R.useRef)(!1),[c,d]=(0,R.useState)(),[f,p]=(0,R.useState)();_e(e,s,p),(0,R.useEffect)(()=>{let t=new AbortController,n=!1,r=()=>{n||(n=!0,ye(e,t.signal).then(i).catch(()=>{t.signal.aborted||i(void 0)}).finally(()=>{n=!1}))};r();let a=window.setInterval(r,5e3);return()=>{t.abort(),clearInterval(a)}},[e]);let m=(e,t=1,r=!1)=>n.update(n=>({active:e.path,tabs:[...n.tabs.filter(t=>t.file.path!==e.path),{file:e,line:t,fresh:r,draft:e.content??``}]})),h=(e,t)=>n.update(n=>({...n,active:e,tabs:n.tabs.map(n=>n.file.path===e&&t!==void 0?{...n,line:t}:n)})),g=(e,t)=>n.update(n=>({...n,tabs:n.tabs.map(n=>n.file.path===e?{...n,draft:t}:n)})),_=r=>{let i=Q(e).tabs.find(e=>e.file.path===r);i&&(Z(i)||i.pending)&&!window.confirm(l(t,`Bỏ thay đổi chưa lưu và đóng tệp?`,`Discard unsaved changes and close this file?`))||n.update(e=>({tabs:e.tabs.filter(e=>e.file.path!==r),active:e.active===r?e.tabs.find(e=>e.file.path!==r)?.file.path:e.active}))},v=async n=>{try{m(await L(e,n)),p(void 0),d(void 0)}catch{d(l(t,`Chưa tải lại được tệp. Bản sửa của bạn vẫn được giữ.`,`Could not reload the file. Your draft is preserved.`))}},y=async(r,a)=>{let c=Q(e).tabs.find(e=>e.file.path===r);if(!(!c||s.current||!Z(c)&&!c.pending||c.file.protected||c.file.readOnly)&&!(a&&!window.confirm(l(t,`Ghi đè phiên bản trên đĩa bằng bản sửa của bạn?`,`Replace the version on disk with your draft?`)))){s.current=!0,o(!0),d(void 0);try{let o=await ye(e);if(i(o),!o.writable)throw Error(`read-only`);let s=a?.digest??(c.fresh?`absent`:c.file.digest);if(!s)throw Error(`unavailable`);let u=c.pending??await be(o,{path:r,content:c.draft,expectedDigest:s});n.update(e=>({...e,tabs:e.tabs.map(e=>e.file.path===r?{...e,pending:u}:e)}));let f=await xe(e,u);if(f.phase===`uncertain`){d(l(t,`Chưa xác định được kết quả lưu. Tải lại để kiểm tra trước khi lưu tiếp.`,`The save result is uncertain. Reload to check before saving again.`));return}n.update(e=>({...e,tabs:e.tabs.map(e=>e.file.path===r?{...e,pending:void 0}:e)})),f.phase===`settled`&&f.resultCode===`saved`?(n.update(e=>({...e,tabs:e.tabs.map(e=>e.file.path===r?{...e,fresh:!1,file:{...e.file,content:u.payload.content,digest:f.digest,revision:f.observedRevisionsAfter.workspaceRevision}}:e)})),p(void 0),window.dispatchEvent(new CustomEvent(`piagent-workspace-saved`,{detail:{sessionRef:e,path:r}}))):f.resultCode===`stale-content`||f.resultCode===`stale-revision`?p(await L(e,r)):d(l(t,`Chưa lưu được tệp. Kiểm tra quyền ghi và thử lại.`,`Could not save the file. Check write access and try again.`))}catch{d(l(t,`Chưa lưu được tệp. Bản sửa vẫn được giữ; thử lưu lại hoặc tải lại để kiểm tra.`,`Could not confirm the save. Your draft is preserved; retry the save or reload to check.`))}finally{s.current=!1,o(!1)}}},b=async(r,a)=>{let c=Q(e).tabs.find(e=>e.file.path===r);if(s.current||c&&(Z(c)||c.pending))return d(l(t,`Lưu hoặc bỏ thay đổi trước khi đổi tên hay xóa tệp.`,`Save or discard your changes before renaming or deleting the file.`)),!1;s.current=!0,o(!0),d(void 0);try{let o=await ye(e);i(o);let s=c?.file.digest??(await L(e,r)).digest;if(!o.writable||!s)throw Error(`unavailable`);let u=await xe(e,await be(o,a?{path:r,content:``,expectedDigest:s,operation:`rename`,destination:a}:{path:r,content:``,expectedDigest:s,operation:`delete`}));return u.phase===`settled`&&u.resultCode===`saved`?(n.update(e=>({tabs:e.tabs.filter(e=>e.file.path!==r),active:e.active===r?void 0:e.active})),a&&m(await L(e,a)),window.dispatchEvent(new CustomEvent(`piagent-workspace-saved`,{detail:{sessionRef:e,path:r}})),!0):(d(u.phase===`uncertain`?l(t,`Chưa xác định được kết quả. Tải lại danh sách tệp để kiểm tra.`,`The result is uncertain. Reload the file list to check.`):u.resultCode===`stale-content`?l(t,`Tệp đã thay đổi trên đĩa hoặc tên mới đã có. Tải lại rồi thử lại.`,`The file changed on disk or the new name exists. Reload and try again.`):l(t,`Không thực hiện được. Kiểm tra quyền ghi và tên tệp.`,`This could not be done. Check write access and the file name.`)),!1)}catch{return d(l(t,`Chưa xác nhận được thao tác. Tải lại danh sách tệp để kiểm tra.`,`Could not confirm the action. Reload the file list to check.`)),!1}finally{s.current=!1,o(!1)}};return{...n,authority:r,saving:a,message:c,conflict:f,setConflict:p,load:m,select:h,change:g,close:_,reload:v,save:y,move:b}}var Ce=e(i(),1);function we({sessionRef:e,onOpen:t}){let{locale:n}=u(),[i,a]=(0,R.useState)(``),[o,s]=(0,R.useState)(),[d,h]=(0,R.useState)(!1),[g,_]=(0,R.useState)(!1);return(0,R.useEffect)(()=>{let t=new AbortController;if(s(void 0),_(!1),h(!1),!i.trim())return()=>t.abort();h(!0);let n=setTimeout(()=>{I(e,i,t.signal).then(e=>{t.signal.aborted||s(e)}).catch(()=>{t.signal.aborted||_(!0)}).finally(()=>{t.signal.aborted||h(!1)})},250);return()=>{clearTimeout(n),t.abort()}},[i,e]),(0,z.jsxs)(F,{spacing:1,sx:{p:1},children:[(0,z.jsx)(r,{size:`small`,label:l(n,`Tìm nội dung`,`Search contents`),value:i,onChange:e=>a(e.target.value),slotProps:{htmlInput:{maxLength:512}}}),d&&(0,z.jsx)(c,{size:18}),(g||o?.available===!1)&&(0,z.jsx)(f,{severity:`warning`,children:l(n,`Chưa tìm được nội dung trong project này.`,`Content search is unavailable for this project.`)}),o?.available&&o.backend===`fts`&&(0,z.jsx)(p,{variant:`caption`,children:l(n,`Tìm trong các tệp đã lập chỉ mục.`,`Searching indexed files.`)}),o?.matches.map(e=>(0,z.jsxs)(m,{onClick:()=>t(e.path,e.line),sx:{textTransform:`none`,display:`block`,textAlign:`left`,overflowWrap:`anywhere`},children:[(0,z.jsxs)(p,{variant:`caption`,component:`span`,children:[e.path,`:`,e.line,`:`,e.column]}),(0,z.jsx)(p,{variant:`body2`,component:`span`,sx:{display:`block`},children:e.preview})]},`${e.path}:${e.line}:${e.column}`)),o?.truncated&&(0,z.jsx)(p,{variant:`caption`,children:l(n,`Đã giới hạn kết quả. Hãy tìm cụ thể hơn.`,`Results were limited. Refine your search.`)}),o?.available&&!o.matches.length&&!o.truncated&&(0,z.jsx)(p,{variant:`caption`,children:l(n,`Không tìm thấy.`,`No matches.`)})]})}var Te=(0,R.lazy)(()=>T(()=>import(`./WorkspaceCodeEditor-BCiYM9NA.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11])));function Ee({sessionRef:e,target:t,navigationHost:n,sidebarMode:i,onHide:h,fill:g}){let{locale:_}=u(),[y,x]=(0,R.useState)(`files`),[S,C]=(0,R.useState)(!1),[w,ee]=(0,R.useState)(``),[T,E]=(0,R.useState)(!1),[D,O]=(0,R.useState)(),[k,A]=(0,R.useState)(``),j=Se(e),{tabs:M,active:I}=j,[B,se]=(0,R.useState)(``),[ce,le]=(0,R.useState)(),[ue,V]=(0,R.useState)(!1),[H,U]=(0,R.useState)(!1),W=(0,R.useRef)(null),[de,fe]=(0,R.useState)(0);(0,R.useEffect)(()=>{let t=t=>{t.detail?.sessionRef===e&&fe(e=>e+1)};return window.addEventListener(`piagent-workspace-saved`,t),()=>window.removeEventListener(`piagent-workspace-saved`,t)},[e]),(0,R.useEffect)(()=>{let t=new AbortController;return le(void 0),V(!1),ie(e,B,t.signal).then(e=>{t.signal.aborted||le(e)}).catch(()=>{t.signal.aborted||V(!0)}),()=>t.abort()},[e,B,de]),(0,R.useEffect)(()=>()=>W.current?.abort(),[]);let pe=async(t,n=1)=>{if(W.current?.abort(),U(!1),M.find(e=>e.file.path===t)){j.select(t,n);return}W.current?.abort();let r=new AbortController;W.current=r,U(!0),V(!1);try{let i=await L(e,t,r.signal);if(r.signal.aborted)return;if(i.protected){V(!0);return}j.load(i,n)}catch{r.signal.aborted||V(!0)}finally{r.signal.aborted||U(!1)}};(0,R.useEffect)(()=>{t&&pe(t.path,t.line??1)},[t]),(0,R.useEffect)(()=>{i&&i!==`sessions`&&x(i)},[i]);let G=M.find(e=>e.file.path===I),K=G?.file,q=me(e,M,I),J=oe(e,K?.path,K?.digest??null,!!G&&!Z(G),q.diff),Y=ae(e,K?.path,G?.draft??``,q.hunks),X=M.find(e=>e.file.path===j.conflict?.path),Q=(0,z.jsxs)(P,{component:`nav`,"aria-label":l(_,`Tệp dự án`,`Project files`),sx:{width:n?`100%`:180,flexShrink:0,overflow:`auto`,borderRight:1,borderColor:`divider`},children:[!n&&(0,z.jsxs)(v,{value:y,onChange:(e,t)=>x(t),"aria-label":l(_,`Khám phá project`,`Explore project`),children:[(0,z.jsx)(N,{value:`files`,label:l(_,`Tệp`,`Files`)}),(0,z.jsx)(N,{value:`search`,label:l(_,`Tìm kiếm`,`Search`)})]}),y===`search`?(0,z.jsx)(we,{sessionRef:e,onOpen:(e,t)=>void pe(e,t)}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(m,{disabled:!j.authority?.writable,onClick:()=>{ee(B?`${B}/`:``),C(!0)},children:l(_,`Tệp mới`,`New file`)}),B&&(0,z.jsx)(m,{onClick:()=>se(B.split(`/`).slice(0,-1).join(`/`)),children:l(_,`Thư mục cha`,`Parent folder`)}),(0,z.jsx)(p,{variant:`caption`,sx:{p:1,overflowWrap:`anywhere`},children:B||`/`}),!ce&&!ue&&(0,z.jsx)(c,{size:18}),ce?.entries.map(e=>(0,z.jsxs)(m,{fullWidth:!0,disabled:e.protected||e.kind===`symlink`||e.kind===`other`,"aria-label":e.protected?`${e.name} (${l(_,`được bảo vệ`,`protected`)})`:e.name,onClick:()=>e.kind===`directory`?se(e.path):void pe(e.path),sx:{justifyContent:`flex-start`,textTransform:`none`,overflowWrap:`anywhere`},children:[e.kind===`directory`?`▸ `:``,e.name,e.protected?` 🔒`:``]},e.path)),ce?.truncated&&(0,z.jsx)(p,{variant:`caption`,children:l(_,`Danh sách đã được giới hạn.`,`Listing limit reached.`)})]})]});return(0,z.jsxs)(z.Fragment,{children:[J.dialog,Y.dialog,(0,z.jsxs)(F,{direction:`row`,sx:{height:g?`100%`:`calc(100vh - 150px)`,minHeight:g?160:320},children:[n?(0,Ce.createPortal)(Q,n):Q,(0,z.jsxs)(P,{sx:{minWidth:0,flex:1,display:`flex`,flexDirection:`column`},children:[ue&&(0,z.jsx)(f,{severity:`warning`,children:l(_,`Chưa đọc được tệp hoặc thư mục này.`,`This file or folder could not be read.`)}),Y.bar,j.message&&(0,z.jsx)(f,{severity:`warning`,children:j.message}),j.authority?.agentRunning&&(0,z.jsx)(f,{severity:`info`,children:l(_,`Agent đang chạy và có thể sửa tệp này.`,`The agent is running and may change this file.`)}),(0,z.jsxs)(F,{direction:`row`,sx:{alignItems:`center`,borderBottom:1,borderColor:`divider`,minHeight:36},children:[(0,z.jsx)(v,{value:I??!1,onChange:(e,t)=>j.select(t),variant:`scrollable`,scrollButtons:`auto`,"aria-label":l(_,`Các tệp đang mở`,`Open files`),sx:{flex:1,minWidth:0,minHeight:36},children:M.map(e=>(0,z.jsx)(N,{value:e.file.path,sx:{minHeight:36,py:0},"aria-label":`${e.file.path}${Z(e)?` ●`:``}${q.counts.get(e.file.path)?` (${q.counts.get(e.file.path)})`:``}`,label:re(`${e.file.path}${Z(e)?` ●`:``}${q.counts.get(e.file.path)?` (${q.counts.get(e.file.path)})`:``}`,l(_,`Đóng ${e.file.path}`,`Close ${e.file.path}`),()=>j.close(e.file.path))},e.file.path))}),h&&(0,z.jsx)(d,{size:`small`,"aria-label":l(_,`Ẩn khung tệp`,`Hide files panel`),title:l(_,`Ẩn khung tệp (tệp đang mở vẫn giữ)`,`Hide files panel (open files are kept)`),onClick:h,children:(0,z.jsx)(ne,{fontSize:`small`})})]}),H&&(0,z.jsx)(c,{size:20}),K&&(0,z.jsxs)(F,{direction:`row`,children:[J.hasPending&&(0,z.jsx)(m,{onClick:J.checkPending,children:l(_,`Kiểm tra hoàn tác`,`Check revert`)}),(0,z.jsx)(m,{size:`small`,disabled:!j.authority?.writable||K.readOnly||!G||!Z(G)&&!G.pending||j.saving,onClick:()=>void j.save(K.path),children:l(_,`Lưu`,`Save`)}),(0,z.jsx)(m,{size:`small`,onClick:()=>j.close(K.path),children:l(_,`Đóng tệp`,`Close file`)}),(0,z.jsx)(m,{size:`small`,disabled:!j.authority?.writable||K.readOnly||!K.digest||j.saving,onClick:()=>{A(K.path),O(K.path)},children:l(_,`Đổi tên`,`Rename`)}),(0,z.jsx)(m,{size:`small`,color:`error`,disabled:!j.authority?.writable||K.readOnly||!K.digest||j.saving,onClick:()=>{window.confirm(l(_,`Xóa ${K.path}? Có thể khôi phục bằng Git nếu tệp đã commit.`,`Delete ${K.path}? Git can restore it if it was committed.`))&&j.move(K.path)},children:l(_,`Xóa`,`Delete`)}),(0,z.jsx)(m,{size:`small`,onClick:()=>{(!G||!Z(G)||window.confirm(l(_,`Bỏ thay đổi chưa lưu và tải lại?`,`Discard unsaved changes and reload?`)))&&j.reload(K.path)},children:l(_,`Tải lại`,`Reload`)})]}),K?.binary||K?.oversized?(0,z.jsx)(f,{severity:`info`,children:l(_,`Tệp nhị phân hoặc quá lớn để hiển thị.`,`This file is binary or too large to display.`)}):K?.content!==null&&K?.content!==void 0?(0,z.jsx)(P,{sx:{flex:1,minHeight:0},children:(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(c,{size:20}),children:(0,z.jsx)(Te,{onComment:Y.open,hunks:q.hunks,onKeep:q.keep,onRevert:j.authority?.writable?e=>void J.request(e):void 0,content:G?.draft??K.content,path:K.path,line:G?.line??1,readOnly:!j.authority?.writable||K.readOnly,onChange:e=>j.change(K.path,e),onSave:()=>void j.save(K.path)})})}):(0,z.jsx)(p,{sx:{p:2},children:l(_,`Chọn một tệp để mở.`,`Select a file to open.`)})]})]}),(0,z.jsxs)(o,{open:S,onClose:()=>C(!1),fullWidth:!0,children:[(0,z.jsx)(s,{children:l(_,`Tạo tệp mới`,`Create a new file`)}),(0,z.jsx)(a,{children:(0,z.jsx)(r,{autoFocus:!0,fullWidth:!0,label:l(_,`Đường dẫn trong project`,`Path in project`),value:w,onChange:e=>ee(e.target.value)})}),(0,z.jsxs)(te,{children:[(0,z.jsx)(m,{onClick:()=>C(!1),children:l(_,`Hủy`,`Cancel`)}),(0,z.jsx)(m,{disabled:!b(w)||!j.authority?.writable,onClick:()=>{let e=b(w);!e||!j.authority||(M.some(t=>t.file.path===e.path)?j.select(e.path):j.load({schemaVersion:1,version:`piagent-webui-workspace-file-v1`,generatedAt:new Date().toISOString(),identity:j.authority.identity,path:e.path,language:`text`,protected:!1,readOnly:!1,binary:!1,oversized:!1,content:``,digest:null,revision:null},1,!0),C(!1))},children:l(_,`Tạo`,`Create`)})]})]}),(0,z.jsxs)(o,{open:!!D,onClose:()=>O(void 0),fullWidth:!0,children:[(0,z.jsx)(s,{children:l(_,`Đổi tên tệp`,`Rename file`)}),(0,z.jsx)(a,{children:(0,z.jsx)(r,{autoFocus:!0,fullWidth:!0,label:l(_,`Đường dẫn mới trong project`,`New path in project`),value:k,onChange:e=>A(e.target.value)})}),(0,z.jsxs)(te,{children:[(0,z.jsx)(m,{onClick:()=>O(void 0),children:l(_,`Hủy`,`Cancel`)}),(0,z.jsx)(m,{disabled:!b(k)||b(k)?.path===D||j.saving,onClick:()=>{let e=b(k);!e||!D||j.move(D,e.path).then(e=>{e&&O(void 0)})},children:l(_,`Đổi tên`,`Rename`)})]})]}),(0,z.jsxs)(o,{open:!!j.conflict,onClose:()=>{j.setConflict(void 0),E(!1)},fullWidth:!0,maxWidth:T?`lg`:`sm`,children:[(0,z.jsx)(s,{children:l(_,`Tệp đã thay đổi trên đĩa`,`The file changed on disk`)}),(0,z.jsxs)(a,{children:[(0,z.jsx)(p,{children:j.conflict?.path}),(0,z.jsx)(p,{children:l(_,`Bản sửa của bạn vẫn được giữ. Chọn cách xử lý xung đột.`,`Your draft is preserved. Choose how to resolve the conflict.`)}),T&&j.conflict&&X&&(0,z.jsxs)(F,{direction:`row`,spacing:1,children:[(0,z.jsxs)(P,{sx:{width:`50%`,height:360},children:[(0,z.jsx)(p,{children:l(_,`Trên đĩa`,`On disk`)}),(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(c,{size:20}),children:(0,z.jsx)(Te,{path:j.conflict.path,content:j.conflict.content??``})})]}),(0,z.jsxs)(P,{sx:{width:`50%`,height:360},children:[(0,z.jsx)(p,{children:l(_,`Bản sửa của bạn`,`Your draft`)}),(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(c,{size:20}),children:(0,z.jsx)(Te,{path:X.file.path,content:X.draft})})]})]})]}),(0,z.jsxs)(te,{children:[(0,z.jsx)(m,{onClick:()=>{j.setConflict(void 0),E(!1)},children:l(_,`Để sau`,`Later`)}),(0,z.jsx)(m,{onClick:()=>{j.conflict&&(j.load(j.conflict),j.setConflict(void 0),E(!1))},children:l(_,`Tải lại`,`Reload`)}),(0,z.jsx)(m,{onClick:()=>E(!0),children:l(_,`Xem khác biệt`,`Compare`)}),(0,z.jsx)(m,{disabled:j.saving||!j.conflict?.digest||j.conflict.protected||j.conflict.readOnly,onClick:()=>{j.conflict&&j.save(j.conflict.path,j.conflict)},children:l(_,`Ghi đè`,`Overwrite`)})]})]})]})}export{Ee as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{U as t,b as n}from"./useTheme-_ESOj7MI.js";import{i as r,m as i,n as a,r as o,t as s}from"./DialogTitle-CL-fzCnT.js";import{n as c,r as l}from"./ui-preferences-DiddStu0.js";import{t as u}from"./Alert-DXF8-XqE.js";import{S as d}from"./index-BW8-BUMx.js";import{n as f}from"./workspace-api-O7auv_td.js";var p=e(t(),1),m=n();function h({sessionRef:e,onClose:t,onOpen:n}){let{locale:h}=l(),[g,_]=(0,p.useState)(``),[v,y]=(0,p.useState)([]),[b,x]=(0,p.useState)(0),[S,C]=(0,p.useState)(!1);return(0,p.useEffect)(()=>{let t=new AbortController;C(!1),y([]),x(0);let n=setTimeout(()=>{f(e,g,t.signal).then(e=>{t.signal.aborted||y(e.suggestions.filter(e=>e.kind===`file`).map(e=>e.value))}).catch(()=>{t.signal.aborted||C(!0)})},120);return()=>{clearTimeout(n),t.abort()}},[e,g]),(0,m.jsxs)(o,{open:!0,onClose:t,fullWidth:!0,maxWidth:`sm`,children:[(0,m.jsx)(s,{children:c(h,`Mở nhanh`,`Quick open`)}),(0,m.jsxs)(a,{children:[(0,m.jsx)(r,{autoFocus:!0,fullWidth:!0,value:g,label:c(h,`Tên tệp`,`File name`),onChange:e=>_(e.target.value),onKeyDown:e=>{e.key===`ArrowDown`&&(e.preventDefault(),x(e=>Math.min(v.length-1,e+1))),e.key===`ArrowUp`&&(e.preventDefault(),x(e=>Math.max(0,e-1))),e.key===`Enter`&&v[b]&&(e.preventDefault(),n(v[b]))}}),S&&(0,m.jsx)(u,{severity:`warning`,children:c(h,`Chưa tìm được tệp.`,`Files could not be searched.`)}),(0,m.jsx)(i,{"aria-label":c(h,`Tệp tìm thấy`,`Matching files`),children:v.map((e,t)=>(0,m.jsx)(d,{selected:t===b,onClick:()=>n(e),children:e},e))})]})]})}export{h as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=null,t=null;async function n(t){if(!t.ok)return!1;try{let n=await t.json();return typeof n.csrfToken!=`string`||!/^[A-Za-z0-9_-]{43}$/.test(n.csrfToken)?!1:(e=n.csrfToken,!0)}catch{return!1}}function r(){return e}async function i(t,r){let i=await fetch(t,r);if(i.status!==403)return i;let a=r.headers[`X-Piagent-CSRF`];try{await n(await fetch(`/api/v1/browser-session`,{credentials:`same-origin`,headers:{Accept:`application/json`},signal:r.signal}))}catch{return i}return!e||e===a?i:fetch(t,{...r,headers:{...r.headers,"X-Piagent-CSRF":e}})}var a=null;function o(){return a}async function s(){let e=new URLSearchParams(window.location.hash.slice(1)),t=e.get(`bootstrap`),r=e.get(`project`);if(r&&/^[A-Za-z0-9_-]{1,120}$/.test(r)&&(a=r),!t){r&&window.history.replaceState(null,``,`${window.location.pathname}${window.location.search}`);try{return await n(await fetch(`/api/v1/browser-session`,{credentials:`same-origin`,headers:{Accept:`application/json`}}))?`existing-session`:`failed`}catch{return`failed`}}window.history.replaceState(null,``,`${window.location.pathname}${window.location.search}`);try{return await n(await fetch(`/api/v1/bootstrap`,{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/json`},body:JSON.stringify({capability:t})}))?`authenticated`:`failed`}catch{return`failed`}}function c(){return t??=s(),t}var l=!1,u=null,d=new Set;function f(){return l}function p(e){return d.add(e),()=>{d.delete(e)}}function m(){l||u||(u=(async()=>{try{await c();let e=await fetch(`/api/v1/browser-session`,{credentials:`same-origin`,headers:{Accept:`application/json`}});if(e.status!==401){await n(e);return}l=!0;for(let e of d)e()}catch{}finally{u=null}})())}export{o as a,i,r as n,m as o,f as r,p as s,c as t};
|