@zhin.js/agent 1.1.40 → 1.1.41

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.
@@ -1,4 +1,4 @@
1
1
  import type { AgentDecisionConfig } from './types.js';
2
- export declare const DECISION_TASKS: readonly ["skills", "tools", "memory", "agents", "approval"];
2
+ export declare const DECISION_TASKS: readonly ["skills", "tools", "memory", "agents", "approval", "ambient"];
3
3
  /** Validate before installing any optional remote decision service. */
4
4
  export declare function normalizeAgentDecisionConfig(input: unknown): AgentDecisionConfig | undefined;
@@ -1,4 +1,4 @@
1
- export const DECISION_TASKS = ['skills', 'tools', 'memory', 'agents', 'approval'];
1
+ export const DECISION_TASKS = ['skills', 'tools', 'memory', 'agents', 'approval', 'ambient'];
2
2
  /** Validate before installing any optional remote decision service. */
3
3
  export function normalizeAgentDecisionConfig(input) {
4
4
  if (input === undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/decision/config.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentDecisionConfig, DecisionTask, DecisionTaskPolicy } from './types.js';\n\nexport const DECISION_TASKS = ['skills', 'tools', 'memory', 'agents', 'approval'] as const satisfies readonly DecisionTask[];\n\n/** Validate before installing any optional remote decision service. */\nexport function normalizeAgentDecisionConfig(input: unknown): AgentDecisionConfig | undefined {\n if (input === undefined) return undefined;\n const config = object(input, 'ai.decisions');\n keys(config, ['provider', ...DECISION_TASKS], 'ai.decisions');\n if (typeof config.provider !== 'string' || !/^root(?:\\/[a-z0-9][a-z0-9-]*)+$/.test(config.provider)) {\n throw new TypeError('ai.decisions.provider must be an exact Plugin owner, such as root/typesafe');\n }\n const policies: Partial<Record<DecisionTask, DecisionTaskPolicy>> = {};\n for (const task of DECISION_TASKS) {\n if (config[task] === undefined) continue;\n const label = `ai.decisions.${task}`;\n const policy = object(config[task], label);\n keys(policy, ['mode', 'timeoutMs', 'minConfidence', 'topK', 'maxCandidates', 'maxSelections'], label);\n if (typeof policy.mode !== 'string' || !['off', 'shadow', 'active'].includes(policy.mode)) {\n throw new TypeError(`${label}.mode must be off, shadow, or active`);\n }\n for (const field of ['timeoutMs', 'topK', 'maxCandidates', 'maxSelections']) {\n if (policy[field] !== undefined && (!Number.isSafeInteger(policy[field]) || Number(policy[field]) <= 0)) {\n throw new TypeError(`${label}.${field} must be a positive safe integer`);\n }\n }\n if (policy.timeoutMs !== undefined && Number(policy.timeoutMs) > 2_147_483_647) {\n throw new TypeError(`${label}.timeoutMs exceeds the Node timer limit`);\n }\n if (policy.minConfidence !== undefined && (typeof policy.minConfidence !== 'number'\n || !Number.isFinite(policy.minConfidence) || policy.minConfidence < 0 || policy.minConfidence > 1)) {\n throw new TypeError(`${label}.minConfidence must be between 0 and 1`);\n }\n policies[task] = Object.freeze({ ...policy }) as unknown as DecisionTaskPolicy;\n }\n return Object.freeze({ provider: config.provider, ...policies });\n}\n\nfunction object(input: unknown, label: string): Record<string, unknown> {\n if (!input || typeof input !== 'object' || Array.isArray(input)) throw new TypeError(`${label} must be an object`);\n return input as Record<string, unknown>;\n}\n\nfunction keys(input: Record<string, unknown>, allowed: readonly string[], label: string): void {\n if (Object.keys(input).some(key => !allowed.includes(key))) throw new TypeError(`${label} contains an unknown field`);\n}\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/decision/config.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentDecisionConfig, DecisionTask, DecisionTaskPolicy } from './types.js';\n\nexport const DECISION_TASKS = ['skills', 'tools', 'memory', 'agents', 'approval', 'ambient'] as const satisfies readonly DecisionTask[];\n\n/** Validate before installing any optional remote decision service. */\nexport function normalizeAgentDecisionConfig(input: unknown): AgentDecisionConfig | undefined {\n if (input === undefined) return undefined;\n const config = object(input, 'ai.decisions');\n keys(config, ['provider', ...DECISION_TASKS], 'ai.decisions');\n if (typeof config.provider !== 'string' || !/^root(?:\\/[a-z0-9][a-z0-9-]*)+$/.test(config.provider)) {\n throw new TypeError('ai.decisions.provider must be an exact Plugin owner, such as root/typesafe');\n }\n const policies: Partial<Record<DecisionTask, DecisionTaskPolicy>> = {};\n for (const task of DECISION_TASKS) {\n if (config[task] === undefined) continue;\n const label = `ai.decisions.${task}`;\n const policy = object(config[task], label);\n keys(policy, ['mode', 'timeoutMs', 'minConfidence', 'topK', 'maxCandidates', 'maxSelections'], label);\n if (typeof policy.mode !== 'string' || !['off', 'shadow', 'active'].includes(policy.mode)) {\n throw new TypeError(`${label}.mode must be off, shadow, or active`);\n }\n for (const field of ['timeoutMs', 'topK', 'maxCandidates', 'maxSelections']) {\n if (policy[field] !== undefined && (!Number.isSafeInteger(policy[field]) || Number(policy[field]) <= 0)) {\n throw new TypeError(`${label}.${field} must be a positive safe integer`);\n }\n }\n if (policy.timeoutMs !== undefined && Number(policy.timeoutMs) > 2_147_483_647) {\n throw new TypeError(`${label}.timeoutMs exceeds the Node timer limit`);\n }\n if (policy.minConfidence !== undefined && (typeof policy.minConfidence !== 'number'\n || !Number.isFinite(policy.minConfidence) || policy.minConfidence < 0 || policy.minConfidence > 1)) {\n throw new TypeError(`${label}.minConfidence must be between 0 and 1`);\n }\n policies[task] = Object.freeze({ ...policy }) as unknown as DecisionTaskPolicy;\n }\n return Object.freeze({ provider: config.provider, ...policies });\n}\n\nfunction object(input: unknown, label: string): Record<string, unknown> {\n if (!input || typeof input !== 'object' || Array.isArray(input)) throw new TypeError(`${label} must be an object`);\n return input as Record<string, unknown>;\n}\n\nfunction keys(input: Record<string, unknown>, allowed: readonly string[], label: string): void {\n if (Object.keys(input).some(key => !allowed.includes(key))) throw new TypeError(`${label} contains an unknown field`);\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { AIConfig, DecisionProvider, DecisionTaskConfig } from '@zhin.js/ai';
2
- export type DecisionTask = 'skills' | 'tools' | 'memory' | 'agents' | 'approval';
2
+ export type DecisionTask = 'skills' | 'tools' | 'memory' | 'agents' | 'approval' | 'ambient';
3
3
  export type DecisionMode = 'off' | 'shadow' | 'active';
4
4
  export type DecisionTaskPolicy = DecisionTaskConfig;
5
5
  export type AgentDecisionConfig = NonNullable<AIConfig['decisions']>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/decision/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AIConfig, DecisionProvider, DecisionTaskConfig } from '@zhin.js/ai';\n\nexport type DecisionTask = 'skills' | 'tools' | 'memory' | 'agents' | 'approval';\nexport type DecisionMode = 'off' | 'shadow' | 'active';\n\nexport type DecisionTaskPolicy = DecisionTaskConfig;\nexport type AgentDecisionConfig = NonNullable<AIConfig['decisions']>;\n\n/** Observations contain no message, candidate name, parameter, or private text. */\nexport interface DecisionObservation {\n readonly task: DecisionTask;\n readonly mode: DecisionMode;\n readonly outcome: 'selected' | 'abstained' | 'failed' | 'shadow';\n readonly candidates: number;\n readonly selected: number;\n readonly durationMs: number;\n readonly model?: string;\n readonly reason?: 'provider_error' | 'timeout' | 'low_confidence' | 'no_relevant_candidate' | 'invalid_response';\n readonly usage?: Readonly<{ inputTokens: number; outputTokens: number; totalTokens: number }>;\n}\n\nexport interface AgentDecisionRuntime {\n readonly provider: DecisionProvider;\n readonly config: AgentDecisionConfig;\n readonly observe?: (observation: DecisionObservation) => void;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/decision/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AIConfig, DecisionProvider, DecisionTaskConfig } from '@zhin.js/ai';\n\nexport type DecisionTask = 'skills' | 'tools' | 'memory' | 'agents' | 'approval' | 'ambient';\nexport type DecisionMode = 'off' | 'shadow' | 'active';\n\nexport type DecisionTaskPolicy = DecisionTaskConfig;\nexport type AgentDecisionConfig = NonNullable<AIConfig['decisions']>;\n\n/** Observations contain no message, candidate name, parameter, or private text. */\nexport interface DecisionObservation {\n readonly task: DecisionTask;\n readonly mode: DecisionMode;\n readonly outcome: 'selected' | 'abstained' | 'failed' | 'shadow';\n readonly candidates: number;\n readonly selected: number;\n readonly durationMs: number;\n readonly model?: string;\n readonly reason?: 'provider_error' | 'timeout' | 'low_confidence' | 'no_relevant_candidate' | 'invalid_response';\n readonly usage?: Readonly<{ inputTokens: number; outputTokens: number; totalTokens: number }>;\n}\n\nexport interface AgentDecisionRuntime {\n readonly provider: DecisionProvider;\n readonly config: AgentDecisionConfig;\n readonly observe?: (observation: DecisionObservation) => void;\n}\n"]}
@@ -14,6 +14,7 @@ export declare const agentDecisionConfigToken: import("@zhin.js/plugin-runtime")
14
14
  memory?: import("@zhin.js/ai").DecisionTaskConfig;
15
15
  agents?: import("@zhin.js/ai").DecisionTaskConfig;
16
16
  approval?: import("@zhin.js/ai").DecisionTaskConfig;
17
+ ambient?: import("@zhin.js/ai").DecisionTaskConfig;
17
18
  }>;
18
19
  /** Preserve declaration ownership even when Scope snapshots include inherited resources. */
19
20
  export declare function provideAgentDecisionProvider(resources: Scope, provider: DecisionProvider): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/agent",
3
- "version": "1.1.40",
3
+ "version": "1.1.41",
4
4
  "description": "Zhin AI Agent — session, ZhinAgent, init; composes @zhin.js/core providers and tools",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -92,7 +92,7 @@
92
92
  "js-yaml": "^5.2.2",
93
93
  "@zhin.js/adapter": "1.1.22",
94
94
  "@zhin.js/agent-feature": "1.1.9",
95
- "@zhin.js/ai": "1.1.44",
95
+ "@zhin.js/ai": "1.1.45",
96
96
  "@zhin.js/core": "1.1.50",
97
97
  "@zhin.js/im-contract": "1.1.6",
98
98
  "@zhin.js/kernel": "1.1.5",