@octo-cyber/ai 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.
Files changed (134) hide show
  1. package/dist/ai.module.d.ts +3 -0
  2. package/dist/ai.module.d.ts.map +1 -0
  3. package/dist/ai.module.js +40 -0
  4. package/dist/ai.module.js.map +1 -0
  5. package/dist/cli/adapters/antigravity.adapter.d.ts +29 -0
  6. package/dist/cli/adapters/antigravity.adapter.d.ts.map +1 -0
  7. package/dist/cli/adapters/antigravity.adapter.js +170 -0
  8. package/dist/cli/adapters/antigravity.adapter.js.map +1 -0
  9. package/dist/cli/adapters/claude-cli.adapter.d.ts +23 -0
  10. package/dist/cli/adapters/claude-cli.adapter.d.ts.map +1 -0
  11. package/dist/cli/adapters/claude-cli.adapter.js +79 -0
  12. package/dist/cli/adapters/claude-cli.adapter.js.map +1 -0
  13. package/dist/cli/adapters/codex-cli.adapter.d.ts +22 -0
  14. package/dist/cli/adapters/codex-cli.adapter.d.ts.map +1 -0
  15. package/dist/cli/adapters/codex-cli.adapter.js +76 -0
  16. package/dist/cli/adapters/codex-cli.adapter.js.map +1 -0
  17. package/dist/cli/adapters/detect-cli.d.ts +11 -0
  18. package/dist/cli/adapters/detect-cli.d.ts.map +1 -0
  19. package/dist/cli/adapters/detect-cli.js +40 -0
  20. package/dist/cli/adapters/detect-cli.js.map +1 -0
  21. package/dist/cli/adapters/gemini-cli.adapter.d.ts +21 -0
  22. package/dist/cli/adapters/gemini-cli.adapter.d.ts.map +1 -0
  23. package/dist/cli/adapters/gemini-cli.adapter.js +72 -0
  24. package/dist/cli/adapters/gemini-cli.adapter.js.map +1 -0
  25. package/dist/cli/adapters/index.d.ts +4 -0
  26. package/dist/cli/adapters/index.d.ts.map +1 -0
  27. package/dist/cli/adapters/index.js +10 -0
  28. package/dist/cli/adapters/index.js.map +1 -0
  29. package/dist/cli/cli-executor.service.d.ts +23 -0
  30. package/dist/cli/cli-executor.service.d.ts.map +1 -0
  31. package/dist/cli/cli-executor.service.js +150 -0
  32. package/dist/cli/cli-executor.service.js.map +1 -0
  33. package/dist/cli/cli-registry.service.d.ts +38 -0
  34. package/dist/cli/cli-registry.service.d.ts.map +1 -0
  35. package/dist/cli/cli-registry.service.js +112 -0
  36. package/dist/cli/cli-registry.service.js.map +1 -0
  37. package/dist/cli/controllers/ai-cli.controller.d.ts +36 -0
  38. package/dist/cli/controllers/ai-cli.controller.d.ts.map +1 -0
  39. package/dist/cli/controllers/ai-cli.controller.js +179 -0
  40. package/dist/cli/controllers/ai-cli.controller.js.map +1 -0
  41. package/dist/cli/index.d.ts +8 -0
  42. package/dist/cli/index.d.ts.map +1 -0
  43. package/dist/cli/index.js +17 -0
  44. package/dist/cli/index.js.map +1 -0
  45. package/dist/cli/types.d.ts +131 -0
  46. package/dist/cli/types.d.ts.map +1 -0
  47. package/dist/cli/types.js +9 -0
  48. package/dist/cli/types.js.map +1 -0
  49. package/dist/cli/workspace.service.d.ts +34 -0
  50. package/dist/cli/workspace.service.d.ts.map +1 -0
  51. package/dist/cli/workspace.service.js +194 -0
  52. package/dist/cli/workspace.service.js.map +1 -0
  53. package/dist/controllers/agent.controller.d.ts +13 -0
  54. package/dist/controllers/agent.controller.d.ts.map +1 -0
  55. package/dist/controllers/agent.controller.js +117 -0
  56. package/dist/controllers/agent.controller.js.map +1 -0
  57. package/dist/controllers/capability.controller.d.ts +16 -0
  58. package/dist/controllers/capability.controller.d.ts.map +1 -0
  59. package/dist/controllers/capability.controller.js +108 -0
  60. package/dist/controllers/capability.controller.js.map +1 -0
  61. package/dist/controllers/client.controller.d.ts +10 -0
  62. package/dist/controllers/client.controller.d.ts.map +1 -0
  63. package/dist/controllers/client.controller.js +79 -0
  64. package/dist/controllers/client.controller.js.map +1 -0
  65. package/dist/controllers/execution.controller.d.ts +11 -0
  66. package/dist/controllers/execution.controller.d.ts.map +1 -0
  67. package/dist/controllers/execution.controller.js +50 -0
  68. package/dist/controllers/execution.controller.js.map +1 -0
  69. package/dist/controllers/index.d.ts +5 -0
  70. package/dist/controllers/index.d.ts.map +1 -0
  71. package/dist/controllers/index.js +12 -0
  72. package/dist/controllers/index.js.map +1 -0
  73. package/dist/entities/agent-binding.entity.d.ts +17 -0
  74. package/dist/entities/agent-binding.entity.d.ts.map +1 -0
  75. package/dist/entities/agent-binding.entity.js +64 -0
  76. package/dist/entities/agent-binding.entity.js.map +1 -0
  77. package/dist/entities/agent-definition.entity.d.ts +17 -0
  78. package/dist/entities/agent-definition.entity.d.ts.map +1 -0
  79. package/dist/entities/agent-definition.entity.js +70 -0
  80. package/dist/entities/agent-definition.entity.js.map +1 -0
  81. package/dist/entities/agent-execution.entity.d.ts +23 -0
  82. package/dist/entities/agent-execution.entity.d.ts.map +1 -0
  83. package/dist/entities/agent-execution.entity.js +93 -0
  84. package/dist/entities/agent-execution.entity.js.map +1 -0
  85. package/dist/entities/agent-instance.entity.d.ts +19 -0
  86. package/dist/entities/agent-instance.entity.d.ts.map +1 -0
  87. package/dist/entities/agent-instance.entity.js +76 -0
  88. package/dist/entities/agent-instance.entity.js.map +1 -0
  89. package/dist/entities/capability-definition.entity.d.ts +20 -0
  90. package/dist/entities/capability-definition.entity.d.ts.map +1 -0
  91. package/dist/entities/capability-definition.entity.js +77 -0
  92. package/dist/entities/capability-definition.entity.js.map +1 -0
  93. package/dist/entities/client-registration.entity.d.ts +19 -0
  94. package/dist/entities/client-registration.entity.d.ts.map +1 -0
  95. package/dist/entities/client-registration.entity.js +79 -0
  96. package/dist/entities/client-registration.entity.js.map +1 -0
  97. package/dist/entities/index.d.ts +7 -0
  98. package/dist/entities/index.d.ts.map +1 -0
  99. package/dist/entities/index.js +16 -0
  100. package/dist/entities/index.js.map +1 -0
  101. package/dist/index.d.ts +4 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +16 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/services/agent.service.d.ts +23 -0
  106. package/dist/services/agent.service.d.ts.map +1 -0
  107. package/dist/services/agent.service.js +76 -0
  108. package/dist/services/agent.service.js.map +1 -0
  109. package/dist/services/capability-router.service.d.ts +45 -0
  110. package/dist/services/capability-router.service.d.ts.map +1 -0
  111. package/dist/services/capability-router.service.js +120 -0
  112. package/dist/services/capability-router.service.js.map +1 -0
  113. package/dist/services/client-registration.service.d.ts +27 -0
  114. package/dist/services/client-registration.service.d.ts.map +1 -0
  115. package/dist/services/client-registration.service.js +83 -0
  116. package/dist/services/client-registration.service.js.map +1 -0
  117. package/dist/services/index.d.ts +5 -0
  118. package/dist/services/index.d.ts.map +1 -0
  119. package/dist/services/index.js +12 -0
  120. package/dist/services/index.js.map +1 -0
  121. package/dist/services/sync-bridge.service.d.ts +41 -0
  122. package/dist/services/sync-bridge.service.d.ts.map +1 -0
  123. package/dist/services/sync-bridge.service.js +118 -0
  124. package/dist/services/sync-bridge.service.js.map +1 -0
  125. package/package.json +94 -0
  126. package/web/components/CliTestDialog.tsx +158 -0
  127. package/web/index.ts +19 -0
  128. package/web/manifest.ts +14 -0
  129. package/web/messages/en-US.json +81 -0
  130. package/web/messages/zh-CN.json +81 -0
  131. package/web/pages/AiCliToolsPage.tsx +223 -0
  132. package/web/pages/WorkspaceSection.tsx +260 -0
  133. package/web/pages/WorkspacesPage.tsx +397 -0
  134. package/web/services/ai-cli-service.ts +129 -0
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodexCliAdapter = exports.GeminiCliAdapter = exports.ClaudeCliAdapter = exports.WorkspaceService = exports.CliExecutorService = exports.CliRegistryService = void 0;
4
+ var cli_registry_service_js_1 = require("./cli-registry.service.js");
5
+ Object.defineProperty(exports, "CliRegistryService", { enumerable: true, get: function () { return cli_registry_service_js_1.CliRegistryService; } });
6
+ var cli_executor_service_js_1 = require("./cli-executor.service.js");
7
+ Object.defineProperty(exports, "CliExecutorService", { enumerable: true, get: function () { return cli_executor_service_js_1.CliExecutorService; } });
8
+ var workspace_service_js_1 = require("./workspace.service.js");
9
+ Object.defineProperty(exports, "WorkspaceService", { enumerable: true, get: function () { return workspace_service_js_1.WorkspaceService; } });
10
+ // Adapters
11
+ var claude_cli_adapter_js_1 = require("./adapters/claude-cli.adapter.js");
12
+ Object.defineProperty(exports, "ClaudeCliAdapter", { enumerable: true, get: function () { return claude_cli_adapter_js_1.ClaudeCliAdapter; } });
13
+ var gemini_cli_adapter_js_1 = require("./adapters/gemini-cli.adapter.js");
14
+ Object.defineProperty(exports, "GeminiCliAdapter", { enumerable: true, get: function () { return gemini_cli_adapter_js_1.GeminiCliAdapter; } });
15
+ var codex_cli_adapter_js_1 = require("./adapters/codex-cli.adapter.js");
16
+ Object.defineProperty(exports, "CodexCliAdapter", { enumerable: true, get: function () { return codex_cli_adapter_js_1.CodexCliAdapter; } });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;AAaA,qEAA+D;AAAtD,6HAAA,kBAAkB,OAAA;AAC3B,qEAA+D;AAAtD,6HAAA,kBAAkB,OAAA;AAC3B,+DAA0D;AAAjD,wHAAA,gBAAgB,OAAA;AAEzB,WAAW;AACX,0EAAoE;AAA3D,yHAAA,gBAAgB,OAAA;AACzB,0EAAoE;AAA3D,yHAAA,gBAAgB,OAAA;AACzB,wEAAkE;AAAzD,uHAAA,eAAe,OAAA"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * AI CLI integration type definitions.
3
+ *
4
+ * Defines interfaces for CLI tool adapters, execution options/results,
5
+ * and workspace management.
6
+ */
7
+ /** Supported CLI tool identifiers */
8
+ export type CliToolName = 'claude' | 'gemini' | 'codex' | 'antigravity';
9
+ /** How the adapter executes: spawn a child process or call an HTTP API */
10
+ export type AdapterExecutionType = 'spawn' | 'http';
11
+ /** Information about an installed CLI tool */
12
+ export interface CliToolInfo {
13
+ name: CliToolName;
14
+ displayName: string;
15
+ version: string;
16
+ executablePath: string;
17
+ isAvailable: boolean;
18
+ /** Available models for this tool */
19
+ models?: string[];
20
+ /** Default model identifier */
21
+ defaultModel?: string;
22
+ }
23
+ /** File passed as input to a CLI execution */
24
+ export interface FileInput {
25
+ /** Relative path within the workspace */
26
+ path: string;
27
+ /** File content (text) or absolute path to existing file */
28
+ content?: string;
29
+ sourcePath?: string;
30
+ }
31
+ /** File produced by a CLI execution */
32
+ export interface FileOutput {
33
+ /** Relative path within the workspace */
34
+ path: string;
35
+ /** Size in bytes */
36
+ size: number;
37
+ }
38
+ /** Options for executing an AI CLI tool */
39
+ export interface CliExecuteOptions {
40
+ /** Which CLI tool to use */
41
+ tool: CliToolName;
42
+ /** The prompt to send to the CLI */
43
+ prompt: string;
44
+ /** Model to use (tool-specific, e.g. 'sonnet', 'gemini-2.5-flash') */
45
+ model?: string;
46
+ /** Working directory for the CLI process (default: temp workspace) */
47
+ workingDir?: string;
48
+ /** Files to place in the workspace before execution */
49
+ files?: FileInput[];
50
+ /** Timeout in milliseconds (default: 300_000, max: 600_000) */
51
+ timeoutMs?: number;
52
+ /** Extra CLI arguments */
53
+ args?: string[];
54
+ /** Extra environment variables for the CLI process */
55
+ env?: Record<string, string>;
56
+ /** Request JSON output format from the CLI */
57
+ jsonOutput?: boolean;
58
+ }
59
+ /** Result of a CLI execution */
60
+ export interface CliExecuteResult {
61
+ success: boolean;
62
+ /** CLI stdout content */
63
+ output: string;
64
+ /** CLI stderr content (if any) */
65
+ error?: string;
66
+ /** Process exit code */
67
+ exitCode: number;
68
+ /** Execution duration in milliseconds */
69
+ durationMs: number;
70
+ /** Files generated or modified by the CLI */
71
+ files?: FileOutput[];
72
+ /** The tool that was executed */
73
+ tool: CliToolName;
74
+ }
75
+ /**
76
+ * Adapter for a specific CLI tool.
77
+ * Each CLI (claude, gemini, codex) implements this interface
78
+ * to handle tool-specific argument construction and output parsing.
79
+ */
80
+ export interface ICliAdapter {
81
+ /** Tool identifier */
82
+ readonly toolName: CliToolName;
83
+ /** Human-readable display name */
84
+ readonly displayName: string;
85
+ /** How this adapter executes: spawn a child process or call HTTP API */
86
+ readonly executionType: AdapterExecutionType;
87
+ /** Build CLI command-line arguments from execution options */
88
+ buildArgs(options: CliExecuteOptions): string[];
89
+ /**
90
+ * Build environment variables for the CLI process.
91
+ * Returns only tool-specific env vars (merged with system env at execution time).
92
+ */
93
+ buildEnv(options: CliExecuteOptions): Record<string, string>;
94
+ /** Parse raw CLI output into structured result */
95
+ parseOutput(stdout: string, stderr: string, exitCode: number, durationMs: number): CliExecuteResult;
96
+ /** Detect if this CLI tool is installed and get its info */
97
+ detectInstallation(): Promise<CliToolInfo | null>;
98
+ /** Execute via HTTP (only for http-type adapters) */
99
+ executeHttp?(options: CliExecuteOptions): Promise<CliExecuteResult>;
100
+ /** List available models for this tool */
101
+ listModels?(): Promise<string[]>;
102
+ /** Default model identifier */
103
+ getDefaultModel?(): string;
104
+ }
105
+ export type WorkspaceType = 'local' | 'github';
106
+ /** Workspace metadata stored in .workspace.json */
107
+ export interface WorkspaceMetadata {
108
+ id: string;
109
+ type: WorkspaceType;
110
+ name: string;
111
+ createdAt: string;
112
+ /** Original local directory path (local type) */
113
+ localPath?: string;
114
+ /** GitHub repository URL (github type) */
115
+ repoUrl?: string;
116
+ /** Git branch name (github type) */
117
+ branch?: string;
118
+ }
119
+ /** Workspace information returned by WorkspaceService */
120
+ export interface Workspace {
121
+ id: string;
122
+ type: WorkspaceType;
123
+ name: string;
124
+ /** Effective working directory path */
125
+ path: string;
126
+ createdAt: Date;
127
+ localPath?: string;
128
+ repoUrl?: string;
129
+ branch?: string;
130
+ }
131
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * AI CLI integration type definitions.
4
+ *
5
+ * Defines interfaces for CLI tool adapters, execution options/results,
6
+ * and workspace management.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
@@ -0,0 +1,34 @@
1
+ import type { Workspace } from './types.js';
2
+ /**
3
+ * Manages workspaces for AI CLI executions.
4
+ *
5
+ * Two workspace types:
6
+ * - **local**: References an existing local directory (no file copying)
7
+ * - **github**: Clones a GitHub repo + branch to a managed directory
8
+ */
9
+ export declare class WorkspaceService {
10
+ private readonly logger;
11
+ private basePath;
12
+ /** Initialize with base data directory */
13
+ initialize(dataDir: string): void;
14
+ /** Create a workspace pointing to an existing local directory */
15
+ createLocalWorkspace(name: string, localPath: string): Promise<Workspace>;
16
+ /** Create a workspace by cloning a GitHub repository */
17
+ createGithubWorkspace(name: string, repoUrl: string, branch: string): Promise<Workspace>;
18
+ /** Pull latest changes for a github workspace */
19
+ pullWorkspace(id: string): Promise<void>;
20
+ /** Get workspace by ID */
21
+ getWorkspace(id: string): Promise<Workspace | null>;
22
+ /** List all workspaces */
23
+ listWorkspaces(): Promise<Workspace[]>;
24
+ /** Delete a workspace */
25
+ deleteWorkspace(id: string): Promise<void>;
26
+ private resolveMetaPath;
27
+ private resolveClonePath;
28
+ private readWorkspace;
29
+ private metadataToWorkspace;
30
+ private ensureBaseDir;
31
+ private slugify;
32
+ private gitExec;
33
+ }
34
+ //# sourceMappingURL=workspace.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.service.d.ts","sourceRoot":"","sources":["../../src/cli/workspace.service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAI/D;;;;;;GAMG;AACH,qBACa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAM;IAEtB,0CAA0C;IAC1C,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKjC,iEAAiE;IAC3D,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAuB/E,wDAAwD;IAClD,qBAAqB,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,CAAC;IA0BrB,iDAAiD;IAC3C,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9C,0BAA0B;IACpB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IASzD,0BAA0B;IACpB,cAAc,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAuB5C,yBAAyB;IACnB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBhD,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,gBAAgB;YAIV,aAAa;IAW3B,OAAO,CAAC,mBAAmB;YAiBb,aAAa;IAI3B,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,OAAO;CAWhB"}
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.WorkspaceService = void 0;
10
+ const promises_1 = require("node:fs/promises");
11
+ const node_path_1 = require("node:path");
12
+ const node_child_process_1 = require("node:child_process");
13
+ const node_crypto_1 = require("node:crypto");
14
+ const core_1 = require("@octo/core");
15
+ const METADATA_FILE = '.workspace.json';
16
+ /**
17
+ * Manages workspaces for AI CLI executions.
18
+ *
19
+ * Two workspace types:
20
+ * - **local**: References an existing local directory (no file copying)
21
+ * - **github**: Clones a GitHub repo + branch to a managed directory
22
+ */
23
+ let WorkspaceService = class WorkspaceService {
24
+ logger = core_1.Container.get(core_1.LoggerService);
25
+ basePath = '';
26
+ /** Initialize with base data directory */
27
+ initialize(dataDir) {
28
+ this.basePath = (0, node_path_1.resolve)(dataDir, 'workspaces');
29
+ this.logger.info(`[WorkspaceService] Base path: ${this.basePath}`);
30
+ }
31
+ /** Create a workspace pointing to an existing local directory */
32
+ async createLocalWorkspace(name, localPath) {
33
+ const resolvedPath = (0, node_path_1.resolve)(localPath);
34
+ const dirStat = await (0, promises_1.stat)(resolvedPath);
35
+ if (!dirStat.isDirectory()) {
36
+ throw new Error(`Path is not a directory: ${resolvedPath}`);
37
+ }
38
+ const id = `local-${this.slugify(name)}-${(0, node_crypto_1.randomUUID)().slice(0, 8)}`;
39
+ const metaDir = this.resolveMetaPath(id);
40
+ await (0, promises_1.mkdir)(metaDir, { recursive: true });
41
+ const metadata = {
42
+ id,
43
+ type: 'local',
44
+ name,
45
+ localPath: resolvedPath,
46
+ createdAt: new Date().toISOString(),
47
+ };
48
+ await (0, promises_1.writeFile)((0, node_path_1.join)(metaDir, METADATA_FILE), JSON.stringify(metadata, null, 2));
49
+ return this.metadataToWorkspace(metadata);
50
+ }
51
+ /** Create a workspace by cloning a GitHub repository */
52
+ async createGithubWorkspace(name, repoUrl, branch) {
53
+ const id = `github-${this.slugify(name)}-${(0, node_crypto_1.randomUUID)().slice(0, 8)}`;
54
+ const cloneDir = this.resolveClonePath(id);
55
+ await this.gitExec([
56
+ 'clone',
57
+ '--branch', branch,
58
+ '--single-branch',
59
+ '--depth', '1',
60
+ repoUrl,
61
+ cloneDir,
62
+ ]);
63
+ const metadata = {
64
+ id,
65
+ type: 'github',
66
+ name,
67
+ repoUrl,
68
+ branch,
69
+ createdAt: new Date().toISOString(),
70
+ };
71
+ await (0, promises_1.writeFile)((0, node_path_1.join)(cloneDir, METADATA_FILE), JSON.stringify(metadata, null, 2));
72
+ return this.metadataToWorkspace(metadata);
73
+ }
74
+ /** Pull latest changes for a github workspace */
75
+ async pullWorkspace(id) {
76
+ const ws = await this.getWorkspace(id);
77
+ if (!ws)
78
+ throw new Error(`Workspace not found: ${id}`);
79
+ if (ws.type !== 'github')
80
+ throw new Error('Pull is only supported for github workspaces');
81
+ await this.gitExec(['pull'], ws.path);
82
+ this.logger.info(`[WorkspaceService] Pulled workspace: ${id}`);
83
+ }
84
+ /** Get workspace by ID */
85
+ async getWorkspace(id) {
86
+ const cloneDir = this.resolveClonePath(id);
87
+ const fromClone = await this.readWorkspace(cloneDir);
88
+ if (fromClone)
89
+ return fromClone;
90
+ const metaDir = this.resolveMetaPath(id);
91
+ return this.readWorkspace(metaDir);
92
+ }
93
+ /** List all workspaces */
94
+ async listWorkspaces() {
95
+ await this.ensureBaseDir();
96
+ const workspaces = [];
97
+ const metaBase = (0, node_path_1.resolve)(this.basePath, 'meta');
98
+ await (0, promises_1.mkdir)(metaBase, { recursive: true });
99
+ for (const entry of await (0, promises_1.readdir)(metaBase, { withFileTypes: true })) {
100
+ if (!entry.isDirectory())
101
+ continue;
102
+ const ws = await this.readWorkspace((0, node_path_1.join)(metaBase, entry.name));
103
+ if (ws)
104
+ workspaces.push(ws);
105
+ }
106
+ const clonesBase = (0, node_path_1.resolve)(this.basePath, 'clones');
107
+ await (0, promises_1.mkdir)(clonesBase, { recursive: true });
108
+ for (const entry of await (0, promises_1.readdir)(clonesBase, { withFileTypes: true })) {
109
+ if (!entry.isDirectory())
110
+ continue;
111
+ const ws = await this.readWorkspace((0, node_path_1.join)(clonesBase, entry.name));
112
+ if (ws)
113
+ workspaces.push(ws);
114
+ }
115
+ return workspaces;
116
+ }
117
+ /** Delete a workspace */
118
+ async deleteWorkspace(id) {
119
+ const ws = await this.getWorkspace(id);
120
+ if (!ws)
121
+ throw new Error(`Workspace not found: ${id}`);
122
+ if (ws.type === 'local') {
123
+ // Only remove metadata, never delete the original directory
124
+ const metaDir = this.resolveMetaPath(id);
125
+ await (0, promises_1.rm)(metaDir, { recursive: true, force: true });
126
+ }
127
+ else {
128
+ // Remove the cloned directory entirely
129
+ const cloneDir = this.resolveClonePath(id);
130
+ await (0, promises_1.rm)(cloneDir, { recursive: true, force: true });
131
+ }
132
+ this.logger.info(`[WorkspaceService] Deleted workspace: ${id} (${ws.type})`);
133
+ }
134
+ // ─── Private ────────────────────────────────────────────────
135
+ resolveMetaPath(id) {
136
+ return (0, node_path_1.resolve)(this.basePath, 'meta', id);
137
+ }
138
+ resolveClonePath(id) {
139
+ return (0, node_path_1.resolve)(this.basePath, 'clones', id);
140
+ }
141
+ async readWorkspace(dir) {
142
+ try {
143
+ const metaPath = (0, node_path_1.join)(dir, METADATA_FILE);
144
+ const raw = await (0, promises_1.readFile)(metaPath, 'utf-8');
145
+ const metadata = JSON.parse(raw);
146
+ return this.metadataToWorkspace(metadata);
147
+ }
148
+ catch {
149
+ return null;
150
+ }
151
+ }
152
+ metadataToWorkspace(metadata) {
153
+ const path = metadata.type === 'local' && metadata.localPath
154
+ ? metadata.localPath
155
+ : this.resolveClonePath(metadata.id);
156
+ return {
157
+ id: metadata.id,
158
+ type: metadata.type,
159
+ name: metadata.name,
160
+ path,
161
+ createdAt: new Date(metadata.createdAt),
162
+ localPath: metadata.localPath,
163
+ repoUrl: metadata.repoUrl,
164
+ branch: metadata.branch,
165
+ };
166
+ }
167
+ async ensureBaseDir() {
168
+ await (0, promises_1.mkdir)(this.basePath, { recursive: true });
169
+ }
170
+ slugify(name) {
171
+ return name
172
+ .toLowerCase()
173
+ .replace(/[^a-z0-9]+/g, '-')
174
+ .replace(/^-|-$/g, '')
175
+ .slice(0, 30);
176
+ }
177
+ gitExec(args, cwd) {
178
+ return new Promise((resolve, reject) => {
179
+ (0, node_child_process_1.execFile)('git', args, { cwd, timeout: 120_000 }, (err, stdout, stderr) => {
180
+ if (err) {
181
+ reject(new Error(stderr.trim() || err.message));
182
+ }
183
+ else {
184
+ resolve(stdout.trim());
185
+ }
186
+ });
187
+ });
188
+ }
189
+ };
190
+ exports.WorkspaceService = WorkspaceService;
191
+ exports.WorkspaceService = WorkspaceService = __decorate([
192
+ (0, core_1.Service)()
193
+ ], WorkspaceService);
194
+ //# sourceMappingURL=workspace.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.service.js","sourceRoot":"","sources":["../../src/cli/workspace.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Request, Response } from '@octo/core';
2
+ export declare class AgentController {
3
+ private agentService;
4
+ listDefinitions(_req: Request, res: Response): Promise<void>;
5
+ createDefinition(req: Request, res: Response): Promise<void>;
6
+ getDefinition(req: Request, res: Response): Promise<void>;
7
+ updateDefinition(req: Request, res: Response): Promise<void>;
8
+ deleteDefinition(req: Request, res: Response): Promise<void>;
9
+ listInstances(req: Request, res: Response): Promise<void>;
10
+ getInstance(req: Request, res: Response): Promise<void>;
11
+ createInstance(req: Request, res: Response): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=agent.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.controller.d.ts","sourceRoot":"","sources":["../../src/controllers/agent.controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGpD,qBACa,eAAe;IAC1B,OAAO,CAAC,YAAY,CAA+B;IAG7C,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5D,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5D,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzD,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5D,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5D,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzD,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvD,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAIjE"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AgentController = void 0;
13
+ const core_1 = require("@octo/core");
14
+ const agent_service_js_1 = require("../services/agent.service.js");
15
+ let AgentController = class AgentController {
16
+ agentService = core_1.Container.get(agent_service_js_1.AgentService);
17
+ async listDefinitions(_req, res) {
18
+ const definitions = await this.agentService.findAllDefinitions();
19
+ res.json(core_1.ApiResponse.ok(definitions));
20
+ }
21
+ async createDefinition(req, res) {
22
+ const definition = await this.agentService.createDefinition(req.body);
23
+ res.status(201).json(core_1.ApiResponse.ok(definition, 'Agent definition created'));
24
+ }
25
+ async getDefinition(req, res) {
26
+ const def = await this.agentService.findDefinitionById(Number(req.params.id));
27
+ if (!def)
28
+ throw core_1.AppError.notFound('Agent definition not found');
29
+ res.json(core_1.ApiResponse.ok(def));
30
+ }
31
+ async updateDefinition(req, res) {
32
+ const def = await this.agentService.updateDefinition(Number(req.params.id), req.body);
33
+ if (!def)
34
+ throw core_1.AppError.notFound('Agent definition not found');
35
+ res.json(core_1.ApiResponse.ok(def));
36
+ }
37
+ async deleteDefinition(req, res) {
38
+ const deleted = await this.agentService.deleteDefinition(Number(req.params.id));
39
+ if (!deleted)
40
+ throw core_1.AppError.notFound('Agent definition not found');
41
+ res.json(core_1.ApiResponse.ok(null, 'Agent definition deleted'));
42
+ }
43
+ async listInstances(req, res) {
44
+ const clientId = req.query.clientId;
45
+ if (clientId) {
46
+ const instances = await this.agentService.findInstancesByClient(clientId);
47
+ res.json(core_1.ApiResponse.ok(instances));
48
+ }
49
+ else {
50
+ const instances = await this.agentService.findOnlineInstances();
51
+ res.json(core_1.ApiResponse.ok(instances));
52
+ }
53
+ }
54
+ async getInstance(req, res) {
55
+ const instance = await this.agentService.findInstanceById(Number(req.params.id));
56
+ if (!instance)
57
+ throw core_1.AppError.notFound('Agent instance not found');
58
+ res.json(core_1.ApiResponse.ok(instance));
59
+ }
60
+ async createInstance(req, res) {
61
+ const instance = await this.agentService.createInstance(req.body);
62
+ res.status(201).json(core_1.ApiResponse.ok(instance, 'Agent instance created'));
63
+ }
64
+ };
65
+ exports.AgentController = AgentController;
66
+ __decorate([
67
+ (0, core_1.Get)('/definitions'),
68
+ __metadata("design:type", Function),
69
+ __metadata("design:paramtypes", [Object, Object]),
70
+ __metadata("design:returntype", Promise)
71
+ ], AgentController.prototype, "listDefinitions", null);
72
+ __decorate([
73
+ (0, core_1.Post)('/definitions'),
74
+ __metadata("design:type", Function),
75
+ __metadata("design:paramtypes", [Object, Object]),
76
+ __metadata("design:returntype", Promise)
77
+ ], AgentController.prototype, "createDefinition", null);
78
+ __decorate([
79
+ (0, core_1.Get)('/definitions/:id'),
80
+ __metadata("design:type", Function),
81
+ __metadata("design:paramtypes", [Object, Object]),
82
+ __metadata("design:returntype", Promise)
83
+ ], AgentController.prototype, "getDefinition", null);
84
+ __decorate([
85
+ (0, core_1.Put)('/definitions/:id'),
86
+ __metadata("design:type", Function),
87
+ __metadata("design:paramtypes", [Object, Object]),
88
+ __metadata("design:returntype", Promise)
89
+ ], AgentController.prototype, "updateDefinition", null);
90
+ __decorate([
91
+ (0, core_1.Delete)('/definitions/:id'),
92
+ __metadata("design:type", Function),
93
+ __metadata("design:paramtypes", [Object, Object]),
94
+ __metadata("design:returntype", Promise)
95
+ ], AgentController.prototype, "deleteDefinition", null);
96
+ __decorate([
97
+ (0, core_1.Get)('/instances'),
98
+ __metadata("design:type", Function),
99
+ __metadata("design:paramtypes", [Object, Object]),
100
+ __metadata("design:returntype", Promise)
101
+ ], AgentController.prototype, "listInstances", null);
102
+ __decorate([
103
+ (0, core_1.Get)('/instances/:id'),
104
+ __metadata("design:type", Function),
105
+ __metadata("design:paramtypes", [Object, Object]),
106
+ __metadata("design:returntype", Promise)
107
+ ], AgentController.prototype, "getInstance", null);
108
+ __decorate([
109
+ (0, core_1.Post)('/instances'),
110
+ __metadata("design:type", Function),
111
+ __metadata("design:paramtypes", [Object, Object]),
112
+ __metadata("design:returntype", Promise)
113
+ ], AgentController.prototype, "createInstance", null);
114
+ exports.AgentController = AgentController = __decorate([
115
+ (0, core_1.Controller)('/api/agents')
116
+ ], AgentController);
117
+ //# sourceMappingURL=agent.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.controller.js","sourceRoot":"","sources":["../../src/controllers/agent.controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Request, Response } from '@octo/core';
2
+ export declare class CapabilityController {
3
+ private capabilityRouter;
4
+ private syncBridge;
5
+ list(_req: Request, res: Response): Promise<void>;
6
+ create(req: Request, res: Response): Promise<void>;
7
+ update(req: Request, res: Response): Promise<void>;
8
+ /**
9
+ * Execute a capability — routes to an available agent instance.
10
+ * POST /api/capabilities/:code/execute
11
+ */
12
+ execute(req: Request, res: Response): Promise<void>;
13
+ bind(req: Request, res: Response): Promise<void>;
14
+ unbind(req: Request, res: Response): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=capability.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.controller.d.ts","sourceRoot":"","sources":["../../src/controllers/capability.controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIpD,qBACa,oBAAoB;IAC/B,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,UAAU,CAAoC;IAGhD,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlD,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxD;;;OAGG;IAEG,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBnD,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhD,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CASzD"}