Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions LoopIOS/AgentHarness/AgentHarness.swift
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ final class AgentHarness {
#if canImport(HealthKit) && os(iOS)
catalog.append(("Apple Health", "Read-only access to steps, distance, workouts, heart rate, sleep, body mass"))
#endif
catalog.append(("Higgsfield", "Cinematic video generation via Higgsfield Cloud (Sora 2, Veo 3, Kling, etc.)"))
return catalog
}()

Expand Down Expand Up @@ -164,6 +165,7 @@ final class AgentHarness {
#if canImport(HealthKit) && os(iOS)
fragments.append(HealthSkill.systemPromptFragment)
#endif
fragments.append(HiggsFieldSkill.systemPromptFragment)
self.toolsDoc = fragments.joined(separator: "\n\n")
self.staticToolsDocLength = toolsDoc.count
self.staticToolSchemasCount = toolSchemas.count
Expand Down
3 changes: 3 additions & 0 deletions LoopIOS/AgentHarness/SkillDispatcher.swift
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,9 @@ final class SkillDispatcher {
HealthSkill.shared.handle(functionCall: call, completion: completion); return
}
#endif
if HiggsFieldSkill.shared.handles(functionName: call.name) {
HiggsFieldSkill.shared.handle(functionCall: call, completion: completion); return
}

// Runtime-registered skills (Mac-only). Checked under the lock so a
// concurrent register() can't tear the iteration.
Expand Down
2 changes: 2 additions & 0 deletions LoopIOS/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@
<string>$(KIMI_API_KEY)</string>
<key>CURSOR_API_KEY</key>
<string>$(CURSOR_API_KEY)</string>
<key>HIGGSFIELD_API_KEY</key>
<string>$(HIGGSFIELD_API_KEY)</string>
<key>OBSIDIAN_API_KEY</key>
<string>$(OBSIDIAN_API_KEY)</string>
<key>OBSIDIAN_BASE_URL</key>
Expand Down
1 change: 1 addition & 0 deletions LoopIOS/MessagingVC.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1070,6 +1070,7 @@ extension MessagingVC: MessageBoxDelegate {
#if canImport(HealthKit) && os(iOS)
if let s = HealthSkill.shared.statusText(for: call) { return s }
#endif
if let s = HiggsFieldSkill.shared.statusText(for: call) { return s }
if let s = DynamicSkillRegistry.shared.statusText(for: call) { return s }

switch call.name {
Expand Down
8 changes: 7 additions & 1 deletion LoopIOS/Settings/KeyStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ final class KeyStore {
case xAPISecret = "X_API_SECRET"
case xAccessToken = "X_ACCESS_TOKEN"
case xAccessTokenSecret = "X_ACCESS_TOKEN_SECRET"
case higgsfield = "HIGGSFIELD_API_KEY"

/// User-facing label shown in Settings.
var displayName: String {
Expand All @@ -67,6 +68,7 @@ final class KeyStore {
case .xAPISecret: return "X API Secret"
case .xAccessToken: return "X Access Token"
case .xAccessTokenSecret: return "X Access Token Secret"
case .higgsfield: return "Higgsfield"
}
}

Expand All @@ -93,6 +95,7 @@ final class KeyStore {
case .xAPISecret: return "OAuth 1.0a consumer secret — shown once when you regenerate the API key"
case .xAccessToken: return "User-level access token with read+write permission from developer.x.com"
case .xAccessTokenSecret: return "User-level access token secret — shown once at generation time"
case .higgsfield: return "KEY_ID:KEY_SECRET credentials from cloud.higgsfield.ai → API Keys. Used for cinematic video generation (Sora, Veo, Kling, etc.)."
}
}
}
Expand All @@ -104,7 +107,7 @@ final class KeyStore {
/// either add a new `Service` case here or extend an existing one's `keys`.
enum Service: String, CaseIterable {
case openAI, anthropic, kimi, deepgram, elevenLabs, exa
case cursor, devin
case cursor, devin, higgsfield
case github, slack, notion, obsidian
case twitter

Expand All @@ -119,6 +122,7 @@ final class KeyStore {
case .exa: return "Exa"
case .cursor: return "Cursor"
case .devin: return "Devin"
case .higgsfield: return "Higgsfield"
case .github: return "GitHub"
case .slack: return "Slack"
case .notion: return "Notion"
Expand All @@ -141,6 +145,7 @@ final class KeyStore {
case .exa: return "Web search + answer skill"
case .cursor: return "Dispatch coding tasks to Cursor cloud agents (opens PRs)"
case .devin: return "Dispatch coding tasks to Devin cloud agents (opens PRs, live transcript)"
case .higgsfield: return "Cinematic video generation via Higgsfield Cloud (Sora 2, Veo 3, Kling, Seedance, etc.)"
case .github: return "Review/merge PRs, open PRs and issues, browse repos and notifications"
case .slack: return "Read channels/DMs/mentions, search, and send messages with confirmation"
case .notion: return "Read and write Notion pages and databases"
Expand All @@ -164,6 +169,7 @@ final class KeyStore {
case .exa: return [.exa]
case .cursor: return [.cursor]
case .devin: return [.devin, .devinOrgID]
case .higgsfield: return [.higgsfield]
case .github: return [.githubPAT, .githubBaseURL]
case .slack: return [.slackUserToken]
case .notion: return [.notionIntegrationToken]
Expand Down
3 changes: 2 additions & 1 deletion LoopIOS/Skills/Dynamic/BundledDocSeeds.swift
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@ skill follows the same shape:

Bundled skills include: Notion, Scheduler, Web search (Exa), URL fetch,
Self-Improvement, File System, Spec Builder, Location, Image, Obsidian,
Calendar, Music, Skill Builder, Sub-Agent, and Integrations. The user (or the
Calendar, Music, Skill Builder, Sub-Agent, Integrations, Cursor, Devin, and
Higgsfield (cinematic video generation). The user (or the
agent) can also author new skills in JavaScript at runtime — those hot-load
from `Workspace/Skills/` and don't require a rebuild.

Expand Down
Loading