loopengine 0.1.95 → 0.1.97

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 (68) hide show
  1. package/README.md +21 -2
  2. package/dist/bin/ability-manager.d.ts +4 -0
  3. package/dist/bin/ability-manager.js +34 -2
  4. package/dist/bin/cli.d.ts +1 -1
  5. package/dist/bin/cli.js +3 -0
  6. package/dist/core/ability-details.d.ts +31 -0
  7. package/dist/core/ability-details.js +140 -0
  8. package/dist/core/ability-sources.d.ts +59 -0
  9. package/dist/core/ability-sources.js +312 -0
  10. package/dist/core/agent-config.d.ts +21 -1
  11. package/dist/core/discover-agents.js +11 -1
  12. package/dist/core/http-notifier.d.ts +7 -1
  13. package/dist/core/http-notifier.js +68 -9
  14. package/dist/core/http-notify-triggers/email.d.ts +2 -2
  15. package/dist/core/http-notify-triggers/email.js +2 -4
  16. package/dist/core/http-notify-triggers/lark.d.ts +2 -2
  17. package/dist/core/http-notify-triggers/lark.js +2 -4
  18. package/dist/core/http-notify-triggers/slack.d.ts +2 -2
  19. package/dist/core/http-notify-triggers/slack.js +2 -4
  20. package/dist/core/http-notify-triggers/telegram.d.ts +28 -0
  21. package/dist/core/http-notify-triggers/telegram.js +71 -0
  22. package/dist/core/http-notify-triggers/webhook.d.ts +2 -2
  23. package/dist/core/http-notify-triggers/webhook.js +2 -4
  24. package/dist/core/model-calls/meta-model-call.d.ts +15 -0
  25. package/dist/core/model-calls/meta-model-call.js +48 -0
  26. package/dist/core/model-calls/openai-model-call.d.ts +5 -0
  27. package/dist/core/model-calls/openai-model-call.js +47 -1
  28. package/dist/core/model-calls/xai-model-call.d.ts +15 -0
  29. package/dist/core/model-calls/xai-model-call.js +45 -0
  30. package/dist/core/notifier-file.d.ts +40 -6
  31. package/dist/core/notifier-file.js +119 -25
  32. package/dist/core/system-agents/workflow-planner.d.ts +100 -0
  33. package/dist/core/system-agents/workflow-planner.js +278 -0
  34. package/dist/core/workflows.d.ts +26 -0
  35. package/dist/core/workflows.js +39 -0
  36. package/dist/core/workspace-abilities.d.ts +31 -0
  37. package/dist/core/workspace-abilities.js +110 -0
  38. package/dist/index.d.ts +18 -4
  39. package/dist/index.js +17 -3
  40. package/dist/web/ability-details-admin.d.ts +17 -0
  41. package/dist/web/ability-details-admin.js +45 -0
  42. package/dist/web/ability-sources-admin.d.ts +33 -0
  43. package/dist/web/ability-sources-admin.js +65 -0
  44. package/dist/web/agent-file-admin.d.ts +1 -1
  45. package/dist/web/agent-file-admin.js +3 -0
  46. package/dist/web/agents-config-page.js +600 -220
  47. package/dist/web/agents-list-page.js +49 -20
  48. package/dist/web/console-shell.js +244 -3
  49. package/dist/web/dev-ui-styles.js +12 -0
  50. package/dist/web/global-config-page.js +348 -95
  51. package/dist/web/global-config.d.ts +44 -1
  52. package/dist/web/global-config.js +162 -2
  53. package/dist/web/interview-admin.js +2 -2
  54. package/dist/web/messaging-icons.d.ts +2 -0
  55. package/dist/web/messaging-icons.js +7 -0
  56. package/dist/web/notifier-admin.d.ts +33 -15
  57. package/dist/web/notifier-admin.js +109 -65
  58. package/dist/web/provider-icons.d.ts +2 -0
  59. package/dist/web/provider-icons.js +10 -0
  60. package/dist/web/templates-admin.d.ts +3 -0
  61. package/dist/web/templates-admin.js +5 -1
  62. package/dist/web/workflow-admin.d.ts +124 -0
  63. package/dist/web/workflow-admin.js +308 -0
  64. package/dist/web/workflow-page.d.ts +1 -0
  65. package/dist/web/workflow-page.js +226 -0
  66. package/dist/web/workspace-abilities-admin.d.ts +24 -0
  67. package/dist/web/workspace-abilities-admin.js +118 -0
  68. package/package.json +13 -1
package/dist/index.d.ts CHANGED
@@ -21,7 +21,7 @@ export { parseSlackEvent, createSlackConnector, verifySlackRequest, parseSlackIn
21
21
  export { createDecisionToken, verifyDecisionToken, decidePath, decideLinkMaker, decisionLinkTtlMs, type DecisionKind } from '#core/approval-links.js';
22
22
  export { renderDecidePage, renderDecideGonePage, renderDecideInvalidPage, type DecidePageItem } from './web/decide-page.js';
23
23
  export { sendTestWebhook } from '#core/http-notify-triggers/webhook.js';
24
- export { describeAgentNotifier, saveAgentNotifier, removeAgentNotifier, testAgentNotifier, listAgentPending, slackCredentialsFor, slackConversationsOn, slackClickAllowed, agentApprovers, setAgentApprovers, listAgentSlackMembers, listAgentSlackChannels, announceToNotifier, type DefaultWebhook } from './web/notifier-admin.js';
24
+ export { describeAgentNotifier, saveAgentNotifier, removeAgentNotifier, setAgentPrimaryNotifier, testAgentNotifier, listAgentPending, slackCredentialsFor, slackConversationsOn, slackClickAllowed, agentApprovers, setAgentApprovers, listAgentSlackMembers, listAgentSlackChannels, announceToNotifier, type DefaultWebhook } from './web/notifier-admin.js';
25
25
  export type * from './core/loop-events.js';
26
26
  export { streamMessage, streamMessageWithCallbacks, sendMessage, approveCall, denyCall, answerQuestion, getSessionHistory, } from './core/client.js';
27
27
  export type { RequestOptions, SendMessageResult, PendingApprovalResult, PendingQuestionResult, PendingResult, MessageResult, StreamMessageCallbacks, } from './core/client.js';
@@ -45,6 +45,10 @@ export { createGlmModelCall } from './core/model-calls/glm-model-call.js';
45
45
  export type { GlmModelCallOptions } from './core/model-calls/glm-model-call.js';
46
46
  export { createGeminiModelCall } from './core/model-calls/gemini-model-call.js';
47
47
  export type { GeminiModelCallOptions } from './core/model-calls/gemini-model-call.js';
48
+ export { createXaiModelCall } from './core/model-calls/xai-model-call.js';
49
+ export type { XaiModelCallOptions } from './core/model-calls/xai-model-call.js';
50
+ export { createMetaModelCall } from './core/model-calls/meta-model-call.js';
51
+ export type { MetaModelCallOptions } from './core/model-calls/meta-model-call.js';
48
52
  export { discoverAgents, loadAgentModule, synthesizeCreateModelCall } from './core/discover-agents.js';
49
53
  export type { AgentModule } from './core/discover-agents.js';
50
54
  export { agentAsTool } from './core/agent-as-tool.js';
@@ -74,8 +78,12 @@ export { interviewPageHtml } from './web/interview-page.js';
74
78
  export { InterviewError, answerInterview, createFromCandidate, createAgentFromCandidate, describeCandidate, deleteInterview, finishInterview, getInterview, interviewTools, listInterviews, pickAgentModel, pickInterviewModel, previewCandidate, startInterview, setInterviewProject, setupChecklist, type Interview, type InterviewAgentSource, type CandidatePreview, type CreatedAgent, type ChecklistItem, type CreateDeps, } from './web/interview-admin.js';
75
79
  export { runInterviewTurn, rankCandidates, validateCandidate, INTERVIEWER_PROMPT, type AgentCandidate, type InterviewStage } from './core/system-agents/interviewer.js';
76
80
  export { templatesPageHtml } from './web/templates-page.js';
77
- export { TemplateError, createFromTemplate, describeTemplateSchedule, listTemplates, previewTemplate, templateChecklist, type CreatedTemplateAgent, type LegacyTemplateCreateDeps, type TemplateChecklistItem, type TemplateCreateDeps, type TemplatePreview, type TemplateSummary, } from './web/templates-admin.js';
81
+ export { TemplateError, createFromTemplate, createFromTemplateObject, describeTemplateSchedule, listTemplates, previewTemplate, templateChecklist, type CreatedTemplateAgent, type LegacyTemplateCreateDeps, type TemplateChecklistItem, type TemplateCreateDeps, type TemplatePreview, type TemplateSummary, } from './web/templates-admin.js';
78
82
  export { STARTER_TEMPLATES, starterTemplate, templateScheduleStart, type StarterTemplate, type TemplateRule, type TemplateSchedule, type TemplateSetup, type TemplateSkill, } from './core/system-agents/templates.js';
83
+ export { workflowPageHtml } from './web/workflow-page.js';
84
+ export { WorkflowError, checkWorkflowForAgent, createWorkflow, forgetWorkflow, getPlanJob, listAgentWorkflows, planWorkflow, resolveConnections, runWorkflowNow, startPlanJob, type AgentWorkflowView, type CreatedWorkflow, type PlanJob, type PlannedWorkflow, type WorkflowAgentInfo, type WorkflowCheck, type WorkflowConflict, type WorkflowCreateDeps, } from './web/workflow-admin.js';
85
+ export { WORKFLOW_PLANNER_PROMPT, planWorkflowWithModel, validateWorkflowPlan, workflowTemplate, type WorkflowPlan, type WorkflowPlannerTools, type WorkflowStep } from './core/system-agents/workflow-planner.js';
86
+ export { readWorkflows, removeWorkflow, saveWorkflow, type WorkflowRecord } from './core/workflows.js';
79
87
  export { globalConfigPageHtml } from './web/global-config-page.js';
80
88
  export { playgroundHtml } from './web/playground.js';
81
89
  export { readSkill, writeSkill, deleteSkill, SkillInvalidIdError, SkillNotFoundError } from './web/skills-admin.js';
@@ -88,10 +96,16 @@ export { installAbility, upgradeAbility, removeAbility, listInstalledAbilities,
88
96
  export type { InstalledAbilityRecord, AbilityEnvDecl, UpgradeFileResult } from './bin/ability-manager.js';
89
97
  export { searchPublicAbilities, fetchLatestAbilityVersion } from './web/abilities-admin.js';
90
98
  export type { PublicAbilitySearchResult } from './web/abilities-admin.js';
91
- export { describeModelProviders, describeGateways, setModelProviderKey, clearModelProviderKey, ModelKeyError, describeTimeZone, setWorkspaceTimeZone, TimeZoneError } from './web/global-config.js';
99
+ export { AbilitySourceError, abilityOrigin, readAbilitySources, saveAbilitySource, removeAbilitySource, listSourceAbilities, sourceTokenVar, type AbilitySource, type SourceAbility, type AbilityOrigin } from './core/ability-sources.js';
100
+ export { describeAbilitySources, listPrivateAbilities, saveAbilitySourceFromConsole, removeAbilitySourceFromConsole } from './web/ability-sources-admin.js';
101
+ export { readAbilityDetails, readToolDefinitions, type AbilityDetails } from './core/ability-details.js';
102
+ export { abilityDetails } from './web/ability-details-admin.js';
103
+ export { WorkspaceAbilityError, listWorkspaceAbilities, addWorkspaceAbility, removeWorkspaceAbility, workspaceAbilitiesDir, type WorkspaceAbility } from './core/workspace-abilities.js';
104
+ export { installWorkspaceAbility, installUploadedAbility, MAX_UPLOAD_BYTES, type AbilityUpload } from './web/workspace-abilities-admin.js';
105
+ export { describeModelProviders, describeGateways, setModelProviderKey, clearModelProviderKey, listProviderModels, ModelKeyError, describeTimeZone, setWorkspaceTimeZone, TimeZoneError } from './web/global-config.js';
92
106
  export { loopengineVersion } from './core/version.js';
93
107
  export { describeUpgrade, runUpgrade, UpgradeError } from './web/upgrade-admin.js';
94
- export type { ModelProviderInfo, AgentModelUsage, ModelsView, GatewayProviderInfo, GatewaysView, TimeZoneView } from './web/global-config.js';
108
+ export type { ModelProviderInfo, AgentModelUsage, ModelsView, ProviderModelsView, GatewayProviderInfo, GatewaysView, TimeZoneView } from './web/global-config.js';
95
109
  export { workspaceTimeZone, serverTimeZone, isValidTimeZone, TIME_ZONE_ENV } from '#core/time-zone.js';
96
110
  export { createTrackedApprover, listApprovals, decideApproval, findApproval } from './web/web-approver.js';
97
111
  export { scaffoldAgent, scaffoldSubagent, AgentNameError, AgentExistsError, AgentNotFoundError, AgentModelError } from './bin/cli.js';
package/dist/index.js CHANGED
@@ -22,7 +22,7 @@ export { parseSlackEvent, createSlackConnector, verifySlackRequest, parseSlackIn
22
22
  export { createDecisionToken, verifyDecisionToken, decidePath, decideLinkMaker, decisionLinkTtlMs } from '#core/approval-links.js';
23
23
  export { renderDecidePage, renderDecideGonePage, renderDecideInvalidPage } from './web/decide-page.js';
24
24
  export { sendTestWebhook } from '#core/http-notify-triggers/webhook.js';
25
- export { describeAgentNotifier, saveAgentNotifier, removeAgentNotifier, testAgentNotifier, listAgentPending, slackCredentialsFor, slackConversationsOn, slackClickAllowed, agentApprovers, setAgentApprovers, listAgentSlackMembers, listAgentSlackChannels, announceToNotifier } from './web/notifier-admin.js';
25
+ export { describeAgentNotifier, saveAgentNotifier, removeAgentNotifier, setAgentPrimaryNotifier, testAgentNotifier, listAgentPending, slackCredentialsFor, slackConversationsOn, slackClickAllowed, agentApprovers, setAgentApprovers, listAgentSlackMembers, listAgentSlackChannels, announceToNotifier } from './web/notifier-admin.js';
26
26
  // The framework-agnostic browser client for adapters/http.ts's own wire
27
27
  // protocol (see client.ts's own header comment) — this, not a deep
28
28
  // subpath import, is how a consumer's React/Vue/etc. chat UI is meant to
@@ -40,6 +40,8 @@ export { createDeepSeekModelCall } from './core/model-calls/deepseek-model-call.
40
40
  export { createKimiModelCall } from './core/model-calls/kimi-model-call.js';
41
41
  export { createGlmModelCall } from './core/model-calls/glm-model-call.js';
42
42
  export { createGeminiModelCall } from './core/model-calls/gemini-model-call.js';
43
+ export { createXaiModelCall } from './core/model-calls/xai-model-call.js';
44
+ export { createMetaModelCall } from './core/model-calls/meta-model-call.js';
43
45
  export { discoverAgents, loadAgentModule, synthesizeCreateModelCall } from './core/discover-agents.js';
44
46
  export { agentAsTool } from './core/agent-as-tool.js';
45
47
  // Everything below backs the Admin UI (agents-config/list/global-config
@@ -69,8 +71,12 @@ export { interviewPageHtml } from './web/interview-page.js';
69
71
  export { InterviewError, answerInterview, createFromCandidate, createAgentFromCandidate, describeCandidate, deleteInterview, finishInterview, getInterview, interviewTools, listInterviews, pickAgentModel, pickInterviewModel, previewCandidate, startInterview, setInterviewProject, setupChecklist, } from './web/interview-admin.js';
70
72
  export { runInterviewTurn, rankCandidates, validateCandidate, INTERVIEWER_PROMPT } from './core/system-agents/interviewer.js';
71
73
  export { templatesPageHtml } from './web/templates-page.js';
72
- export { TemplateError, createFromTemplate, describeTemplateSchedule, listTemplates, previewTemplate, templateChecklist, } from './web/templates-admin.js';
74
+ export { TemplateError, createFromTemplate, createFromTemplateObject, describeTemplateSchedule, listTemplates, previewTemplate, templateChecklist, } from './web/templates-admin.js';
73
75
  export { STARTER_TEMPLATES, starterTemplate, templateScheduleStart, } from './core/system-agents/templates.js';
76
+ export { workflowPageHtml } from './web/workflow-page.js';
77
+ export { WorkflowError, checkWorkflowForAgent, createWorkflow, forgetWorkflow, getPlanJob, listAgentWorkflows, planWorkflow, resolveConnections, runWorkflowNow, startPlanJob, } from './web/workflow-admin.js';
78
+ export { WORKFLOW_PLANNER_PROMPT, planWorkflowWithModel, validateWorkflowPlan, workflowTemplate } from './core/system-agents/workflow-planner.js';
79
+ export { readWorkflows, removeWorkflow, saveWorkflow } from './core/workflows.js';
74
80
  export { globalConfigPageHtml } from './web/global-config-page.js';
75
81
  export { playgroundHtml } from './web/playground.js';
76
82
  export { readSkill, writeSkill, deleteSkill, SkillInvalidIdError, SkillNotFoundError } from './web/skills-admin.js';
@@ -78,7 +84,15 @@ export { listDeclaredEnvVars, setEnvVar, unsetEnvVar, setAgentEnvVar, unsetAgent
78
84
  export { readActauthConfig, addActauthRule, updateActauthRule, removeActauthRule, setDefaultDecision, ActauthRuleExistsError, ActauthRuleNotFoundError, } from './web/actauth-admin.js';
79
85
  export { installAbility, upgradeAbility, removeAbility, listInstalledAbilities, backfillDependencies, AbilityManifestError, AbilityVersionError, AbilityCollisionError, AbilityAlreadyInstalledError, AbilityNotInstalledError, } from './bin/ability-manager.js';
80
86
  export { searchPublicAbilities, fetchLatestAbilityVersion } from './web/abilities-admin.js';
81
- export { describeModelProviders, describeGateways, setModelProviderKey, clearModelProviderKey, ModelKeyError, describeTimeZone, setWorkspaceTimeZone, TimeZoneError } from './web/global-config.js';
87
+ // Private ability sources, the workspace's own abilities and each
88
+ // ability's details: the console's Abilities page and agent Abilities tab.
89
+ export { AbilitySourceError, abilityOrigin, readAbilitySources, saveAbilitySource, removeAbilitySource, listSourceAbilities, sourceTokenVar } from './core/ability-sources.js';
90
+ export { describeAbilitySources, listPrivateAbilities, saveAbilitySourceFromConsole, removeAbilitySourceFromConsole } from './web/ability-sources-admin.js';
91
+ export { readAbilityDetails, readToolDefinitions } from './core/ability-details.js';
92
+ export { abilityDetails } from './web/ability-details-admin.js';
93
+ export { WorkspaceAbilityError, listWorkspaceAbilities, addWorkspaceAbility, removeWorkspaceAbility, workspaceAbilitiesDir } from './core/workspace-abilities.js';
94
+ export { installWorkspaceAbility, installUploadedAbility, MAX_UPLOAD_BYTES } from './web/workspace-abilities-admin.js';
95
+ export { describeModelProviders, describeGateways, setModelProviderKey, clearModelProviderKey, listProviderModels, ModelKeyError, describeTimeZone, setWorkspaceTimeZone, TimeZoneError } from './web/global-config.js';
82
96
  export { loopengineVersion } from './core/version.js';
83
97
  export { describeUpgrade, runUpgrade, UpgradeError } from './web/upgrade-admin.js';
84
98
  export { workspaceTimeZone, serverTimeZone, isValidTimeZone, TIME_ZONE_ENV } from '#core/time-zone.js';
@@ -0,0 +1,17 @@
1
+ import { type AbilityDetails, type Decision } from '../core/ability-details.js';
2
+ export interface AbilityDetailsView extends AbilityDetails {
3
+ tools: Array<AbilityDetails['tools'][number] & {
4
+ agentDecision?: Decision;
5
+ }>;
6
+ /** Set when the permissions shown are this agent's own. */
7
+ agent?: string;
8
+ }
9
+ /** What the ability at `spec` can do. A local folder (file:) is read in
10
+ * place, fresh each time; anything else is fetched like an install would
11
+ * (a private source's token included) and cached for ten minutes. With
12
+ * `agent`, each tool also carries that agent's current decision: its
13
+ * first rule for the tool, else its default. */
14
+ export declare function abilityDetails(spec: string, options?: {
15
+ agent?: string;
16
+ fetchDir?: (spec: string) => Promise<string>;
17
+ }): Promise<AbilityDetailsView>;
@@ -0,0 +1,45 @@
1
+ // Backs the console's ability details: what an ability can do (its tools,
2
+ // what each one does and its permission, and its skills), for one found
3
+ // on npm or in a private source, or one already installed in an agent.
4
+ import { rmSync } from 'node:fs';
5
+ import { dirname } from 'node:path';
6
+ import { fetchAbilityDirAsync } from '../bin/ability-manager.js';
7
+ import { readAbilityDetails } from '../core/ability-details.js';
8
+ import { readActauthConfig } from './actauth-admin.js';
9
+ const TTL_MS = 10 * 60 * 1000;
10
+ const cache = new Map();
11
+ /** What the ability at `spec` can do. A local folder (file:) is read in
12
+ * place, fresh each time; anything else is fetched like an install would
13
+ * (a private source's token included) and cached for ten minutes. With
14
+ * `agent`, each tool also carries that agent's current decision: its
15
+ * first rule for the tool, else its default. */
16
+ export async function abilityDetails(spec, options = {}) {
17
+ let details;
18
+ if (spec.startsWith('file:')) {
19
+ details = readAbilityDetails(spec.slice('file:'.length));
20
+ }
21
+ else {
22
+ const cached = cache.get(spec);
23
+ if (cached && Date.now() - cached.at < TTL_MS) {
24
+ details = cached.details;
25
+ }
26
+ else {
27
+ const dir = await (options.fetchDir ?? fetchAbilityDirAsync)(spec);
28
+ try {
29
+ details = readAbilityDetails(dir);
30
+ }
31
+ finally {
32
+ rmSync(dirname(dir), { recursive: true, force: true });
33
+ }
34
+ cache.set(spec, { at: Date.now(), details });
35
+ }
36
+ }
37
+ if (!options.agent)
38
+ return details;
39
+ const { rules, defaultDecision } = readActauthConfig(options.agent);
40
+ return {
41
+ ...details,
42
+ agent: options.agent,
43
+ tools: details.tools.map((tool) => ({ ...tool, agentDecision: (rules.find((r) => r.tool === tool.name)?.decision ?? defaultDecision) })),
44
+ };
45
+ }
@@ -0,0 +1,33 @@
1
+ import { type AbilitySource, type SourceAbility } from '../core/ability-sources.js';
2
+ export interface AbilitySourceView {
3
+ source: AbilitySource;
4
+ label: string;
5
+ /** The env var its token lives in; null for a folder, which has none. */
6
+ tokenVar: string | null;
7
+ tokenSet: boolean;
8
+ }
9
+ export declare function describeAbilitySources(): {
10
+ sources: AbilitySourceView[];
11
+ error?: string;
12
+ };
13
+ /** Saves a source from the console, and its token when one is given
14
+ * (applied to this process at once). Throws AbilitySourceError for an
15
+ * invalid source or token. */
16
+ export declare function saveAbilitySourceFromConsole(body: Record<string, unknown>): Promise<AbilitySource>;
17
+ /** Removes a source and its saved token. Installed abilities stay. */
18
+ export declare function removeAbilitySourceFromConsole(id: string): Promise<void>;
19
+ export interface PrivateAbilitiesView {
20
+ sources: Array<{
21
+ id: string;
22
+ type: AbilitySource['type'];
23
+ label: string;
24
+ abilities: SourceAbility[];
25
+ error?: string;
26
+ }>;
27
+ error?: string;
28
+ }
29
+ /** Every private source's abilities, listed side by side; a source that
30
+ * can't be read reports why instead of failing the rest. */
31
+ export declare function listPrivateAbilities(options?: {
32
+ fetch?: typeof fetch;
33
+ }): Promise<PrivateAbilitiesView>;
@@ -0,0 +1,65 @@
1
+ // Backs Settings → Private ability sources and the Abilities page's
2
+ // Private section: see core/ability-sources.ts for what a source is.
3
+ // A token is saved through the same secret store as a model key (the
4
+ // project's .env by default) and never sent back, only whether it's set.
5
+ import { AbilitySourceError, describeSource, listSourceAbilities, readAbilitySources, removeAbilitySource, saveAbilitySource, sourceTokenVar, } from '../core/ability-sources.js';
6
+ import { setEnvVar, unsetEnvVar } from './env-admin.js';
7
+ export function describeAbilitySources() {
8
+ let sources;
9
+ try {
10
+ sources = readAbilitySources();
11
+ }
12
+ catch (err) {
13
+ return { sources: [], error: `ability-sources.yml is invalid: ${err instanceof Error ? err.message : String(err)}` };
14
+ }
15
+ return {
16
+ sources: sources.map((source) => {
17
+ const tokenVar = source.type === 'folder' ? null : sourceTokenVar(source.id);
18
+ return { source, label: describeSource(source), tokenVar, tokenSet: Boolean(tokenVar && process.env[tokenVar]) };
19
+ }),
20
+ };
21
+ }
22
+ /** Saves a source from the console, and its token when one is given
23
+ * (applied to this process at once). Throws AbilitySourceError for an
24
+ * invalid source or token. */
25
+ export async function saveAbilitySourceFromConsole(body) {
26
+ const token = typeof body.token === 'string' ? body.token.trim() : '';
27
+ if (token && (token.length < 8 || token.length > 500 || /\s/.test(token))) {
28
+ throw new AbilitySourceError("That doesn't look like a token: paste the whole token, with no spaces or line breaks.");
29
+ }
30
+ const source = saveAbilitySource(body);
31
+ if (token && source.type !== 'folder')
32
+ await setEnvVar(sourceTokenVar(source.id), token);
33
+ return source;
34
+ }
35
+ /** Removes a source and its saved token. Installed abilities stay. */
36
+ export async function removeAbilitySourceFromConsole(id) {
37
+ const source = readAbilitySources().find((s) => s.id === id);
38
+ if (!source)
39
+ throw new AbilitySourceError(`No source named ${id}`);
40
+ removeAbilitySource(id);
41
+ if (source.type !== 'folder')
42
+ await unsetEnvVar(sourceTokenVar(id));
43
+ }
44
+ /** Every private source's abilities, listed side by side; a source that
45
+ * can't be read reports why instead of failing the rest. */
46
+ export async function listPrivateAbilities(options = {}) {
47
+ let sources;
48
+ try {
49
+ sources = readAbilitySources();
50
+ }
51
+ catch (err) {
52
+ return { sources: [], error: `ability-sources.yml is invalid: ${err instanceof Error ? err.message : String(err)}` };
53
+ }
54
+ return {
55
+ sources: await Promise.all(sources.map(async (source) => {
56
+ const base = { id: source.id, type: source.type, label: describeSource(source) };
57
+ try {
58
+ return { ...base, abilities: await listSourceAbilities(source, options) };
59
+ }
60
+ catch (err) {
61
+ return { ...base, abilities: [], error: err instanceof Error ? err.message : String(err) };
62
+ }
63
+ })),
64
+ };
65
+ }
@@ -2,7 +2,7 @@ export declare class AgentEditNotSupportedError extends Error {
2
2
  }
3
3
  export declare class AgentFileNotFoundError extends Error {
4
4
  }
5
- type Provider = 'anthropic' | 'openai' | 'deepseek' | 'kimi' | 'glm' | 'gemini';
5
+ type Provider = 'anthropic' | 'openai' | 'deepseek' | 'kimi' | 'glm' | 'gemini' | 'xai' | 'meta';
6
6
  export interface AgentEditableFields {
7
7
  systemPrompt?: string;
8
8
  model?: {
@@ -57,6 +57,9 @@ const MODEL_ENV_VAR = {
57
57
  kimi: 'MOONSHOT_API_KEY',
58
58
  glm: 'GLM_API_KEY',
59
59
  gemini: 'GEMINI_API_KEY',
60
+ xai: 'XAI_API_KEY',
61
+ // LiteLLM's name; see core/model-calls/meta-model-call.ts.
62
+ meta: 'META_API_KEY',
60
63
  };
61
64
  // The exact shape agentIndexTemplate (bin/cli.ts) always generates for the
62
65
  // model field's trailing comment — used to recognize a comment this