actoviq-agent-sdk 0.4.18 → 0.4.19

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/CHANGELOG.md CHANGED
@@ -6,6 +6,15 @@ The format is based on Keep a Changelog, with automated updates from GitHub Rele
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## v0.4.18 - 2026-08-16
10
+
11
+ ### Features
12
+
13
+ - Rename the Bridge tab to Configuration, move it above Agents, and manage local runtime discovery and login checks there
14
+ - Redesign the Devices tab with card headers, status pills, permission scope chips, and clearer pairing and paired-device sections
15
+
16
+ **Full Changelog**: https://github.com/DeconBear/hadamard/compare/v0.4.17...v0.4.18
17
+
9
18
  ## v0.4.17 - 2026-08-14
10
19
 
11
20
  ### Fixes
@@ -0,0 +1,20 @@
1
+ import type { PersistedBridgeConfig } from '../parity/bridgeConfigs.js';
2
+ /**
3
+ * Static provider export for the mobile companion app. The desktop GUI encodes
4
+ * a saved bridge config (name, base URL, model and API key) directly into a QR
5
+ * code; the phone scans it and imports the provider without any network
6
+ * handshake. Anyone who scans the code gets the full API key, so the payload
7
+ * is never transmitted anywhere — it only exists as the rendered QR image.
8
+ */
9
+ export declare const PROVIDER_SHARE_QR_TYPE = "hadamard-provider";
10
+ export interface ProviderSharePayload {
11
+ type: typeof PROVIDER_SHARE_QR_TYPE;
12
+ version: 1;
13
+ displayName: string;
14
+ endpoint: string;
15
+ model: string;
16
+ apiKey: string;
17
+ }
18
+ export declare function buildProviderSharePayload(config: PersistedBridgeConfig): ProviderSharePayload;
19
+ export declare function renderProviderShareQrDataUrl(payload: ProviderSharePayload): Promise<string>;
20
+ //# sourceMappingURL=providerShare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerShare.d.ts","sourceRoot":"","sources":["../../../src/device-link/providerShare.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,sBAAsB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,sBAAsB,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,qBAAqB,GAAG,oBAAoB,CAqB7F;AAED,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAMjG"}
@@ -0,0 +1,39 @@
1
+ import QRCode from 'qrcode';
2
+ /**
3
+ * Static provider export for the mobile companion app. The desktop GUI encodes
4
+ * a saved bridge config (name, base URL, model and API key) directly into a QR
5
+ * code; the phone scans it and imports the provider without any network
6
+ * handshake. Anyone who scans the code gets the full API key, so the payload
7
+ * is never transmitted anywhere — it only exists as the rendered QR image.
8
+ */
9
+ export const PROVIDER_SHARE_QR_TYPE = 'hadamard-provider';
10
+ export function buildProviderSharePayload(config) {
11
+ const endpoint = (config.baseURL ?? '').trim();
12
+ const model = (config.models?.[0]?.name ?? config.model ?? '').trim();
13
+ const apiKey = (config.apiKey ?? '').trim();
14
+ if (!/^https:\/\//i.test(endpoint)) {
15
+ throw new Error(`Config "${config.name}" needs an HTTPS base URL before it can be shared with the phone.`);
16
+ }
17
+ if (!model) {
18
+ throw new Error(`Config "${config.name}" has no model to share. Add a model first.`);
19
+ }
20
+ if (!apiKey) {
21
+ throw new Error(`Config "${config.name}" has no API key to share.`);
22
+ }
23
+ return {
24
+ type: PROVIDER_SHARE_QR_TYPE,
25
+ version: 1,
26
+ displayName: config.name,
27
+ endpoint,
28
+ model,
29
+ apiKey,
30
+ };
31
+ }
32
+ export async function renderProviderShareQrDataUrl(payload) {
33
+ return QRCode.toDataURL(JSON.stringify(payload), {
34
+ errorCorrectionLevel: 'M',
35
+ margin: 1,
36
+ width: 320,
37
+ });
38
+ }
39
+ //# sourceMappingURL=providerShare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerShare.js","sourceRoot":"","sources":["../../../src/device-link/providerShare.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAI5B;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,mBAAmB,CAAC;AAW1D,MAAM,UAAU,yBAAyB,CAAC,MAA6B;IACrE,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,IAAI,mEAAmE,CAAC,CAAC;IAC7G,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,IAAI,6CAA6C,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,IAAI,4BAA4B,CAAC,CAAC;IACtE,CAAC;IACD,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,MAAM,CAAC,IAAI;QACxB,QAAQ;QACR,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,OAA6B;IAC9E,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;QAC/C,oBAAoB,EAAE,GAAG;QACzB,MAAM,EAAE,CAAC;QACT,KAAK,EAAE,GAAG;KACX,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"hadamardGui.d.ts","sourceRoot":"","sources":["../../../src/gui/hadamardGui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hadamardGui.d.ts","sourceRoot":"","sources":["../../../src/gui/hadamardGui.ts"],"names":[],"mappings":"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"}
@@ -61,6 +61,7 @@ function createTerminalVisionTools(tm) {
61
61
  }
62
62
  import { createHadamardCoreTools, createAgentSdk, readHadamardBrowserSettings, writeHadamardBrowserSettings, askTeamDefinition, createTeamTool, detectBridgeProviders, discoverAgentRuntimes, detectRuntimeLocalConfig, updateRuntimeLocalConfig, listRouterProfiles, listTeamDefinitions, listWorkflows, loadDefaultHadamardSettings, loadHadamardExternalSkillDefinitions, loadJsonConfigFile, loadRouterProfile, saveRouterProfile, deleteRouterProfile, loadTeamDefinition, cloneTeamDefinition, instantiateTeamDefinition, getBuiltInTeamDefinition, ensureConfiguredTeamGraph, canonicalizeTeamDefinition, validateTeamGraph, migrateTeamDefinitionToGraph, readTeamPreferences, writeTeamPreferences, createManagerTools, buildDecomposeIssuePrompt, buildManagerSystemPrompt, buildUpdateDesignPrompt, formatManagerUpdatePreview, resolveGitHubDigestForUpdate, readManagerConfig, writeManagerConfig, createAssistantGlobalTools, buildAssistantGlobalSystemPrompt, createAssistantTeamTools, buildAssistantTeamSystemPrompt, TeamProposalStore, AssistantProposalStore, SessionCatalog, readAssistantConfig, writeAssistantConfig, isAssistantScope, readProjectPlanFile, writeProjectPlanFile, readDesignFile, managerDesignPath, ISSUE_PRIORITIES, ISSUE_STATUSES, addIssueComment, createProjectIssue, deleteProjectIssue, isIssuePriority, isIssueStatus, isIssueStorageMode, listProjectIssues, migrateIssueStore, resolveIssueStorePath, loadWorkflow, listScheduledAutomationTasks, resolveScheduledAutomationWorkflow, resolveRoutedRun, recordScheduledAutomationRun, getHadamardHomePointerPath, listHadamardHomeTopLevelEntries, migrateHadamardHomeData, migrateLegacyProjectActoviqDirIfNeeded, resolveHadamardHome, externalSkillPreferencesToRuntimeOptions, readHadamardExternalSkillPreferences, setHadamardExternalSkillDisabled, setHadamardPreferredExternalSkill, clearHadamardPreferredExternalSkill, writeHadamardExternalSkillPreferences, summarizeHadamardHome, saveTeamDefinition, deleteTeamDefinition, deleteWorkflow, saveWorkflow, setScheduledAutomationEnabled, TaskScheduler, upsertScheduledAutomationTask, deleteScheduledAutomationTask, deleteAgentProfile, findSelectableAgent, getScheduledAutomationTask, listAgentProfiles, listSelectableAgents, resolveSelectableAgentRun, agentProfileRunOverrides, resolveEffectiveAgentRunOptions, transitionProjectIssue, updateProjectIssue, upsertAgentProfile, validateAgentProfile, writeAgentProfileMarkdown, writeAgentDefinitionMarkdown, readAgentDefinitionMarkdown, deleteAgentProfileMarkdown, getHadamardAgentTemplate, getHadamardAgentTemplates, loadHadamardAgentDefinitions, getDefaultHadamardAgents, summarizeHadamardAgentDefinition, readAllAgentReferenceProfiles, listAgentDefinitionNames, WorktreeService, decideGoalExecution, HADAMARD_SESSION_PERMISSION_STATE_KEY, serializeHadamardSessionPermissionState, isManagerReadScope, } from '../index.js';
63
63
  import { addBridgeConfig, findBridgeConfig, maskApiKey, readBridgeConfigs, removeBridgeConfig, isManagedExternalCliRuntime, VALID_RUNTIMES, } from '../parity/bridgeConfigs.js';
64
+ import { buildProviderSharePayload, renderProviderShareQrDataUrl } from '../device-link/providerShare.js';
64
65
  import { externalCliSessionMatchesConfig, listExternalCliSessions, readExternalCliSession, } from '../parity/externalCliSessions.js';
65
66
  import { parseCrushSessionReferenceDetails } from '../parity/crushSessionHistory.js';
66
67
  import { probeExternalCliAuth } from '../parity/externalCliAuth.js';
@@ -9181,6 +9182,31 @@ export async function startHadamardGuiServer(options = {}) {
9181
9182
  }
9182
9183
  : {});
9183
9184
  }
9185
+ if (req.method === 'POST' && url.pathname === '/api/bridge/provider-qr') {
9186
+ const body = await readJson(req);
9187
+ const name = typeof body.name === 'string' ? body.name.trim() : '';
9188
+ if (!name)
9189
+ return json(res, 400, { error: 'Missing config name.' });
9190
+ const config = findBridgeConfig(name, resolveGuiHomeDir());
9191
+ if (!config)
9192
+ return json(res, 404, { error: 'Config not found: ' + name });
9193
+ try {
9194
+ const payload = buildProviderSharePayload(config);
9195
+ const qrDataUrl = await renderProviderShareQrDataUrl(payload);
9196
+ return json(res, 200, {
9197
+ qrDataUrl,
9198
+ provider: {
9199
+ displayName: payload.displayName,
9200
+ endpoint: payload.endpoint,
9201
+ model: payload.model,
9202
+ apiKeyMasked: maskApiKey(payload.apiKey),
9203
+ },
9204
+ });
9205
+ }
9206
+ catch (error) {
9207
+ return json(res, 400, { error: error instanceof Error ? error.message : String(error) });
9208
+ }
9209
+ }
9184
9210
  if (req.method === 'POST' && url.pathname === '/api/bridge/update-local') {
9185
9211
  try {
9186
9212
  const body = await readJson(req);