@buyi1net/pi-toolkit 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +45 -0
  3. package/assembler.ts +127 -0
  4. package/config.ts +201 -0
  5. package/i18n.ts +693 -0
  6. package/index.ts +99 -0
  7. package/menu/items.ts +264 -0
  8. package/menu/panels.ts +91 -0
  9. package/menu/settings-list.ts +84 -0
  10. package/menu/theme.ts +31 -0
  11. package/menu/toolkit-menu.ts +139 -0
  12. package/module.ts +156 -0
  13. package/modules/eyes/chain.ts +173 -0
  14. package/modules/eyes/config.ts +319 -0
  15. package/modules/eyes/index.ts +161 -0
  16. package/modules/eyes/menu.ts +828 -0
  17. package/modules/eyes/pi-model-backend.ts +245 -0
  18. package/modules/eyes/resilience.ts +161 -0
  19. package/modules/eyes/vision-bridge.ts +232 -0
  20. package/modules/eyes/vision-cache.ts +86 -0
  21. package/modules/eyes/vision-json.ts +19 -0
  22. package/modules/eyes/vision-preprocess.ts +192 -0
  23. package/modules/eyes/vision-probe.ts +21 -0
  24. package/modules/eyes/vision-prompt.ts +90 -0
  25. package/modules/eyes/vision-tool.ts +59 -0
  26. package/modules/eyes/vision-types.ts +33 -0
  27. package/modules/index.ts +10 -0
  28. package/modules/subagents/agents/researcher.md +51 -0
  29. package/modules/subagents/agents/scout.md +40 -0
  30. package/modules/subagents/agents/worker.md +79 -0
  31. package/modules/subagents/config.json.example +6 -0
  32. package/modules/subagents/config.ts +144 -0
  33. package/modules/subagents/index.ts +91 -0
  34. package/modules/subagents/menu.ts +388 -0
  35. package/modules/subagents/src/activity.ts +511 -0
  36. package/modules/subagents/src/agents.ts +126 -0
  37. package/modules/subagents/src/command.ts +37 -0
  38. package/modules/subagents/src/dependencies.ts +246 -0
  39. package/modules/subagents/src/diagnostics.ts +13 -0
  40. package/modules/subagents/src/display.ts +94 -0
  41. package/modules/subagents/src/headless.ts +342 -0
  42. package/modules/subagents/src/herdr.ts +203 -0
  43. package/modules/subagents/src/index.ts +2798 -0
  44. package/modules/subagents/src/inspect-tool.ts +839 -0
  45. package/modules/subagents/src/launch-config.ts +196 -0
  46. package/modules/subagents/src/layout-budget.ts +26 -0
  47. package/modules/subagents/src/list-tool.ts +292 -0
  48. package/modules/subagents/src/message-tool.ts +808 -0
  49. package/modules/subagents/src/names.ts +17 -0
  50. package/modules/subagents/src/pane-layout.ts +49 -0
  51. package/modules/subagents/src/params.ts +145 -0
  52. package/modules/subagents/src/renderers.ts +181 -0
  53. package/modules/subagents/src/result.ts +43 -0
  54. package/modules/subagents/src/retention.ts +114 -0
  55. package/modules/subagents/src/route-error.ts +212 -0
  56. package/modules/subagents/src/routing.ts +235 -0
  57. package/modules/subagents/src/runtime-registry.ts +159 -0
  58. package/modules/subagents/src/session.ts +801 -0
  59. package/modules/subagents/src/status.ts +513 -0
  60. package/modules/subagents/src/stop-tool.ts +235 -0
  61. package/modules/subagents/src/subagent-done.ts +590 -0
  62. package/modules/subagents/src/subagent-tool.ts +1155 -0
  63. package/modules/subagents/src/surface.ts +355 -0
  64. package/modules/subagents/src/team-dispatch-tool.ts +219 -0
  65. package/modules/subagents/src/team.ts +232 -0
  66. package/modules/subagents/src/tmux.ts +210 -0
  67. package/modules/subagents/src/tools/safe-bash.ts +72 -0
  68. package/modules/subagents/src/types.ts +131 -0
  69. package/modules/tui/adapter/provider-usage.ts +143 -0
  70. package/modules/tui/config.ts +50 -0
  71. package/modules/tui/index.ts +120 -0
  72. package/modules/tui/kernel/pkg/shared/grok-subscription.ts +169 -0
  73. package/modules/tui/kernel/pkg/shared/official-subscription.ts +237 -0
  74. package/modules/tui/kernel/pkg/shared/provider-catalog.ts +367 -0
  75. package/modules/tui/kernel/pkg/shared/provider-contracts.ts +150 -0
  76. package/modules/tui/kernel/pkg/shared/provider-display.ts +55 -0
  77. package/modules/tui/kernel/pkg/shared/provider-parsers.ts +171 -0
  78. package/modules/tui/kernel/pkg/shared/volcengine.ts +191 -0
  79. package/modules/tui/kernel/pkg/shared/zhipu.ts +149 -0
  80. package/modules/tui/kernel/pkg/usage-core/index.ts +335 -0
  81. package/modules/tui/kernel/pkg/usage-core/provider-routes.ts +187 -0
  82. package/modules/tui/kernel/pkg/usage-node/index.ts +635 -0
  83. package/modules/tui/kernel/pkg/usage-node/provider-usage.ts +388 -0
  84. package/modules/tui/kernel/usage-core.ts +2 -0
  85. package/modules/tui/kernel/usage-node.ts +2 -0
  86. package/modules/tui/menu.ts +418 -0
  87. package/modules/tui/plugin/editor.ts +396 -0
  88. package/modules/tui/plugin/footer.ts +161 -0
  89. package/modules/tui/plugin/index.ts +30 -0
  90. package/modules/tui/plugin/lifecycle.ts +637 -0
  91. package/modules/tui/plugin/package-order.ts +169 -0
  92. package/modules/tui/plugin/screen-transition.ts +203 -0
  93. package/modules/tui/plugin/settings-config.ts +297 -0
  94. package/modules/tui/plugin/status-sources.ts +49 -0
  95. package/modules/tui/plugin/transition-gate.ts +261 -0
  96. package/modules/tui/renderer/custom-header.ts +157 -0
  97. package/modules/tui/renderer/editor.ts +70 -0
  98. package/modules/tui/renderer/header.ts +72 -0
  99. package/modules/tui/renderer/icons.ts +149 -0
  100. package/modules/tui/renderer/pi-installer-logo.ts +194 -0
  101. package/modules/tui/status/auto-compaction.ts +67 -0
  102. package/modules/tui/status/project-status.ts +655 -0
  103. package/modules/tui/status/provider-status.ts +120 -0
  104. package/modules/tui/status/runtime-status.ts +307 -0
  105. package/modules/tui/status/session-status.ts +325 -0
  106. package/modules/tui/status/status-config.ts +95 -0
  107. package/modules/tui/status/status-segments.ts +263 -0
  108. package/modules/tui/status/turn-telemetry.ts +466 -0
  109. package/modules/tui/themes/LICENSE.pi-themes-bundle +21 -0
  110. package/modules/tui/themes/UPSTREAM.md +7 -0
  111. package/modules/tui/themes/catppuccin-latte.json +80 -0
  112. package/modules/tui/themes/catppuccin-mocha.json +79 -0
  113. package/modules/tui/themes/crimson-noir.json +85 -0
  114. package/modules/tui/themes/dracula.json +79 -0
  115. package/modules/tui/themes/everforest-dark.json +85 -0
  116. package/modules/tui/themes/gruvbox-dark.json +85 -0
  117. package/modules/tui/themes/gruvbox-light.json +85 -0
  118. package/modules/tui/themes/matrix.json +85 -0
  119. package/modules/tui/themes/nord.json +85 -0
  120. package/modules/tui/themes/one-dark.json +85 -0
  121. package/modules/tui/themes/rose-pine-dawn.json +85 -0
  122. package/modules/tui/themes/rose-pine.json +85 -0
  123. package/modules/tui/themes/solarized-dark.json +85 -0
  124. package/modules/tui/themes/solarized-light.json +85 -0
  125. package/modules/tui/themes/tokyo-night-storm.json +79 -0
  126. package/modules/tui/themes/tokyo-night.json +79 -0
  127. package/package.json +28 -0
  128. package/services.ts +38 -0
  129. package/toolkit.ts +147 -0
package/toolkit.ts ADDED
@@ -0,0 +1,147 @@
1
+ // pi-toolkit 状态中枢:持有配置、语言、服务注册表与已装配模块,向菜单层提供读写入口。
2
+
3
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
4
+ import { assembleModules, resolveModuleConfig, type ActiveModule } from "./assembler.ts";
5
+ import { getToolkitConfigPath, loadToolkitConfig, saveToolkitConfig, type ToolkitConfig } from "./config.ts";
6
+ import {
7
+ createTranslator,
8
+ isLanguageSetting,
9
+ resolveLanguage,
10
+ type LanguageSetting,
11
+ type ResolvedLanguage,
12
+ type Translator,
13
+ } from "./i18n.ts";
14
+ import {
15
+ normalizeConfigValue,
16
+ type ModuleConfigRecord,
17
+ type ModuleConfigScalar,
18
+ type ModuleDefinition,
19
+ } from "./module.ts";
20
+ import { createServiceRegistry, type ServiceRegistry } from "./services.ts";
21
+
22
+ export interface ToolkitProblem {
23
+ readonly kind: "config" | "module";
24
+ /** 配置文件路径或模块 id */
25
+ readonly source: string;
26
+ /** 原始错误说明,直接展示在菜单问题行里 */
27
+ readonly detail: string;
28
+ }
29
+
30
+ export interface Toolkit {
31
+ readonly configPath: string;
32
+ readonly services: ServiceRegistry;
33
+ /** 已通过 enabled 开关并成功注册的模块 */
34
+ readonly modules: readonly ActiveModule[];
35
+ readonly problems: readonly ToolkitProblem[];
36
+ getConfig(): ToolkitConfig;
37
+ getLanguage(): LanguageSetting;
38
+ getResolvedLanguage(): ResolvedLanguage;
39
+ getTranslator(): Translator;
40
+ getModuleDefinitions(): readonly ModuleDefinition[];
41
+ getModuleDefinition(moduleId: string): ModuleDefinition | undefined;
42
+ /** 实时解析的本模块配置(schema 默认值 + 磁盘取值) */
43
+ getModuleConfig(moduleId: string): ModuleConfigRecord;
44
+ /** 重新从磁盘读整份配置,刷新内存副本(模块自己写盘後靠它刷新菜单展示与后续读取) */
45
+ reloadConfig(): Promise<void>;
46
+ setLanguage(value: string): Promise<LanguageSetting>;
47
+ /** 写单个模块字段并持久化,返回规范化后的值(只接受 schema 声明的字段) */
48
+ setModuleField(moduleId: string, field: string, value: ModuleConfigScalar): Promise<ModuleConfigScalar>;
49
+ }
50
+
51
+ export interface CreateToolkitOptions {
52
+ readonly pi: ExtensionAPI;
53
+ readonly agentDir: string;
54
+ readonly modules: readonly ModuleDefinition[];
55
+ }
56
+
57
+ function describeError(error: unknown): string {
58
+ return error instanceof Error ? error.message : String(error);
59
+ }
60
+
61
+ export async function createToolkit(options: CreateToolkitOptions): Promise<Toolkit> {
62
+ const configPath = getToolkitConfigPath(options.agentDir);
63
+ const loaded = await loadToolkitConfig(configPath);
64
+ let config = loaded.config;
65
+
66
+ const problems: ToolkitProblem[] = loaded.problems.map((detail) => ({
67
+ kind: "config" as const,
68
+ source: configPath,
69
+ detail,
70
+ }));
71
+
72
+ const services = createServiceRegistry();
73
+ // 译者读的是实时语言,语言切换后菜单重建即可刷新全部文案。
74
+ const translator = createTranslator(() => resolveLanguage(config.language));
75
+
76
+ const getModuleDefinition = (moduleId: string): ModuleDefinition | undefined =>
77
+ options.modules.find((definition) => definition.id === moduleId);
78
+
79
+ const getModuleConfig = (moduleId: string): ModuleConfigRecord => {
80
+ const definition = getModuleDefinition(moduleId);
81
+ return definition ? resolveModuleConfig(definition, config.modules[moduleId]) : {};
82
+ };
83
+
84
+ const setModuleField = async (
85
+ moduleId: string,
86
+ field: string,
87
+ value: ModuleConfigScalar,
88
+ ): Promise<ModuleConfigScalar> => {
89
+ const definition = getModuleDefinition(moduleId);
90
+ if (!definition) throw new Error(`未知模块:${moduleId}`);
91
+ const schemaField = definition.configSchema[field];
92
+ if (!schemaField) throw new Error(`未知配置字段:${moduleId}.${field}`);
93
+ const normalized = normalizeConfigValue(schemaField, value);
94
+ if (normalized === undefined) {
95
+ throw new Error(`配置字段 ${moduleId}.${field} 不接受取值 ${JSON.stringify(value)}`);
96
+ }
97
+ const section = { ...(config.modules[moduleId] ?? {}), [field]: normalized };
98
+ config = await saveToolkitConfig(configPath, { modules: { [moduleId]: section } });
99
+ return normalized;
100
+ };
101
+
102
+ const setLanguage = async (value: string): Promise<LanguageSetting> => {
103
+ if (!isLanguageSetting(value)) throw new Error(`未知语言设置:${value}`);
104
+ config = await saveToolkitConfig(configPath, { language: value });
105
+ return config.language;
106
+ };
107
+
108
+ const reloadConfig = async (): Promise<void> => {
109
+ config = (await loadToolkitConfig(configPath)).config;
110
+ };
111
+
112
+ const assembly = assembleModules({
113
+ modules: options.modules,
114
+ config,
115
+ pi: options.pi,
116
+ services,
117
+ t: translator,
118
+ getModuleConfig,
119
+ reloadConfig,
120
+ setModuleConfig: setModuleField,
121
+ });
122
+
123
+ for (const failure of assembly.failures) {
124
+ problems.push({
125
+ kind: "module",
126
+ source: failure.definition.id,
127
+ detail: describeError(failure.error),
128
+ });
129
+ }
130
+
131
+ return {
132
+ configPath,
133
+ services,
134
+ modules: assembly.loaded,
135
+ problems,
136
+ getConfig: () => config,
137
+ getLanguage: () => config.language,
138
+ getResolvedLanguage: () => resolveLanguage(config.language),
139
+ getTranslator: () => translator,
140
+ getModuleDefinitions: () => options.modules,
141
+ getModuleDefinition,
142
+ getModuleConfig,
143
+ reloadConfig,
144
+ setLanguage,
145
+ setModuleField,
146
+ };
147
+ }