@framers/agentos 0.1.2 → 0.1.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 (31) hide show
  1. package/LICENSE +98 -98
  2. package/README.md +367 -343
  3. package/dist/api/AgentOSOrchestrator.d.ts.map +1 -1
  4. package/dist/api/AgentOSOrchestrator.js +21 -55
  5. package/dist/api/AgentOSOrchestrator.js.map +1 -1
  6. package/dist/core/agents/AgentCore.js +9 -9
  7. package/dist/core/agents/AgentPoolAgent.js +35 -35
  8. package/dist/core/conversation/ConversationManager.js +41 -41
  9. package/dist/core/evaluation/Evaluator.js +75 -75
  10. package/dist/core/guardrails/ICrossAgentGuardrailService.d.ts +180 -0
  11. package/dist/core/guardrails/ICrossAgentGuardrailService.d.ts.map +1 -0
  12. package/dist/core/guardrails/ICrossAgentGuardrailService.js +26 -0
  13. package/dist/core/guardrails/ICrossAgentGuardrailService.js.map +1 -0
  14. package/dist/core/guardrails/IGuardrailService.d.ts +233 -42
  15. package/dist/core/guardrails/IGuardrailService.d.ts.map +1 -1
  16. package/dist/core/guardrails/IGuardrailService.js +34 -4
  17. package/dist/core/guardrails/IGuardrailService.js.map +1 -1
  18. package/dist/core/guardrails/crossAgentGuardrailDispatcher.d.ts +119 -0
  19. package/dist/core/guardrails/crossAgentGuardrailDispatcher.d.ts.map +1 -0
  20. package/dist/core/guardrails/crossAgentGuardrailDispatcher.js +221 -0
  21. package/dist/core/guardrails/crossAgentGuardrailDispatcher.js.map +1 -0
  22. package/dist/core/guardrails/guardrailDispatcher.d.ts +97 -9
  23. package/dist/core/guardrails/guardrailDispatcher.d.ts.map +1 -1
  24. package/dist/core/guardrails/guardrailDispatcher.js +119 -9
  25. package/dist/core/guardrails/guardrailDispatcher.js.map +1 -1
  26. package/dist/core/guardrails/index.d.ts +52 -0
  27. package/dist/core/guardrails/index.d.ts.map +1 -0
  28. package/dist/core/guardrails/index.js +56 -0
  29. package/dist/core/guardrails/index.js.map +1 -0
  30. package/dist/core/storage/SqlStorageAdapter.js +43 -43
  31. package/package.json +84 -84
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @module guardrails
3
+ *
4
+ * Guardrails system for content safety and policy enforcement.
5
+ *
6
+ * Guardrails intercept content at two points:
7
+ * 1. **Input** - Before user messages enter the orchestration pipeline
8
+ * 2. **Output** - Before agent responses are streamed to the client
9
+ *
10
+ * @example Basic guardrail
11
+ * ```typescript
12
+ * import {
13
+ * IGuardrailService,
14
+ * GuardrailAction,
15
+ * type GuardrailInputPayload
16
+ * } from '../../core/guardrails/index.js';
17
+ *
18
+ * class ContentFilter implements IGuardrailService {
19
+ * async evaluateInput({ input }: GuardrailInputPayload) {
20
+ * if (containsProhibitedContent(input.textInput)) {
21
+ * return {
22
+ * action: GuardrailAction.BLOCK,
23
+ * reason: 'Content policy violation'
24
+ * };
25
+ * }
26
+ * return null;
27
+ * }
28
+ * }
29
+ * ```
30
+ *
31
+ * @example Cross-agent supervision
32
+ * ```typescript
33
+ * import {
34
+ * ICrossAgentGuardrailService,
35
+ * GuardrailAction
36
+ * } from '../../core/guardrails/index.js';
37
+ *
38
+ * class SupervisorGuardrail implements ICrossAgentGuardrailService {
39
+ * observeAgentIds = ['worker-1', 'worker-2'];
40
+ * canInterruptOthers = true;
41
+ *
42
+ * async evaluateCrossAgentOutput({ sourceAgentId, chunk }) {
43
+ * // Supervise worker agents' outputs
44
+ * }
45
+ * }
46
+ * ```
47
+ */
48
+ // Core guardrail interface and types
49
+ export { GuardrailAction, } from './IGuardrailService.js';
50
+ // Guardrail dispatcher functions
51
+ export { createGuardrailBlockedStream, evaluateInputGuardrails, wrapOutputGuardrails, } from './guardrailDispatcher.js';
52
+ // Cross-agent guardrail interface and types
53
+ export { isCrossAgentGuardrail, shouldObserveAgent, } from './ICrossAgentGuardrailService.js';
54
+ // Cross-agent guardrail dispatcher
55
+ export { evaluateCrossAgentGuardrails, filterCrossAgentGuardrails, wrapWithCrossAgentGuardrails, } from './crossAgentGuardrailDispatcher.js';
56
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,qCAAqC;AACrC,OAAO,EACL,eAAe,GAOhB,MAAM,qBAAqB,CAAC;AAE7B,iCAAiC;AACjC,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EAGvB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAE/B,4CAA4C;AAC5C,OAAO,EAGL,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AAEvC,mCAAmC;AACnC,OAAO,EAGL,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,iCAAiC,CAAC"}
@@ -115,41 +115,41 @@ export class SqlStorageAdapter {
115
115
  // Resolve the appropriate storage adapter for the platform
116
116
  this.adapter = await resolveStorageAdapter(this.config);
117
117
  // Create conversations table
118
- await this.adapter.exec(`
119
- CREATE TABLE IF NOT EXISTS conversations (
120
- id TEXT PRIMARY KEY,
121
- userId TEXT NOT NULL,
122
- agentId TEXT,
123
- createdAt INTEGER NOT NULL,
124
- lastActivity INTEGER NOT NULL,
125
- title TEXT,
126
- metadata TEXT
127
- );
128
- CREATE INDEX IF NOT EXISTS idx_conversations_userId ON conversations(userId);
129
- CREATE INDEX IF NOT EXISTS idx_conversations_agentId ON conversations(agentId);
130
- CREATE INDEX IF NOT EXISTS idx_conversations_lastActivity ON conversations(lastActivity);
118
+ await this.adapter.exec(`
119
+ CREATE TABLE IF NOT EXISTS conversations (
120
+ id TEXT PRIMARY KEY,
121
+ userId TEXT NOT NULL,
122
+ agentId TEXT,
123
+ createdAt INTEGER NOT NULL,
124
+ lastActivity INTEGER NOT NULL,
125
+ title TEXT,
126
+ metadata TEXT
127
+ );
128
+ CREATE INDEX IF NOT EXISTS idx_conversations_userId ON conversations(userId);
129
+ CREATE INDEX IF NOT EXISTS idx_conversations_agentId ON conversations(agentId);
130
+ CREATE INDEX IF NOT EXISTS idx_conversations_lastActivity ON conversations(lastActivity);
131
131
  `);
132
132
  // Create messages table with foreign key
133
- await this.adapter.exec(`
134
- CREATE TABLE IF NOT EXISTS messages (
135
- id TEXT PRIMARY KEY,
136
- conversationId TEXT NOT NULL,
137
- role TEXT NOT NULL CHECK(role IN ('user', 'assistant', 'system', 'tool')),
138
- content TEXT NOT NULL,
139
- timestamp INTEGER NOT NULL,
140
- model TEXT,
141
- promptTokens INTEGER,
142
- completionTokens INTEGER,
143
- totalTokens INTEGER,
144
- toolCalls TEXT,
145
- toolCallId TEXT,
146
- name TEXT,
147
- metadata TEXT,
148
- FOREIGN KEY (conversationId) REFERENCES conversations(id) ON DELETE CASCADE
149
- );
150
- CREATE INDEX IF NOT EXISTS idx_messages_conversationId ON messages(conversationId);
151
- CREATE INDEX IF NOT EXISTS idx_messages_timestamp ON messages(timestamp);
152
- CREATE INDEX IF NOT EXISTS idx_messages_role ON messages(role);
133
+ await this.adapter.exec(`
134
+ CREATE TABLE IF NOT EXISTS messages (
135
+ id TEXT PRIMARY KEY,
136
+ conversationId TEXT NOT NULL,
137
+ role TEXT NOT NULL CHECK(role IN ('user', 'assistant', 'system', 'tool')),
138
+ content TEXT NOT NULL,
139
+ timestamp INTEGER NOT NULL,
140
+ model TEXT,
141
+ promptTokens INTEGER,
142
+ completionTokens INTEGER,
143
+ totalTokens INTEGER,
144
+ toolCalls TEXT,
145
+ toolCallId TEXT,
146
+ name TEXT,
147
+ metadata TEXT,
148
+ FOREIGN KEY (conversationId) REFERENCES conversations(id) ON DELETE CASCADE
149
+ );
150
+ CREATE INDEX IF NOT EXISTS idx_messages_conversationId ON messages(conversationId);
151
+ CREATE INDEX IF NOT EXISTS idx_messages_timestamp ON messages(timestamp);
152
+ CREATE INDEX IF NOT EXISTS idx_messages_role ON messages(role);
153
153
  `);
154
154
  this.initialized = true;
155
155
  }
@@ -178,7 +178,7 @@ export class SqlStorageAdapter {
178
178
  async createConversation(conversation) {
179
179
  this.ensureInitialized();
180
180
  const metadataJson = conversation.metadata ? JSON.stringify(conversation.metadata) : null;
181
- await this.adapter.run(`INSERT INTO conversations (id, userId, agentId, createdAt, lastActivity, title, metadata)
181
+ await this.adapter.run(`INSERT INTO conversations (id, userId, agentId, createdAt, lastActivity, title, metadata)
182
182
  VALUES (?, ?, ?, ?, ?, ?, ?)`, [
183
183
  conversation.id,
184
184
  conversation.userId,
@@ -220,8 +220,8 @@ export class SqlStorageAdapter {
220
220
  }
221
221
  const updated = { ...existing, ...updates };
222
222
  const metadataJson = updated.metadata ? JSON.stringify(updated.metadata) : null;
223
- await this.adapter.run(`UPDATE conversations
224
- SET userId = ?, agentId = ?, createdAt = ?, lastActivity = ?, title = ?, metadata = ?
223
+ await this.adapter.run(`UPDATE conversations
224
+ SET userId = ?, agentId = ?, createdAt = ?, lastActivity = ?, title = ?, metadata = ?
225
225
  WHERE id = ?`, [
226
226
  updated.userId,
227
227
  updated.agentId || null,
@@ -289,8 +289,8 @@ export class SqlStorageAdapter {
289
289
  const toolCallsJson = message.toolCalls ? JSON.stringify(message.toolCalls) : null;
290
290
  const metadataJson = message.metadata ? JSON.stringify(message.metadata) : null;
291
291
  // Insert message
292
- await this.adapter.run(`INSERT INTO messages
293
- (id, conversationId, role, content, timestamp, model, promptTokens, completionTokens, totalTokens, toolCalls, toolCallId, name, metadata)
292
+ await this.adapter.run(`INSERT INTO messages
293
+ (id, conversationId, role, content, timestamp, model, promptTokens, completionTokens, totalTokens, toolCalls, toolCallId, name, metadata)
294
294
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
295
295
  message.id,
296
296
  message.conversationId,
@@ -405,11 +405,11 @@ export class SqlStorageAdapter {
405
405
  */
406
406
  async getConversationTokenUsage(conversationId) {
407
407
  this.ensureInitialized();
408
- const row = await this.adapter.get(`SELECT
409
- SUM(promptTokens) as promptTokens,
410
- SUM(completionTokens) as completionTokens,
411
- SUM(totalTokens) as totalTokens
412
- FROM messages
408
+ const row = await this.adapter.get(`SELECT
409
+ SUM(promptTokens) as promptTokens,
410
+ SUM(completionTokens) as completionTokens,
411
+ SUM(totalTokens) as totalTokens
412
+ FROM messages
413
413
  WHERE conversationId = ?`, [conversationId]);
414
414
  return {
415
415
  promptTokens: row?.promptTokens || 0,
package/package.json CHANGED
@@ -1,84 +1,84 @@
1
- {
2
- "name": "@framers/agentos",
3
- "version": "0.1.2",
4
- "description": "Modular AgentOS orchestration library",
5
- "type": "module",
6
- "main": "dist/index.js",
7
- "module": "dist/index.js",
8
- "types": "dist/index.d.ts",
9
- "exports": {
10
- ".": "./dist/index.js",
11
- "./package.json": "./package.json",
12
- "./*": "./dist/*.js"
13
- },
14
- "files": [
15
- "dist"
16
- ],
17
- "publishConfig": {
18
- "access": "public"
19
- },
20
- "scripts": {
21
- "clean": "rimraf dist tsconfig.build.tsbuildinfo",
22
- "build": "npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node scripts/fix-esm-imports.mjs",
23
- "typecheck": "tsc --noEmit",
24
- "lint": "node scripts/strip-nbsp.mjs && eslint \"src/**/*.{ts,js}\"",
25
- "test": "vitest run",
26
- "dev:test": "vitest",
27
- "docs:clean": "rimraf docs/api ../../docs-generated/library ../../docs-generated/api",
28
- "docs": "npm run docs:clean && pnpm --dir ../../ exec typedoc --options packages/agentos/typedoc.json && pnpm --dir ../../ exec typedoc --options typedoc.json && pnpm --dir ../../ exec node scripts/generate-api-docs.js && pnpm --dir ../../ exec node apps/agentos-landing/scripts/copy-docs.js",
29
- "docs:watch": "npm run docs:clean && pnpm --dir ../../ exec typedoc --options packages/agentos/typedoc.json && pnpm --dir ../../ exec typedoc --options typedoc.json && pnpm --dir ../../ exec node scripts/generate-api-docs.js && concurrently \"pnpm --dir ../../ exec typedoc --options packages/agentos/typedoc.json --watch\" \"pnpm --dir ../../ exec typedoc --options typedoc.json --watch\" \"pnpm --dir ../../ exec node apps/agentos-landing/scripts/copy-docs.js --watch\""
30
- },
31
- "keywords": [
32
- "agentos",
33
- "orchestration",
34
- "typescript",
35
- "llm",
36
- "tools"
37
- ],
38
- "author": "Voice Chat Assistant Team",
39
- "license": "Apache-2.0",
40
- "devDependencies": {
41
- "@semantic-release/changelog": "^6.0.3",
42
- "@semantic-release/commit-analyzer": "^13.0.0",
43
- "@semantic-release/git": "^10.0.1",
44
- "@semantic-release/github": "^9.2.4",
45
- "@semantic-release/npm": "^12.0.1",
46
- "@semantic-release/release-notes-generator": "^14.0.1",
47
- "conventional-changelog-conventionalcommits": "^7.0.2",
48
- "@types/natural": "^5.1.5",
49
- "@types/node": "^20.12.12",
50
- "eslint": "^9.11.0",
51
- "eslint-config-prettier": "^9.1.0",
52
- "eslint-plugin-import": "^2.29.1",
53
- "@eslint/js": "^9.11.0",
54
- "typescript-eslint": "^8.0.0",
55
- "prettier": "^3.3.2",
56
- "rimraf": "^5.0.7",
57
- "semantic-release": "^24.1.0",
58
- "ts-node": "^10.9.2",
59
- "tsc-alias": "^1.8.10",
60
- "tsconfig-paths": "^4.2.0",
61
- "tsx": "^4.20.0",
62
- "typedoc": "^0.25.13",
63
- "typescript": "^5.4.5",
64
- "vitest": "^1.6.0"
65
- },
66
- "dependencies": {
67
- "ajv": "^8.17.1",
68
- "ajv-formats": "^3.0.1",
69
- "axios": "^1.7.7",
70
- "lru-cache": "^11.1.0",
71
- "natural": "^6.12.0",
72
- "pino": "^9.14.0",
73
- "uuid": "^11.1.0"
74
- },
75
- "peerDependencies": {
76
- "typescript": ">=5.0.0",
77
- "@framers/sql-storage-adapter": ">=0.4.0"
78
- },
79
- "peerDependenciesMeta": {
80
- "@framers/sql-storage-adapter": {
81
- "optional": true
82
- }
83
- }
84
- }
1
+ {
2
+ "name": "@framers/agentos",
3
+ "version": "0.1.4",
4
+ "description": "Modular AgentOS orchestration library",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": "./dist/index.js",
11
+ "./package.json": "./package.json",
12
+ "./*": "./dist/*.js"
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "scripts": {
21
+ "clean": "rimraf dist tsconfig.build.tsbuildinfo",
22
+ "build": "npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node scripts/fix-esm-imports.mjs",
23
+ "typecheck": "tsc --noEmit",
24
+ "lint": "node scripts/strip-nbsp.mjs && eslint \"src/**/*.{ts,js}\"",
25
+ "test": "vitest run",
26
+ "dev:test": "vitest",
27
+ "docs:clean": "rimraf docs/api ../../docs-generated/library ../../docs-generated/api",
28
+ "docs": "npm run docs:clean && pnpm --dir ../../ exec typedoc --options packages/agentos/typedoc.json && pnpm --dir ../../ exec typedoc --options typedoc.json && pnpm --dir ../../ exec node scripts/generate-api-docs.js && pnpm --dir ../../ exec node apps/agentos.sh/scripts/copy-docs.js",
29
+ "docs:watch": "npm run docs:clean && pnpm --dir ../../ exec typedoc --options packages/agentos/typedoc.json && pnpm --dir ../../ exec typedoc --options typedoc.json && pnpm --dir ../../ exec node scripts/generate-api-docs.js && concurrently \"pnpm --dir ../../ exec typedoc --options packages/agentos/typedoc.json --watch\" \"pnpm --dir ../../ exec typedoc --options typedoc.json --watch\" \"pnpm --dir ../../ exec node apps/agentos.sh/scripts/copy-docs.js --watch\""
30
+ },
31
+ "keywords": [
32
+ "agentos",
33
+ "orchestration",
34
+ "typescript",
35
+ "llm",
36
+ "tools"
37
+ ],
38
+ "author": "Voice Chat Assistant Team",
39
+ "license": "Apache-2.0",
40
+ "devDependencies": {
41
+ "@semantic-release/changelog": "^6.0.3",
42
+ "@semantic-release/commit-analyzer": "^13.0.0",
43
+ "@semantic-release/git": "^10.0.1",
44
+ "@semantic-release/github": "^9.2.4",
45
+ "@semantic-release/npm": "^12.0.1",
46
+ "@semantic-release/release-notes-generator": "^14.0.1",
47
+ "conventional-changelog-conventionalcommits": "^7.0.2",
48
+ "@types/natural": "^5.1.5",
49
+ "@types/node": "^20.12.12",
50
+ "eslint": "^9.11.0",
51
+ "eslint-config-prettier": "^9.1.0",
52
+ "eslint-plugin-import": "^2.29.1",
53
+ "@eslint/js": "^9.11.0",
54
+ "typescript-eslint": "^8.0.0",
55
+ "prettier": "^3.3.2",
56
+ "rimraf": "^5.0.7",
57
+ "semantic-release": "^24.1.0",
58
+ "ts-node": "^10.9.2",
59
+ "tsc-alias": "^1.8.10",
60
+ "tsconfig-paths": "^4.2.0",
61
+ "tsx": "^4.20.0",
62
+ "typedoc": "^0.25.13",
63
+ "typescript": "^5.4.5",
64
+ "vitest": "^1.6.0"
65
+ },
66
+ "dependencies": {
67
+ "ajv": "^8.17.1",
68
+ "ajv-formats": "^3.0.1",
69
+ "axios": "^1.7.7",
70
+ "lru-cache": "^11.1.0",
71
+ "natural": "^6.12.0",
72
+ "pino": "^9.14.0",
73
+ "uuid": "^11.1.0"
74
+ },
75
+ "peerDependencies": {
76
+ "typescript": ">=5.0.0",
77
+ "@framers/sql-storage-adapter": ">=0.4.0"
78
+ },
79
+ "peerDependenciesMeta": {
80
+ "@framers/sql-storage-adapter": {
81
+ "optional": true
82
+ }
83
+ }
84
+ }