@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
package/dist/io.js ADDED
@@ -0,0 +1,45 @@
1
+ import { stat } from 'node:fs/promises';
2
+ export const writeLine = (stream, line = '') => {
3
+ stream.write(`${line}\n`);
4
+ };
5
+ export const stringifyValue = (value) => {
6
+ if (typeof value === 'string') {
7
+ return value;
8
+ }
9
+ return JSON.stringify(value, null, 2);
10
+ };
11
+ export const readPromptFromStdin = async (stdin) => {
12
+ stdin.setEncoding('utf8');
13
+ let data = '';
14
+ for await (const chunk of stdin) {
15
+ data += chunk;
16
+ }
17
+ return data.trim();
18
+ };
19
+ /**
20
+ * Stdin exactly as it arrived, for a value where whitespace may be part of
21
+ * it.
22
+ *
23
+ * `readPromptFromStdin` trims, which is right for a prompt and wrong for a
24
+ * secret: a key whose real value has a leading space would be stored as a
25
+ * *different* key, reported as stored, and then fail authentication with
26
+ * nothing to look at — this command never prints a value back.
27
+ */
28
+ export const readSecretFromStdin = async (stdin) => {
29
+ stdin.setEncoding('utf8');
30
+ let data = '';
31
+ for await (const chunk of stdin) {
32
+ data += chunk;
33
+ }
34
+ return data;
35
+ };
36
+ export const pathExists = async (candidate) => {
37
+ try {
38
+ await stat(candidate);
39
+ return true;
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ };
45
+ //# sourceMappingURL=io.js.map
package/dist/io.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAA4C,EAAE,IAAI,GAAG,EAAE,EAAQ,EAAE;IACzF,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAgB,EAAU,EAAE;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,KAA4B,EAAmB,EAAE;IACzF,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAE1B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,KAAK,CAAC;IAChB,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,KAA4B,EAAmB,EAAE;IACzF,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAE1B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,KAAK,CAAC;IAChB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,SAAiB,EAAoB,EAAE;IACtE,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { CliEnvironment } from './environment.ts';
2
+ /**
3
+ * Whether an optional package is installed. The resolver is injectable
4
+ * because what is installed is a property of the machine: a test asserting
5
+ * on the real one would be asserting on its own node_modules, which is why
6
+ * every optional package is a devDependency here in the first place.
7
+ */
8
+ export declare const packageInstalled: (specifier: string, env?: CliEnvironment) => boolean;
9
+ type SlackAdapterFactory = typeof import('@stratusagent/channel-slack').createSlackChannelAdapter;
10
+ /**
11
+ * Loads the optional Slack channel package, or undefined when it is not
12
+ * installed. Only that package being absent is tolerated: an adapter that
13
+ * fails to load for any other reason (a broken install, a bad transitive
14
+ * dependency) surfaces rather than silently disabling Slack for a daemon
15
+ * whose stored tokens say it should be running.
16
+ */
17
+ export declare const loadSlackAdapter: () => Promise<SlackAdapterFactory | undefined>;
18
+ type ControlApiFactory = typeof import('@stratusagent/control-api').createControlApi;
19
+ export type GatewayFactory = typeof import('@stratusagent/gateway').createGateway;
20
+ /**
21
+ * Loads the optional control-API package, or undefined when it is not
22
+ * installed. Same two-step as the Slack adapter, and for the same reason:
23
+ * only the package being absent means "not installed". A package that IS
24
+ * installed but is missing one of its own dependencies throws
25
+ * ERR_MODULE_NOT_FOUND naming that dependency, so inspecting the message
26
+ * would read a broken install as an absent one — silently leaving a daemon
27
+ * without the API an operator installed it to have.
28
+ */
29
+ export declare const loadControlApi: () => Promise<ControlApiFactory | undefined>;
30
+ export {};
31
+ //# sourceMappingURL=loaders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loaders.d.ts","sourceRoot":"","sources":["../src/loaders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,kBAAkB,CAAC;AAoBxE;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAW,MAAM,EAAE,MAAK,cAAmB,KAAG,OACnB,CAAC;AAE7D,KAAK,mBAAmB,GAAG,cAAc,6BAA6B,EAAE,yBAAyB,CAAC;AAElG;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAOhF,CAAC;AAEF,KAAK,iBAAiB,GAAG,cAAc,2BAA2B,EAAE,gBAAgB,CAAC;AAErF,MAAM,MAAM,cAAc,GAAG,cAAc,uBAAuB,EAAE,aAAa,CAAC;AAElF;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAK5E,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Resolution and loading are separate questions, and only the first one
3
+ * means "not installed". Inspecting an import's error message cannot tell
4
+ * them apart: a package that IS installed but is missing one of its own
5
+ * dependencies throws ERR_MODULE_NOT_FOUND naming that dependency and the
6
+ * importer — so a broken install would read as an absent one, silently
7
+ * disabling a channel whose stored tokens say it should be running, or
8
+ * leaving a daemon without the API an operator installed it to have.
9
+ */
10
+ const defaultPackageResolver = (specifier) => {
11
+ try {
12
+ import.meta.resolve(specifier);
13
+ return true;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ };
19
+ /**
20
+ * Whether an optional package is installed. The resolver is injectable
21
+ * because what is installed is a property of the machine: a test asserting
22
+ * on the real one would be asserting on its own node_modules, which is why
23
+ * every optional package is a devDependency here in the first place.
24
+ */
25
+ export const packageInstalled = (specifier, env = {}) => (env.packageResolver ?? defaultPackageResolver)(specifier);
26
+ /**
27
+ * Loads the optional Slack channel package, or undefined when it is not
28
+ * installed. Only that package being absent is tolerated: an adapter that
29
+ * fails to load for any other reason (a broken install, a bad transitive
30
+ * dependency) surfaces rather than silently disabling Slack for a daemon
31
+ * whose stored tokens say it should be running.
32
+ */
33
+ export const loadSlackAdapter = async () => {
34
+ if (!packageInstalled('@stratusagent/channel-slack')) {
35
+ return undefined;
36
+ }
37
+ // Resolvable: any failure from here is a real problem with the
38
+ // installed package, and surfaces.
39
+ return (await import('@stratusagent/channel-slack')).createSlackChannelAdapter;
40
+ };
41
+ /**
42
+ * Loads the optional control-API package, or undefined when it is not
43
+ * installed. Same two-step as the Slack adapter, and for the same reason:
44
+ * only the package being absent means "not installed". A package that IS
45
+ * installed but is missing one of its own dependencies throws
46
+ * ERR_MODULE_NOT_FOUND naming that dependency, so inspecting the message
47
+ * would read a broken install as an absent one — silently leaving a daemon
48
+ * without the API an operator installed it to have.
49
+ */
50
+ export const loadControlApi = async () => {
51
+ if (!packageInstalled('@stratusagent/control-api')) {
52
+ return undefined;
53
+ }
54
+ return (await import('@stratusagent/control-api')).createControlApi;
55
+ };
56
+ //# sourceMappingURL=loaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loaders.js","sourceRoot":"","sources":["../src/loaders.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,sBAAsB,GAAoB,CAAC,SAAS,EAAE,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAE,MAAsB,EAAE,EAAW,EAAE,CACvF,CAAC,GAAG,CAAC,eAAe,IAAI,sBAAsB,CAAC,CAAC,SAAS,CAAC,CAAC;AAI7D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAA8C,EAAE;IACnF,IAAI,CAAC,gBAAgB,CAAC,6BAA6B,CAAC,EAAE,CAAC;QACrD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,+DAA+D;IAC/D,mCAAmC;IACnC,OAAO,CAAC,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,yBAAyB,CAAC;AACjF,CAAC,CAAC;AAMF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,IAA4C,EAAE;IAC/E,IAAI,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,EAAE,CAAC;QACnD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC,gBAAgB,CAAC;AACtE,CAAC,CAAC"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import type { CliStreams, CliEnvironment } from './environment.ts';
2
+ export interface CliRunOptions {
3
+ argv: string[];
4
+ streams?: CliStreams;
5
+ env?: CliEnvironment;
6
+ }
7
+ export declare const runCli: ({ argv, streams, env }: CliRunOptions) => Promise<number>;
8
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAcnE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,GAAG,CAAC,EAAE,cAAc,CAAC;CACtB;AAED,eAAO,MAAM,MAAM,GAAU,wBAAuC,aAAa,KAAG,OAAO,CAAC,MAAM,CA0NjG,CAAC"}
package/dist/main.js ADDED
@@ -0,0 +1,218 @@
1
+ import { redactAnthropicRawTurns } from '@stratusagent/provider-anthropic';
2
+ import { newerStateMessage, readStateStamp, runStateMigrations, STATE_SCHEMA_VERSION, } from '@stratusagent/state';
3
+ import { runAgentNew } from "./commands/agent-new.js";
4
+ import { runAgents } from "./commands/agents.js";
5
+ import { runChat } from "./commands/chat.js";
6
+ import { runCredential } from "./commands/credential.js";
7
+ import { runDashboard } from "./commands/dashboard.js";
8
+ import { runDoctor } from "./commands/doctor.js";
9
+ import { runGrants } from "./commands/grants.js";
10
+ import { runLogs } from "./commands/logs.js";
11
+ import { runMemory } from "./commands/memory.js";
12
+ import { runPlugins } from "./commands/plugins.js";
13
+ import { runRestart } from "./commands/restart.js";
14
+ import { runSchedules } from "./commands/schedules.js";
15
+ import { runServe } from "./commands/serve.js";
16
+ import { runService } from "./commands/service.js";
17
+ import { runSessionRollover } from "./commands/session.js";
18
+ import { runSetup } from "./commands/setup.js";
19
+ import { runSkillAdd, runSkillValidate, runSkillReload, runSkills } from "./commands/skills.js";
20
+ import { runTemplateAdd } from "./commands/template.js";
21
+ import { runUpdate } from "./commands/update.js";
22
+ import { HELP_TEXT } from "./help.js";
23
+ import { writeLine, readPromptFromStdin } from "./io.js";
24
+ import { CLI_VERSION } from "./npm.js";
25
+ import { parseCommand, defaultApprovalMode } from "./parse.js";
26
+ import { resolveRuntimeConfig, warnOnCredentialOverride, warnOnUntrustedConfig, runSingleLoop, printSessionSummary, formatRuntimeBanner, } from "./runtime.js";
27
+ export const runCli = async ({ argv, streams = process, env = {} }) => {
28
+ try {
29
+ const resolvedEnv = argv.includes('--stdin') && env.stdin === undefined
30
+ ? {
31
+ ...env,
32
+ stdin: await readPromptFromStdin(env.stdinStream ?? process.stdin),
33
+ }
34
+ : env;
35
+ const command = parseCommand(argv, resolvedEnv);
36
+ if (command.command === 'help') {
37
+ writeLine(streams.stdout, HELP_TEXT);
38
+ return 0;
39
+ }
40
+ // Above the migration check below, like help: reporting which build
41
+ // this is must not depend on the state it would migrate.
42
+ if (command.command === 'version') {
43
+ writeLine(streams.stdout, `stratus ${CLI_VERSION}`);
44
+ return 0;
45
+ }
46
+ // Migrations run on first use of a newer build — every command, every
47
+ // install path — not only via `stratus update`: state that migrates
48
+ // only sometimes is worse than state that never migrates, because the
49
+ // two populations diverge silently. `update` is excluded because it
50
+ // owns the migration step at its own place in the upgrade sequence
51
+ // (after the service stop and the package upgrade), and `--check` has
52
+ // to be able to report what is pending rather than having just done it.
53
+ if (command.command !== 'update') {
54
+ const stamp = await readStateStamp(resolvedEnv);
55
+ const writesState = command.command === 'serve'
56
+ || command.command === 'setup'
57
+ || command.command === 'chat'
58
+ || command.command === 'run'
59
+ || command.command === 'skill-add'
60
+ || command.command === 'template-add'
61
+ || command.command === 'dashboard'
62
+ || (command.command === 'credential' && command.action !== 'list')
63
+ || (command.command === 'schedules' && command.action === 'cancel')
64
+ || (command.command === 'memory' && command.action === 'reassert')
65
+ || command.command === 'session'
66
+ || (command.command === 'service' && (command.action === 'install' || command.action === 'start'));
67
+ if (stamp.schemaVersion > STATE_SCHEMA_VERSION) {
68
+ // Anything that writes under ~/.stratus refuses, not only the
69
+ // daemon: a downgraded build's setup, chat, or run can discard
70
+ // fields and invariants the newer format relies on — the exact
71
+ // hazard the stamp exists to close. Read-only commands warn and
72
+ // continue, because reading logs or the roster is how someone
73
+ // diagnoses their way OUT of this state; so do `service stop`,
74
+ // `status`, and `uninstall`, for the same reason. (`agent new`
75
+ // only prints an identity — it writes nothing.)
76
+ if (writesState) {
77
+ writeLine(streams.stderr, newerStateMessage(stamp.schemaVersion));
78
+ writeLine(streams.stderr, `Refusing \`stratus ${command.command}\` — it writes state the newer format owns. Read-only commands (logs, agents, doctor, service status/stop) still work.`);
79
+ return 1;
80
+ }
81
+ writeLine(streams.stderr, `Warning: ${newerStateMessage(stamp.schemaVersion)}`);
82
+ }
83
+ else {
84
+ try {
85
+ for (const migration of await runStateMigrations(resolvedEnv)) {
86
+ if (migration.detail !== undefined) {
87
+ writeLine(streams.stderr, `state migration ${migration.id}: ${migration.detail}`);
88
+ }
89
+ }
90
+ }
91
+ catch (error) {
92
+ const reason = error instanceof Error ? error.message : String(error);
93
+ // A command that writes state must not run on a home whose stamp
94
+ // could not be written: the labels it would persist are what the
95
+ // stamp protects, and a stamp still reading the old schema lets a
96
+ // downgraded build in afterwards to read an `external` fact as
97
+ // ordinary memory — the exact hole the stamp closes. A read-only
98
+ // command warns and continues, because reading is how someone
99
+ // diagnoses their way out; silence here is how the migrated and
100
+ // unmigrated populations diverge.
101
+ if (writesState) {
102
+ writeLine(streams.stderr, `State migration failed (${reason}).`);
103
+ writeLine(streams.stderr, `Refusing \`stratus ${command.command}\` — it writes state the migration stamps. Fix ~/.stratus (is state.json writable?) or run \`stratus update\`; read-only commands (logs, agents, doctor, memory list, service status/stop) still work.`);
104
+ return 1;
105
+ }
106
+ writeLine(streams.stderr, `Warning: state migration failed (${reason}). Continuing on unmigrated state — \`stratus update\` retries it.`);
107
+ }
108
+ }
109
+ }
110
+ // Every handler is awaited, never bare-returned: a bare `return
111
+ // promise` inside try/catch settles the async function before the
112
+ // catch can see it, so a command that fails at runtime — a gateway
113
+ // that cannot open its store, a missing credential — would escape as
114
+ // a raw rejection instead of the error line and exit code below.
115
+ if (command.command === 'agent-new') {
116
+ return await runAgentNew(command, streams, resolvedEnv);
117
+ }
118
+ if (command.command === 'agents') {
119
+ return await runAgents(command, streams, resolvedEnv);
120
+ }
121
+ if (command.command === 'template-add') {
122
+ return await runTemplateAdd(command, streams, resolvedEnv);
123
+ }
124
+ if (command.command === 'skill-add') {
125
+ return await runSkillAdd(command, streams, resolvedEnv);
126
+ }
127
+ if (command.command === 'skill-validate') {
128
+ return await runSkillValidate(command, streams, resolvedEnv);
129
+ }
130
+ if (command.command === 'skills') {
131
+ return await runSkills(streams, resolvedEnv);
132
+ }
133
+ if (command.command === 'plugins') {
134
+ return await runPlugins(command, streams, resolvedEnv);
135
+ }
136
+ if (command.command === 'credential') {
137
+ return await runCredential(command, streams, resolvedEnv);
138
+ }
139
+ if (command.command === 'skill-reload') {
140
+ return await runSkillReload(command, streams, resolvedEnv);
141
+ }
142
+ if (command.command === 'restart') {
143
+ return await runRestart(command, streams, resolvedEnv);
144
+ }
145
+ if (command.command === 'schedules') {
146
+ return await runSchedules(command, streams, resolvedEnv);
147
+ }
148
+ if (command.command === 'grants') {
149
+ return await runGrants(command, streams, resolvedEnv);
150
+ }
151
+ if (command.command === 'memory') {
152
+ return await runMemory(command, streams, resolvedEnv);
153
+ }
154
+ if (command.command === 'session') {
155
+ return await runSessionRollover(command, streams, resolvedEnv);
156
+ }
157
+ if (command.command === 'doctor') {
158
+ return await runDoctor(command, streams, resolvedEnv);
159
+ }
160
+ if (command.command === 'logs') {
161
+ return await runLogs(command, streams, resolvedEnv);
162
+ }
163
+ if (command.command === 'service') {
164
+ return await runService(command, streams, resolvedEnv);
165
+ }
166
+ if (command.command === 'update') {
167
+ return await runUpdate(command, streams, resolvedEnv);
168
+ }
169
+ if (command.command === 'chat') {
170
+ return await runChat(command, streams, resolvedEnv);
171
+ }
172
+ if (command.command === 'setup') {
173
+ return await runSetup(command, streams, resolvedEnv);
174
+ }
175
+ if (command.command === 'dashboard') {
176
+ return await runDashboard(command, streams, resolvedEnv);
177
+ }
178
+ if (command.command === 'serve') {
179
+ return await runServe(command, streams, resolvedEnv);
180
+ }
181
+ const runtime = await resolveRuntimeConfig(command, resolvedEnv);
182
+ warnOnUntrustedConfig(runtime, streams);
183
+ await warnOnCredentialOverride(runtime, streams, resolvedEnv);
184
+ if (command.format === 'text') {
185
+ writeLine(streams.stdout, formatRuntimeBanner(runtime));
186
+ }
187
+ const session = await runSingleLoop(command.prompt, streams, {
188
+ events: command.events && command.format === 'text',
189
+ runtime,
190
+ // `--stdin` has already read the terminal, so nothing could take a
191
+ // y/N there — what the parser refuses for an explicit `ask`.
192
+ approvals: command.approvals ?? defaultApprovalMode(resolvedEnv, argv.includes('--stdin')),
193
+ approvalsDefaulted: command.approvals === undefined,
194
+ ...(command.maxTurns !== undefined ? { maxTurns: command.maxTurns } : {}),
195
+ ...(command.configPath ? { configPath: command.configPath } : {}),
196
+ env: resolvedEnv,
197
+ });
198
+ if (command.format === 'json') {
199
+ writeLine(streams.stdout, JSON.stringify({
200
+ provider: runtime.provider,
201
+ // Replay state (Claude's raw thinking turns) stays in the stored
202
+ // session but never in user-facing output.
203
+ session: redactAnthropicRawTurns(session),
204
+ }, null, 2));
205
+ return 0;
206
+ }
207
+ printSessionSummary(session, streams);
208
+ return 0;
209
+ }
210
+ catch (error) {
211
+ const message = error instanceof Error ? error.message : String(error);
212
+ writeLine(streams.stderr, `Error: ${message}`);
213
+ writeLine(streams.stderr, '');
214
+ writeLine(streams.stderr, HELP_TEXT);
215
+ return 1;
216
+ }
217
+ };
218
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
package/dist/npm.d.ts ADDED
@@ -0,0 +1,66 @@
1
+ import type { InstalledVersionReader, PackageInstaller, PackageVersionFetcher } from './environment.ts';
2
+ /** How long `stratus update` waits for npm to answer a version lookup. */
3
+ export declare const VERSION_LOOKUP_TIMEOUT_MS = 15000;
4
+ export declare const defaultPackageVersionFetcher: PackageVersionFetcher;
5
+ /**
6
+ * Dotted-numeric comparison with SemVer's prerelease precedence, enough for
7
+ * this package's own versions: positive when `a` is newer than `b`.
8
+ * Anything unparseable in a segment counts as zero rather than throwing — a
9
+ * weird registry answer must not crash the update that would fix things.
10
+ *
11
+ * The prerelease half is not decoration. Split on dots alone, `0.11.2-beta.1`
12
+ * parses as a *fourth* numeric segment and so reads as newer than the stable
13
+ * `0.11.2` that supersedes it — which left a prerelease companion behind and
14
+ * stopped a prerelease CLI from ever seeing the stable release as an upgrade.
15
+ * SemVer's rule is the opposite and is the one applied here: a version
16
+ * carrying a prerelease is lower than the same version without one, and two
17
+ * prereleases compare identifier by identifier, numeric ones numerically and
18
+ * below alphanumeric ones.
19
+ */
20
+ export declare const compareVersions: (a: string, b: string) => number;
21
+ /**
22
+ * Whether spawning npm needs a shell on this platform.
23
+ *
24
+ * On Windows npm is `npm.cmd`, a batch file: a bare `npm` does not exist as
25
+ * an executable there (PATHEXT is a shell's job, not spawn's), and naming
26
+ * the `.cmd` directly has thrown EINVAL since the fix for CVE-2024-27980 —
27
+ * both land in the caller's error handler, so a Windows setup would report
28
+ * that it could not install and leave Slack and the dashboard missing.
29
+ *
30
+ * `shell: true` concatenates the arguments without escaping — Node 24
31
+ * deprecates the pattern as DEP0190 for exactly that reason — so what may
32
+ * reach it is fenced by `isInstallablePackageName` below rather than by an
33
+ * argument about where the names come from. That argument used to be
34
+ * "every name here is a constant in the CLI's own source", and it stopped
35
+ * being true
36
+ * the moment the Plugins menu started listing package names read from a
37
+ * config.
38
+ */
39
+ export declare const npmNeedsShell: (platform: NodeJS.Platform) => boolean;
40
+ export declare const isPackageName: (name: string) => boolean;
41
+ /**
42
+ * A package name, optionally with a plain version — what npm may be handed.
43
+ *
44
+ * A wider question than `isPackageName` and a different one: the updater
45
+ * installs `@stratusagent/cli@latest`, which is a valid thing to install and
46
+ * an invalid thing to import. Using one predicate for both let a versioned
47
+ * `plugins` key through the menu's install offer.
48
+ *
49
+ * The version half is deliberately not npm's full range syntax: `^1.0.0` is
50
+ * a valid range and `^` is cmd.exe's escape character. Only the plain forms
51
+ * this CLI actually passes are accepted, and a range that needs more is a
52
+ * thing to install by hand.
53
+ */
54
+ export declare const isInstallableSpecifier: (specifier: string) => boolean;
55
+ export declare const defaultPackageInstaller: PackageInstaller;
56
+ /**
57
+ * What `stratus update` reads to learn which version of a companion this
58
+ * machine actually has. Through `@stratusagent/plugins`, which already owns
59
+ * the bounded walk from a resolved specifier to its package.json — a second
60
+ * copy here would drift from it, and this one would be the copy that
61
+ * decides whether somebody's Slack adapter gets upgraded.
62
+ */
63
+ export declare const defaultInstalledVersionReader: InstalledVersionReader;
64
+ export declare const CLI_VERSION = "0.11.4";
65
+ export declare const CLI_PACKAGE_NAME = "@stratusagent/cli";
66
+ //# sourceMappingURL=npm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm.d.ts","sourceRoot":"","sources":["../src/npm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EAEtB,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,0EAA0E;AAC1E,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,eAAO,MAAM,4BAA4B,EAAE,qBA4B1C,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,eAAe,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,MAsDtD,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,CAAC,QAAQ,KAAG,OAA+B,CAAC;AAE1F,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,OAC0C,CAAC;AAExF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,sBAAsB,GAAI,WAAW,MAAM,KAAG,OAW1D,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,gBAwCrC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,EAAE,sBAG3C,CAAC;AAEF,eAAO,MAAM,WAAW,WAAW,CAAC;AAEpC,eAAO,MAAM,gBAAgB,sBAAsB,CAAC"}