@phuetz/code-buddy 0.1.18 → 0.1.19

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 (273) hide show
  1. package/dist/agent/background-tasks.d.ts +49 -0
  2. package/dist/agent/background-tasks.js +153 -0
  3. package/dist/agent/background-tasks.js.map +1 -0
  4. package/dist/agent/definitions/agent-definition-loader.d.ts +21 -0
  5. package/dist/agent/definitions/agent-definition-loader.js +161 -0
  6. package/dist/agent/definitions/agent-definition-loader.js.map +1 -0
  7. package/dist/agent/definitions/index.d.ts +1 -0
  8. package/dist/agent/definitions/index.js +2 -0
  9. package/dist/agent/definitions/index.js.map +1 -0
  10. package/dist/agent/extended-thinking.d.ts +64 -0
  11. package/dist/agent/extended-thinking.js +103 -0
  12. package/dist/agent/extended-thinking.js.map +1 -0
  13. package/dist/agent/prompt-suggestions.d.ts +55 -0
  14. package/dist/agent/prompt-suggestions.js +125 -0
  15. package/dist/agent/prompt-suggestions.js.map +1 -0
  16. package/dist/agent/rewind-manager.d.ts +59 -0
  17. package/dist/agent/rewind-manager.js +124 -0
  18. package/dist/agent/rewind-manager.js.map +1 -0
  19. package/dist/agent/teams/agent-team.d.ts +54 -0
  20. package/dist/agent/teams/agent-team.js +114 -0
  21. package/dist/agent/teams/agent-team.js.map +1 -0
  22. package/dist/agent/teams/index.d.ts +1 -0
  23. package/dist/agent/teams/index.js +2 -0
  24. package/dist/agent/teams/index.js.map +1 -0
  25. package/dist/agent/teams/team-v2.d.ts +166 -0
  26. package/dist/agent/teams/team-v2.js +376 -0
  27. package/dist/agent/teams/team-v2.js.map +1 -0
  28. package/dist/channels/imessage/index.d.ts +40 -0
  29. package/dist/channels/imessage/index.js +69 -0
  30. package/dist/channels/imessage/index.js.map +1 -0
  31. package/dist/channels/line/index.d.ts +36 -0
  32. package/dist/channels/line/index.js +71 -0
  33. package/dist/channels/line/index.js.map +1 -0
  34. package/dist/channels/mattermost/index.d.ts +34 -0
  35. package/dist/channels/mattermost/index.js +56 -0
  36. package/dist/channels/mattermost/index.js.map +1 -0
  37. package/dist/channels/nextcloud-talk/index.d.ts +37 -0
  38. package/dist/channels/nextcloud-talk/index.js +67 -0
  39. package/dist/channels/nextcloud-talk/index.js.map +1 -0
  40. package/dist/channels/niche-channels.d.ts +61 -0
  41. package/dist/channels/niche-channels.js +131 -0
  42. package/dist/channels/niche-channels.js.map +1 -0
  43. package/dist/channels/nostr/index.d.ts +30 -0
  44. package/dist/channels/nostr/index.js +68 -0
  45. package/dist/channels/nostr/index.js.map +1 -0
  46. package/dist/channels/twilio-voice/index.d.ts +37 -0
  47. package/dist/channels/twilio-voice/index.js +76 -0
  48. package/dist/channels/twilio-voice/index.js.map +1 -0
  49. package/dist/channels/whatsapp/index.js +0 -1
  50. package/dist/channels/whatsapp/index.js.map +1 -1
  51. package/dist/channels/zalo/index.d.ts +28 -0
  52. package/dist/channels/zalo/index.js +53 -0
  53. package/dist/channels/zalo/index.js.map +1 -0
  54. package/dist/cloud/cloud-sessions.d.ts +56 -0
  55. package/dist/cloud/cloud-sessions.js +187 -0
  56. package/dist/cloud/cloud-sessions.js.map +1 -0
  57. package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
  58. package/dist/codebuddy/tool-definitions/advanced-tools.js +24 -0
  59. package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
  60. package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
  61. package/dist/codebuddy/tool-definitions/index.js +1 -1
  62. package/dist/codebuddy/tool-definitions/index.js.map +1 -1
  63. package/dist/commands/handlers/auth-handler.d.ts +32 -0
  64. package/dist/commands/handlers/auth-handler.js +137 -0
  65. package/dist/commands/handlers/auth-handler.js.map +1 -0
  66. package/dist/commands/handlers/context-handler.d.ts +46 -0
  67. package/dist/commands/handlers/context-handler.js +102 -0
  68. package/dist/commands/handlers/context-handler.js.map +1 -0
  69. package/dist/commands/handlers/keybindings-handler.d.ts +30 -0
  70. package/dist/commands/handlers/keybindings-handler.js +124 -0
  71. package/dist/commands/handlers/keybindings-handler.js.map +1 -0
  72. package/dist/commands/handlers/session-commands.d.ts +17 -0
  73. package/dist/commands/handlers/session-commands.js +119 -0
  74. package/dist/commands/handlers/session-commands.js.map +1 -0
  75. package/dist/commands/slash/builtin-commands.js +1 -1
  76. package/dist/commands/slash/builtin-commands.js.map +1 -1
  77. package/dist/config/admin-config.d.ts +54 -0
  78. package/dist/config/admin-config.js +144 -0
  79. package/dist/config/admin-config.js.map +1 -0
  80. package/dist/config/advanced-config.d.ts +118 -0
  81. package/dist/config/advanced-config.js +364 -0
  82. package/dist/config/advanced-config.js.map +1 -0
  83. package/dist/config/managed-policies.d.ts +50 -0
  84. package/dist/config/managed-policies.js +120 -0
  85. package/dist/config/managed-policies.js.map +1 -0
  86. package/dist/config/settings-hierarchy.d.ts +59 -0
  87. package/dist/config/settings-hierarchy.js +188 -0
  88. package/dist/config/settings-hierarchy.js.map +1 -0
  89. package/dist/config/tool-profiles.d.ts +37 -0
  90. package/dist/config/tool-profiles.js +150 -0
  91. package/dist/config/tool-profiles.js.map +1 -0
  92. package/dist/config/user-settings.d.ts +31 -0
  93. package/dist/config/user-settings.js +66 -0
  94. package/dist/config/user-settings.js.map +1 -0
  95. package/dist/context/context-files.d.ts +1 -1
  96. package/dist/context/context-files.js +2 -2
  97. package/dist/context/context-files.js.map +1 -1
  98. package/dist/context/partial-summarizer.d.ts +32 -0
  99. package/dist/context/partial-summarizer.js +144 -0
  100. package/dist/context/partial-summarizer.js.map +1 -0
  101. package/dist/desktop/desktop-app.d.ts +44 -0
  102. package/dist/desktop/desktop-app.js +136 -0
  103. package/dist/desktop/desktop-app.js.map +1 -0
  104. package/dist/git/worktree-sessions.d.ts +24 -0
  105. package/dist/git/worktree-sessions.js +93 -0
  106. package/dist/git/worktree-sessions.js.map +1 -0
  107. package/dist/hooks/advanced-hooks.d.ts +110 -0
  108. package/dist/hooks/advanced-hooks.js +256 -0
  109. package/dist/hooks/advanced-hooks.js.map +1 -0
  110. package/dist/hooks/async-hooks.d.ts +73 -0
  111. package/dist/hooks/async-hooks.js +213 -0
  112. package/dist/hooks/async-hooks.js.map +1 -0
  113. package/dist/hooks/env-persistence.d.ts +58 -0
  114. package/dist/hooks/env-persistence.js +195 -0
  115. package/dist/hooks/env-persistence.js.map +1 -0
  116. package/dist/hooks/hook-events.d.ts +36 -0
  117. package/dist/hooks/hook-events.js +55 -0
  118. package/dist/hooks/hook-events.js.map +1 -0
  119. package/dist/hooks/smart-hooks.d.ts +85 -0
  120. package/dist/hooks/smart-hooks.js +199 -0
  121. package/dist/hooks/smart-hooks.js.map +1 -0
  122. package/dist/ide/jetbrains-plugin.d.ts +55 -0
  123. package/dist/ide/jetbrains-plugin.js +156 -0
  124. package/dist/ide/jetbrains-plugin.js.map +1 -0
  125. package/dist/ide/vscode-extension.d.ts +94 -0
  126. package/dist/ide/vscode-extension.js +229 -0
  127. package/dist/ide/vscode-extension.js.map +1 -0
  128. package/dist/index.js +77 -3
  129. package/dist/index.js.map +1 -1
  130. package/dist/input/file-autocomplete.d.ts +42 -0
  131. package/dist/input/file-autocomplete.js +154 -0
  132. package/dist/input/file-autocomplete.js.map +1 -0
  133. package/dist/integrations/chrome-bridge.d.ts +90 -0
  134. package/dist/integrations/chrome-bridge.js +151 -0
  135. package/dist/integrations/chrome-bridge.js.map +1 -0
  136. package/dist/integrations/github-action-runner.d.ts +40 -0
  137. package/dist/integrations/github-action-runner.js +163 -0
  138. package/dist/integrations/github-action-runner.js.map +1 -0
  139. package/dist/integrations/gitlab-ci-runner.d.ts +34 -0
  140. package/dist/integrations/gitlab-ci-runner.js +104 -0
  141. package/dist/integrations/gitlab-ci-runner.js.map +1 -0
  142. package/dist/integrations/pr-session-linker.d.ts +44 -0
  143. package/dist/integrations/pr-session-linker.js +103 -0
  144. package/dist/integrations/pr-session-linker.js.map +1 -0
  145. package/dist/integrations/tailscale.d.ts +36 -0
  146. package/dist/integrations/tailscale.js +101 -0
  147. package/dist/integrations/tailscale.js.map +1 -0
  148. package/dist/lsp/lsp-client.d.ts +68 -0
  149. package/dist/lsp/lsp-client.js +182 -0
  150. package/dist/lsp/lsp-client.js.map +1 -0
  151. package/dist/mcp/connectors.d.ts +28 -0
  152. package/dist/mcp/connectors.js +148 -0
  153. package/dist/mcp/connectors.js.map +1 -0
  154. package/dist/mcp/index.d.ts +7 -4
  155. package/dist/mcp/index.js +7 -4
  156. package/dist/mcp/index.js.map +1 -1
  157. package/dist/mcp/mcp-auto-discovery.d.ts +49 -0
  158. package/dist/mcp/mcp-auto-discovery.js +104 -0
  159. package/dist/mcp/mcp-auto-discovery.js.map +1 -0
  160. package/dist/mcp/mcp-server.d.ts +70 -0
  161. package/dist/mcp/mcp-server.js +374 -0
  162. package/dist/mcp/mcp-server.js.map +1 -0
  163. package/dist/memory/auto-memory.d.ts +53 -0
  164. package/dist/memory/auto-memory.js +250 -0
  165. package/dist/memory/auto-memory.js.map +1 -0
  166. package/dist/memory/hybrid-search.d.ts +51 -0
  167. package/dist/memory/hybrid-search.js +199 -0
  168. package/dist/memory/hybrid-search.js.map +1 -0
  169. package/dist/memory/memory-flush.d.ts +51 -0
  170. package/dist/memory/memory-flush.js +102 -0
  171. package/dist/memory/memory-flush.js.map +1 -0
  172. package/dist/memory/subagent-memory.d.ts +73 -0
  173. package/dist/memory/subagent-memory.js +172 -0
  174. package/dist/memory/subagent-memory.js.map +1 -0
  175. package/dist/nodes/device-node.d.ts +40 -0
  176. package/dist/nodes/device-node.js +117 -0
  177. package/dist/nodes/device-node.js.map +1 -0
  178. package/dist/output/json-schema-output.d.ts +67 -0
  179. package/dist/output/json-schema-output.js +273 -0
  180. package/dist/output/json-schema-output.js.map +1 -0
  181. package/dist/persistence/session-picker.d.ts +22 -0
  182. package/dist/persistence/session-picker.js +47 -0
  183. package/dist/persistence/session-picker.js.map +1 -0
  184. package/dist/persistence/session-store.d.ts +11 -0
  185. package/dist/persistence/session-store.js +17 -0
  186. package/dist/persistence/session-store.js.map +1 -1
  187. package/dist/plugins/git-pinned-marketplace.d.ts +39 -0
  188. package/dist/plugins/git-pinned-marketplace.js +152 -0
  189. package/dist/plugins/git-pinned-marketplace.js.map +1 -0
  190. package/dist/plugins/plugin-manifest.d.ts +116 -0
  191. package/dist/plugins/plugin-manifest.js +283 -0
  192. package/dist/plugins/plugin-manifest.js.map +1 -0
  193. package/dist/sandbox/os-sandbox.d.ts +49 -1
  194. package/dist/sandbox/os-sandbox.js +347 -6
  195. package/dist/sandbox/os-sandbox.js.map +1 -1
  196. package/dist/sdk/agent-sdk.d.ts +61 -0
  197. package/dist/sdk/agent-sdk.js +90 -0
  198. package/dist/sdk/agent-sdk.js.map +1 -0
  199. package/dist/security/permission-modes.d.ts +76 -0
  200. package/dist/security/permission-modes.js +195 -0
  201. package/dist/security/permission-modes.js.map +1 -0
  202. package/dist/security/permission-patterns.d.ts +61 -0
  203. package/dist/security/permission-patterns.js +171 -0
  204. package/dist/security/permission-patterns.js.map +1 -0
  205. package/dist/security/safe-binaries.d.ts +23 -0
  206. package/dist/security/safe-binaries.js +96 -0
  207. package/dist/security/safe-binaries.js.map +1 -0
  208. package/dist/security/sender-policies.d.ts +46 -0
  209. package/dist/security/sender-policies.js +90 -0
  210. package/dist/security/sender-policies.js.map +1 -0
  211. package/dist/server/dashboard.d.ts +53 -0
  212. package/dist/server/dashboard.js +93 -0
  213. package/dist/server/dashboard.js.map +1 -0
  214. package/dist/services/system-prompt-override.d.ts +34 -0
  215. package/dist/services/system-prompt-override.js +64 -0
  216. package/dist/services/system-prompt-override.js.map +1 -0
  217. package/dist/skills/skill-enhancements.d.ts +37 -0
  218. package/dist/skills/skill-enhancements.js +69 -0
  219. package/dist/skills/skill-enhancements.js.map +1 -0
  220. package/dist/telemetry/otel-tracer.d.ts +98 -0
  221. package/dist/telemetry/otel-tracer.js +245 -0
  222. package/dist/telemetry/otel-tracer.js.map +1 -0
  223. package/dist/tools/browser-stub.d.ts +61 -0
  224. package/dist/tools/browser-stub.js +184 -0
  225. package/dist/tools/browser-stub.js.map +1 -0
  226. package/dist/tools/gateway-tool.d.ts +43 -0
  227. package/dist/tools/gateway-tool.js +92 -0
  228. package/dist/tools/gateway-tool.js.map +1 -0
  229. package/dist/tools/image-stub.d.ts +32 -0
  230. package/dist/tools/image-stub.js +97 -0
  231. package/dist/tools/image-stub.js.map +1 -0
  232. package/dist/tools/js-repl.d.ts +78 -0
  233. package/dist/tools/js-repl.js +280 -0
  234. package/dist/tools/js-repl.js.map +1 -0
  235. package/dist/tools/message-tool.d.ts +42 -0
  236. package/dist/tools/message-tool.js +113 -0
  237. package/dist/tools/message-tool.js.map +1 -0
  238. package/dist/ui/cli-enhancements.d.ts +178 -0
  239. package/dist/ui/cli-enhancements.js +430 -0
  240. package/dist/ui/cli-enhancements.js.map +1 -0
  241. package/dist/ui/status-line.d.ts +90 -0
  242. package/dist/ui/status-line.js +160 -0
  243. package/dist/ui/status-line.js.map +1 -0
  244. package/dist/ui/terminal-enhancements.d.ts +34 -0
  245. package/dist/ui/terminal-enhancements.js +97 -0
  246. package/dist/ui/terminal-enhancements.js.map +1 -0
  247. package/dist/ui/ui-enhancements.d.ts +38 -0
  248. package/dist/ui/ui-enhancements.js +116 -0
  249. package/dist/ui/ui-enhancements.js.map +1 -0
  250. package/dist/utils/custom-instructions.js +4 -1
  251. package/dist/utils/custom-instructions.js.map +1 -1
  252. package/dist/utils/init-project.d.ts +1 -1
  253. package/dist/utils/init-project.js +20 -20
  254. package/dist/utils/init-project.js.map +1 -1
  255. package/dist/utils/output-schema-validator.d.ts +40 -0
  256. package/dist/utils/output-schema-validator.js +137 -0
  257. package/dist/utils/output-schema-validator.js.map +1 -0
  258. package/dist/utils/safety-misc.d.ts +24 -0
  259. package/dist/utils/safety-misc.js +91 -0
  260. package/dist/utils/safety-misc.js.map +1 -0
  261. package/dist/utils/session-enhancements.d.ts +40 -0
  262. package/dist/utils/session-enhancements.js +118 -0
  263. package/dist/utils/session-enhancements.js.map +1 -0
  264. package/dist/utils/shell-snapshot.d.ts +38 -0
  265. package/dist/utils/shell-snapshot.js +323 -0
  266. package/dist/utils/shell-snapshot.js.map +1 -0
  267. package/dist/utils/stream-json-formatter.d.ts +77 -0
  268. package/dist/utils/stream-json-formatter.js +61 -0
  269. package/dist/utils/stream-json-formatter.js.map +1 -0
  270. package/dist/workflows/lobster-engine.d.ts +43 -0
  271. package/dist/workflows/lobster-engine.js +167 -0
  272. package/dist/workflows/lobster-engine.js.map +1 -0
  273. package/package.json +3 -6
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Git-Pinned Plugin Marketplace
3
+ *
4
+ * Manages plugins pinned to specific Git commit SHAs for reproducible
5
+ * and auditable plugin installations.
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import * as os from 'os';
10
+ import { logger } from '../utils/logger.js';
11
+ // ============================================================================
12
+ // GitPinnedMarketplace
13
+ // ============================================================================
14
+ let instance = null;
15
+ export class GitPinnedMarketplace {
16
+ plugins = new Map();
17
+ configPath;
18
+ constructor(configDir) {
19
+ const dir = configDir || path.join(os.homedir(), '.codebuddy', 'plugins', 'git-pinned');
20
+ this.configPath = path.join(dir, 'plugins.json');
21
+ this.loadFromDisk();
22
+ }
23
+ static getInstance(configDir) {
24
+ if (!instance) {
25
+ instance = new GitPinnedMarketplace(configDir);
26
+ }
27
+ return instance;
28
+ }
29
+ static resetInstance() {
30
+ instance = null;
31
+ }
32
+ loadFromDisk() {
33
+ try {
34
+ if (fs.existsSync(this.configPath)) {
35
+ const data = JSON.parse(fs.readFileSync(this.configPath, 'utf-8'));
36
+ if (Array.isArray(data)) {
37
+ for (const plugin of data) {
38
+ this.plugins.set(plugin.name, plugin);
39
+ }
40
+ }
41
+ }
42
+ }
43
+ catch (err) {
44
+ logger.warn('Failed to load git-pinned plugins', { error: err });
45
+ }
46
+ }
47
+ saveToDisk() {
48
+ try {
49
+ const dir = path.dirname(this.configPath);
50
+ if (!fs.existsSync(dir)) {
51
+ fs.mkdirSync(dir, { recursive: true });
52
+ }
53
+ fs.writeFileSync(this.configPath, JSON.stringify(Array.from(this.plugins.values()), null, 2));
54
+ }
55
+ catch (err) {
56
+ logger.warn('Failed to save git-pinned plugins', { error: err });
57
+ }
58
+ }
59
+ /**
60
+ * Parse repo spec like "org/repo" or "org/repo@sha"
61
+ */
62
+ parseRepoSpec(repoSpec) {
63
+ const atIndex = repoSpec.indexOf('@');
64
+ let repoPath;
65
+ let sha;
66
+ if (atIndex !== -1) {
67
+ repoPath = repoSpec.substring(0, atIndex);
68
+ sha = repoSpec.substring(atIndex + 1);
69
+ }
70
+ else {
71
+ repoPath = repoSpec;
72
+ }
73
+ const parts = repoPath.split('/');
74
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
75
+ throw new Error(`Invalid repo spec: ${repoSpec}. Expected format: org/repo or org/repo@sha`);
76
+ }
77
+ return { org: parts[0], repo: parts[1], sha };
78
+ }
79
+ install(repoSpec) {
80
+ const { org, repo, sha } = this.parseRepoSpec(repoSpec);
81
+ const name = `${org}/${repo}`;
82
+ const commitSha = sha || 'HEAD';
83
+ const plugin = {
84
+ name,
85
+ repo: `https://github.com/${name}`,
86
+ commitSha,
87
+ installedAt: Date.now(),
88
+ verified: false,
89
+ commands: [],
90
+ hooks: [],
91
+ mcpServers: [],
92
+ };
93
+ this.plugins.set(name, plugin);
94
+ this.saveToDisk();
95
+ logger.info(`Installed git-pinned plugin: ${name}@${commitSha}`);
96
+ return plugin;
97
+ }
98
+ uninstall(name) {
99
+ const existed = this.plugins.delete(name);
100
+ if (existed) {
101
+ this.saveToDisk();
102
+ logger.info(`Uninstalled git-pinned plugin: ${name}`);
103
+ }
104
+ return existed;
105
+ }
106
+ list() {
107
+ return Array.from(this.plugins.values());
108
+ }
109
+ verify(name) {
110
+ const plugin = this.plugins.get(name);
111
+ if (!plugin) {
112
+ return false;
113
+ }
114
+ // In a real implementation, we would check the remote SHA
115
+ // For now, mark as verified if SHA is not HEAD
116
+ const isVerified = plugin.commitSha !== 'HEAD';
117
+ plugin.verified = isVerified;
118
+ this.saveToDisk();
119
+ return isVerified;
120
+ }
121
+ update(name) {
122
+ const plugin = this.plugins.get(name);
123
+ if (!plugin) {
124
+ return null;
125
+ }
126
+ // Simulate updating to a new SHA
127
+ plugin.commitSha = `updated-${Date.now().toString(16)}`;
128
+ plugin.verified = false;
129
+ plugin.installedAt = Date.now();
130
+ this.saveToDisk();
131
+ logger.info(`Updated git-pinned plugin: ${name}`);
132
+ return plugin;
133
+ }
134
+ getPlugin(name) {
135
+ return this.plugins.get(name);
136
+ }
137
+ getTrustWarning(repo) {
138
+ return `WARNING: Plugin from '${repo}' is not verified. ` +
139
+ 'Unverified plugins may contain malicious code. ' +
140
+ 'Review the source code and pin to a specific commit SHA before using.';
141
+ }
142
+ isInstalled(name) {
143
+ return this.plugins.has(name);
144
+ }
145
+ }
146
+ export function getGitPinnedMarketplace(configDir) {
147
+ return GitPinnedMarketplace.getInstance(configDir);
148
+ }
149
+ export function resetGitPinnedMarketplace() {
150
+ GitPinnedMarketplace.resetInstance();
151
+ }
152
+ //# sourceMappingURL=git-pinned-marketplace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-pinned-marketplace.js","sourceRoot":"","sources":["../../src/plugins/git-pinned-marketplace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Plugin Manifest System
3
+ *
4
+ * Extended manifest format with components, marketplace sources,
5
+ * namespaced skill resolution, and marketplace restrictions.
6
+ */
7
+ export type PluginSourceType = 'github' | 'git' | 'url' | 'npm' | 'file' | 'directory' | 'host-pattern';
8
+ export interface PluginManifest {
9
+ name: string;
10
+ version: string;
11
+ author?: string;
12
+ license?: string;
13
+ description?: string;
14
+ schema?: number;
15
+ components: {
16
+ skills?: string[];
17
+ agents?: string[];
18
+ hooks?: string;
19
+ mcpServers?: string[];
20
+ lspServers?: string[];
21
+ };
22
+ dependencies?: Record<string, string>;
23
+ marketplace?: {
24
+ source: PluginSourceType;
25
+ url?: string;
26
+ registry?: string;
27
+ };
28
+ }
29
+ export interface InstalledPlugin {
30
+ manifest: PluginManifest;
31
+ path: string;
32
+ enabled: boolean;
33
+ installedAt: number;
34
+ namespace: string;
35
+ }
36
+ export declare class PluginManifestManager {
37
+ private plugins;
38
+ private pluginDirs;
39
+ private strictKnownMarketplaces;
40
+ private extraKnownMarketplaces;
41
+ constructor(pluginDirs?: string[]);
42
+ /**
43
+ * Load plugin from manifest at a given path
44
+ */
45
+ loadPlugin(pluginPath: string): InstalledPlugin;
46
+ /**
47
+ * Read manifest from plugin path (stub - returns parsed JSON-like object)
48
+ */
49
+ private readManifest;
50
+ /**
51
+ * Load a plugin directly from a manifest object (for programmatic use)
52
+ */
53
+ loadPluginDirect(manifest: PluginManifest, pluginPath: string): InstalledPlugin;
54
+ /**
55
+ * Validate a plugin manifest
56
+ */
57
+ validateManifest(manifest: PluginManifest): {
58
+ valid: boolean;
59
+ errors: string[];
60
+ };
61
+ /**
62
+ * Install from various sources (stub implementation)
63
+ */
64
+ installFromSource(source: PluginSourceType, location: string): Promise<InstalledPlugin>;
65
+ /**
66
+ * Extract a plugin name from source type and location
67
+ */
68
+ private extractPluginName;
69
+ /**
70
+ * Resolve namespaced skill: "plugin-name:skill-name"
71
+ */
72
+ resolveSkill(namespacedName: string): {
73
+ pluginName: string;
74
+ skillName: string;
75
+ } | null;
76
+ /**
77
+ * List all plugins
78
+ */
79
+ listPlugins(): InstalledPlugin[];
80
+ /**
81
+ * Get a specific plugin by name
82
+ */
83
+ getPlugin(name: string): InstalledPlugin | null;
84
+ /**
85
+ * Enable a plugin
86
+ */
87
+ enablePlugin(name: string): boolean;
88
+ /**
89
+ * Disable a plugin
90
+ */
91
+ disablePlugin(name: string): boolean;
92
+ /**
93
+ * Uninstall a plugin
94
+ */
95
+ uninstallPlugin(name: string): boolean;
96
+ /**
97
+ * Check if a marketplace URL is allowed
98
+ */
99
+ isMarketplaceAllowed(url: string): boolean;
100
+ /**
101
+ * Set strict marketplace mode
102
+ */
103
+ setStrictMarketplaces(strict: boolean): void;
104
+ /**
105
+ * Add a known marketplace URL
106
+ */
107
+ addKnownMarketplace(url: string): void;
108
+ /**
109
+ * Get total plugin count
110
+ */
111
+ getPluginCount(): number;
112
+ /**
113
+ * Get enabled plugin count
114
+ */
115
+ getEnabledCount(): number;
116
+ }
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Plugin Manifest System
3
+ *
4
+ * Extended manifest format with components, marketplace sources,
5
+ * namespaced skill resolution, and marketplace restrictions.
6
+ */
7
+ import { logger } from '../utils/logger.js';
8
+ // ============================================================================
9
+ // Known Marketplaces
10
+ // ============================================================================
11
+ const DEFAULT_KNOWN_MARKETPLACES = [
12
+ 'https://marketplace.codebuddy.dev',
13
+ 'https://registry.npmjs.org',
14
+ 'https://github.com',
15
+ ];
16
+ // ============================================================================
17
+ // Plugin Manifest Manager
18
+ // ============================================================================
19
+ export class PluginManifestManager {
20
+ plugins = new Map();
21
+ pluginDirs;
22
+ strictKnownMarketplaces = false;
23
+ extraKnownMarketplaces = [];
24
+ constructor(pluginDirs) {
25
+ this.pluginDirs = pluginDirs || [];
26
+ }
27
+ /**
28
+ * Load plugin from manifest at a given path
29
+ */
30
+ loadPlugin(pluginPath) {
31
+ const manifest = this.readManifest(pluginPath);
32
+ const validation = this.validateManifest(manifest);
33
+ if (!validation.valid) {
34
+ throw new Error(`Invalid manifest at ${pluginPath}: ${validation.errors.join(', ')}`);
35
+ }
36
+ const installed = {
37
+ manifest,
38
+ path: pluginPath,
39
+ enabled: true,
40
+ installedAt: Date.now(),
41
+ namespace: manifest.name,
42
+ };
43
+ this.plugins.set(manifest.name, installed);
44
+ logger.info(`Loaded plugin: ${manifest.name}@${manifest.version}`);
45
+ return installed;
46
+ }
47
+ /**
48
+ * Read manifest from plugin path (stub - returns parsed JSON-like object)
49
+ */
50
+ readManifest(pluginPath) {
51
+ // In real implementation this would read from disk
52
+ // For now we expect the pluginPath to be a manifest object serialized
53
+ throw new Error(`Cannot read manifest from ${pluginPath} - use installFromSource or loadPluginDirect`);
54
+ }
55
+ /**
56
+ * Load a plugin directly from a manifest object (for programmatic use)
57
+ */
58
+ loadPluginDirect(manifest, pluginPath) {
59
+ const validation = this.validateManifest(manifest);
60
+ if (!validation.valid) {
61
+ throw new Error(`Invalid manifest: ${validation.errors.join(', ')}`);
62
+ }
63
+ const installed = {
64
+ manifest,
65
+ path: pluginPath,
66
+ enabled: true,
67
+ installedAt: Date.now(),
68
+ namespace: manifest.name,
69
+ };
70
+ this.plugins.set(manifest.name, installed);
71
+ logger.info(`Loaded plugin: ${manifest.name}@${manifest.version}`);
72
+ return installed;
73
+ }
74
+ /**
75
+ * Validate a plugin manifest
76
+ */
77
+ validateManifest(manifest) {
78
+ const errors = [];
79
+ if (!manifest || typeof manifest !== 'object') {
80
+ return { valid: false, errors: ['Manifest must be a valid object'] };
81
+ }
82
+ // Required fields
83
+ if (!manifest.name || typeof manifest.name !== 'string') {
84
+ errors.push('Missing or invalid required field: name');
85
+ }
86
+ if (!manifest.version || typeof manifest.version !== 'string') {
87
+ errors.push('Missing or invalid required field: version');
88
+ }
89
+ // Version format
90
+ if (manifest.version && typeof manifest.version === 'string') {
91
+ if (!/^\d+\.\d+\.\d+(-[\w.]+)?$/.test(manifest.version)) {
92
+ errors.push('Version must be in semver format (e.g., 1.0.0)');
93
+ }
94
+ }
95
+ // Components must be an object
96
+ if (!manifest.components || typeof manifest.components !== 'object') {
97
+ errors.push('Missing or invalid required field: components');
98
+ }
99
+ else {
100
+ // Validate component arrays
101
+ const arrayFields = ['skills', 'agents', 'mcpServers', 'lspServers'];
102
+ for (const field of arrayFields) {
103
+ const val = manifest.components[field];
104
+ if (val !== undefined && !Array.isArray(val)) {
105
+ errors.push(`components.${field} must be an array`);
106
+ }
107
+ }
108
+ if (manifest.components.hooks !== undefined && typeof manifest.components.hooks !== 'string') {
109
+ errors.push('components.hooks must be a string path');
110
+ }
111
+ }
112
+ // Schema version
113
+ if (manifest.schema !== undefined && typeof manifest.schema !== 'number') {
114
+ errors.push('schema must be a number');
115
+ }
116
+ // Dependencies
117
+ if (manifest.dependencies !== undefined) {
118
+ if (typeof manifest.dependencies !== 'object' || Array.isArray(manifest.dependencies)) {
119
+ errors.push('dependencies must be an object');
120
+ }
121
+ }
122
+ // Marketplace
123
+ if (manifest.marketplace !== undefined) {
124
+ if (typeof manifest.marketplace !== 'object') {
125
+ errors.push('marketplace must be an object');
126
+ }
127
+ else {
128
+ const validSources = ['github', 'git', 'url', 'npm', 'file', 'directory', 'host-pattern'];
129
+ if (!validSources.includes(manifest.marketplace.source)) {
130
+ errors.push(`marketplace.source must be one of: ${validSources.join(', ')}`);
131
+ }
132
+ }
133
+ }
134
+ return { valid: errors.length === 0, errors };
135
+ }
136
+ /**
137
+ * Install from various sources (stub implementation)
138
+ */
139
+ async installFromSource(source, location) {
140
+ // Check marketplace restrictions
141
+ if (this.strictKnownMarketplaces && (source === 'url' || source === 'github' || source === 'git')) {
142
+ if (!this.isMarketplaceAllowed(location)) {
143
+ throw new Error(`Marketplace URL not allowed: ${location}`);
144
+ }
145
+ }
146
+ const pluginName = this.extractPluginName(source, location);
147
+ const manifest = {
148
+ name: pluginName,
149
+ version: '0.0.0',
150
+ components: {},
151
+ marketplace: { source, url: location },
152
+ };
153
+ const installed = {
154
+ manifest,
155
+ path: location,
156
+ enabled: true,
157
+ installedAt: Date.now(),
158
+ namespace: pluginName,
159
+ };
160
+ this.plugins.set(pluginName, installed);
161
+ logger.info(`Installed plugin from ${source}: ${pluginName}`);
162
+ return installed;
163
+ }
164
+ /**
165
+ * Extract a plugin name from source type and location
166
+ */
167
+ extractPluginName(source, location) {
168
+ switch (source) {
169
+ case 'github':
170
+ return location.replace(/^https?:\/\/github\.com\//, '').replace(/\.git$/, '');
171
+ case 'npm':
172
+ return location.replace(/^@/, '').replace(/\//, '-');
173
+ default:
174
+ // Use last path segment
175
+ const segments = location.split('/').filter(Boolean);
176
+ return segments[segments.length - 1] || location;
177
+ }
178
+ }
179
+ /**
180
+ * Resolve namespaced skill: "plugin-name:skill-name"
181
+ */
182
+ resolveSkill(namespacedName) {
183
+ const parts = namespacedName.split(':');
184
+ if (parts.length !== 2) {
185
+ return null;
186
+ }
187
+ const [pluginName, skillName] = parts;
188
+ if (!pluginName || !skillName) {
189
+ return null;
190
+ }
191
+ const plugin = this.plugins.get(pluginName);
192
+ if (!plugin || !plugin.enabled) {
193
+ return null;
194
+ }
195
+ return { pluginName, skillName };
196
+ }
197
+ /**
198
+ * List all plugins
199
+ */
200
+ listPlugins() {
201
+ return Array.from(this.plugins.values());
202
+ }
203
+ /**
204
+ * Get a specific plugin by name
205
+ */
206
+ getPlugin(name) {
207
+ return this.plugins.get(name) || null;
208
+ }
209
+ /**
210
+ * Enable a plugin
211
+ */
212
+ enablePlugin(name) {
213
+ const plugin = this.plugins.get(name);
214
+ if (!plugin)
215
+ return false;
216
+ plugin.enabled = true;
217
+ logger.info(`Enabled plugin: ${name}`);
218
+ return true;
219
+ }
220
+ /**
221
+ * Disable a plugin
222
+ */
223
+ disablePlugin(name) {
224
+ const plugin = this.plugins.get(name);
225
+ if (!plugin)
226
+ return false;
227
+ plugin.enabled = false;
228
+ logger.info(`Disabled plugin: ${name}`);
229
+ return true;
230
+ }
231
+ /**
232
+ * Uninstall a plugin
233
+ */
234
+ uninstallPlugin(name) {
235
+ const existed = this.plugins.delete(name);
236
+ if (existed) {
237
+ logger.info(`Uninstalled plugin: ${name}`);
238
+ }
239
+ return existed;
240
+ }
241
+ /**
242
+ * Check if a marketplace URL is allowed
243
+ */
244
+ isMarketplaceAllowed(url) {
245
+ const allKnown = [...DEFAULT_KNOWN_MARKETPLACES, ...this.extraKnownMarketplaces];
246
+ return allKnown.some(known => url.startsWith(known));
247
+ }
248
+ /**
249
+ * Set strict marketplace mode
250
+ */
251
+ setStrictMarketplaces(strict) {
252
+ this.strictKnownMarketplaces = strict;
253
+ logger.info(`Strict marketplaces: ${strict}`);
254
+ }
255
+ /**
256
+ * Add a known marketplace URL
257
+ */
258
+ addKnownMarketplace(url) {
259
+ if (!this.extraKnownMarketplaces.includes(url)) {
260
+ this.extraKnownMarketplaces.push(url);
261
+ logger.info(`Added known marketplace: ${url}`);
262
+ }
263
+ }
264
+ /**
265
+ * Get total plugin count
266
+ */
267
+ getPluginCount() {
268
+ return this.plugins.size;
269
+ }
270
+ /**
271
+ * Get enabled plugin count
272
+ */
273
+ getEnabledCount() {
274
+ let count = 0;
275
+ const plugins = Array.from(this.plugins.values());
276
+ for (const plugin of plugins) {
277
+ if (plugin.enabled)
278
+ count++;
279
+ }
280
+ return count;
281
+ }
282
+ }
283
+ //# sourceMappingURL=plugin-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-manifest.js","sourceRoot":"","sources":["../../src/plugins/plugin-manifest.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
  * OS-Level Sandbox
3
3
  *
4
4
  * Native sandboxing using OS-level isolation:
5
+ * - Linux: Landlock + seccomp (bwrap with seccomp BPF filters, strongest)
5
6
  * - Linux: bubblewrap (bwrap)
6
7
  * - macOS: sandbox-exec (seatbelt)
7
8
  * - Windows: Not yet supported (falls back to Docker)
@@ -9,7 +10,7 @@
9
10
  * Inspired by Codex CLI's execpolicy and sandbox implementation.
10
11
  */
11
12
  import { EventEmitter } from 'events';
12
- export type SandboxBackend = 'bubblewrap' | 'seatbelt' | 'docker' | 'none';
13
+ export type SandboxBackend = 'landlock' | 'bubblewrap' | 'seatbelt' | 'docker' | 'none';
13
14
  export interface OSSandboxConfig {
14
15
  /** Sandbox backend to use (auto-detected if not specified) */
15
16
  backend?: SandboxBackend;
@@ -38,6 +39,12 @@ export interface OSSandboxConfig {
38
39
  /** Max file size in bytes */
39
40
  maxFileSize?: number;
40
41
  };
42
+ /** Domain allowlist when network is enabled */
43
+ allowedDomains: string[];
44
+ /** Commands that bypass the sandbox */
45
+ excludedCommands: string[];
46
+ /** Allow running unsandboxed as fallback (default: true) */
47
+ allowUnsandboxed: boolean;
41
48
  }
42
49
  export interface OSSandboxResult {
43
50
  exitCode: number;
@@ -49,11 +56,17 @@ export interface OSSandboxResult {
49
56
  sandboxed: boolean;
50
57
  }
51
58
  export interface SandboxCapabilities {
59
+ landlock: boolean;
52
60
  bubblewrap: boolean;
53
61
  seatbelt: boolean;
54
62
  docker: boolean;
55
63
  recommended: SandboxBackend;
56
64
  }
65
+ export interface OSSandboxStats {
66
+ commandsRun: number;
67
+ commandsSandboxed: number;
68
+ commandsBypassed: number;
69
+ }
57
70
  /**
58
71
  * Detect available sandbox backends
59
72
  */
@@ -62,10 +75,29 @@ export declare function detectCapabilities(): Promise<SandboxCapabilities>;
62
75
  * Clear cached capabilities
63
76
  */
64
77
  export declare function clearCapabilitiesCache(): void;
78
+ /**
79
+ * Check if the Linux kernel supports Landlock LSM.
80
+ * Returns true if /proc/sys/kernel/unprivileged_landlock_restrict exists
81
+ * or kernel version >= 5.13.
82
+ */
83
+ export declare function checkLandlockSupport(): boolean;
84
+ /**
85
+ * Generate a seccomp BPF filter file that blocks dangerous syscalls.
86
+ *
87
+ * The filter is a minimal BPF program in binary format:
88
+ * - Load syscall number (BPF_LD | BPF_W | BPF_ABS, offset 0 for seccomp data)
89
+ * - For each blocked syscall: compare and jump to KILL if matched
90
+ * - Default action: ALLOW
91
+ *
92
+ * Format: each BPF instruction is 8 bytes (struct sock_filter):
93
+ * uint16 code, uint8 jt, uint8 jf, uint32 k
94
+ */
95
+ export declare function generateSeccompFilter(): Buffer;
65
96
  export declare class OSSandbox extends EventEmitter {
66
97
  private config;
67
98
  private backend;
68
99
  private initialized;
100
+ private stats;
69
101
  constructor(config?: Partial<OSSandboxConfig>);
70
102
  /**
71
103
  * Initialize sandbox and detect backend
@@ -95,6 +127,22 @@ export declare class OSSandbox extends EventEmitter {
95
127
  * Get current configuration
96
128
  */
97
129
  getConfig(): OSSandboxConfig;
130
+ /**
131
+ * Check if a domain should be allowed through the network filter
132
+ */
133
+ shouldAllowDomain(domain: string): boolean;
134
+ /**
135
+ * Check if a command should bypass the sandbox
136
+ */
137
+ isCommandExcluded(command: string): boolean;
138
+ /**
139
+ * Get execution statistics
140
+ */
141
+ getStats(): OSSandboxStats;
142
+ /**
143
+ * Execute a shell command with exclusion and stats tracking
144
+ */
145
+ execShellTracked(shellCommand: string): Promise<OSSandboxResult>;
98
146
  }
99
147
  export declare function getOSSandbox(config?: Partial<OSSandboxConfig>): OSSandbox;
100
148
  export declare function resetOSSandbox(): void;