@stratusagent/cli 0.11.2 → 0.11.4

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 (158) hide show
  1. package/README.md +14 -8
  2. package/dist/approvals.d.ts +93 -0
  3. package/dist/approvals.d.ts.map +1 -0
  4. package/dist/approvals.js +368 -0
  5. package/dist/approvals.js.map +1 -0
  6. package/dist/commands/agent-new.d.ts +22 -0
  7. package/dist/commands/agent-new.d.ts.map +1 -0
  8. package/dist/commands/agent-new.js +159 -0
  9. package/dist/commands/agent-new.js.map +1 -0
  10. package/dist/commands/agents.d.ts +4 -0
  11. package/dist/commands/agents.d.ts.map +1 -0
  12. package/dist/commands/agents.js +90 -0
  13. package/dist/commands/agents.js.map +1 -0
  14. package/dist/commands/chat.d.ts +4 -0
  15. package/dist/commands/chat.d.ts.map +1 -0
  16. package/dist/commands/chat.js +227 -0
  17. package/dist/commands/chat.js.map +1 -0
  18. package/dist/commands/credential.d.ts +22 -0
  19. package/dist/commands/credential.d.ts.map +1 -0
  20. package/dist/commands/credential.js +93 -0
  21. package/dist/commands/credential.js.map +1 -0
  22. package/dist/commands/dashboard.d.ts +14 -0
  23. package/dist/commands/dashboard.d.ts.map +1 -0
  24. package/dist/commands/dashboard.js +195 -0
  25. package/dist/commands/dashboard.js.map +1 -0
  26. package/dist/commands/doctor.d.ts +40 -0
  27. package/dist/commands/doctor.d.ts.map +1 -0
  28. package/dist/commands/doctor.js +376 -0
  29. package/dist/commands/doctor.js.map +1 -0
  30. package/dist/commands/grants.d.ts +19 -0
  31. package/dist/commands/grants.d.ts.map +1 -0
  32. package/dist/commands/grants.js +128 -0
  33. package/dist/commands/grants.js.map +1 -0
  34. package/dist/commands/logs.d.ts +9 -0
  35. package/dist/commands/logs.d.ts.map +1 -0
  36. package/dist/commands/logs.js +58 -0
  37. package/dist/commands/logs.js.map +1 -0
  38. package/dist/commands/memory.d.ts +20 -0
  39. package/dist/commands/memory.d.ts.map +1 -0
  40. package/dist/commands/memory.js +110 -0
  41. package/dist/commands/memory.js.map +1 -0
  42. package/dist/commands/plugins.d.ts +103 -0
  43. package/dist/commands/plugins.d.ts.map +1 -0
  44. package/dist/commands/plugins.js +386 -0
  45. package/dist/commands/plugins.js.map +1 -0
  46. package/dist/commands/restart.d.ts +4 -0
  47. package/dist/commands/restart.d.ts.map +1 -0
  48. package/dist/commands/restart.js +25 -0
  49. package/dist/commands/restart.js.map +1 -0
  50. package/dist/commands/schedules.d.ts +11 -0
  51. package/dist/commands/schedules.d.ts.map +1 -0
  52. package/dist/commands/schedules.js +50 -0
  53. package/dist/commands/schedules.js.map +1 -0
  54. package/dist/commands/serve.d.ts +4 -0
  55. package/dist/commands/serve.d.ts.map +1 -0
  56. package/dist/commands/serve.js +633 -0
  57. package/dist/commands/serve.js.map +1 -0
  58. package/dist/commands/service.d.ts +9 -0
  59. package/dist/commands/service.d.ts.map +1 -0
  60. package/dist/commands/service.js +97 -0
  61. package/dist/commands/service.js.map +1 -0
  62. package/dist/commands/session.d.ts +9 -0
  63. package/dist/commands/session.d.ts.map +1 -0
  64. package/dist/commands/session.js +25 -0
  65. package/dist/commands/session.js.map +1 -0
  66. package/dist/commands/setup.d.ts +5 -0
  67. package/dist/commands/setup.d.ts.map +1 -0
  68. package/dist/commands/setup.js +2467 -0
  69. package/dist/commands/setup.js.map +1 -0
  70. package/dist/commands/skills.d.ts +15 -0
  71. package/dist/commands/skills.d.ts.map +1 -0
  72. package/dist/commands/skills.js +272 -0
  73. package/dist/commands/skills.js.map +1 -0
  74. package/dist/commands/template.d.ts +4 -0
  75. package/dist/commands/template.d.ts.map +1 -0
  76. package/dist/commands/template.js +593 -0
  77. package/dist/commands/template.js.map +1 -0
  78. package/dist/commands/update.d.ts +21 -0
  79. package/dist/commands/update.d.ts.map +1 -0
  80. package/dist/commands/update.js +291 -0
  81. package/dist/commands/update.js.map +1 -0
  82. package/dist/daemon.d.ts +74 -0
  83. package/dist/daemon.d.ts.map +1 -0
  84. package/dist/daemon.js +192 -0
  85. package/dist/daemon.js.map +1 -0
  86. package/dist/environment.d.ts +114 -0
  87. package/dist/environment.d.ts.map +1 -0
  88. package/dist/environment.js +2 -0
  89. package/dist/environment.js.map +1 -0
  90. package/dist/events.d.ts +17 -0
  91. package/dist/events.d.ts.map +1 -0
  92. package/dist/events.js +87 -0
  93. package/dist/events.js.map +1 -0
  94. package/dist/help.d.ts +2 -0
  95. package/dist/help.d.ts.map +1 -0
  96. package/dist/help.js +272 -0
  97. package/dist/help.js.map +1 -0
  98. package/dist/index.d.ts +32 -624
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +39 -6981
  101. package/dist/index.js.map +1 -1
  102. package/dist/io.d.ts +16 -0
  103. package/dist/io.d.ts.map +1 -0
  104. package/dist/io.js +45 -0
  105. package/dist/io.js.map +1 -0
  106. package/dist/loaders.d.ts +31 -0
  107. package/dist/loaders.d.ts.map +1 -0
  108. package/dist/loaders.js +56 -0
  109. package/dist/loaders.js.map +1 -0
  110. package/dist/main.d.ts +8 -0
  111. package/dist/main.d.ts.map +1 -0
  112. package/dist/main.js +218 -0
  113. package/dist/main.js.map +1 -0
  114. package/dist/npm.d.ts +66 -0
  115. package/dist/npm.d.ts.map +1 -0
  116. package/dist/npm.js +201 -0
  117. package/dist/npm.js.map +1 -0
  118. package/dist/parse.d.ts +245 -0
  119. package/dist/parse.d.ts.map +1 -0
  120. package/dist/parse.js +1098 -0
  121. package/dist/parse.js.map +1 -0
  122. package/dist/plugin-catalog.d.ts +44 -0
  123. package/dist/plugin-catalog.d.ts.map +1 -0
  124. package/dist/plugin-catalog.js +70 -0
  125. package/dist/plugin-catalog.js.map +1 -0
  126. package/dist/preflight.d.ts +60 -0
  127. package/dist/preflight.d.ts.map +1 -0
  128. package/dist/preflight.js +102 -0
  129. package/dist/preflight.js.map +1 -0
  130. package/dist/prompter.d.ts +84 -0
  131. package/dist/prompter.d.ts.map +1 -0
  132. package/dist/prompter.js +347 -0
  133. package/dist/prompter.js.map +1 -0
  134. package/dist/roster.d.ts +57 -0
  135. package/dist/roster.d.ts.map +1 -0
  136. package/dist/roster.js +78 -0
  137. package/dist/roster.js.map +1 -0
  138. package/dist/runtime.d.ts +76 -0
  139. package/dist/runtime.d.ts.map +1 -0
  140. package/dist/runtime.js +372 -0
  141. package/dist/runtime.js.map +1 -0
  142. package/dist/slack.d.ts +26 -0
  143. package/dist/slack.d.ts.map +1 -0
  144. package/dist/slack.js +113 -0
  145. package/dist/slack.js.map +1 -0
  146. package/dist/source.d.ts +24 -0
  147. package/dist/source.d.ts.map +1 -0
  148. package/dist/source.js +80 -0
  149. package/dist/source.js.map +1 -0
  150. package/dist/supervisor.d.ts +69 -0
  151. package/dist/supervisor.d.ts.map +1 -0
  152. package/dist/supervisor.js +218 -0
  153. package/dist/supervisor.js.map +1 -0
  154. package/dist/trusted-config.d.ts +84 -0
  155. package/dist/trusted-config.d.ts.map +1 -0
  156. package/dist/trusted-config.js +159 -0
  157. package/dist/trusted-config.js.map +1 -0
  158. package/package.json +27 -23
@@ -0,0 +1,159 @@
1
+ import { DEFAULT_ANTHROPIC_MODEL } from '@stratusagent/provider-anthropic';
2
+ import { DEFAULT_CODEX_MODEL } from '@stratusagent/provider-codex';
3
+ import { defineAgent, formatSoul, generateAgentName } from '@stratusagent/agents';
4
+ import { claimSoulFile, DEFAULT_OPENAI_MODEL, discoverActiveConfig, globalConfigPath, isRegisteredProviderName, parseProviderName, readNonEmptyString, readProcessEnv, loadConfigFile, saveConfigFile, } from '@stratusagent/state';
5
+ import { writeLine } from "../io.js";
6
+ import { quoteShellArg, stratusHeaderLines, createSetupPrompter } from "../prompter.js";
7
+ import { DEFAULT_SOUL_STARTER } from "./setup.js";
8
+ /**
9
+ * The provider/model a newly created soul pins. Frontmatter pins what a run
10
+ * from this directory would actually use: env vars outrank the active
11
+ * config file (project-local or explicit first, global otherwise), and no
12
+ * provider anywhere falls back to demo — the exact precedence of stratus
13
+ * run. Demo produces no model at all: the soul keeps following the
14
+ * machine's configuration instead of demanding credentials nothing has
15
+ * signed in for. The active config's model was written for the provider
16
+ * named in that config, so it only travels into the soul when they still
17
+ * match; otherwise the selected provider's own default model stands in.
18
+ *
19
+ * Exported for tests: the interactive path that consumes it needs a TTY.
20
+ */
21
+ export const soulPinForNewAgent = (activeConfig, processEnv) => {
22
+ // The map already validates, so the value is a provider name; the cast
23
+ // only undoes `readNonEmptyString`'s widening to `string`.
24
+ const envProvider = readNonEmptyString(processEnv.STRATUS_PROVIDER, (value) => parseProviderName(value, 'STRATUS_PROVIDER'));
25
+ const provider = envProvider ?? activeConfig.provider ?? 'demo';
26
+ if (provider === 'demo') {
27
+ return { provider };
28
+ }
29
+ const configModelApplies = (activeConfig.provider ?? 'openai') === provider;
30
+ const model = readNonEmptyString(processEnv.STRATUS_MODEL)
31
+ ?? (configModelApplies ? activeConfig.model : undefined)
32
+ // A contributed provider's default model is its own — pinning a
33
+ // built-in's into a new soul would point the plugin at a model it
34
+ // never heard of.
35
+ ?? (isRegisteredProviderName(provider)
36
+ ? undefined
37
+ : provider === 'openai'
38
+ ? DEFAULT_OPENAI_MODEL
39
+ : provider === 'codex'
40
+ ? DEFAULT_CODEX_MODEL
41
+ : DEFAULT_ANTHROPIC_MODEL);
42
+ return model !== undefined ? { provider, model } : { provider };
43
+ };
44
+ export const runAgentNew = async (command, streams, env = {}) => {
45
+ // On a real terminal, creating an agent is the same guided experience as
46
+ // setup: a headed screen, a prefilled (editable) name, a personality, and
47
+ // an offer to make them the default. Scripted formats and piped input
48
+ // keep the plain one-shot output.
49
+ const interactive = env.setupInput === undefined
50
+ && process.stdin.isTTY === true
51
+ && command.format === 'text';
52
+ if (interactive) {
53
+ const prompter = createSetupPrompter(streams, env, {
54
+ header: stratusHeaderLines,
55
+ consumeNotices: () => [],
56
+ });
57
+ try {
58
+ streams.stdout.write('\u001b[2J\u001b[H');
59
+ for (const line of stratusHeaderLines()) {
60
+ writeLine(streams.stdout, line);
61
+ }
62
+ writeLine(streams.stdout);
63
+ const suggested = command.name ?? generateAgentName();
64
+ const name = (await prompter.ask('Choose your name: ', { prefill: suggested })) || suggested;
65
+ const instructions = await prompter.ask('Describe their personality (Enter for a starter you can edit later): ', ...(command.instructions ? [{ prefill: command.instructions }] : []));
66
+ const persona = instructions || DEFAULT_SOUL_STARTER;
67
+ const processEnv = readProcessEnv(env);
68
+ // Creating an agent must not be blocked by a broken config — it only
69
+ // feeds the soul's provider/model hint, so fall back to defaults.
70
+ const { location: configLocation, config: activeConfig } = await discoverActiveConfig(env, (message) => {
71
+ writeLine(streams.stdout, `Note: ${message}.`);
72
+ });
73
+ const { provider: soulProvider, model: soulModel } = soulPinForNewAgent(activeConfig, processEnv);
74
+ const soulPin = soulProvider !== 'demo' && soulModel !== undefined
75
+ ? { provider: soulProvider, model: soulModel }
76
+ : {};
77
+ const claimed = await claimSoulFile(env, { name, instructions: persona }, (candidate) => formatSoul({ agent: candidate, ...soulPin }), (message) => writeLine(streams.stdout, message));
78
+ const { agent, soulPath } = claimed;
79
+ const makeDefault = await prompter.select(`Make ${agent.name} your default agent?`, [
80
+ 'Yes — every stratus run talks to them',
81
+ 'Not now',
82
+ ]);
83
+ let madeDefault = false;
84
+ if (makeDefault.kind === 'index' && makeDefault.index === 0) {
85
+ // The default agent is a machine-wide setting, so it lands in the
86
+ // global config even when a project config is active here.
87
+ let globalConfig;
88
+ try {
89
+ globalConfig = await loadConfigFile(globalConfigPath(env));
90
+ }
91
+ catch (error) {
92
+ if (error.code === 'ENOENT') {
93
+ globalConfig = {};
94
+ }
95
+ else {
96
+ // A malformed config is recoverable by hand — never overwrite it.
97
+ writeLine(streams.stdout, `Could not read ${globalConfigPath(env)} (${error instanceof Error ? error.message : String(error)}), so it was left untouched. Fix it, then make ${agent.name} the default from stratus setup.`);
98
+ }
99
+ }
100
+ if (globalConfig !== undefined) {
101
+ // Re-validated rather than cast: `readNonEmptyString` widens to
102
+ // `string`, and the shared parser is what says which strings are
103
+ // provider names. Every source feeding soulProvider is already one,
104
+ // so this narrows without being able to throw.
105
+ const config = {
106
+ ...globalConfig,
107
+ provider: globalConfig.provider ?? parseProviderName(soulProvider, 'provider'),
108
+ soul: soulPath,
109
+ };
110
+ await saveConfigFile(globalConfigPath(env), config);
111
+ madeDefault = true;
112
+ if (configLocation && configLocation.path !== globalConfigPath(env)) {
113
+ writeLine(streams.stdout, `Note: ${configLocation.path} takes precedence over the global config for runs started in this directory.`);
114
+ }
115
+ }
116
+ }
117
+ writeLine(streams.stdout);
118
+ writeLine(streams.stdout, `Say hello to ${agent.name}.`);
119
+ writeLine(streams.stdout, `Their soul lives at ${soulPath} — edit it any time to change how they talk.`);
120
+ writeLine(streams.stdout);
121
+ writeLine(streams.stdout, 'Try:');
122
+ writeLine(streams.stdout, madeDefault
123
+ ? ' stratus run "introduce yourself"'
124
+ : ` stratus run --soul ${quoteShellArg(soulPath)} "introduce yourself"`);
125
+ return 0;
126
+ }
127
+ finally {
128
+ prompter.close();
129
+ }
130
+ }
131
+ const agent = defineAgent({
132
+ ...(command.name ? { name: command.name } : {}),
133
+ ...(command.instructions ? { instructions: command.instructions } : {}),
134
+ });
135
+ if (command.format === 'json') {
136
+ writeLine(streams.stdout, JSON.stringify(agent, null, 2));
137
+ return 0;
138
+ }
139
+ if (command.format === 'soul') {
140
+ streams.stdout.write(formatSoul({ agent, provider: 'anthropic', model: DEFAULT_ANTHROPIC_MODEL }));
141
+ return 0;
142
+ }
143
+ writeLine(streams.stdout, `Say hello to ${agent.name}.`);
144
+ writeLine(streams.stdout);
145
+ writeLine(streams.stdout, ` id ${agent.id}`);
146
+ writeLine(streams.stdout, ` avatar ${agent.avatar?.style} theme, hue ${agent.avatar?.hue}, palette ${agent.avatar?.palette.join(' ')}`);
147
+ if (agent.instructions) {
148
+ writeLine(streams.stdout, ` soul ${agent.instructions}`);
149
+ }
150
+ writeLine(streams.stdout);
151
+ writeLine(streams.stdout, 'Save this as a soul file and run it:');
152
+ writeLine(streams.stdout, ` stratus agent new --name ${quoteShellArg(agent.name)}${command.instructions ? ` --instructions ${quoteShellArg(command.instructions)}` : ''} --format soul > my-agent.md`);
153
+ writeLine(streams.stdout, ' stratus run --soul my-agent.md "hello"');
154
+ writeLine(streams.stdout);
155
+ writeLine(streams.stdout, 'Definition (JSON):');
156
+ writeLine(streams.stdout, JSON.stringify(agent, null, 2));
157
+ return 0;
158
+ };
159
+ //# sourceMappingURL=agent-new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-new.js","sourceRoot":"","sources":["../../src/commands/agent-new.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CliStreams, CliEnvironment } from '../environment.ts';
2
+ import type { ParsedAgentsCommand } from '../parse.ts';
3
+ export declare const runAgents: (command: ParsedAgentsCommand, streams: CliStreams, env?: CliEnvironment) => Promise<number>;
4
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAmCvD,eAAO,MAAM,SAAS,GACpB,SAAS,mBAAmB,EAC5B,SAAS,UAAU,EACnB,MAAK,cAAmB,KACvB,OAAO,CAAC,MAAM,CA+DhB,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { listAgentSummaries, migrateLegacyMemory } from '@stratusagent/state';
2
+ import { gatewayToken } from "../daemon.js";
3
+ import { writeLine } from "../io.js";
4
+ /** Ask a running gateway for its roster, as data. */
5
+ const remoteAgentSummaries = async (command, env) => {
6
+ const token = await gatewayToken(env, command.token);
7
+ const base = String(command.gateway).replace(/\/+$/, '');
8
+ const fetchImpl = env.fetch ?? globalThis.fetch;
9
+ if (typeof fetchImpl !== 'function') {
10
+ throw new Error('fetch is unavailable, so --gateway cannot reach a daemon from this runtime.');
11
+ }
12
+ let response;
13
+ try {
14
+ response = await fetchImpl(`${base}/api/v1/agents`, {
15
+ headers: { authorization: `Bearer ${token}` },
16
+ });
17
+ }
18
+ catch (error) {
19
+ throw new Error(`Could not reach the gateway at ${base} (${error instanceof Error ? error.message : String(error)}). `
20
+ + 'Is stratusd running, and does it have @stratusagent/control-api installed?');
21
+ }
22
+ if (response.status === 401 || response.status === 403) {
23
+ throw new Error(`The gateway at ${base} rejected this token. Check --token, STRATUS_GATEWAY_TOKEN, or ~/.stratus/gateway-token.`);
24
+ }
25
+ if (!response.ok) {
26
+ throw new Error(`The gateway at ${base} answered HTTP ${response.status} for the roster.`);
27
+ }
28
+ const payload = await response.json();
29
+ return payload.agents ?? [];
30
+ };
31
+ export const runAgents = async (command, streams, env = {}) => {
32
+ // The same listing either way — the shared builder produces it locally, and
33
+ // the control API serves exactly what that builder produced. Rendering is
34
+ // the only thing this command does with it.
35
+ let listings;
36
+ if (command.gateway) {
37
+ listings = await remoteAgentSummaries(command, env);
38
+ }
39
+ else {
40
+ // Fold any legacy per-directory memory in first so the counts below
41
+ // reflect everything each agent actually remembers.
42
+ await migrateLegacyMemory(env);
43
+ listings = await listAgentSummaries(env, (message) => {
44
+ writeLine(streams.stderr, `Warning: ${message}.`);
45
+ });
46
+ }
47
+ // The palette travels structurally now, because a web or macOS surface has
48
+ // to draw it. This output has always been one prose line, and a shape
49
+ // change here would break every script reading it — so the rendering, not
50
+ // the data, stays where it was.
51
+ const describeAvatar = (avatar) => `${avatar.style} theme, hue ${avatar.hue}, palette ${avatar.palette.join(' ')}`;
52
+ if (command.format === 'json') {
53
+ writeLine(streams.stdout, JSON.stringify({
54
+ agents: listings.map(({ default: isDefault, avatar, ...rest }) => ({
55
+ ...rest,
56
+ ...(avatar ? { avatar: describeAvatar(avatar) } : {}),
57
+ default: isDefault,
58
+ })),
59
+ }, null, 2));
60
+ return 0;
61
+ }
62
+ const describeRunsOn = (runsOn) => (runsOn.provider === 'demo' ? 'demo (offline)' : `${runsOn.provider}${runsOn.model ? ` · ${runsOn.model}` : ''}`);
63
+ writeLine(streams.stdout, command.gateway ? `Agents on ${command.gateway}` : 'Agents');
64
+ for (const agent of listings) {
65
+ const labels = [
66
+ ...(agent.default ? ['default'] : []),
67
+ ...(agent.builtIn ? ['built-in'] : []),
68
+ ];
69
+ writeLine(streams.stdout);
70
+ writeLine(streams.stdout, ` ${agent.name}${labels.length > 0 ? ` (${labels.join(', ')})` : ''}`);
71
+ writeLine(streams.stdout, ` id ${agent.id}`);
72
+ if (agent.soulPath) {
73
+ writeLine(streams.stdout, ` soul ${agent.soulPath}`);
74
+ }
75
+ writeLine(streams.stdout, ` runs on ${agent.provider ? describeRunsOn(agent.runsOn) : `follows your setup — currently ${describeRunsOn(agent.runsOn)}`}`);
76
+ writeLine(streams.stdout, ` memory ${agent.memories === 0 ? 'nothing yet' : `${agent.memories} remembered fact${agent.memories === 1 ? '' : 's'}`}`);
77
+ if (agent.persona) {
78
+ writeLine(streams.stdout, ` persona ${agent.persona}`);
79
+ }
80
+ if (agent.avatar) {
81
+ writeLine(streams.stdout, ` avatar ${describeAvatar(agent.avatar)}`);
82
+ }
83
+ }
84
+ writeLine(streams.stdout);
85
+ writeLine(streams.stdout, listings.length === 1
86
+ ? 'That is just the built-in default — create your own with: stratus agent new'
87
+ : 'Talk to the default with stratus run, or to anyone with stratus run --soul <file>.');
88
+ return 0;
89
+ };
90
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CliStreams, CliEnvironment } from '../environment.ts';
2
+ import { type ParsedChatCommand } from '../parse.ts';
3
+ export declare const runChat: (command: ParsedChatCommand, streams: CliStreams, env?: CliEnvironment) => Promise<number>;
4
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGpE,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAqB1E,eAAO,MAAM,OAAO,GAClB,SAAS,iBAAiB,EAC1B,SAAS,UAAU,EACnB,MAAK,cAAmB,KACvB,OAAO,CAAC,MAAM,CAmNhB,CAAC"}
@@ -0,0 +1,227 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { createInterface } from 'node:readline';
3
+ import { formatEvent } from "../events.js";
4
+ import { writeLine } from "../io.js";
5
+ import { defaultApprovalMode } from "../parse.js";
6
+ import { stratusHeaderLines } from "../prompter.js";
7
+ import { resolveRuntimeConfig, warnOnCredentialOverride, warnOnUntrustedConfig, createAgentRuntime } from "../runtime.js";
8
+ const lastAssistantReply = (session) => {
9
+ for (let index = session.messages.length - 1; index >= 0; index -= 1) {
10
+ const message = session.messages[index];
11
+ if (message && message.role === 'assistant' && message.content.trim().length > 0) {
12
+ return message.content;
13
+ }
14
+ }
15
+ return '(no reply)';
16
+ };
17
+ const CHAT_HELP = [
18
+ ' /help show this',
19
+ ' /exit leave the chat (Ctrl+C and Ctrl+D work too)',
20
+ 'Everything else is a message to your agent. The conversation persists',
21
+ 'across turns, and facts they remember stick forever.',
22
+ ].join('\n');
23
+ export const runChat = async (command, streams, env = {}) => {
24
+ const runtime = await resolveRuntimeConfig({
25
+ command: 'run',
26
+ prompt: '',
27
+ format: 'text',
28
+ events: false,
29
+ ...(command.approvals ? { approvals: command.approvals } : {}),
30
+ ...(command.provider ? { provider: command.provider } : {}),
31
+ ...(command.model ? { model: command.model } : {}),
32
+ ...(command.baseUrl ? { baseUrl: command.baseUrl } : {}),
33
+ ...(command.soul ? { soul: command.soul } : {}),
34
+ ...(command.configPath ? { configPath: command.configPath } : {}),
35
+ }, env);
36
+ warnOnUntrustedConfig(runtime, streams);
37
+ await warnOnCredentialOverride(runtime, streams, env);
38
+ // Interactive means the real terminal: an injected stdinStream is by
39
+ // definition not a TTY conversation, so it never gets prompts, ANSI
40
+ // styling, or a terminal readline wired to a stream that can't take it.
41
+ const interactive = env.setupInput === undefined
42
+ && env.stdinStream === undefined
43
+ && process.stdin.isTTY === true;
44
+ // Styling is for eyes: piped transcripts stay plain text.
45
+ const bold = (text) => (interactive ? `\u001b[1m${text}\u001b[0m` : text);
46
+ const dim = (text) => (interactive ? `\u001b[2m${text}\u001b[0m` : text);
47
+ const input = env.stdinStream ?? process.stdin;
48
+ const rl = interactive
49
+ ? createInterface({
50
+ input,
51
+ output: streams.stdout,
52
+ prompt: '\u001b[36myou ›\u001b[0m ',
53
+ terminal: true,
54
+ })
55
+ : createInterface({ input, terminal: false });
56
+ // One reader owns stdin. Every line lands in this queue, and whoever is
57
+ // waiting — the chat loop, or an approval question mid-turn — takes the
58
+ // next one. A second readline would race for the same bytes, and
59
+ // rl.question cannot be used while the interface is being iterated.
60
+ const lineQueue = [];
61
+ let inputClosed = false;
62
+ let pendingApproval;
63
+ let notifyLine;
64
+ rl.on('line', (rawLine) => {
65
+ if (pendingApproval) {
66
+ const resolve = pendingApproval;
67
+ pendingApproval = undefined;
68
+ resolve(rawLine);
69
+ return;
70
+ }
71
+ lineQueue.push(rawLine);
72
+ notifyLine?.();
73
+ });
74
+ rl.on('close', () => {
75
+ inputClosed = true;
76
+ if (pendingApproval) {
77
+ const resolve = pendingApproval;
78
+ pendingApproval = undefined;
79
+ resolve('');
80
+ }
81
+ notifyLine?.();
82
+ });
83
+ const nextLine = () => {
84
+ if (lineQueue.length > 0) {
85
+ return Promise.resolve(lineQueue.shift());
86
+ }
87
+ if (inputClosed) {
88
+ return Promise.resolve(undefined);
89
+ }
90
+ return new Promise((resolve) => {
91
+ notifyLine = () => {
92
+ notifyLine = undefined;
93
+ resolve(lineQueue.shift());
94
+ };
95
+ });
96
+ };
97
+ // An approval consumes the next unconsumed line (typed live, or already
98
+ // queued from piped input). A closed stream denies instead of hanging.
99
+ const askApproval = (prompt) => {
100
+ streams.stderr.write(prompt);
101
+ const queued = lineQueue.shift();
102
+ if (queued !== undefined) {
103
+ return Promise.resolve(queued);
104
+ }
105
+ if (inputClosed) {
106
+ return Promise.resolve('');
107
+ }
108
+ return new Promise((resolve) => {
109
+ pendingApproval = resolve;
110
+ });
111
+ };
112
+ const { runner, agent, metadata, disposePlugins } = await createAgentRuntime(streams, {
113
+ runtime,
114
+ approvals: command.approvals ?? defaultApprovalMode(env),
115
+ approvalsDefaulted: command.approvals === undefined,
116
+ askApproval,
117
+ ...(command.maxTurns !== undefined ? { maxTurns: command.maxTurns } : {}),
118
+ ...(command.configPath ? { configPath: command.configPath } : {}),
119
+ env,
120
+ onEvent: (event) => {
121
+ if (command.events) {
122
+ const line = formatEvent(event);
123
+ if (line) {
124
+ writeLine(streams.stdout, dim(line));
125
+ }
126
+ return;
127
+ }
128
+ // Quiet by default — just a whisper when the agent reaches for a tool.
129
+ if (event.type === 'tool.called') {
130
+ writeLine(streams.stdout, dim(` · using ${event.call.toolName}`));
131
+ }
132
+ else if (event.type === 'tool.denied') {
133
+ writeLine(streams.stdout, dim(` · ${event.call.toolName} denied`));
134
+ }
135
+ },
136
+ });
137
+ const modelLine = runtime.provider === 'demo'
138
+ ? 'demo (offline)'
139
+ : `${runtime.provider} · ${runtime.model ?? 'default model'}`;
140
+ if (interactive) {
141
+ streams.stdout.write('\u001b[2J\u001b[H');
142
+ for (const line of stratusHeaderLines()) {
143
+ writeLine(streams.stdout, line);
144
+ }
145
+ writeLine(streams.stdout);
146
+ writeLine(streams.stdout, `Chatting with ${bold(agent.name)} — ${modelLine}.`);
147
+ writeLine(streams.stdout, dim('The conversation persists across turns. /exit to leave, /help for more.'));
148
+ writeLine(streams.stdout);
149
+ }
150
+ // Ctrl+C between turns closes the chat gracefully; mid-turn there is
151
+ // nothing to cancel in the kernel yet, so leave immediately instead of
152
+ // silently waiting out a slow provider call.
153
+ let turnInFlight = false;
154
+ rl.on('SIGINT', () => {
155
+ if (turnInFlight) {
156
+ writeLine(streams.stdout);
157
+ writeLine(streams.stdout, dim('Interrupted.'));
158
+ process.exit(130);
159
+ }
160
+ rl.close();
161
+ });
162
+ // One session for the whole sitting: the first message starts it, every
163
+ // later message resumes it — the same plumbing a channel will use to
164
+ // keep a thread alive.
165
+ let sessionId;
166
+ if (interactive) {
167
+ rl.prompt();
168
+ }
169
+ for (;;) {
170
+ const rawLine = await nextLine();
171
+ if (rawLine === undefined) {
172
+ break;
173
+ }
174
+ const line = rawLine.trim();
175
+ if (line.length === 0) {
176
+ if (interactive) {
177
+ rl.prompt();
178
+ }
179
+ continue;
180
+ }
181
+ if (line === '/exit' || line === '/quit' || line === 'exit' || line === 'quit') {
182
+ break;
183
+ }
184
+ if (line === '/help') {
185
+ writeLine(streams.stdout, CHAT_HELP);
186
+ if (interactive) {
187
+ rl.prompt();
188
+ }
189
+ continue;
190
+ }
191
+ if (!interactive) {
192
+ writeLine(streams.stdout, `you › ${line}`);
193
+ }
194
+ try {
195
+ turnInFlight = true;
196
+ let session;
197
+ if (sessionId === undefined) {
198
+ const id = randomUUID();
199
+ sessionId = id;
200
+ session = await runner.run({ sessionId: id, agent, userMessage: line, metadata });
201
+ }
202
+ else {
203
+ session = await runner.resume({ sessionId, userMessage: line });
204
+ }
205
+ writeLine(streams.stdout, `${bold(`${agent.name} ›`)} ${lastAssistantReply(session)}`);
206
+ }
207
+ catch (error) {
208
+ writeLine(streams.stderr, `Error: ${error instanceof Error ? error.message : String(error)}`);
209
+ writeLine(streams.stdout, dim('(that turn failed — the conversation is still here, try again)'));
210
+ }
211
+ finally {
212
+ turnInFlight = false;
213
+ }
214
+ writeLine(streams.stdout);
215
+ if (interactive) {
216
+ rl.prompt();
217
+ }
218
+ }
219
+ rl.close();
220
+ // A chat that held a browser open for an hour still has to put it down.
221
+ await disposePlugins();
222
+ if (interactive) {
223
+ writeLine(streams.stdout, dim(`Bye — ${agent.name} keeps what they remembered.`));
224
+ }
225
+ return 0;
226
+ };
227
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { CliStreams, CliEnvironment } from '../environment.ts';
2
+ import type { ParsedCredentialCommand } from '../parse.ts';
3
+ /**
4
+ * `stratus credential set|list|remove`: the place a named credential goes.
5
+ *
6
+ * A credential nobody can add is a credential nobody has, which is why this
7
+ * exists at all — a search backend asks for `search.apiKey` and until now
8
+ * there was nowhere to put one. Three rules it keeps, all of them
9
+ * deliberate:
10
+ *
11
+ * The value is read from **stdin, never from a flag**. A secret in argv is
12
+ * a secret in shell history and in every `ps` on the machine.
13
+ *
14
+ * Nothing here ever prints a value back. `list` reports names and which
15
+ * agents have their own, the same posture the control API's credential read
16
+ * already keeps.
17
+ *
18
+ * And storing one grants no agent anything: the agent's soul still has to
19
+ * list the name under `credentials:`, which is the per-identity gate.
20
+ */
21
+ export declare const runCredential: (command: ParsedCredentialCommand, streams: CliStreams, env?: CliEnvironment) => Promise<number>;
22
+ //# sourceMappingURL=credential.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential.d.ts","sourceRoot":"","sources":["../../src/commands/credential.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE3D;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,uBAAuB,EAChC,SAAS,UAAU,EACnB,MAAK,cAAmB,KACvB,OAAO,CAAC,MAAM,CAoFhB,CAAC"}