@minionry/sdk 0.4.23 → 0.5.2

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.
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export * from './transport.js';
3
3
  export * from './protocol.js';
4
4
  export { createProvider } from './provider.js';
5
5
  export { createMockTransport, mock } from './transports/mock.js';
6
- export type { MockConfig, MockToolCallOptions, MockToolsController, MockToolSummary, } from './transports/mock.js';
6
+ export type { MockChainsController, MockConfig, MockToolCallOptions, MockToolsController, MockToolSummary, } from './transports/mock.js';
7
7
  export { connectPostMessage, createPostMessageTransport } from './transports/post-message.js';
8
8
  export type { PostMessageTransportOptions } from './transports/post-message.js';
9
9
  export { installKeyboardForwarding } from './keyboard.js';
@@ -12,5 +12,5 @@ export { announceProvider, detect } from './detect.js';
12
12
  export type { DetectOptions } from './detect.js';
13
13
  export { createOfflineCache } from './cache.js';
14
14
  export type { OfflineCache, OfflineCacheEntry, OfflineCacheOptions, SwrOptions } from './cache.js';
15
- export declare const SDK_VERSION = "0.4.23";
15
+ export declare const SDK_VERSION = "0.5.2";
16
16
  export declare const PROVIDER_API_VERSION = "1";
package/dist/index.js CHANGED
@@ -7,5 +7,5 @@ export { connectPostMessage, createPostMessageTransport } from './transports/pos
7
7
  export { installKeyboardForwarding } from './keyboard.js';
8
8
  export { announceProvider, detect } from './detect.js';
9
9
  export { createOfflineCache } from './cache.js';
10
- export const SDK_VERSION = '0.4.23';
10
+ export const SDK_VERSION = '0.5.2';
11
11
  export const PROVIDER_API_VERSION = '1';
package/dist/provider.js CHANGED
@@ -52,6 +52,15 @@ const APP_ENDPOINTS_FEATURE = 'appEndpoints';
52
52
  const AGENTS_APP_ENDPOINT_FEATURE = 'agentsAppEndpoint';
53
53
  const AGENT_RUN_APP_ENDPOINT_FIELDS = ['model', 'systemPrompt', 'budget', 'sessionId'];
54
54
  const AGENTS_MODEL_SELECTION_FEATURE = 'agentsModelSelection';
55
+ const AGENTS_ENGINE_SELECTION_FEATURE = 'agentsEngineSelection';
56
+ const FILES_CONDITIONAL_WRITE_FEATURE = 'filesConditionalWrite';
57
+ const INFERENCE_FAST_MODE_FEATURE = 'inferenceFastMode';
58
+ const PM_CHAINS_FEATURE = 'pmChains';
59
+ const AGENT_SCHEDULES_FEATURE = 'agentSchedules';
60
+ const SCHEDULE_WALL_CLOCK_FEATURE = 'scheduleWallClock';
61
+ const PM_SCHEDULE_ZIP_FEATURE = 'pmScheduleZip';
62
+ const PM_SCHEDULE_RUN_NOW_FEATURE = 'pmScheduleRunNow';
63
+ const WALL_CLOCK_TIMING_KINDS = new Set(['daily', 'monthly']);
55
64
  function deliverStreamFrames(tracker, frames) {
56
65
  for (const frame of [...frames].sort((a, b) => a.seq - b.seq)) {
57
66
  if (frame.seq <= tracker.lastSeq)
@@ -107,6 +116,14 @@ export function createProvider(transport) {
107
116
  throw new MinionryError('UNSUPPORTED', `${what} needs a host that advertises the '${flag}' feature — this host does not, so nothing was sent`);
108
117
  }
109
118
  };
119
+ const requireWallClockFeature = async (what, timing, maxLatenessMs) => {
120
+ if (maxLatenessMs !== undefined) {
121
+ await requireFeature(SCHEDULE_WALL_CLOCK_FEATURE, `${what} with maxLatenessMs`);
122
+ }
123
+ else if (timing !== undefined && WALL_CLOCK_TIMING_KINDS.has(timing.kind)) {
124
+ await requireFeature(SCHEDULE_WALL_CLOCK_FEATURE, `${what} with ${timing.kind} timing`);
125
+ }
126
+ };
110
127
  const supportsResume = () => hostFeatures().then((flags) => flags.includes(STREAM_RESUME_FEATURE), () => false);
111
128
  const registerStream = (requestId, deliver, onGap) => {
112
129
  streams.set(requestId, { lastSeq: 0, resuming: false, pending: [], deliver, onGap });
@@ -304,11 +321,16 @@ export function createProvider(transport) {
304
321
  if (req.modelSelection !== undefined) {
305
322
  await requireFeature(AGENTS_MODEL_SELECTION_FEATURE, 'agents.run with modelSelection');
306
323
  }
324
+ if (req.engineSelection !== undefined) {
325
+ await requireFeature(AGENTS_ENGINE_SELECTION_FEATURE, 'agents.run with engineSelection');
326
+ }
307
327
  const params = { prompt: req.prompt, title: req.title };
308
328
  for (const field of endpointFields)
309
329
  params[field] = req[field];
310
330
  if (req.modelSelection !== undefined)
311
331
  params.modelSelection = req.modelSelection;
332
+ if (req.engineSelection !== undefined)
333
+ params.engineSelection = req.engineSelection;
312
334
  const requestId = mintRequestId();
313
335
  const runEvents = new Emitter();
314
336
  registerStream(requestId, (event, payload) => runEvents.emit(event, payload), (message) => runEvents.emit('gap', { message }));
@@ -378,6 +400,29 @@ export function createProvider(transport) {
378
400
  await request('agents.sessions.stop', { sessionId });
379
401
  },
380
402
  },
403
+ schedules: {
404
+ async list() {
405
+ await requireFeature(AGENT_SCHEDULES_FEATURE, 'agents.schedules.list');
406
+ const result = (await request('agents.schedules.list', {}));
407
+ return Array.isArray(result) ? result : result.schedules;
408
+ },
409
+ async create(req) {
410
+ await requireFeature(AGENT_SCHEDULES_FEATURE, 'agents.schedules.create');
411
+ return (await request('agents.schedules.create', req));
412
+ },
413
+ async update(scheduleId, patch) {
414
+ await requireFeature(AGENT_SCHEDULES_FEATURE, 'agents.schedules.update');
415
+ return (await request('agents.schedules.update', { scheduleId, patch }));
416
+ },
417
+ async delete(scheduleId) {
418
+ await requireFeature(AGENT_SCHEDULES_FEATURE, 'agents.schedules.delete');
419
+ await request('agents.schedules.delete', { scheduleId });
420
+ },
421
+ async runNow(scheduleId) {
422
+ await requireFeature(AGENT_SCHEDULES_FEATURE, 'agents.schedules.runNow');
423
+ return (await request('agents.schedules.runNow', { scheduleId }));
424
+ },
425
+ },
381
426
  },
382
427
  apps: {
383
428
  async open(req) {
@@ -474,14 +519,42 @@ export function createProvider(transport) {
474
519
  return result.schedules;
475
520
  },
476
521
  async create(req) {
522
+ if (req.source?.kind === 'board-zip') {
523
+ await requireFeature(PM_SCHEDULE_ZIP_FEATURE, 'pm.schedules.create with a board-zip source');
524
+ }
525
+ await requireWallClockFeature('pm.schedules.create', req.timing, req.maxLatenessMs);
477
526
  return (await request('pm.schedules.create', req));
478
527
  },
479
528
  async update(scheduleId, patch) {
529
+ await requireWallClockFeature('pm.schedules.update', patch.timing, patch.maxLatenessMs);
480
530
  return (await request('pm.schedules.update', { scheduleId, patch }));
481
531
  },
482
532
  async delete(scheduleId) {
483
533
  await request('pm.schedules.delete', { scheduleId });
484
534
  },
535
+ async runNow(scheduleId) {
536
+ await requireFeature(PM_SCHEDULE_RUN_NOW_FEATURE, 'pm.schedules.runNow');
537
+ return (await request('pm.schedules.runNow', { scheduleId }));
538
+ },
539
+ },
540
+ chains: {
541
+ async list() {
542
+ await requireFeature(PM_CHAINS_FEATURE, 'pm.chains.list');
543
+ const result = (await request('pm.chains.list', {}));
544
+ return result.links;
545
+ },
546
+ async create(req) {
547
+ await requireFeature(PM_CHAINS_FEATURE, 'pm.chains.create');
548
+ return (await request('pm.chains.create', req));
549
+ },
550
+ async update(linkId, patch) {
551
+ await requireFeature(PM_CHAINS_FEATURE, 'pm.chains.update');
552
+ return (await request('pm.chains.update', { linkId, patch }));
553
+ },
554
+ async delete(linkId) {
555
+ await requireFeature(PM_CHAINS_FEATURE, 'pm.chains.delete');
556
+ await request('pm.chains.delete', { linkId });
557
+ },
485
558
  },
486
559
  },
487
560
  files: {
@@ -491,8 +564,14 @@ export function createProvider(transport) {
491
564
  async readEntry(path) {
492
565
  return (await request('files.readEntry', { path }));
493
566
  },
494
- async write(path, content) {
495
- await request('files.write', { path, content });
567
+ async write(path, content, opts) {
568
+ const expectedModifiedAt = opts?.expectedModifiedAt;
569
+ if (expectedModifiedAt === undefined) {
570
+ await request('files.write', { path, content });
571
+ return;
572
+ }
573
+ await requireFeature(FILES_CONDITIONAL_WRITE_FEATURE, 'files.write with expectedModifiedAt');
574
+ await request('files.write', { path, content, expectedModifiedAt });
496
575
  },
497
576
  async list(path) {
498
577
  return (await request('files.list', { path }));
@@ -547,6 +626,8 @@ export function createProvider(transport) {
547
626
  registerStream(requestId, (event, payload) => {
548
627
  if (active && event === 'changed')
549
628
  cb(payload);
629
+ if (active && event === 'gap')
630
+ providerEvents.emit('fileChangeGap', { path, ...payload });
550
631
  }, (message) => {
551
632
  if (active)
552
633
  providerEvents.emit('fileChangeGap', { path, message });
@@ -1432,12 +1513,15 @@ export function createProvider(transport) {
1432
1513
  registerStream(requestId, (event, payload) => runEvents.emit(event, payload), (message) => runEvents.emit('gap', { message }));
1433
1514
  let runId;
1434
1515
  try {
1516
+ const fastMode = req.fastMode === true &&
1517
+ (await hostFeatures().then((flags) => flags.includes(INFERENCE_FAST_MODE_FEATURE), () => false));
1435
1518
  const params = {
1436
1519
  messages: req.messages,
1437
1520
  system: req.system,
1438
1521
  engine: req.engine,
1439
1522
  model: req.model,
1440
1523
  effortLevel: req.effortLevel,
1524
+ ...(fastMode ? { fastMode: true } : {}),
1441
1525
  };
1442
1526
  runId = (await request('inference.chat', params, requestId)).runId;
1443
1527
  }
@@ -1,4 +1,4 @@
1
- export type SdkMethodName = 'features' | 'connect' | 'disconnect' | 'auth.getToken' | 'agents.run' | 'agents.result' | 'agents.sessions.list' | 'agents.sessions.create' | 'agents.sessions.attach' | 'agents.sessions.close' | 'agents.sessions.rename' | 'agents.sessions.history' | 'agents.sessions.replay' | 'agents.sessions.approve' | 'agents.sessions.answerQuestion' | 'agents.sessions.prompt' | 'agents.sessions.stop' | 'apps.open' | 'cancel' | 'pm.createBoard' | 'pm.getBoard' | 'pm.listBoards' | 'pm.createIssue' | 'pm.updateIssue' | 'pm.deleteIssue' | 'pm.updateBoard' | 'pm.subscribeBoard' | 'pm.execute' | 'pm.pause' | 'pm.resume' | 'pm.stop' | 'pm.schedules.list' | 'pm.schedules.create' | 'pm.schedules.update' | 'pm.schedules.delete' | 'stream.resume' | 'files.read' | 'files.readEntry' | 'files.write' | 'files.list' | 'files.delete' | 'files.mkdir' | 'files.rename' | 'files.search' | 'files.definition' | 'files.subscribeChanges' | 'files.uploadStart' | 'files.uploadChunk' | 'files.uploadStatus' | 'files.uploadCancel' | 'files.downloadStart' | 'files.downloadChunk' | 'files.downloadCancel' | 'storage.get' | 'storage.set' | 'storage.delete' | 'storage.keys' | 'notifications.request' | 'notifications.status' | 'notifications.revoke' | 'theme.get' | 'locale.get' | 'browser.tabs.list' | 'browser.tabs.subscribe' | 'browser.navigate' | 'browser.open' | 'browser.close' | 'browser.select' | 'browser.snapshot' | 'browser.screenshot' | 'browser.evaluate' | 'browser.automate' | 'browser.automate.approve' | 'browser.back' | 'browser.forward' | 'browser.reload' | 'browser.stop' | 'browser.view.attach' | 'browser.view.answer' | 'browser.view.ice' | 'browser.view.state' | 'browser.view.input' | 'browser.view.bounds' | 'browser.preflight' | 'browser.resumeDriver' | 'browser.setDeviceProfile' | 'composer.autocomplete' | 'composer.skills' | 'composer.snippets' | 'composer.settings' | 'terminal.sessions.list' | 'terminal.sessions.subscribe' | 'terminal.open' | 'terminal.attach' | 'terminal.write' | 'terminal.resize' | 'terminal.close' | 'git.status' | 'git.log' | 'git.diff' | 'git.show' | 'git.commitDiff' | 'git.branches.list' | 'git.branches.create' | 'git.branches.delete' | 'git.tags.list' | 'git.tags.create' | 'git.tags.push' | 'git.remote.info' | 'git.repos.discover' | 'git.worktrees.list' | 'git.worktrees.create' | 'git.worktrees.remove' | 'git.worktrees.switchActive' | 'git.worktrees.subscribe' | 'git.merge.preview' | 'git.merge.run' | 'git.merge.abort' | 'git.merge.complete' | 'git.merge.stashPop' | 'git.merge.discardBlockers' | 'git.pr.generateDescription' | 'git.pr.create' | 'git.stage' | 'git.unstage' | 'git.commit' | 'git.generateCommitMessage' | 'git.checkout' | 'git.push' | 'git.pull' | 'git.subscribeBranchChanged' | 'git.subscribeCommitSuggestion' | 'tools.register' | 'tools.result' | 'quality.state' | 'quality.detectTools' | 'quality.result' | 'quality.settings' | 'quality.subscribeChanges' | 'quality.run' | 'quality.cancel' | 'quality.installTools' | 'quality.saveDirectories' | 'quality.setSettings' | 'inference.chat' | 'inference.result' | 'endpoints.register' | 'endpoints.unregister' | 'endpoints.list' | 'quality.setFindingState' | 'quality.schedules.list' | 'quality.schedules.create' | 'quality.schedules.update' | 'quality.schedules.delete';
1
+ export type SdkMethodName = 'features' | 'connect' | 'disconnect' | 'auth.getToken' | 'agents.run' | 'agents.result' | 'agents.sessions.list' | 'agents.sessions.create' | 'agents.sessions.attach' | 'agents.sessions.close' | 'agents.sessions.rename' | 'agents.sessions.history' | 'agents.sessions.replay' | 'agents.sessions.approve' | 'agents.sessions.answerQuestion' | 'agents.sessions.prompt' | 'agents.sessions.stop' | 'agents.schedules.list' | 'agents.schedules.create' | 'agents.schedules.update' | 'agents.schedules.delete' | 'agents.schedules.runNow' | 'apps.open' | 'cancel' | 'pm.createBoard' | 'pm.getBoard' | 'pm.listBoards' | 'pm.createIssue' | 'pm.updateIssue' | 'pm.deleteIssue' | 'pm.updateBoard' | 'pm.subscribeBoard' | 'pm.execute' | 'pm.pause' | 'pm.resume' | 'pm.stop' | 'pm.schedules.list' | 'pm.schedules.create' | 'pm.schedules.update' | 'pm.schedules.delete' | 'pm.schedules.runNow' | 'pm.chains.list' | 'pm.chains.create' | 'pm.chains.update' | 'pm.chains.delete' | 'stream.resume' | 'files.read' | 'files.readEntry' | 'files.write' | 'files.list' | 'files.delete' | 'files.mkdir' | 'files.rename' | 'files.search' | 'files.definition' | 'files.subscribeChanges' | 'files.uploadStart' | 'files.uploadChunk' | 'files.uploadStatus' | 'files.uploadCancel' | 'files.downloadStart' | 'files.downloadChunk' | 'files.downloadCancel' | 'storage.get' | 'storage.set' | 'storage.delete' | 'storage.keys' | 'notifications.request' | 'notifications.status' | 'notifications.revoke' | 'theme.get' | 'locale.get' | 'browser.tabs.list' | 'browser.tabs.subscribe' | 'browser.navigate' | 'browser.open' | 'browser.close' | 'browser.select' | 'browser.snapshot' | 'browser.screenshot' | 'browser.evaluate' | 'browser.automate' | 'browser.automate.approve' | 'browser.back' | 'browser.forward' | 'browser.reload' | 'browser.stop' | 'browser.view.attach' | 'browser.view.answer' | 'browser.view.ice' | 'browser.view.state' | 'browser.view.input' | 'browser.view.bounds' | 'browser.preflight' | 'browser.resumeDriver' | 'browser.setDeviceProfile' | 'composer.autocomplete' | 'composer.skills' | 'composer.snippets' | 'composer.settings' | 'terminal.sessions.list' | 'terminal.sessions.subscribe' | 'terminal.open' | 'terminal.attach' | 'terminal.write' | 'terminal.resize' | 'terminal.close' | 'git.status' | 'git.log' | 'git.diff' | 'git.show' | 'git.commitDiff' | 'git.branches.list' | 'git.branches.create' | 'git.branches.delete' | 'git.tags.list' | 'git.tags.create' | 'git.tags.push' | 'git.remote.info' | 'git.repos.discover' | 'git.worktrees.list' | 'git.worktrees.create' | 'git.worktrees.remove' | 'git.worktrees.switchActive' | 'git.worktrees.subscribe' | 'git.merge.preview' | 'git.merge.run' | 'git.merge.abort' | 'git.merge.complete' | 'git.merge.stashPop' | 'git.merge.discardBlockers' | 'git.pr.generateDescription' | 'git.pr.create' | 'git.stage' | 'git.unstage' | 'git.commit' | 'git.generateCommitMessage' | 'git.checkout' | 'git.push' | 'git.pull' | 'git.subscribeBranchChanged' | 'git.subscribeCommitSuggestion' | 'tools.register' | 'tools.result' | 'quality.state' | 'quality.detectTools' | 'quality.result' | 'quality.settings' | 'quality.subscribeChanges' | 'quality.run' | 'quality.cancel' | 'quality.installTools' | 'quality.saveDirectories' | 'quality.setSettings' | 'inference.chat' | 'inference.result' | 'endpoints.register' | 'endpoints.unregister' | 'endpoints.list' | 'quality.setFindingState' | 'quality.schedules.list' | 'quality.schedules.create' | 'quality.schedules.update' | 'quality.schedules.delete';
2
2
  export interface SdkRequestFrame {
3
3
  requestId: string;
4
4
  method: SdkMethodName;
@@ -12,6 +12,9 @@ export interface MockToolsController {
12
12
  call(tool: string, input?: unknown, opts?: MockToolCallOptions): Promise<unknown>;
13
13
  cancel(callId: string): void;
14
14
  }
15
+ export interface MockChainsController {
16
+ settleBoard(boardId: string, outcome: 'success' | 'failure'): void;
17
+ }
15
18
  export interface MockConfig {
16
19
  space?: Partial<SpaceInfo>;
17
20
  user?: Partial<UserInfo> | null;
@@ -21,9 +24,13 @@ export interface MockConfig {
21
24
  storage?: Record<string, unknown>;
22
25
  theme?: Partial<ThemeSnapshot>;
23
26
  locale?: Partial<LocaleSnapshot>;
27
+ agentRunEngines?: string[] | null;
24
28
  tools?: {
25
29
  onRegister?(controller: MockToolsController): void;
26
30
  };
31
+ chains?: {
32
+ onReady?(controller: MockChainsController): void;
33
+ };
27
34
  }
28
35
  export declare function createMockTransport(config?: MockConfig): Transport;
29
36
  export declare function mock(config?: MockConfig): MinionryProvider;