@geminixiang/mama 0.2.0-beta.6 → 0.2.0-beta.8

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 (173) hide show
  1. package/README.md +20 -14
  2. package/dist/adapter.d.ts +5 -2
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/adapter.js.map +1 -1
  5. package/dist/adapters/discord/bot.d.ts +1 -0
  6. package/dist/adapters/discord/bot.d.ts.map +1 -1
  7. package/dist/adapters/discord/bot.js +29 -9
  8. package/dist/adapters/discord/bot.js.map +1 -1
  9. package/dist/adapters/discord/context.d.ts +1 -1
  10. package/dist/adapters/discord/context.d.ts.map +1 -1
  11. package/dist/adapters/discord/context.js +1 -2
  12. package/dist/adapters/discord/context.js.map +1 -1
  13. package/dist/adapters/slack/bot.d.ts +8 -0
  14. package/dist/adapters/slack/bot.d.ts.map +1 -1
  15. package/dist/adapters/slack/bot.js +177 -11
  16. package/dist/adapters/slack/bot.js.map +1 -1
  17. package/dist/adapters/slack/branch-manager.d.ts +1 -0
  18. package/dist/adapters/slack/branch-manager.d.ts.map +1 -1
  19. package/dist/adapters/slack/branch-manager.js +9 -8
  20. package/dist/adapters/slack/branch-manager.js.map +1 -1
  21. package/dist/adapters/slack/context.d.ts +1 -1
  22. package/dist/adapters/slack/context.d.ts.map +1 -1
  23. package/dist/adapters/slack/context.js +10 -8
  24. package/dist/adapters/slack/context.js.map +1 -1
  25. package/dist/adapters/slack/tools/attach.d.ts +1 -1
  26. package/dist/adapters/slack/tools/attach.d.ts.map +1 -1
  27. package/dist/adapters/slack/tools/attach.js.map +1 -1
  28. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  29. package/dist/adapters/telegram/bot.js +33 -2
  30. package/dist/adapters/telegram/bot.js.map +1 -1
  31. package/dist/agent.d.ts +1 -2
  32. package/dist/agent.d.ts.map +1 -1
  33. package/dist/agent.js +507 -422
  34. package/dist/agent.js.map +1 -1
  35. package/dist/commands/index.d.ts.map +1 -1
  36. package/dist/commands/index.js +2 -0
  37. package/dist/commands/index.js.map +1 -1
  38. package/dist/commands/login.d.ts.map +1 -1
  39. package/dist/commands/login.js +41 -2
  40. package/dist/commands/login.js.map +1 -1
  41. package/dist/commands/model.d.ts +1 -1
  42. package/dist/commands/model.d.ts.map +1 -1
  43. package/dist/commands/model.js +25 -7
  44. package/dist/commands/model.js.map +1 -1
  45. package/dist/commands/new.d.ts.map +1 -1
  46. package/dist/commands/new.js +1 -1
  47. package/dist/commands/new.js.map +1 -1
  48. package/dist/commands/sandbox.d.ts +10 -0
  49. package/dist/commands/sandbox.d.ts.map +1 -0
  50. package/dist/commands/sandbox.js +88 -0
  51. package/dist/commands/sandbox.js.map +1 -0
  52. package/dist/commands/session-view.d.ts.map +1 -1
  53. package/dist/commands/session-view.js +34 -10
  54. package/dist/commands/session-view.js.map +1 -1
  55. package/dist/commands/types.d.ts +1 -3
  56. package/dist/commands/types.d.ts.map +1 -1
  57. package/dist/commands/types.js.map +1 -1
  58. package/dist/commands/utils.d.ts +3 -0
  59. package/dist/commands/utils.d.ts.map +1 -1
  60. package/dist/commands/utils.js +5 -0
  61. package/dist/commands/utils.js.map +1 -1
  62. package/dist/config.d.ts +7 -1
  63. package/dist/config.d.ts.map +1 -1
  64. package/dist/config.js +64 -23
  65. package/dist/config.js.map +1 -1
  66. package/dist/context.d.ts +2 -44
  67. package/dist/context.d.ts.map +1 -1
  68. package/dist/context.js +7 -210
  69. package/dist/context.js.map +1 -1
  70. package/dist/events.d.ts.map +1 -1
  71. package/dist/events.js +15 -14
  72. package/dist/events.js.map +1 -1
  73. package/dist/execution-resolver.d.ts +3 -2
  74. package/dist/execution-resolver.d.ts.map +1 -1
  75. package/dist/execution-resolver.js +40 -7
  76. package/dist/execution-resolver.js.map +1 -1
  77. package/dist/file-guards.d.ts +6 -0
  78. package/dist/file-guards.d.ts.map +1 -0
  79. package/dist/file-guards.js +48 -0
  80. package/dist/file-guards.js.map +1 -0
  81. package/dist/log.d.ts +1 -5
  82. package/dist/log.d.ts.map +1 -1
  83. package/dist/log.js +13 -38
  84. package/dist/log.js.map +1 -1
  85. package/dist/login/index.d.ts +14 -2
  86. package/dist/login/index.d.ts.map +1 -1
  87. package/dist/login/index.js +40 -13
  88. package/dist/login/index.js.map +1 -1
  89. package/dist/login/portal.d.ts +2 -1
  90. package/dist/login/portal.d.ts.map +1 -1
  91. package/dist/login/portal.js +12 -12
  92. package/dist/login/portal.js.map +1 -1
  93. package/dist/main.d.ts.map +1 -1
  94. package/dist/main.js +33 -28
  95. package/dist/main.js.map +1 -1
  96. package/dist/provisioner.d.ts +12 -2
  97. package/dist/provisioner.d.ts.map +1 -1
  98. package/dist/provisioner.js +43 -14
  99. package/dist/provisioner.js.map +1 -1
  100. package/dist/runtime/conversation-orchestrator.d.ts +42 -0
  101. package/dist/runtime/conversation-orchestrator.d.ts.map +1 -0
  102. package/dist/runtime/conversation-orchestrator.js +150 -0
  103. package/dist/runtime/conversation-orchestrator.js.map +1 -0
  104. package/dist/runtime/session-runtime.d.ts +1 -1
  105. package/dist/runtime/session-runtime.d.ts.map +1 -1
  106. package/dist/runtime/session-runtime.js +49 -148
  107. package/dist/runtime/session-runtime.js.map +1 -1
  108. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  109. package/dist/sandbox/cloudflare.js +2 -2
  110. package/dist/sandbox/cloudflare.js.map +1 -1
  111. package/dist/sandbox/container.d.ts.map +1 -1
  112. package/dist/sandbox/container.js +1 -1
  113. package/dist/sandbox/container.js.map +1 -1
  114. package/dist/sandbox/index.d.ts.map +1 -1
  115. package/dist/sandbox/index.js +4 -4
  116. package/dist/sandbox/index.js.map +1 -1
  117. package/dist/sentry.d.ts +1 -1
  118. package/dist/sentry.d.ts.map +1 -1
  119. package/dist/sentry.js +2 -2
  120. package/dist/sentry.js.map +1 -1
  121. package/dist/session-store.d.ts +2 -1
  122. package/dist/session-store.d.ts.map +1 -1
  123. package/dist/session-store.js +19 -15
  124. package/dist/session-store.js.map +1 -1
  125. package/dist/session-view/portal.d.ts +6 -1
  126. package/dist/session-view/portal.d.ts.map +1 -1
  127. package/dist/session-view/portal.js +829 -71
  128. package/dist/session-view/portal.js.map +1 -1
  129. package/dist/session-view/service.d.ts.map +1 -1
  130. package/dist/session-view/service.js +5 -4
  131. package/dist/session-view/service.js.map +1 -1
  132. package/dist/session-view/store.d.ts +2 -1
  133. package/dist/session-view/store.d.ts.map +1 -1
  134. package/dist/session-view/store.js +2 -1
  135. package/dist/session-view/store.js.map +1 -1
  136. package/dist/store.d.ts.map +1 -1
  137. package/dist/store.js +7 -13
  138. package/dist/store.js.map +1 -1
  139. package/dist/tool-diagnostics.d.ts +2 -0
  140. package/dist/tool-diagnostics.d.ts.map +1 -0
  141. package/dist/tool-diagnostics.js +7 -0
  142. package/dist/tool-diagnostics.js.map +1 -0
  143. package/dist/tools/bash.d.ts +1 -1
  144. package/dist/tools/bash.d.ts.map +1 -1
  145. package/dist/tools/bash.js.map +1 -1
  146. package/dist/tools/edit.d.ts +1 -1
  147. package/dist/tools/edit.d.ts.map +1 -1
  148. package/dist/tools/edit.js.map +1 -1
  149. package/dist/tools/event.d.ts +1 -1
  150. package/dist/tools/event.d.ts.map +1 -1
  151. package/dist/tools/event.js.map +1 -1
  152. package/dist/tools/index.d.ts +1 -1
  153. package/dist/tools/index.d.ts.map +1 -1
  154. package/dist/tools/index.js.map +1 -1
  155. package/dist/tools/read.d.ts +1 -1
  156. package/dist/tools/read.d.ts.map +1 -1
  157. package/dist/tools/read.js.map +1 -1
  158. package/dist/tools/write.d.ts +1 -1
  159. package/dist/tools/write.d.ts.map +1 -1
  160. package/dist/tools/write.js.map +1 -1
  161. package/dist/vault-routing.d.ts +0 -3
  162. package/dist/vault-routing.d.ts.map +1 -1
  163. package/dist/vault-routing.js +0 -24
  164. package/dist/vault-routing.js.map +1 -1
  165. package/dist/vault.d.ts +21 -57
  166. package/dist/vault.d.ts.map +1 -1
  167. package/dist/vault.js +114 -246
  168. package/dist/vault.js.map +1 -1
  169. package/package.json +6 -4
  170. package/dist/bindings.d.ts +0 -45
  171. package/dist/bindings.d.ts.map +0 -1
  172. package/dist/bindings.js +0 -75
  173. package/dist/bindings.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../src/bindings.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,YAAY,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,gFAAgF;IAChF,cAAc,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,4FAA4F;IAC5F,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IAC3E,wBAAwB;IACxB,IAAI,IAAI,WAAW,EAAE,CAAC;IACtB,uEAAuE;IACvE,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACnC,sDAAsD;IACtD,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvD,sCAAsC;IACtC,MAAM,IAAI,IAAI,CAAC;IACf,+DAA+D;IAC/D,SAAS,IAAI,OAAO,CAAC;CACtB;AAED,0EAA0E;AAC1E,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,YAAY,QAAQ,EAAE,MAAM,EAG3B;IAED,MAAM,IAAI,IAAI,CAkBb;IAED,SAAS,IAAI,OAAO,CAEnB;IAED,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAMzE;IAED,IAAI,IAAI,WAAW,EAAE,CAEpB;IAED,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAajC;IAED,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAUrD;IAED,OAAO,CAAC,OAAO;CAQhB","sourcesContent":["import { existsSync, mkdirSync, readFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport type { PlatformName } from \"./adapter.js\";\nimport { atomicWritePrivateFile } from \"./fs-atomic.js\";\n\nexport interface UserBinding {\n platform: PlatformName;\n platformUserId: string;\n /** Internal identity (matches vault key in vault.json, or a backend user ID) */\n internalUserId: string;\n /** Key in vault.json that holds this user's credentials */\n vaultId: string;\n /** Optional future field for explicit execution target override */\n executionTargetId?: string;\n status: \"pending\" | \"active\" | \"revoked\";\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface BindingsConfig {\n bindings: UserBinding[];\n}\n\nexport interface UserBindingStore {\n /** Resolve active binding for a platform user; returns undefined if not found or revoked */\n resolve(platform: string, platformUserId: string): UserBinding | undefined;\n /** List all bindings */\n list(): UserBinding[];\n /** Upsert a binding (insert or update by platform + platformUserId) */\n upsert(binding: UserBinding): void;\n /** Revoke a binding by setting status to \"revoked\" */\n revoke(platform: string, platformUserId: string): void;\n /** Re-read bindings.json from disk */\n reload(): void;\n /** Whether bindings.json exists and was loaded successfully */\n isEnabled(): boolean;\n}\n\n/** File-backed binding store. Reads and writes `vaults/bindings.json`. */\nexport class FileUserBindingStore implements UserBindingStore {\n private config: BindingsConfig | null = null;\n private readonly configPath: string;\n\n constructor(stateDir: string) {\n this.configPath = join(stateDir, \"vaults\", \"bindings.json\");\n this.reload();\n }\n\n reload(): void {\n if (!existsSync(this.configPath)) {\n this.config = null;\n return;\n }\n try {\n const raw = readFileSync(this.configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (!parsed || !Array.isArray(parsed.bindings)) {\n console.error(\"bindings: malformed bindings.json — expected { bindings: [...] }\");\n this.config = null;\n return;\n }\n this.config = parsed as BindingsConfig;\n } catch (err) {\n console.error(`bindings: failed to read ${this.configPath}:`, err);\n this.config = null;\n }\n }\n\n isEnabled(): boolean {\n return this.config !== null;\n }\n\n resolve(platform: string, platformUserId: string): UserBinding | undefined {\n if (!this.config) return undefined;\n return this.config.bindings.find(\n (b) =>\n b.platform === platform && b.platformUserId === platformUserId && b.status === \"active\",\n );\n }\n\n list(): UserBinding[] {\n return this.config?.bindings ?? [];\n }\n\n upsert(binding: UserBinding): void {\n if (!this.config) {\n this.config = { bindings: [] };\n }\n const idx = this.config.bindings.findIndex(\n (b) => b.platform === binding.platform && b.platformUserId === binding.platformUserId,\n );\n if (idx >= 0) {\n this.config.bindings[idx] = binding;\n } else {\n this.config.bindings.push(binding);\n }\n this.persist();\n }\n\n revoke(platform: string, platformUserId: string): void {\n if (!this.config) return;\n const binding = this.config.bindings.find(\n (b) => b.platform === platform && b.platformUserId === platformUserId,\n );\n if (binding) {\n binding.status = \"revoked\";\n binding.updatedAt = new Date().toISOString();\n this.persist();\n }\n }\n\n private persist(): void {\n try {\n mkdirSync(dirname(this.configPath), { recursive: true });\n atomicWritePrivateFile(this.configPath, JSON.stringify(this.config, null, 2) + \"\\n\");\n } catch (err) {\n console.error(`bindings: failed to write ${this.configPath}:`, err);\n }\n }\n}\n"]}
package/dist/bindings.js DELETED
@@ -1,75 +0,0 @@
1
- import { existsSync, mkdirSync, readFileSync } from "fs";
2
- import { dirname, join } from "path";
3
- import { atomicWritePrivateFile } from "./fs-atomic.js";
4
- /** File-backed binding store. Reads and writes `vaults/bindings.json`. */
5
- export class FileUserBindingStore {
6
- constructor(stateDir) {
7
- this.config = null;
8
- this.configPath = join(stateDir, "vaults", "bindings.json");
9
- this.reload();
10
- }
11
- reload() {
12
- if (!existsSync(this.configPath)) {
13
- this.config = null;
14
- return;
15
- }
16
- try {
17
- const raw = readFileSync(this.configPath, "utf-8");
18
- const parsed = JSON.parse(raw);
19
- if (!parsed || !Array.isArray(parsed.bindings)) {
20
- console.error("bindings: malformed bindings.json — expected { bindings: [...] }");
21
- this.config = null;
22
- return;
23
- }
24
- this.config = parsed;
25
- }
26
- catch (err) {
27
- console.error(`bindings: failed to read ${this.configPath}:`, err);
28
- this.config = null;
29
- }
30
- }
31
- isEnabled() {
32
- return this.config !== null;
33
- }
34
- resolve(platform, platformUserId) {
35
- if (!this.config)
36
- return undefined;
37
- return this.config.bindings.find((b) => b.platform === platform && b.platformUserId === platformUserId && b.status === "active");
38
- }
39
- list() {
40
- return this.config?.bindings ?? [];
41
- }
42
- upsert(binding) {
43
- if (!this.config) {
44
- this.config = { bindings: [] };
45
- }
46
- const idx = this.config.bindings.findIndex((b) => b.platform === binding.platform && b.platformUserId === binding.platformUserId);
47
- if (idx >= 0) {
48
- this.config.bindings[idx] = binding;
49
- }
50
- else {
51
- this.config.bindings.push(binding);
52
- }
53
- this.persist();
54
- }
55
- revoke(platform, platformUserId) {
56
- if (!this.config)
57
- return;
58
- const binding = this.config.bindings.find((b) => b.platform === platform && b.platformUserId === platformUserId);
59
- if (binding) {
60
- binding.status = "revoked";
61
- binding.updatedAt = new Date().toISOString();
62
- this.persist();
63
- }
64
- }
65
- persist() {
66
- try {
67
- mkdirSync(dirname(this.configPath), { recursive: true });
68
- atomicWritePrivateFile(this.configPath, JSON.stringify(this.config, null, 2) + "\n");
69
- }
70
- catch (err) {
71
- console.error(`bindings: failed to write ${this.configPath}:`, err);
72
- }
73
- }
74
- }
75
- //# sourceMappingURL=bindings.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bindings.js","sourceRoot":"","sources":["../src/bindings.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport type { PlatformName } from \"./adapter.js\";\nimport { atomicWritePrivateFile } from \"./fs-atomic.js\";\n\nexport interface UserBinding {\n platform: PlatformName;\n platformUserId: string;\n /** Internal identity (matches vault key in vault.json, or a backend user ID) */\n internalUserId: string;\n /** Key in vault.json that holds this user's credentials */\n vaultId: string;\n /** Optional future field for explicit execution target override */\n executionTargetId?: string;\n status: \"pending\" | \"active\" | \"revoked\";\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface BindingsConfig {\n bindings: UserBinding[];\n}\n\nexport interface UserBindingStore {\n /** Resolve active binding for a platform user; returns undefined if not found or revoked */\n resolve(platform: string, platformUserId: string): UserBinding | undefined;\n /** List all bindings */\n list(): UserBinding[];\n /** Upsert a binding (insert or update by platform + platformUserId) */\n upsert(binding: UserBinding): void;\n /** Revoke a binding by setting status to \"revoked\" */\n revoke(platform: string, platformUserId: string): void;\n /** Re-read bindings.json from disk */\n reload(): void;\n /** Whether bindings.json exists and was loaded successfully */\n isEnabled(): boolean;\n}\n\n/** File-backed binding store. Reads and writes `vaults/bindings.json`. */\nexport class FileUserBindingStore implements UserBindingStore {\n private config: BindingsConfig | null = null;\n private readonly configPath: string;\n\n constructor(stateDir: string) {\n this.configPath = join(stateDir, \"vaults\", \"bindings.json\");\n this.reload();\n }\n\n reload(): void {\n if (!existsSync(this.configPath)) {\n this.config = null;\n return;\n }\n try {\n const raw = readFileSync(this.configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (!parsed || !Array.isArray(parsed.bindings)) {\n console.error(\"bindings: malformed bindings.json — expected { bindings: [...] }\");\n this.config = null;\n return;\n }\n this.config = parsed as BindingsConfig;\n } catch (err) {\n console.error(`bindings: failed to read ${this.configPath}:`, err);\n this.config = null;\n }\n }\n\n isEnabled(): boolean {\n return this.config !== null;\n }\n\n resolve(platform: string, platformUserId: string): UserBinding | undefined {\n if (!this.config) return undefined;\n return this.config.bindings.find(\n (b) =>\n b.platform === platform && b.platformUserId === platformUserId && b.status === \"active\",\n );\n }\n\n list(): UserBinding[] {\n return this.config?.bindings ?? [];\n }\n\n upsert(binding: UserBinding): void {\n if (!this.config) {\n this.config = { bindings: [] };\n }\n const idx = this.config.bindings.findIndex(\n (b) => b.platform === binding.platform && b.platformUserId === binding.platformUserId,\n );\n if (idx >= 0) {\n this.config.bindings[idx] = binding;\n } else {\n this.config.bindings.push(binding);\n }\n this.persist();\n }\n\n revoke(platform: string, platformUserId: string): void {\n if (!this.config) return;\n const binding = this.config.bindings.find(\n (b) => b.platform === platform && b.platformUserId === platformUserId,\n );\n if (binding) {\n binding.status = \"revoked\";\n binding.updatedAt = new Date().toISOString();\n this.persist();\n }\n }\n\n private persist(): void {\n try {\n mkdirSync(dirname(this.configPath), { recursive: true });\n atomicWritePrivateFile(this.configPath, JSON.stringify(this.config, null, 2) + \"\\n\");\n } catch (err) {\n console.error(`bindings: failed to write ${this.configPath}:`, err);\n }\n }\n}\n"]}