@geminixiang/mikan 1.0.0-beta.39 → 1.0.0-beta.40
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 +21 -0
- package/README.md +50 -23
- package/dist/adapter.d.ts +1 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/adapters/discord/bot.d.ts +2 -1
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +3 -3
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/context.d.ts +2 -1
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +1 -1
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +2 -1
- package/dist/adapters/github/bot.d.ts.map +1 -1
- package/dist/adapters/github/bot.js +11 -7
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/client.js +2 -2
- package/dist/adapters/github/client.js.map +1 -1
- package/dist/adapters/github/context.d.ts +4 -2
- package/dist/adapters/github/context.d.ts.map +1 -1
- package/dist/adapters/github/context.js +2 -2
- package/dist/adapters/github/context.js.map +1 -1
- package/dist/adapters/github/gcp-auth.js +2 -2
- package/dist/adapters/github/gcp-auth.js.map +1 -1
- package/dist/adapters/github/github-ops.d.ts +3 -2
- package/dist/adapters/github/github-ops.d.ts.map +1 -1
- package/dist/adapters/github/github-ops.js +1 -1
- package/dist/adapters/github/github-ops.js.map +1 -1
- package/dist/adapters/github/ids.d.ts.map +1 -1
- package/dist/adapters/github/ids.js +7 -3
- package/dist/adapters/github/ids.js.map +1 -1
- package/dist/adapters/github/repo.js +3 -3
- package/dist/adapters/github/repo.js.map +1 -1
- package/dist/adapters/github/types.d.ts +2 -1
- package/dist/adapters/github/types.d.ts.map +1 -1
- package/dist/adapters/github/types.js.map +1 -1
- package/dist/adapters/progressive-renderer.js +1 -1
- package/dist/adapters/progressive-renderer.js.map +1 -1
- package/dist/adapters/shared.js +4 -4
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +3 -1
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +12 -2
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +70 -9
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/context.d.ts +2 -1
- package/dist/adapters/slack/context.d.ts.map +1 -1
- package/dist/adapters/slack/context.js +1 -0
- package/dist/adapters/slack/context.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +4 -4
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/session.d.ts.map +1 -1
- package/dist/adapters/slack/session.js +2 -3
- package/dist/adapters/slack/session.js.map +1 -1
- package/dist/adapters/slack/tools/attach.js +1 -1
- package/dist/adapters/slack/tools/attach.js.map +1 -1
- package/dist/adapters/telegram/bot.d.ts +2 -1
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +6 -6
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts +2 -1
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/telegram/html.d.ts.map +1 -1
- package/dist/adapters/telegram/html.js +10 -7
- package/dist/adapters/telegram/html.js.map +1 -1
- package/dist/adapters/types.d.ts +4 -2
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/agent-events.d.ts +3 -2
- package/dist/agent-events.d.ts.map +1 -1
- package/dist/agent-events.js +19 -1
- package/dist/agent-events.js.map +1 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +34 -9
- package/dist/agent.js.map +1 -1
- package/dist/cli/arg-grammar.d.ts.map +1 -1
- package/dist/cli/arg-grammar.js +5 -3
- package/dist/cli/arg-grammar.js.map +1 -1
- package/dist/cli/boot.d.ts.map +1 -1
- package/dist/cli/boot.js +5 -3
- package/dist/cli/boot.js.map +1 -1
- package/dist/cli/download.d.ts.map +1 -1
- package/dist/cli/download.js +2 -0
- package/dist/cli/download.js.map +1 -1
- package/dist/cli/ext-dev.d.ts.map +1 -1
- package/dist/cli/ext-dev.js +4 -1
- package/dist/cli/ext-dev.js.map +1 -1
- package/dist/cli/ext.d.ts.map +1 -1
- package/dist/cli/ext.js +123 -23
- package/dist/cli/ext.js.map +1 -1
- package/dist/cli/office.d.ts.map +1 -1
- package/dist/cli/office.js +2 -0
- package/dist/cli/office.js.map +1 -1
- package/dist/cli/types.d.ts +0 -6
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/commands/admin.js +1 -1
- package/dist/commands/admin.js.map +1 -1
- package/dist/commands/auto-reply.js +2 -2
- package/dist/commands/auto-reply.js.map +1 -1
- package/dist/commands/extensions.js +1 -1
- package/dist/commands/extensions.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/manifest.d.ts +7 -0
- package/dist/commands/manifest.d.ts.map +1 -1
- package/dist/commands/manifest.js +28 -0
- package/dist/commands/manifest.js.map +1 -1
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +4 -1
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/new.js +1 -1
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/sandbox.js +3 -3
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/commands/session-view.d.ts.map +1 -1
- package/dist/commands/session-view.js +5 -2
- package/dist/commands/session-view.js.map +1 -1
- package/dist/commands/types.d.ts +1 -1
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/config.js +4 -4
- package/dist/config.js.map +1 -1
- package/dist/env-manifest.d.ts +2 -0
- package/dist/env-manifest.d.ts.map +1 -1
- package/dist/env-manifest.js +11 -1
- package/dist/env-manifest.js.map +1 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +7 -6
- package/dist/events.js.map +1 -1
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +3 -2
- package/dist/execution-resolver.js.map +1 -1
- package/dist/extension-schedules.d.ts +31 -0
- package/dist/extension-schedules.d.ts.map +1 -0
- package/dist/extension-schedules.js +229 -0
- package/dist/extension-schedules.js.map +1 -0
- package/dist/harness/auth.js +5 -5
- package/dist/harness/auth.js.map +1 -1
- package/dist/harness/event-format.d.ts +2 -0
- package/dist/harness/event-format.d.ts.map +1 -1
- package/dist/harness/event-format.js +2 -1
- package/dist/harness/event-format.js.map +1 -1
- package/dist/harness/extensions/loader.d.ts +2 -2
- package/dist/harness/extensions/loader.d.ts.map +1 -1
- package/dist/harness/extensions/loader.js +135 -33
- package/dist/harness/extensions/loader.js.map +1 -1
- package/dist/harness/extensions/registry.d.ts +33 -1
- package/dist/harness/extensions/registry.d.ts.map +1 -1
- package/dist/harness/extensions/registry.js +79 -2
- package/dist/harness/extensions/registry.js.map +1 -1
- package/dist/harness/extensions/types.d.ts +165 -21
- package/dist/harness/extensions/types.d.ts.map +1 -1
- package/dist/harness/extensions/types.js.map +1 -1
- package/dist/harness/index.d.ts +2 -2
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +1 -1
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +36 -24
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/runner.js +2 -2
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session-store.d.ts.map +1 -1
- package/dist/harness/session-store.js +9 -7
- package/dist/harness/session-store.js.map +1 -1
- package/dist/harness/skills.js +3 -3
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/subagent-profiles.js +2 -2
- package/dist/harness/subagent-profiles.js.map +1 -1
- package/dist/harness/subagent-runner.js +3 -3
- package/dist/harness/subagent-runner.js.map +1 -1
- package/dist/index.d.ts +8 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/main.js +58 -9
- package/dist/main.js.map +1 -1
- package/dist/observability/instrument.js +1 -1
- package/dist/observability/instrument.js.map +1 -1
- package/dist/observability/sentry.js +1 -1
- package/dist/observability/sentry.js.map +1 -1
- package/dist/office/index.d.ts +1 -1
- package/dist/office/index.d.ts.map +1 -1
- package/dist/office/index.js +1 -1
- package/dist/office/index.js.map +1 -1
- package/dist/office/layout.d.ts +7 -0
- package/dist/office/layout.d.ts.map +1 -1
- package/dist/office/layout.js +10 -1
- package/dist/office/layout.js.map +1 -1
- package/dist/office/registry.d.ts.map +1 -1
- package/dist/office/registry.js +7 -5
- package/dist/office/registry.js.map +1 -1
- package/dist/packages/materialize.js +10 -3
- package/dist/packages/materialize.js.map +1 -1
- package/dist/packages/source.d.ts +6 -0
- package/dist/packages/source.d.ts.map +1 -1
- package/dist/packages/source.js +14 -2
- package/dist/packages/source.js.map +1 -1
- package/dist/packages/types.d.ts +5 -3
- package/dist/packages/types.d.ts.map +1 -1
- package/dist/packages/types.js.map +1 -1
- package/dist/provisioner.js +5 -5
- package/dist/provisioner.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +44 -2
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/types.d.ts +10 -2
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.js +1 -1
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.js +1 -2
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/firecracker.js +1 -1
- package/dist/sandbox/firecracker.js.map +1 -1
- package/dist/sandbox/gondolin.d.ts.map +1 -1
- package/dist/sandbox/gondolin.js +1 -2
- package/dist/sandbox/gondolin.js.map +1 -1
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +4 -5
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/index.js +1 -1
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/utils.d.ts +2 -0
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +30 -1
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts.map +1 -1
- package/dist/sessions/chat-history-sync.js +9 -8
- package/dist/sessions/chat-history-sync.js.map +1 -1
- package/dist/sessions/conversation-log.d.ts.map +1 -1
- package/dist/sessions/conversation-log.js +5 -2
- package/dist/sessions/conversation-log.js.map +1 -1
- package/dist/sessions/history-line.d.ts +9 -0
- package/dist/sessions/history-line.d.ts.map +1 -1
- package/dist/sessions/history-line.js +22 -1
- package/dist/sessions/history-line.js.map +1 -1
- package/dist/sessions/session-key.d.ts +5 -12
- package/dist/sessions/session-key.d.ts.map +1 -1
- package/dist/sessions/session-key.js +23 -0
- package/dist/sessions/session-key.js.map +1 -1
- package/dist/sessions/store.d.ts +2 -6
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +16 -16
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +2 -1
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/tools/bash.js +1 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +4 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/event.js +1 -1
- package/dist/tools/event.js.map +1 -1
- package/dist/tools/generate-image.js +3 -3
- package/dist/tools/generate-image.js.map +1 -1
- package/dist/tools/read.js +4 -4
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +9 -2
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/types.d.ts +0 -26
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/trigger.d.ts +2 -1
- package/dist/trigger.d.ts.map +1 -1
- package/dist/trigger.js.map +1 -1
- package/dist/types.d.ts +108 -16
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/file-guards.d.ts +9 -0
- package/dist/utils/file-guards.d.ts.map +1 -1
- package/dist/utils/file-guards.js +44 -1
- package/dist/utils/file-guards.js.map +1 -1
- package/dist/vault/disabled.d.ts.map +1 -1
- package/dist/vault/disabled.js +3 -0
- package/dist/vault/disabled.js.map +1 -1
- package/dist/vault/index.d.ts +29 -0
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +68 -4
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/types.d.ts +2 -0
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/types.js.map +1 -1
- package/dist/web/admin/portal.d.ts +1 -1
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +194 -22
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/provider-models.js +1 -1
- package/dist/web/admin/provider-models.js.map +1 -1
- package/dist/web/login/oauth.js +1 -1
- package/dist/web/login/oauth.js.map +1 -1
- package/dist/web/login/portal.d.ts +1 -1
- package/dist/web/login/portal.d.ts.map +1 -1
- package/dist/web/login/portal.js +13 -36
- package/dist/web/login/portal.js.map +1 -1
- package/dist/web/portal-shell.d.ts +17 -0
- package/dist/web/portal-shell.d.ts.map +1 -1
- package/dist/web/portal-shell.js +66 -1
- package/dist/web/portal-shell.js.map +1 -1
- package/dist/web/server.d.ts +3 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +3 -3
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-view/portal.d.ts +1 -1
- package/dist/web/session-view/portal.d.ts.map +1 -1
- package/dist/web/session-view/portal.js +10 -12
- package/dist/web/session-view/portal.js.map +1 -1
- package/dist/web/session-view/service.d.ts.map +1 -1
- package/dist/web/session-view/service.js +11 -6
- package/dist/web/session-view/service.js.map +1 -1
- package/dist/web/session-view/types.d.ts +0 -4
- package/dist/web/session-view/types.d.ts.map +1 -1
- package/dist/web/session-view/types.js.map +1 -1
- package/dist/web/token-store.js +1 -1
- package/dist/web/token-store.js.map +1 -1
- package/package.json +8 -17
- package/dist/cli/ext-git.d.ts +0 -17
- package/dist/cli/ext-git.d.ts.map +0 -1
- package/dist/cli/ext-git.js +0 -107
- package/dist/cli/ext-git.js.map +0 -1
- package/dist/commands/parse.d.ts +0 -7
- package/dist/commands/parse.d.ts.map +0 -1
- package/dist/commands/parse.js +0 -14
- package/dist/commands/parse.js.map +0 -1
- package/dist/commands/text.d.ts +0 -2
- package/dist/commands/text.d.ts.map +0 -1
- package/dist/commands/text.js +0 -16
- package/dist/commands/text.js.map +0 -1
- package/dist/harness/extensions/blockkit.d.ts +0 -19
- package/dist/harness/extensions/blockkit.d.ts.map +0 -1
- package/dist/harness/extensions/blockkit.js +0 -42
- package/dist/harness/extensions/blockkit.js.map +0 -1
- package/dist/sandbox/path-context.d.ts +0 -3
- package/dist/sandbox/path-context.d.ts.map +0 -1
- package/dist/sandbox/path-context.js +0 -30
- package/dist/sandbox/path-context.js.map +0 -1
- package/dist/sessions/metadata.d.ts +0 -3
- package/dist/sessions/metadata.d.ts.map +0 -1
- package/dist/sessions/metadata.js +0 -11
- package/dist/sessions/metadata.js.map +0 -1
- package/dist/sessions/policy.d.ts +0 -6
- package/dist/sessions/policy.d.ts.map +0 -1
- package/dist/sessions/policy.js +0 -25
- package/dist/sessions/policy.js.map +0 -1
- package/dist/tools/truncate.d.ts +0 -33
- package/dist/tools/truncate.d.ts.map +0 -1
- package/dist/tools/truncate.js +0 -184
- package/dist/tools/truncate.js.map +0 -1
- package/dist/utils/date.d.ts +0 -10
- package/dist/utils/date.d.ts.map +0 -1
- package/dist/utils/date.js +0 -23
- package/dist/utils/date.js.map +0 -1
- package/dist/utils/env.d.ts +0 -3
- package/dist/utils/env.d.ts.map +0 -1
- package/dist/utils/env.js +0 -12
- package/dist/utils/env.js.map +0 -1
- package/dist/utils/fs-atomic.d.ts +0 -10
- package/dist/utils/fs-atomic.d.ts.map +0 -1
- package/dist/utils/fs-atomic.js +0 -45
- package/dist/utils/fs-atomic.js.map +0 -1
- package/dist/utils/html.d.ts +0 -2
- package/dist/utils/html.d.ts.map +0 -1
- package/dist/utils/html.js +0 -4
- package/dist/utils/html.js.map +0 -1
- package/dist/utils/http-body.d.ts +0 -10
- package/dist/utils/http-body.d.ts.map +0 -1
- package/dist/utils/http-body.js +0 -34
- package/dist/utils/http-body.js.map +0 -1
- package/dist/vault/injection.d.ts +0 -12
- package/dist/vault/injection.d.ts.map +0 -1
- package/dist/vault/injection.js +0 -30
- package/dist/vault/injection.js.map +0 -1
- package/dist/vault/policy.d.ts +0 -20
- package/dist/vault/policy.d.ts.map +0 -1
- package/dist/vault/policy.js +0 -20
- package/dist/vault/policy.js.map +0 -1
- package/dist/web/agent-events/portal.d.ts +0 -3
- package/dist/web/agent-events/portal.d.ts.map +0 -1
- package/dist/web/agent-events/portal.js +0 -19
- package/dist/web/agent-events/portal.js.map +0 -1
- package/dist/web/request.d.ts +0 -3
- package/dist/web/request.d.ts.map +0 -1
- package/dist/web/request.js +0 -13
- package/dist/web/request.js.map +0 -1
- package/dist/web/session-view/command.d.ts +0 -4
- package/dist/web/session-view/command.d.ts.map +0 -1
- package/dist/web/session-view/command.js +0 -10
- package/dist/web/session-view/command.js.map +0 -1
package/dist/web/admin/portal.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { existsSync, readdirSync, readFileSync, statSync } from "fs";
|
|
2
|
-
import { basename, join, resolve as pathResolve, sep as pathSep } from "path";
|
|
3
|
-
import { MikanModels, parseFrontmatter, SessionStore } from "../../harness/index.js";
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { basename, join, resolve as pathResolve, sep as pathSep } from "node:path";
|
|
3
|
+
import { defaultExtensionDirs, listInstalledExtensions, MikanModels, parseFrontmatter, SessionStore, } from "../../harness/index.js";
|
|
4
4
|
import { loadConversationAutoReplyConfig, loadConversationWorkspaceOverride, loadGlobalSettings, resolveConversationSettings, saveConversationAutoReplyConfig, } from "../../config.js";
|
|
5
5
|
import { applyConversationSettings, applyConversationWorkspacePolicy, applyGlobalSettings, applyGlobalWorkspacePolicy, } from "../../settings-mutation.js";
|
|
6
6
|
import { addPackage, inspectConversationPackages, refreshPackage, removePackage, } from "../../packages/index.js";
|
|
7
|
-
import { escapeHtml } from "
|
|
8
|
-
import { readRawBody } from "../../utils/http-body.js";
|
|
9
|
-
import { renderPortalShell } from "../portal-shell.js";
|
|
7
|
+
import { escapeHtml, readJsonBody, renderPortalShell } from "../portal-shell.js";
|
|
10
8
|
import { resolveExistingSessionFile } from "../session-view/service.js";
|
|
11
9
|
import { PRODUCT_NAME } from "../../platform-messages.js";
|
|
12
10
|
import { credentialAuthorizationKey } from "../../sandbox/identity.js";
|
|
@@ -95,6 +93,10 @@ async function routeApiRequest(req, res, url, services) {
|
|
|
95
93
|
await servePackagesList(res, url, services, token);
|
|
96
94
|
return;
|
|
97
95
|
}
|
|
96
|
+
if (url.pathname === "/admin/api/extension-secrets") {
|
|
97
|
+
serveExtensionSecretsList(res, url, services, token);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
98
100
|
if (url.pathname === "/admin/api/events") {
|
|
99
101
|
await serveEventsList(res, services);
|
|
100
102
|
return;
|
|
@@ -114,7 +116,7 @@ async function routeApiRequest(req, res, url, services) {
|
|
|
114
116
|
jsonRes(res, 405, { error: "Method not allowed" });
|
|
115
117
|
return;
|
|
116
118
|
}
|
|
117
|
-
const body = await readJsonBody(req, res);
|
|
119
|
+
const body = await readJsonBody(req, res, 32 * 1024);
|
|
118
120
|
if (!body)
|
|
119
121
|
return;
|
|
120
122
|
const rawToken = typeof body.token === "string" ? body.token : "";
|
|
@@ -155,6 +157,10 @@ async function routeApiRequest(req, res, url, services) {
|
|
|
155
157
|
servePackageMutation(res, body, services, token);
|
|
156
158
|
return;
|
|
157
159
|
}
|
|
160
|
+
if (url.pathname === "/admin/api/extension-secrets/mutate") {
|
|
161
|
+
serveExtensionSecretMutation(res, body, services);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
158
164
|
if (url.pathname === "/admin/api/settings/model") {
|
|
159
165
|
serveGlobalModelUpdate(res, body, services);
|
|
160
166
|
return;
|
|
@@ -854,9 +860,9 @@ function isWorkspacePathAllowed(rel) {
|
|
|
854
860
|
if (rel === "")
|
|
855
861
|
return true;
|
|
856
862
|
const segments = rel.split("/").filter(Boolean);
|
|
857
|
-
if (segments.length === 0)
|
|
858
|
-
return true;
|
|
859
863
|
const first = segments[0];
|
|
864
|
+
if (first === undefined)
|
|
865
|
+
return true;
|
|
860
866
|
if (segments.length === 1) {
|
|
861
867
|
return WORKSPACE_TOP_DIRS.has(first) || WORKSPACE_TOP_FILES.has(first);
|
|
862
868
|
}
|
|
@@ -981,7 +987,7 @@ function looksTextual(buf) {
|
|
|
981
987
|
const limit = Math.min(buf.length, BINARY_PROBE_BYTES);
|
|
982
988
|
for (let i = 0; i < limit; i++) {
|
|
983
989
|
const byte = buf[i];
|
|
984
|
-
if (byte === 0)
|
|
990
|
+
if (byte === undefined || byte === 0)
|
|
985
991
|
return false;
|
|
986
992
|
if (byte < 9)
|
|
987
993
|
return false;
|
|
@@ -1137,6 +1143,77 @@ async function servePackagesList(res, url, services, token) {
|
|
|
1137
1143
|
jsonRes(res, 500, { error: err instanceof Error ? err.message : String(err) });
|
|
1138
1144
|
}
|
|
1139
1145
|
}
|
|
1146
|
+
const EXTENSION_SLUG_PATTERN = /^[a-z0-9_-]{1,64}$/;
|
|
1147
|
+
const EXTENSION_SECRET_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
1148
|
+
/**
|
|
1149
|
+
* Declared + provisioned secrets for every extension visible to the selected
|
|
1150
|
+
* conversation (global scope plus the conversation's own installs, deduped by
|
|
1151
|
+
* slug — the vault is keyed by slug, so two scopes share one secret set).
|
|
1152
|
+
* Values never leave the server; only key names and provisioning status do.
|
|
1153
|
+
*/
|
|
1154
|
+
function serveExtensionSecretsList(res, url, services, token) {
|
|
1155
|
+
const scope = resolveConversationFromQuery(url, token);
|
|
1156
|
+
if (scope.error) {
|
|
1157
|
+
jsonRes(res, 403, { error: scope.error });
|
|
1158
|
+
return;
|
|
1159
|
+
}
|
|
1160
|
+
const workspace = requireAdminWorkspace(res, services);
|
|
1161
|
+
if (!workspace)
|
|
1162
|
+
return;
|
|
1163
|
+
const infosBySlug = new Map();
|
|
1164
|
+
for (const info of listInstalledExtensions(defaultExtensionDirs(scope.address, workspace.stateDir))) {
|
|
1165
|
+
infosBySlug.set(info.slug, info);
|
|
1166
|
+
}
|
|
1167
|
+
const extensions = [...infosBySlug.values()]
|
|
1168
|
+
.toSorted((left, right) => left.slug.localeCompare(right.slug))
|
|
1169
|
+
.map((info) => {
|
|
1170
|
+
const provisioned = Object.keys(services.vaultManager.resolve(`extensions/${info.slug}`)?.env ?? {}).toSorted();
|
|
1171
|
+
const declaredKeys = new Set(info.secrets.map((secret) => secret.key));
|
|
1172
|
+
return {
|
|
1173
|
+
slug: info.slug,
|
|
1174
|
+
name: info.name,
|
|
1175
|
+
declared: info.secrets.map((secret) => ({
|
|
1176
|
+
...secret,
|
|
1177
|
+
provisioned: provisioned.includes(secret.key),
|
|
1178
|
+
})),
|
|
1179
|
+
extraProvisioned: provisioned.filter((key) => !declaredKeys.has(key)),
|
|
1180
|
+
};
|
|
1181
|
+
});
|
|
1182
|
+
jsonRes(res, 200, { extensions });
|
|
1183
|
+
}
|
|
1184
|
+
/** Set or delete one extension secret. Values are write-only through here. */
|
|
1185
|
+
function serveExtensionSecretMutation(res, body, services) {
|
|
1186
|
+
const action = body.action;
|
|
1187
|
+
if (action !== "set" && action !== "delete") {
|
|
1188
|
+
jsonRes(res, 400, { error: "action must be 'set' or 'delete'" });
|
|
1189
|
+
return;
|
|
1190
|
+
}
|
|
1191
|
+
const slug = typeof body.slug === "string" ? body.slug : "";
|
|
1192
|
+
if (!EXTENSION_SLUG_PATTERN.test(slug)) {
|
|
1193
|
+
jsonRes(res, 400, { error: "invalid extension slug" });
|
|
1194
|
+
return;
|
|
1195
|
+
}
|
|
1196
|
+
const key = typeof body.key === "string" ? body.key : "";
|
|
1197
|
+
if (!EXTENSION_SECRET_KEY_PATTERN.test(key)) {
|
|
1198
|
+
jsonRes(res, 400, { error: "invalid secret key (expected an env-style name)" });
|
|
1199
|
+
return;
|
|
1200
|
+
}
|
|
1201
|
+
const vaultKey = `extensions/${slug}`;
|
|
1202
|
+
if (action === "set") {
|
|
1203
|
+
const value = typeof body.value === "string" ? body.value : "";
|
|
1204
|
+
if (!value) {
|
|
1205
|
+
jsonRes(res, 400, { error: "value is required" });
|
|
1206
|
+
return;
|
|
1207
|
+
}
|
|
1208
|
+
services.vaultManager.upsertEnv(vaultKey, { [key]: value });
|
|
1209
|
+
}
|
|
1210
|
+
else if (!services.vaultManager.deleteEnvKey(vaultKey, key)) {
|
|
1211
|
+
jsonRes(res, 404, { error: "Not provisioned." });
|
|
1212
|
+
return;
|
|
1213
|
+
}
|
|
1214
|
+
const provisioned = Object.keys(services.vaultManager.resolve(vaultKey)?.env ?? {}).toSorted();
|
|
1215
|
+
jsonRes(res, 200, { ok: true, provisioned });
|
|
1216
|
+
}
|
|
1140
1217
|
/**
|
|
1141
1218
|
* Add / remove / refresh, in one route because they share validation and all
|
|
1142
1219
|
* three answer with the freshly re-read inventory: the panel never has to
|
|
@@ -1363,18 +1440,6 @@ function jsonRes(res, status, body) {
|
|
|
1363
1440
|
});
|
|
1364
1441
|
res.end(JSON.stringify(body));
|
|
1365
1442
|
}
|
|
1366
|
-
async function readJsonBody(req, res) {
|
|
1367
|
-
const data = await readRawBody(req, res, 32 * 1024);
|
|
1368
|
-
if (data === null)
|
|
1369
|
-
return null;
|
|
1370
|
-
try {
|
|
1371
|
-
return JSON.parse(data);
|
|
1372
|
-
}
|
|
1373
|
-
catch {
|
|
1374
|
-
jsonRes(res, 400, { error: "Invalid JSON" });
|
|
1375
|
-
return null;
|
|
1376
|
-
}
|
|
1377
|
-
}
|
|
1378
1443
|
const esc = escapeHtml;
|
|
1379
1444
|
// ── HTML ───────────────────────────────────────────────────────────────────────
|
|
1380
1445
|
function renderAdminPage(token) {
|
|
@@ -1539,6 +1604,18 @@ function renderAdminPage(token) {
|
|
|
1539
1604
|
<div id="pkg-global-content"><div class="loading-msg">Loading…</div></div>
|
|
1540
1605
|
</section>
|
|
1541
1606
|
|
|
1607
|
+
<section class="card sect">
|
|
1608
|
+
<header class="sect-head">
|
|
1609
|
+
<div>
|
|
1610
|
+
<p class="eyebrow">Extension Secrets</p>
|
|
1611
|
+
<h2 class="card-title">Extension 密鑰(依 slug 全域共用)</h2>
|
|
1612
|
+
</div>
|
|
1613
|
+
<button class="refresh-btn" onclick="loadExtensionSecrets()">↻</button>
|
|
1614
|
+
</header>
|
|
1615
|
+
<div id="ext-secrets-msg" class="pkg-msg" style="display:none"></div>
|
|
1616
|
+
<div id="ext-secrets-content"><div class="loading-msg">Loading…</div></div>
|
|
1617
|
+
</section>
|
|
1618
|
+
|
|
1542
1619
|
<section class="card sect">
|
|
1543
1620
|
<header class="sect-head">
|
|
1544
1621
|
<div>
|
|
@@ -2012,6 +2089,94 @@ function renderAdminPage(token) {
|
|
|
2012
2089
|
void mutatePackage(btn.dataset.pkgScope, btn.dataset.pkgAction, btn.dataset.pkgSource);
|
|
2013
2090
|
});
|
|
2014
2091
|
|
|
2092
|
+
// ── Extension secrets ───────────────────────────────────────────────────────
|
|
2093
|
+
|
|
2094
|
+
function extSecretsMessage(text, kind) {
|
|
2095
|
+
const el = document.getElementById('ext-secrets-msg');
|
|
2096
|
+
if (!el) return;
|
|
2097
|
+
el.style.display = 'block';
|
|
2098
|
+
el.className = 'pkg-msg pkg-msg-' + kind;
|
|
2099
|
+
el.textContent = text;
|
|
2100
|
+
}
|
|
2101
|
+
|
|
2102
|
+
function renderSecretRow(slug, key, meta) {
|
|
2103
|
+
return '<div class="pkg-row">' +
|
|
2104
|
+
'<div class="pkg-row-main"><span class="pkg-source">' + escHtml(key) + '</span>' +
|
|
2105
|
+
(meta.required ? '<span class="pkg-badge pkg-badge-warn">required</span>' : '') +
|
|
2106
|
+
(meta.provisioned
|
|
2107
|
+
? '<span class="pkg-badge pkg-badge-ok">provisioned</span>'
|
|
2108
|
+
: '<span class="pkg-badge pkg-badge-err">missing</span>') +
|
|
2109
|
+
'</div>' +
|
|
2110
|
+
(meta.description ? '<div class="skill-desc">' + escHtml(meta.description) + '</div>' : '') +
|
|
2111
|
+
'<div class="pkg-actions">' +
|
|
2112
|
+
'<button class="pkg-btn" data-secret-action="set" data-secret-slug="' + escAttr(slug) + '" data-secret-key="' + escAttr(key) + '">Set</button>' +
|
|
2113
|
+
(meta.provisioned
|
|
2114
|
+
? '<button class="pkg-btn pkg-btn-danger" data-secret-action="delete" data-secret-slug="' + escAttr(slug) + '" data-secret-key="' + escAttr(key) + '">Delete</button>'
|
|
2115
|
+
: '') +
|
|
2116
|
+
'</div>' +
|
|
2117
|
+
'</div>';
|
|
2118
|
+
}
|
|
2119
|
+
|
|
2120
|
+
async function loadExtensionSecrets() {
|
|
2121
|
+
const container = document.getElementById('ext-secrets-content');
|
|
2122
|
+
if (!container) return;
|
|
2123
|
+
container.innerHTML = '<div class="loading-msg">Loading…</div>';
|
|
2124
|
+
try {
|
|
2125
|
+
const data = await apiGet('/admin/api/extension-secrets?' + scopeQuery());
|
|
2126
|
+
if (data.extensions.length === 0) {
|
|
2127
|
+
container.innerHTML = '<div class="empty-state">No extensions installed</div>';
|
|
2128
|
+
return;
|
|
2129
|
+
}
|
|
2130
|
+
container.innerHTML = data.extensions.map((ext) => {
|
|
2131
|
+
const declared = ext.declared.map((s) => renderSecretRow(ext.slug, s.key, s)).join('');
|
|
2132
|
+
const extras = ext.extraProvisioned
|
|
2133
|
+
.map((key) => renderSecretRow(ext.slug, key, { provisioned: true }))
|
|
2134
|
+
.join('');
|
|
2135
|
+
return '<div class="pkg-group">' +
|
|
2136
|
+
'<div class="pkg-group-head"><strong>' + escHtml(ext.name) + '</strong>' +
|
|
2137
|
+
'<span class="pkg-source">' + escHtml(ext.slug) + '</span>' +
|
|
2138
|
+
'<button class="pkg-btn" data-secret-action="add" data-secret-slug="' + escAttr(ext.slug) + '">Add key</button>' +
|
|
2139
|
+
'</div>' +
|
|
2140
|
+
'<div class="pkg-list">' +
|
|
2141
|
+
(declared + extras || '<div class="pkg-provides-empty">No secrets declared</div>') +
|
|
2142
|
+
'</div>' +
|
|
2143
|
+
'</div>';
|
|
2144
|
+
}).join('');
|
|
2145
|
+
} catch (err) {
|
|
2146
|
+
container.innerHTML = '<div class="err-msg">' + escHtml(err.message) + '</div>';
|
|
2147
|
+
}
|
|
2148
|
+
}
|
|
2149
|
+
|
|
2150
|
+
document.addEventListener('click', async (event) => {
|
|
2151
|
+
const btn = event.target.closest('[data-secret-action]');
|
|
2152
|
+
if (!btn) return;
|
|
2153
|
+
const slug = btn.dataset.secretSlug;
|
|
2154
|
+
const action = btn.dataset.secretAction;
|
|
2155
|
+
let key = btn.dataset.secretKey;
|
|
2156
|
+
if (action === 'add') {
|
|
2157
|
+
key = (prompt('Secret key for ' + slug + '(e.g. SLACK_BOT_TOKEN)') || '').trim();
|
|
2158
|
+
if (!key) return;
|
|
2159
|
+
}
|
|
2160
|
+
if (action === 'delete' && !confirm('Delete ' + key + ' from ' + slug + '?')) return;
|
|
2161
|
+
let value;
|
|
2162
|
+
if (action !== 'delete') {
|
|
2163
|
+
value = prompt('Value for ' + key + '(' + slug + ')');
|
|
2164
|
+
if (!value) return;
|
|
2165
|
+
}
|
|
2166
|
+
try {
|
|
2167
|
+
await apiPost('/admin/api/extension-secrets/mutate', {
|
|
2168
|
+
action: action === 'delete' ? 'delete' : 'set',
|
|
2169
|
+
slug: slug,
|
|
2170
|
+
key: key,
|
|
2171
|
+
value: value,
|
|
2172
|
+
});
|
|
2173
|
+
extSecretsMessage('已更新。對話輸入 /pi-new 生效。', 'ok');
|
|
2174
|
+
await loadExtensionSecrets();
|
|
2175
|
+
} catch (err) {
|
|
2176
|
+
extSecretsMessage(err.message, 'err');
|
|
2177
|
+
}
|
|
2178
|
+
});
|
|
2179
|
+
|
|
2015
2180
|
async function loadSkills() {
|
|
2016
2181
|
const container = document.getElementById('skills-content');
|
|
2017
2182
|
const previewEl = document.getElementById('skills-preview');
|
|
@@ -2176,6 +2341,7 @@ function renderAdminPage(token) {
|
|
|
2176
2341
|
loadGlobalSettings();
|
|
2177
2342
|
loadGlobalSkills();
|
|
2178
2343
|
loadEvents();
|
|
2344
|
+
loadExtensionSecrets();
|
|
2179
2345
|
}
|
|
2180
2346
|
|
|
2181
2347
|
async function loadAllConversations() {
|
|
@@ -2761,6 +2927,12 @@ const adminViewStyles = `
|
|
|
2761
2927
|
}
|
|
2762
2928
|
.pkg-btn:hover { background: rgba(0,0,0,0.05); }
|
|
2763
2929
|
.pkg-btn-danger { color: #b91c1c; }
|
|
2930
|
+
.pkg-group { margin-bottom: 16px; }
|
|
2931
|
+
.pkg-group-head {
|
|
2932
|
+
display: flex; align-items: center; gap: 8px; margin-bottom: 8px;
|
|
2933
|
+
font-size: 0.85rem;
|
|
2934
|
+
}
|
|
2935
|
+
.pkg-group-head .pkg-btn { margin-left: auto; }
|
|
2764
2936
|
|
|
2765
2937
|
/* ── Events ─────────────────────────────────────────────────────────── */
|
|
2766
2938
|
|