@codemieai/code 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -1
- package/bin/codemie-kimi-acp.js +18 -0
- package/bin/codemie-kimi.js +18 -0
- package/dist/agents/core/AgentCLI.d.ts.map +1 -1
- package/dist/agents/core/AgentCLI.js +4 -0
- package/dist/agents/core/AgentCLI.js.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.js +26 -6
- package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
- package/dist/agents/core/metrics/types.d.ts +4 -1
- package/dist/agents/core/metrics/types.d.ts.map +1 -1
- package/dist/agents/core/session/BaseProcessor.d.ts +2 -0
- package/dist/agents/core/session/BaseProcessor.d.ts.map +1 -1
- package/dist/agents/core/session/BaseSessionAdapter.d.ts +10 -0
- package/dist/agents/core/session/BaseSessionAdapter.d.ts.map +1 -1
- package/dist/agents/core/types.d.ts +30 -0
- package/dist/agents/core/types.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.js +3 -3
- package/dist/agents/plugins/claude/claude.session.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.session.js +29 -7
- package/dist/agents/plugins/claude/claude.session.js.map +1 -1
- package/dist/agents/plugins/claude/session/claude-named-invocations.d.ts +28 -0
- package/dist/agents/plugins/claude/session/claude-named-invocations.d.ts.map +1 -0
- package/dist/agents/plugins/claude/session/claude-named-invocations.js +78 -0
- package/dist/agents/plugins/claude/session/claude-named-invocations.js.map +1 -0
- package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.d.ts.map +1 -1
- package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.js +10 -1
- package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.js.map +1 -1
- package/dist/agents/plugins/gemini/gemini.plugin.js.map +1 -1
- package/dist/agents/plugins/gemini/session/processors/gemini.metrics-processor.d.ts.map +1 -1
- package/dist/agents/plugins/gemini/session/processors/gemini.metrics-processor.js +3 -0
- package/dist/agents/plugins/gemini/session/processors/gemini.metrics-processor.js.map +1 -1
- package/dist/agents/plugins/kimi/extension/SKILL.md +6 -0
- package/dist/agents/plugins/kimi/extension/manifest.json +8 -0
- package/dist/agents/plugins/kimi/kimi-acp.plugin.d.ts +7 -0
- package/dist/agents/plugins/kimi/kimi-acp.plugin.d.ts.map +1 -0
- package/dist/agents/plugins/kimi/kimi-acp.plugin.js +28 -0
- package/dist/agents/plugins/kimi/kimi-acp.plugin.js.map +1 -0
- package/dist/agents/plugins/kimi/kimi.extension-installer.d.ts +56 -0
- package/dist/agents/plugins/kimi/kimi.extension-installer.d.ts.map +1 -0
- package/dist/agents/plugins/kimi/kimi.extension-installer.js +79 -0
- package/dist/agents/plugins/kimi/kimi.extension-installer.js.map +1 -0
- package/dist/agents/plugins/kimi/kimi.hook-config-injector.d.ts +34 -0
- package/dist/agents/plugins/kimi/kimi.hook-config-injector.d.ts.map +1 -0
- package/dist/agents/plugins/kimi/kimi.hook-config-injector.js +158 -0
- package/dist/agents/plugins/kimi/kimi.hook-config-injector.js.map +1 -0
- package/dist/agents/plugins/kimi/kimi.hook-transformer.d.ts +23 -0
- package/dist/agents/plugins/kimi/kimi.hook-transformer.d.ts.map +1 -0
- package/dist/agents/plugins/kimi/kimi.hook-transformer.js +46 -0
- package/dist/agents/plugins/kimi/kimi.hook-transformer.js.map +1 -0
- package/dist/agents/plugins/kimi/kimi.models.d.ts +8 -0
- package/dist/agents/plugins/kimi/kimi.models.d.ts.map +1 -0
- package/dist/agents/plugins/kimi/kimi.models.js +174 -0
- package/dist/agents/plugins/kimi/kimi.models.js.map +1 -0
- package/dist/agents/plugins/kimi/kimi.paths.d.ts +65 -0
- package/dist/agents/plugins/kimi/kimi.paths.d.ts.map +1 -0
- package/dist/agents/plugins/kimi/kimi.paths.js +95 -0
- package/dist/agents/plugins/kimi/kimi.paths.js.map +1 -0
- package/dist/agents/plugins/kimi/kimi.plugin.d.ts +37 -0
- package/dist/agents/plugins/kimi/kimi.plugin.d.ts.map +1 -0
- package/dist/agents/plugins/kimi/kimi.plugin.js +318 -0
- package/dist/agents/plugins/kimi/kimi.plugin.js.map +1 -0
- package/dist/agents/plugins/kimi/kimi.session.d.ts +40 -0
- package/dist/agents/plugins/kimi/kimi.session.d.ts.map +1 -0
- package/dist/agents/plugins/kimi/kimi.session.js +191 -0
- package/dist/agents/plugins/kimi/kimi.session.js.map +1 -0
- package/dist/agents/plugins/kimi/session/processors/kimi.metrics-processor.d.ts +43 -0
- package/dist/agents/plugins/kimi/session/processors/kimi.metrics-processor.d.ts.map +1 -0
- package/dist/agents/plugins/kimi/session/processors/kimi.metrics-processor.js +421 -0
- package/dist/agents/plugins/kimi/session/processors/kimi.metrics-processor.js.map +1 -0
- package/dist/agents/plugins/kimi/session/types.d.ts +81 -0
- package/dist/agents/plugins/kimi/session/types.d.ts.map +1 -0
- package/dist/agents/plugins/kimi/session/types.js +5 -0
- package/dist/agents/plugins/kimi/session/types.js.map +1 -0
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +4 -0
- package/dist/agents/registry.js.map +1 -1
- package/dist/cli/commands/analytics/aggregator.d.ts +14 -0
- package/dist/cli/commands/analytics/aggregator.d.ts.map +1 -1
- package/dist/cli/commands/analytics/aggregator.js +81 -1
- package/dist/cli/commands/analytics/aggregator.js.map +1 -1
- package/dist/cli/commands/analytics/cost/cost-calculator.d.ts +10 -0
- package/dist/cli/commands/analytics/cost/cost-calculator.d.ts.map +1 -1
- package/dist/cli/commands/analytics/cost/cost-calculator.js +9 -5
- package/dist/cli/commands/analytics/cost/cost-calculator.js.map +1 -1
- package/dist/cli/commands/analytics/cost/cost-enricher.d.ts +9 -1
- package/dist/cli/commands/analytics/cost/cost-enricher.d.ts.map +1 -1
- package/dist/cli/commands/analytics/cost/cost-enricher.js +141 -7
- package/dist/cli/commands/analytics/cost/cost-enricher.js.map +1 -1
- package/dist/cli/commands/analytics/cost/dispatch-extractor.d.ts +17 -0
- package/dist/cli/commands/analytics/cost/dispatch-extractor.d.ts.map +1 -0
- package/dist/cli/commands/analytics/cost/dispatch-extractor.js +78 -0
- package/dist/cli/commands/analytics/cost/dispatch-extractor.js.map +1 -0
- package/dist/cli/commands/analytics/cost/pricing.json +9 -2
- package/dist/cli/commands/analytics/cost/types.d.ts +33 -0
- package/dist/cli/commands/analytics/cost/types.d.ts.map +1 -1
- package/dist/cli/commands/analytics/cost/types.js +4 -1
- package/dist/cli/commands/analytics/cost/types.js.map +1 -1
- package/dist/cli/commands/analytics/cost/usage-readers.d.ts +22 -1
- package/dist/cli/commands/analytics/cost/usage-readers.d.ts.map +1 -1
- package/dist/cli/commands/analytics/cost/usage-readers.js +147 -21
- package/dist/cli/commands/analytics/cost/usage-readers.js.map +1 -1
- package/dist/cli/commands/analytics/model-normalizer.d.ts +2 -0
- package/dist/cli/commands/analytics/model-normalizer.d.ts.map +1 -1
- package/dist/cli/commands/analytics/model-normalizer.js +8 -0
- package/dist/cli/commands/analytics/model-normalizer.js.map +1 -1
- package/dist/cli/commands/analytics/native-loader.d.ts.map +1 -1
- package/dist/cli/commands/analytics/native-loader.js +35 -0
- package/dist/cli/commands/analytics/native-loader.js.map +1 -1
- package/dist/cli/commands/analytics/report/client/app.js +685 -53
- package/dist/cli/commands/analytics/report/payload-builder.d.ts.map +1 -1
- package/dist/cli/commands/analytics/report/payload-builder.js +13 -0
- package/dist/cli/commands/analytics/report/payload-builder.js.map +1 -1
- package/dist/cli/commands/analytics/report/template.html +108 -8
- package/dist/cli/commands/analytics/report/types.d.ts +13 -2
- package/dist/cli/commands/analytics/report/types.d.ts.map +1 -1
- package/dist/cli/commands/analytics/types.d.ts +18 -0
- package/dist/cli/commands/analytics/types.d.ts.map +1 -1
- package/dist/cli/commands/hook.d.ts.map +1 -1
- package/dist/cli/commands/hook.js +24 -7
- package/dist/cli/commands/hook.js.map +1 -1
- package/dist/migrations/004-skills-assistants-top-level.migration.d.ts.map +1 -1
- package/dist/migrations/004-skills-assistants-top-level.migration.js +8 -5
- package/dist/migrations/004-skills-assistants-top-level.migration.js.map +1 -1
- package/dist/migrations/005-skill-slug-format.migration.d.ts.map +1 -1
- package/dist/migrations/005-skill-slug-format.migration.js +14 -11
- package/dist/migrations/005-skill-slug-format.migration.js.map +1 -1
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +2 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/plugins/moonshot-subscription/index.d.ts +9 -0
- package/dist/providers/plugins/moonshot-subscription/index.d.ts.map +1 -0
- package/dist/providers/plugins/moonshot-subscription/index.js +9 -0
- package/dist/providers/plugins/moonshot-subscription/index.js.map +1 -0
- package/dist/providers/plugins/moonshot-subscription/moonshot-subscription.setup-steps.d.ts +8 -0
- package/dist/providers/plugins/moonshot-subscription/moonshot-subscription.setup-steps.d.ts.map +1 -0
- package/dist/providers/plugins/moonshot-subscription/moonshot-subscription.setup-steps.js +80 -0
- package/dist/providers/plugins/moonshot-subscription/moonshot-subscription.setup-steps.js.map +1 -0
- package/dist/providers/plugins/moonshot-subscription/moonshot-subscription.template.d.ts +11 -0
- package/dist/providers/plugins/moonshot-subscription/moonshot-subscription.template.d.ts.map +1 -0
- package/dist/providers/plugins/moonshot-subscription/moonshot-subscription.template.js +111 -0
- package/dist/providers/plugins/moonshot-subscription/moonshot-subscription.template.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/index.d.ts +2 -1
- package/dist/providers/plugins/sso/proxy/plugins/index.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/index.js +3 -1
- package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/kimi-request-normalizer.plugin.d.ts +18 -0
- package/dist/providers/plugins/sso/proxy/plugins/kimi-request-normalizer.plugin.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/kimi-request-normalizer.plugin.js +56 -0
- package/dist/providers/plugins/sso/proxy/plugins/kimi-request-normalizer.plugin.js.map +1 -0
- package/dist/providers/plugins/sso/session/processors/conversations/constants.d.ts +1 -1
- package/dist/providers/plugins/sso/session/processors/conversations/constants.js +1 -1
- package/dist/providers/plugins/sso/sso.auth.d.ts +5 -0
- package/dist/providers/plugins/sso/sso.auth.d.ts.map +1 -1
- package/dist/providers/plugins/sso/sso.auth.js +23 -1
- package/dist/providers/plugins/sso/sso.auth.js.map +1 -1
- package/dist/utils/config.d.ts +24 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +83 -8
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/native-installer.d.ts.map +1 -1
- package/dist/utils/native-installer.js +6 -3
- package/dist/utils/native-installer.js.map +1 -1
- package/package.json +5 -1
- package/scripts/copy-plugins.js +5 -0
- package/scripts/test-desktop-telemetry.js +1 -1
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// src/agents/plugins/kimi/kimi.paths.ts
|
|
2
|
+
/**
|
|
3
|
+
* Kimi path utilities.
|
|
4
|
+
*
|
|
5
|
+
* Kimi stores session data and user state at:
|
|
6
|
+
* ${KIMI_CODE_HOME:-~/.kimi-code}/sessions/{workDirKey}/{sessionId}/agents/main/wire.jsonl
|
|
7
|
+
*
|
|
8
|
+
* Kimi does not use XDG conventions by default, but it supports KIMI_CODE_HOME
|
|
9
|
+
* for isolating local state.
|
|
10
|
+
*
|
|
11
|
+
* Work directory keys are deterministic: the slug is derived from the resolved
|
|
12
|
+
* directory basename (truncated and sanitized), and the suffix is the first 12
|
|
13
|
+
* characters of a SHA-256 hash of the resolved path. This keeps directory names
|
|
14
|
+
* readable while avoiding collisions between different paths that share the same
|
|
15
|
+
* basename.
|
|
16
|
+
*/
|
|
17
|
+
import { createHash } from 'crypto';
|
|
18
|
+
import { homedir } from 'os';
|
|
19
|
+
import { basename, join, resolve } from 'path';
|
|
20
|
+
/**
|
|
21
|
+
* Returns the Kimi home directory.
|
|
22
|
+
*
|
|
23
|
+
* Defaults to ${userHome}/.kimi-code unless KIMI_CODE_HOME is set.
|
|
24
|
+
*/
|
|
25
|
+
export function getKimiCodeHome() {
|
|
26
|
+
return process.env.KIMI_CODE_HOME || join(homedir(), '.kimi-code');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Returns the path to Kimi's global config file.
|
|
30
|
+
*
|
|
31
|
+
* ${KIMI_CODE_HOME}/config.toml
|
|
32
|
+
*/
|
|
33
|
+
export function getKimiConfigPath() {
|
|
34
|
+
return join(getKimiCodeHome(), 'config.toml');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Returns the base directory for all Kimi sessions.
|
|
38
|
+
*
|
|
39
|
+
* ${KIMI_CODE_HOME}/sessions
|
|
40
|
+
*/
|
|
41
|
+
export function getKimiSessionsDir() {
|
|
42
|
+
return join(getKimiCodeHome(), 'sessions');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Encodes a working directory path into a deterministic, filesystem-safe key.
|
|
46
|
+
*
|
|
47
|
+
* The key has the shape:
|
|
48
|
+
* wd_{slug}_{hash}
|
|
49
|
+
*
|
|
50
|
+
* - `slug` is the lowercase basename of the resolved cwd, with non-alphanumeric
|
|
51
|
+
* characters replaced by `-`, leading/trailing dashes stripped, and truncated
|
|
52
|
+
* to 40 characters. If the result is empty, `.`, or `..`, it is replaced with
|
|
53
|
+
* `workspace`.
|
|
54
|
+
* - `hash` is the first 12 characters of the SHA-256 digest of the resolved cwd.
|
|
55
|
+
*/
|
|
56
|
+
export function encodeKimiWorkDirKey(cwd) {
|
|
57
|
+
const resolvedCwd = resolve(cwd);
|
|
58
|
+
let slug = basename(resolvedCwd).toLowerCase();
|
|
59
|
+
slug = slug.replace(/[^a-z0-9._-]/g, '-');
|
|
60
|
+
slug = slug.replace(/^-+|-+$/g, '');
|
|
61
|
+
slug = slug.slice(0, 40);
|
|
62
|
+
if (slug === '' || slug === '.' || slug === '..') {
|
|
63
|
+
slug = 'workspace';
|
|
64
|
+
}
|
|
65
|
+
const hash = createHash('sha256')
|
|
66
|
+
.update(resolvedCwd)
|
|
67
|
+
.digest('hex')
|
|
68
|
+
.slice(0, 12);
|
|
69
|
+
return `wd_${slug}_${hash}`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Returns the session directory for a given cwd and session id.
|
|
73
|
+
*
|
|
74
|
+
* ${KIMI_CODE_HOME}/sessions/{workDirKey}/{sessionId}
|
|
75
|
+
*/
|
|
76
|
+
export function getKimiSessionDir(cwd, sessionId) {
|
|
77
|
+
return join(getKimiSessionsDir(), encodeKimiWorkDirKey(cwd), sessionId);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Returns the main agent wire file path for a given cwd and session id.
|
|
81
|
+
*
|
|
82
|
+
* ${KIMI_CODE_HOME}/sessions/{workDirKey}/{sessionId}/agents/main/wire.jsonl
|
|
83
|
+
*/
|
|
84
|
+
export function getKimiMainWirePath(cwd, sessionId) {
|
|
85
|
+
return join(getKimiSessionDir(cwd, sessionId), 'agents', 'main', 'wire.jsonl');
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Returns the directory for user-defined Kimi skills.
|
|
89
|
+
*
|
|
90
|
+
* ${KIMI_CODE_HOME}/skills
|
|
91
|
+
*/
|
|
92
|
+
export function getKimiUserSkillsDir() {
|
|
93
|
+
return join(getKimiCodeHome(), 'skills');
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=kimi.paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.paths.js","sourceRoot":"","sources":["../../../../src/agents/plugins/kimi/kimi.paths.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/C;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACrE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;IAE/C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IAC1C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACpC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzB,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QACjD,IAAI,GAAG,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC;SAC9B,MAAM,CAAC,WAAW,CAAC;SACnB,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhB,OAAO,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,SAAiB;IAC9D,OAAO,IAAI,CAAC,kBAAkB,EAAE,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;AAC1E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,SAAiB;IAChE,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AACjF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { AgentMetadata, HookTransformer } from '../../core/types.js';
|
|
2
|
+
import { BaseAgentAdapter } from '../../core/BaseAgentAdapter.js';
|
|
3
|
+
import type { SessionAdapter } from '../../core/session/BaseSessionAdapter.js';
|
|
4
|
+
import type { BaseExtensionInstaller } from '../../core/extension/BaseExtensionInstaller.js';
|
|
5
|
+
export declare const KimiPluginMetadata: AgentMetadata;
|
|
6
|
+
export declare class KimiPlugin extends BaseAgentAdapter {
|
|
7
|
+
private sessionAdapter?;
|
|
8
|
+
private extensionInstaller?;
|
|
9
|
+
private hookTransformer?;
|
|
10
|
+
constructor(metadata?: AgentMetadata);
|
|
11
|
+
getSessionAdapter(): SessionAdapter;
|
|
12
|
+
getExtensionInstaller(): BaseExtensionInstaller;
|
|
13
|
+
getHookTransformer(): HookTransformer;
|
|
14
|
+
isInstalled(): Promise<boolean>;
|
|
15
|
+
private installNative;
|
|
16
|
+
install(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Uninstall Kimi Code native binary and npm wrapper package.
|
|
19
|
+
*
|
|
20
|
+
* The native installer places the binary at ~/.kimi-code/bin/kimi, while the
|
|
21
|
+
* inherited base uninstall only removes the npm package wrapper. We remove
|
|
22
|
+
* both so that subsequent installs don't incorrectly report Kimi as already
|
|
23
|
+
* installed.
|
|
24
|
+
*/
|
|
25
|
+
uninstall(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Get Kimi version by parsing 'kimi --version' output.
|
|
28
|
+
* Extracts the first semantic version found in the output.
|
|
29
|
+
*
|
|
30
|
+
* Checks the native installer full path first on Unix systems, then falls
|
|
31
|
+
* back to the command in PATH for other installation methods.
|
|
32
|
+
*/
|
|
33
|
+
getVersion(): Promise<string | null>;
|
|
34
|
+
installVersion(version?: string): Promise<void>;
|
|
35
|
+
protected setupProxy(env: NodeJS.ProcessEnv): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=kimi.plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.plugin.d.ts","sourceRoot":"","sources":["../../../../src/agents/plugins/kimi/kimi.plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AA6B7F,eAAO,MAAM,kBAAkB,EAAE,aA8DhC,CAAC;AAEF,qBAAa,UAAW,SAAQ,gBAAgB;IAC9C,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,kBAAkB,CAAC,CAAyB;IACpD,OAAO,CAAC,eAAe,CAAC,CAAkB;gBAE9B,QAAQ,GAAE,aAAkC;IAIxD,iBAAiB,IAAI,cAAc;IAOnC,qBAAqB,IAAI,sBAAsB;IAO/C,kBAAkB,IAAI,eAAe;IAOtB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;YAqChC,aAAa;IA8CZ,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvC;;;;;;;OAOG;IACY,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAmDzC;;;;;;OAMG;IACY,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAwCpC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAuCrC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAW3E"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { BaseAgentAdapter } from '../../core/BaseAgentAdapter.js';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { rm } from 'fs/promises';
|
|
4
|
+
import { KimiSessionAdapter } from './kimi.session.js';
|
|
5
|
+
import { KimiExtensionInstaller } from './kimi.extension-installer.js';
|
|
6
|
+
import { KimiHookTransformer } from './kimi.hook-transformer.js';
|
|
7
|
+
import { assertExplicitKimiModelAllowed, resolveKimiModel } from './kimi.models.js';
|
|
8
|
+
import { installNativeAgent } from '../../../utils/native-installer.js';
|
|
9
|
+
import { AgentInstallationError, createErrorContext, getErrorMessage, } from '../../../utils/errors.js';
|
|
10
|
+
import { isValidSemanticVersion } from '../../../utils/version-utils.js';
|
|
11
|
+
import { logger } from '../../../utils/logger.js';
|
|
12
|
+
import { sanitizeLogArgs } from '../../../utils/security.js';
|
|
13
|
+
import { commandExists, exec, getCommandPath } from '../../../utils/processes.js';
|
|
14
|
+
import { resolveHomeDir } from '../../../utils/paths.js';
|
|
15
|
+
const KIMI_SUPPORTED_VERSION = '0.16.0';
|
|
16
|
+
const KIMI_MINIMUM_SUPPORTED_VERSION = '0.15.0';
|
|
17
|
+
const KIMI_NATIVE_BINARY_PATH = '.kimi-code/bin/kimi';
|
|
18
|
+
const KIMI_INSTALLER_URLS = {
|
|
19
|
+
macOS: 'https://code.kimi.com/kimi-code/install.sh',
|
|
20
|
+
windows: 'https://code.kimi.com/kimi-code/install.ps1',
|
|
21
|
+
linux: 'https://code.kimi.com/kimi-code/install.sh',
|
|
22
|
+
};
|
|
23
|
+
export const KimiPluginMetadata = {
|
|
24
|
+
name: 'kimi',
|
|
25
|
+
displayName: 'Kimi Code',
|
|
26
|
+
description: 'Kimi Code CLI - Moonshot AI coding agent',
|
|
27
|
+
npmPackage: '@moonshot-ai/kimi-code',
|
|
28
|
+
cliCommand: 'kimi',
|
|
29
|
+
supportedVersion: KIMI_SUPPORTED_VERSION,
|
|
30
|
+
minimumSupportedVersion: KIMI_MINIMUM_SUPPORTED_VERSION,
|
|
31
|
+
installerUrls: KIMI_INSTALLER_URLS,
|
|
32
|
+
dataPaths: {
|
|
33
|
+
home: '.kimi-code',
|
|
34
|
+
binary: KIMI_NATIVE_BINARY_PATH,
|
|
35
|
+
},
|
|
36
|
+
envMapping: {
|
|
37
|
+
baseUrl: ['KIMI_MODEL_BASE_URL'],
|
|
38
|
+
apiKey: ['KIMI_MODEL_API_KEY'],
|
|
39
|
+
model: ['KIMI_MODEL_NAME'],
|
|
40
|
+
},
|
|
41
|
+
supportedProviders: ['moonshot-subscription', 'ai-run-sso'],
|
|
42
|
+
blockedModelPatterns: [],
|
|
43
|
+
recommendedModels: ['kimi-k2.6', 'kimi-for-coding', 'kimi-k2'],
|
|
44
|
+
ssoConfig: { enabled: true, clientType: 'codemie-kimi' },
|
|
45
|
+
flagMappings: {
|
|
46
|
+
'--task': { type: 'flag', target: '-p' },
|
|
47
|
+
'--model': { type: 'flag', target: '--model' },
|
|
48
|
+
},
|
|
49
|
+
lifecycle: {
|
|
50
|
+
enrichArgs(args, _config) {
|
|
51
|
+
const explicitModel = getExplicitModelArg(args);
|
|
52
|
+
if (!explicitModel) {
|
|
53
|
+
return args;
|
|
54
|
+
}
|
|
55
|
+
const availableModels = (process.env.CODEMIE_KIMI_AVAILABLE_MODELS || '')
|
|
56
|
+
.split(',')
|
|
57
|
+
.map(model => model.trim())
|
|
58
|
+
.filter(Boolean);
|
|
59
|
+
assertExplicitKimiModelAllowed(explicitModel, availableModels);
|
|
60
|
+
return args;
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
metricsConfig: {
|
|
64
|
+
excludeErrorsFromTools: ['Bash'],
|
|
65
|
+
},
|
|
66
|
+
extensionsConfig: {
|
|
67
|
+
project: '.kimi-code',
|
|
68
|
+
global: '~/.kimi-code',
|
|
69
|
+
skillsEntryFile: 'SKILL.md',
|
|
70
|
+
},
|
|
71
|
+
hookConfig: {
|
|
72
|
+
eventNameMapping: {
|
|
73
|
+
'SessionStart': 'SessionStart',
|
|
74
|
+
'SessionEnd': 'SessionEnd',
|
|
75
|
+
'UserPromptSubmit': 'UserPromptSubmit',
|
|
76
|
+
'Stop': 'Stop',
|
|
77
|
+
'SubagentStop': 'SubagentStop',
|
|
78
|
+
'PreCompact': 'PreCompact',
|
|
79
|
+
'PermissionRequest': 'PermissionRequest',
|
|
80
|
+
'PermissionResult': 'PermissionRequest',
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
export class KimiPlugin extends BaseAgentAdapter {
|
|
85
|
+
sessionAdapter;
|
|
86
|
+
extensionInstaller;
|
|
87
|
+
hookTransformer;
|
|
88
|
+
constructor(metadata = KimiPluginMetadata) {
|
|
89
|
+
super(metadata);
|
|
90
|
+
}
|
|
91
|
+
getSessionAdapter() {
|
|
92
|
+
if (!this.sessionAdapter) {
|
|
93
|
+
this.sessionAdapter = new KimiSessionAdapter(this.metadata);
|
|
94
|
+
}
|
|
95
|
+
return this.sessionAdapter;
|
|
96
|
+
}
|
|
97
|
+
getExtensionInstaller() {
|
|
98
|
+
if (!this.extensionInstaller) {
|
|
99
|
+
this.extensionInstaller = new KimiExtensionInstaller(this.metadata);
|
|
100
|
+
}
|
|
101
|
+
return this.extensionInstaller;
|
|
102
|
+
}
|
|
103
|
+
getHookTransformer() {
|
|
104
|
+
if (!this.hookTransformer) {
|
|
105
|
+
this.hookTransformer = new KimiHookTransformer();
|
|
106
|
+
}
|
|
107
|
+
return this.hookTransformer;
|
|
108
|
+
}
|
|
109
|
+
async isInstalled() {
|
|
110
|
+
if (!this.metadata.cliCommand) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
if (await commandExists(this.metadata.cliCommand)) {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
if (process.platform !== 'win32') {
|
|
117
|
+
// Native installer location
|
|
118
|
+
const nativePath = resolveHomeDir(KIMI_NATIVE_BINARY_PATH);
|
|
119
|
+
try {
|
|
120
|
+
const result = await exec(nativePath, ['--version']);
|
|
121
|
+
if (result.code === 0) {
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// Native path check failed, fall through
|
|
127
|
+
}
|
|
128
|
+
// Legacy / npm location
|
|
129
|
+
const fullPath = resolveHomeDir('.local/bin/kimi');
|
|
130
|
+
try {
|
|
131
|
+
const result = await exec(fullPath, ['--version']);
|
|
132
|
+
return result.code === 0;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Full path check failed, fall through to PATH check already performed
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
logger.debug('[kimi-plugin] Kimi not installed. Install with:');
|
|
139
|
+
logger.debug('[kimi-plugin] codemie install kimi');
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
async installNative(version) {
|
|
143
|
+
if (!this.metadata.installerUrls) {
|
|
144
|
+
throw new AgentInstallationError(this.metadata.name, 'No installer URLs configured for native installation');
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const result = await installNativeAgent(this.metadata.name, this.metadata.installerUrls, version, {
|
|
148
|
+
timeout: 300000,
|
|
149
|
+
verifyCommand: this.metadata.cliCommand || undefined,
|
|
150
|
+
verifyPath: process.platform === 'win32' ? undefined : resolveHomeDir(KIMI_NATIVE_BINARY_PATH),
|
|
151
|
+
});
|
|
152
|
+
if (!result.success) {
|
|
153
|
+
throw new AgentInstallationError(this.metadata.name, `Installation failed. Output: ${result.output}`);
|
|
154
|
+
}
|
|
155
|
+
logger.success(`${this.metadata.displayName} installed successfully`);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
if (error instanceof AgentInstallationError) {
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
const errorContext = createErrorContext(error, {
|
|
162
|
+
agent: this.metadata.name,
|
|
163
|
+
});
|
|
164
|
+
logger.error('Kimi installation failed', ...sanitizeLogArgs(errorContext));
|
|
165
|
+
throw new AgentInstallationError(this.metadata.name, `Failed to install ${this.metadata.displayName}: ${getErrorMessage(error)}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async install() {
|
|
169
|
+
return this.installVersion(undefined);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Uninstall Kimi Code native binary and npm wrapper package.
|
|
173
|
+
*
|
|
174
|
+
* The native installer places the binary at ~/.kimi-code/bin/kimi, while the
|
|
175
|
+
* inherited base uninstall only removes the npm package wrapper. We remove
|
|
176
|
+
* both so that subsequent installs don't incorrectly report Kimi as already
|
|
177
|
+
* installed.
|
|
178
|
+
*/
|
|
179
|
+
async uninstall() {
|
|
180
|
+
const isWindows = process.platform === 'win32';
|
|
181
|
+
const binaryName = isWindows ? 'kimi.exe' : 'kimi';
|
|
182
|
+
const possibleBinaries = new Set();
|
|
183
|
+
// Known native install locations
|
|
184
|
+
possibleBinaries.add(resolveHomeDir(`.kimi-code/bin/${binaryName}`));
|
|
185
|
+
possibleBinaries.add(resolveHomeDir(`.local/bin/${binaryName}`));
|
|
186
|
+
// Also remove any binary found on PATH that belongs to the user
|
|
187
|
+
const pathBinary = await getCommandPath('kimi');
|
|
188
|
+
if (pathBinary) {
|
|
189
|
+
possibleBinaries.add(pathBinary);
|
|
190
|
+
}
|
|
191
|
+
for (const binaryPath of possibleBinaries) {
|
|
192
|
+
try {
|
|
193
|
+
if (existsSync(binaryPath)) {
|
|
194
|
+
await rm(binaryPath, { force: true });
|
|
195
|
+
logger.debug(`[kimi-plugin] Removed binary: ${binaryPath}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
logger.warn(`[kimi-plugin] Could not remove binary ${binaryPath}`, error instanceof Error ? error.message : String(error));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Remove the native install directory if it is now empty
|
|
203
|
+
const installDir = resolveHomeDir('.kimi-code');
|
|
204
|
+
try {
|
|
205
|
+
if (existsSync(installDir)) {
|
|
206
|
+
const { readdir } = await import('fs/promises');
|
|
207
|
+
const entries = await readdir(installDir);
|
|
208
|
+
if (entries.length === 0) {
|
|
209
|
+
await rm(installDir, { recursive: true, force: true });
|
|
210
|
+
logger.debug(`[kimi-plugin] Removed empty install directory: ${installDir}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
logger.warn(`[kimi-plugin] Could not remove install directory ${installDir}`, error instanceof Error ? error.message : String(error));
|
|
216
|
+
}
|
|
217
|
+
// Remove npm wrapper package if present
|
|
218
|
+
await super.uninstall();
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get Kimi version by parsing 'kimi --version' output.
|
|
222
|
+
* Extracts the first semantic version found in the output.
|
|
223
|
+
*
|
|
224
|
+
* Checks the native installer full path first on Unix systems, then falls
|
|
225
|
+
* back to the command in PATH for other installation methods.
|
|
226
|
+
*/
|
|
227
|
+
async getVersion() {
|
|
228
|
+
if (!this.metadata.cliCommand) {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
const parseVersion = (output) => {
|
|
232
|
+
const match = output.match(/(\d+\.\d+\.\d+)/);
|
|
233
|
+
return match ? match[1] : output.trim() || null;
|
|
234
|
+
};
|
|
235
|
+
// Try native installer full path first on Unix systems
|
|
236
|
+
// (native installer places binary at ~/.kimi-code/bin/kimi)
|
|
237
|
+
if (process.platform !== 'win32') {
|
|
238
|
+
const nativePath = resolveHomeDir(KIMI_NATIVE_BINARY_PATH);
|
|
239
|
+
try {
|
|
240
|
+
const result = await exec(nativePath, ['--version']);
|
|
241
|
+
return parseVersion(result.stdout);
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
// Native path check failed, fall through to legacy path
|
|
245
|
+
}
|
|
246
|
+
// Legacy / npm location
|
|
247
|
+
const fullPath = resolveHomeDir('.local/bin/kimi');
|
|
248
|
+
try {
|
|
249
|
+
const result = await exec(fullPath, ['--version']);
|
|
250
|
+
return parseVersion(result.stdout);
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
// Full path check failed, fall through to PATH check
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Fall back to command in PATH
|
|
257
|
+
try {
|
|
258
|
+
const result = await exec(this.metadata.cliCommand, ['--version']);
|
|
259
|
+
return parseVersion(result.stdout);
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
async installVersion(version) {
|
|
266
|
+
// Resolve 'supported' to the version from metadata
|
|
267
|
+
let resolvedVersion = version;
|
|
268
|
+
if (version === 'supported') {
|
|
269
|
+
if (!this.metadata.supportedVersion) {
|
|
270
|
+
throw new AgentInstallationError(this.metadata.name, 'No supported version defined in metadata');
|
|
271
|
+
}
|
|
272
|
+
resolvedVersion = this.metadata.supportedVersion;
|
|
273
|
+
logger.debug('Resolved version', {
|
|
274
|
+
from: 'supported',
|
|
275
|
+
to: resolvedVersion,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
else if (version === 'npm' || version === 'latest' || version === 'stable') {
|
|
279
|
+
// The 'npm', 'latest', and 'stable' channels request the latest build.
|
|
280
|
+
// Kimi uses the native installer, so passing undefined installs the
|
|
281
|
+
// latest version.
|
|
282
|
+
resolvedVersion = undefined;
|
|
283
|
+
}
|
|
284
|
+
// Reject unknown channels and invalid semantic versions.
|
|
285
|
+
if (version) {
|
|
286
|
+
const allowedChannels = ['latest', 'stable', 'supported', 'npm'];
|
|
287
|
+
const isAllowedChannel = allowedChannels.includes(version);
|
|
288
|
+
const isValidVersion = isValidSemanticVersion(version);
|
|
289
|
+
if (!isAllowedChannel && !isValidVersion) {
|
|
290
|
+
throw new AgentInstallationError(this.metadata.name, `Invalid version format: '${version}'. Expected semantic version (e.g., '1.0.0'), 'latest', 'stable', 'supported', or 'npm'.`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
await this.installNative(resolvedVersion);
|
|
294
|
+
}
|
|
295
|
+
async setupProxy(env) {
|
|
296
|
+
if (env.CODEMIE_PROVIDER === 'ai-run-sso' || env.CODEMIE_AUTH_METHOD === 'jwt') {
|
|
297
|
+
// Resolve before BaseAgentAdapter builds the proxy config because CODEMIE_MODEL
|
|
298
|
+
// is part of the proxy startup contract.
|
|
299
|
+
const resolution = await resolveKimiModel(env);
|
|
300
|
+
env.CODEMIE_MODEL = resolution.selectedModel;
|
|
301
|
+
env.CODEMIE_KIMI_AVAILABLE_MODELS = resolution.availableModels.join(',');
|
|
302
|
+
}
|
|
303
|
+
await super.setupProxy(env);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
function getExplicitModelArg(args) {
|
|
307
|
+
for (let i = 0; i < args.length; i++) {
|
|
308
|
+
const arg = args[i];
|
|
309
|
+
if (arg === '-m' || arg === '--model') {
|
|
310
|
+
return args[i + 1];
|
|
311
|
+
}
|
|
312
|
+
if (arg.startsWith('--model=')) {
|
|
313
|
+
return arg.slice('--model='.length);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return undefined;
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=kimi.plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.plugin.js","sourceRoot":"","sources":["../../../../src/agents/plugins/kimi/kimi.plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kimi Session Adapter
|
|
3
|
+
*
|
|
4
|
+
* Parses Kimi Code `wire.jsonl` session transcripts into the unified
|
|
5
|
+
* ParsedSession format used by CodeMie processors.
|
|
6
|
+
*
|
|
7
|
+
* Wire file path:
|
|
8
|
+
* ${KIMI_CODE_HOME}/sessions/{workDirKey}/{sessionId}/agents/main/wire.jsonl
|
|
9
|
+
*/
|
|
10
|
+
import type { SessionAdapter, ParsedSession, AggregatedResult, SessionDiscoveryOptions, SessionDescriptor } from '../../core/session/BaseSessionAdapter.js';
|
|
11
|
+
import type { SessionProcessor, ProcessingContext } from '../../core/session/BaseProcessor.js';
|
|
12
|
+
import type { AgentMetadata } from '../../core/types.js';
|
|
13
|
+
export declare class KimiSessionAdapter implements SessionAdapter {
|
|
14
|
+
private readonly metadata;
|
|
15
|
+
readonly agentName = "kimi";
|
|
16
|
+
private processors;
|
|
17
|
+
constructor(metadata: AgentMetadata);
|
|
18
|
+
private initializeProcessors;
|
|
19
|
+
registerProcessor(processor: SessionProcessor): void;
|
|
20
|
+
/**
|
|
21
|
+
* Discover native Kimi sessions (placeholder).
|
|
22
|
+
*/
|
|
23
|
+
discoverSessions(_options?: SessionDiscoveryOptions): Promise<SessionDescriptor[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Parse a Kimi `wire.jsonl` file into the unified ParsedSession format.
|
|
26
|
+
*/
|
|
27
|
+
parseSessionFile(filePath: string, sessionId: string): Promise<ParsedSession>;
|
|
28
|
+
/**
|
|
29
|
+
* Process a Kimi session file with all registered processors.
|
|
30
|
+
*
|
|
31
|
+
* Parses the wire.jsonl file once, runs each registered processor in priority
|
|
32
|
+
* order, and returns an aggregated result. This is the entry point used by
|
|
33
|
+
* `codemie hook` during incremental sync.
|
|
34
|
+
*/
|
|
35
|
+
processSession(filePath: string, sessionId: string, context: ProcessingContext): Promise<AggregatedResult>;
|
|
36
|
+
private createMinimalSession;
|
|
37
|
+
private extractModel;
|
|
38
|
+
private extractTimestamps;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=kimi.session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.session.d.ts","sourceRoot":"","sources":["../../../../src/agents/plugins/kimi/kimi.session.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,EAClB,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMzD,qBAAa,kBAAmB,YAAW,cAAc;IAI3C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAHrC,QAAQ,CAAC,SAAS,UAAU;IAC5B,OAAO,CAAC,UAAU,CAA0B;gBAEf,QAAQ,EAAE,aAAa;IAMpD,OAAO,CAAC,oBAAoB;IAK5B,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAMpD;;OAEG;IACG,gBAAgB,CAAC,QAAQ,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAKxF;;OAEG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAoCnF;;;;;;OAMG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC;IAmF5B,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,iBAAiB;CA6B1B"}
|