studiograph 1.1.3 → 1.2.0-beta.10
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 +2 -8
- package/dist/agent/orchestrator.d.ts +53 -0
- package/dist/agent/orchestrator.js +197 -12
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/system.md +43 -11
- package/dist/agent/skill-loader.d.ts +48 -0
- package/dist/agent/skill-loader.js +166 -0
- package/dist/agent/skill-loader.js.map +1 -0
- package/dist/agent/skills/{bundled/enrich-entities.md → enrich-entities.md} +12 -0
- package/dist/agent/skills/entity-schema.md +502 -0
- package/dist/agent/skills/obsidian-source-setup.md +246 -0
- package/dist/agent/skills/sync-configuration.md +144 -0
- package/dist/agent/skills/sync-setup.md +84 -0
- package/dist/agent/tools/connector-tools.d.ts +37 -0
- package/dist/agent/tools/connector-tools.js +132 -0
- package/dist/agent/tools/connector-tools.js.map +1 -0
- package/dist/agent/tools/fs-tools.d.ts +39 -0
- package/dist/agent/tools/fs-tools.js +106 -0
- package/dist/agent/tools/fs-tools.js.map +1 -0
- package/dist/agent/tools/graph-tools.d.ts +33 -1
- package/dist/agent/tools/graph-tools.js +192 -44
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/load-skill.d.ts +1 -1
- package/dist/agent/tools/load-skill.js +1 -1
- package/dist/agent/tools/load-skill.js.map +1 -1
- package/dist/agent/tools/ops-tools.d.ts +24 -0
- package/dist/agent/tools/ops-tools.js +542 -0
- package/dist/agent/tools/ops-tools.js.map +1 -0
- package/dist/agent/tools/sync-tools.d.ts +33 -0
- package/dist/agent/tools/sync-tools.js +947 -0
- package/dist/agent/tools/sync-tools.js.map +1 -0
- package/dist/auth/github.d.ts +11 -8
- package/dist/auth/github.js +56 -75
- package/dist/auth/github.js.map +1 -1
- package/dist/cli/colors.d.ts +54 -0
- package/dist/cli/colors.js +133 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/commands/app.js +121 -18
- package/dist/cli/commands/app.js.map +1 -1
- package/dist/cli/commands/auth.d.ts +1 -1
- package/dist/cli/commands/auth.js +26 -10
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/clone.d.ts +9 -0
- package/dist/cli/commands/clone.js +167 -0
- package/dist/cli/commands/clone.js.map +1 -0
- package/dist/cli/commands/commit.d.ts +8 -0
- package/dist/cli/commands/commit.js +44 -0
- package/dist/cli/commands/commit.js.map +1 -0
- package/dist/cli/commands/connector.js +10 -2
- package/dist/cli/commands/connector.js.map +1 -1
- package/dist/cli/commands/deploy.d.ts +4 -6
- package/dist/cli/commands/deploy.js +292 -115
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/enrich.d.ts +11 -0
- package/dist/cli/commands/enrich.js +135 -0
- package/dist/cli/commands/enrich.js.map +1 -0
- package/dist/cli/commands/graphrag.d.ts +12 -0
- package/dist/cli/commands/graphrag.js +122 -0
- package/dist/cli/commands/graphrag.js.map +1 -0
- package/dist/cli/commands/init.js +29 -196
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/join.js +23 -3
- package/dist/cli/commands/join.js.map +1 -1
- package/dist/cli/commands/orphans.d.ts +8 -0
- package/dist/cli/commands/orphans.js +125 -0
- package/dist/cli/commands/orphans.js.map +1 -0
- package/dist/cli/commands/provision.js +11 -7
- package/dist/cli/commands/provision.js.map +1 -1
- package/dist/cli/commands/r2.js +8 -2
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/redeploy.d.ts +9 -0
- package/dist/cli/commands/redeploy.js +203 -0
- package/dist/cli/commands/redeploy.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +12 -0
- package/dist/cli/commands/reset.js +137 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/resolve.d.ts +8 -0
- package/dist/cli/commands/resolve.js +85 -0
- package/dist/cli/commands/resolve.js.map +1 -0
- package/dist/cli/commands/review.d.ts +19 -0
- package/dist/cli/commands/review.js +128 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/serve.js +55 -8
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/source.d.ts +16 -0
- package/dist/cli/commands/source.js +159 -0
- package/dist/cli/commands/source.js.map +1 -0
- package/dist/cli/commands/start.js +307 -55
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/sync-entities.d.ts +13 -0
- package/dist/cli/commands/sync-entities.js +242 -0
- package/dist/cli/commands/sync-entities.js.map +1 -0
- package/dist/cli/commands/sync.js +81 -5
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/index.js +45 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/scaffolding.d.ts +2 -1
- package/dist/cli/scaffolding.js +38 -23
- package/dist/cli/scaffolding.js.map +1 -1
- package/dist/cli/setup-wizard.d.ts +30 -0
- package/dist/cli/setup-wizard.js +244 -0
- package/dist/cli/setup-wizard.js.map +1 -0
- package/dist/cli/sync-review-interactive.d.ts +31 -0
- package/dist/cli/sync-review-interactive.js +393 -0
- package/dist/cli/sync-review-interactive.js.map +1 -0
- package/dist/cli/theme.d.ts +31 -0
- package/dist/cli/theme.js +116 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/core/graph.d.ts +40 -12
- package/dist/core/graph.js +344 -104
- package/dist/core/graph.js.map +1 -1
- package/dist/core/migration-runner.d.ts +4 -1
- package/dist/core/migration-runner.js +14 -3
- package/dist/core/migration-runner.js.map +1 -1
- package/dist/core/types.d.ts +2 -4
- package/dist/core/types.js +1 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +12 -0
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +6 -1
- package/dist/core/workspace-manager.js +29 -4
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +13 -5
- package/dist/core/workspace.js +115 -33
- package/dist/core/workspace.js.map +1 -1
- package/dist/lib/lib/utils.d.ts +2 -0
- package/dist/lib/lib/utils.js +6 -0
- package/dist/lib/lib/utils.js.map +1 -0
- package/dist/mcp/connector-manager.d.ts +7 -3
- package/dist/mcp/connector-manager.js +61 -16
- package/dist/mcp/connector-manager.js.map +1 -1
- package/dist/mcp/connectors/asana.d.ts +2 -0
- package/dist/mcp/connectors/asana.js +20 -0
- package/dist/mcp/connectors/asana.js.map +1 -0
- package/dist/mcp/connectors/definitions.d.ts +3 -1
- package/dist/mcp/connectors/definitions.js +19 -127
- package/dist/mcp/connectors/definitions.js.map +1 -1
- package/dist/mcp/connectors/figma.d.ts +5 -0
- package/dist/mcp/connectors/figma.js +21 -0
- package/dist/mcp/connectors/figma.js.map +1 -0
- package/dist/mcp/connectors/gdrive.d.ts +2 -0
- package/dist/mcp/connectors/gdrive.js +20 -0
- package/dist/mcp/connectors/gdrive.js.map +1 -0
- package/dist/mcp/connectors/granola.d.ts +2 -0
- package/dist/mcp/connectors/granola.js +12 -0
- package/dist/mcp/connectors/granola.js.map +1 -0
- package/dist/mcp/connectors/linear.d.ts +2 -0
- package/dist/mcp/connectors/linear.js +19 -0
- package/dist/mcp/connectors/linear.js.map +1 -0
- package/dist/mcp/connectors/obsidian.d.ts +2 -0
- package/dist/mcp/connectors/obsidian.js +19 -0
- package/dist/mcp/connectors/obsidian.js.map +1 -0
- package/dist/mcp/connectors/pipedrive.d.ts +2 -0
- package/dist/mcp/connectors/pipedrive.js +20 -0
- package/dist/mcp/connectors/pipedrive.js.map +1 -0
- package/dist/mcp/connectors/slack.d.ts +2 -0
- package/dist/mcp/connectors/slack.js +21 -0
- package/dist/mcp/connectors/slack.js.map +1 -0
- package/dist/mcp/oauth-provider.d.ts +41 -0
- package/dist/mcp/oauth-provider.js +160 -0
- package/dist/mcp/oauth-provider.js.map +1 -0
- package/dist/server/index.js +97 -11
- package/dist/server/index.js.map +1 -1
- package/dist/server/plugin-loader.d.ts +8 -0
- package/dist/server/plugin-loader.js +54 -2
- package/dist/server/plugin-loader.js.map +1 -1
- package/dist/server/routes/chat.d.ts +3 -2
- package/dist/server/routes/chat.js +67 -16
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/git-api.d.ts +9 -0
- package/dist/server/routes/git-api.js +82 -0
- package/dist/server/routes/git-api.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +2 -2
- package/dist/server/routes/graph-api.js +164 -3
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/workspace-api.d.ts +9 -0
- package/dist/server/routes/workspace-api.js +170 -0
- package/dist/server/routes/workspace-api.js.map +1 -0
- package/dist/services/assets/base.d.ts +2 -2
- package/dist/services/assets/base.js +4 -4
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +6 -6
- package/dist/services/assets/index.js +12 -12
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/git.d.ts +31 -0
- package/dist/services/git.js +92 -3
- package/dist/services/git.js.map +1 -1
- package/dist/services/github-provisioner.d.ts +8 -3
- package/dist/services/github-provisioner.js +35 -8
- package/dist/services/github-provisioner.js.map +1 -1
- package/dist/services/lint-service.js +8 -1
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.js +3 -3
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/memory-service.d.ts +1 -1
- package/dist/services/memory-service.js +2 -3
- package/dist/services/memory-service.js.map +1 -1
- package/dist/services/orphan-service.d.ts +31 -0
- package/dist/services/orphan-service.js +100 -0
- package/dist/services/orphan-service.js.map +1 -0
- package/dist/services/sync/commit.d.ts +60 -0
- package/dist/services/sync/commit.js +370 -0
- package/dist/services/sync/commit.js.map +1 -0
- package/dist/services/sync/context-index.d.ts +69 -0
- package/dist/services/sync/context-index.js +280 -0
- package/dist/services/sync/context-index.js.map +1 -0
- package/dist/services/sync/derive.d.ts +34 -0
- package/dist/services/sync/derive.js +164 -0
- package/dist/services/sync/derive.js.map +1 -0
- package/dist/services/sync/enrichment-state.d.ts +31 -0
- package/dist/services/sync/enrichment-state.js +63 -0
- package/dist/services/sync/enrichment-state.js.map +1 -0
- package/dist/services/sync/enrichment.d.ts +25 -0
- package/dist/services/sync/enrichment.js +121 -0
- package/dist/services/sync/enrichment.js.map +1 -0
- package/dist/services/sync/frontmatter-extractor.d.ts +40 -0
- package/dist/services/sync/frontmatter-extractor.js +273 -0
- package/dist/services/sync/frontmatter-extractor.js.map +1 -0
- package/dist/services/sync/graph-match-state.d.ts +33 -0
- package/dist/services/sync/graph-match-state.js +61 -0
- package/dist/services/sync/graph-match-state.js.map +1 -0
- package/dist/services/sync/graph-match.d.ts +53 -0
- package/dist/services/sync/graph-match.js +316 -0
- package/dist/services/sync/graph-match.js.map +1 -0
- package/dist/services/sync/graphrag-client.d.ts +43 -0
- package/dist/services/sync/graphrag-client.js +94 -0
- package/dist/services/sync/graphrag-client.js.map +1 -0
- package/dist/services/sync/graphrag-config.d.ts +16 -0
- package/dist/services/sync/graphrag-config.js +39 -0
- package/dist/services/sync/graphrag-config.js.map +1 -0
- package/dist/services/sync/graphrag-context.d.ts +14 -0
- package/dist/services/sync/graphrag-context.js +109 -0
- package/dist/services/sync/graphrag-context.js.map +1 -0
- package/dist/services/sync/graphrag-indexer.d.ts +30 -0
- package/dist/services/sync/graphrag-indexer.js +358 -0
- package/dist/services/sync/graphrag-indexer.js.map +1 -0
- package/dist/services/sync/llm.d.ts +32 -0
- package/dist/services/sync/llm.js +115 -0
- package/dist/services/sync/llm.js.map +1 -0
- package/dist/services/sync/mcp-client.d.ts +59 -0
- package/dist/services/sync/mcp-client.js +285 -0
- package/dist/services/sync/mcp-client.js.map +1 -0
- package/dist/services/sync/model-factory.d.ts +10 -0
- package/dist/services/sync/model-factory.js +24 -0
- package/dist/services/sync/model-factory.js.map +1 -0
- package/dist/services/sync/name-quality.d.ts +31 -0
- package/dist/services/sync/name-quality.js +60 -0
- package/dist/services/sync/name-quality.js.map +1 -0
- package/dist/services/sync/output-schemas.d.ts +92 -0
- package/dist/services/sync/output-schemas.js +43 -0
- package/dist/services/sync/output-schemas.js.map +1 -0
- package/dist/services/sync/prompts.d.ts +19 -0
- package/dist/services/sync/prompts.js +128 -0
- package/dist/services/sync/prompts.js.map +1 -0
- package/dist/services/sync/reconciler.d.ts +48 -0
- package/dist/services/sync/reconciler.js +295 -0
- package/dist/services/sync/reconciler.js.map +1 -0
- package/dist/services/sync/source-config.d.ts +45 -0
- package/dist/services/sync/source-config.js +208 -0
- package/dist/services/sync/source-config.js.map +1 -0
- package/dist/services/sync/source-definitions/asana.d.ts +15 -0
- package/dist/services/sync/source-definitions/asana.js +48 -0
- package/dist/services/sync/source-definitions/asana.js.map +1 -0
- package/dist/services/sync/source-definitions/definitions.d.ts +21 -0
- package/dist/services/sync/source-definitions/definitions.js +26 -0
- package/dist/services/sync/source-definitions/definitions.js.map +1 -0
- package/dist/services/sync/source-definitions/gdrive.d.ts +16 -0
- package/dist/services/sync/source-definitions/gdrive.js +68 -0
- package/dist/services/sync/source-definitions/gdrive.js.map +1 -0
- package/dist/services/sync/source-definitions/granola.d.ts +2 -0
- package/dist/services/sync/source-definitions/granola.js +28 -0
- package/dist/services/sync/source-definitions/granola.js.map +1 -0
- package/dist/services/sync/source-definitions/linear.d.ts +2 -0
- package/dist/services/sync/source-definitions/linear.js +60 -0
- package/dist/services/sync/source-definitions/linear.js.map +1 -0
- package/dist/services/sync/source-definitions/obsidian.d.ts +2 -0
- package/dist/services/sync/source-definitions/obsidian.js +55 -0
- package/dist/services/sync/source-definitions/obsidian.js.map +1 -0
- package/dist/services/sync/source-definitions/pipedrive.d.ts +2 -0
- package/dist/services/sync/source-definitions/pipedrive.js +52 -0
- package/dist/services/sync/source-definitions/pipedrive.js.map +1 -0
- package/dist/services/sync/staging.d.ts +53 -0
- package/dist/services/sync/staging.js +131 -0
- package/dist/services/sync/staging.js.map +1 -0
- package/dist/services/sync/structured-extractor.d.ts +49 -0
- package/dist/services/sync/structured-extractor.js +344 -0
- package/dist/services/sync/structured-extractor.js.map +1 -0
- package/dist/services/sync/sync-runner.d.ts +32 -0
- package/dist/services/sync/sync-runner.js +195 -0
- package/dist/services/sync/sync-runner.js.map +1 -0
- package/dist/services/sync/sync-state.d.ts +43 -0
- package/dist/services/sync/sync-state.js +154 -0
- package/dist/services/sync/sync-state.js.map +1 -0
- package/dist/services/sync/types.d.ts +203 -0
- package/dist/services/sync/types.js +8 -0
- package/dist/services/sync/types.js.map +1 -0
- package/dist/services/sync/unstructured-extractor.d.ts +29 -0
- package/dist/services/sync/unstructured-extractor.js +197 -0
- package/dist/services/sync/unstructured-extractor.js.map +1 -0
- package/dist/services/vector-service.d.ts +11 -0
- package/dist/services/vector-service.js +42 -0
- package/dist/services/vector-service.js.map +1 -1
- package/dist/utils/git.d.ts +31 -4
- package/dist/utils/git.js +65 -7
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/merge-resolver.d.ts +60 -0
- package/dist/utils/merge-resolver.js +304 -0
- package/dist/utils/merge-resolver.js.map +1 -0
- package/dist/utils/preflight.d.ts +2 -1
- package/dist/utils/preflight.js +8 -1
- package/dist/utils/preflight.js.map +1 -1
- package/dist/utils/workspace-config.d.ts +8 -0
- package/dist/utils/workspace-config.js +22 -0
- package/dist/utils/workspace-config.js.map +1 -0
- package/dist/web/_app/env.js +1 -0
- package/dist/web/_app/immutable/assets/0.BwJV4fvl.css +1 -0
- package/dist/web/_app/immutable/assets/2.DRHi7ABa.css +1 -0
- package/dist/web/_app/immutable/assets/3.CnAQdPKU.css +1 -0
- package/dist/web/_app/immutable/assets/4.BG92MufE.css +1 -0
- package/dist/web/_app/immutable/assets/5.CfrQIPYs.css +1 -0
- package/dist/web/_app/immutable/assets/ChatPanel.BNzaCFTL.css +1 -0
- package/dist/web/_app/immutable/assets/editor.D6Rjo7RE.css +1 -0
- package/dist/web/_app/immutable/chunks/4QY4j-jX.js +1 -0
- package/dist/web/_app/immutable/chunks/B4G4uWkV.js +1 -0
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +3383 -0
- package/dist/web/_app/immutable/chunks/CUzqHQY_.js +1 -0
- package/dist/web/_app/immutable/chunks/CYrVHOHA.js +1 -0
- package/dist/web/_app/immutable/chunks/CksE5s8n.js +1 -0
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +1 -0
- package/dist/web/_app/immutable/chunks/D0JBkEPE.js +86 -0
- package/dist/web/_app/immutable/chunks/D2K5GzLj.js +1 -0
- package/dist/web/_app/immutable/chunks/DEkoussQ.js +2 -0
- package/dist/web/_app/immutable/chunks/DW-KmHRi.js +1 -0
- package/dist/web/_app/immutable/chunks/DcCr4z9k.js +1 -0
- package/dist/web/_app/immutable/chunks/Dg2wWwJu.js +2 -0
- package/dist/web/_app/immutable/chunks/Dh_H7Owr.js +18 -0
- package/dist/web/_app/immutable/chunks/DnlgZ_Tk.js +5 -0
- package/dist/web/_app/immutable/chunks/DtVH--hH.js +6 -0
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +1 -0
- package/dist/web/_app/immutable/chunks/SBEriEQR.js +1 -0
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +1 -0
- package/dist/web/_app/immutable/chunks/YTERt3Ul.js +6 -0
- package/dist/web/_app/immutable/chunks/m_R7HatS.js +1 -0
- package/dist/web/_app/immutable/chunks/vlmEnjfO.js +1 -0
- package/dist/web/_app/immutable/entry/app.B9pwpU_x.js +2 -0
- package/dist/web/_app/immutable/entry/start.CDuNCEco.js +1 -0
- package/dist/web/_app/immutable/nodes/0.YEQhw1us.js +1 -0
- package/dist/web/_app/immutable/nodes/1.CvmHhpRy.js +1 -0
- package/dist/web/_app/immutable/nodes/2.c5k1r7dq.js +1 -0
- package/dist/web/_app/immutable/nodes/3.B24tcdLK.js +1 -0
- package/dist/web/_app/immutable/nodes/4.kX2m5Pp9.js +16 -0
- package/dist/web/_app/immutable/nodes/5.DELt6wTD.js +2 -0
- package/dist/web/_app/version.json +1 -0
- package/dist/web/index.html +41 -0
- package/package.json +21 -7
- /package/dist/agent/skills/{bundled/gather-context.md → gather-context.md} +0 -0
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operations Tools for Studiograph Agent
|
|
3
|
+
*
|
|
4
|
+
* These tools allow the agent to manage deployment and app plugins:
|
|
5
|
+
* - Deploy to Railway
|
|
6
|
+
* - Install app plugins
|
|
7
|
+
*/
|
|
8
|
+
import { Type as T } from '@sinclair/typebox';
|
|
9
|
+
import { spawnSync, execSync } from 'child_process';
|
|
10
|
+
import { existsSync, readFileSync, mkdirSync, cpSync, readdirSync, writeFileSync, rmSync } from 'fs';
|
|
11
|
+
import { join } from 'path';
|
|
12
|
+
import { tmpdir, homedir } from 'os';
|
|
13
|
+
import { Octokit } from '@octokit/rest';
|
|
14
|
+
import { wrapToolResult } from './graph-tools.js';
|
|
15
|
+
import { createGitHubRepo, initAndPush } from '../../services/github-provisioner.js';
|
|
16
|
+
import { Workspace } from '../../core/workspace.js';
|
|
17
|
+
const RAILWAY_API = 'https://backboard.railway.com/graphql/v2';
|
|
18
|
+
async function railwayQuery(token, query, variables = {}) {
|
|
19
|
+
const res = await fetch(RAILWAY_API, {
|
|
20
|
+
method: 'POST',
|
|
21
|
+
headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' },
|
|
22
|
+
body: JSON.stringify({ query, variables }),
|
|
23
|
+
});
|
|
24
|
+
const json = await res.json();
|
|
25
|
+
if (json.errors?.length)
|
|
26
|
+
throw new Error(json.errors.map((e) => e.message).join(', '));
|
|
27
|
+
return json.data;
|
|
28
|
+
}
|
|
29
|
+
function loadUserConfig() {
|
|
30
|
+
const configPath = join(homedir(), '.studiograph', 'user.json');
|
|
31
|
+
if (!existsSync(configPath))
|
|
32
|
+
return {};
|
|
33
|
+
try {
|
|
34
|
+
return JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return {};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Load GitHub PAT from env vars or ~/.studiograph/auth.json */
|
|
41
|
+
function loadGitHubToken() {
|
|
42
|
+
const envToken = process.env.STUDIOGRAPH_GITHUB_TOKEN || process.env.GITHUB_TOKEN;
|
|
43
|
+
if (envToken)
|
|
44
|
+
return envToken;
|
|
45
|
+
const authPath = join(homedir(), '.studiograph', 'auth.json');
|
|
46
|
+
if (!existsSync(authPath))
|
|
47
|
+
return null;
|
|
48
|
+
try {
|
|
49
|
+
const data = JSON.parse(readFileSync(authPath, 'utf-8'));
|
|
50
|
+
return data.token || null;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create operations tools for the agent
|
|
58
|
+
*/
|
|
59
|
+
export function createOpsTools(workspacePath, workspaceConfig) {
|
|
60
|
+
return [
|
|
61
|
+
// Install an app plugin
|
|
62
|
+
{
|
|
63
|
+
name: 'app_install',
|
|
64
|
+
label: 'Install App',
|
|
65
|
+
description: 'Install a Studiograph app plugin from a local directory or Git URL into the workspace. The source must contain an app.json manifest. Optionally builds before installing. Always confirm with the user before calling this.',
|
|
66
|
+
parameters: T.Object({
|
|
67
|
+
source: T.String({ description: 'Path to app source directory or Git URL (must contain app.json)' }),
|
|
68
|
+
commit: T.Optional(T.Boolean({ description: 'Commit to config repo after installing (default: true)' })),
|
|
69
|
+
push: T.Optional(T.Boolean({ description: 'Push config repo to remote after committing (default: false)' })),
|
|
70
|
+
}),
|
|
71
|
+
execute: async (_toolCallId, params) => {
|
|
72
|
+
let clonedTempDir = null;
|
|
73
|
+
try {
|
|
74
|
+
let sourceDir = params.source;
|
|
75
|
+
// Clone if source is a URL
|
|
76
|
+
const isUrl = sourceDir.startsWith('https://') || sourceDir.startsWith('http://') ||
|
|
77
|
+
sourceDir.startsWith('git@') || sourceDir.startsWith('git://') || sourceDir.startsWith('ssh://');
|
|
78
|
+
if (isUrl) {
|
|
79
|
+
const dir = join(tmpdir(), `studiograph-app-${Date.now()}`);
|
|
80
|
+
const result = spawnSync('git', ['clone', '--depth', '1', sourceDir, dir], { encoding: 'utf-8', stdio: 'pipe' });
|
|
81
|
+
if (result.status !== 0) {
|
|
82
|
+
return wrapToolResult({ error: `Failed to clone ${sourceDir}: ${result.stderr}` });
|
|
83
|
+
}
|
|
84
|
+
sourceDir = dir;
|
|
85
|
+
clonedTempDir = dir;
|
|
86
|
+
}
|
|
87
|
+
const manifestPath = join(sourceDir, 'app.json');
|
|
88
|
+
if (!existsSync(manifestPath)) {
|
|
89
|
+
return wrapToolResult({ error: `No app.json found in ${sourceDir}` });
|
|
90
|
+
}
|
|
91
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
92
|
+
if (!manifest.name || !manifest.plugin || !manifest.mountPath) {
|
|
93
|
+
return wrapToolResult({ error: 'app.json missing required fields: name, plugin, mountPath' });
|
|
94
|
+
}
|
|
95
|
+
// Build if declared, or auto-detect from package.json
|
|
96
|
+
let buildCmd = manifest.build;
|
|
97
|
+
if (!buildCmd) {
|
|
98
|
+
const pkgPath = join(sourceDir, 'package.json');
|
|
99
|
+
if (existsSync(pkgPath)) {
|
|
100
|
+
try {
|
|
101
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
102
|
+
if (pkg.scripts?.build) {
|
|
103
|
+
buildCmd = 'npm install --ignore-scripts && npm run build';
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch { /* ignore */ }
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (buildCmd) {
|
|
110
|
+
try {
|
|
111
|
+
execSync(buildCmd, { cwd: sourceDir, stdio: 'pipe' });
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
return wrapToolResult({ error: `Build failed: ${err?.stderr?.toString() ?? err.message}` });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Copy files to .studiograph/apps/<name>/
|
|
118
|
+
const studiographDir = join(workspacePath, '.studiograph');
|
|
119
|
+
const destDir = join(studiographDir, 'apps', manifest.name);
|
|
120
|
+
mkdirSync(destDir, { recursive: true });
|
|
121
|
+
const installed = [];
|
|
122
|
+
// app.json
|
|
123
|
+
cpSync(manifestPath, join(destDir, 'app.json'));
|
|
124
|
+
installed.push('app.json');
|
|
125
|
+
// plugin file (fall back to dist/ if not found at root)
|
|
126
|
+
const pluginRelPath = manifest.plugin.replace(/^\.\//, '');
|
|
127
|
+
let pluginSrc = join(sourceDir, pluginRelPath);
|
|
128
|
+
if (!existsSync(pluginSrc)) {
|
|
129
|
+
pluginSrc = join(sourceDir, 'dist', pluginRelPath);
|
|
130
|
+
}
|
|
131
|
+
if (!existsSync(pluginSrc)) {
|
|
132
|
+
return wrapToolResult({ error: `Plugin file not found: ${join(sourceDir, pluginRelPath)} (also checked dist/)` });
|
|
133
|
+
}
|
|
134
|
+
cpSync(pluginSrc, join(destDir, 'plugin.js'));
|
|
135
|
+
installed.push('plugin.js');
|
|
136
|
+
// entity-types.json
|
|
137
|
+
if (manifest.entityTypes) {
|
|
138
|
+
const etSrc = join(sourceDir, manifest.entityTypes.replace(/^\.\//, ''));
|
|
139
|
+
if (existsSync(etSrc)) {
|
|
140
|
+
cpSync(etSrc, join(destDir, 'entity-types.json'));
|
|
141
|
+
installed.push('entity-types.json');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// skills/
|
|
145
|
+
const skillsSrc = join(sourceDir, 'skills');
|
|
146
|
+
if (existsSync(skillsSrc)) {
|
|
147
|
+
cpSync(skillsSrc, join(destDir, 'skills'), { recursive: true });
|
|
148
|
+
installed.push(`skills/ (${readdirSync(skillsSrc).length} entries)`);
|
|
149
|
+
}
|
|
150
|
+
// tools/
|
|
151
|
+
const toolsSrc = join(sourceDir, 'tools');
|
|
152
|
+
if (existsSync(toolsSrc)) {
|
|
153
|
+
cpSync(toolsSrc, join(destDir, 'tools'), { recursive: true });
|
|
154
|
+
installed.push(`tools/ (${readdirSync(toolsSrc).length} entries)`);
|
|
155
|
+
}
|
|
156
|
+
// theme/ — probe theme/ → themes/ → dist/themes/
|
|
157
|
+
let themeSrcDir = null;
|
|
158
|
+
if (manifest.themeDir) {
|
|
159
|
+
themeSrcDir = join(sourceDir, manifest.themeDir.replace(/^\.\//, ''));
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
for (const candidate of ['theme', 'themes', join('dist', 'themes')]) {
|
|
163
|
+
const p = join(sourceDir, candidate);
|
|
164
|
+
if (existsSync(p)) {
|
|
165
|
+
themeSrcDir = p;
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (themeSrcDir && existsSync(themeSrcDir)) {
|
|
171
|
+
// Flatten single subdirectory (e.g. themes/default/ → theme/)
|
|
172
|
+
const themeEntries = readdirSync(themeSrcDir);
|
|
173
|
+
if (!themeEntries.includes('tokens.json') && themeEntries.length === 1) {
|
|
174
|
+
const sub = join(themeSrcDir, themeEntries[0]);
|
|
175
|
+
if (existsSync(join(sub, 'tokens.json')))
|
|
176
|
+
themeSrcDir = sub;
|
|
177
|
+
}
|
|
178
|
+
const themeDest = join(destDir, 'theme');
|
|
179
|
+
const tokensPath = join(themeDest, 'tokens.json');
|
|
180
|
+
const existingTokens = existsSync(tokensPath) ? readFileSync(tokensPath, 'utf-8') : null;
|
|
181
|
+
cpSync(themeSrcDir, themeDest, { recursive: true });
|
|
182
|
+
if (existingTokens !== null)
|
|
183
|
+
writeFileSync(tokensPath, existingTokens);
|
|
184
|
+
installed.push('theme/');
|
|
185
|
+
}
|
|
186
|
+
// Git commit
|
|
187
|
+
const shouldCommit = params.commit !== false;
|
|
188
|
+
let committed = false;
|
|
189
|
+
if (shouldCommit) {
|
|
190
|
+
try {
|
|
191
|
+
execSync(`git -C "${studiographDir}" add "apps/${manifest.name}/"`, { stdio: 'pipe' });
|
|
192
|
+
const versionLabel = manifest.version ? ` v${manifest.version}` : '';
|
|
193
|
+
execSync(`git -C "${studiographDir}" commit -m "install ${manifest.name}${versionLabel}"`, { stdio: 'pipe' });
|
|
194
|
+
committed = true;
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// Nothing to commit
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Push
|
|
201
|
+
if (params.push && committed) {
|
|
202
|
+
try {
|
|
203
|
+
execSync(`git -C "${studiographDir}" push`, { stdio: 'pipe' });
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
// Push failed — non-fatal
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return wrapToolResult({
|
|
210
|
+
success: true,
|
|
211
|
+
app: manifest.name,
|
|
212
|
+
version: manifest.version,
|
|
213
|
+
mountPath: manifest.mountPath,
|
|
214
|
+
installed,
|
|
215
|
+
committed,
|
|
216
|
+
pushed: params.push && committed,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
return wrapToolResult({ error: err instanceof Error ? err.message : String(err) });
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
if (clonedTempDir)
|
|
224
|
+
rmSync(clonedTempDir, { recursive: true, force: true });
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
// List installed apps
|
|
229
|
+
{
|
|
230
|
+
name: 'app_list',
|
|
231
|
+
label: 'List Apps',
|
|
232
|
+
description: 'List all installed Studiograph app plugins in the workspace.',
|
|
233
|
+
parameters: T.Object({}),
|
|
234
|
+
execute: async (_toolCallId, _params) => {
|
|
235
|
+
try {
|
|
236
|
+
const appsDir = join(workspacePath, '.studiograph', 'apps');
|
|
237
|
+
if (!existsSync(appsDir)) {
|
|
238
|
+
return wrapToolResult({ apps: [], count: 0 });
|
|
239
|
+
}
|
|
240
|
+
const apps = [];
|
|
241
|
+
for (const entry of readdirSync(appsDir)) {
|
|
242
|
+
const manifestPath = join(appsDir, entry, 'app.json');
|
|
243
|
+
if (!existsSync(manifestPath))
|
|
244
|
+
continue;
|
|
245
|
+
try {
|
|
246
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
247
|
+
apps.push({
|
|
248
|
+
name: manifest.name,
|
|
249
|
+
version: manifest.version,
|
|
250
|
+
description: manifest.description,
|
|
251
|
+
mountPath: manifest.mountPath,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// Skip malformed manifests
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return wrapToolResult({ apps, count: apps.length });
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
return wrapToolResult({ error: err instanceof Error ? err.message : String(err) });
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
// Deploy to Railway
|
|
266
|
+
{
|
|
267
|
+
name: 'deploy_railway',
|
|
268
|
+
label: 'Deploy to Railway',
|
|
269
|
+
description: 'Deploy the Studiograph workspace to Railway (first-time setup). Creates a project, service, volume, sets env vars, and triggers a deploy. Reads tokens from ~/.studiograph/user.json and ~/.studiograph/auth.json automatically. Only ask the user for tokens if they are not already saved. For redeploying an existing service, use redeploy_railway instead.',
|
|
270
|
+
parameters: T.Object({
|
|
271
|
+
railwayToken: T.Optional(T.String({ description: 'Railway API token (reads from user config if omitted)' })),
|
|
272
|
+
githubToken: T.Optional(T.String({ description: 'GitHub PAT (reads from auth.json if omitted)' })),
|
|
273
|
+
projectName: T.Optional(T.String({ description: 'Railway project name (default: team name)' })),
|
|
274
|
+
}),
|
|
275
|
+
execute: async (_toolCallId, params) => {
|
|
276
|
+
try {
|
|
277
|
+
// Resolve tokens from params, user config, or auth
|
|
278
|
+
const userConfig = loadUserConfig();
|
|
279
|
+
const railwayToken = params.railwayToken || process.env.RAILWAY_TOKEN || userConfig.railway_token;
|
|
280
|
+
if (!railwayToken) {
|
|
281
|
+
return wrapToolResult({ success: false, error: 'No Railway token found. Provide railwayToken parameter, set RAILWAY_TOKEN env var, or save railway_token in ~/.studiograph/user.json.' });
|
|
282
|
+
}
|
|
283
|
+
const githubToken = params.githubToken || loadGitHubToken();
|
|
284
|
+
if (!githubToken) {
|
|
285
|
+
return wrapToolResult({ success: false, error: 'No GitHub token found. Provide githubToken parameter, run `studiograph auth github`, or set GITHUB_TOKEN env var.' });
|
|
286
|
+
}
|
|
287
|
+
// Detect config repo URL
|
|
288
|
+
const configDir = join(workspacePath, '.studiograph');
|
|
289
|
+
const remote = spawnSync('git', ['remote', 'get-url', 'origin'], { cwd: configDir, encoding: 'utf-8' });
|
|
290
|
+
const configRepoUrl = remote.status === 0 ? remote.stdout.trim() : null;
|
|
291
|
+
if (!configRepoUrl) {
|
|
292
|
+
return wrapToolResult({ error: 'Could not detect config repo URL from .studiograph remote' });
|
|
293
|
+
}
|
|
294
|
+
const { randomBytes } = await import('crypto');
|
|
295
|
+
const apiKey = randomBytes(24).toString('base64url');
|
|
296
|
+
const webhookSecret = randomBytes(20).toString('hex');
|
|
297
|
+
const projectName = params.projectName
|
|
298
|
+
|| (workspaceConfig.team_name ? `${workspaceConfig.team_name} — Studiograph` : 'Studiograph');
|
|
299
|
+
// Determine start command from package version
|
|
300
|
+
const pkgPath = new URL('../../../package.json', import.meta.url);
|
|
301
|
+
const pkgVersion = JSON.parse(readFileSync(pkgPath, 'utf-8')).version;
|
|
302
|
+
const startCommand = pkgVersion.includes('-')
|
|
303
|
+
? `npx studiograph@${pkgVersion} serve`
|
|
304
|
+
: 'npx studiograph serve';
|
|
305
|
+
const query = (q, variables = {}) => railwayQuery(railwayToken, q, variables);
|
|
306
|
+
// Create project
|
|
307
|
+
const projectData = await query(`
|
|
308
|
+
mutation($input: ProjectCreateInput!) { projectCreate(input: $input) { id name } }
|
|
309
|
+
`, { input: { name: projectName } });
|
|
310
|
+
const projectId = projectData.projectCreate.id;
|
|
311
|
+
// Get environment
|
|
312
|
+
const envData = await query(`
|
|
313
|
+
query($id: String!) { project(id: $id) { environments { edges { node { id name } } } } }
|
|
314
|
+
`, { id: projectId });
|
|
315
|
+
const envId = envData.project.environments.edges[0].node.id;
|
|
316
|
+
// Create empty service
|
|
317
|
+
const serviceData = await query(`
|
|
318
|
+
mutation($input: ServiceCreateInput!) { serviceCreate(input: $input) { id name } }
|
|
319
|
+
`, { input: { projectId, name: 'studiograph' } });
|
|
320
|
+
const serviceId = serviceData.serviceCreate.id;
|
|
321
|
+
// Set start command
|
|
322
|
+
await query(`
|
|
323
|
+
mutation($serviceId: String!, $environmentId: String!, $input: ServiceInstanceUpdateInput!) {
|
|
324
|
+
serviceInstanceUpdate(serviceId: $serviceId, environmentId: $environmentId, input: $input)
|
|
325
|
+
}
|
|
326
|
+
`, { serviceId, environmentId: envId, input: { startCommand } });
|
|
327
|
+
// Create volume
|
|
328
|
+
await query(`
|
|
329
|
+
mutation($input: VolumeCreateInput!) { volumeCreate(input: $input) { id } }
|
|
330
|
+
`, { input: { projectId, serviceId, mountPath: '/workspace' } });
|
|
331
|
+
// Set env vars
|
|
332
|
+
await query(`
|
|
333
|
+
mutation($input: VariableCollectionUpsertInput!) { variableCollectionUpsert(input: $input) }
|
|
334
|
+
`, { input: { projectId, environmentId: envId, serviceId, variables: {
|
|
335
|
+
STUDIOGRAPH_CONFIG_REPO: configRepoUrl,
|
|
336
|
+
GITHUB_TOKEN: githubToken,
|
|
337
|
+
PORT: '3001',
|
|
338
|
+
API_KEYS: apiKey,
|
|
339
|
+
WEBHOOK_SECRET: webhookSecret,
|
|
340
|
+
} } });
|
|
341
|
+
// Generate domain
|
|
342
|
+
let domain = '';
|
|
343
|
+
try {
|
|
344
|
+
const d = await query(`
|
|
345
|
+
mutation($input: ServiceDomainCreateInput!) { serviceDomainCreate(input: $input) { id domain } }
|
|
346
|
+
`, { input: { serviceId, environmentId: envId } });
|
|
347
|
+
domain = d.serviceDomainCreate?.domain || '';
|
|
348
|
+
}
|
|
349
|
+
catch { /* non-fatal */ }
|
|
350
|
+
// Connect image (triggers deploy)
|
|
351
|
+
await query(`
|
|
352
|
+
mutation($id: String!, $input: ServiceConnectInput!) { serviceConnect(id: $id, input: $input) { id } }
|
|
353
|
+
`, { id: serviceId, input: { image: 'node:20' } });
|
|
354
|
+
return wrapToolResult({
|
|
355
|
+
success: true,
|
|
356
|
+
projectId,
|
|
357
|
+
projectName: projectData.projectCreate.name,
|
|
358
|
+
serviceId,
|
|
359
|
+
domain: domain ? `https://${domain}` : null,
|
|
360
|
+
dashboardUrl: `https://railway.com/project/${projectId}`,
|
|
361
|
+
apiKey,
|
|
362
|
+
webhookSecret,
|
|
363
|
+
startCommand,
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
catch (err) {
|
|
367
|
+
return wrapToolResult({ error: err instanceof Error ? err.message : String(err) });
|
|
368
|
+
}
|
|
369
|
+
},
|
|
370
|
+
},
|
|
371
|
+
// Redeploy existing Railway service
|
|
372
|
+
{
|
|
373
|
+
name: 'redeploy_railway',
|
|
374
|
+
label: 'Redeploy Railway',
|
|
375
|
+
description: 'Trigger a redeploy of an existing Railway service. Reads railway_token, railway_project_id, railway_service_id, and railway_environment_id from ~/.studiograph/user.json. Updates the start command to the current package version before redeploying. Call this after workspace_push to update the deployed server with latest commits — pushing alone does NOT update Railway.',
|
|
376
|
+
parameters: T.Object({}),
|
|
377
|
+
execute: async (_toolCallId, _params) => {
|
|
378
|
+
try {
|
|
379
|
+
const userConfig = loadUserConfig();
|
|
380
|
+
const token = process.env.RAILWAY_TOKEN || userConfig.railway_token;
|
|
381
|
+
if (!token) {
|
|
382
|
+
return wrapToolResult({ success: false, error: 'No Railway token found. Set railway_token in ~/.studiograph/user.json or RAILWAY_TOKEN env var.' });
|
|
383
|
+
}
|
|
384
|
+
const projectId = userConfig.railway_project_id;
|
|
385
|
+
let serviceId = userConfig.railway_service_id;
|
|
386
|
+
let environmentId = userConfig.railway_environment_id;
|
|
387
|
+
if (!projectId) {
|
|
388
|
+
return wrapToolResult({ success: false, error: 'No Railway project linked. Run `studiograph redeploy <railway-dashboard-url>` first or set railway_project_id in ~/.studiograph/user.json.' });
|
|
389
|
+
}
|
|
390
|
+
// Resolve service and environment from API if not saved
|
|
391
|
+
if (!serviceId || !environmentId) {
|
|
392
|
+
const data = await railwayQuery(token, `
|
|
393
|
+
query($id: String!) {
|
|
394
|
+
project(id: $id) {
|
|
395
|
+
services { edges { node { id name } } }
|
|
396
|
+
environments { edges { node { id name } } }
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
`, { id: projectId });
|
|
400
|
+
if (!environmentId) {
|
|
401
|
+
environmentId = data.project.environments.edges[0]?.node.id;
|
|
402
|
+
}
|
|
403
|
+
if (!serviceId) {
|
|
404
|
+
const services = data.project.services.edges.map((e) => e.node);
|
|
405
|
+
if (services.length === 0) {
|
|
406
|
+
return wrapToolResult({ success: false, error: 'No services found in this Railway project.' });
|
|
407
|
+
}
|
|
408
|
+
serviceId = services[0].id;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
if (!environmentId) {
|
|
412
|
+
return wrapToolResult({ success: false, error: 'Could not determine Railway environment.' });
|
|
413
|
+
}
|
|
414
|
+
// Update start command to current version
|
|
415
|
+
let startCommand = 'npx studiograph serve';
|
|
416
|
+
try {
|
|
417
|
+
const pkgPath = new URL('../../../package.json', import.meta.url);
|
|
418
|
+
const pkgVersion = JSON.parse(readFileSync(pkgPath, 'utf-8')).version;
|
|
419
|
+
startCommand = pkgVersion.includes('-')
|
|
420
|
+
? `npx studiograph@${pkgVersion} serve`
|
|
421
|
+
: 'npx studiograph serve';
|
|
422
|
+
await railwayQuery(token, `
|
|
423
|
+
mutation($serviceId: String!, $environmentId: String!, $input: ServiceInstanceUpdateInput!) {
|
|
424
|
+
serviceInstanceUpdate(serviceId: $serviceId, environmentId: $environmentId, input: $input)
|
|
425
|
+
}
|
|
426
|
+
`, { serviceId, environmentId, input: { startCommand } });
|
|
427
|
+
}
|
|
428
|
+
catch { /* non-fatal — continue with redeploy */ }
|
|
429
|
+
// Find latest deployment and redeploy
|
|
430
|
+
const deployData = await railwayQuery(token, `
|
|
431
|
+
query($projectId: String!, $serviceId: String!, $environmentId: String!) {
|
|
432
|
+
deployments(
|
|
433
|
+
input: { projectId: $projectId, serviceId: $serviceId, environmentId: $environmentId }
|
|
434
|
+
first: 1
|
|
435
|
+
) {
|
|
436
|
+
edges { node { id status } }
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
`, { projectId, serviceId, environmentId });
|
|
440
|
+
const latestDeploy = deployData.deployments.edges[0]?.node;
|
|
441
|
+
if (!latestDeploy) {
|
|
442
|
+
return wrapToolResult({ success: false, error: 'No previous deployment found. Run `studiograph deploy railway` first.' });
|
|
443
|
+
}
|
|
444
|
+
await railwayQuery(token, `
|
|
445
|
+
mutation($id: String!) {
|
|
446
|
+
deploymentRedeploy(id: $id) { id status }
|
|
447
|
+
}
|
|
448
|
+
`, { id: latestDeploy.id });
|
|
449
|
+
return wrapToolResult({
|
|
450
|
+
success: true,
|
|
451
|
+
message: 'Redeploy triggered',
|
|
452
|
+
startCommand,
|
|
453
|
+
dashboardUrl: `https://railway.com/project/${projectId}`,
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
catch (err) {
|
|
457
|
+
return wrapToolResult({ success: false, error: err instanceof Error ? err.message : String(err) });
|
|
458
|
+
}
|
|
459
|
+
},
|
|
460
|
+
},
|
|
461
|
+
// Provision GitHub repos
|
|
462
|
+
{
|
|
463
|
+
name: 'provision_repos',
|
|
464
|
+
label: 'Provision GitHub Repos',
|
|
465
|
+
description: 'Create GitHub repositories and push local repos that have no remote. Provisions repos that are missing a github_url in workspace config. Always confirm with the user before calling this.',
|
|
466
|
+
parameters: T.Object({
|
|
467
|
+
repos: T.Optional(T.Array(T.String(), { description: 'Specific repo names to provision (default: all unprovisioned repos)' })),
|
|
468
|
+
org: T.Optional(T.String({ description: 'GitHub organization (default: from workspace config)' })),
|
|
469
|
+
}),
|
|
470
|
+
execute: async (_toolCallId, params) => {
|
|
471
|
+
try {
|
|
472
|
+
// Resolve GitHub org
|
|
473
|
+
const org = params.org || workspaceConfig.github?.org;
|
|
474
|
+
if (!org) {
|
|
475
|
+
return wrapToolResult({ error: 'No GitHub org specified. Provide an org parameter or set github.org in workspace config.' });
|
|
476
|
+
}
|
|
477
|
+
// Resolve GitHub token
|
|
478
|
+
const token = loadGitHubToken();
|
|
479
|
+
if (!token) {
|
|
480
|
+
return wrapToolResult({ error: 'No GitHub token found. Run `studiograph auth github`, set GITHUB_TOKEN env var, or save token in ~/.studiograph/auth.json.' });
|
|
481
|
+
}
|
|
482
|
+
const octokit = new Octokit({ auth: token });
|
|
483
|
+
// Load fresh config to get current repo state
|
|
484
|
+
const workspace = new Workspace(workspacePath);
|
|
485
|
+
const config = await workspace.loadConfig();
|
|
486
|
+
// Filter repos to provision
|
|
487
|
+
let targetRepos = config.repos;
|
|
488
|
+
if (params.repos?.length) {
|
|
489
|
+
targetRepos = targetRepos.filter((r) => params.repos.includes(r.name));
|
|
490
|
+
const found = targetRepos.map((r) => r.name);
|
|
491
|
+
const missing = params.repos.filter((n) => !found.includes(n));
|
|
492
|
+
if (missing.length) {
|
|
493
|
+
return wrapToolResult({ error: `Repos not found in workspace config: ${missing.join(', ')}` });
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
// Only provision repos without github_url
|
|
497
|
+
const unprovisioned = targetRepos.filter((r) => !r.github_url);
|
|
498
|
+
const skippedNames = targetRepos.filter((r) => r.github_url).map((r) => r.name);
|
|
499
|
+
if (unprovisioned.length === 0) {
|
|
500
|
+
return wrapToolResult({ provisioned: [], skipped: skippedNames, message: 'All repos already have remotes.' });
|
|
501
|
+
}
|
|
502
|
+
const provisioned = [];
|
|
503
|
+
const errors = [];
|
|
504
|
+
for (const repo of unprovisioned) {
|
|
505
|
+
try {
|
|
506
|
+
const isPrivate = repo.access !== 'public';
|
|
507
|
+
const cloneUrl = await createGitHubRepo(octokit, org, repo.name, isPrivate, repo.description);
|
|
508
|
+
const localPath = join(workspacePath, repo.path);
|
|
509
|
+
const pushed = initAndPush(localPath, cloneUrl);
|
|
510
|
+
// Update config entry
|
|
511
|
+
const idx = config.repos.findIndex((r) => r.name === repo.name);
|
|
512
|
+
if (idx !== -1) {
|
|
513
|
+
config.repos[idx] = { ...config.repos[idx], github_url: cloneUrl };
|
|
514
|
+
}
|
|
515
|
+
provisioned.push(repo.name);
|
|
516
|
+
if (!pushed) {
|
|
517
|
+
errors.push(`${repo.name}: created repo but no commits to push`);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
catch (err) {
|
|
521
|
+
errors.push(`${repo.name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
// Persist updated config
|
|
525
|
+
if (provisioned.length > 0) {
|
|
526
|
+
workspace.writeConfig(config);
|
|
527
|
+
}
|
|
528
|
+
return wrapToolResult({
|
|
529
|
+
provisioned,
|
|
530
|
+
skipped: skippedNames,
|
|
531
|
+
org,
|
|
532
|
+
...(errors.length ? { errors } : {}),
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
catch (err) {
|
|
536
|
+
return wrapToolResult({ error: err instanceof Error ? err.message : String(err) });
|
|
537
|
+
}
|
|
538
|
+
},
|
|
539
|
+
},
|
|
540
|
+
];
|
|
541
|
+
}
|
|
542
|
+
//# sourceMappingURL=ops-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-tools.js","sourceRoot":"","sources":["../../../src/agent/tools/ops-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync & Enrich Tools for Studiograph Agent
|
|
3
|
+
*
|
|
4
|
+
* These tools allow the agent to orchestrate sync and enrich operations:
|
|
5
|
+
* - Run the sync pipeline, apply staging, commit
|
|
6
|
+
* - Run LLM enrichment on entities
|
|
7
|
+
* - Manage source configs
|
|
8
|
+
*/
|
|
9
|
+
import type { WorkspaceConfig } from '../../core/types.js';
|
|
10
|
+
import type { ConnectorRegistry } from './connector-tools.js';
|
|
11
|
+
/**
|
|
12
|
+
* Mutable holder so the connector registry can be injected after async init.
|
|
13
|
+
* The sync inspect/sample tools gracefully degrade when registry is null.
|
|
14
|
+
*/
|
|
15
|
+
export interface ConnectorRegistryRef {
|
|
16
|
+
registry: ConnectorRegistry | null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create sync tools for the agent
|
|
20
|
+
*/
|
|
21
|
+
export declare function createSyncTools(workspacePath: string, workspaceConfig: WorkspaceConfig, registryRef?: ConnectorRegistryRef): {
|
|
22
|
+
name: string;
|
|
23
|
+
label: string;
|
|
24
|
+
description: string;
|
|
25
|
+
parameters: import("@sinclair/typebox").TObject<{}>;
|
|
26
|
+
execute: (toolCallId: string, params: any) => Promise<{
|
|
27
|
+
content: {
|
|
28
|
+
type: "text";
|
|
29
|
+
text: string;
|
|
30
|
+
}[];
|
|
31
|
+
details: any;
|
|
32
|
+
}>;
|
|
33
|
+
}[];
|