@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,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kimi Extension Installer
|
|
3
|
+
*
|
|
4
|
+
* Handles installation of the bundled CodeMie skill into Kimi's user skills
|
|
5
|
+
* directory at ~/.kimi-code/skills/codemie-kimi.
|
|
6
|
+
*
|
|
7
|
+
* Extends BaseExtensionInstaller to provide Kimi-specific paths.
|
|
8
|
+
* All installation logic is inherited from the base class.
|
|
9
|
+
*
|
|
10
|
+
* @module agents/plugins/kimi/extension-installer
|
|
11
|
+
*/
|
|
12
|
+
import { join, dirname } from 'path';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
import { access } from 'fs/promises';
|
|
15
|
+
import { constants } from 'fs';
|
|
16
|
+
import { BaseExtensionInstaller } from '../../core/extension/BaseExtensionInstaller.js';
|
|
17
|
+
import { getKimiUserSkillsDir } from './kimi.paths.js';
|
|
18
|
+
/**
|
|
19
|
+
* Kimi Extension Installer
|
|
20
|
+
*
|
|
21
|
+
* Installs the bundled CodeMie skill for Kimi Code CLI.
|
|
22
|
+
*/
|
|
23
|
+
export class KimiExtensionInstaller extends BaseExtensionInstaller {
|
|
24
|
+
/**
|
|
25
|
+
* Constructor
|
|
26
|
+
* @param metadata - Agent metadata containing name, displayName, etc.
|
|
27
|
+
*/
|
|
28
|
+
constructor(metadata) {
|
|
29
|
+
super(metadata.name); // Pass agent name to parent
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get the source extension directory path
|
|
33
|
+
* Works in both development and npm package contexts
|
|
34
|
+
*/
|
|
35
|
+
getSourcePath() {
|
|
36
|
+
return join(dirname(fileURLToPath(import.meta.url)), 'extension');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get the target installation directory
|
|
40
|
+
* @returns ${KIMI_CODE_HOME:-~/.kimi-code}/skills/codemie-kimi
|
|
41
|
+
*/
|
|
42
|
+
getTargetPath() {
|
|
43
|
+
return join(getKimiUserSkillsDir(), 'codemie-kimi');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get the manifest file path (relative to base directory)
|
|
47
|
+
* @returns manifest.json
|
|
48
|
+
*/
|
|
49
|
+
getManifestPath() {
|
|
50
|
+
return 'manifest.json';
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get list of critical files that must exist after installation
|
|
54
|
+
* @returns Array of relative file paths
|
|
55
|
+
*/
|
|
56
|
+
getCriticalFiles() {
|
|
57
|
+
return ['manifest.json', 'SKILL.md'];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if the Kimi extension is already installed and read its version.
|
|
61
|
+
*
|
|
62
|
+
* Verifies that the target directory, manifest, and SKILL.md all exist and
|
|
63
|
+
* are readable. Returns null if any of these checks fail.
|
|
64
|
+
*/
|
|
65
|
+
async getInstalledInfo() {
|
|
66
|
+
try {
|
|
67
|
+
const targetPath = this.getTargetPath();
|
|
68
|
+
await access(targetPath, constants.F_OK);
|
|
69
|
+
await access(join(targetPath, this.getManifestPath()), constants.R_OK);
|
|
70
|
+
await access(join(targetPath, 'SKILL.md'), constants.R_OK);
|
|
71
|
+
const version = await this.getVersion(targetPath);
|
|
72
|
+
return { installed: true, version };
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=kimi.extension-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.extension-installer.js","sourceRoot":"","sources":["../../../../src/agents/plugins/kimi/kimi.extension-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAExF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,OAAO,sBAAuB,SAAQ,sBAAsB;IAChE;;;OAGG;IACH,YAAY,QAAuB;QACjC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,4BAA4B;IACpD,CAAC;IAED;;;OAGG;IACO,aAAa;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACpE,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,cAAc,CAAC,CAAC;IACtD,CAAC;IAED;;;OAGG;IACO,eAAe;QACvB,OAAO,eAAe,CAAC;IACzB,CAAC;IAED;;;OAGG;IACO,gBAAgB;QACxB,OAAO,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACO,KAAK,CAAC,gBAAgB;QAC9B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACvE,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAClD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idempotent injector for CodeMie lifecycle hooks into Kimi's global config.
|
|
3
|
+
*
|
|
4
|
+
* Kimi Code supports lifecycle hooks in `~/.kimi-code/config.toml` under
|
|
5
|
+
* `[[hooks]]` entries. This component registers the hooks CodeMie needs to
|
|
6
|
+
* observe and react to Kimi sessions while leaving user-managed configuration
|
|
7
|
+
* intact.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Result shape for hook injection.
|
|
11
|
+
*/
|
|
12
|
+
export interface HookInjectionResult {
|
|
13
|
+
success: boolean;
|
|
14
|
+
created: boolean;
|
|
15
|
+
configPath: string;
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const MANAGED_MARKER = "# CodeMie-managed hooks - do not edit manually";
|
|
19
|
+
/**
|
|
20
|
+
* Injects and restores CodeMie lifecycle hooks in Kimi's config.toml.
|
|
21
|
+
*/
|
|
22
|
+
export declare class KimiHookConfigInjector {
|
|
23
|
+
/**
|
|
24
|
+
* Idempotently inject CodeMie hooks into `~/.kimi-code/config.toml`.
|
|
25
|
+
*/
|
|
26
|
+
inject(): Promise<HookInjectionResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Restore the original config from its CodeMie backup, if one exists.
|
|
29
|
+
*/
|
|
30
|
+
restore(): Promise<HookInjectionResult>;
|
|
31
|
+
private loadTomlModule;
|
|
32
|
+
private backupConfig;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=kimi.hook-config-injector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.hook-config-injector.d.ts","sourceRoot":"","sources":["../../../../src/agents/plugins/kimi/kimi.hook-config-injector.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAOH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiBD,eAAO,MAAM,cAAc,mDAAmD,CAAC;AAY/E;;GAEG;AACH,qBAAa,sBAAsB;IACjC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA4F5C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,mBAAmB,CAAC;YAqB/B,cAAc;YAUd,YAAY;CAY3B"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// src/agents/plugins/kimi/kimi.hook-config-injector.ts
|
|
2
|
+
/**
|
|
3
|
+
* Idempotent injector for CodeMie lifecycle hooks into Kimi's global config.
|
|
4
|
+
*
|
|
5
|
+
* Kimi Code supports lifecycle hooks in `~/.kimi-code/config.toml` under
|
|
6
|
+
* `[[hooks]]` entries. This component registers the hooks CodeMie needs to
|
|
7
|
+
* observe and react to Kimi sessions while leaving user-managed configuration
|
|
8
|
+
* intact.
|
|
9
|
+
*/
|
|
10
|
+
import { access, copyFile, readFile, writeFile } from 'fs/promises';
|
|
11
|
+
import { logger } from '../../../utils/logger.js';
|
|
12
|
+
import { ConfigurationError, getErrorMessage } from '../../../utils/errors.js';
|
|
13
|
+
import { getKimiConfigPath } from './kimi.paths.js';
|
|
14
|
+
/**
|
|
15
|
+
* Events CodeMie subscribes to in Kimi Code, mapped to their hook timeouts.
|
|
16
|
+
*/
|
|
17
|
+
const MANAGED_EVENTS = [
|
|
18
|
+
{ event: 'SessionStart', timeout: 5 },
|
|
19
|
+
// SessionEnd must flush pending metrics to the CodeMie API. On a busy
|
|
20
|
+
// local/remote server this can take 10-15s, so keep the hook alive long
|
|
21
|
+
// enough for the sync to complete and session files to be renamed.
|
|
22
|
+
{ event: 'SessionEnd', timeout: 60 },
|
|
23
|
+
{ event: 'UserPromptSubmit', timeout: 5 },
|
|
24
|
+
{ event: 'Stop', timeout: 5 },
|
|
25
|
+
{ event: 'SubagentStop', timeout: 5 },
|
|
26
|
+
{ event: 'PreCompact', timeout: 5 },
|
|
27
|
+
];
|
|
28
|
+
export const MANAGED_MARKER = '# CodeMie-managed hooks - do not edit manually';
|
|
29
|
+
const COMMAND = 'codemie hook';
|
|
30
|
+
/**
|
|
31
|
+
* Injects and restores CodeMie lifecycle hooks in Kimi's config.toml.
|
|
32
|
+
*/
|
|
33
|
+
export class KimiHookConfigInjector {
|
|
34
|
+
/**
|
|
35
|
+
* Idempotently inject CodeMie hooks into `~/.kimi-code/config.toml`.
|
|
36
|
+
*/
|
|
37
|
+
async inject() {
|
|
38
|
+
const configPath = getKimiConfigPath();
|
|
39
|
+
try {
|
|
40
|
+
const toml = await this.loadTomlModule();
|
|
41
|
+
const configExists = await access(configPath).then(() => true).catch(() => false);
|
|
42
|
+
let created = false;
|
|
43
|
+
let existingContent;
|
|
44
|
+
if (!configExists) {
|
|
45
|
+
created = true;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
existingContent = await readFile(configPath, 'utf-8');
|
|
49
|
+
}
|
|
50
|
+
const parsedConfig = existingContent !== undefined
|
|
51
|
+
? toml.parse(existingContent)
|
|
52
|
+
: {};
|
|
53
|
+
if (!Array.isArray(parsedConfig.hooks)) {
|
|
54
|
+
parsedConfig.hooks = [];
|
|
55
|
+
}
|
|
56
|
+
// If CodeMie-managed hooks are already present, update their timeouts
|
|
57
|
+
// when they differ instead of appending duplicates.
|
|
58
|
+
const managedEventTimeouts = new Map(MANAGED_EVENTS.map(e => [e.event, e.timeout]));
|
|
59
|
+
let updatedExisting = false;
|
|
60
|
+
for (const hook of parsedConfig.hooks) {
|
|
61
|
+
if (typeof hook === 'object' &&
|
|
62
|
+
hook !== null &&
|
|
63
|
+
hook.command === COMMAND &&
|
|
64
|
+
typeof hook.event === 'string' &&
|
|
65
|
+
managedEventTimeouts.has(hook.event)) {
|
|
66
|
+
const expectedTimeout = managedEventTimeouts.get(hook.event);
|
|
67
|
+
if (hook.timeout !== expectedTimeout) {
|
|
68
|
+
hook.timeout = expectedTimeout;
|
|
69
|
+
updatedExisting = true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (updatedExisting) {
|
|
74
|
+
await this.backupConfig(configPath);
|
|
75
|
+
const serialized = toml.stringify(parsedConfig);
|
|
76
|
+
const contentWithMarker = `${MANAGED_MARKER}\n${serialized}`;
|
|
77
|
+
await writeFile(configPath, contentWithMarker, 'utf-8');
|
|
78
|
+
logger.info('Updated CodeMie-managed hook timeouts in Kimi config.', { configPath });
|
|
79
|
+
return { success: true, created: false, configPath };
|
|
80
|
+
}
|
|
81
|
+
// Already injected and up to date
|
|
82
|
+
if (existingContent?.includes(MANAGED_MARKER)) {
|
|
83
|
+
logger.info('Kimi config already contains CodeMie-managed hooks; skipping injection.', {
|
|
84
|
+
configPath,
|
|
85
|
+
});
|
|
86
|
+
return { success: true, created: false, configPath };
|
|
87
|
+
}
|
|
88
|
+
for (const { event, timeout } of MANAGED_EVENTS) {
|
|
89
|
+
parsedConfig.hooks.push({
|
|
90
|
+
event,
|
|
91
|
+
command: COMMAND,
|
|
92
|
+
timeout,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
if (!created) {
|
|
96
|
+
await this.backupConfig(configPath);
|
|
97
|
+
}
|
|
98
|
+
const serialized = toml.stringify(parsedConfig);
|
|
99
|
+
const contentWithMarker = `${MANAGED_MARKER}\n${serialized}`;
|
|
100
|
+
await writeFile(configPath, contentWithMarker, 'utf-8');
|
|
101
|
+
if (created) {
|
|
102
|
+
logger.info('Created Kimi config with CodeMie-managed hooks.', { configPath });
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
logger.info('Injected CodeMie-managed hooks into existing Kimi config.', { configPath });
|
|
106
|
+
}
|
|
107
|
+
return { success: true, created, configPath };
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
const message = getErrorMessage(error);
|
|
111
|
+
logger.error('Failed to inject CodeMie hooks into Kimi config.', error);
|
|
112
|
+
return { success: false, created: false, configPath, error: message };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Restore the original config from its CodeMie backup, if one exists.
|
|
117
|
+
*/
|
|
118
|
+
async restore() {
|
|
119
|
+
const configPath = getKimiConfigPath();
|
|
120
|
+
const backupPath = `${configPath}.codemie-backup`;
|
|
121
|
+
const backupExists = await access(backupPath).then(() => true).catch(() => false);
|
|
122
|
+
if (!backupExists) {
|
|
123
|
+
logger.info('No Kimi config backup found; nothing to restore.', { configPath });
|
|
124
|
+
return { success: true, created: false, configPath };
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
await copyFile(backupPath, configPath);
|
|
128
|
+
logger.info('Restored Kimi config from CodeMie backup.', { configPath, backupPath });
|
|
129
|
+
return { success: true, created: false, configPath };
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
const message = getErrorMessage(error);
|
|
133
|
+
logger.error('Failed to restore Kimi config from CodeMie backup.', error);
|
|
134
|
+
return { success: false, created: false, configPath, error: message };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async loadTomlModule() {
|
|
138
|
+
try {
|
|
139
|
+
return await import('@iarna/toml');
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
throw new ConfigurationError(`Unable to load @iarna/toml. Run "npm install @iarna/toml" to enable Kimi hook injection. ${getErrorMessage(error)}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async backupConfig(configPath) {
|
|
146
|
+
const backupPath = `${configPath}.codemie-backup`;
|
|
147
|
+
const backupExists = await access(backupPath).then(() => true).catch(() => false);
|
|
148
|
+
if (backupExists) {
|
|
149
|
+
logger.debug('Kimi config backup already exists; skipping backup creation.', {
|
|
150
|
+
configPath,
|
|
151
|
+
backupPath,
|
|
152
|
+
});
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
await copyFile(configPath, backupPath);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=kimi.hook-config-injector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.hook-config-injector.js","sourceRoot":"","sources":["../../../../src/agents/plugins/kimi/kimi.hook-config-injector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kimi hook payload transformer.
|
|
3
|
+
*
|
|
4
|
+
* Kimi emits lifecycle hooks as JSON on stdin with Kimi-specific field names.
|
|
5
|
+
* Unlike Claude and Gemini, Kimi payloads do not include a transcript path;
|
|
6
|
+
* the transformer computes it from the working directory and session id using
|
|
7
|
+
* the same deterministic layout Kimi uses for its session storage.
|
|
8
|
+
*/
|
|
9
|
+
import type { BaseHookEvent, HookTransformer } from '../../core/types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Transforms Kimi hook payloads to CodeMie's internal BaseHookEvent format.
|
|
12
|
+
*/
|
|
13
|
+
export declare class KimiHookTransformer implements HookTransformer {
|
|
14
|
+
readonly agentName = "kimi";
|
|
15
|
+
/**
|
|
16
|
+
* Transform a Kimi hook event into the internal BaseHookEvent shape.
|
|
17
|
+
*
|
|
18
|
+
* @param event - Raw JSON payload received from Kimi on stdin
|
|
19
|
+
* @returns Transformed event compatible with CodeMie hook handlers
|
|
20
|
+
*/
|
|
21
|
+
transform(event: unknown): BaseHookEvent;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=kimi.hook-transformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.hook-transformer.d.ts","sourceRoot":"","sources":["../../../../src/agents/plugins/kimi/kimi.hook-transformer.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG1E;;GAEG;AACH,qBAAa,mBAAoB,YAAW,eAAe;IACzD,QAAQ,CAAC,SAAS,UAAU;IAE5B;;;;;OAKG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa;CA6BzC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// src/agents/plugins/kimi/kimi.hook-transformer.ts
|
|
2
|
+
/**
|
|
3
|
+
* Kimi hook payload transformer.
|
|
4
|
+
*
|
|
5
|
+
* Kimi emits lifecycle hooks as JSON on stdin with Kimi-specific field names.
|
|
6
|
+
* Unlike Claude and Gemini, Kimi payloads do not include a transcript path;
|
|
7
|
+
* the transformer computes it from the working directory and session id using
|
|
8
|
+
* the same deterministic layout Kimi uses for its session storage.
|
|
9
|
+
*/
|
|
10
|
+
import { getKimiMainWirePath } from './kimi.paths.js';
|
|
11
|
+
/**
|
|
12
|
+
* Transforms Kimi hook payloads to CodeMie's internal BaseHookEvent format.
|
|
13
|
+
*/
|
|
14
|
+
export class KimiHookTransformer {
|
|
15
|
+
agentName = 'kimi';
|
|
16
|
+
/**
|
|
17
|
+
* Transform a Kimi hook event into the internal BaseHookEvent shape.
|
|
18
|
+
*
|
|
19
|
+
* @param event - Raw JSON payload received from Kimi on stdin
|
|
20
|
+
* @returns Transformed event compatible with CodeMie hook handlers
|
|
21
|
+
*/
|
|
22
|
+
transform(event) {
|
|
23
|
+
const payload = event;
|
|
24
|
+
const sessionId = typeof payload.session_id === 'string' ? payload.session_id : '';
|
|
25
|
+
const cwd = typeof payload.cwd === 'string' ? payload.cwd : process.cwd();
|
|
26
|
+
const hookEventName = typeof payload.hook_event_name === 'string' ? payload.hook_event_name : '';
|
|
27
|
+
const transformed = {
|
|
28
|
+
hook_event_name: hookEventName,
|
|
29
|
+
session_id: sessionId,
|
|
30
|
+
transcript_path: sessionId ? getKimiMainWirePath(cwd, sessionId) : '',
|
|
31
|
+
permission_mode: 'default',
|
|
32
|
+
cwd,
|
|
33
|
+
};
|
|
34
|
+
if (typeof payload.source === 'string') {
|
|
35
|
+
transformed.source = payload.source;
|
|
36
|
+
}
|
|
37
|
+
if (typeof payload.reason === 'string') {
|
|
38
|
+
transformed.reason = payload.reason;
|
|
39
|
+
}
|
|
40
|
+
if (typeof payload.stop_hook_active === 'boolean') {
|
|
41
|
+
transformed.stop_hook_active = payload.stop_hook_active;
|
|
42
|
+
}
|
|
43
|
+
return transformed;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=kimi.hook-transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.hook-transformer.js","sourceRoot":"","sources":["../../../../src/agents/plugins/kimi/kimi.hook-transformer.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD;;;;;;;GAOG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD;;GAEG;AACH,MAAM,OAAO,mBAAmB;IACrB,SAAS,GAAG,MAAM,CAAC;IAE5B;;;;;OAKG;IACH,SAAS,CAAC,KAAc;QACtB,MAAM,OAAO,GAAG,KAAgC,CAAC;QAEjD,MAAM,SAAS,GAAG,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,MAAM,GAAG,GAAG,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1E,MAAM,aAAa,GAAG,OAAO,OAAO,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QAEjG,MAAM,WAAW,GAAkB;YACjC,eAAe,EAAE,aAAa;YAC9B,UAAU,EAAE,SAAS;YACrB,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;YACrE,eAAe,EAAE,SAAS;YAC1B,GAAG;SACJ,CAAC;QAEF,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACvC,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QACtC,CAAC;QAED,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACvC,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QACtC,CAAC;QAED,IAAI,OAAO,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YAClD,WAAW,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QAC1D,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface KimiModelResolution {
|
|
2
|
+
selectedModel: string;
|
|
3
|
+
availableModels: string[];
|
|
4
|
+
}
|
|
5
|
+
export declare function isKimiCompatibleModelName(modelName: string | undefined): modelName is string;
|
|
6
|
+
export declare function resolveKimiModel(env: NodeJS.ProcessEnv): Promise<KimiModelResolution>;
|
|
7
|
+
export declare function assertExplicitKimiModelAllowed(model: string, availableModels: string[]): void;
|
|
8
|
+
//# sourceMappingURL=kimi.models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.models.d.ts","sourceRoot":"","sources":["../../../../src/agents/plugins/kimi/kimi.models.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAmDD,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,IAAI,MAAM,CAI5F;AA2FD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgD3F;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAc7F"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { fetchCodeMieLlmModels } from '../../../providers/plugins/sso/sso.http-client.js';
|
|
2
|
+
import { CodeMieSSO } from '../../../providers/plugins/sso/sso.auth.js';
|
|
3
|
+
import { ConfigurationError } from '../../../utils/errors.js';
|
|
4
|
+
import { logger } from '../../../utils/logger.js';
|
|
5
|
+
const INCOMPATIBLE_MODEL_PATTERNS = [
|
|
6
|
+
/anthropic/i,
|
|
7
|
+
/claude/i,
|
|
8
|
+
/sonnet/i,
|
|
9
|
+
/opus/i,
|
|
10
|
+
/haiku/i,
|
|
11
|
+
/codex/i,
|
|
12
|
+
/^gpt[-.]?/i,
|
|
13
|
+
/gemini/i,
|
|
14
|
+
/qwen/i,
|
|
15
|
+
/deepseek/i,
|
|
16
|
+
/llama/i,
|
|
17
|
+
/mistral/i,
|
|
18
|
+
/grok/i,
|
|
19
|
+
];
|
|
20
|
+
const COMPATIBLE_KIMI_MODEL_PATTERNS = [
|
|
21
|
+
/kimi/i,
|
|
22
|
+
/moonshot/i,
|
|
23
|
+
/moonshotai/i,
|
|
24
|
+
];
|
|
25
|
+
function getModelId(model) {
|
|
26
|
+
const candidates = [
|
|
27
|
+
model.deployment_name,
|
|
28
|
+
model.base_name,
|
|
29
|
+
model.label,
|
|
30
|
+
];
|
|
31
|
+
const compatibleCandidates = candidates.filter(isKimiCompatibleModelName);
|
|
32
|
+
const apiIdentifier = compatibleCandidates.find(candidate => !/\s/.test(candidate));
|
|
33
|
+
return apiIdentifier || compatibleCandidates[0];
|
|
34
|
+
}
|
|
35
|
+
function getSearchText(model) {
|
|
36
|
+
return [
|
|
37
|
+
model.deployment_name,
|
|
38
|
+
model.base_name,
|
|
39
|
+
model.label,
|
|
40
|
+
model.provider,
|
|
41
|
+
].filter(Boolean).join(' ').toLowerCase();
|
|
42
|
+
}
|
|
43
|
+
export function isKimiCompatibleModelName(modelName) {
|
|
44
|
+
if (!modelName)
|
|
45
|
+
return false;
|
|
46
|
+
if (INCOMPATIBLE_MODEL_PATTERNS.some(pattern => pattern.test(modelName)))
|
|
47
|
+
return false;
|
|
48
|
+
return COMPATIBLE_KIMI_MODEL_PATTERNS.some(pattern => pattern.test(modelName));
|
|
49
|
+
}
|
|
50
|
+
function isKimiCompatibleModel(model) {
|
|
51
|
+
if (!model.enabled)
|
|
52
|
+
return false;
|
|
53
|
+
const id = getModelId(model);
|
|
54
|
+
if (!id)
|
|
55
|
+
return false;
|
|
56
|
+
const searchText = getSearchText(model);
|
|
57
|
+
if (INCOMPATIBLE_MODEL_PATTERNS.some(pattern => pattern.test(searchText))) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return COMPATIBLE_KIMI_MODEL_PATTERNS.some(pattern => pattern.test(searchText));
|
|
61
|
+
}
|
|
62
|
+
function extractKimiVersionParts(text) {
|
|
63
|
+
const lower = text.toLowerCase();
|
|
64
|
+
const k2Match = lower.match(/kimi[-.]?k2(?:[-.](\d+))?(?:[-.](\d+))?/);
|
|
65
|
+
const genericMatch = lower.match(/kimi.*?(\d+)(?:[-.](\d+))?(?:[-.](\d+))?/);
|
|
66
|
+
const match = k2Match || genericMatch;
|
|
67
|
+
return [
|
|
68
|
+
match?.[1],
|
|
69
|
+
match?.[2],
|
|
70
|
+
match?.[3],
|
|
71
|
+
].map(part => part ? Number(part) : 0);
|
|
72
|
+
}
|
|
73
|
+
function rankModel(model) {
|
|
74
|
+
const id = getModelId(model);
|
|
75
|
+
if (!id) {
|
|
76
|
+
throw new ConfigurationError('Cannot rank Kimi model without a compatible model ID');
|
|
77
|
+
}
|
|
78
|
+
const searchText = getSearchText(model);
|
|
79
|
+
const preferredK26Bonus = /kimi[-_.]?k2[-_.]?6(?:[-_.]|$)/i.test(searchText) ? 1 : 0;
|
|
80
|
+
const k2Bonus = /kimi[-_.]?k2/i.test(searchText) ? 1 : 0;
|
|
81
|
+
const toolBonus = model.features?.tools === false ? 0 : 1;
|
|
82
|
+
const streamingBonus = model.features?.streaming === false ? 0 : 1;
|
|
83
|
+
const defaultBonus = model.default ? 1 : 0;
|
|
84
|
+
return {
|
|
85
|
+
model,
|
|
86
|
+
id,
|
|
87
|
+
score: [
|
|
88
|
+
preferredK26Bonus,
|
|
89
|
+
k2Bonus,
|
|
90
|
+
...extractKimiVersionParts(searchText),
|
|
91
|
+
toolBonus,
|
|
92
|
+
streamingBonus,
|
|
93
|
+
defaultBonus,
|
|
94
|
+
],
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function compareRankedModels(a, b) {
|
|
98
|
+
const max = Math.max(a.score.length, b.score.length);
|
|
99
|
+
for (let i = 0; i < max; i++) {
|
|
100
|
+
const diff = (b.score[i] ?? 0) - (a.score[i] ?? 0);
|
|
101
|
+
if (diff !== 0)
|
|
102
|
+
return diff;
|
|
103
|
+
}
|
|
104
|
+
return a.id.localeCompare(b.id);
|
|
105
|
+
}
|
|
106
|
+
async function fetchCodeMieModelsForKimi(env) {
|
|
107
|
+
const jwtToken = env.CODEMIE_JWT_TOKEN;
|
|
108
|
+
const baseUrl = env.CODEMIE_BASE_URL;
|
|
109
|
+
if (jwtToken && baseUrl) {
|
|
110
|
+
logger.debug('[kimi-models] Fetching CodeMie model list via JWT auth');
|
|
111
|
+
return fetchCodeMieLlmModels(baseUrl, jwtToken);
|
|
112
|
+
}
|
|
113
|
+
const codeMieUrl = env.CODEMIE_URL;
|
|
114
|
+
if (codeMieUrl) {
|
|
115
|
+
const sso = new CodeMieSSO();
|
|
116
|
+
const credentials = await sso.getStoredCredentials(codeMieUrl);
|
|
117
|
+
if (!credentials) {
|
|
118
|
+
throw new ConfigurationError(`SSO credentials not found for ${codeMieUrl}. Run: codemie profile login --url ${codeMieUrl}`);
|
|
119
|
+
}
|
|
120
|
+
logger.debug('[kimi-models] Fetching CodeMie model list via SSO auth');
|
|
121
|
+
return fetchCodeMieLlmModels(credentials.apiUrl, credentials.cookies);
|
|
122
|
+
}
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
export async function resolveKimiModel(env) {
|
|
126
|
+
const currentModel = env.CODEMIE_MODEL;
|
|
127
|
+
let rawModels = [];
|
|
128
|
+
try {
|
|
129
|
+
rawModels = await fetchCodeMieModelsForKimi(env);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
if (isKimiCompatibleModelName(currentModel)) {
|
|
133
|
+
const configuredModel = currentModel;
|
|
134
|
+
logger.debug('[kimi-models] Failed to fetch CodeMie models; keeping compatible configured model', {
|
|
135
|
+
error: error instanceof Error ? error.message : String(error),
|
|
136
|
+
model: configuredModel,
|
|
137
|
+
});
|
|
138
|
+
return { selectedModel: configuredModel, availableModels: [configuredModel] };
|
|
139
|
+
}
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
const rankedModels = rawModels
|
|
143
|
+
.filter(isKimiCompatibleModel)
|
|
144
|
+
.map(rankModel)
|
|
145
|
+
.sort(compareRankedModels);
|
|
146
|
+
if (rankedModels.length === 0) {
|
|
147
|
+
if (isKimiCompatibleModelName(currentModel)) {
|
|
148
|
+
const configuredModel = currentModel;
|
|
149
|
+
logger.debug('[kimi-models] CodeMie returned no compatible Kimi models; keeping configured Kimi model');
|
|
150
|
+
return { selectedModel: configuredModel, availableModels: [configuredModel] };
|
|
151
|
+
}
|
|
152
|
+
throw new ConfigurationError('No CodeMie Kimi model is available for codemie-kimi. ' +
|
|
153
|
+
'Enable a Kimi/Moonshot deployment in CodeMie before running Kimi Code.');
|
|
154
|
+
}
|
|
155
|
+
const selectedModel = rankedModels[0].id;
|
|
156
|
+
if (currentModel && currentModel !== selectedModel) {
|
|
157
|
+
logger.info(`[kimi-models] Using ${selectedModel} for Kimi instead of profile model ${currentModel}`);
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
selectedModel,
|
|
161
|
+
availableModels: rankedModels.map(entry => entry.id),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
export function assertExplicitKimiModelAllowed(model, availableModels) {
|
|
165
|
+
if (!isKimiCompatibleModelName(model)) {
|
|
166
|
+
throw new ConfigurationError(`Model "${model}" is not compatible with codemie-kimi. ` +
|
|
167
|
+
`Use a Kimi/Moonshot model${availableModels.length ? ` such as: ${availableModels.join(', ')}` : '.'}`);
|
|
168
|
+
}
|
|
169
|
+
if (availableModels.length > 0 && !availableModels.includes(model)) {
|
|
170
|
+
throw new ConfigurationError(`Model "${model}" is not available in CodeMie for codemie-kimi. ` +
|
|
171
|
+
`Available models: ${availableModels.join(', ')}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=kimi.models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.models.js","sourceRoot":"","sources":["../../../../src/agents/plugins/kimi/kimi.models.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAalD,MAAM,2BAA2B,GAAa;IAC5C,YAAY;IACZ,SAAS;IACT,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,SAAS;IACT,OAAO;IACP,WAAW;IACX,QAAQ;IACR,UAAU;IACV,OAAO;CACR,CAAC;AAEF,MAAM,8BAA8B,GAAa;IAC/C,OAAO;IACP,WAAW;IACX,aAAa;CACd,CAAC;AAEF,SAAS,UAAU,CAAC,KAAe;IACjC,MAAM,UAAU,GAAG;QACjB,KAAK,CAAC,eAAe;QACrB,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,KAAK;KACZ,CAAC;IACF,MAAM,oBAAoB,GAAG,UAAU,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;IAC1E,MAAM,aAAa,GAAG,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAEpF,OAAO,aAAa,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,aAAa,CAAC,KAAe;IACpC,OAAO;QACL,KAAK,CAAC,eAAe;QACrB,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,KAAK;QACX,KAAK,CAAC,QAAQ;KACf,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,SAA6B;IACrE,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACvF,OAAO,8BAA8B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAe;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAEjC,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAEtB,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAC1E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,8BAA8B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAE7E,MAAM,KAAK,GAAG,OAAO,IAAI,YAAY,CAAC;IACtC,OAAO;QACL,KAAK,EAAE,CAAC,CAAC,CAAC;QACV,KAAK,EAAE,CAAC,CAAC,CAAC;QACV,KAAK,EAAE,CAAC,CAAC,CAAC;KACX,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,kBAAkB,CAAC,sDAAsD,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,iBAAiB,GAAG,iCAAiC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3C,OAAO;QACL,KAAK;QACL,EAAE;QACF,KAAK,EAAE;YACL,iBAAiB;YACjB,OAAO;YACP,GAAG,uBAAuB,CAAC,UAAU,CAAC;YACtC,SAAS;YACT,cAAc;YACd,YAAY;SACb;KACF,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,CAAkB,EAAE,CAAkB;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,GAAsB;IAC7D,MAAM,QAAQ,GAAG,GAAG,CAAC,iBAAiB,CAAC;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,gBAAgB,CAAC;IAErC,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACvE,OAAO,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC;IACnC,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,kBAAkB,CAC1B,iCAAiC,UAAU,sCAAsC,UAAU,EAAE,CAC9F,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACvE,OAAO,qBAAqB,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAsB;IAC3D,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC;IAEvC,IAAI,SAAS,GAAe,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,yBAAyB,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,yBAAyB,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,MAAM,eAAe,GAAG,YAAY,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,mFAAmF,EAAE;gBAChG,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,KAAK,EAAE,eAAe;aACvB,CAAC,CAAC;YACH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;QAChF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,SAAS;SAC3B,MAAM,CAAC,qBAAqB,CAAC;SAC7B,GAAG,CAAC,SAAS,CAAC;SACd,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAE7B,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,IAAI,yBAAyB,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,MAAM,eAAe,GAAG,YAAY,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,yFAAyF,CAAC,CAAC;YACxG,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;QAChF,CAAC;QAED,MAAM,IAAI,kBAAkB,CAC1B,uDAAuD;YACvD,wEAAwE,CACzE,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzC,IAAI,YAAY,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;QACnD,MAAM,CAAC,IAAI,CACT,uBAAuB,aAAa,sCAAsC,YAAY,EAAE,CACzF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,aAAa;QACb,eAAe,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAAa,EAAE,eAAyB;IACrF,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,kBAAkB,CAC1B,UAAU,KAAK,yCAAyC;YACxD,4BAA4B,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CACvG,CAAC;IACJ,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,kBAAkB,CAC1B,UAAU,KAAK,kDAAkD;YACjE,qBAAqB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClD,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kimi path utilities.
|
|
3
|
+
*
|
|
4
|
+
* Kimi stores session data and user state at:
|
|
5
|
+
* ${KIMI_CODE_HOME:-~/.kimi-code}/sessions/{workDirKey}/{sessionId}/agents/main/wire.jsonl
|
|
6
|
+
*
|
|
7
|
+
* Kimi does not use XDG conventions by default, but it supports KIMI_CODE_HOME
|
|
8
|
+
* for isolating local state.
|
|
9
|
+
*
|
|
10
|
+
* Work directory keys are deterministic: the slug is derived from the resolved
|
|
11
|
+
* directory basename (truncated and sanitized), and the suffix is the first 12
|
|
12
|
+
* characters of a SHA-256 hash of the resolved path. This keeps directory names
|
|
13
|
+
* readable while avoiding collisions between different paths that share the same
|
|
14
|
+
* basename.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Returns the Kimi home directory.
|
|
18
|
+
*
|
|
19
|
+
* Defaults to ${userHome}/.kimi-code unless KIMI_CODE_HOME is set.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getKimiCodeHome(): string;
|
|
22
|
+
/**
|
|
23
|
+
* Returns the path to Kimi's global config file.
|
|
24
|
+
*
|
|
25
|
+
* ${KIMI_CODE_HOME}/config.toml
|
|
26
|
+
*/
|
|
27
|
+
export declare function getKimiConfigPath(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Returns the base directory for all Kimi sessions.
|
|
30
|
+
*
|
|
31
|
+
* ${KIMI_CODE_HOME}/sessions
|
|
32
|
+
*/
|
|
33
|
+
export declare function getKimiSessionsDir(): string;
|
|
34
|
+
/**
|
|
35
|
+
* Encodes a working directory path into a deterministic, filesystem-safe key.
|
|
36
|
+
*
|
|
37
|
+
* The key has the shape:
|
|
38
|
+
* wd_{slug}_{hash}
|
|
39
|
+
*
|
|
40
|
+
* - `slug` is the lowercase basename of the resolved cwd, with non-alphanumeric
|
|
41
|
+
* characters replaced by `-`, leading/trailing dashes stripped, and truncated
|
|
42
|
+
* to 40 characters. If the result is empty, `.`, or `..`, it is replaced with
|
|
43
|
+
* `workspace`.
|
|
44
|
+
* - `hash` is the first 12 characters of the SHA-256 digest of the resolved cwd.
|
|
45
|
+
*/
|
|
46
|
+
export declare function encodeKimiWorkDirKey(cwd: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Returns the session directory for a given cwd and session id.
|
|
49
|
+
*
|
|
50
|
+
* ${KIMI_CODE_HOME}/sessions/{workDirKey}/{sessionId}
|
|
51
|
+
*/
|
|
52
|
+
export declare function getKimiSessionDir(cwd: string, sessionId: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Returns the main agent wire file path for a given cwd and session id.
|
|
55
|
+
*
|
|
56
|
+
* ${KIMI_CODE_HOME}/sessions/{workDirKey}/{sessionId}/agents/main/wire.jsonl
|
|
57
|
+
*/
|
|
58
|
+
export declare function getKimiMainWirePath(cwd: string, sessionId: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* Returns the directory for user-defined Kimi skills.
|
|
61
|
+
*
|
|
62
|
+
* ${KIMI_CODE_HOME}/skills
|
|
63
|
+
*/
|
|
64
|
+
export declare function getKimiUserSkillsDir(): string;
|
|
65
|
+
//# sourceMappingURL=kimi.paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.paths.d.ts","sourceRoot":"","sources":["../../../../src/agents/plugins/kimi/kimi.paths.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;GAcG;AAMH;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAkBxD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAExE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
|