jiva-core 0.2.2 → 0.3.1

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 (156) hide show
  1. package/.dockerignore +53 -0
  2. package/.gcloudignore +49 -0
  3. package/CONTRIBUTING.md +92 -0
  4. package/Dockerfile +63 -0
  5. package/LICENSE +21 -0
  6. package/README.md +248 -102
  7. package/cloud-run-deploy.yaml +135 -0
  8. package/cloud-run.yaml +135 -0
  9. package/cloud-run.yaml.template +143 -0
  10. package/deploy.sh +107 -0
  11. package/dist/core/agent-spawner.d.ts +89 -0
  12. package/dist/core/agent-spawner.d.ts.map +1 -0
  13. package/dist/core/agent-spawner.js +195 -0
  14. package/dist/core/agent-spawner.js.map +1 -0
  15. package/dist/core/client-agent.d.ts +82 -0
  16. package/dist/core/client-agent.d.ts.map +1 -0
  17. package/dist/core/client-agent.js +406 -0
  18. package/dist/core/client-agent.js.map +1 -0
  19. package/dist/core/config.d.ts +59 -10
  20. package/dist/core/config.d.ts.map +1 -1
  21. package/dist/core/config.js +19 -2
  22. package/dist/core/config.js.map +1 -1
  23. package/dist/core/conversation-manager.d.ts +10 -18
  24. package/dist/core/conversation-manager.d.ts.map +1 -1
  25. package/dist/core/conversation-manager.js +28 -60
  26. package/dist/core/conversation-manager.js.map +1 -1
  27. package/dist/core/dual-agent.d.ts +24 -3
  28. package/dist/core/dual-agent.d.ts.map +1 -1
  29. package/dist/core/dual-agent.js +112 -19
  30. package/dist/core/dual-agent.js.map +1 -1
  31. package/dist/core/manager-agent.d.ts +3 -1
  32. package/dist/core/manager-agent.d.ts.map +1 -1
  33. package/dist/core/manager-agent.js +66 -14
  34. package/dist/core/manager-agent.js.map +1 -1
  35. package/dist/core/worker-agent.d.ts +15 -1
  36. package/dist/core/worker-agent.d.ts.map +1 -1
  37. package/dist/core/worker-agent.js +244 -11
  38. package/dist/core/worker-agent.js.map +1 -1
  39. package/dist/core/workspace.d.ts +5 -0
  40. package/dist/core/workspace.d.ts.map +1 -1
  41. package/dist/core/workspace.js +47 -7
  42. package/dist/core/workspace.js.map +1 -1
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +4 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/interfaces/cli/index.js +376 -44
  48. package/dist/interfaces/cli/index.js.map +1 -1
  49. package/dist/interfaces/cli/repl.d.ts.map +1 -1
  50. package/dist/interfaces/cli/repl.js +6 -0
  51. package/dist/interfaces/cli/repl.js.map +1 -1
  52. package/dist/interfaces/http/index.d.ts +22 -0
  53. package/dist/interfaces/http/index.d.ts.map +1 -0
  54. package/dist/interfaces/http/index.js +135 -0
  55. package/dist/interfaces/http/index.js.map +1 -0
  56. package/dist/interfaces/http/middleware/auth.d.ts +32 -0
  57. package/dist/interfaces/http/middleware/auth.d.ts.map +1 -0
  58. package/dist/interfaces/http/middleware/auth.js +176 -0
  59. package/dist/interfaces/http/middleware/auth.js.map +1 -0
  60. package/dist/interfaces/http/routes/chat.d.ts +7 -0
  61. package/dist/interfaces/http/routes/chat.d.ts.map +1 -0
  62. package/dist/interfaces/http/routes/chat.js +144 -0
  63. package/dist/interfaces/http/routes/chat.js.map +1 -0
  64. package/dist/interfaces/http/routes/health.d.ts +6 -0
  65. package/dist/interfaces/http/routes/health.d.ts.map +1 -0
  66. package/dist/interfaces/http/routes/health.js +25 -0
  67. package/dist/interfaces/http/routes/health.js.map +1 -0
  68. package/dist/interfaces/http/routes/session.d.ts +7 -0
  69. package/dist/interfaces/http/routes/session.d.ts.map +1 -0
  70. package/dist/interfaces/http/routes/session.js +114 -0
  71. package/dist/interfaces/http/routes/session.js.map +1 -0
  72. package/dist/interfaces/http/session-manager.d.ts +76 -0
  73. package/dist/interfaces/http/session-manager.d.ts.map +1 -0
  74. package/dist/interfaces/http/session-manager.js +339 -0
  75. package/dist/interfaces/http/session-manager.js.map +1 -0
  76. package/dist/interfaces/http/websocket-handler.d.ts +18 -0
  77. package/dist/interfaces/http/websocket-handler.d.ts.map +1 -0
  78. package/dist/interfaces/http/websocket-handler.js +146 -0
  79. package/dist/interfaces/http/websocket-handler.js.map +1 -0
  80. package/dist/mcp/client.d.ts +11 -2
  81. package/dist/mcp/client.d.ts.map +1 -1
  82. package/dist/mcp/client.js +44 -19
  83. package/dist/mcp/client.js.map +1 -1
  84. package/dist/mcp/server-manager.d.ts +1 -1
  85. package/dist/mcp/server-manager.d.ts.map +1 -1
  86. package/dist/mcp/server-manager.js +12 -2
  87. package/dist/mcp/server-manager.js.map +1 -1
  88. package/dist/personas/index.d.ts +13 -0
  89. package/dist/personas/index.d.ts.map +1 -0
  90. package/dist/personas/index.js +13 -0
  91. package/dist/personas/index.js.map +1 -0
  92. package/dist/personas/persona-loader.d.ts +30 -0
  93. package/dist/personas/persona-loader.d.ts.map +1 -0
  94. package/dist/personas/persona-loader.js +246 -0
  95. package/dist/personas/persona-loader.js.map +1 -0
  96. package/dist/personas/persona-manager.d.ts +82 -0
  97. package/dist/personas/persona-manager.d.ts.map +1 -0
  98. package/dist/personas/persona-manager.js +211 -0
  99. package/dist/personas/persona-manager.js.map +1 -0
  100. package/dist/personas/skill-loader.d.ts +35 -0
  101. package/dist/personas/skill-loader.d.ts.map +1 -0
  102. package/dist/personas/skill-loader.js +144 -0
  103. package/dist/personas/skill-loader.js.map +1 -0
  104. package/dist/personas/skill-packager.d.ts +25 -0
  105. package/dist/personas/skill-packager.d.ts.map +1 -0
  106. package/dist/personas/skill-packager.js +233 -0
  107. package/dist/personas/skill-packager.js.map +1 -0
  108. package/dist/personas/types.d.ts +134 -0
  109. package/dist/personas/types.d.ts.map +1 -0
  110. package/dist/personas/types.js +7 -0
  111. package/dist/personas/types.js.map +1 -0
  112. package/dist/personas/validator.d.ts +22 -0
  113. package/dist/personas/validator.d.ts.map +1 -0
  114. package/dist/personas/validator.js +144 -0
  115. package/dist/personas/validator.js.map +1 -0
  116. package/dist/storage/factory.d.ts +51 -0
  117. package/dist/storage/factory.d.ts.map +1 -0
  118. package/dist/storage/factory.js +154 -0
  119. package/dist/storage/factory.js.map +1 -0
  120. package/dist/storage/gcp-bucket-provider.d.ts +59 -0
  121. package/dist/storage/gcp-bucket-provider.d.ts.map +1 -0
  122. package/dist/storage/gcp-bucket-provider.js +275 -0
  123. package/dist/storage/gcp-bucket-provider.js.map +1 -0
  124. package/dist/storage/index.d.ts +33 -0
  125. package/dist/storage/index.d.ts.map +1 -0
  126. package/dist/storage/index.js +37 -0
  127. package/dist/storage/index.js.map +1 -0
  128. package/dist/storage/local-provider.d.ts +36 -0
  129. package/dist/storage/local-provider.d.ts.map +1 -0
  130. package/dist/storage/local-provider.js +219 -0
  131. package/dist/storage/local-provider.js.map +1 -0
  132. package/dist/storage/provider.d.ts +137 -0
  133. package/dist/storage/provider.d.ts.map +1 -0
  134. package/dist/storage/provider.js +136 -0
  135. package/dist/storage/provider.js.map +1 -0
  136. package/dist/storage/types.d.ts +78 -0
  137. package/dist/storage/types.d.ts.map +1 -0
  138. package/dist/storage/types.js +14 -0
  139. package/dist/storage/types.js.map +1 -0
  140. package/dist/utils/orchestration-logger.d.ts +36 -0
  141. package/dist/utils/orchestration-logger.d.ts.map +1 -0
  142. package/dist/utils/orchestration-logger.js +224 -0
  143. package/dist/utils/orchestration-logger.js.map +1 -0
  144. package/jiva-new-demo.gif +0 -0
  145. package/package.json +30 -2
  146. package/.fluen/cache/state.json +0 -7
  147. package/actions/action_registry.py +0 -75
  148. package/actions/python_coder.py +0 -470
  149. package/api/main.py +0 -269
  150. package/downloaded_image.avif +0 -0
  151. package/downloads/snipping_tool.avif +0 -0
  152. package/image.avif +0 -0
  153. package/ms_image.avif +0 -0
  154. package/screenshot.png +0 -0
  155. package/snipping_tool.avif +0 -0
  156. package/tmp_image.avif +0 -0
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Skill and Persona validation logic
3
+ * Enforces frontmatter rules as specified in the implementation guide
4
+ */
5
+ const SKILL_NAME_REGEX = /^[a-z0-9-]+$/;
6
+ const MAX_NAME_LENGTH = 64;
7
+ const MAX_DESCRIPTION_LENGTH = 1024;
8
+ const MAX_COMPATIBILITY_LENGTH = 500;
9
+ const ALLOWED_FRONTMATTER_KEYS = [
10
+ 'name',
11
+ 'description',
12
+ 'license',
13
+ 'allowedTools',
14
+ 'allowed-tools', // Accept kebab-case variant
15
+ 'metadata',
16
+ 'compatibility',
17
+ ];
18
+ /**
19
+ * Validate skill metadata from frontmatter
20
+ */
21
+ export function validateSkillMetadata(metadata) {
22
+ const errors = [];
23
+ // Required: name
24
+ if (!metadata.name) {
25
+ errors.push({
26
+ field: 'name',
27
+ message: 'Skill name is required',
28
+ });
29
+ }
30
+ else {
31
+ // Name format: kebab-case, no leading/trailing/consecutive hyphens
32
+ if (!SKILL_NAME_REGEX.test(metadata.name)) {
33
+ errors.push({
34
+ field: 'name',
35
+ message: 'Skill name must be lowercase alphanumeric with hyphens only',
36
+ value: metadata.name,
37
+ });
38
+ }
39
+ // No leading/trailing hyphens
40
+ if (metadata.name.startsWith('-') || metadata.name.endsWith('-')) {
41
+ errors.push({
42
+ field: 'name',
43
+ message: 'Skill name cannot start or end with a hyphen',
44
+ value: metadata.name,
45
+ });
46
+ }
47
+ // No consecutive hyphens
48
+ if (metadata.name.includes('--')) {
49
+ errors.push({
50
+ field: 'name',
51
+ message: 'Skill name cannot contain consecutive hyphens',
52
+ value: metadata.name,
53
+ });
54
+ }
55
+ // Max length
56
+ if (metadata.name.length > MAX_NAME_LENGTH) {
57
+ errors.push({
58
+ field: 'name',
59
+ message: `Skill name must be ${MAX_NAME_LENGTH} characters or less`,
60
+ value: metadata.name,
61
+ });
62
+ }
63
+ }
64
+ // Required: description
65
+ if (!metadata.description) {
66
+ errors.push({
67
+ field: 'description',
68
+ message: 'Skill description is required',
69
+ });
70
+ }
71
+ else {
72
+ // No angle brackets
73
+ if (/<|>/.test(metadata.description)) {
74
+ errors.push({
75
+ field: 'description',
76
+ message: 'Skill description cannot contain angle brackets (< >)',
77
+ value: metadata.description,
78
+ });
79
+ }
80
+ // Max length
81
+ if (metadata.description.length > MAX_DESCRIPTION_LENGTH) {
82
+ errors.push({
83
+ field: 'description',
84
+ message: `Skill description must be ${MAX_DESCRIPTION_LENGTH} characters or less (got ${metadata.description.length})`,
85
+ value: metadata.description.substring(0, 100) + '...',
86
+ });
87
+ }
88
+ }
89
+ // Optional: compatibility (max 500 chars)
90
+ if (metadata.compatibility && metadata.compatibility.length > MAX_COMPATIBILITY_LENGTH) {
91
+ errors.push({
92
+ field: 'compatibility',
93
+ message: `Compatibility note must be ${MAX_COMPATIBILITY_LENGTH} characters or less`,
94
+ value: metadata.compatibility,
95
+ });
96
+ }
97
+ return errors;
98
+ }
99
+ /**
100
+ * Validate that only allowed frontmatter keys are present
101
+ */
102
+ export function validateFrontmatterKeys(frontmatter) {
103
+ const errors = [];
104
+ const keys = Object.keys(frontmatter);
105
+ for (const key of keys) {
106
+ if (!ALLOWED_FRONTMATTER_KEYS.includes(key)) {
107
+ errors.push({
108
+ field: key,
109
+ message: `Unknown frontmatter key "${key}". Allowed keys: ${ALLOWED_FRONTMATTER_KEYS.join(', ')}`,
110
+ value: frontmatter[key],
111
+ });
112
+ }
113
+ }
114
+ return errors;
115
+ }
116
+ /**
117
+ * Validate SKILL.md body length (L2 should be < 500 lines)
118
+ */
119
+ export function validateSkillBodyLength(content) {
120
+ const errors = [];
121
+ const lines = content.split('\n');
122
+ if (lines.length > 500) {
123
+ errors.push({
124
+ field: 'content',
125
+ message: `SKILL.md body should be under 500 lines (got ${lines.length}). Consider moving detailed content to references/`,
126
+ value: lines.length,
127
+ });
128
+ }
129
+ return errors;
130
+ }
131
+ /**
132
+ * Normalize frontmatter keys (handle kebab-case variants)
133
+ */
134
+ export function normalizeFrontmatter(frontmatter) {
135
+ return {
136
+ name: frontmatter.name,
137
+ description: frontmatter.description,
138
+ license: frontmatter.license,
139
+ compatibility: frontmatter.compatibility,
140
+ allowedTools: frontmatter.allowedTools || frontmatter['allowed-tools'],
141
+ metadata: frontmatter.metadata,
142
+ };
143
+ }
144
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/personas/validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,gBAAgB,GAAG,cAAc,CAAC;AACxC,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,sBAAsB,GAAG,IAAI,CAAC;AACpC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAErC,MAAM,wBAAwB,GAAG;IAC/B,MAAM;IACN,aAAa;IACb,SAAS;IACT,cAAc;IACd,eAAe,EAAE,4BAA4B;IAC7C,UAAU;IACV,eAAe;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAgC;IAEhC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,iBAAiB;IACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,wBAAwB;SAClC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,mEAAmE;QACnE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,6DAA6D;gBACtE,KAAK,EAAE,QAAQ,CAAC,IAAI;aACrB,CAAC,CAAC;QACL,CAAC;QAED,8BAA8B;QAC9B,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,8CAA8C;gBACvD,KAAK,EAAE,QAAQ,CAAC,IAAI;aACrB,CAAC,CAAC;QACL,CAAC;QAED,yBAAyB;QACzB,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,+CAA+C;gBACxD,KAAK,EAAE,QAAQ,CAAC,IAAI;aACrB,CAAC,CAAC;QACL,CAAC;QAED,aAAa;QACb,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,sBAAsB,eAAe,qBAAqB;gBACnE,KAAK,EAAE,QAAQ,CAAC,IAAI;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE,+BAA+B;SACzC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,oBAAoB;QACpB,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,uDAAuD;gBAChE,KAAK,EAAE,QAAQ,CAAC,WAAW;aAC5B,CAAC,CAAC;QACL,CAAC;QAED,aAAa;QACb,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,6BAA6B,sBAAsB,4BAA4B,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG;gBACtH,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK;aACtD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC;QACvF,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE,8BAA8B,wBAAwB,qBAAqB;YACpF,KAAK,EAAE,QAAQ,CAAC,aAAa;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,WAAgC;IACtE,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAEtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,GAAG;gBACV,OAAO,EAAE,4BAA4B,GAAG,oBAAoB,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACjG,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC;aACxB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,gDAAgD,KAAK,CAAC,MAAM,oDAAoD;YACzH,KAAK,EAAE,KAAK,CAAC,MAAM;SACpB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAgC;IACnE,OAAO;QACL,IAAI,EAAE,WAAW,CAAC,IAAI;QACtB,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,aAAa,EAAE,WAAW,CAAC,aAAa;QACxC,YAAY,EAAE,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC,eAAe,CAAC;QACtE,QAAQ,EAAE,WAAW,CAAC,QAAQ;KAC/B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * StorageProviderFactory - Creates the appropriate storage provider
3
+ * based on environment configuration
4
+ *
5
+ * DESIGN PRINCIPLES:
6
+ * 1. Infrastructure config (bucket names, paths) comes from environment variables
7
+ * 2. Identity context (tenantId, sessionId) comes from the caller (JWT, etc.)
8
+ * 3. CLI mode uses LocalStorageProvider with default context (backward compatible)
9
+ * 4. Cloud mode requires explicit setContext() call before operations
10
+ */
11
+ import { StorageProvider } from './provider.js';
12
+ import { LocalStorageProvider } from './local-provider.js';
13
+ import { GCPBucketProvider } from './gcp-bucket-provider.js';
14
+ import { StorageInfraConfig, StorageProviderType, StorageContext } from './types.js';
15
+ /**
16
+ * Create a storage provider instance
17
+ *
18
+ * For CLI mode: Provider is returned with default context, ready to use
19
+ * For Cloud mode: Caller must call setContext() with authenticated identity
20
+ *
21
+ * @param explicitInfraConfig - Explicit infrastructure config (overrides environment)
22
+ * @param providerType - Explicit provider type (overrides auto-detection)
23
+ */
24
+ export declare function createStorageProvider(explicitInfraConfig?: StorageInfraConfig, providerType?: StorageProviderType): Promise<StorageProvider>;
25
+ /**
26
+ * Create a local storage provider for CLI/Desktop mode
27
+ * Returns provider with default context, ready to use immediately
28
+ *
29
+ * @param basePath - Optional custom base path (defaults to ~/.jiva)
30
+ */
31
+ export declare function createLocalProvider(basePath?: string): Promise<LocalStorageProvider>;
32
+ /**
33
+ * Create a GCP bucket provider for Cloud mode
34
+ *
35
+ * IMPORTANT: Caller MUST call setContext() with authenticated identity
36
+ * before performing any operations
37
+ *
38
+ * @param bucketName - GCP bucket name
39
+ * @param projectId - Optional GCP project ID
40
+ */
41
+ export declare function createGCPProvider(bucketName: string, projectId?: string): Promise<GCPBucketProvider>;
42
+ /**
43
+ * Create a storage provider and set context in one call
44
+ * Convenience method for cloud functions
45
+ *
46
+ * @param context - Authenticated user context (from JWT, etc.)
47
+ * @param infraConfig - Optional infrastructure config
48
+ * @param providerType - Optional explicit provider type
49
+ */
50
+ export declare function createStorageProviderWithContext(context: StorageContext, infraConfig?: StorageInfraConfig, providerType?: StorageProviderType): Promise<StorageProvider>;
51
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/storage/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAoErF;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,mBAAmB,CAAC,EAAE,kBAAkB,EACxC,YAAY,CAAC,EAAE,mBAAmB,GACjC,OAAO,CAAC,eAAe,CAAC,CAwC1B;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,oBAAoB,CAAC,CAK/B;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC,CAQ5B;AAED;;;;;;;GAOG;AACH,wBAAsB,gCAAgC,CACpD,OAAO,EAAE,cAAc,EACvB,WAAW,CAAC,EAAE,kBAAkB,EAChC,YAAY,CAAC,EAAE,mBAAmB,GACjC,OAAO,CAAC,eAAe,CAAC,CAI1B"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * StorageProviderFactory - Creates the appropriate storage provider
3
+ * based on environment configuration
4
+ *
5
+ * DESIGN PRINCIPLES:
6
+ * 1. Infrastructure config (bucket names, paths) comes from environment variables
7
+ * 2. Identity context (tenantId, sessionId) comes from the caller (JWT, etc.)
8
+ * 3. CLI mode uses LocalStorageProvider with default context (backward compatible)
9
+ * 4. Cloud mode requires explicit setContext() call before operations
10
+ */
11
+ import { LocalStorageProvider } from './local-provider.js';
12
+ import { GCPBucketProvider } from './gcp-bucket-provider.js';
13
+ import { StorageProviderType } from './types.js';
14
+ /**
15
+ * Environment variable names for INFRASTRUCTURE configuration only
16
+ * Identity (tenantId, sessionId) must come from authenticated requests
17
+ */
18
+ const ENV_VARS = {
19
+ // Provider selection
20
+ PROVIDER: 'JIVA_STORAGE_PROVIDER',
21
+ // Local filesystem
22
+ BASE_PATH: 'JIVA_STORAGE_PATH',
23
+ // GCP
24
+ GCP_BUCKET: 'JIVA_GCP_BUCKET',
25
+ GCP_PROJECT: 'JIVA_GCP_PROJECT',
26
+ GCP_KEY_FILE: 'JIVA_GCP_KEY_FILE',
27
+ // AWS S3 (future)
28
+ S3_BUCKET: 'JIVA_S3_BUCKET',
29
+ S3_REGION: 'JIVA_S3_REGION',
30
+ // Redis (future)
31
+ REDIS_URL: 'JIVA_REDIS_URL',
32
+ };
33
+ /**
34
+ * Get infrastructure configuration from environment variables
35
+ */
36
+ function getInfraConfigFromEnv() {
37
+ return {
38
+ basePath: process.env[ENV_VARS.BASE_PATH],
39
+ gcpBucketName: process.env[ENV_VARS.GCP_BUCKET],
40
+ gcpProjectId: process.env[ENV_VARS.GCP_PROJECT],
41
+ gcpKeyFilePath: process.env[ENV_VARS.GCP_KEY_FILE],
42
+ s3BucketName: process.env[ENV_VARS.S3_BUCKET],
43
+ s3Region: process.env[ENV_VARS.S3_REGION],
44
+ redisUrl: process.env[ENV_VARS.REDIS_URL],
45
+ };
46
+ }
47
+ /**
48
+ * Determine provider type from environment or explicit config
49
+ */
50
+ function determineProviderType(infraConfig) {
51
+ // Explicit environment variable takes precedence
52
+ const envProvider = process.env[ENV_VARS.PROVIDER];
53
+ if (envProvider) {
54
+ return envProvider;
55
+ }
56
+ // Infer from available configuration
57
+ if (infraConfig?.gcpBucketName || process.env[ENV_VARS.GCP_BUCKET]) {
58
+ return StorageProviderType.GCP_BUCKET;
59
+ }
60
+ if (infraConfig?.s3BucketName || process.env[ENV_VARS.S3_BUCKET]) {
61
+ return StorageProviderType.AWS_S3;
62
+ }
63
+ if (infraConfig?.redisUrl || process.env[ENV_VARS.REDIS_URL]) {
64
+ return StorageProviderType.REDIS;
65
+ }
66
+ // Default to local filesystem
67
+ return StorageProviderType.LOCAL;
68
+ }
69
+ /**
70
+ * Create a storage provider instance
71
+ *
72
+ * For CLI mode: Provider is returned with default context, ready to use
73
+ * For Cloud mode: Caller must call setContext() with authenticated identity
74
+ *
75
+ * @param explicitInfraConfig - Explicit infrastructure config (overrides environment)
76
+ * @param providerType - Explicit provider type (overrides auto-detection)
77
+ */
78
+ export async function createStorageProvider(explicitInfraConfig, providerType) {
79
+ // Merge environment config with explicit config
80
+ const envConfig = getInfraConfigFromEnv();
81
+ const infraConfig = {
82
+ basePath: explicitInfraConfig?.basePath || envConfig.basePath,
83
+ gcpBucketName: explicitInfraConfig?.gcpBucketName || envConfig.gcpBucketName,
84
+ gcpProjectId: explicitInfraConfig?.gcpProjectId || envConfig.gcpProjectId,
85
+ gcpKeyFilePath: explicitInfraConfig?.gcpKeyFilePath || envConfig.gcpKeyFilePath,
86
+ s3BucketName: explicitInfraConfig?.s3BucketName || envConfig.s3BucketName,
87
+ s3Region: explicitInfraConfig?.s3Region || envConfig.s3Region,
88
+ redisUrl: explicitInfraConfig?.redisUrl || envConfig.redisUrl,
89
+ };
90
+ // Determine provider type
91
+ const type = providerType || determineProviderType(infraConfig);
92
+ // Create provider instance
93
+ let provider;
94
+ switch (type) {
95
+ case StorageProviderType.GCP_BUCKET:
96
+ provider = new GCPBucketProvider(infraConfig);
97
+ break;
98
+ case StorageProviderType.AWS_S3:
99
+ throw new Error('AWS S3 provider not yet implemented. Coming soon!');
100
+ case StorageProviderType.REDIS:
101
+ throw new Error('Redis provider not yet implemented. Coming soon!');
102
+ case StorageProviderType.LOCAL:
103
+ default:
104
+ provider = new LocalStorageProvider(infraConfig);
105
+ break;
106
+ }
107
+ // Initialize provider
108
+ await provider.initialize();
109
+ return provider;
110
+ }
111
+ /**
112
+ * Create a local storage provider for CLI/Desktop mode
113
+ * Returns provider with default context, ready to use immediately
114
+ *
115
+ * @param basePath - Optional custom base path (defaults to ~/.jiva)
116
+ */
117
+ export async function createLocalProvider(basePath) {
118
+ const provider = new LocalStorageProvider({ basePath });
119
+ await provider.initialize();
120
+ // LocalStorageProvider has default context set in constructor
121
+ return provider;
122
+ }
123
+ /**
124
+ * Create a GCP bucket provider for Cloud mode
125
+ *
126
+ * IMPORTANT: Caller MUST call setContext() with authenticated identity
127
+ * before performing any operations
128
+ *
129
+ * @param bucketName - GCP bucket name
130
+ * @param projectId - Optional GCP project ID
131
+ */
132
+ export async function createGCPProvider(bucketName, projectId) {
133
+ const provider = new GCPBucketProvider({
134
+ gcpBucketName: bucketName,
135
+ gcpProjectId: projectId,
136
+ });
137
+ await provider.initialize();
138
+ // Context must be set by caller via setContext()
139
+ return provider;
140
+ }
141
+ /**
142
+ * Create a storage provider and set context in one call
143
+ * Convenience method for cloud functions
144
+ *
145
+ * @param context - Authenticated user context (from JWT, etc.)
146
+ * @param infraConfig - Optional infrastructure config
147
+ * @param providerType - Optional explicit provider type
148
+ */
149
+ export async function createStorageProviderWithContext(context, infraConfig, providerType) {
150
+ const provider = await createStorageProvider(infraConfig, providerType);
151
+ provider.setContext(context);
152
+ return provider;
153
+ }
154
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/storage/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAsB,mBAAmB,EAAkB,MAAM,YAAY,CAAC;AAErF;;;GAGG;AACH,MAAM,QAAQ,GAAG;IACf,qBAAqB;IACrB,QAAQ,EAAE,uBAAuB;IAEjC,mBAAmB;IACnB,SAAS,EAAE,mBAAmB;IAE9B,MAAM;IACN,UAAU,EAAE,iBAAiB;IAC7B,WAAW,EAAE,kBAAkB;IAC/B,YAAY,EAAE,mBAAmB;IAEjC,kBAAkB;IAClB,SAAS,EAAE,gBAAgB;IAC3B,SAAS,EAAE,gBAAgB;IAE3B,iBAAiB;IACjB,SAAS,EAAE,gBAAgB;CAC5B,CAAC;AAEF;;GAEG;AACH,SAAS,qBAAqB;IAC5B,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;QACzC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC/C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC/C,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;QAClD,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC7C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;QACzC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,WAAgC;IAC7D,iDAAiD;IACjD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAkC,CAAC;IAC5C,CAAC;IAED,qCAAqC;IACrC,IAAI,WAAW,EAAE,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACnE,OAAO,mBAAmB,CAAC,UAAU,CAAC;IACxC,CAAC;IAED,IAAI,WAAW,EAAE,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACjE,OAAO,mBAAmB,CAAC,MAAM,CAAC;IACpC,CAAC;IAED,IAAI,WAAW,EAAE,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,OAAO,mBAAmB,CAAC,KAAK,CAAC;IACnC,CAAC;IAED,8BAA8B;IAC9B,OAAO,mBAAmB,CAAC,KAAK,CAAC;AACnC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,mBAAwC,EACxC,YAAkC;IAElC,gDAAgD;IAChD,MAAM,SAAS,GAAG,qBAAqB,EAAE,CAAC;IAC1C,MAAM,WAAW,GAAuB;QACtC,QAAQ,EAAE,mBAAmB,EAAE,QAAQ,IAAI,SAAS,CAAC,QAAQ;QAC7D,aAAa,EAAE,mBAAmB,EAAE,aAAa,IAAI,SAAS,CAAC,aAAa;QAC5E,YAAY,EAAE,mBAAmB,EAAE,YAAY,IAAI,SAAS,CAAC,YAAY;QACzE,cAAc,EAAE,mBAAmB,EAAE,cAAc,IAAI,SAAS,CAAC,cAAc;QAC/E,YAAY,EAAE,mBAAmB,EAAE,YAAY,IAAI,SAAS,CAAC,YAAY;QACzE,QAAQ,EAAE,mBAAmB,EAAE,QAAQ,IAAI,SAAS,CAAC,QAAQ;QAC7D,QAAQ,EAAE,mBAAmB,EAAE,QAAQ,IAAI,SAAS,CAAC,QAAQ;KAC9D,CAAC;IAEF,0BAA0B;IAC1B,MAAM,IAAI,GAAG,YAAY,IAAI,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAEhE,2BAA2B;IAC3B,IAAI,QAAyB,CAAC;IAE9B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,mBAAmB,CAAC,UAAU;YACjC,QAAQ,GAAG,IAAI,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAC9C,MAAM;QAER,KAAK,mBAAmB,CAAC,MAAM;YAC7B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAEvE,KAAK,mBAAmB,CAAC,KAAK;YAC5B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAEtE,KAAK,mBAAmB,CAAC,KAAK,CAAC;QAC/B;YACE,QAAQ,GAAG,IAAI,oBAAoB,CAAC,WAAW,CAAC,CAAC;YACjD,MAAM;IACV,CAAC;IAED,sBAAsB;IACtB,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAE5B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAiB;IAEjB,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxD,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC5B,8DAA8D;IAC9D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,SAAkB;IAElB,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC;QACrC,aAAa,EAAE,UAAU;QACzB,YAAY,EAAE,SAAS;KACxB,CAAC,CAAC;IACH,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC5B,iDAAiD;IACjD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,OAAuB,EACvB,WAAgC,EAChC,YAAkC;IAElC,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACxE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC7B,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * GCPBucketProvider - Google Cloud Storage based persistence
3
+ *
4
+ * Path structure:
5
+ * {bucket}/
6
+ * {tenantId}/
7
+ * config.json
8
+ * conversations/
9
+ * {conversationId}.json
10
+ * sessions/
11
+ * {sessionId}/
12
+ * state.json
13
+ * logs/
14
+ * {sessionId}.log
15
+ * directives/
16
+ * {workspaceHash}.md
17
+ *
18
+ * IMPORTANT: In cloud mode, setContext() MUST be called with tenantId/sessionId
19
+ * from the authenticated request (JWT) before any operations.
20
+ */
21
+ import { StorageProvider } from './provider.js';
22
+ import { StorageInfraConfig, SavedConversation, ConversationMetadata, JivaState } from './types.js';
23
+ export declare class GCPBucketProvider extends StorageProvider {
24
+ private bucket;
25
+ private bucketName;
26
+ private configCache;
27
+ constructor(infraConfig: StorageInfraConfig);
28
+ initialize(): Promise<void>;
29
+ private readJson;
30
+ private writeJson;
31
+ private writeText;
32
+ private readText;
33
+ private deleteFile;
34
+ private listFiles;
35
+ private hashWorkspacePath;
36
+ private loadConfigCache;
37
+ getConfig<T>(key: string): Promise<T | undefined>;
38
+ setConfig<T>(key: string, value: T): Promise<void>;
39
+ getAllConfig(): Promise<Record<string, any>>;
40
+ private getConversationObjectPath;
41
+ saveConversation(conversation: SavedConversation): Promise<string>;
42
+ loadConversation(id: string): Promise<SavedConversation | null>;
43
+ listConversations(): Promise<ConversationMetadata[]>;
44
+ deleteConversation(id: string): Promise<void>;
45
+ loadDirective(workspacePath: string): Promise<string | undefined>;
46
+ saveDirective(workspacePath: string, content: string): Promise<void>;
47
+ flushLogs(): Promise<void>;
48
+ exportState(): Promise<JivaState>;
49
+ importState(state: JivaState): Promise<void>;
50
+ /**
51
+ * Save complete state snapshot for cloud function handoff
52
+ */
53
+ saveStateSnapshot(state: JivaState): Promise<void>;
54
+ /**
55
+ * Load state snapshot for cloud function restoration
56
+ */
57
+ loadStateSnapshot(): Promise<JivaState | null>;
58
+ }
59
+ //# sourceMappingURL=gcp-bucket-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcp-bucket-provider.d.ts","sourceRoot":"","sources":["../../src/storage/gcp-bucket-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,SAAS,EACV,MAAM,YAAY,CAAC;AA0BpB,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAA+C;gBAEtD,WAAW,EAAE,kBAAkB;IAWrC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YA0CnB,QAAQ;YAeR,SAAS;YAST,SAAS;YAST,QAAQ;YAeR,UAAU;YAUV,SAAS;IAOvB,OAAO,CAAC,iBAAiB;YAQX,eAAe;IAevB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAKjD,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IASlD,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAQlD,OAAO,CAAC,yBAAyB;IAI3B,gBAAgB,CAAC,YAAY,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAMlE,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAK/D,iBAAiB,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAmBpD,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7C,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAOjE,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB1B,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC;IAgBjC,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBlD;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;CAIrD"}