@aexol/opencode-wizard 0.3.3 → 0.3.5

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 (106) hide show
  1. package/README.md +9 -7
  2. package/dist/graphql-operations.d.ts +7 -0
  3. package/dist/graphql-operations.js +230 -0
  4. package/dist/graphql-operations.js.map +1 -0
  5. package/dist/plugin-tools.d.ts +90 -0
  6. package/dist/plugin-tools.js +93 -0
  7. package/dist/plugin-tools.js.map +1 -0
  8. package/dist/published-skills-system-note.d.ts +9 -0
  9. package/dist/published-skills-system-note.js +30 -0
  10. package/dist/published-skills-system-note.js.map +1 -0
  11. package/dist/published-skills-terminology.d.ts +21 -0
  12. package/dist/published-skills-terminology.js +38 -0
  13. package/dist/published-skills-terminology.js.map +1 -0
  14. package/dist/published-skills-transform.d.ts +258 -0
  15. package/dist/published-skills-transform.js +310 -0
  16. package/dist/published-skills-transform.js.map +1 -0
  17. package/dist/server/auth-bootstrap.d.ts +7 -0
  18. package/dist/server/auth-bootstrap.js +89 -0
  19. package/dist/server/auth-bootstrap.js.map +1 -0
  20. package/dist/server/auth-flow.d.ts +10 -0
  21. package/dist/server/auth-flow.js +215 -0
  22. package/dist/server/auth-flow.js.map +1 -0
  23. package/dist/server/auth-store.d.ts +19 -0
  24. package/dist/server/auth-store.js +177 -0
  25. package/dist/server/auth-store.js.map +1 -0
  26. package/dist/server/client.d.ts +80 -0
  27. package/dist/server/client.js +324 -0
  28. package/dist/server/client.js.map +1 -0
  29. package/dist/server/config.d.ts +2 -0
  30. package/dist/server/config.js +82 -0
  31. package/dist/server/config.js.map +1 -0
  32. package/dist/server/constants.d.ts +26 -0
  33. package/dist/server/constants.js +32 -0
  34. package/dist/server/constants.js.map +1 -0
  35. package/dist/server/path-utils.d.ts +2 -0
  36. package/dist/server/path-utils.js +8 -0
  37. package/dist/server/path-utils.js.map +1 -0
  38. package/dist/server/preferences.d.ts +22 -0
  39. package/dist/server/preferences.js +121 -0
  40. package/dist/server/preferences.js.map +1 -0
  41. package/dist/server/presence.d.ts +14 -0
  42. package/dist/server/presence.js +68 -0
  43. package/dist/server/presence.js.map +1 -0
  44. package/dist/server/runtime.d.ts +13 -0
  45. package/dist/server/runtime.js +1315 -0
  46. package/dist/server/runtime.js.map +1 -0
  47. package/dist/server/status.d.ts +27 -0
  48. package/dist/server/status.js +224 -0
  49. package/dist/server/status.js.map +1 -0
  50. package/dist/server/types.d.ts +396 -0
  51. package/dist/server/types.js +2 -0
  52. package/dist/server/types.js.map +1 -0
  53. package/dist/server/workspace.d.ts +15 -0
  54. package/dist/server/workspace.js +126 -0
  55. package/dist/server/workspace.js.map +1 -0
  56. package/dist/server.d.ts +4 -309
  57. package/dist/server.js +4 -2611
  58. package/dist/server.js.map +1 -1
  59. package/dist/smoke-published-skills.js +11 -9
  60. package/dist/smoke-published-skills.js.map +1 -1
  61. package/dist/tui/components/common.d.ts +15 -0
  62. package/dist/tui/components/common.js +81 -0
  63. package/dist/tui/components/common.js.map +1 -0
  64. package/dist/tui/components/preference-action-notice-row.d.ts +5 -0
  65. package/dist/tui/components/preference-action-notice-row.js +17 -0
  66. package/dist/tui/components/preference-action-notice-row.js.map +1 -0
  67. package/dist/tui/components/skill-catalog-row.d.ts +8 -0
  68. package/dist/tui/components/skill-catalog-row.js +125 -0
  69. package/dist/tui/components/skill-catalog-row.js.map +1 -0
  70. package/dist/tui/components/status-content.d.ts +14 -0
  71. package/dist/tui/components/status-content.js +131 -0
  72. package/dist/tui/components/status-content.js.map +1 -0
  73. package/dist/tui/components/wizard-skills-dialog-content.d.ts +9 -0
  74. package/dist/tui/components/wizard-skills-dialog-content.js +229 -0
  75. package/dist/tui/components/wizard-skills-dialog-content.js.map +1 -0
  76. package/dist/tui/components/wizard-skills-dialog.d.ts +7 -0
  77. package/dist/tui/components/wizard-skills-dialog.js +156 -0
  78. package/dist/tui/components/wizard-skills-dialog.js.map +1 -0
  79. package/dist/tui/constants.d.ts +8 -0
  80. package/dist/tui/constants.js +9 -0
  81. package/dist/tui/constants.js.map +1 -0
  82. package/dist/tui/formatting.d.ts +8 -0
  83. package/dist/tui/formatting.js +45 -0
  84. package/dist/tui/formatting.js.map +1 -0
  85. package/dist/tui/plugin.d.ts +2 -0
  86. package/dist/tui/plugin.js +26 -0
  87. package/dist/tui/plugin.js.map +1 -0
  88. package/dist/tui/rendering.d.ts +2 -0
  89. package/dist/tui/rendering.js +8 -0
  90. package/dist/tui/rendering.js.map +1 -0
  91. package/dist/tui/skill-helpers.d.ts +13 -0
  92. package/dist/tui/skill-helpers.js +50 -0
  93. package/dist/tui/skill-helpers.js.map +1 -0
  94. package/dist/tui/slots.d.ts +2 -0
  95. package/dist/tui/slots.js +56 -0
  96. package/dist/tui/slots.js.map +1 -0
  97. package/dist/tui/status.d.ts +2 -0
  98. package/dist/tui/status.js +21 -0
  99. package/dist/tui/status.js.map +1 -0
  100. package/dist/tui/types.d.ts +75 -0
  101. package/dist/tui/types.js +2 -0
  102. package/dist/tui/types.js.map +1 -0
  103. package/dist/tui.d.ts +1 -44
  104. package/dist/tui.js +2 -870
  105. package/dist/tui.js.map +1 -1
  106. package/package.json +1 -1
@@ -0,0 +1,82 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { resolveBackendOriginFromValues } from '../config.js';
4
+ import { getGlobalConfigPath, ROOT_SKILL_SEED_PATH } from './constants.js';
5
+ import { normalizeAbsolutePath, toWorkspaceSlug } from './path-utils.js';
6
+ const parseDotEnvValue = value => {
7
+ const trimmedValue = value.trim();
8
+ if (trimmedValue.startsWith('"') && trimmedValue.endsWith('"') || trimmedValue.startsWith("'") && trimmedValue.endsWith("'")) {
9
+ return trimmedValue.slice(1, -1);
10
+ }
11
+ return trimmedValue;
12
+ };
13
+ const parseDotEnv = raw => {
14
+ const values = new Map();
15
+ for (const line of raw.split(/\r?\n/u)) {
16
+ const trimmedLine = line.trim();
17
+ if (!trimmedLine || trimmedLine.startsWith('#')) continue;
18
+ const separatorIndex = trimmedLine.indexOf('=');
19
+ if (separatorIndex <= 0) continue;
20
+ const key = trimmedLine.slice(0, separatorIndex).trim();
21
+ if (!key) continue;
22
+ const rawValue = trimmedLine.slice(separatorIndex + 1);
23
+ values.set(key, parseDotEnvValue(rawValue));
24
+ }
25
+ return values;
26
+ };
27
+ const findUpwardFile = async (startDirectory, fileName) => {
28
+ let currentDirectory = normalizeAbsolutePath(startDirectory);
29
+ while (true) {
30
+ const candidatePath = path.join(currentDirectory, fileName);
31
+ try {
32
+ await fs.access(candidatePath);
33
+ return candidatePath;
34
+ } catch {
35
+ const parentDirectory = path.dirname(currentDirectory);
36
+ if (parentDirectory === currentDirectory) return null;
37
+ currentDirectory = parentDirectory;
38
+ }
39
+ }
40
+ };
41
+ const readLocalEnvValues = async startDirectory => {
42
+ const envPath = await findUpwardFile(startDirectory, '.env');
43
+ if (!envPath) return new Map();
44
+ try {
45
+ const raw = await fs.readFile(envPath, 'utf8');
46
+ return parseDotEnv(raw);
47
+ } catch {
48
+ return new Map();
49
+ }
50
+ };
51
+ const resolveBackendOrigin = async worktree => {
52
+ const envValues = await readLocalEnvValues(worktree);
53
+ return resolveBackendOriginFromValues({
54
+ environmentBackendOrigin: process.env.OPENCODE_WIZARD_BACKEND_ORIGIN,
55
+ localBackendOrigin: envValues.get('OPENCODE_WIZARD_BACKEND_ORIGIN')
56
+ });
57
+ };
58
+ const readConfiguredWorkspaceSlug = () => {
59
+ const configuredWorkspaceSlug = process.env.OPENCODE_WIZARD_SKILLS_WORKSPACE_SLUG?.trim();
60
+ if (!configuredWorkspaceSlug) return null;
61
+ return toWorkspaceSlug(configuredWorkspaceSlug);
62
+ };
63
+ const resolveFallbackWorkspaceSlug = worktree => {
64
+ const configuredWorkspaceSlug = readConfiguredWorkspaceSlug();
65
+ if (configuredWorkspaceSlug) return configuredWorkspaceSlug;
66
+ return toWorkspaceSlug(path.basename(path.resolve(worktree)));
67
+ };
68
+ export const resolveConfig = async worktree => {
69
+ const backendOrigin = await resolveBackendOrigin(worktree);
70
+ return {
71
+ backendOrigin,
72
+ graphqlUrl: `${backendOrigin}/graphql`,
73
+ authSessionUrl: `${backendOrigin}/api/opencode-plugin/oauth/session`,
74
+ presenceUrl: `${backendOrigin}/api/opencode-plugin/presence`,
75
+ actionsUrl: `${backendOrigin}/api/opencode-plugin/actions`,
76
+ configuredWorkspaceSlug: readConfiguredWorkspaceSlug(),
77
+ fallbackWorkspaceSlug: resolveFallbackWorkspaceSlug(worktree),
78
+ rootSkillSeedPath: ROOT_SKILL_SEED_PATH,
79
+ authStatePath: getGlobalConfigPath()
80
+ };
81
+ };
82
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["fs","path","resolveBackendOriginFromValues","getGlobalConfigPath","ROOT_SKILL_SEED_PATH","normalizeAbsolutePath","toWorkspaceSlug","parseDotEnvValue","value","trimmedValue","trim","startsWith","endsWith","slice","parseDotEnv","raw","values","Map","line","split","trimmedLine","separatorIndex","indexOf","key","rawValue","set","findUpwardFile","startDirectory","fileName","currentDirectory","candidatePath","join","access","parentDirectory","dirname","readLocalEnvValues","envPath","readFile","resolveBackendOrigin","worktree","envValues","environmentBackendOrigin","process","env","OPENCODE_WIZARD_BACKEND_ORIGIN","localBackendOrigin","get","readConfiguredWorkspaceSlug","configuredWorkspaceSlug","OPENCODE_WIZARD_SKILLS_WORKSPACE_SLUG","resolveFallbackWorkspaceSlug","basename","resolve","resolveConfig","backendOrigin","graphqlUrl","authSessionUrl","presenceUrl","actionsUrl","fallbackWorkspaceSlug","rootSkillSeedPath","authStatePath"],"sources":["../../src/server/config.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { resolveBackendOriginFromValues } from '../config.js';\nimport { getGlobalConfigPath, ROOT_SKILL_SEED_PATH } from './constants.js';\nimport type { ResolvedConfig } from './types.js';\nimport { normalizeAbsolutePath, toWorkspaceSlug } from './path-utils.js';\n\nconst parseDotEnvValue = (value: string): string => {\n const trimmedValue = value.trim();\n\n if (\n (trimmedValue.startsWith('\"') && trimmedValue.endsWith('\"')) ||\n (trimmedValue.startsWith(\"'\") && trimmedValue.endsWith(\"'\"))\n ) {\n return trimmedValue.slice(1, -1);\n }\n\n return trimmedValue;\n};\n\nconst parseDotEnv = (raw: string): Map<string, string> => {\n const values = new Map<string, string>();\n\n for (const line of raw.split(/\\r?\\n/u)) {\n const trimmedLine = line.trim();\n if (!trimmedLine || trimmedLine.startsWith('#')) continue;\n\n const separatorIndex = trimmedLine.indexOf('=');\n if (separatorIndex <= 0) continue;\n\n const key = trimmedLine.slice(0, separatorIndex).trim();\n if (!key) continue;\n\n const rawValue = trimmedLine.slice(separatorIndex + 1);\n values.set(key, parseDotEnvValue(rawValue));\n }\n\n return values;\n};\n\nconst findUpwardFile = async (startDirectory: string, fileName: string): Promise<string | null> => {\n let currentDirectory = normalizeAbsolutePath(startDirectory);\n\n while (true) {\n const candidatePath = path.join(currentDirectory, fileName);\n\n try {\n await fs.access(candidatePath);\n return candidatePath;\n } catch {\n const parentDirectory = path.dirname(currentDirectory);\n if (parentDirectory === currentDirectory) return null;\n currentDirectory = parentDirectory;\n }\n }\n};\n\nconst readLocalEnvValues = async (startDirectory: string): Promise<Map<string, string>> => {\n const envPath = await findUpwardFile(startDirectory, '.env');\n if (!envPath) return new Map<string, string>();\n\n try {\n const raw = await fs.readFile(envPath, 'utf8');\n return parseDotEnv(raw);\n } catch {\n return new Map<string, string>();\n }\n};\n\nconst resolveBackendOrigin = async (worktree: string): Promise<string> => {\n const envValues = await readLocalEnvValues(worktree);\n\n return resolveBackendOriginFromValues({\n environmentBackendOrigin: process.env.OPENCODE_WIZARD_BACKEND_ORIGIN,\n localBackendOrigin: envValues.get('OPENCODE_WIZARD_BACKEND_ORIGIN'),\n });\n};\n\nconst readConfiguredWorkspaceSlug = (): string | null => {\n const configuredWorkspaceSlug = process.env.OPENCODE_WIZARD_SKILLS_WORKSPACE_SLUG?.trim();\n if (!configuredWorkspaceSlug) return null;\n return toWorkspaceSlug(configuredWorkspaceSlug);\n};\n\nconst resolveFallbackWorkspaceSlug = (worktree: string): string => {\n const configuredWorkspaceSlug = readConfiguredWorkspaceSlug();\n if (configuredWorkspaceSlug) return configuredWorkspaceSlug;\n return toWorkspaceSlug(path.basename(path.resolve(worktree)));\n};\n\nexport const resolveConfig = async (worktree: string): Promise<ResolvedConfig> => {\n const backendOrigin = await resolveBackendOrigin(worktree);\n\n return {\n backendOrigin,\n graphqlUrl: `${backendOrigin}/graphql`,\n authSessionUrl: `${backendOrigin}/api/opencode-plugin/oauth/session`,\n presenceUrl: `${backendOrigin}/api/opencode-plugin/presence`,\n actionsUrl: `${backendOrigin}/api/opencode-plugin/actions`,\n configuredWorkspaceSlug: readConfiguredWorkspaceSlug(),\n fallbackWorkspaceSlug: resolveFallbackWorkspaceSlug(worktree),\n rootSkillSeedPath: ROOT_SKILL_SEED_PATH,\n authStatePath: getGlobalConfigPath(),\n };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,26 @@
1
+ export declare const PLUGIN_ID = "opencode-wizard";
2
+ export declare const CACHE_TTL_MS = 30000;
3
+ export declare const WORKSPACE_MAPPING_LIMIT = 100;
4
+ export declare const ROOT_SKILL_SEED_PATH = ".opencode/skills";
5
+ export declare const getGlobalConfigPath: () => string;
6
+ export declare const LEGACY_AUTH_STATE_PATH = "plugin/opencode-wizard/.generated/auth-state.json";
7
+ export declare const OIDC_ISSUER = "https://login.microsoftonline.com/86f4caf4-0d6f-4682-9a06-ea57f3e4e76c/v2.0";
8
+ export declare const OIDC_CLIENT_ID = "da963901-2375-442b-9e99-14e59f43eda2";
9
+ export declare const OIDC_CALLBACK_ORIGIN = "http://localhost:24953";
10
+ export declare const OIDC_CALLBACK_PATH = "/oauth/callback";
11
+ export declare const OIDC_CALLBACK_URL = "http://localhost:24953/oauth/callback";
12
+ export declare const OIDC_SCOPES: string[];
13
+ export declare const LOGIN_TIMEOUT_MS: number;
14
+ export declare const PRESENCE_EVENT_TIMEOUT_MS = 3000;
15
+ export declare const PRESENCE_EVENT_MAX_ATTEMPTS = 2;
16
+ export declare const PRESENCE_EVENT_RETRY_DELAY_MS = 250;
17
+ export declare const PRESENCE_SHUTDOWN_SIGNALS: readonly ["SIGINT", "SIGTERM", "SIGHUP"];
18
+ export declare const PRESENCE_SIGNAL_EXIT_CODES: Record<(typeof PRESENCE_SHUTDOWN_SIGNALS)[number], number>;
19
+ export type NativeSkillsUrlCompatibility = {
20
+ configKey: 'skills.urls';
21
+ deliveryMode: 'public_static_registry';
22
+ wizardPrivateDelivery: 'authenticated_scoped_fetch_tool';
23
+ authSupport: 'none';
24
+ guidance: string;
25
+ };
26
+ export declare const NATIVE_SKILLS_URL_COMPATIBILITY: NativeSkillsUrlCompatibility;
@@ -0,0 +1,32 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ export const PLUGIN_ID = 'opencode-wizard';
4
+ export const CACHE_TTL_MS = 30_000;
5
+ export const WORKSPACE_MAPPING_LIMIT = 100;
6
+ export const ROOT_SKILL_SEED_PATH = '.opencode/skills';
7
+ export const getGlobalConfigPath = () => path.join(os.homedir(), '.config', 'opencode', 'opencode-wizard.json');
8
+ export const LEGACY_AUTH_STATE_PATH = 'plugin/opencode-wizard/.generated/auth-state.json';
9
+ export const OIDC_ISSUER = 'https://login.microsoftonline.com/86f4caf4-0d6f-4682-9a06-ea57f3e4e76c/v2.0';
10
+ export const OIDC_CLIENT_ID = 'da963901-2375-442b-9e99-14e59f43eda2';
11
+ export const OIDC_CALLBACK_ORIGIN = 'http://localhost:24953';
12
+ export const OIDC_CALLBACK_PATH = '/oauth/callback';
13
+ export const OIDC_CALLBACK_URL = `${OIDC_CALLBACK_ORIGIN}${OIDC_CALLBACK_PATH}`;
14
+ export const OIDC_SCOPES = ['openid', 'profile', 'email'];
15
+ export const LOGIN_TIMEOUT_MS = 5 * 60_000;
16
+ export const PRESENCE_EVENT_TIMEOUT_MS = 3_000;
17
+ export const PRESENCE_EVENT_MAX_ATTEMPTS = 2;
18
+ export const PRESENCE_EVENT_RETRY_DELAY_MS = 250;
19
+ export const PRESENCE_SHUTDOWN_SIGNALS = ['SIGINT', 'SIGTERM', 'SIGHUP'];
20
+ export const PRESENCE_SIGNAL_EXIT_CODES = {
21
+ SIGINT: 130,
22
+ SIGTERM: 143,
23
+ SIGHUP: 129
24
+ };
25
+ export const NATIVE_SKILLS_URL_COMPATIBILITY = {
26
+ configKey: 'skills.urls',
27
+ deliveryMode: 'public_static_registry',
28
+ wizardPrivateDelivery: 'authenticated_scoped_fetch_tool',
29
+ authSupport: 'none',
30
+ guidance: 'OpenCode skills.urls is for public/static registries and complements opencode-wizard; private workspace-scoped skills stay available through the authenticated fetch tool only.'
31
+ };
32
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["os","path","PLUGIN_ID","CACHE_TTL_MS","WORKSPACE_MAPPING_LIMIT","ROOT_SKILL_SEED_PATH","getGlobalConfigPath","join","homedir","LEGACY_AUTH_STATE_PATH","OIDC_ISSUER","OIDC_CLIENT_ID","OIDC_CALLBACK_ORIGIN","OIDC_CALLBACK_PATH","OIDC_CALLBACK_URL","OIDC_SCOPES","LOGIN_TIMEOUT_MS","PRESENCE_EVENT_TIMEOUT_MS","PRESENCE_EVENT_MAX_ATTEMPTS","PRESENCE_EVENT_RETRY_DELAY_MS","PRESENCE_SHUTDOWN_SIGNALS","PRESENCE_SIGNAL_EXIT_CODES","SIGINT","SIGTERM","SIGHUP","NATIVE_SKILLS_URL_COMPATIBILITY","configKey","deliveryMode","wizardPrivateDelivery","authSupport","guidance"],"sources":["../../src/server/constants.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\n\nexport const PLUGIN_ID = 'opencode-wizard';\nexport const CACHE_TTL_MS = 30_000;\nexport const WORKSPACE_MAPPING_LIMIT = 100;\nexport const ROOT_SKILL_SEED_PATH = '.opencode/skills';\nexport const getGlobalConfigPath = (): string => path.join(os.homedir(), '.config', 'opencode', 'opencode-wizard.json');\nexport const LEGACY_AUTH_STATE_PATH = 'plugin/opencode-wizard/.generated/auth-state.json';\nexport const OIDC_ISSUER = 'https://login.microsoftonline.com/86f4caf4-0d6f-4682-9a06-ea57f3e4e76c/v2.0';\nexport const OIDC_CLIENT_ID = 'da963901-2375-442b-9e99-14e59f43eda2';\nexport const OIDC_CALLBACK_ORIGIN = 'http://localhost:24953';\nexport const OIDC_CALLBACK_PATH = '/oauth/callback';\nexport const OIDC_CALLBACK_URL = `${OIDC_CALLBACK_ORIGIN}${OIDC_CALLBACK_PATH}`;\nexport const OIDC_SCOPES = ['openid', 'profile', 'email'];\nexport const LOGIN_TIMEOUT_MS = 5 * 60_000;\nexport const PRESENCE_EVENT_TIMEOUT_MS = 3_000;\nexport const PRESENCE_EVENT_MAX_ATTEMPTS = 2;\nexport const PRESENCE_EVENT_RETRY_DELAY_MS = 250;\nexport const PRESENCE_SHUTDOWN_SIGNALS = ['SIGINT', 'SIGTERM', 'SIGHUP'] as const satisfies readonly NodeJS.Signals[];\nexport const PRESENCE_SIGNAL_EXIT_CODES: Record<(typeof PRESENCE_SHUTDOWN_SIGNALS)[number], number> = {\n SIGINT: 130,\n SIGTERM: 143,\n SIGHUP: 129,\n};\n\nexport type NativeSkillsUrlCompatibility = {\n configKey: 'skills.urls';\n deliveryMode: 'public_static_registry';\n wizardPrivateDelivery: 'authenticated_scoped_fetch_tool';\n authSupport: 'none';\n guidance: string;\n};\n\nexport const NATIVE_SKILLS_URL_COMPATIBILITY: NativeSkillsUrlCompatibility = {\n configKey: 'skills.urls',\n deliveryMode: 'public_static_registry',\n wizardPrivateDelivery: 'authenticated_scoped_fetch_tool',\n authSupport: 'none',\n guidance:\n 'OpenCode skills.urls is for public/static registries and complements opencode-wizard; private workspace-scoped skills stay available through the authenticated fetch tool only.',\n};\n"],"mappings":"AAAA,OAAOA,EAAE,MAAM,SAAS;AACxB,OAAOC,IAAI,MAAM,WAAW;AAE5B,OAAO,MAAMC,SAAS,GAAG,iBAAiB;AAC1C,OAAO,MAAMC,YAAY,GAAG,MAAM;AAClC,OAAO,MAAMC,uBAAuB,GAAG,GAAG;AAC1C,OAAO,MAAMC,oBAAoB,GAAG,kBAAkB;AACtD,OAAO,MAAMC,mBAAmB,GAAGA,CAAA,KAAcL,IAAI,CAACM,IAAI,CAACP,EAAE,CAACQ,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,CAAC;AACvH,OAAO,MAAMC,sBAAsB,GAAG,mDAAmD;AACzF,OAAO,MAAMC,WAAW,GAAG,6EAA6E;AACxG,OAAO,MAAMC,cAAc,GAAG,sCAAsC;AACpE,OAAO,MAAMC,oBAAoB,GAAG,wBAAwB;AAC5D,OAAO,MAAMC,kBAAkB,GAAG,iBAAiB;AACnD,OAAO,MAAMC,iBAAiB,GAAG,GAAGF,oBAAoB,GAAGC,kBAAkB,EAAE;AAC/E,OAAO,MAAME,WAAW,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;AACzD,OAAO,MAAMC,gBAAgB,GAAG,CAAC,GAAG,MAAM;AAC1C,OAAO,MAAMC,yBAAyB,GAAG,KAAK;AAC9C,OAAO,MAAMC,2BAA2B,GAAG,CAAC;AAC5C,OAAO,MAAMC,6BAA6B,GAAG,GAAG;AAChD,OAAO,MAAMC,yBAAyB,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAA8C;AACrH,OAAO,MAAMC,0BAAsF,GAAG;EACpGC,MAAM,EAAE,GAAG;EACXC,OAAO,EAAE,GAAG;EACZC,MAAM,EAAE;AACV,CAAC;AAUD,OAAO,MAAMC,+BAA6D,GAAG;EAC3EC,SAAS,EAAE,aAAa;EACxBC,YAAY,EAAE,wBAAwB;EACtCC,qBAAqB,EAAE,iCAAiC;EACxDC,WAAW,EAAE,MAAM;EACnBC,QAAQ,EACN;AACJ,CAAC","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export declare const normalizeAbsolutePath: (value: string) => string;
2
+ export declare const toWorkspaceSlug: (value: string) => string;
@@ -0,0 +1,8 @@
1
+ import path from 'node:path';
2
+ export const normalizeAbsolutePath = value => path.resolve(value);
3
+ export const toWorkspaceSlug = value => {
4
+ const normalized = value.trim().toLowerCase().replace(/[^a-z0-9-]+/gu, '-').replace(/^-+|-+$/gu, '');
5
+ if (normalized) return normalized;
6
+ return 'workspace';
7
+ };
8
+ //# sourceMappingURL=path-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["path","normalizeAbsolutePath","value","resolve","toWorkspaceSlug","normalized","trim","toLowerCase","replace"],"sources":["../../src/server/path-utils.ts"],"sourcesContent":["import path from 'node:path';\n\nexport const normalizeAbsolutePath = (value: string): string => path.resolve(value);\n\nexport const toWorkspaceSlug = (value: string): string => {\n const normalized = value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9-]+/gu, '-')\n .replace(/^-+|-+$/gu, '');\n\n if (normalized) return normalized;\n return 'workspace';\n};\n"],"mappings":"AAAA,OAAOA,IAAI,MAAM,WAAW;AAE5B,OAAO,MAAMC,qBAAqB,GAAIC,KAAa,IAAaF,IAAI,CAACG,OAAO,CAACD,KAAK,CAAC;AAEnF,OAAO,MAAME,eAAe,GAAIF,KAAa,IAAa;EACxD,MAAMG,UAAU,GAAGH,KAAK,CACrBI,IAAI,CAAC,CAAC,CACNC,WAAW,CAAC,CAAC,CACbC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAC7BA,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;EAE3B,IAAIH,UAAU,EAAE,OAAOA,UAAU;EACjC,OAAO,WAAW;AACpB,CAAC","ignoreList":[]}
@@ -0,0 +1,22 @@
1
+ import type { PublishedSkillPreferenceAction, PublishedSkillPreferenceCacheContext, PublishedSkillsIgnoreState, ResolvedConfig, WorkspaceResolution } from './types.js';
2
+ export declare const toIgnoredSkillSlug: (value: string) => string | null;
3
+ export declare const toPublishedSkillPreferenceAction: (value: string) => PublishedSkillPreferenceAction;
4
+ export declare const toPublishedSkillPreferenceScope: (value: string | undefined, defaultScope: "global" | "project") => "global" | "project";
5
+ export declare const resolvePublishedSkillPreferenceCacheContext: (config: ResolvedConfig) => Promise<PublishedSkillPreferenceCacheContext>;
6
+ export declare const getCatalogCacheKey: (workspaceResolution: WorkspaceResolution, preferenceContext: PublishedSkillPreferenceCacheContext) => string;
7
+ export declare const setPublishedSkillIgnored: ({ worktree, directory, skillSlug, ignored, preferenceScope, }: {
8
+ worktree: string;
9
+ directory: string;
10
+ scopeKey?: string;
11
+ skillSlug: string;
12
+ ignored: boolean;
13
+ preferenceScope?: "global" | "project";
14
+ }) => Promise<PublishedSkillsIgnoreState>;
15
+ export declare const setPublishedSkillInstalled: ({ worktree, directory, skillSlug, installed, preferenceScope, }: {
16
+ worktree: string;
17
+ directory: string;
18
+ scopeKey?: string;
19
+ skillSlug: string;
20
+ installed: boolean;
21
+ preferenceScope: "global" | "project";
22
+ }) => Promise<PublishedSkillsIgnoreState>;
@@ -0,0 +1,121 @@
1
+ import { SET_PUBLISHED_SKILL_PREFERENCE_MUTATION } from '../graphql-operations.js';
2
+ import { readGlobalAuthState, toStoredUserKey } from './auth-store.js';
3
+ import { fetchPublishedSkillsGraphQl } from './client.js';
4
+ import { PRESENCE_EVENT_TIMEOUT_MS } from './constants.js';
5
+ import { resolveConfig } from './config.js';
6
+ import { resolveWorkspace, toDeliveryInput } from './workspace.js';
7
+ let publishedSkillPreferenceCacheVersion = 0;
8
+ export const toIgnoredSkillSlug = value => {
9
+ const normalized = value.trim().toLowerCase();
10
+ if (!normalized) return null;
11
+ return normalized;
12
+ };
13
+ export const toPublishedSkillPreferenceAction = value => {
14
+ const normalized = value.trim().toLowerCase();
15
+ if (normalized === 'install' || normalized === 'uninstall' || normalized === 'ignore' || normalized === 'unignore') {
16
+ return normalized;
17
+ }
18
+ throw new Error('Published skill preference action must be one of: install, uninstall, ignore, unignore.');
19
+ };
20
+ export const toPublishedSkillPreferenceScope = (value, defaultScope) => {
21
+ if (!value) return defaultScope;
22
+ const normalized = value.trim().toLowerCase();
23
+ if (normalized === 'global' || normalized === 'project') return normalized;
24
+ throw new Error('Published skill preferenceScope must be either global or project.');
25
+ };
26
+ export const resolvePublishedSkillPreferenceCacheContext = async config => {
27
+ const authState = await readGlobalAuthState(config.authStatePath);
28
+ return {
29
+ userKey: toStoredUserKey(authState),
30
+ preferenceVersion: publishedSkillPreferenceCacheVersion
31
+ };
32
+ };
33
+ export const getCatalogCacheKey = (workspaceResolution, preferenceContext) => JSON.stringify([workspaceResolution.cacheKey, preferenceContext.userKey, preferenceContext.preferenceVersion]);
34
+ const toBackendPreferenceScope = preferenceScope => {
35
+ if (preferenceScope === 'global') return 'GLOBAL';
36
+ return 'WORKSPACE';
37
+ };
38
+ const setPublishedSkillPreference = async ({
39
+ worktree,
40
+ directory,
41
+ config,
42
+ skillSlug,
43
+ preferenceScope,
44
+ installed,
45
+ ignored
46
+ }) => {
47
+ const workspaceResolution = await resolveWorkspace({
48
+ config,
49
+ directory
50
+ });
51
+ const response = await fetchPublishedSkillsGraphQl({
52
+ worktree,
53
+ config,
54
+ query: SET_PUBLISHED_SKILL_PREFERENCE_MUTATION,
55
+ variables: {
56
+ input: {
57
+ ...toDeliveryInput(workspaceResolution),
58
+ skillSlug,
59
+ preferenceScope: toBackendPreferenceScope(preferenceScope),
60
+ installed,
61
+ ignored
62
+ }
63
+ },
64
+ signal: AbortSignal.timeout(PRESENCE_EVENT_TIMEOUT_MS)
65
+ });
66
+ if (!response.ok) {
67
+ throw new Error(response.result.message);
68
+ }
69
+ const preferences = response.data.setPublishedSkillPreference;
70
+ publishedSkillPreferenceCacheVersion += 1;
71
+ return {
72
+ scopeKey: preferences.scopeKey,
73
+ userKey: preferences.userKey,
74
+ ignoredSkillSlugs: preferences.ignoredSkills.map(item => item.skill.slug),
75
+ installedGlobalSkillSlugs: [],
76
+ installedWorkspaceSkillSlugs: []
77
+ };
78
+ };
79
+ export const setPublishedSkillIgnored = async ({
80
+ worktree,
81
+ directory,
82
+ skillSlug,
83
+ ignored,
84
+ preferenceScope
85
+ }) => {
86
+ const config = await resolveConfig(worktree);
87
+ const normalizedSkillSlug = toIgnoredSkillSlug(skillSlug);
88
+ if (!normalizedSkillSlug) {
89
+ throw new Error('Cannot toggle an empty published skill slug.');
90
+ }
91
+ return setPublishedSkillPreference({
92
+ worktree,
93
+ directory,
94
+ config,
95
+ skillSlug: normalizedSkillSlug,
96
+ preferenceScope: preferenceScope ?? 'project',
97
+ ignored
98
+ });
99
+ };
100
+ export const setPublishedSkillInstalled = async ({
101
+ worktree,
102
+ directory,
103
+ skillSlug,
104
+ installed,
105
+ preferenceScope
106
+ }) => {
107
+ const config = await resolveConfig(worktree);
108
+ const normalizedSkillSlug = toIgnoredSkillSlug(skillSlug);
109
+ if (!normalizedSkillSlug) {
110
+ throw new Error('Cannot toggle an empty published skill slug.');
111
+ }
112
+ return setPublishedSkillPreference({
113
+ worktree,
114
+ directory,
115
+ config,
116
+ skillSlug: normalizedSkillSlug,
117
+ preferenceScope,
118
+ installed
119
+ });
120
+ };
121
+ //# sourceMappingURL=preferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SET_PUBLISHED_SKILL_PREFERENCE_MUTATION","readGlobalAuthState","toStoredUserKey","fetchPublishedSkillsGraphQl","PRESENCE_EVENT_TIMEOUT_MS","resolveConfig","resolveWorkspace","toDeliveryInput","publishedSkillPreferenceCacheVersion","toIgnoredSkillSlug","value","normalized","trim","toLowerCase","toPublishedSkillPreferenceAction","Error","toPublishedSkillPreferenceScope","defaultScope","resolvePublishedSkillPreferenceCacheContext","config","authState","authStatePath","userKey","preferenceVersion","getCatalogCacheKey","workspaceResolution","preferenceContext","JSON","stringify","cacheKey","toBackendPreferenceScope","preferenceScope","setPublishedSkillPreference","worktree","directory","skillSlug","installed","ignored","response","query","variables","input","signal","AbortSignal","timeout","ok","result","message","preferences","data","scopeKey","ignoredSkillSlugs","ignoredSkills","map","item","skill","slug","installedGlobalSkillSlugs","installedWorkspaceSkillSlugs","setPublishedSkillIgnored","normalizedSkillSlug","setPublishedSkillInstalled"],"sources":["../../src/server/preferences.ts"],"sourcesContent":["import { SET_PUBLISHED_SKILL_PREFERENCE_MUTATION } from '../graphql-operations.js';\nimport { readGlobalAuthState, toStoredUserKey } from './auth-store.js';\nimport { fetchPublishedSkillsGraphQl } from './client.js';\nimport { PRESENCE_EVENT_TIMEOUT_MS } from './constants.js';\nimport { resolveConfig } from './config.js';\nimport { resolveWorkspace, toDeliveryInput } from './workspace.js';\nimport type {\n PublishedSkillPreferenceAction,\n PublishedSkillPreferenceCacheContext,\n PublishedSkillPreferenceScope,\n PublishedSkillsIgnoreState,\n ResolvedConfig,\n SetPublishedSkillPreferenceResponse,\n WorkspaceResolution,\n} from './types.js';\n\nlet publishedSkillPreferenceCacheVersion = 0;\n\nexport const toIgnoredSkillSlug = (value: string): string | null => {\n const normalized = value.trim().toLowerCase();\n if (!normalized) return null;\n return normalized;\n};\n\nexport const toPublishedSkillPreferenceAction = (value: string): PublishedSkillPreferenceAction => {\n const normalized = value.trim().toLowerCase();\n if (\n normalized === 'install' ||\n normalized === 'uninstall' ||\n normalized === 'ignore' ||\n normalized === 'unignore'\n ) {\n return normalized;\n }\n\n throw new Error('Published skill preference action must be one of: install, uninstall, ignore, unignore.');\n};\n\nexport const toPublishedSkillPreferenceScope = (\n value: string | undefined,\n defaultScope: 'global' | 'project',\n): 'global' | 'project' => {\n if (!value) return defaultScope;\n\n const normalized = value.trim().toLowerCase();\n if (normalized === 'global' || normalized === 'project') return normalized;\n\n throw new Error('Published skill preferenceScope must be either global or project.');\n};\n\nexport const resolvePublishedSkillPreferenceCacheContext = async (\n config: ResolvedConfig,\n): Promise<PublishedSkillPreferenceCacheContext> => {\n const authState = await readGlobalAuthState(config.authStatePath);\n\n return {\n userKey: toStoredUserKey(authState),\n preferenceVersion: publishedSkillPreferenceCacheVersion,\n };\n};\n\nexport const getCatalogCacheKey = (\n workspaceResolution: WorkspaceResolution,\n preferenceContext: PublishedSkillPreferenceCacheContext,\n): string => JSON.stringify([workspaceResolution.cacheKey, preferenceContext.userKey, preferenceContext.preferenceVersion]);\n\nconst toBackendPreferenceScope = (preferenceScope: 'global' | 'project'): PublishedSkillPreferenceScope => {\n if (preferenceScope === 'global') return 'GLOBAL';\n return 'WORKSPACE';\n};\n\nconst setPublishedSkillPreference = async ({\n worktree,\n directory,\n config,\n skillSlug,\n preferenceScope,\n installed,\n ignored,\n}: {\n worktree: string;\n directory: string;\n config: ResolvedConfig;\n skillSlug: string;\n preferenceScope: 'global' | 'project';\n installed?: boolean;\n ignored?: boolean;\n}): Promise<PublishedSkillsIgnoreState> => {\n const workspaceResolution = await resolveWorkspace({ config, directory });\n const response = await fetchPublishedSkillsGraphQl<SetPublishedSkillPreferenceResponse>({\n worktree,\n config,\n query: SET_PUBLISHED_SKILL_PREFERENCE_MUTATION,\n variables: {\n input: {\n ...toDeliveryInput(workspaceResolution),\n skillSlug,\n preferenceScope: toBackendPreferenceScope(preferenceScope),\n installed,\n ignored,\n },\n },\n signal: AbortSignal.timeout(PRESENCE_EVENT_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n throw new Error(response.result.message);\n }\n\n const preferences = response.data.setPublishedSkillPreference;\n publishedSkillPreferenceCacheVersion += 1;\n\n return {\n scopeKey: preferences.scopeKey,\n userKey: preferences.userKey,\n ignoredSkillSlugs: preferences.ignoredSkills.map((item) => item.skill.slug),\n installedGlobalSkillSlugs: [],\n installedWorkspaceSkillSlugs: [],\n };\n};\n\nexport const setPublishedSkillIgnored = async ({\n worktree,\n directory,\n skillSlug,\n ignored,\n preferenceScope,\n}: {\n worktree: string;\n directory: string;\n scopeKey?: string;\n skillSlug: string;\n ignored: boolean;\n preferenceScope?: 'global' | 'project';\n}): Promise<PublishedSkillsIgnoreState> => {\n const config = await resolveConfig(worktree);\n const normalizedSkillSlug = toIgnoredSkillSlug(skillSlug);\n\n if (!normalizedSkillSlug) {\n throw new Error('Cannot toggle an empty published skill slug.');\n }\n\n return setPublishedSkillPreference({\n worktree,\n directory,\n config,\n skillSlug: normalizedSkillSlug,\n preferenceScope: preferenceScope ?? 'project',\n ignored,\n });\n};\n\nexport const setPublishedSkillInstalled = async ({\n worktree,\n directory,\n skillSlug,\n installed,\n preferenceScope,\n}: {\n worktree: string;\n directory: string;\n scopeKey?: string;\n skillSlug: string;\n installed: boolean;\n preferenceScope: 'global' | 'project';\n}): Promise<PublishedSkillsIgnoreState> => {\n const config = await resolveConfig(worktree);\n const normalizedSkillSlug = toIgnoredSkillSlug(skillSlug);\n\n if (!normalizedSkillSlug) {\n throw new Error('Cannot toggle an empty published skill slug.');\n }\n\n return setPublishedSkillPreference({\n worktree,\n directory,\n config,\n skillSlug: normalizedSkillSlug,\n preferenceScope,\n installed,\n });\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,14 @@
1
+ import type { AuthState, PluginActionEventType, PresenceEventType, ResolvedConfig } from './types.js';
2
+ export declare const emitPresenceEvent: ({ config, authState, event, workspacePath, }: {
3
+ config: ResolvedConfig;
4
+ authState: AuthState;
5
+ event: PresenceEventType;
6
+ workspacePath: string;
7
+ }) => Promise<void>;
8
+ export declare const emitPluginActionEvent: ({ config, authState, event, workspacePath, directoryPath, }: {
9
+ config: ResolvedConfig;
10
+ authState: AuthState | null;
11
+ event: PluginActionEventType;
12
+ workspacePath: string;
13
+ directoryPath?: string;
14
+ }) => Promise<void>;
@@ -0,0 +1,68 @@
1
+ import { PRESENCE_EVENT_MAX_ATTEMPTS, PRESENCE_EVENT_RETRY_DELAY_MS, PRESENCE_EVENT_TIMEOUT_MS } from './constants.js';
2
+ const wait = async milliseconds => {
3
+ await new Promise(resolve => {
4
+ setTimeout(resolve, milliseconds);
5
+ });
6
+ };
7
+ const shouldRetryPresenceEvent = status => {
8
+ return status === 408 || status === 429 || status >= 500;
9
+ };
10
+ export const emitPresenceEvent = async ({
11
+ config,
12
+ authState,
13
+ event,
14
+ workspacePath
15
+ }) => {
16
+ for (let attempt = 1; attempt <= PRESENCE_EVENT_MAX_ATTEMPTS; attempt += 1) {
17
+ try {
18
+ const response = await fetch(config.presenceUrl, {
19
+ method: 'POST',
20
+ headers: {
21
+ 'content-type': 'application/json',
22
+ authorization: `Bearer ${authState.sessionToken}`
23
+ },
24
+ body: JSON.stringify({
25
+ event,
26
+ occurredAt: new Date().toISOString(),
27
+ workspacePath
28
+ }),
29
+ keepalive: event === 'STOP',
30
+ signal: AbortSignal.timeout(PRESENCE_EVENT_TIMEOUT_MS)
31
+ });
32
+ if (response.ok) return;
33
+ if (!shouldRetryPresenceEvent(response.status) || attempt === PRESENCE_EVENT_MAX_ATTEMPTS) return;
34
+ } catch {
35
+ if (attempt === PRESENCE_EVENT_MAX_ATTEMPTS) return;
36
+ }
37
+ await wait(PRESENCE_EVENT_RETRY_DELAY_MS * attempt);
38
+ }
39
+ };
40
+ export const emitPluginActionEvent = async ({
41
+ config,
42
+ authState,
43
+ event,
44
+ workspacePath,
45
+ directoryPath
46
+ }) => {
47
+ if (!authState) return;
48
+ try {
49
+ await fetch(config.actionsUrl, {
50
+ method: 'POST',
51
+ headers: {
52
+ 'content-type': 'application/json',
53
+ authorization: `Bearer ${authState.sessionToken}`
54
+ },
55
+ body: JSON.stringify({
56
+ event,
57
+ occurredAt: new Date().toISOString(),
58
+ workspacePath,
59
+ directoryPath
60
+ }),
61
+ keepalive: event === 'STOP',
62
+ signal: AbortSignal.timeout(PRESENCE_EVENT_TIMEOUT_MS)
63
+ });
64
+ } catch {
65
+ return;
66
+ }
67
+ };
68
+ //# sourceMappingURL=presence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["PRESENCE_EVENT_MAX_ATTEMPTS","PRESENCE_EVENT_RETRY_DELAY_MS","PRESENCE_EVENT_TIMEOUT_MS","wait","milliseconds","Promise","resolve","setTimeout","shouldRetryPresenceEvent","status","emitPresenceEvent","config","authState","event","workspacePath","attempt","response","fetch","presenceUrl","method","headers","authorization","sessionToken","body","JSON","stringify","occurredAt","Date","toISOString","keepalive","signal","AbortSignal","timeout","ok","emitPluginActionEvent","directoryPath","actionsUrl"],"sources":["../../src/server/presence.ts"],"sourcesContent":["import {\n PRESENCE_EVENT_MAX_ATTEMPTS,\n PRESENCE_EVENT_RETRY_DELAY_MS,\n PRESENCE_EVENT_TIMEOUT_MS,\n} from './constants.js';\nimport type { AuthState, PluginActionEventType, PresenceEventType, ResolvedConfig } from './types.js';\n\nconst wait = async (milliseconds: number): Promise<void> => {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, milliseconds);\n });\n};\n\nconst shouldRetryPresenceEvent = (status: number): boolean => {\n return status === 408 || status === 429 || status >= 500;\n};\n\nexport const emitPresenceEvent = async ({\n config,\n authState,\n event,\n workspacePath,\n}: {\n config: ResolvedConfig;\n authState: AuthState;\n event: PresenceEventType;\n workspacePath: string;\n}): Promise<void> => {\n for (let attempt = 1; attempt <= PRESENCE_EVENT_MAX_ATTEMPTS; attempt += 1) {\n try {\n const response = await fetch(config.presenceUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${authState.sessionToken}`,\n },\n body: JSON.stringify({\n event,\n occurredAt: new Date().toISOString(),\n workspacePath,\n }),\n keepalive: event === 'STOP',\n signal: AbortSignal.timeout(PRESENCE_EVENT_TIMEOUT_MS),\n });\n\n if (response.ok) return;\n if (!shouldRetryPresenceEvent(response.status) || attempt === PRESENCE_EVENT_MAX_ATTEMPTS) return;\n } catch {\n if (attempt === PRESENCE_EVENT_MAX_ATTEMPTS) return;\n }\n\n await wait(PRESENCE_EVENT_RETRY_DELAY_MS * attempt);\n }\n};\n\nexport const emitPluginActionEvent = async ({\n config,\n authState,\n event,\n workspacePath,\n directoryPath,\n}: {\n config: ResolvedConfig;\n authState: AuthState | null;\n event: PluginActionEventType;\n workspacePath: string;\n directoryPath?: string;\n}): Promise<void> => {\n if (!authState) return;\n\n try {\n await fetch(config.actionsUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${authState.sessionToken}`,\n },\n body: JSON.stringify({\n event,\n occurredAt: new Date().toISOString(),\n workspacePath,\n directoryPath,\n }),\n keepalive: event === 'STOP',\n signal: AbortSignal.timeout(PRESENCE_EVENT_TIMEOUT_MS),\n });\n } catch {\n return;\n }\n};\n"],"mappings":"AAAA,SACEA,2BAA2B,EAC3BC,6BAA6B,EAC7BC,yBAAyB,QACpB,gBAAgB;AAGvB,MAAMC,IAAI,GAAG,MAAOC,YAAoB,IAAoB;EAC1D,MAAM,IAAIC,OAAO,CAAQC,OAAO,IAAK;IACnCC,UAAU,CAACD,OAAO,EAAEF,YAAY,CAAC;EACnC,CAAC,CAAC;AACJ,CAAC;AAED,MAAMI,wBAAwB,GAAIC,MAAc,IAAc;EAC5D,OAAOA,MAAM,KAAK,GAAG,IAAIA,MAAM,KAAK,GAAG,IAAIA,MAAM,IAAI,GAAG;AAC1D,CAAC;AAED,OAAO,MAAMC,iBAAiB,GAAG,MAAAA,CAAO;EACtCC,MAAM;EACNC,SAAS;EACTC,KAAK;EACLC;AAMF,CAAC,KAAoB;EACnB,KAAK,IAAIC,OAAO,GAAG,CAAC,EAAEA,OAAO,IAAIf,2BAA2B,EAAEe,OAAO,IAAI,CAAC,EAAE;IAC1E,IAAI;MACF,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAACN,MAAM,CAACO,WAAW,EAAE;QAC/CC,MAAM,EAAE,MAAM;QACdC,OAAO,EAAE;UACP,cAAc,EAAE,kBAAkB;UAClCC,aAAa,EAAE,UAAUT,SAAS,CAACU,YAAY;QACjD,CAAC;QACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;UACnBZ,KAAK;UACLa,UAAU,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;UACpCd;QACF,CAAC,CAAC;QACFe,SAAS,EAAEhB,KAAK,KAAK,MAAM;QAC3BiB,MAAM,EAAEC,WAAW,CAACC,OAAO,CAAC9B,yBAAyB;MACvD,CAAC,CAAC;MAEF,IAAIc,QAAQ,CAACiB,EAAE,EAAE;MACjB,IAAI,CAACzB,wBAAwB,CAACQ,QAAQ,CAACP,MAAM,CAAC,IAAIM,OAAO,KAAKf,2BAA2B,EAAE;IAC7F,CAAC,CAAC,MAAM;MACN,IAAIe,OAAO,KAAKf,2BAA2B,EAAE;IAC/C;IAEA,MAAMG,IAAI,CAACF,6BAA6B,GAAGc,OAAO,CAAC;EACrD;AACF,CAAC;AAED,OAAO,MAAMmB,qBAAqB,GAAG,MAAAA,CAAO;EAC1CvB,MAAM;EACNC,SAAS;EACTC,KAAK;EACLC,aAAa;EACbqB;AAOF,CAAC,KAAoB;EACnB,IAAI,CAACvB,SAAS,EAAE;EAEhB,IAAI;IACF,MAAMK,KAAK,CAACN,MAAM,CAACyB,UAAU,EAAE;MAC7BjB,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE;QACP,cAAc,EAAE,kBAAkB;QAClCC,aAAa,EAAE,UAAUT,SAAS,CAACU,YAAY;MACjD,CAAC;MACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;QACnBZ,KAAK;QACLa,UAAU,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;QACpCd,aAAa;QACbqB;MACF,CAAC,CAAC;MACFN,SAAS,EAAEhB,KAAK,KAAK,MAAM;MAC3BiB,MAAM,EAAEC,WAAW,CAACC,OAAO,CAAC9B,yBAAyB;IACvD,CAAC,CAAC;EACJ,CAAC,CAAC,MAAM;IACN;EACF;AACF,CAAC","ignoreList":[]}
@@ -0,0 +1,13 @@
1
+ export { resolveConfig } from './config.js';
2
+ export { PLUGIN_ID, NATIVE_SKILLS_URL_COMPATIBILITY, type NativeSkillsUrlCompatibility } from './constants.js';
3
+ export { buildSystemNote, resolvePluginStatusSnapshot, toPluginAuthStateSummary, toPublishedSkillCatalog, } from './status.js';
4
+ import type { OpencodePluginServer } from './types.js';
5
+ export type { PluginAuthStateSummary, PluginStatusSnapshot, PublishedSkillCatalogItem, PublishedSkillCatalogPayload, PublishedSkillDetailItem, PublishedSkillInstallableCatalogItem, } from './types.js';
6
+ export { resolvePluginStatusSnapshotWithAuthBootstrap } from './auth-bootstrap.js';
7
+ export { setPublishedSkillIgnored, setPublishedSkillInstalled } from './preferences.js';
8
+ export declare const OpencodeWizardSkillsPlugin: OpencodePluginServer;
9
+ declare const _default: {
10
+ id: string;
11
+ server: OpencodePluginServer;
12
+ };
13
+ export default _default;