studiograph 1.1.3 → 1.2.0-beta.2
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.js +56 -11
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/system.md +28 -10
- 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 +68 -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 +11 -1
- package/dist/agent/tools/graph-tools.js +90 -29
- 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/sync-tools.d.ts +25 -0
- package/dist/agent/tools/sync-tools.js +691 -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/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 +43 -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 +262 -112
- 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 +21 -203
- 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/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/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/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 +285 -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 +36 -5
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/index.js +31 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/scaffolding.d.ts +2 -1
- package/dist/cli/scaffolding.js +36 -22
- 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 +4 -8
- package/dist/core/graph.js +145 -96
- 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 +0 -3
- package/dist/core/types.js +0 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +6 -0
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/workspace.d.ts +13 -5
- package/dist/core/workspace.js +110 -33
- package/dist/core/workspace.js.map +1 -1
- 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 +14 -9
- package/dist/server/index.js.map +1 -1
- package/dist/server/plugin-loader.d.ts +7 -0
- package/dist/server/plugin-loader.js +54 -2
- package/dist/server/plugin-loader.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 +58 -0
- package/dist/services/sync/commit.js +354 -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 +26 -4
- package/dist/utils/git.js +55 -7
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/merge-resolver.d.ts +34 -0
- package/dist/utils/merge-resolver.js +201 -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/package.json +16 -7
- /package/dist/agent/skills/{bundled/gather-context.md → gather-context.md} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../../src/mcp/connectors/definitions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../../src/mcp/connectors/definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAqCzC,iFAAiF;AAEjF,MAAM,CAAC,MAAM,qBAAqB,GAAwC;IACxE,MAAM;IACN,OAAO;IACP,KAAK;IACL,SAAS;IACT,MAAM;IACN,KAAK;IACL,KAAK;IACL,cAAc,EAAE,WAAW;IAC3B,QAAQ;CACT,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ConnectorDefinition } from './definitions.js';
|
|
2
|
+
/** Local desktop server — requires Figma desktop app running with Dev Mode MCP enabled. */
|
|
3
|
+
export declare const figma: ConnectorDefinition;
|
|
4
|
+
/** Remote OAuth server — full tool set including generate_figma_design. Requires Figma client approval. */
|
|
5
|
+
export declare const figmaRemote: ConnectorDefinition;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Local desktop server — requires Figma desktop app running with Dev Mode MCP enabled. */
|
|
2
|
+
export const figma = {
|
|
3
|
+
name: 'figma',
|
|
4
|
+
label: 'Figma (desktop)',
|
|
5
|
+
description: 'Figma — read designs, generate FigJam diagrams, Code Connect mappings (via desktop app)',
|
|
6
|
+
type: 'http',
|
|
7
|
+
url: 'http://127.0.0.1:3845/mcp',
|
|
8
|
+
credentialFields: [],
|
|
9
|
+
docsUrl: 'https://developers.figma.com/docs/figma-mcp-server/local-server-installation/',
|
|
10
|
+
};
|
|
11
|
+
/** Remote OAuth server — full tool set including generate_figma_design. Requires Figma client approval. */
|
|
12
|
+
export const figmaRemote = {
|
|
13
|
+
name: 'figma-remote',
|
|
14
|
+
label: 'Figma (remote)',
|
|
15
|
+
description: 'Figma — full tool set including design generation (via OAuth)',
|
|
16
|
+
type: 'oauth',
|
|
17
|
+
url: 'https://mcp.figma.com/mcp',
|
|
18
|
+
credentialFields: [],
|
|
19
|
+
docsUrl: 'https://developers.figma.com/docs/figma-mcp-server/remote-server-installation/',
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=figma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figma.js","sourceRoot":"","sources":["../../../src/mcp/connectors/figma.ts"],"names":[],"mappings":"AAEA,2FAA2F;AAC3F,MAAM,CAAC,MAAM,KAAK,GAAwB;IACxC,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,iBAAiB;IACxB,WAAW,EAAE,yFAAyF;IACtG,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,2BAA2B;IAChC,gBAAgB,EAAE,EAAE;IACpB,OAAO,EAAE,+EAA+E;CACzF,CAAC;AAEF,2GAA2G;AAC3G,MAAM,CAAC,MAAM,WAAW,GAAwB;IAC9C,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,gBAAgB;IACvB,WAAW,EAAE,+DAA+D;IAC5E,IAAI,EAAE,OAAO;IACb,GAAG,EAAE,2BAA2B;IAChC,gBAAgB,EAAE,EAAE;IACpB,OAAO,EAAE,gFAAgF;CAC1F,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const gdrive = {
|
|
2
|
+
name: 'gdrive',
|
|
3
|
+
label: 'Google Drive',
|
|
4
|
+
description: 'Google Drive — read/write docs, sheets, folders, and file metadata',
|
|
5
|
+
type: 'stdio',
|
|
6
|
+
command: 'npx',
|
|
7
|
+
args: ['-y', '@anthropic-ai/google-docs-mcp@latest'],
|
|
8
|
+
credentialFields: [
|
|
9
|
+
{
|
|
10
|
+
key: 'env.GOOGLE_OAUTH_CREDENTIALS',
|
|
11
|
+
label: 'Path to Google OAuth credentials JSON',
|
|
12
|
+
description: 'Download from: Google Cloud Console → APIs & Services → Credentials → OAuth 2.0 Client',
|
|
13
|
+
secret: false,
|
|
14
|
+
required: true,
|
|
15
|
+
placeholder: '~/.config/google/credentials.json',
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
docsUrl: 'https://www.npmjs.com/package/@anthropic-ai/google-docs-mcp',
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=gdrive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gdrive.js","sourceRoot":"","sources":["../../../src/mcp/connectors/gdrive.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAwB;IACzC,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,cAAc;IACrB,WAAW,EAAE,oEAAoE;IACjF,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,sCAAsC,CAAC;IACpD,gBAAgB,EAAE;QAChB;YACE,GAAG,EAAE,8BAA8B;YACnC,KAAK,EAAE,uCAAuC;YAC9C,WAAW,EAAE,wFAAwF;YACrG,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,mCAAmC;SACjD;KACF;IACD,OAAO,EAAE,6DAA6D;CACvE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const granola = {
|
|
2
|
+
name: 'granola',
|
|
3
|
+
label: 'Granola',
|
|
4
|
+
description: 'Granola — search and read AI-summarized meeting notes',
|
|
5
|
+
type: 'stdio',
|
|
6
|
+
command: 'npx',
|
|
7
|
+
args: ['-y', 'granola-mcp'],
|
|
8
|
+
// No credential fields — Granola reads auth from the installed Granola app
|
|
9
|
+
credentialFields: [],
|
|
10
|
+
docsUrl: 'https://granola.ai',
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=granola.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"granola.js","sourceRoot":"","sources":["../../../src/mcp/connectors/granola.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,OAAO,GAAwB;IAC1C,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,uDAAuD;IACpE,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC;IAC3B,2EAA2E;IAC3E,gBAAgB,EAAE,EAAE;IACpB,OAAO,EAAE,oBAAoB;CAC9B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const linear = {
|
|
2
|
+
name: 'linear',
|
|
3
|
+
label: 'Linear',
|
|
4
|
+
description: 'Linear issue tracking — create/update issues, search projects',
|
|
5
|
+
type: 'http',
|
|
6
|
+
url: 'https://mcp.linear.app/mcp',
|
|
7
|
+
credentialFields: [
|
|
8
|
+
{
|
|
9
|
+
key: 'token',
|
|
10
|
+
label: 'Linear API key',
|
|
11
|
+
description: 'Settings → API → Personal API keys → Create key',
|
|
12
|
+
secret: true,
|
|
13
|
+
required: true,
|
|
14
|
+
placeholder: 'lin_api_...',
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
docsUrl: 'https://linear.app/docs/api',
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=linear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../../src/mcp/connectors/linear.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAwB;IACzC,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,QAAQ;IACf,WAAW,EAAE,+DAA+D;IAC5E,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,4BAA4B;IACjC,gBAAgB,EAAE;QAChB;YACE,GAAG,EAAE,OAAO;YACZ,KAAK,EAAE,gBAAgB;YACvB,WAAW,EAAE,iDAAiD;YAC9D,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,aAAa;SAC3B;KACF;IACD,OAAO,EAAE,6BAA6B;CACvC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const obsidian = {
|
|
2
|
+
name: 'obsidian',
|
|
3
|
+
label: 'Obsidian',
|
|
4
|
+
description: 'Obsidian — read and search vault files via a user-provided MCP server',
|
|
5
|
+
type: 'stdio',
|
|
6
|
+
// No command/args — user provides their own MCP server binary
|
|
7
|
+
credentialFields: [
|
|
8
|
+
{
|
|
9
|
+
key: 'env.OBSIDIAN_VAULT',
|
|
10
|
+
label: 'Path to Obsidian vault',
|
|
11
|
+
description: 'Absolute path to the vault directory on disk',
|
|
12
|
+
secret: false,
|
|
13
|
+
required: false,
|
|
14
|
+
placeholder: '~/Vaults/MyVault',
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
docsUrl: 'https://obsidian.md',
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=obsidian.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../../src/mcp/connectors/obsidian.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAwB;IAC3C,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,WAAW,EAAE,uEAAuE;IACpF,IAAI,EAAE,OAAO;IACb,8DAA8D;IAC9D,gBAAgB,EAAE;QAChB;YACE,GAAG,EAAE,oBAAoB;YACzB,KAAK,EAAE,wBAAwB;YAC/B,WAAW,EAAE,8CAA8C;YAC3D,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,kBAAkB;SAChC;KACF;IACD,OAAO,EAAE,qBAAqB;CAC/B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const pipedrive = {
|
|
2
|
+
name: 'pipedrive',
|
|
3
|
+
label: 'Pipedrive',
|
|
4
|
+
description: 'Pipedrive CRM — contacts, deals, activities, pipeline',
|
|
5
|
+
type: 'stdio',
|
|
6
|
+
command: 'npx',
|
|
7
|
+
args: ['-y', '@modelcontextprotocol/server-pipedrive'],
|
|
8
|
+
credentialFields: [
|
|
9
|
+
{
|
|
10
|
+
key: 'env.PIPEDRIVE_API_TOKEN',
|
|
11
|
+
label: 'Pipedrive API token',
|
|
12
|
+
description: 'Settings → Personal preferences → API → Your personal API token',
|
|
13
|
+
secret: true,
|
|
14
|
+
required: true,
|
|
15
|
+
placeholder: 'your-api-token',
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
docsUrl: 'https://developers.pipedrive.com/docs/api/v1',
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=pipedrive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipedrive.js","sourceRoot":"","sources":["../../../src/mcp/connectors/pipedrive.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAwB;IAC5C,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,WAAW;IAClB,WAAW,EAAE,uDAAuD;IACpE,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,wCAAwC,CAAC;IACtD,gBAAgB,EAAE;QAChB;YACE,GAAG,EAAE,yBAAyB;YAC9B,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE,iEAAiE;YAC9E,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,gBAAgB;SAC9B;KACF;IACD,OAAO,EAAE,8CAA8C;CACxD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const slack = {
|
|
2
|
+
name: 'slack',
|
|
3
|
+
label: 'Slack',
|
|
4
|
+
description: 'Slack — search messages, list channels, post updates',
|
|
5
|
+
type: 'stdio',
|
|
6
|
+
command: 'npx',
|
|
7
|
+
args: ['-y', '@modelcontextprotocol/server-slack'],
|
|
8
|
+
credentialFields: [
|
|
9
|
+
{
|
|
10
|
+
key: 'env.SLACK_BOT_TOKEN',
|
|
11
|
+
label: 'Slack token',
|
|
12
|
+
description: 'Bot token (xoxb-...) or User OAuth token (xoxp-...). ' +
|
|
13
|
+
'Create at: api.slack.com/apps → OAuth & Permissions',
|
|
14
|
+
secret: true,
|
|
15
|
+
required: true,
|
|
16
|
+
placeholder: 'xoxb-...',
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
docsUrl: 'https://api.slack.com/authentication/token-types',
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=slack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/mcp/connectors/slack.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,KAAK,GAAwB;IACxC,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,sDAAsD;IACnE,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,oCAAoC,CAAC;IAClD,gBAAgB,EAAE;QAChB;YACE,GAAG,EAAE,qBAAqB;YAC1B,KAAK,EAAE,aAAa;YACpB,WAAW,EAAE,uDAAuD;gBAClE,qDAAqD;YACvD,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,UAAU;SACxB;KACF;IACD,OAAO,EAAE,kDAAkD;CAC5D,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth Client Provider for MCP Connectors
|
|
3
|
+
*
|
|
4
|
+
* Implements OAuthClientProvider from the MCP SDK to support OAuth-based
|
|
5
|
+
* MCP servers (Figma, Linear, etc.) using dynamic client registration.
|
|
6
|
+
*
|
|
7
|
+
* Storage: ~/.studiograph/connectors/<name>.oauth.json (tokens, client info, PKCE verifier)
|
|
8
|
+
* Auth flow: opens browser → local callback server → exchanges code for tokens
|
|
9
|
+
*
|
|
10
|
+
* Works with any MCP server that supports RFC 8414 (OAuth metadata discovery)
|
|
11
|
+
* and RFC 7591 (dynamic client registration). No pre-registered client secrets needed.
|
|
12
|
+
*/
|
|
13
|
+
import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
14
|
+
import type { OAuthClientMetadata, OAuthClientInformationMixed, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js';
|
|
15
|
+
/**
|
|
16
|
+
* File-backed OAuth provider for a single connector.
|
|
17
|
+
* Stores tokens and client info alongside the connector config.
|
|
18
|
+
*/
|
|
19
|
+
export declare class ConnectorOAuthProvider implements OAuthClientProvider {
|
|
20
|
+
private connectorName;
|
|
21
|
+
private storagePath;
|
|
22
|
+
constructor(connectorName: string);
|
|
23
|
+
get redirectUrl(): URL;
|
|
24
|
+
get clientMetadata(): OAuthClientMetadata;
|
|
25
|
+
clientInformation(): Promise<OAuthClientInformationMixed | undefined>;
|
|
26
|
+
saveClientInformation(info: OAuthClientInformationMixed): Promise<void>;
|
|
27
|
+
tokens(): Promise<OAuthTokens | undefined>;
|
|
28
|
+
saveTokens(tokens: OAuthTokens): Promise<void>;
|
|
29
|
+
redirectToAuthorization(authorizationUrl: URL): Promise<void>;
|
|
30
|
+
saveCodeVerifier(codeVerifier: string): Promise<void>;
|
|
31
|
+
codeVerifier(): Promise<string>;
|
|
32
|
+
invalidateCredentials(scope: 'all' | 'client' | 'tokens' | 'verifier'): Promise<void>;
|
|
33
|
+
private _load;
|
|
34
|
+
private _save;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Start a temporary local HTTP server to receive the OAuth callback.
|
|
38
|
+
* Returns a promise that resolves with the authorization code.
|
|
39
|
+
* Server auto-closes after receiving the callback or timing out.
|
|
40
|
+
*/
|
|
41
|
+
export declare function waitForOAuthCallback(timeoutMs?: number): Promise<string>;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth Client Provider for MCP Connectors
|
|
3
|
+
*
|
|
4
|
+
* Implements OAuthClientProvider from the MCP SDK to support OAuth-based
|
|
5
|
+
* MCP servers (Figma, Linear, etc.) using dynamic client registration.
|
|
6
|
+
*
|
|
7
|
+
* Storage: ~/.studiograph/connectors/<name>.oauth.json (tokens, client info, PKCE verifier)
|
|
8
|
+
* Auth flow: opens browser → local callback server → exchanges code for tokens
|
|
9
|
+
*
|
|
10
|
+
* Works with any MCP server that supports RFC 8414 (OAuth metadata discovery)
|
|
11
|
+
* and RFC 7591 (dynamic client registration). No pre-registered client secrets needed.
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
14
|
+
import { join } from 'path';
|
|
15
|
+
import { createServer } from 'http';
|
|
16
|
+
import { CONNECTORS_DIR } from './connector-manager.js';
|
|
17
|
+
const CALLBACK_PORT = 38741; // Fixed port for OAuth callbacks
|
|
18
|
+
const CALLBACK_PATH = '/oauth/callback';
|
|
19
|
+
const REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;
|
|
20
|
+
/**
|
|
21
|
+
* File-backed OAuth provider for a single connector.
|
|
22
|
+
* Stores tokens and client info alongside the connector config.
|
|
23
|
+
*/
|
|
24
|
+
export class ConnectorOAuthProvider {
|
|
25
|
+
connectorName;
|
|
26
|
+
storagePath;
|
|
27
|
+
constructor(connectorName) {
|
|
28
|
+
this.connectorName = connectorName;
|
|
29
|
+
this.storagePath = join(CONNECTORS_DIR, `${connectorName}.oauth.json`);
|
|
30
|
+
}
|
|
31
|
+
get redirectUrl() {
|
|
32
|
+
return new URL(REDIRECT_URI);
|
|
33
|
+
}
|
|
34
|
+
get clientMetadata() {
|
|
35
|
+
return {
|
|
36
|
+
redirect_uris: [REDIRECT_URI],
|
|
37
|
+
client_name: 'Studiograph',
|
|
38
|
+
grant_types: ['authorization_code', 'refresh_token'],
|
|
39
|
+
response_types: ['code'],
|
|
40
|
+
token_endpoint_auth_method: 'none', // public client — no secret
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async clientInformation() {
|
|
44
|
+
return this._load().clientInfo;
|
|
45
|
+
}
|
|
46
|
+
async saveClientInformation(info) {
|
|
47
|
+
const data = this._load();
|
|
48
|
+
data.clientInfo = info;
|
|
49
|
+
this._save(data);
|
|
50
|
+
}
|
|
51
|
+
async tokens() {
|
|
52
|
+
return this._load().tokens;
|
|
53
|
+
}
|
|
54
|
+
async saveTokens(tokens) {
|
|
55
|
+
const data = this._load();
|
|
56
|
+
data.tokens = tokens;
|
|
57
|
+
this._save(data);
|
|
58
|
+
}
|
|
59
|
+
async redirectToAuthorization(authorizationUrl) {
|
|
60
|
+
// Open browser to authorization URL
|
|
61
|
+
const { exec } = await import('child_process');
|
|
62
|
+
const url = authorizationUrl.toString();
|
|
63
|
+
const platform = process.platform;
|
|
64
|
+
if (platform === 'darwin') {
|
|
65
|
+
exec(`open "${url}"`);
|
|
66
|
+
}
|
|
67
|
+
else if (platform === 'win32') {
|
|
68
|
+
exec(`start "" "${url}"`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
exec(`xdg-open "${url}"`);
|
|
72
|
+
}
|
|
73
|
+
console.log(`[connectors] Opening browser for ${this.connectorName} authorization...`);
|
|
74
|
+
}
|
|
75
|
+
async saveCodeVerifier(codeVerifier) {
|
|
76
|
+
const data = this._load();
|
|
77
|
+
data.codeVerifier = codeVerifier;
|
|
78
|
+
this._save(data);
|
|
79
|
+
}
|
|
80
|
+
async codeVerifier() {
|
|
81
|
+
const data = this._load();
|
|
82
|
+
return data.codeVerifier ?? '';
|
|
83
|
+
}
|
|
84
|
+
async invalidateCredentials(scope) {
|
|
85
|
+
const data = this._load();
|
|
86
|
+
if (scope === 'all' || scope === 'tokens')
|
|
87
|
+
data.tokens = undefined;
|
|
88
|
+
if (scope === 'all' || scope === 'client')
|
|
89
|
+
data.clientInfo = undefined;
|
|
90
|
+
if (scope === 'all' || scope === 'verifier')
|
|
91
|
+
data.codeVerifier = undefined;
|
|
92
|
+
this._save(data);
|
|
93
|
+
}
|
|
94
|
+
// ── storage helpers ──────────────────────────────────────────────────────
|
|
95
|
+
_load() {
|
|
96
|
+
if (!existsSync(this.storagePath))
|
|
97
|
+
return {};
|
|
98
|
+
try {
|
|
99
|
+
return JSON.parse(readFileSync(this.storagePath, 'utf-8'));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
_save(data) {
|
|
106
|
+
mkdirSync(CONNECTORS_DIR, { recursive: true });
|
|
107
|
+
writeFileSync(this.storagePath, JSON.stringify(data, null, 2) + '\n', { mode: 0o600 });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ── Callback server ──────────────────────────────────────────────────────────
|
|
111
|
+
/**
|
|
112
|
+
* Start a temporary local HTTP server to receive the OAuth callback.
|
|
113
|
+
* Returns a promise that resolves with the authorization code.
|
|
114
|
+
* Server auto-closes after receiving the callback or timing out.
|
|
115
|
+
*/
|
|
116
|
+
export function waitForOAuthCallback(timeoutMs = 120_000) {
|
|
117
|
+
return new Promise((resolve, reject) => {
|
|
118
|
+
let server;
|
|
119
|
+
const timeout = setTimeout(() => {
|
|
120
|
+
server?.close();
|
|
121
|
+
reject(new Error('OAuth callback timed out (2 minutes)'));
|
|
122
|
+
}, timeoutMs);
|
|
123
|
+
server = createServer((req, res) => {
|
|
124
|
+
const url = new URL(req.url ?? '/', `http://localhost:${CALLBACK_PORT}`);
|
|
125
|
+
if (url.pathname !== CALLBACK_PATH) {
|
|
126
|
+
res.writeHead(404);
|
|
127
|
+
res.end('Not found');
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const code = url.searchParams.get('code');
|
|
131
|
+
const error = url.searchParams.get('error');
|
|
132
|
+
if (error) {
|
|
133
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
134
|
+
res.end(`<html><body><h2>Authorization failed</h2><p>${error}</p><p>You can close this tab.</p></body></html>`);
|
|
135
|
+
clearTimeout(timeout);
|
|
136
|
+
server.close();
|
|
137
|
+
reject(new Error(`OAuth authorization denied: ${error}`));
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (!code) {
|
|
141
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
142
|
+
res.end('<html><body><h2>Missing authorization code</h2><p>You can close this tab.</p></body></html>');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
146
|
+
res.end('<html><body><h2>Authorization successful</h2><p>You can close this tab and return to Studiograph.</p></body></html>');
|
|
147
|
+
clearTimeout(timeout);
|
|
148
|
+
server.close();
|
|
149
|
+
resolve(code);
|
|
150
|
+
});
|
|
151
|
+
server.listen(CALLBACK_PORT, () => {
|
|
152
|
+
// Server ready — browser will be opened by redirectToAuthorization()
|
|
153
|
+
});
|
|
154
|
+
server.on('error', (err) => {
|
|
155
|
+
clearTimeout(timeout);
|
|
156
|
+
reject(new Error(`Failed to start OAuth callback server: ${err.message}`));
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=oauth-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-provider.js","sourceRoot":"","sources":["../../src/mcp/oauth-provider.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.js
CHANGED
|
@@ -68,15 +68,20 @@ export async function createServer(config) {
|
|
|
68
68
|
if (toolsDir)
|
|
69
69
|
appToolsDirs.push(toolsDir);
|
|
70
70
|
}
|
|
71
|
-
// Initialize agent —
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
71
|
+
// Initialize agent — non-fatal so the server can still serve graph API and apps
|
|
72
|
+
try {
|
|
73
|
+
const agent = new AgentOrchestrator({
|
|
74
|
+
workspacePath: config.workspacePath,
|
|
75
|
+
workspaceConfig: config.workspaceConfig,
|
|
76
|
+
gitUser: config.gitUser,
|
|
77
|
+
skillsDirs: appSkillsDirs,
|
|
78
|
+
toolsDirs: appToolsDirs,
|
|
79
|
+
});
|
|
80
|
+
await registerChatRoutes(fastify, agent);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
fastify.log.warn(`Agent not available: ${err.message ?? err} — chat routes disabled`);
|
|
84
|
+
}
|
|
80
85
|
// GitHub webhook route
|
|
81
86
|
await registerWebhookRoutes(fastify, config.workspaceManager, config.webhookSecret);
|
|
82
87
|
// Mount app plugins
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Scans .studiograph/apps/ for installed apps, parses their manifests,
|
|
5
5
|
* and mounts their Fastify plugins under the declared mountPath.
|
|
6
|
+
* Also serves static assets from each app's static/ directory.
|
|
6
7
|
*/
|
|
7
8
|
import type { FastifyInstance } from 'fastify';
|
|
8
9
|
import { WorkspaceManager } from '../core/workspace-manager.js';
|
|
@@ -29,8 +30,14 @@ export declare class PluginLoader {
|
|
|
29
30
|
* Return the tools directory for a given app, if it exists.
|
|
30
31
|
*/
|
|
31
32
|
getToolsDir(appsDir: string, manifest: AppManifest): string | null;
|
|
33
|
+
/**
|
|
34
|
+
* Return the static assets directory for a given app, if it exists.
|
|
35
|
+
*/
|
|
36
|
+
getStaticDir(appsDir: string, manifest: AppManifest): string | null;
|
|
32
37
|
/**
|
|
33
38
|
* Dynamically import and register a plugin under its mountPath.
|
|
39
|
+
* Also mounts a static file handler at {mountPath}/static/* if the
|
|
40
|
+
* app has a static/ directory.
|
|
34
41
|
*/
|
|
35
42
|
mountPlugin(fastify: FastifyInstance, manifest: AppManifest, appDir: string, opts: {
|
|
36
43
|
workspaceManager: WorkspaceManager;
|
|
@@ -3,9 +3,31 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Scans .studiograph/apps/ for installed apps, parses their manifests,
|
|
5
5
|
* and mounts their Fastify plugins under the declared mountPath.
|
|
6
|
+
* Also serves static assets from each app's static/ directory.
|
|
6
7
|
*/
|
|
7
|
-
import { existsSync, readdirSync, readFileSync } from 'fs';
|
|
8
|
-
import { join } from 'path';
|
|
8
|
+
import { existsSync, readdirSync, readFileSync, createReadStream } from 'fs';
|
|
9
|
+
import { join, extname } from 'path';
|
|
10
|
+
const MIME_TYPES = {
|
|
11
|
+
'.html': 'text/html',
|
|
12
|
+
'.css': 'text/css',
|
|
13
|
+
'.js': 'application/javascript',
|
|
14
|
+
'.mjs': 'application/javascript',
|
|
15
|
+
'.json': 'application/json',
|
|
16
|
+
'.png': 'image/png',
|
|
17
|
+
'.jpg': 'image/jpeg',
|
|
18
|
+
'.jpeg': 'image/jpeg',
|
|
19
|
+
'.gif': 'image/gif',
|
|
20
|
+
'.svg': 'image/svg+xml',
|
|
21
|
+
'.ico': 'image/x-icon',
|
|
22
|
+
'.woff': 'font/woff',
|
|
23
|
+
'.woff2': 'font/woff2',
|
|
24
|
+
'.ttf': 'font/ttf',
|
|
25
|
+
'.otf': 'font/otf',
|
|
26
|
+
'.webp': 'image/webp',
|
|
27
|
+
'.avif': 'image/avif',
|
|
28
|
+
'.mp4': 'video/mp4',
|
|
29
|
+
'.webm': 'video/webm',
|
|
30
|
+
};
|
|
9
31
|
export class PluginLoader {
|
|
10
32
|
/**
|
|
11
33
|
* Scan appsDir for installed apps and return their manifests.
|
|
@@ -70,8 +92,17 @@ export class PluginLoader {
|
|
|
70
92
|
const dir = join(appsDir, manifest.name, 'tools');
|
|
71
93
|
return existsSync(dir) ? dir : null;
|
|
72
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Return the static assets directory for a given app, if it exists.
|
|
97
|
+
*/
|
|
98
|
+
getStaticDir(appsDir, manifest) {
|
|
99
|
+
const dir = join(appsDir, manifest.name, 'static');
|
|
100
|
+
return existsSync(dir) ? dir : null;
|
|
101
|
+
}
|
|
73
102
|
/**
|
|
74
103
|
* Dynamically import and register a plugin under its mountPath.
|
|
104
|
+
* Also mounts a static file handler at {mountPath}/static/* if the
|
|
105
|
+
* app has a static/ directory.
|
|
75
106
|
*/
|
|
76
107
|
async mountPlugin(fastify, manifest, appDir, opts) {
|
|
77
108
|
const pluginPath = join(appDir, manifest.name, manifest.plugin);
|
|
@@ -84,12 +115,33 @@ export class PluginLoader {
|
|
|
84
115
|
if (typeof pluginFn !== 'function') {
|
|
85
116
|
throw new Error(`Plugin at ${pluginPath} does not export a function`);
|
|
86
117
|
}
|
|
118
|
+
const staticDir = this.getStaticDir(appDir, manifest);
|
|
87
119
|
await fastify.register(pluginFn, {
|
|
88
120
|
prefix: manifest.mountPath,
|
|
89
121
|
workspaceManager: opts.workspaceManager,
|
|
90
122
|
gitUser: opts.gitUser,
|
|
91
123
|
appsDir: appDir,
|
|
124
|
+
staticDir,
|
|
92
125
|
});
|
|
126
|
+
// Mount static file handler if app has a static/ directory
|
|
127
|
+
if (staticDir) {
|
|
128
|
+
await fastify.register(async (instance) => {
|
|
129
|
+
instance.get('/*', async (req, reply) => {
|
|
130
|
+
const filePath = req.params['*'];
|
|
131
|
+
if (!filePath || filePath.includes('..')) {
|
|
132
|
+
return reply.status(400).send({ error: 'Invalid path' });
|
|
133
|
+
}
|
|
134
|
+
const fullPath = join(staticDir, filePath);
|
|
135
|
+
if (!existsSync(fullPath)) {
|
|
136
|
+
return reply.status(404).send({ error: 'Not found' });
|
|
137
|
+
}
|
|
138
|
+
const ext = extname(fullPath).toLowerCase();
|
|
139
|
+
const contentType = MIME_TYPES[ext] || 'application/octet-stream';
|
|
140
|
+
reply.type(contentType);
|
|
141
|
+
return reply.send(createReadStream(fullPath));
|
|
142
|
+
});
|
|
143
|
+
}, { prefix: `${manifest.mountPath}/static` });
|
|
144
|
+
}
|
|
93
145
|
}
|
|
94
146
|
}
|
|
95
147
|
//# sourceMappingURL=plugin-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../src/server/plugin-loader.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../src/server/plugin-loader.ts"],"names":[],"mappings":"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"}
|