@geminixiang/mikan 1.0.0-beta.32 → 1.0.0-beta.34
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 +42 -0
- package/dist/adapter.d.ts +11 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +18 -1
- package/dist/adapter.js.map +1 -1
- package/dist/adapters/discord/bot.d.ts +1 -1
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +26 -20
- 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 +7 -3
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +1 -1
- package/dist/adapters/github/bot.d.ts.map +1 -1
- package/dist/adapters/github/bot.js +10 -5
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/context.d.ts +2 -1
- package/dist/adapters/github/context.d.ts.map +1 -1
- package/dist/adapters/github/context.js +7 -4
- package/dist/adapters/github/context.js.map +1 -1
- package/dist/adapters/github/repo.d.ts.map +1 -1
- package/dist/adapters/github/repo.js +2 -1
- package/dist/adapters/github/repo.js.map +1 -1
- package/dist/adapters/intake.js +5 -4
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/shared.d.ts +8 -7
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +18 -16
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +4 -1
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +76 -54
- 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 +7 -3
- package/dist/adapters/slack/context.js.map +1 -1
- package/dist/adapters/slack/types.d.ts +2 -1
- package/dist/adapters/slack/types.d.ts.map +1 -1
- package/dist/adapters/slack/types.js.map +1 -1
- package/dist/adapters/telegram/bot.d.ts +1 -1
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +17 -10
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts +1 -0
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +7 -3
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/types.d.ts +3 -2
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/agent.d.ts +1 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +122 -50
- package/dist/agent.js.map +1 -1
- package/dist/cli/boot.d.ts.map +1 -1
- package/dist/cli/boot.js +4 -1
- package/dist/cli/boot.js.map +1 -1
- package/dist/cli/ext-dev.d.ts.map +1 -1
- package/dist/cli/ext-dev.js +22 -14
- package/dist/cli/ext-dev.js.map +1 -1
- package/dist/cli/ext.d.ts.map +1 -1
- package/dist/cli/ext.js +5 -3
- package/dist/cli/ext.js.map +1 -1
- package/dist/cli/office.d.ts +2 -0
- package/dist/cli/office.d.ts.map +1 -0
- package/dist/cli/office.js +89 -0
- package/dist/cli/office.js.map +1 -0
- package/dist/cli/types.d.ts +3 -1
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/commands/auto-reply.d.ts.map +1 -1
- package/dist/commands/auto-reply.js +2 -1
- 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.d.ts.map +1 -1
- package/dist/commands/login.js +6 -3
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +7 -4
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +6 -2
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/sandbox.d.ts.map +1 -1
- package/dist/commands/sandbox.js +5 -20
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/commands/session-view.d.ts.map +1 -1
- package/dist/commands/session-view.js +2 -1
- package/dist/commands/session-view.js.map +1 -1
- package/dist/commands/types.d.ts +5 -4
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/config.d.ts +15 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +55 -24
- package/dist/config.js.map +1 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +4 -2
- package/dist/events.js.map +1 -1
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +22 -13
- package/dist/execution-resolver.js.map +1 -1
- package/dist/harness/extensions/loader.d.ts +2 -1
- package/dist/harness/extensions/loader.d.ts.map +1 -1
- package/dist/harness/extensions/loader.js +5 -3
- package/dist/harness/extensions/loader.js.map +1 -1
- package/dist/harness/extensions/types.d.ts +3 -0
- package/dist/harness/extensions/types.d.ts.map +1 -1
- package/dist/harness/extensions/types.js.map +1 -1
- package/dist/harness/session-store.d.ts +2 -0
- package/dist/harness/session-store.d.ts.map +1 -1
- package/dist/harness/session-store.js +2 -0
- package/dist/harness/session-store.js.map +1 -1
- package/dist/harness/subagent-profiles.d.ts.map +1 -1
- package/dist/harness/subagent-profiles.js +9 -0
- package/dist/harness/subagent-profiles.js.map +1 -1
- package/dist/harness/subagent-runner.js +6 -4
- package/dist/harness/subagent-runner.js.map +1 -1
- package/dist/harness/types.d.ts +4 -2
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/main.js +47 -0
- package/dist/main.js.map +1 -1
- package/dist/observability/sentry.d.ts +2 -0
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +7 -0
- package/dist/observability/sentry.js.map +1 -1
- package/dist/office-address.d.ts +32 -0
- package/dist/office-address.d.ts.map +1 -0
- package/dist/office-address.js +118 -0
- package/dist/office-address.js.map +1 -0
- package/dist/office-migration.d.ts +38 -0
- package/dist/office-migration.d.ts.map +1 -0
- package/dist/office-migration.js +213 -0
- package/dist/office-migration.js.map +1 -0
- package/dist/office-registry.d.ts +81 -0
- package/dist/office-registry.d.ts.map +1 -0
- package/dist/office-registry.js +705 -0
- package/dist/office-registry.js.map +1 -0
- package/dist/packages/admin.js +5 -3
- package/dist/packages/admin.js.map +1 -1
- package/dist/packages/inspect.d.ts.map +1 -1
- package/dist/packages/inspect.js +5 -2
- package/dist/packages/inspect.js.map +1 -1
- package/dist/packages/materialize.d.ts +2 -1
- package/dist/packages/materialize.d.ts.map +1 -1
- package/dist/packages/materialize.js +6 -16
- package/dist/packages/materialize.js.map +1 -1
- package/dist/packages/resolve.d.ts.map +1 -1
- package/dist/packages/resolve.js +8 -9
- package/dist/packages/resolve.js.map +1 -1
- package/dist/packages/types.d.ts +3 -2
- package/dist/packages/types.d.ts.map +1 -1
- package/dist/packages/types.js.map +1 -1
- package/dist/provisioner.d.ts +7 -0
- package/dist/provisioner.d.ts.map +1 -1
- package/dist/provisioner.js +17 -0
- package/dist/provisioner.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +88 -67
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +22 -12
- package/dist/runtime/session-lifecycle.d.ts.map +1 -1
- package/dist/runtime/session-lifecycle.js +85 -53
- package/dist/runtime/session-lifecycle.js.map +1 -1
- package/dist/runtime/types.d.ts +14 -4
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +1 -0
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +1 -0
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/firecracker.d.ts.map +1 -1
- package/dist/sandbox/firecracker.js +1 -0
- package/dist/sandbox/firecracker.js.map +1 -1
- package/dist/sandbox/gondolin.d.ts.map +1 -1
- package/dist/sandbox/gondolin.js +1 -0
- package/dist/sandbox/gondolin.js.map +1 -1
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +1 -0
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +35 -7
- package/dist/sandbox/identity.d.ts.map +1 -1
- package/dist/sandbox/identity.js +31 -5
- package/dist/sandbox/identity.js.map +1 -1
- package/dist/sandbox/image.d.ts.map +1 -1
- package/dist/sandbox/image.js +1 -0
- package/dist/sandbox/image.js.map +1 -1
- package/dist/sandbox/index.d.ts +2 -0
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +12 -0
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/types.d.ts +6 -0
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts.map +1 -1
- package/dist/sessions/chat-history-sync.js +33 -4
- package/dist/sessions/chat-history-sync.js.map +1 -1
- package/dist/sessions/store.d.ts +13 -1
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +78 -9
- package/dist/sessions/store.js.map +1 -1
- package/dist/settings-mutation.d.ts +3 -3
- package/dist/settings-mutation.d.ts.map +1 -1
- package/dist/settings-mutation.js +4 -4
- package/dist/settings-mutation.js.map +1 -1
- package/dist/store.d.ts +5 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +13 -5
- package/dist/store.js.map +1 -1
- package/dist/tools/event.d.ts.map +1 -1
- package/dist/tools/event.js +5 -2
- package/dist/tools/event.js.map +1 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +6 -3
- package/dist/tools/subagent.js.map +1 -1
- package/dist/trigger.d.ts.map +1 -1
- package/dist/trigger.js +6 -3
- package/dist/trigger.js.map +1 -1
- package/dist/types.d.ts +78 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/index.d.ts +16 -0
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +31 -1
- package/dist/vault/index.js.map +1 -1
- package/dist/web/admin/portal.d.ts +13 -0
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +156 -173
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/types.d.ts +3 -3
- package/dist/web/admin/types.d.ts.map +1 -1
- package/dist/web/admin/types.js.map +1 -1
- package/dist/web/session-view/portal.d.ts.map +1 -1
- package/dist/web/session-view/portal.js +24 -14
- package/dist/web/session-view/portal.js.map +1 -1
- package/dist/web/session-view/service.d.ts +1 -1
- package/dist/web/session-view/service.d.ts.map +1 -1
- package/dist/web/session-view/service.js +48 -11
- package/dist/web/session-view/service.js.map +1 -1
- package/dist/workspace-projection/index.d.ts +10 -3
- package/dist/workspace-projection/index.d.ts.map +1 -1
- package/dist/workspace-projection/index.js +129 -45
- package/dist/workspace-projection/index.js.map +1 -1
- package/dist/workspace-projection/types.d.ts +14 -3
- package/dist/workspace-projection/types.d.ts.map +1 -1
- package/dist/workspace-projection/types.js.map +1 -1
- package/package.json +2 -1
package/dist/cli/boot.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../../src/cli/boot.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAgB,WAAW,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../../src/cli/boot.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAgB,WAAW,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,QAAQ,CA+D5E;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAgCjC"}
|
package/dist/cli/boot.js
CHANGED
|
@@ -12,10 +12,11 @@ import { envSummaryLines } from "../env-manifest.js";
|
|
|
12
12
|
import { parseSandboxArg } from "../sandbox/index.js";
|
|
13
13
|
import { defaultStateDir, resolveStateDir, takeValueFlag } from "./arg-grammar.js";
|
|
14
14
|
export function resolveBoot(args = process.argv.slice(2)) {
|
|
15
|
-
if (args[0] === "ext" || args[0] === "env") {
|
|
15
|
+
if (args[0] === "ext" || args[0] === "office" || args[0] === "env") {
|
|
16
16
|
return {
|
|
17
17
|
mode: args[0],
|
|
18
18
|
...(args[0] === "ext" ? { extArgs: args.slice(1) } : {}),
|
|
19
|
+
...(args[0] === "office" ? { officeArgs: args.slice(1) } : {}),
|
|
19
20
|
stateDir: defaultStateDir(),
|
|
20
21
|
workingDir: join(defaultStateDir(), "workspace"),
|
|
21
22
|
workingDirExplicit: false,
|
|
@@ -86,6 +87,8 @@ Usage:
|
|
|
86
87
|
Start the daemon. The working directory defaults to <state-dir>/workspace.
|
|
87
88
|
mikan ext <install|validate|list|remove> …
|
|
88
89
|
Manage extensions (run \`mikan ext\` for details).
|
|
90
|
+
mikan office <list|claim> …
|
|
91
|
+
Inspect conversation offices and claim legacy directories for a platform.
|
|
89
92
|
mikan env
|
|
90
93
|
Show the full environment-variable inventory and what is currently set.
|
|
91
94
|
|
package/dist/cli/boot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../../src/cli/boot.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAInF,MAAM,UAAU,WAAW,CAAC,IAAI,GAAa,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../../src/cli/boot.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAInF,MAAM,UAAU,WAAW,CAAC,IAAI,GAAa,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QACnE,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,QAAQ,EAAE,eAAe,EAAE;YAC3B,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,WAAW,CAAC;YAChD,kBAAkB,EAAE,KAAK;YACzB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;SAC1B,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,GAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC9C,IAAI,aAAiC,CAAC;IACtC,IAAI,eAAmC,CAAC;IACxC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,KAAK,CAAC;QACV,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC/D,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;YACzD,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;QACtB,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC;YAC3D,mEAAmE;YACnE,8DAA8D;YAC9D,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;QACtB,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;YAC1D,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC;YAC9B,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;QACtB,CAAC;aAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,aAAa,GAAG,GAAG,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,mCAAmC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO;QACL,IAAI,EAAE,IAAI;YACR,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,OAAO;gBACP,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,OAAO;oBACP,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,eAAe;wBACf,CAAC,CAAC,UAAU;wBACZ,CAAC,CAAC,KAAK;QACf,QAAQ;QACR,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC;QAChF,kBAAkB,EAAE,aAAa,KAAK,SAAS;QAC/C,OAAO;QACP,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BP,eAAe,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;0CACY,CAAC;AAC3C,CAAC","sourcesContent":["/**\n * Boot resolution for the `mikan` binary: argv → a BootPlan saying which mode\n * to run and with what configuration. Pure — no side effects, no exits — so\n * the grammar that actually drives the daemon is testable without spawning a\n * process; main.ts just executes the plan.\n *\n * Modes, highest priority first: `ext` (own grammar, never flag-parsed here),\n * `help`, `version`, `onboard`, `download`, `run`.\n */\nimport { join, resolve } from \"path\";\nimport { envSummaryLines } from \"../env-manifest.js\";\nimport { parseSandboxArg } from \"../sandbox/index.js\";\nimport type { SandboxConfig } from \"../sandbox/types.js\";\nimport type { BootPlan } from \"./types.js\";\nimport { defaultStateDir, resolveStateDir, takeValueFlag } from \"./arg-grammar.js\";\n\nexport type { BootPlan } from \"./types.js\";\n\nexport function resolveBoot(args: string[] = process.argv.slice(2)): BootPlan {\n if (args[0] === \"ext\" || args[0] === \"office\" || args[0] === \"env\") {\n return {\n mode: args[0],\n ...(args[0] === \"ext\" ? { extArgs: args.slice(1) } : {}),\n ...(args[0] === \"office\" ? { officeArgs: args.slice(1) } : {}),\n stateDir: defaultStateDir(),\n workingDir: join(defaultStateDir(), \"workspace\"),\n workingDirExplicit: false,\n sandbox: { type: \"host\" },\n };\n }\n\n let sandbox: SandboxConfig = { type: \"host\" };\n let workingDirArg: string | undefined;\n let downloadChannel: string | undefined;\n let help = false;\n let version = false;\n let onboard = false;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n let taken;\n if (arg === \"--help\" || arg === \"-h\") {\n help = true;\n } else if (arg === \"--version\" || arg === \"-v\" || arg === \"-V\") {\n version = true;\n } else if (arg === \"--onboard\") {\n onboard = true;\n } else if ((taken = takeValueFlag(args, i, \"--sandbox\"))) {\n sandbox = parseSandboxArg(taken.value);\n i = taken.lastIndex;\n } else if ((taken = takeValueFlag(args, i, \"--state-dir\"))) {\n // Consumed here so its value never reads as the positional working\n // dir; the value itself is resolved by resolveStateDir below.\n i = taken.lastIndex;\n } else if ((taken = takeValueFlag(args, i, \"--download\"))) {\n downloadChannel = taken.value;\n i = taken.lastIndex;\n } else if (!arg.startsWith(\"-\")) {\n workingDirArg = arg;\n } else {\n throw new Error(`Unknown flag: ${arg}. Run \\`mikan --help\\` for usage.`);\n }\n }\n\n const stateDir = resolveStateDir(args);\n return {\n mode: help\n ? \"help\"\n : version\n ? \"version\"\n : onboard\n ? \"onboard\"\n : downloadChannel\n ? \"download\"\n : \"run\",\n stateDir,\n workingDir: workingDirArg ? resolve(workingDirArg) : join(stateDir, \"workspace\"),\n workingDirExplicit: workingDirArg !== undefined,\n sandbox,\n downloadChannel,\n };\n}\n\nexport function helpText(): string {\n return `mikan — multi-platform chat agent daemon\n\nUsage:\n mikan [options] [working-directory]\n Start the daemon. The working directory defaults to <state-dir>/workspace.\n mikan ext <install|validate|list|remove> …\n Manage extensions (run \\`mikan ext\\` for details).\n mikan office <list|claim> …\n Inspect conversation offices and claim legacy directories for a platform.\n mikan env\n Show the full environment-variable inventory and what is currently set.\n\nOptions:\n --state-dir <dir> State directory (settings.json, vaults, extensions).\n Default: ~/.mikan\n --sandbox <spec> Execution sandbox. One of:\n host\n container:<existing-container-name>\n image:<image[:tag]>\n gondolin:default\n firecracker:<vm-id>:<host-path>[:<ssh-user>[:<ssh-port>]]\n cloudflare:<sandbox-id>\n Default: host\n --onboard Create <state-dir>/settings.json from a template, then exit.\n --download <channel> Dump a Slack channel's history (Slack only), then exit.\n --version, -v Print the version.\n --help, -h Show this help.\n\nEnvironment (platform tokens select which chat adapters start):\n${envSummaryLines().join(\"\\n\")}\nRun \\`mikan env\\` for the full inventory.`;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ext-dev.d.ts","sourceRoot":"","sources":["../../src/cli/ext-dev.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ext-dev.d.ts","sourceRoot":"","sources":["../../src/cli/ext-dev.ts"],"names":[],"mappings":"AA2DA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyDtE"}
|
package/dist/cli/ext-dev.js
CHANGED
|
@@ -21,13 +21,15 @@
|
|
|
21
21
|
* no reinstall step.
|
|
22
22
|
*/
|
|
23
23
|
import { createInterface } from "node:readline";
|
|
24
|
-
import { existsSync,
|
|
24
|
+
import { existsSync, statSync } from "node:fs";
|
|
25
25
|
import { basename, resolve as resolvePath } from "node:path";
|
|
26
26
|
import { join } from "node:path";
|
|
27
|
-
import { createConversationRuntime, } from "../index.js";
|
|
27
|
+
import { createConversationEvent, createConversationMessage, createConversationRuntime, } from "../index.js";
|
|
28
28
|
import { updateConversationSettings } from "../config.js";
|
|
29
29
|
import { formatSource, parseSource } from "../packages/index.js";
|
|
30
30
|
import { resolveStateDir, takeValueFlag } from "./arg-grammar.js";
|
|
31
|
+
import { conversationOfficeDir, createOfficeAddress } from "../office-address.js";
|
|
32
|
+
import { ensureOfficeDir } from "../office-registry.js";
|
|
31
33
|
const USAGE = `Usage:
|
|
32
34
|
mikan ext dev <path|source> [--workspace <dir>] [--state-dir <dir>]
|
|
33
35
|
|
|
@@ -82,11 +84,12 @@ export async function runExtDevCommand(argv) {
|
|
|
82
84
|
}
|
|
83
85
|
const conversationId = devConversationId(target);
|
|
84
86
|
const workingDir = resolvePath(workspaceDir ?? join(process.cwd(), ".mikan-ext-dev"));
|
|
85
|
-
|
|
87
|
+
ensureOfficeDir(workingDir, createOfficeAddress("slack", conversationId));
|
|
86
88
|
// Declaring the working copy as this conversation's package is what makes
|
|
87
89
|
// the dev loop use the real resolution path rather than a bespoke one.
|
|
88
90
|
process.env.MIKAN_STATE_DIR = stateDir;
|
|
89
|
-
|
|
91
|
+
const devAddress = createOfficeAddress("slack", conversationId);
|
|
92
|
+
updateConversationSettings({ address: devAddress, conversationDir: conversationOfficeDir(workingDir, devAddress) }, { packages: [source] });
|
|
90
93
|
console.log(`mikan ext dev — ${source}`);
|
|
91
94
|
console.log(` conversation: ${conversationId}`);
|
|
92
95
|
console.log(` workspace: ${workingDir}`);
|
|
@@ -136,7 +139,8 @@ function runDevLoop(options) {
|
|
|
136
139
|
let counter = 0;
|
|
137
140
|
const handleLine = async (line) => {
|
|
138
141
|
const ts = `${++counter}`;
|
|
139
|
-
const event = {
|
|
142
|
+
const event = createConversationEvent({
|
|
143
|
+
platform: "slack",
|
|
140
144
|
type: "message",
|
|
141
145
|
conversationId,
|
|
142
146
|
conversationKind: "direct",
|
|
@@ -144,16 +148,20 @@ function runDevLoop(options) {
|
|
|
144
148
|
user: "dev",
|
|
145
149
|
text: line,
|
|
146
150
|
sessionKey: conversationId,
|
|
147
|
-
};
|
|
151
|
+
});
|
|
152
|
+
const message = createConversationMessage({
|
|
153
|
+
platform: "slack",
|
|
154
|
+
conversationId,
|
|
155
|
+
id: ts,
|
|
156
|
+
sessionKey: conversationId,
|
|
157
|
+
conversationKind: "direct",
|
|
158
|
+
userId: "dev",
|
|
159
|
+
userName: "Developer",
|
|
160
|
+
text: line,
|
|
161
|
+
});
|
|
148
162
|
const context = {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
sessionKey: conversationId,
|
|
152
|
-
conversationKind: "direct",
|
|
153
|
-
userId: "dev",
|
|
154
|
-
userName: "Developer",
|
|
155
|
-
text: line,
|
|
156
|
-
},
|
|
163
|
+
address: event.address,
|
|
164
|
+
message,
|
|
157
165
|
responder,
|
|
158
166
|
platform,
|
|
159
167
|
};
|
package/dist/cli/ext-dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ext-dev.js","sourceRoot":"","sources":["../../src/cli/ext-dev.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `mikan ext dev <path>` — develop an extension without a Slack workspace.\n *\n * mikan ext dev ./my-extension\n * > add a poll for lunch\n * [agent reply]\n * > /pi-new # picks up your edits\n *\n * The alternative this exists to avoid is asking every extension author to\n * install mikan into a real Slack workspace, create an app, and deploy before\n * they can see whether their `activate()` even runs.\n *\n * It is a stdin/stdout conversation on the same runtime production uses — same\n * package resolution, same loader, same commands — with the platform swapped\n * for the terminal and the sandbox set to `host`. That equivalence is the\n * point: an extension that works here works in a channel, because nothing\n * about how it is found or activated differs.\n *\n * The working copy is registered as a conversation-scoped local package, which\n * is by-reference rather than copied, so the edit → `/pi-new` → test loop needs\n * no reinstall step.\n */\nimport { createInterface } from \"node:readline\";\nimport { existsSync, mkdirSync, statSync } from \"node:fs\";\nimport { basename, resolve as resolvePath } from \"node:path\";\nimport { join } from \"node:path\";\nimport {\n createConversationRuntime,\n type ConversationContext,\n type ConversationEvent,\n type ConversationResponder,\n type MessagingBot,\n type MessagingInfo,\n} from \"../index.js\";\nimport { updateConversationSettings } from \"../config.js\";\nimport { formatSource, parseSource } from \"../packages/index.js\";\nimport { resolveStateDir, takeValueFlag } from \"./arg-grammar.js\";\n\nconst USAGE = `Usage:\n mikan ext dev <path|source> [--workspace <dir>] [--state-dir <dir>]\n\n <path> a working copy of an extension (or a package directory)\n --workspace where conversation state is written (default: ./.mikan-ext-dev)\n\n Type a message to run the agent against your extension. /pi-new reloads it\n after an edit; Ctrl-D exits.`;\n\n/**\n * One dev conversation per extension, so two extensions can be developed side\n * by side without overwriting each other's settings or session history.\n */\nfunction devConversationId(source: string): string {\n const name = basename(source.replace(/[#@].*$/, \"\").replace(/\\/+$/, \"\")) || \"extension\";\n return `ext-dev-${name.toLowerCase().replace(/[^a-z0-9_-]+/g, \"-\")}`.slice(0, 64);\n}\n\nexport async function runExtDevCommand(argv: string[]): Promise<number> {\n const stateDir = resolveStateDir(argv);\n let workspaceDir: string | undefined;\n const positional: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n let taken;\n if ((taken = takeValueFlag(argv, i, \"--workspace\"))) {\n workspaceDir = taken.value;\n i = taken.lastIndex;\n } else if ((taken = takeValueFlag(argv, i, \"--state-dir\"))) {\n i = taken.lastIndex; // already folded in by resolveStateDir\n } else positional.push(argv[i]);\n }\n\n const target = positional[0];\n if (!target) {\n console.error(USAGE);\n return 1;\n }\n\n // A local working copy is the common case; resolve it to an absolute path so\n // the stored package source does not depend on the shell's cwd.\n let source: string;\n try {\n const parsed = parseSource(\n existsSync(target) && !target.startsWith(\".\") ? resolvePath(target) : target,\n );\n source = formatSource(parsed);\n if (parsed.type === \"local\" && !statSync(parsed.path).isDirectory()) {\n console.error(`Not a directory: ${parsed.path}`);\n return 1;\n }\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n return 1;\n }\n\n const conversationId = devConversationId(target);\n const workingDir = resolvePath(workspaceDir ?? join(process.cwd(), \".mikan-ext-dev\"));\n mkdirSync(join(workingDir, conversationId), { recursive: true });\n\n // Declaring the working copy as this conversation's package is what makes\n // the dev loop use the real resolution path rather than a bespoke one.\n process.env.MIKAN_STATE_DIR = stateDir;\n updateConversationSettings(join(workingDir, conversationId), { packages: [source] });\n\n console.log(`mikan ext dev — ${source}`);\n console.log(` conversation: ${conversationId}`);\n console.log(` workspace: ${workingDir}`);\n console.log(` state dir: ${stateDir}`);\n console.log(\"Type a message. /pi-new reloads after an edit. Ctrl-D exits.\\n\");\n\n return runDevLoop({ conversationId, workingDir });\n}\n\nfunction write(text: string): void {\n process.stdout.write(`${text}\\n`);\n}\n\nfunction runDevLoop(options: { conversationId: string; workingDir: string }): Promise<number> {\n const { conversationId, workingDir } = options;\n\n const platform: MessagingInfo = {\n name: \"ext-dev\",\n formattingGuide: \"Reply in plain text.\",\n channels: [{ id: conversationId, name: conversationId }],\n users: [{ id: \"dev\", userName: \"dev\", displayName: \"Developer\" }],\n };\n\n const runtime = createConversationRuntime({\n workingDir,\n // The host executor keeps the loop dependency-free: no Docker, no image\n // pull, no VM. An extension's own tools and hooks do not observe the\n // difference, and the ones that shell out see the developer's machine —\n // which is what they want while iterating.\n sandbox: { type: \"host\" },\n });\n\n const bot: MessagingBot = {\n start: async () => {},\n postMessage: async (_conversationId, text) => {\n write(text);\n return `${Date.now()}`;\n },\n updateMessage: async (_conversationId, _ts, text) => write(text),\n enqueueEvent: () => false,\n getMessagingInfo: () => platform,\n };\n\n const responder: ConversationResponder = {\n respond: async (text) => write(text),\n replaceResponse: async (text) => write(text),\n respondDiagnostic: async (text) => write(`· ${text}`),\n respondToolResult: async (result) => write(`· [${result.toolName}]`),\n setTyping: async () => {},\n setWorking: async () => {},\n uploadFile: async (filePath) => write(`· [file] ${filePath}`),\n deleteResponse: async () => {},\n };\n\n let counter = 0;\n const handleLine = async (line: string): Promise<void> => {\n const ts = `${++counter}`;\n const event: ConversationEvent = {\n type: \"message\",\n conversationId,\n conversationKind: \"direct\",\n ts,\n user: \"dev\",\n text: line,\n sessionKey: conversationId,\n };\n const context: ConversationContext = {\n message: {\n id: ts,\n sessionKey: conversationId,\n conversationKind: \"direct\",\n userId: \"dev\",\n userName: \"Developer\",\n text: line,\n },\n responder,\n platform,\n };\n await runtime.handleEvent(event, bot, context);\n };\n\n return new Promise<number>((resolveLoop) => {\n const rl = createInterface({ input: process.stdin, output: process.stdout, prompt: \"> \" });\n rl.prompt();\n rl.on(\"line\", (line) => {\n if (!line.trim()) return rl.prompt();\n void handleLine(line)\n .catch((err: unknown) => write(`· error: ${err instanceof Error ? err.message : err}`))\n .finally(() => rl.prompt());\n });\n rl.on(\"close\", () => {\n void runtime.shutdown().then(() => resolveLoop(0));\n });\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ext-dev.js","sourceRoot":"","sources":["../../src/cli/ext-dev.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `mikan ext dev <path>` — develop an extension without a Slack workspace.\n *\n * mikan ext dev ./my-extension\n * > add a poll for lunch\n * [agent reply]\n * > /pi-new # picks up your edits\n *\n * The alternative this exists to avoid is asking every extension author to\n * install mikan into a real Slack workspace, create an app, and deploy before\n * they can see whether their `activate()` even runs.\n *\n * It is a stdin/stdout conversation on the same runtime production uses — same\n * package resolution, same loader, same commands — with the platform swapped\n * for the terminal and the sandbox set to `host`. That equivalence is the\n * point: an extension that works here works in a channel, because nothing\n * about how it is found or activated differs.\n *\n * The working copy is registered as a conversation-scoped local package, which\n * is by-reference rather than copied, so the edit → `/pi-new` → test loop needs\n * no reinstall step.\n */\nimport { createInterface } from \"node:readline\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { basename, resolve as resolvePath } from \"node:path\";\nimport { join } from \"node:path\";\nimport {\n createConversationEvent,\n createConversationMessage,\n createConversationRuntime,\n type ConversationContext,\n type ConversationResponder,\n type MessagingBot,\n type MessagingInfo,\n} from \"../index.js\";\nimport { updateConversationSettings } from \"../config.js\";\nimport { formatSource, parseSource } from \"../packages/index.js\";\nimport { resolveStateDir, takeValueFlag } from \"./arg-grammar.js\";\nimport { conversationOfficeDir, createOfficeAddress } from \"../office-address.js\";\nimport { ensureOfficeDir } from \"../office-registry.js\";\n\nconst USAGE = `Usage:\n mikan ext dev <path|source> [--workspace <dir>] [--state-dir <dir>]\n\n <path> a working copy of an extension (or a package directory)\n --workspace where conversation state is written (default: ./.mikan-ext-dev)\n\n Type a message to run the agent against your extension. /pi-new reloads it\n after an edit; Ctrl-D exits.`;\n\n/**\n * One dev conversation per extension, so two extensions can be developed side\n * by side without overwriting each other's settings or session history.\n */\nfunction devConversationId(source: string): string {\n const name = basename(source.replace(/[#@].*$/, \"\").replace(/\\/+$/, \"\")) || \"extension\";\n return `ext-dev-${name.toLowerCase().replace(/[^a-z0-9_-]+/g, \"-\")}`.slice(0, 64);\n}\n\nexport async function runExtDevCommand(argv: string[]): Promise<number> {\n const stateDir = resolveStateDir(argv);\n let workspaceDir: string | undefined;\n const positional: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n let taken;\n if ((taken = takeValueFlag(argv, i, \"--workspace\"))) {\n workspaceDir = taken.value;\n i = taken.lastIndex;\n } else if ((taken = takeValueFlag(argv, i, \"--state-dir\"))) {\n i = taken.lastIndex; // already folded in by resolveStateDir\n } else positional.push(argv[i]);\n }\n\n const target = positional[0];\n if (!target) {\n console.error(USAGE);\n return 1;\n }\n\n // A local working copy is the common case; resolve it to an absolute path so\n // the stored package source does not depend on the shell's cwd.\n let source: string;\n try {\n const parsed = parseSource(\n existsSync(target) && !target.startsWith(\".\") ? resolvePath(target) : target,\n );\n source = formatSource(parsed);\n if (parsed.type === \"local\" && !statSync(parsed.path).isDirectory()) {\n console.error(`Not a directory: ${parsed.path}`);\n return 1;\n }\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n return 1;\n }\n\n const conversationId = devConversationId(target);\n const workingDir = resolvePath(workspaceDir ?? join(process.cwd(), \".mikan-ext-dev\"));\n ensureOfficeDir(workingDir, createOfficeAddress(\"slack\", conversationId));\n\n // Declaring the working copy as this conversation's package is what makes\n // the dev loop use the real resolution path rather than a bespoke one.\n process.env.MIKAN_STATE_DIR = stateDir;\n const devAddress = createOfficeAddress(\"slack\", conversationId);\n updateConversationSettings(\n { address: devAddress, conversationDir: conversationOfficeDir(workingDir, devAddress) },\n { packages: [source] },\n );\n\n console.log(`mikan ext dev — ${source}`);\n console.log(` conversation: ${conversationId}`);\n console.log(` workspace: ${workingDir}`);\n console.log(` state dir: ${stateDir}`);\n console.log(\"Type a message. /pi-new reloads after an edit. Ctrl-D exits.\\n\");\n\n return runDevLoop({ conversationId, workingDir });\n}\n\nfunction write(text: string): void {\n process.stdout.write(`${text}\\n`);\n}\n\nfunction runDevLoop(options: { conversationId: string; workingDir: string }): Promise<number> {\n const { conversationId, workingDir } = options;\n\n const platform: MessagingInfo = {\n name: \"ext-dev\",\n formattingGuide: \"Reply in plain text.\",\n channels: [{ id: conversationId, name: conversationId }],\n users: [{ id: \"dev\", userName: \"dev\", displayName: \"Developer\" }],\n };\n\n const runtime = createConversationRuntime({\n workingDir,\n // The host executor keeps the loop dependency-free: no Docker, no image\n // pull, no VM. An extension's own tools and hooks do not observe the\n // difference, and the ones that shell out see the developer's machine —\n // which is what they want while iterating.\n sandbox: { type: \"host\" },\n });\n\n const bot: MessagingBot = {\n start: async () => {},\n postMessage: async (_conversationId, text) => {\n write(text);\n return `${Date.now()}`;\n },\n updateMessage: async (_conversationId, _ts, text) => write(text),\n enqueueEvent: () => false,\n getMessagingInfo: () => platform,\n };\n\n const responder: ConversationResponder = {\n respond: async (text) => write(text),\n replaceResponse: async (text) => write(text),\n respondDiagnostic: async (text) => write(`· ${text}`),\n respondToolResult: async (result) => write(`· [${result.toolName}]`),\n setTyping: async () => {},\n setWorking: async () => {},\n uploadFile: async (filePath) => write(`· [file] ${filePath}`),\n deleteResponse: async () => {},\n };\n\n let counter = 0;\n const handleLine = async (line: string): Promise<void> => {\n const ts = `${++counter}`;\n const event = createConversationEvent({\n platform: \"slack\",\n type: \"message\",\n conversationId,\n conversationKind: \"direct\",\n ts,\n user: \"dev\",\n text: line,\n sessionKey: conversationId,\n });\n const message = createConversationMessage({\n platform: \"slack\",\n conversationId,\n id: ts,\n sessionKey: conversationId,\n conversationKind: \"direct\",\n userId: \"dev\",\n userName: \"Developer\",\n text: line,\n });\n const context: ConversationContext = {\n address: event.address,\n message,\n responder,\n platform,\n };\n await runtime.handleEvent(event, bot, context);\n };\n\n return new Promise<number>((resolveLoop) => {\n const rl = createInterface({ input: process.stdin, output: process.stdout, prompt: \"> \" });\n rl.prompt();\n rl.on(\"line\", (line) => {\n if (!line.trim()) return rl.prompt();\n void handleLine(line)\n .catch((err: unknown) => write(`· error: ${err instanceof Error ? err.message : err}`))\n .finally(() => rl.prompt());\n });\n rl.on(\"close\", () => {\n void runtime.shutdown().then(() => resolveLoop(0));\n });\n });\n}\n"]}
|
package/dist/cli/ext.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ext.d.ts","sourceRoot":"","sources":["../../src/cli/ext.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ext.d.ts","sourceRoot":"","sources":["../../src/cli/ext.ts"],"names":[],"mappings":"AAoFA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBnE"}
|
package/dist/cli/ext.js
CHANGED
|
@@ -17,6 +17,8 @@ import { defaultExtensionDirs, listInstalledExtensions, validateExtension, } fro
|
|
|
17
17
|
import { resolveStateDir, takeValueFlag } from "./arg-grammar.js";
|
|
18
18
|
import { runExtDevCommand } from "./ext-dev.js";
|
|
19
19
|
import { parseGitSource, resolveGitSource } from "./ext-git.js";
|
|
20
|
+
import { officeStateDir } from "../office-address.js";
|
|
21
|
+
import { resolveOwnedOfficeAddress } from "../office-registry.js";
|
|
20
22
|
function parseExtArgs(argv) {
|
|
21
23
|
// Shares the daemon's state-dir precedence: --state-dir > env > ~/.mikan.
|
|
22
24
|
const stateDir = resolveStateDir(argv);
|
|
@@ -47,7 +49,7 @@ function scopeExtensionsDir(args) {
|
|
|
47
49
|
return join(args.stateDir, "global", "extensions");
|
|
48
50
|
if (args.scope === "conversation" && args.conversationId) {
|
|
49
51
|
// defaultExtensionDirs returns [global, conversation]; take the conversation one.
|
|
50
|
-
return defaultExtensionDirs(args.conversationId, args.stateDir)[1];
|
|
52
|
+
return defaultExtensionDirs(resolveOwnedOfficeAddress(args.conversationId, args.stateDir), args.stateDir)[1];
|
|
51
53
|
}
|
|
52
54
|
throw new Error("Specify a scope: --global or --conversation <id>");
|
|
53
55
|
}
|
|
@@ -150,7 +152,7 @@ async function installResolved(args, source, destDir) {
|
|
|
150
152
|
const scopeLabel = args.scope === "global" ? "all conversations" : `conversation ${args.conversationId}`;
|
|
151
153
|
const dataDir = args.scope === "global"
|
|
152
154
|
? join(args.stateDir, "global", "extension-data", result.slug)
|
|
153
|
-
: join(args.stateDir,
|
|
155
|
+
: join(officeStateDir(args.stateDir, resolveOwnedOfficeAddress(args.conversationId, args.stateDir)), "extension-data", result.slug);
|
|
154
156
|
const verb = replaced ? "Reinstalled" : "Installed";
|
|
155
157
|
console.log(`\n${verb} ${result.name} (slug: ${result.slug}) for ${scopeLabel}.`);
|
|
156
158
|
console.log(` code: ${dest}`);
|
|
@@ -161,7 +163,7 @@ async function installResolved(args, source, destDir) {
|
|
|
161
163
|
function listAction(args) {
|
|
162
164
|
// List the requested scope, or both when no conversation is given.
|
|
163
165
|
const dirs = args.conversationId
|
|
164
|
-
? defaultExtensionDirs(args.conversationId, args.stateDir)
|
|
166
|
+
? defaultExtensionDirs(resolveOwnedOfficeAddress(args.conversationId, args.stateDir), args.stateDir)
|
|
165
167
|
: [join(args.stateDir, "global", "extensions")];
|
|
166
168
|
const installed = listInstalledExtensions(dirs);
|
|
167
169
|
if (installed.length === 0) {
|
package/dist/cli/ext.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ext.js","sourceRoot":"","sources":["../../src/cli/ext.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `mikan ext` — manage extensions from the CLI.\n *\n * mikan ext install <source> [--global | --conversation <id>] [--state-dir <dir>]\n * mikan ext validate <path>\n * mikan ext list [--conversation <id>] [--state-dir <dir>]\n * mikan ext remove <slug> (--global | --conversation <id>) [--state-dir <dir>]\n *\n * `<source>` is a local path or a git URL (https://…, git@…, or github:owner/repo)\n * with an optional `#subpath` for extensions inside a repo. Reinstalling over an\n * existing extension updates it (data is preserved). Extensions install into the\n * host-only state dir (never the workspace); see src/harness/extensions/LAYOUT.md.\n */\nimport { cpSync, existsSync, mkdirSync, rmSync } from \"node:fs\";\nimport { basename, join, resolve } from \"node:path\";\nimport {\n defaultExtensionDirs,\n listInstalledExtensions,\n validateExtension,\n} from \"../harness/index.js\";\nimport { resolveStateDir, takeValueFlag } from \"./arg-grammar.js\";\nimport { runExtDevCommand } from \"./ext-dev.js\";\nimport { parseGitSource, resolveGitSource } from \"./ext-git.js\";\n\ninterface ExtArgs {\n action?: string;\n target?: string;\n stateDir: string;\n scope: \"global\" | \"conversation\" | undefined;\n conversationId?: string;\n}\n\nfunction parseExtArgs(argv: string[]): ExtArgs {\n // Shares the daemon's state-dir precedence: --state-dir > env > ~/.mikan.\n const stateDir = resolveStateDir(argv);\n let scope: ExtArgs[\"scope\"];\n let conversationId: string | undefined;\n const positional: string[] = [];\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n let taken;\n if (arg === \"--global\") scope = \"global\";\n else if ((taken = takeValueFlag(argv, i, \"--conversation\"))) {\n scope = \"conversation\";\n conversationId = taken.value || undefined;\n i = taken.lastIndex;\n } else if ((taken = takeValueFlag(argv, i, \"--state-dir\"))) {\n i = taken.lastIndex; // value already folded in by resolveStateDir\n } else positional.push(arg);\n }\n\n return { action: positional[0], target: positional[1], stateDir, scope, conversationId };\n}\n\n/** Directory that extension CODE for the chosen scope lives in. */\nfunction scopeExtensionsDir(args: ExtArgs): string {\n if (args.scope === \"global\") return join(args.stateDir, \"global\", \"extensions\");\n if (args.scope === \"conversation\" && args.conversationId) {\n // defaultExtensionDirs returns [global, conversation]; take the conversation one.\n return defaultExtensionDirs(args.conversationId, args.stateDir)[1];\n }\n throw new Error(\"Specify a scope: --global or --conversation <id>\");\n}\n\nconst USAGE = `Usage:\n mikan ext dev <path> [--workspace <dir>] [--state-dir <dir>]\n Run an extension in a local stdin/stdout conversation — no Slack, no\n install. Edit, send /pi-new, test again.\n mikan ext install <source> (--global | --conversation <id>) [--state-dir <dir>]\n <source>: a local path, or a git URL / github:owner/repo with optional #subpath\n e.g. github:geminixiang/mikan#examples/extensions/agent-pm\n Reinstalling over an existing extension updates it (data preserved).\n mikan ext validate <path>\n mikan ext list [--conversation <id>] [--state-dir <dir>]\n mikan ext remove <slug> (--global | --conversation <id>) [--state-dir <dir>]`;\n\nfunction noop(): void {}\n\nexport async function runExtCommand(argv: string[]): Promise<number> {\n const args = parseExtArgs(argv);\n\n switch (args.action) {\n case \"dev\":\n // Parsed by the dev command itself: it takes different flags.\n return runExtDevCommand(argv.slice(1));\n case \"validate\":\n return validateAction(args);\n case \"install\":\n return installAction(args);\n case \"list\":\n return listAction(args);\n case \"remove\":\n return removeAction(args);\n default:\n console.error(USAGE);\n return 1;\n }\n}\n\nasync function validateAction(args: ExtArgs): Promise<number> {\n if (!args.target) {\n console.error(\"ext validate: missing <path>\");\n return 1;\n }\n const result = await validateExtension(resolve(args.target));\n printValidation(result);\n return result.ok ? 0 : 1;\n}\n\nasync function installAction(args: ExtArgs): Promise<number> {\n if (!args.target) {\n console.error(\"ext install: missing <path>\");\n return 1;\n }\n let destDir: string;\n try {\n destDir = scopeExtensionsDir(args);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n return 1;\n }\n\n // Resolve the source: a git URL (optionally with #subpath) is cloned to a\n // temp dir; a local path is used directly.\n const gitSpec = parseGitSource(args.target);\n let source: string;\n let cleanup = noop;\n if (gitSpec) {\n try {\n const resolved = resolveGitSource(gitSpec);\n source = resolved.dir;\n cleanup = resolved.cleanup;\n } catch (err) {\n console.error(`Failed to fetch ${gitSpec.url}: ${err instanceof Error ? err.message : err}`);\n return 1;\n }\n } else {\n source = resolve(args.target);\n }\n\n try {\n return await installResolved(args, source, destDir);\n } finally {\n cleanup();\n }\n}\n\nasync function installResolved(args: ExtArgs, source: string, destDir: string): Promise<number> {\n const result = await validateExtension(source);\n printValidation(result);\n if (!result.ok) {\n console.error(\"Refusing to install: fix the errors above.\");\n return 1;\n }\n\n // Install into a named subdirectory so the slug never degenerates to the\n // scope name. A bare file installs as <name>.<ext>; a directory as <name>/.\n const destName = basename(source);\n const dest = join(destDir, destName);\n mkdirSync(destDir, { recursive: true });\n // Reinstalling over an existing install is how updates work: replace it.\n const replaced = existsSync(dest);\n if (replaced) rmSync(dest, { recursive: true, force: true });\n cpSync(source, dest, { recursive: true });\n\n const scopeLabel =\n args.scope === \"global\" ? \"all conversations\" : `conversation ${args.conversationId}`;\n const dataDir =\n args.scope === \"global\"\n ? join(args.stateDir, \"global\", \"extension-data\", result.slug)\n : join(args.stateDir, \"conversations\", args.conversationId!, \"extension-data\", result.slug);\n const verb = replaced ? \"Reinstalled\" : \"Installed\";\n console.log(`\\n${verb} ${result.name} (slug: ${result.slug}) for ${scopeLabel}.`);\n console.log(` code: ${dest}`);\n console.log(` data: ${dataDir} (created on first use, preserved on reinstall)`);\n console.log(\"Run /pi-new in the conversation to activate.\");\n return 0;\n}\n\nfunction listAction(args: ExtArgs): number {\n // List the requested scope, or both when no conversation is given.\n const dirs = args.conversationId\n ? defaultExtensionDirs(args.conversationId, args.stateDir)\n : [join(args.stateDir, \"global\", \"extensions\")];\n const installed = listInstalledExtensions(dirs);\n if (installed.length === 0) {\n console.log(\"No extensions installed.\");\n return 0;\n }\n for (const info of installed) {\n const scope = basename(resolve(info.dir, \"..\")) === \"global\" ? \"global\" : \"conversation\";\n const version = info.version ? `@${info.version}` : \"\";\n console.log(`${info.name}${version} [${scope}] slug=${info.slug}`);\n if (info.description) console.log(` ${info.description}`);\n if (info.skillNames.length > 0) console.log(` skills: ${info.skillNames.join(\", \")}`);\n }\n return 0;\n}\n\nfunction removeAction(args: ExtArgs): number {\n if (!args.target) {\n console.error(\"ext remove: missing <slug>\");\n return 1;\n }\n let destDir: string;\n try {\n destDir = scopeExtensionsDir(args);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n return 1;\n }\n // Match by installed slug so the caller doesn't need the exact dir name.\n const match = listInstalledExtensions([destDir]).find((info) => info.slug === args.target);\n if (!match) {\n console.error(`No extension with slug '${args.target}' in ${destDir}`);\n return 1;\n }\n // match.path is the entrypoint. Dir-form: its parent is the extension dir to\n // remove. Bare-file: the parent is the scan dir, so remove the file itself.\n const parent = resolve(match.path, \"..\");\n const removeTarget = parent === resolve(destDir) ? match.path : parent;\n rmSync(removeTarget, { recursive: true, force: true });\n console.log(`Removed ${match.name} (slug: ${match.slug}). Data left in place.`);\n console.log(\"Run /pi-new in the conversation to apply.\");\n return 0;\n}\n\nfunction printValidation(result: {\n ok: boolean;\n name: string;\n slug: string;\n version?: string;\n entrypoint?: string;\n skillNames: string[];\n errors: string[];\n warnings: string[];\n}): void {\n console.log(`${result.name}${result.version ? `@${result.version}` : \"\"} (slug: ${result.slug})`);\n if (result.entrypoint) console.log(` entrypoint: ${result.entrypoint}`);\n if (result.skillNames.length > 0) console.log(` skills: ${result.skillNames.join(\", \")}`);\n for (const warning of result.warnings) console.log(` warning: ${warning}`);\n for (const error of result.errors) console.error(` error: ${error}`);\n console.log(result.ok ? \" ✓ valid\" : \" ✗ invalid\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ext.js","sourceRoot":"","sources":["../../src/cli/ext.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `mikan ext` — manage extensions from the CLI.\n *\n * mikan ext install <source> [--global | --conversation <id>] [--state-dir <dir>]\n * mikan ext validate <path>\n * mikan ext list [--conversation <id>] [--state-dir <dir>]\n * mikan ext remove <slug> (--global | --conversation <id>) [--state-dir <dir>]\n *\n * `<source>` is a local path or a git URL (https://…, git@…, or github:owner/repo)\n * with an optional `#subpath` for extensions inside a repo. Reinstalling over an\n * existing extension updates it (data is preserved). Extensions install into the\n * host-only state dir (never the workspace); see src/harness/extensions/LAYOUT.md.\n */\nimport { cpSync, existsSync, mkdirSync, rmSync } from \"node:fs\";\nimport { basename, join, resolve } from \"node:path\";\nimport {\n defaultExtensionDirs,\n listInstalledExtensions,\n validateExtension,\n} from \"../harness/index.js\";\nimport { resolveStateDir, takeValueFlag } from \"./arg-grammar.js\";\nimport { runExtDevCommand } from \"./ext-dev.js\";\nimport { parseGitSource, resolveGitSource } from \"./ext-git.js\";\nimport { officeStateDir } from \"../office-address.js\";\nimport { resolveOwnedOfficeAddress } from \"../office-registry.js\";\n\ninterface ExtArgs {\n action?: string;\n target?: string;\n stateDir: string;\n scope: \"global\" | \"conversation\" | undefined;\n conversationId?: string;\n}\n\nfunction parseExtArgs(argv: string[]): ExtArgs {\n // Shares the daemon's state-dir precedence: --state-dir > env > ~/.mikan.\n const stateDir = resolveStateDir(argv);\n let scope: ExtArgs[\"scope\"];\n let conversationId: string | undefined;\n const positional: string[] = [];\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n let taken;\n if (arg === \"--global\") scope = \"global\";\n else if ((taken = takeValueFlag(argv, i, \"--conversation\"))) {\n scope = \"conversation\";\n conversationId = taken.value || undefined;\n i = taken.lastIndex;\n } else if ((taken = takeValueFlag(argv, i, \"--state-dir\"))) {\n i = taken.lastIndex; // value already folded in by resolveStateDir\n } else positional.push(arg);\n }\n\n return { action: positional[0], target: positional[1], stateDir, scope, conversationId };\n}\n\n/** Directory that extension CODE for the chosen scope lives in. */\nfunction scopeExtensionsDir(args: ExtArgs): string {\n if (args.scope === \"global\") return join(args.stateDir, \"global\", \"extensions\");\n if (args.scope === \"conversation\" && args.conversationId) {\n // defaultExtensionDirs returns [global, conversation]; take the conversation one.\n return defaultExtensionDirs(\n resolveOwnedOfficeAddress(args.conversationId, args.stateDir),\n args.stateDir,\n )[1];\n }\n throw new Error(\"Specify a scope: --global or --conversation <id>\");\n}\n\nconst USAGE = `Usage:\n mikan ext dev <path> [--workspace <dir>] [--state-dir <dir>]\n Run an extension in a local stdin/stdout conversation — no Slack, no\n install. Edit, send /pi-new, test again.\n mikan ext install <source> (--global | --conversation <id>) [--state-dir <dir>]\n <source>: a local path, or a git URL / github:owner/repo with optional #subpath\n e.g. github:geminixiang/mikan#examples/extensions/agent-pm\n Reinstalling over an existing extension updates it (data preserved).\n mikan ext validate <path>\n mikan ext list [--conversation <id>] [--state-dir <dir>]\n mikan ext remove <slug> (--global | --conversation <id>) [--state-dir <dir>]`;\n\nfunction noop(): void {}\n\nexport async function runExtCommand(argv: string[]): Promise<number> {\n const args = parseExtArgs(argv);\n\n switch (args.action) {\n case \"dev\":\n // Parsed by the dev command itself: it takes different flags.\n return runExtDevCommand(argv.slice(1));\n case \"validate\":\n return validateAction(args);\n case \"install\":\n return installAction(args);\n case \"list\":\n return listAction(args);\n case \"remove\":\n return removeAction(args);\n default:\n console.error(USAGE);\n return 1;\n }\n}\n\nasync function validateAction(args: ExtArgs): Promise<number> {\n if (!args.target) {\n console.error(\"ext validate: missing <path>\");\n return 1;\n }\n const result = await validateExtension(resolve(args.target));\n printValidation(result);\n return result.ok ? 0 : 1;\n}\n\nasync function installAction(args: ExtArgs): Promise<number> {\n if (!args.target) {\n console.error(\"ext install: missing <path>\");\n return 1;\n }\n let destDir: string;\n try {\n destDir = scopeExtensionsDir(args);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n return 1;\n }\n\n // Resolve the source: a git URL (optionally with #subpath) is cloned to a\n // temp dir; a local path is used directly.\n const gitSpec = parseGitSource(args.target);\n let source: string;\n let cleanup = noop;\n if (gitSpec) {\n try {\n const resolved = resolveGitSource(gitSpec);\n source = resolved.dir;\n cleanup = resolved.cleanup;\n } catch (err) {\n console.error(`Failed to fetch ${gitSpec.url}: ${err instanceof Error ? err.message : err}`);\n return 1;\n }\n } else {\n source = resolve(args.target);\n }\n\n try {\n return await installResolved(args, source, destDir);\n } finally {\n cleanup();\n }\n}\n\nasync function installResolved(args: ExtArgs, source: string, destDir: string): Promise<number> {\n const result = await validateExtension(source);\n printValidation(result);\n if (!result.ok) {\n console.error(\"Refusing to install: fix the errors above.\");\n return 1;\n }\n\n // Install into a named subdirectory so the slug never degenerates to the\n // scope name. A bare file installs as <name>.<ext>; a directory as <name>/.\n const destName = basename(source);\n const dest = join(destDir, destName);\n mkdirSync(destDir, { recursive: true });\n // Reinstalling over an existing install is how updates work: replace it.\n const replaced = existsSync(dest);\n if (replaced) rmSync(dest, { recursive: true, force: true });\n cpSync(source, dest, { recursive: true });\n\n const scopeLabel =\n args.scope === \"global\" ? \"all conversations\" : `conversation ${args.conversationId}`;\n const dataDir =\n args.scope === \"global\"\n ? join(args.stateDir, \"global\", \"extension-data\", result.slug)\n : join(\n officeStateDir(\n args.stateDir,\n resolveOwnedOfficeAddress(args.conversationId!, args.stateDir),\n ),\n \"extension-data\",\n result.slug,\n );\n const verb = replaced ? \"Reinstalled\" : \"Installed\";\n console.log(`\\n${verb} ${result.name} (slug: ${result.slug}) for ${scopeLabel}.`);\n console.log(` code: ${dest}`);\n console.log(` data: ${dataDir} (created on first use, preserved on reinstall)`);\n console.log(\"Run /pi-new in the conversation to activate.\");\n return 0;\n}\n\nfunction listAction(args: ExtArgs): number {\n // List the requested scope, or both when no conversation is given.\n const dirs = args.conversationId\n ? defaultExtensionDirs(\n resolveOwnedOfficeAddress(args.conversationId, args.stateDir),\n args.stateDir,\n )\n : [join(args.stateDir, \"global\", \"extensions\")];\n const installed = listInstalledExtensions(dirs);\n if (installed.length === 0) {\n console.log(\"No extensions installed.\");\n return 0;\n }\n for (const info of installed) {\n const scope = basename(resolve(info.dir, \"..\")) === \"global\" ? \"global\" : \"conversation\";\n const version = info.version ? `@${info.version}` : \"\";\n console.log(`${info.name}${version} [${scope}] slug=${info.slug}`);\n if (info.description) console.log(` ${info.description}`);\n if (info.skillNames.length > 0) console.log(` skills: ${info.skillNames.join(\", \")}`);\n }\n return 0;\n}\n\nfunction removeAction(args: ExtArgs): number {\n if (!args.target) {\n console.error(\"ext remove: missing <slug>\");\n return 1;\n }\n let destDir: string;\n try {\n destDir = scopeExtensionsDir(args);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n return 1;\n }\n // Match by installed slug so the caller doesn't need the exact dir name.\n const match = listInstalledExtensions([destDir]).find((info) => info.slug === args.target);\n if (!match) {\n console.error(`No extension with slug '${args.target}' in ${destDir}`);\n return 1;\n }\n // match.path is the entrypoint. Dir-form: its parent is the extension dir to\n // remove. Bare-file: the parent is the scan dir, so remove the file itself.\n const parent = resolve(match.path, \"..\");\n const removeTarget = parent === resolve(destDir) ? match.path : parent;\n rmSync(removeTarget, { recursive: true, force: true });\n console.log(`Removed ${match.name} (slug: ${match.slug}). Data left in place.`);\n console.log(\"Run /pi-new in the conversation to apply.\");\n return 0;\n}\n\nfunction printValidation(result: {\n ok: boolean;\n name: string;\n slug: string;\n version?: string;\n entrypoint?: string;\n skillNames: string[];\n errors: string[];\n warnings: string[];\n}): void {\n console.log(`${result.name}${result.version ? `@${result.version}` : \"\"} (slug: ${result.slug})`);\n if (result.entrypoint) console.log(` entrypoint: ${result.entrypoint}`);\n if (result.skillNames.length > 0) console.log(` skills: ${result.skillNames.join(\", \")}`);\n for (const warning of result.warnings) console.log(` warning: ${warning}`);\n for (const error of result.errors) console.error(` error: ${error}`);\n console.log(result.ok ? \" ✓ valid\" : \" ✗ invalid\");\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"office.d.ts","sourceRoot":"","sources":["../../src/cli/office.ts"],"names":[],"mappings":"AAoBA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CA2BvD"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mikan office` — inspect and claim conversation offices from the CLI.
|
|
3
|
+
*
|
|
4
|
+
* mikan office list [--state-dir <dir>] [--workspace <dir>]
|
|
5
|
+
* mikan office claim <conversationId> <platform> [--state-dir <dir>] [--workspace <dir>]
|
|
6
|
+
*
|
|
7
|
+
* `claim` records which platform owns a legacy raw-id conversation directory
|
|
8
|
+
* when several platforms are enabled and boot cannot infer ownership. The
|
|
9
|
+
* daemon performs the actual move on its next start. Run it with the daemon
|
|
10
|
+
* stopped so the directory is not moving under a live runtime.
|
|
11
|
+
*/
|
|
12
|
+
import { join, resolve } from "node:path";
|
|
13
|
+
import { assertPlatformName } from "../office-address.js";
|
|
14
|
+
import { OfficeRegistry } from "../office-registry.js";
|
|
15
|
+
import { resolveStateDir, takeValueFlag } from "./arg-grammar.js";
|
|
16
|
+
const USAGE = `Usage:
|
|
17
|
+
mikan office list [--state-dir <dir>] [--workspace <dir>]
|
|
18
|
+
mikan office claim <conversationId> <platform> [--state-dir <dir>] [--workspace <dir>]`;
|
|
19
|
+
export function runOfficeCommand(argv) {
|
|
20
|
+
const stateDir = resolveStateDir(argv);
|
|
21
|
+
let workspaceArg;
|
|
22
|
+
const positional = [];
|
|
23
|
+
for (let i = 0; i < argv.length; i++) {
|
|
24
|
+
const arg = argv[i];
|
|
25
|
+
let taken;
|
|
26
|
+
if ((taken = takeValueFlag(argv, i, "--workspace"))) {
|
|
27
|
+
workspaceArg = taken.value;
|
|
28
|
+
i = taken.lastIndex;
|
|
29
|
+
}
|
|
30
|
+
else if ((taken = takeValueFlag(argv, i, "--state-dir"))) {
|
|
31
|
+
i = taken.lastIndex; // consumed by resolveStateDir above
|
|
32
|
+
}
|
|
33
|
+
else if (arg.startsWith("-")) {
|
|
34
|
+
console.error(`Unknown flag: ${arg}\n${USAGE}`);
|
|
35
|
+
return 1;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
positional.push(arg);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const workspaceRoot = workspaceArg ? resolve(workspaceArg) : join(stateDir, "workspace");
|
|
42
|
+
const [action, ...rest] = positional;
|
|
43
|
+
if (action === "list")
|
|
44
|
+
return listOffices(stateDir);
|
|
45
|
+
if (action === "claim")
|
|
46
|
+
return claimOffice(stateDir, workspaceRoot, rest);
|
|
47
|
+
console.error(USAGE);
|
|
48
|
+
return 1;
|
|
49
|
+
}
|
|
50
|
+
function listOffices(stateDir) {
|
|
51
|
+
const state = new OfficeRegistry(stateDir).getState();
|
|
52
|
+
console.log(`Enabled platforms: ${state.enabledPlatforms.join(", ") || "(none)"}`);
|
|
53
|
+
console.log(`Offices (${state.offices.length}):`);
|
|
54
|
+
for (const office of state.offices) {
|
|
55
|
+
console.log(` ${office.platform} ${office.conversationId}`);
|
|
56
|
+
}
|
|
57
|
+
const pending = state.migrations.filter((record) => record.status !== "committed");
|
|
58
|
+
if (pending.length > 0) {
|
|
59
|
+
console.log(`Pending migrations (${pending.length}):`);
|
|
60
|
+
for (const record of pending) {
|
|
61
|
+
const error = record.error ? ` (${record.error})` : "";
|
|
62
|
+
console.log(` ${record.status} ${record.rawConversationId}${error}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
function claimOffice(stateDir, workspaceRoot, rest) {
|
|
68
|
+
const [rawConversationId, platform] = rest;
|
|
69
|
+
if (!rawConversationId || !platform) {
|
|
70
|
+
console.error(USAGE);
|
|
71
|
+
return 1;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const record = new OfficeRegistry(stateDir).prepareLegacyMigration({
|
|
75
|
+
rawConversationId,
|
|
76
|
+
sourceDir: join(workspaceRoot, rawConversationId),
|
|
77
|
+
workspaceRoot,
|
|
78
|
+
ownerPlatform: assertPlatformName(platform),
|
|
79
|
+
});
|
|
80
|
+
console.log(`Claimed ${record.rawConversationId} for ${record.ownerPlatform}; ` +
|
|
81
|
+
"the daemon migrates the directory on its next start.");
|
|
82
|
+
return 0;
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
86
|
+
return 1;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=office.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"office.js","sourceRoot":"","sources":["../../src/cli/office.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `mikan office` — inspect and claim conversation offices from the CLI.\n *\n * mikan office list [--state-dir <dir>] [--workspace <dir>]\n * mikan office claim <conversationId> <platform> [--state-dir <dir>] [--workspace <dir>]\n *\n * `claim` records which platform owns a legacy raw-id conversation directory\n * when several platforms are enabled and boot cannot infer ownership. The\n * daemon performs the actual move on its next start. Run it with the daemon\n * stopped so the directory is not moving under a live runtime.\n */\nimport { join, resolve } from \"node:path\";\nimport { assertPlatformName } from \"../office-address.js\";\nimport { OfficeRegistry } from \"../office-registry.js\";\nimport { resolveStateDir, takeValueFlag } from \"./arg-grammar.js\";\n\nconst USAGE = `Usage:\n mikan office list [--state-dir <dir>] [--workspace <dir>]\n mikan office claim <conversationId> <platform> [--state-dir <dir>] [--workspace <dir>]`;\n\nexport function runOfficeCommand(argv: string[]): number {\n const stateDir = resolveStateDir(argv);\n let workspaceArg: string | undefined;\n const positional: string[] = [];\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n let taken;\n if ((taken = takeValueFlag(argv, i, \"--workspace\"))) {\n workspaceArg = taken.value;\n i = taken.lastIndex;\n } else if ((taken = takeValueFlag(argv, i, \"--state-dir\"))) {\n i = taken.lastIndex; // consumed by resolveStateDir above\n } else if (arg.startsWith(\"-\")) {\n console.error(`Unknown flag: ${arg}\\n${USAGE}`);\n return 1;\n } else {\n positional.push(arg);\n }\n }\n const workspaceRoot = workspaceArg ? resolve(workspaceArg) : join(stateDir, \"workspace\");\n const [action, ...rest] = positional;\n\n if (action === \"list\") return listOffices(stateDir);\n if (action === \"claim\") return claimOffice(stateDir, workspaceRoot, rest);\n console.error(USAGE);\n return 1;\n}\n\nfunction listOffices(stateDir: string): number {\n const state = new OfficeRegistry(stateDir).getState();\n console.log(`Enabled platforms: ${state.enabledPlatforms.join(\", \") || \"(none)\"}`);\n console.log(`Offices (${state.offices.length}):`);\n for (const office of state.offices) {\n console.log(` ${office.platform} ${office.conversationId}`);\n }\n const pending = state.migrations.filter((record) => record.status !== \"committed\");\n if (pending.length > 0) {\n console.log(`Pending migrations (${pending.length}):`);\n for (const record of pending) {\n const error = record.error ? ` (${record.error})` : \"\";\n console.log(` ${record.status} ${record.rawConversationId}${error}`);\n }\n }\n return 0;\n}\n\nfunction claimOffice(stateDir: string, workspaceRoot: string, rest: string[]): number {\n const [rawConversationId, platform] = rest;\n if (!rawConversationId || !platform) {\n console.error(USAGE);\n return 1;\n }\n try {\n const record = new OfficeRegistry(stateDir).prepareLegacyMigration({\n rawConversationId,\n sourceDir: join(workspaceRoot, rawConversationId),\n workspaceRoot,\n ownerPlatform: assertPlatformName(platform),\n });\n console.log(\n `Claimed ${record.rawConversationId} for ${record.ownerPlatform}; ` +\n \"the daemon migrates the directory on its next start.\",\n );\n return 0;\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n return 1;\n }\n}\n"]}
|
package/dist/cli/types.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { SandboxConfig } from "../sandbox/types.js";
|
|
2
2
|
export interface BootPlan {
|
|
3
|
-
mode: "ext" | "env" | "help" | "version" | "onboard" | "download" | "run";
|
|
3
|
+
mode: "ext" | "office" | "env" | "help" | "version" | "onboard" | "download" | "run";
|
|
4
4
|
/** argv after `ext`, handed to runExtCommand. Only set for mode "ext". */
|
|
5
5
|
extArgs?: string[];
|
|
6
|
+
/** argv after `office`, handed to runOfficeCommand. Only set for mode "office". */
|
|
7
|
+
officeArgs?: string[];
|
|
6
8
|
stateDir: string;
|
|
7
9
|
/** Resolved working directory; defaults to `<stateDir>/workspace`. */
|
|
8
10
|
workingDir: string;
|
package/dist/cli/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;IACrF,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,mFAAmF;IACnF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,kBAAkB,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB"}
|
package/dist/cli/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { SandboxConfig } from \"../sandbox/types.js\";\n\nexport interface BootPlan {\n mode: \"ext\" | \"env\" | \"help\" | \"version\" | \"onboard\" | \"download\" | \"run\";\n /** argv after `ext`, handed to runExtCommand. Only set for mode \"ext\". */\n extArgs?: string[];\n stateDir: string;\n /** Resolved working directory; defaults to `<stateDir>/workspace`. */\n workingDir: string;\n /** True when the working directory came from argv (then it is not auto-created). */\n workingDirExplicit: boolean;\n sandbox: SandboxConfig;\n downloadChannel?: string;\n}\n\nexport interface ResolvedGitSource {\n /** Local directory holding the extension (clone root or a subpath within). */\n dir: string;\n /** Remove the temporary clone. */\n cleanup: () => void;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { SandboxConfig } from \"../sandbox/types.js\";\n\nexport interface BootPlan {\n mode: \"ext\" | \"office\" | \"env\" | \"help\" | \"version\" | \"onboard\" | \"download\" | \"run\";\n /** argv after `ext`, handed to runExtCommand. Only set for mode \"ext\". */\n extArgs?: string[];\n /** argv after `office`, handed to runOfficeCommand. Only set for mode \"office\". */\n officeArgs?: string[];\n stateDir: string;\n /** Resolved working directory; defaults to `<stateDir>/workspace`. */\n workingDir: string;\n /** True when the working directory came from argv (then it is not auto-created). */\n workingDirExplicit: boolean;\n sandbox: SandboxConfig;\n downloadChannel?: string;\n}\n\nexport interface ResolvedGitSource {\n /** Local directory holding the extension (clone root or a subpath within). */\n dir: string;\n /** Remove the temporary clone. */\n cleanup: () => void;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-reply.d.ts","sourceRoot":"","sources":["../../src/commands/auto-reply.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-reply.d.ts","sourceRoot":"","sources":["../../src/commands/auto-reply.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAyCjE;;GAEG;AACH,qBAAa,uBAAwB,YAAW,cAAc;IACtD,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAsCzD;CACF"}
|
|
@@ -3,6 +3,7 @@ import { loadConversationAutoReplyConfig, saveConversationAutoReplyConfig, } fro
|
|
|
3
3
|
import { slashForms } from "./manifest.js";
|
|
4
4
|
import { matchCommand } from "./parse.js";
|
|
5
5
|
import { formatCommandSummary, replyDiagnosticWithContext } from "./utils.js";
|
|
6
|
+
import { conversationOfficeDir } from "../office-address.js";
|
|
6
7
|
const AUTO_REPLY_COMMANDS = slashForms("auto-reply");
|
|
7
8
|
function parseAutoReplyCommand(text) {
|
|
8
9
|
const matched = matchCommand(text, AUTO_REPLY_COMMANDS, { stripMention: true });
|
|
@@ -53,7 +54,7 @@ export class AutoReplyCommandHandler {
|
|
|
53
54
|
await replyDiagnosticWithContext(context.responder, formatCommandSummary("Auto Reply", ["Usage: `/pi-auto-reply on|off|status`"]), { style: "muted" });
|
|
54
55
|
return true;
|
|
55
56
|
}
|
|
56
|
-
const conversationDir =
|
|
57
|
+
const conversationDir = conversationOfficeDir(context.services.workingDir, context.address);
|
|
57
58
|
const current = loadConversationAutoReplyConfig(conversationDir);
|
|
58
59
|
const next = applyAction(current, action);
|
|
59
60
|
if (action.type === "on" || (action.type === "off" && current.enabled)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-reply.js","sourceRoot":"","sources":["../../src/commands/auto-reply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAEL,+BAA+B,EAC/B,+BAA+B,GAChC,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-reply.js","sourceRoot":"","sources":["../../src/commands/auto-reply.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"path\";\nimport {\n type AutoReplyConfig,\n loadConversationAutoReplyConfig,\n saveConversationAutoReplyConfig,\n} from \"../config.js\";\nimport { slashForms } from \"./manifest.js\";\nimport { matchCommand } from \"./parse.js\";\nimport type { CommandContext, CommandHandler } from \"./types.js\";\nimport { formatCommandSummary, replyDiagnosticWithContext } from \"./utils.js\";\nimport { conversationOfficeDir } from \"../office-address.js\";\n\ntype AutoReplyAction = { type: \"status\" } | { type: \"on\" } | { type: \"off\" } | { type: \"invalid\" };\n\nconst AUTO_REPLY_COMMANDS = slashForms(\"auto-reply\");\n\nfunction parseAutoReplyCommand(text: string): AutoReplyAction | null {\n const matched = matchCommand(text, AUTO_REPLY_COMMANDS, { stripMention: true });\n if (!matched) return null;\n if (matched.args.length === 0) return { type: \"status\" };\n\n const lower = matched.args.join(\" \").toLowerCase();\n if (lower === \"status\") return { type: \"status\" };\n if (lower === \"on\" || lower === \"enable\" || lower === \"enabled\") return { type: \"on\" };\n if (lower === \"off\" || lower === \"disable\" || lower === \"disabled\") return { type: \"off\" };\n\n return { type: \"invalid\" };\n}\n\nfunction formatAutoReplyStatus(config: AutoReplyConfig): string {\n const lines = [`Auto-reply is ${config.enabled ? \"enabled\" : \"disabled\"} for this channel.`];\n if (config.rules.length > 0) {\n lines.push(`Current rules: ${config.rules.join(\"; \")}`);\n }\n return formatCommandSummary(\"Auto Reply\", lines);\n}\n\nfunction applyAction(current: AutoReplyConfig, action: AutoReplyAction): AutoReplyConfig {\n switch (action.type) {\n case \"status\":\n case \"invalid\":\n return current;\n case \"on\":\n return { ...current, enabled: true };\n case \"off\":\n return { ...current, enabled: false };\n }\n}\n\n/**\n * @deprecated Auto-reply is kept for compatibility while its future is undecided.\n */\nexport class AutoReplyCommandHandler implements CommandHandler {\n async tryHandle(context: CommandContext): Promise<boolean> {\n const action = parseAutoReplyCommand(context.commandText);\n if (!action) return false;\n\n if (context.privateConversation) {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Auto Reply\", [\"只能在 group/channel 裡設定。\"]),\n { style: \"muted\" },\n );\n return true;\n }\n\n if (action.type === \"invalid\") {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Auto Reply\", [\"Usage: `/pi-auto-reply on|off|status`\"]),\n { style: \"muted\" },\n );\n return true;\n }\n\n const conversationDir = conversationOfficeDir(context.services.workingDir, context.address);\n const current = loadConversationAutoReplyConfig(conversationDir);\n const next = applyAction(current, action);\n if (action.type === \"on\" || (action.type === \"off\" && current.enabled)) {\n saveConversationAutoReplyConfig(conversationDir, next);\n }\n\n const status = formatAutoReplyStatus(next);\n const text =\n action.type === \"on\"\n ? `${status}\\nEdit rules at: \\`${join(conversationDir, \"auto-reply\")}\\``\n : status;\n await replyDiagnosticWithContext(context.responder, text, {\n style: \"muted\",\n });\n return true;\n }\n}\n"]}
|
|
@@ -20,7 +20,7 @@ export class ExtensionsCommandHandler {
|
|
|
20
20
|
const matched = matchCommand(context.commandText, EXTENSIONS_COMMANDS, { stripMention: true });
|
|
21
21
|
if (!matched)
|
|
22
22
|
return false;
|
|
23
|
-
const dirs = defaultExtensionDirs(context.
|
|
23
|
+
const dirs = defaultExtensionDirs(context.address, effectiveStateDir());
|
|
24
24
|
const installed = listInstalledExtensions(dirs);
|
|
25
25
|
// A root-level index file means an extension's contents were copied into
|
|
26
26
|
// the scope directory itself; the loader skips it (the slug would
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../src/commands/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,mBAAmB,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,OAAO,wBAAwB;IACnC,KAAK,CAAC,SAAS,CAAC,OAAuB;QACrC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,mBAAmB,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/F,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE3B,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../src/commands/extensions.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport { defaultExtensionDirs, listInstalledExtensions } from \"../harness/index.js\";\nimport { effectiveStateDir } from \"../cli/arg-grammar.js\";\nimport { slashForms } from \"./manifest.js\";\nimport { matchCommand } from \"./parse.js\";\nimport type { CommandContext, CommandHandler } from \"./types.js\";\nimport { replyDiagnosticWithContext } from \"./utils.js\";\n\nconst EXTENSIONS_COMMANDS = slashForms(\"extensions\");\n\n/**\n * `/pi-extensions` — inventory of extensions installed for this conversation.\n *\n * Discovery-only (nothing is imported or activated): it reports what is on\n * disk under the host-only state dir, for both the `global` scope and this\n * conversation's scope. Doubles as the user-facing answer to \"why can the\n * bot suddenly do X\" and the operator-facing answer to \"what is installed\n * where\".\n */\nexport class ExtensionsCommandHandler implements CommandHandler {\n async tryHandle(context: CommandContext): Promise<boolean> {\n const matched = matchCommand(context.commandText, EXTENSIONS_COMMANDS, { stripMention: true });\n if (!matched) return false;\n\n const dirs = defaultExtensionDirs(context.address, effectiveStateDir());\n const installed = listInstalledExtensions(dirs);\n\n // A root-level index file means an extension's contents were copied into\n // the scope directory itself; the loader skips it (the slug would\n // degenerate to the scope name). Surface that here, not just in logs.\n const misinstalled = dirs.filter((dir) =>\n [\"index.mjs\", \"index.js\"].some((file) => existsSync(join(dir, file))),\n );\n const misinstallLines = misinstalled.map(\n (dir) =>\n `⚠️ \\`${dir}/index.mjs\\` 位於範圍根目錄,已被忽略 — 請移入具名子目錄(如 \\`${dir}/my-ext/\\`)。`,\n );\n\n if (installed.length === 0 && misinstallLines.length === 0) {\n await replyDiagnosticWithContext(\n context.responder,\n [\n \"_Extensions_\",\n \"沒有安裝任何 extension。\",\n `安裝位置:\\`${dirs[0]}\\`(所有會話)或 \\`${dirs[1]}\\`(僅此會話)。`,\n ].join(\"\\n\"),\n { style: \"muted\" },\n );\n return true;\n }\n\n const lines = [\"_Extensions_\", ...misinstallLines];\n for (const info of installed) {\n // info.dir ends in `<scope>/extensions`; the scope is its parent segment\n // (`global` or a conversation id).\n const scope = basename(dirname(info.dir)) === \"global\" ? \"global\" : \"this conversation\";\n const version = info.version ? `@${info.version}` : \"\";\n const slug = info.slug !== info.name ? ` (slug: ${info.slug})` : \"\";\n lines.push(`• *${info.name}*${version} — ${scope}${slug}`);\n if (info.description) lines.push(` ${info.description}`);\n if (info.skillNames.length > 0) lines.push(` skills: ${info.skillNames.join(\", \")}`);\n }\n lines.push(\"_(安裝/移除後,對話輸入 `/pi-new` 生效)_\");\n\n await replyDiagnosticWithContext(context.responder, lines.join(\"\\n\"), { style: \"muted\" });\n return true;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMrF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CA0BzE;AAyCD,qBAAa,mBAAoB,YAAW,cAAc;IAClD,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAoGzD;CACF"}
|